Files
Jannes Magnusson 06df2e0e9b add recipe class
2025-10-18 20:15:11 +02:00

112 lines
3.8 KiB
Python

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')
else:
self.reset_timer()
return im # No time to display
# 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