From fef8c69f383710ba5aba8d1b77d7b5c7ff4c52f7 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Thu, 3 Sep 2026 23:21:11 +0900 Subject: [PATCH] change: synchronize local and remainder clocks --- dzgui/views/dialogs/calc.py | 44 ++++++++++++++++++++++++++++++++----- 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/dzgui/views/dialogs/calc.py b/dzgui/views/dialogs/calc.py index b9ae280..4e90137 100644 --- a/dzgui/views/dialogs/calc.py +++ b/dzgui/views/dialogs/calc.py @@ -226,19 +226,51 @@ class GenericAdjustedClock: return self.start_time.strftime(EXTENDED_TIME_FORMAT) -class RemainderClock(GenericAdjustedClock): +class RemainderClock: def __init__(self, emitter: Emitter) -> None: - super().__init__(emitter, signal="remaining_time_changed") - self.start_time = datetime.combine( - datetime.now(), time(hour=0, minute=0, second=0) + self.emitter = emitter + self.emitter.connect("target_time_changed", self._on_target_time_changed) + self.emitter.connect("local_time_incremented", self._on_local_time_incremented) + self.time = datetime.combine(datetime.now(), time(hour=0, minute=0, second=0)) + + self.previous = timedelta(0) + + def _on_local_time_incremented( + self, emitter: Emitter, time: datetime, elapsed: timedelta + ) -> None: + if self.time == datetime.min.time(): + return + + delta = elapsed - self.previous + # NOTE: clamp to midnight + self.time = max( + self.time - delta, self.time.replace(hour=0, minute=0, second=0) ) + self.previous = elapsed + self.emitter.emit("remaining_time_changed", self.time) + + def _on_target_time_changed(self, emitter: Emitter, time: timedelta) -> None: + self.time += time + self.emitter.emit("remaining_time_changed", self.time) + + def get_time(self) -> str: + return self.time.strftime(EXTENDED_TIME_FORMAT) -class AdjustedClock(GenericAdjustedClock): +class AdjustedClock: def __init__(self, emitter: Emitter) -> None: - super().__init__(emitter, signal="adjusted_local_time_changed") + self.emitter = emitter + self.emitter.connect("target_time_changed", self._on_target_time_changed) self.start_time = datetime.now() + def _on_target_time_changed(self, emitter: Emitter, time: timedelta) -> None: + self.start_time = datetime.now() + adjusted = self.start_time + time + self.emitter.emit("adjusted_local_time_changed", adjusted) + + def get_time(self) -> str: + return self.start_time.strftime(EXTENDED_TIME_FORMAT) + class VerticalSpinBox(Gtk.SpinButton): def __init__(self, value: int, upper: int) -> None: