aboutsummaryrefslogtreecommitdiff
path: root/music_sampler/app_blocks/actionlist.py
blob: 70fe3f4f5806e6c1ecf0de7d5a82b1e6934b4a14 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
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