aboutsummaryrefslogtreecommitdiff
path: root/helpers/key.py
blob: fe82d5bea396a9a4d31b412a483f80b29fb2d810 (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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
from kivy.uix.widget import Widget
from kivy.properties import AliasProperty, BooleanProperty, ListProperty, StringProperty
from kivy.clock import Clock
from kivy.uix.behaviors import ButtonBehavior

from .action import *
from . import debug_print
import time

class Key(ButtonBehavior, Widget):
    key_sym = StringProperty(None)
    custom_color = ListProperty([0, 1, 0, 1])
    custom_unready_color = ListProperty([0, 1, 0, 100/255])
    description_title = StringProperty("")
    description = ListProperty([])
    is_key_ready = BooleanProperty(True)

    def get_color(self):
        if not self.has_actions:
            return [1, 1, 1, 1]
        elif self.all_actions_ready:
            return self.custom_color
        else:
            return self.custom_unready_color
    def set_color(self):
        pass

    color = AliasProperty(get_color, set_color, bind=['is_key_ready'])

    def __init__(self, **kwargs):
        super(Key, self).__init__(**kwargs)
        self.actions = []

    def on_key_sym(self, key, key_sym):
        if key_sym in self.parent.key_config:
            self.is_key_ready = False

            self.config = self.parent.key_config[key_sym]

            self.actions = []
            for key_action in self.config['actions']:
                self.add_action(key_action[0], **key_action[1])

            if 'description' in self.config['properties']:
                key.set_description(self.config['properties']['description'])
            if 'color' in self.config['properties']:
                key.set_color(self.config['properties']['color'])

            Clock.schedule_interval(self.check_all_active, 1)

    def check_all_active(self, dt):
        if self.all_actions_ready:
            self.is_key_ready = True
            return False

    def set_description(self, description):
        if description[0] is not None:
            self.description_title = str(description[0])
        for desc in description[1:]:
            if desc is None:
                self.description.append("")
            else:
                self.description.append(str(desc).replace(" ", " "))

    def set_color(self, color):
        color = [x / 255 for x in color]
        color.append(1)
        self.custom_color = color
        color[3] = 100 / 255
        self.custom_unready_color = tuple(color)

    @property
    def has_actions(self):
        return len(self.actions) > 0

    @property
    def all_actions_ready(self):
        return all(action.ready() for action in self.actions)

    def add_action(self, action_name, **arguments):
        self.actions.append(Action(action_name, self, **arguments))

    def interrupt_action(self):
        self.current_action.interrupt()

    def do_actions(self):
        if not self.enabled:
            return None

        self.parent.parent.ids['KeyList'].append(self.key_sym)
        debug_print("running actions for {}".format(self.key_sym))
        start_time = time.time()
        self.parent.start_running(self, start_time)
        action_number = 0
        for self.current_action in self.actions:
            if self.parent.keep_running(self, start_time):
                self.list_actions(action_number = action_number + 0.5)
                self.current_action.run()
                action_number += 1
                self.list_actions(action_number = action_number)

        self.parent.finished_running(self, start_time)

    def list_actions(self, action_number = 0):
        self.parent.parent.ids['ActionList'].update_list(self, action_number)

    def on_press(self):
        self.list_actions()
    pass