'trigger': 'run',
'source': 'loaded',
'dest': 'loaded_running',
- 'after': 'finish',
+ 'after': ['run_actions', 'finish'],
# if a child, like loaded_no_actions, has no transitions, then it is
# bubbled to the parent, and we don't want that.
'conditions': ['is_loaded']
def __init__(self, **kwargs):
self.actions = []
+ self.current_action = None
+
Machine(model=self, states=self.STATES,
transitions=self.TRANSITIONS, initial='initial',
ignore_invalid_triggers=True, queued=True)
else:
self.no_actions()
- def on_enter_loaded_running(self, modifiers):
+ def run_actions(self, modifiers):
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.list_actions()
self.current_action.run()
- action_number += 1
- self.list_actions(action_number=action_number)
+ self.list_actions(last_action_finished=True)
self.parent.finished_running(self, start_time)
def add_action(self, action_name, **arguments):
self.actions.append(Action(action_name, self, **arguments))
- def list_actions(self, action_number=0):
- self.parent.parent.ids['ActionList'].update_list(self, action_number)
-
+ def list_actions(self, last_action_finished=False):
+ not_running = (not self.is_loaded_running())
+ current_action_seen = False
+ action_descriptions = []
+ for action in self.actions:
+ if not_running:
+ state = "inactive"
+ elif last_action_finished:
+ state = "done"
+ elif current_action_seen:
+ state = "pending"
+ elif action == self.current_action:
+ current_action_seen = True
+ state = "current"
+ else:
+ state = "done"
+ action_descriptions.append([action.description(), state])
+ self.parent.parent.ids['ActionList'].update_list(
+ self,
+ action_descriptions)
action_title = StringProperty("")
action_list = ListProperty([])
- def update_list(self, key, action_number = 0):
+ def update_list(self, key, action_descriptions):
self.action_title = "actions linked to key {}:".format(key.key_sym)
self.action_list = []
- action_descriptions = [action.description() for action in key.actions]
-
- for index, description in enumerate(action_descriptions):
- if index < int(action_number):
+ for [action, status] in action_descriptions:
+ if status == "done":
icon = "✓"
- elif index + 0.5 == action_number:
+ elif status == "current":
icon = "✅"
else:
icon = " "
-
- self.action_list.append([icon, description])
+ self.action_list.append([icon, action])
class Screen(FloatLayout):
pass