diff --git a/qt/aqt/flexible_grading_reviewer/widgets.py b/qt/aqt/flexible_grading_reviewer/widgets.py
index d1f8aea66..ed86c3751 100644
--- a/qt/aqt/flexible_grading_reviewer/widgets.py
+++ b/qt/aqt/flexible_grading_reviewer/widgets.py
@@ -146,16 +146,17 @@ class FlexibleTimerLabel(QLabel):
def __init__(self, parent=None) -> None:
super().__init__(parent)
self._time = 0 # current time (seconds)
- self._max_time = 0 # maximum time (seconds); 0 means hidden
+ self._max_time = 0 # maximum time (seconds); 0 means unset
self._qtimer = QTimer(self)
self._qtimer.setInterval(1000)
qconnect(self._qtimer.timeout, self._on_tick)
self.setAlignment(Qt.AlignmentFlag.AlignCenter)
- self.setHidden(True)
def start(self, max_time: int) -> None:
- self._time = 0
+ if max_time <= 0:
+ raise ValueError("max time should be greater than 0")
self._max_time = max_time
+ self._time = 0
self._update_display()
if self._qtimer.isActive():
self._qtimer.stop()
@@ -165,30 +166,21 @@ class FlexibleTimerLabel(QLabel):
if self._qtimer.isActive():
self._qtimer.stop()
- # Internal tick handler
def _on_tick(self) -> None:
- self._time += 1
- # clamp to max_time if set (mirrors TS: time = Math.min(maxTime, time))
- if self._time > self._max_time > 0:
- self._time = self._max_time
+ self._time = min(self._time + 1, self._max_time)
self._update_display()
- # if reached max, keep ticking but display in red (TS continues interval)
def _update_display(self) -> None:
if self._max_time <= 0:
- super().setText("") # hide when max_time == 0
- self.setHidden(True)
- return
+ raise ValueError("max time should be greater than 0")
- self.setHidden(False)
- t = min(self._max_time, self._time) if self._max_time > 0 else self._time
- m = t // 60
- s = t % 60
+ t = min(self._max_time, self._time)
+ m, s = divmod(t, 60)
s_str = f"{s:02d}"
time_string = f"{m}:{s_str}"
if t >= self._max_time > 0:
- # display red when time == maxTime (using simple HTML)
- super().setText(f"{time_string}")
+ self.setText(f"{time_string}")
+ self.stop()
else:
- super().setText(time_string)
+ self.setText(time_string)
diff --git a/qt/aqt/reviewer.py b/qt/aqt/reviewer.py
index 4218e83aa..c1be0f010 100644
--- a/qt/aqt/reviewer.py
+++ b/qt/aqt/reviewer.py
@@ -1285,8 +1285,6 @@ class FlexibleReviewer(Reviewer):
FlexiblePushButton(text=tr.studying_more()),
on_clicked=partial(self.showContextMenu),
)
- # Right side: add timer
- self.timer = self.mw.bottomWidget.right_bucket.add_widget(FlexibleTimerLabel())
def browse_queue(self, queue_type: Union[str, Any]) -> None:
if queue_type == QueuedCards.LEARNING:
@@ -1376,8 +1374,12 @@ class FlexibleReviewer(Reviewer):
self._create_middle_buttons_for_question_side()
self._clear_bottom_web()
- assert self.timer, "timer should exist."
- self.timer.start(max_time=self._max_time())
+ # Right side: add timer
+ if (max_time := self._max_time()) > 0:
+ self.timer = self.mw.bottomWidget.right_bucket.add_widget(
+ widget=FlexibleTimerLabel()
+ )
+ self.timer.start(max_time=max_time)
def _should_stop_timer_on_answer(self) -> bool:
conf = self.mw.col.decks.config_dict_for_deck_id(self.card.current_deck_id())
@@ -1393,8 +1395,7 @@ class FlexibleReviewer(Reviewer):
self._create_middle_buttons_for_answer_side()
self._clear_bottom_web()
- assert self.timer, "timer should exist."
- if self._should_stop_timer_on_answer():
+ if self.timer and self._should_stop_timer_on_answer():
self.timer.stop()
def onEnterKey(self) -> None: