]>
Commit | Line | Data |
---|---|---|
4b2d79ca | 1 | from kivy.uix.widget import Widget |
2e404903 IB |
2 | from kivy.properties import AliasProperty, BooleanProperty, \ |
3 | ListProperty, StringProperty | |
4b2d79ca IB |
4 | from kivy.clock import Clock |
5 | from kivy.uix.behaviors import ButtonBehavior | |
6 | ||
be27763f | 7 | from .action import * |
a24c34bc | 8 | from . import debug_print |
be27763f | 9 | import time |
4b2d79ca IB |
10 | |
11 | class Key(ButtonBehavior, Widget): | |
12 | key_sym = StringProperty(None) | |
13 | custom_color = ListProperty([0, 1, 0, 1]) | |
14 | custom_unready_color = ListProperty([0, 1, 0, 100/255]) | |
15 | description_title = StringProperty("") | |
16 | description = ListProperty([]) | |
17 | is_key_ready = BooleanProperty(True) | |
18 | ||
19 | def get_color(self): | |
20 | if not self.has_actions: | |
21 | return [1, 1, 1, 1] | |
22 | elif self.all_actions_ready: | |
23 | return self.custom_color | |
be27763f | 24 | else: |
4b2d79ca IB |
25 | return self.custom_unready_color |
26 | def set_color(self): | |
27 | pass | |
28 | ||
29 | color = AliasProperty(get_color, set_color, bind=['is_key_ready']) | |
be27763f | 30 | |
4b2d79ca IB |
31 | def __init__(self, **kwargs): |
32 | super(Key, self).__init__(**kwargs) | |
be27763f | 33 | self.actions = [] |
be27763f | 34 | |
4b2d79ca IB |
35 | def on_key_sym(self, key, key_sym): |
36 | if key_sym in self.parent.key_config: | |
37 | self.is_key_ready = False | |
38 | ||
39 | self.config = self.parent.key_config[key_sym] | |
be27763f | 40 | |
4b2d79ca IB |
41 | self.actions = [] |
42 | for key_action in self.config['actions']: | |
43 | self.add_action(key_action[0], **key_action[1]) | |
44 | ||
45 | if 'description' in self.config['properties']: | |
46 | key.set_description(self.config['properties']['description']) | |
47 | if 'color' in self.config['properties']: | |
48 | key.set_color(self.config['properties']['color']) | |
49 | ||
50 | Clock.schedule_interval(self.check_all_active, 1) | |
51 | ||
52 | def check_all_active(self, dt): | |
53 | if self.all_actions_ready: | |
54 | self.is_key_ready = True | |
55 | return False | |
be27763f | 56 | |
b86db9f1 | 57 | def set_description(self, description): |
4b2d79ca IB |
58 | if description[0] is not None: |
59 | self.description_title = str(description[0]) | |
2e404903 | 60 | for desc in description[1 :]: |
d479af33 IB |
61 | if desc is None: |
62 | self.description.append("") | |
63 | else: | |
4b2d79ca | 64 | self.description.append(str(desc).replace(" ", " ")) |
b86db9f1 IB |
65 | |
66 | def set_color(self, color): | |
4b2d79ca IB |
67 | color = [x / 255 for x in color] |
68 | color.append(1) | |
69 | self.custom_color = color | |
70 | color[3] = 100 / 255 | |
b86db9f1 IB |
71 | self.custom_unready_color = tuple(color) |
72 | ||
4b2d79ca | 73 | @property |
be27763f IB |
74 | def has_actions(self): |
75 | return len(self.actions) > 0 | |
76 | ||
4b2d79ca | 77 | @property |
be27763f IB |
78 | def all_actions_ready(self): |
79 | return all(action.ready() for action in self.actions) | |
80 | ||
81 | def add_action(self, action_name, **arguments): | |
82 | self.actions.append(Action(action_name, self, **arguments)) | |
83 | ||
0deb82a5 IB |
84 | def interrupt_action(self): |
85 | self.current_action.interrupt() | |
86 | ||
4b2d79ca | 87 | def do_actions(self): |
f029e879 IB |
88 | if not self.enabled: |
89 | return None | |
90 | ||
65ec4d2a | 91 | self.parent.parent.ids['KeyList'].append(self.key_sym) |
a24c34bc | 92 | debug_print("running actions for {}".format(self.key_sym)) |
be27763f | 93 | start_time = time.time() |
4b2d79ca | 94 | self.parent.start_running(self, start_time) |
cd255f24 | 95 | action_number = 0 |
0deb82a5 | 96 | for self.current_action in self.actions: |
4b2d79ca | 97 | if self.parent.keep_running(self, start_time): |
2e404903 | 98 | self.list_actions(action_number=action_number + 0.5) |
0deb82a5 | 99 | self.current_action.run() |
cd255f24 | 100 | action_number += 1 |
2e404903 | 101 | self.list_actions(action_number=action_number) |
ba9ea93a | 102 | |
4b2d79ca | 103 | self.parent.finished_running(self, start_time) |
be27763f | 104 | |
2e404903 | 105 | def list_actions(self, action_number=0): |
4b2d79ca | 106 | self.parent.parent.ids['ActionList'].update_list(self, action_number) |
be27763f | 107 | |
4b2d79ca IB |
108 | def on_press(self): |
109 | self.list_actions() |