Skip to content

Commit a4e8d40

Browse files
committed
updatePage: dismiss overlay directly from busy_changed callback, not via status_ready chain
1 parent f5f26bd commit a4e8d40

3 files changed

Lines changed: 22 additions & 15 deletions

File tree

BlocksScreen/lib/panels/widgets/updatePage.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ def __init__(self) -> None:
6666
self._busy: bool = False
6767
self._update_avail: bool = False
6868
self._post_update_status_pending: bool = False
69+
self._overlay_shown: bool = False
6970
self._elapsed_time_seconds: int = 0
7071
self._elapsed_timer: QtCore.QTimer = QtCore.QTimer(self)
7172
self._elapsed_timer.setSingleShot(False)
@@ -292,10 +293,10 @@ def handle_busy_changed(self, busy: bool) -> None:
292293
self._elapsed_timer.stop()
293294
self._elapsed_time_label.hide()
294295
self._cancel_btn.hide()
295-
self._post_update_status_pending = True
296+
if self._overlay_shown:
297+
self._overlay_shown = False
298+
self.call_load_panel.emit(False, "")
296299
self._request_status_debounced()
297-
# Don't dismiss the overlay yet — wait for status_ready to refresh
298-
# cards first, then handle_status_ready will emit call_load_panel(False).
299300

300301
@QtCore.pyqtSlot(name="on-update-all-clicked")
301302
def on_update_all_clicked(self) -> None:
@@ -309,6 +310,7 @@ def _on_cancel_clicked(self) -> None:
309310

310311
@QtCore.pyqtSlot(name="do-update")
311312
def _do_update(self) -> None:
313+
self._overlay_shown = True
312314
self.request_update.emit("")
313315
self.call_load_panel.emit(True, "Updating all components ...")
314316

@@ -322,6 +324,7 @@ def handle_step_complete(self, name: str, step: int, total: int) -> None:
322324
else:
323325
label = self._STEP_LABELS.get(step, "working")
324326
_log.info("step_complete: %s %d/%d (%s)", name, step, total, label)
327+
self._overlay_shown = True
325328
self.call_load_panel.emit(True, f"{name}: {label} ({step}/{total})")
326329

327330
def _show_toast(self, message: str, *, success: bool = False) -> None:

tests/widgets/test_update_page_unit.py

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -278,17 +278,19 @@ def test_true_does_not_emit_request_status(self, page, qtbot):
278278
with qtbot.assertNotEmitted(page.request_status):
279279
page.handle_busy_changed(True)
280280

281-
def test_false_sets_post_update_pending(self, page):
281+
def test_false_does_not_emit_call_load_panel_when_no_overlay(self, page, qtbot):
282282
page.show_loading = MagicMock()
283-
page.handle_busy_changed(False)
284-
assert page._post_update_status_pending is True
283+
page._overlay_shown = False
284+
with qtbot.assertNotEmitted(page.call_load_panel, wait=200):
285+
page.handle_busy_changed(False)
285286

286-
def test_false_does_not_emit_call_load_panel(self, page, qtbot):
287-
# call_load_panel(False) must NOT fire here — it fires from handle_status_ready
288-
# once cards have refreshed (prevents stale UI flash).
287+
def test_false_emits_call_load_panel_when_overlay_shown(self, page, qtbot):
289288
page.show_loading = MagicMock()
290-
with qtbot.assertNotEmitted(page.call_load_panel, wait=200):
289+
page._overlay_shown = True
290+
with qtbot.waitSignal(page.call_load_panel, timeout=200) as blocker:
291291
page.handle_busy_changed(False)
292+
assert blocker.args == [False, ""]
293+
assert page._overlay_shown is False
292294

293295
def test_true_starts_elapsed_timer(self, page):
294296
page.show_loading = MagicMock()
@@ -346,7 +348,9 @@ def test_update_elapsed_time_increments_seconds(self, page):
346348
assert page._elapsed_time_seconds == 1
347349

348350
def test_update_elapsed_time_formats_display(self, page):
349-
page._elapsed_time_seconds = 124 # Will be incremented to 125 (2 minutes, 5 seconds)
351+
page._elapsed_time_seconds = (
352+
124 # Will be incremented to 125 (2 minutes, 5 seconds)
353+
)
350354
page._update_elapsed_time()
351355
page._elapsed_time_label.setText.assert_called_with("02:05")
352356

updater/service.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,7 @@ async def _run_git_update(self, component: ComponentConfig) -> bool:
224224
elapsed = time.monotonic() - self._last_status_time
225225

226226
try:
227+
self._cb("on_step", component.name, 1, 4)
227228
if elapsed >= 30:
228229
self._log.info(
229230
"%s: git_fetch (%.0fs since last status)", component.name, elapsed
@@ -239,8 +240,8 @@ async def _run_git_update(self, component: ComponentConfig) -> bool:
239240
component.name,
240241
elapsed,
241242
)
242-
self._cb("on_step", component.name, 1, 4)
243243

244+
self._cb("on_step", component.name, 2, 4)
244245
if component.reset_mode == "hard":
245246
ok, err = await git_reset_to_hash(component.path, "HEAD")
246247
if not ok:
@@ -276,15 +277,15 @@ async def _run_git_update(self, component: ComponentConfig) -> bool:
276277
self._log.error("%s: git_pull failed: %s", component.name, err)
277278
await self._rollback(component, prev_hash, "conflict")
278279
return False
279-
self._cb("on_step", component.name, 2, 4)
280280

281+
self._cb("on_step", component.name, 3, 4)
281282
deps_ok, deps_err = await self._install_dependencies(component)
282283
if not deps_ok:
283284
self._log.warning("dependencies error: %s", deps_err)
284285
await self._rollback(component, prev_hash, "deps")
285286
return False
286-
self._cb("on_step", component.name, 3, 4)
287287

288+
self._cb("on_step", component.name, 4, 4)
288289
new_hash = await git_get_hash(component.path)
289290
hook_ok, hook_err = await run_hook(
290291
component.name, component.path, new_hash, prev_hash
@@ -310,7 +311,6 @@ async def _run_git_update(self, component: ComponentConfig) -> bool:
310311
await self._rollback(component, prev_hash, "restart_timeout")
311312
return False
312313

313-
self._cb("on_step", component.name, 4, 4)
314314
self._cb("on_component_done", component.name, True)
315315
return True
316316
except asyncio.CancelledError:

0 commit comments

Comments
 (0)