from kivy.uix.label import Label from kivy.uix.stacklayout import StackLayout from kivy.uix.relativelayout import RelativeLayout from kivy.properties import ListProperty, StringProperty import math __all__ = ["ActionList", "ActionListIcons", "ActionListIcon", "ActionListDescriptions", "ActionListDescription"] class ActionList(RelativeLayout): action_title = StringProperty("") action_list = ListProperty([]) def update_list(self, key, action_descriptions): self.action_title = "actions linked to key {}:".format(key.key_sym) action_list = [] for [action, status] in action_descriptions: if status == "done": icon = "✓" elif status == "current": icon = "✅" else: icon = " " action_list.append([icon, action]) self.action_list = action_list class ActionListIcons(StackLayout): def __init__(self, **kwargs): super(ActionListIcons, self).__init__(**kwargs) self.icons = [] def on_parent(self, instance, parent): parent.bind(action_list=self.update_actionlist_icons) def update_actionlist_icons(self, instance, actionlist): for icon in self.icons: self.remove_widget(icon) self.icons = [] for icon, description in actionlist: icon_label = ActionListIcon(text=icon) self.add_widget(icon_label) self.icons.append(icon_label) class ActionListIcon(Label): def __init__(self, text='', **kwargs): super(ActionListIcon, self).__init__(**kwargs) self.text = text def on_parent(self, instance, parent): if parent is not None: self.font_size = math.ceil(2 * math.sqrt(parent.parent.parent.key_size)) self.height = parent.parent.labels_height class ActionListDescriptions(StackLayout): def __init__(self, **kwargs): super(ActionListDescriptions, self).__init__(**kwargs) self.descriptions = [] def on_parent(self, instance, parent): parent.bind(action_list=self.update_actionlist_descriptions) def update_actionlist_descriptions(self, instance, actionlist): for description in self.descriptions: self.remove_widget(description) self.descriptions = [] for icon, description in actionlist: description_label = ActionListDescription(text=description) self.add_widget(description_label) self.descriptions.append(description_label) class ActionListDescription(Label): def __init__(self, text='', **kwargs): super(ActionListDescription, self).__init__(**kwargs) self.text = text def on_parent(self, instance, parent): if parent is not None: self.font_size = math.ceil(2 * math.sqrt(parent.parent.parent.key_size)) self.height = parent.parent.labels_height