Changeset ab10343 in flowtimer


Ignore:
Timestamp:
08/29/24 18:24:29 (9 months ago)
Author:
Enrico Schwass <ennoausberlin@…>
Branches:
guix
Children:
b4adb9d
Parents:
58e7315
Message:

Schedule.state() method added - more UI tweaks

Location:
flowtimer
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • flowtimer/Schedule.py

    r58e7315 rab10343  
    1717        self.blocks = blocks
    1818        self.current_block = blocks[0]
    19         self.state = "initial"
     19        self._state = "initial"
    2020
    2121    @classmethod
     
    8989        })
    9090
     91    def state(self):
     92        if self.is_completed():
     93            return "completed"
     94        return self._state
     95
    9196    def start(self):
    92         self.state = "running"
     97        self._state = "running"
    9398        self.current_block.start()
    9499
    95100    def pause(self):
    96         self.state = "paused"
     101        self._state = "paused"
    97102
    98     def running(self):
    99         return self.state == "running"
     103    def is_initial(self):
     104        return self._state == 'initial'
    100105
    101     def paused(self):
    102         return self.state == "paused"
     106    def is_running(self):
     107        return self._state == "running"
     108
     109    def is_paused(self):
     110        return self._state == "paused"
    103111
    104112    def abort(self):
    105113        self.current_block.abort()
    106         self.state = "aborted"
     114        self._state = "aborted"
    107115
    108116    def current_block_is_final(self):
     
    110118        return index == (len(self.blocks) - 1)
    111119
    112     def completed(self):
     120    def is_completed(self):
    113121        if (self.current_block.completed()) and (self.current_block_is_final()):
    114             self.state = "completed"
    115122            return True
    116123        else:
    117124            return False
    118125
    119     def aborted(self):
    120         return self.state == "aborted"
     126    def is_aborted(self):
     127        return self._state == "aborted"
    121128
    122     def terminated(self):
    123         return (self.aborted() or self.completed())
     129    def is_terminated(self):
     130        return (self.is_aborted() or self.is_completed())
    124131
    125132    def advance_to_next_block(self):
     
    155162
    156163    def tick(self, ticks):
    157         if not self.completed():
     164        if not self.is_completed():
    158165            self.current_block.tick(ticks)
    159166            if self.current_block.completed():
    160167                if self.current_block_is_final():
    161                     self.state = "completed"
     168                    self._state = "completed"
    162169                else:
    163170                    self.skip()
  • flowtimer/configs/colors.json

    r58e7315 rab10343  
    11{
    22    "color_list": [
     3        {
     4            "title": "Completed",
     5            "widget": "red",
     6            "sequence_label": "red",
     7            "center_frame": "red"
     8        },
    39        {
    410            "title": "Huddle",
  • flowtimer/main.py

    r58e7315 rab10343  
    1818        self.photo = ImageTk.PhotoImage(file=Path(__file__).parent /
    1919                                        'resources' / 'flowtimer_startbg_new.png')
    20         self.config_state = 'default'
    2120        print("Config:", config_file)
    2221        self.schedule = self.load_config(config_file)
     
    2423        self.build_gui()
    2524        if autostart:
    26             self.start()
     25            self.toggle_play_pause()
    2726
    2827    def build_gui(self):
     
    4241
    4342        self.label_headline = tk.Label(self.headline_frame,
    44                                        text=("Hochintensive Intervallarbeit"),
     43                                       text=(self.schedule.current_block.title),
    4544                                       bg='white', fg='grey', font="serif 20")
    4645        self.label_headline.pack(side='left', fill='both', expand=True)
    4746
    48         self.label_config = tk.LabelFrame(self.headline_frame, text="config: ",
     47        self.label_config = tk.LabelFrame(self.headline_frame,
     48                                          text=f"config: {self.schedule.title}",
    4949                                          bg='white', font="serif 12")
    5050        self.label_config.pack(side='right', fill='both', expand=False,
     
    8585        self.quit_button.pack(side='left', fill='both', ipady=20, expand=True)
    8686
     87        self.parent.resizable(False, False)
     88
    8789    def ticks_left_in_phase(self):
    8890        if self.schedule.current_block.is_sequence():
     
    9193            return self.schedule.current_block.ticks_left
    9294
    93     def color_for_phase(self, a_title):
    94         return next((d for d in self.colors if d.get('title') == a_title), None)
     95    def colors_for_phase(self, a_title):
     96        return next((d for d in self.color_scheme if d.get('title') == a_title), None)
    9597
    9698    def current_title(self):
     
    115117            return f"{(self.ticks_left_in_phase() // 60)} min left in phase {self.current_title()}"
    116118
     119    # FIXME: This logic looks like shit. Refactor it!!!
    117120    def tick(self):
    118         if not self.schedule.running():
     121        current_process = self.after(1000, self.tick)
     122        if self.schedule.is_terminated():
     123            self.label_sequence.config(text=("\n" + "\nTime over !"),
     124                                       bg=self.colors_for_phase("Completed").get('sequence_label'),
     125                                       fg="white")
     126            self.label_duration.config(text="", bg=self.colors_for_phase("Completed").get('duration_label'),
     127                                       fg="white")
     128            self.progressbar.pack_forget()
     129            self.center_frame.configure(bg=self.colors_for_phase("Completed").get('center_frame'))
     130            self.after_cancel(current_process)
     131            self.skip_button['state'] = 'disabled'
     132            self.skip_button.config(fg="ivory3")
     133            self.freeze_button['state'] = 'disabled'
     134            self.freeze_button.config(fg="ivory3")
    119135            return
    120         self.label_start.pack_forget()
    121         current_process = self.after(1000, self.tick)
    122         if self.schedule.state == 'initial':
    123             self.label_sequence.config(text=("\n" + str(self.schedule.current_block.title) + "..."))
    124             self.label_duration.config(text=self.current_time_status())
    125             self.schedule.start()
     136        if self.schedule.is_running():
    126137            self.schedule.tick(1*self.tick_speed)
    127         else:
    128             if self.schedule.running():
    129                 self.schedule.tick(1*self.tick_speed)
    130                 self.progressbar["value"] = (self.schedule.current_block.initial_ticks -
    131                                              self.schedule.current_block.ticks_left) % 60
    132                 self.progressbar.update()
    133                 self.label_duration.config(text=self.current_time_status())
    134                 self.label_config_text.config(text=self.current_config())
    135             else:
    136                 self.label_sequence.config(text=("\n" + "\nTime over !"), bg="red", fg="white")
    137                 self.label_duration.config(text="", bg="red", fg="white")
    138                 self.progressbar.pack_forget()
    139                 self.center_frame.configure(bg="red")
    140                 self.after_cancel(current_process)
    141                 self.skip_button['state'] = 'disabled'
    142                 self.skip_button.config(fg="ivory3")
    143                 self.freeze_button['state'] = 'disabled'
    144                 self.freeze_button.config(fg="ivory3")
     138            self.progressbar["value"] = (self.schedule.current_block.initial_ticks -
     139                                         self.schedule.current_block.ticks_left) % 60
     140            self.progressbar.update()
     141            self.label_duration.config(text=self.current_time_status(), font='times 22')
     142            self.label_config_text.config(text=self.current_config())
    145143
    146144    def skip(self):
     
    148146
    149147    def toggle_play_pause(self):
    150         if not self.schedule.running():
     148        if self.schedule.is_initial():
     149            self.label_start.pack_forget()
     150            self.schedule.start()
     151            self.tick()
     152            return
     153        if not self.schedule.is_running():
    151154            self.freeze_button.config(relief="raised", fg='black')
    152155            self.label_sequence.config(fg="white")
     
    157160            self.schedule.pause()
    158161            self.freeze_button.config(relief="sunken", fg="red")
    159             self.label_sequence.config(text=("\n" + "\n! timer paused !"), fg="red", bg="black")
     162            self.label_sequence.config(text=("timer paused !"), fg="red", bg="black",
     163                                       font='times 72')
    160164            self.label_duration.config(text="", bg="black")
    161165            self.center_frame.config(bg="black")
     
    190194
    191195    def select_config(self):
    192         self.config_state = 'user'
    193196        self.config_files = [("all files", "*.json")]
    194197        self.answer = filedialog.askopenfilename(parent=root,
     
    205208                    default=Path(__file__).parent / 'configs' / 'default.json',
    206209                    help='use --config /path/to/config_file.json to specify the configuration of the timer')
    207 parser.add_argument('--color', dest='color_file', required=False,
     210parser.add_argument('--colors', dest='color_file', required=False,
    208211                    default=Path(__file__).parent / 'configs' / 'colors.json')
    209212args = parser.parse_args()
Note: See TracChangeset for help on using the changeset viewer.