import tkinter as tk from tkinter import ttk from PIL import ImageDraw import time from .base import View class TimerView(View): def __init__(self, parent, size, center, width=3, **kwargs): self.start_time = None self.elapsed_time = 0 self.is_running = False self.goal_minutes = 0 # 0 means no goal set self.radius = min(center) - 7 self.width = width self.goal_achived = 0 self.goal_pulse_freq = 0.1 super().__init__(parent, size, center, **kwargs) def init_ui(self, parent): self.ui = tk.Frame(parent) self.ui.pack(pady=10) # Goal input self.goal_label = ttk.Label(self.ui, text="Goal (sec):") self.goal_label.pack() self.goal_entry = ttk.Entry(self.ui, width=8) self.goal_entry.insert(0, "0") self.goal_entry.pack() def toggle_timer(self): if self.is_running: # Stop timer self.is_running = False if self.start_time: self.elapsed_time += time.time() - self.start_time else: # Start timer self.is_running = True self.start_time = time.time() def reset_timer(self): self.is_running = False self.start_time = None self.elapsed_time = 0 def get_current_time(self): """Get current elapsed time in seconds""" if self.is_running and self.start_time: return self.elapsed_time + (time.time() - self.start_time) return self.elapsed_time def update_weight(self, weight): """Override to update timer display instead of weight""" current_time = self.get_current_time() # Create base image im = self.bkg_im.copy() draw = ImageDraw.Draw(im) # Format time display (MM:SS) minutes = int(current_time // 60) seconds = int(current_time % 60) time_text = f"{minutes:02d}:{seconds:02d}" if time_text != "00:00" or self.is_running: # Draw timer text in center # Estimate text size for centering text_width = len(time_text) * 10 # Rough estimate text_height = 20 text_x = self.center[0] - text_width // 2 text_y = self.center[1] - text_height // 2 draw.text((text_x, text_y), time_text, fill='black') # Draw progress circle if goal is set try: goal_sec = float(self.goal_entry.get()) if goal_sec > 0: progress = current_time / goal_sec else: progress = current_time / 60 if progress > 0: inverted = int(progress) % 2 == 1 # pulse width if goal achieved if int(progress) > 0 and self.is_running: self.goal_achived = (self.goal_achived + self.goal_pulse_freq) % 3 else: self.goal_achived = 0 pulse = int(self.goal_achived) start = self.center[0] - self.radius - pulse, self.center[1] - self.radius - pulse end = self.center[0] + self.radius + pulse, self.center[1] + self.radius + pulse progress = progress % 1.0 # Loop every full circle if inverted: draw.arc((start, end), 360 * progress - 90, 270, fill='black', width=self.width + pulse) else: draw.arc((start, end), 270, 360 * progress - 90, fill='black', width=self.width + pulse) except (ValueError, tk.TclError): # Invalid goal value, just show time without progress pass return im