screen-locker/screen_locker/_unlock_view.py
Krzysztof kuhy Rudnicki e5bfdd9a9a Make the Tk locker screens text-free
Every locker screen, the status window and the credit toast now show
glyphs (screen_locker/_glyphs.py) and numbers, coloured by state.
Sentences that carried a reason (verifier message, sync diagnosis,
sick refusal, form rejection) go to the log at warning instead.
New pre-commit hook text-free runs scripts/verify_text_free.py.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 01:20:23 +01:00

58 lines
2.0 KiB
Python

"""The success screen shown once a workout has been credited.
Split out of ``screen_lock`` so that module stays inside the repo's 400-line
cap; this is pure view code (paint the credit, then close), which is exactly
the kind of thing the other ``_ui_*`` mixins already own.
textgate: was "Great job! 💪" / "Shutdown time +2h later! 🎁" / "Extra
workout today! +1h tonight" / "🔥 N-week streak (5+ workouts each)" /
"Screen Unlocked!". Now: the open lock in green, then each reward as its
glyph and amount, then the streak as week bars and their count.
"""
from __future__ import annotations
from screen_locker import _glyphs as g
from screen_locker._constants import EXTRA_BENEFITS_FILE
from screen_locker._earned import span
from screen_locker._extra_benefits import current_streak
_UNLOCK_DELAY_MS = 1500
class UnlockViewMixin:
"""Paints the unlock screen, then closes it."""
def unlock_screen(self) -> None:
"""Apply workout credit and display the success glyphs."""
credit = self._apply_workout_credit()
self.clear_container()
self._label(
f"{g.UNLOCK} {g.OK}",
role="display",
scale=1.5,
color=self._colors.palette.success,
pad="lg",
)
if credit.shutdown_adjusted:
self._text(
f"{g.SHUTDOWN} {g.GIFT}{span(120)}",
role="title",
color=self._colors.palette.warning,
)
if credit.extra_bonus_delta > 0:
self._text(
f"{g.LIFT} {g.GIFT}{span(credit.extra_bonus_delta)}",
role="subtitle",
color=self._colors.palette.warning,
)
streak = current_streak(EXTRA_BENEFITS_FILE)
if streak >= 1:
self._text(
f"{g.STREAK * min(streak, 10)} {streak}",
role="label",
color=self._colors.palette.muted,
)
self.root.after(_UNLOCK_DELAY_MS, self.close)