source: flowtimer/flowtimer/RecurringPhaseSequence.py@ 36c9ef5

guix
Last change on this file since 36c9ef5 was 36c9ef5, checked in by Enrico Schwass <ennoausberlin@…>, 9 months ago

more adoptions for block_list

  • Property mode set to 100644
File size: 4.0 KB
RevLine 
[84123db]1import json
[37ae3b7]2from copy import deepcopy
[3b76475]3from flowtimer.Phase import Phase
[84123db]4
5
6class RecurringPhaseSequence:
7
[37ae3b7]8 @classmethod
9 def from_json(cls, a_json_string):
10 def custom_object_hook(d):
[daa2276]11 if 'title' in d and 'initial_ticks' in d:
12 return Phase(d['title'], d['initial_ticks'])
13 if 'phase_list' in d and 'initial_repetitions' in d:
[1fd7029]14 return RecurringPhaseSequence(d["title"], d['phase_list'], d['initial_repetitions'])
15 print("Wrong format")
[37ae3b7]16 return d
17 return json.loads(a_json_string, object_hook=custom_object_hook)
18
19 @classmethod
20 def default_json_string(cls):
[1fd7029]21 return json.dumps({"title": "default",
22 "phase_list": [{"title": "Huddle", "initial_ticks": 10},
[daa2276]23 {"title": "Tasking", "initial_ticks": 5},
24 {"title": "Work", "initial_ticks": 45},
25 {"title": "Break", "initial_ticks": 15}],
26 "initial_repetitions": 3})
[37ae3b7]27
[f959488]28 @classmethod
29 def default(cls):
30 return cls.from_json(cls.default_json_string())
31
[1fd7029]32 def __init__(self, title, phase_list, repetitions):
[f959488]33 assert repetitions > 0
34 assert phase_list is not []
[1fd7029]35 self._title = title
[f959488]36 self.state = "initial"
[84123db]37 self.phase_list = phase_list
[f959488]38 self.current_phase = phase_list[0]
39 self.initial_repetitions = repetitions
40 self.passes_left = repetitions
[84123db]41
42 def to_json(self):
43 return json.dumps(self.__dict__, default=lambda each: each.to_json())
44
[1fd7029]45 @property
[44c3377]46 def title(self):
[36c9ef5]47 return self._title
[44c3377]48
[5741f6d]49 def is_sequence(self):
50 return True
51
[daa2276]52 def current_phase_number(self):
53 return self.phase_list.index(self.current_phase)
54
55 def phases_left_in_pass(self):
56 return len(self.upcoming_phases_in_pass())
57
[f959488]58 def upcoming_phases_in_pass(self):
[daa2276]59 if self.current_phase_number() < len(self.phase_list) - 1:
60 return self.phase_list[self.current_phase_number()+1:]
[f959488]61 return []
62
[1fd7029]63 @property
64 def initial_ticks(self):
65 return sum([each.initial_ticks for each in self.phase_list])
66
[daa2276]67 @property
[f959488]68 def ticks_left(self):
[daa2276]69 return (
70 (self.passes_left-1) * sum([each.initial_ticks for each in self.phase_list]) +
71 self.current_phase.ticks_left +
72 sum([each.ticks_left for each in self.upcoming_phases_in_pass()]))
[f959488]73
74 def finished(self):
75 return (self.passes_left < 1) and (not self.upcoming_phases_in_pass())
76
77 def abort(self):
78 self.current_phase.abort()
79 self.state = "finished"
80
[1fd7029]81 def start(self):
82 self.state = "running"
83
[36c9ef5]84 def skip(self):
85 if self.upcoming_phases_in_pass():
86 self.current_phase.reset()
87 self.current_phase = self.upcoming_phases_in_pass()[0]
88 return
89 else:
90 if self.passes_left == 0:
91 self.abort()
92 return
93 else:
94 self.passes_left -= 1
95 self.current_phase.reset()
96 self.current_phase = self.phase_list[0]
97
[f959488]98 def tick(self, ticks):
99 if not self.finished():
100 result = self.current_phase.tick(ticks)
101 if self.current_phase.finished():
102 if self.upcoming_phases_in_pass():
103 self.current_phase.reset()
104 self.current_phase = self.upcoming_phases_in_pass()[0]
105 self.current_phase.start()
106 self.tick(abs(result))
107 return True
108 self.passes_left -= 1
109 if self.finished():
110 self.state = "finished"
111 else:
112 self.current_phase.reset()
113 self.current_phase = self.phase_list[0]
114 return True
115
[84123db]116 def unrolled(self):
[daa2276]117 return [deepcopy(seq) for seq in [each for each in self.initial_repetitions * self.phase_list]]
Note: See TracBrowser for help on using the repository browser.