some fixes
This commit is contained in:
@@ -2,6 +2,8 @@
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from PyQt6.QtCore import QTimer
|
||||
|
||||
from python_app.gui.preprocess_dialog import PreprocessDialog
|
||||
from python_app.gui.trace_png_export import export_trace_png
|
||||
from python_app.orchestration.preprocess_assets import (
|
||||
@@ -519,13 +521,23 @@ class AppWindowPreprocessMixin:
|
||||
if session is None:
|
||||
self._show_error("No active capture sequence")
|
||||
return
|
||||
# The capture blocks the event loop, so clicks made during it are delivered
|
||||
# only after it finishes. `_begin_preprocess_capture` disables the action
|
||||
# buttons for that whole window (re-enabled via a posted event), so a queued
|
||||
# click lands on a disabled button instead of silently starting — and
|
||||
# advancing the combo cursor of — another capture.
|
||||
if not self._begin_preprocess_capture():
|
||||
return
|
||||
|
||||
try:
|
||||
capture_result = session.capture_current_combo()
|
||||
except Exception as exc: # noqa: BLE001
|
||||
self._on_capture_combo_failed(session, exc)
|
||||
return
|
||||
self._record_preprocess_capture(session, capture_result)
|
||||
try:
|
||||
capture_result = session.capture_current_combo()
|
||||
except Exception as exc: # noqa: BLE001
|
||||
self._on_capture_combo_failed(session, exc)
|
||||
return
|
||||
self._record_preprocess_capture(session, capture_result)
|
||||
finally:
|
||||
self._end_preprocess_capture()
|
||||
|
||||
def _capture_all_remaining(self) -> None:
|
||||
"""Capture all remaining combos for the active preprocess session."""
|
||||
@@ -539,6 +551,8 @@ class AppWindowPreprocessMixin:
|
||||
details=self._capture_state_details(),
|
||||
)
|
||||
return
|
||||
if not self._begin_preprocess_capture():
|
||||
return
|
||||
|
||||
display_name = preprocess_asset_display_name(session.kind)
|
||||
dialog = self._ensure_preprocess_dialog()
|
||||
@@ -547,13 +561,40 @@ class AppWindowPreprocessMixin:
|
||||
f"{display_name} batch capture started: remaining="
|
||||
f"{session.state().total_count - session.state().captured_count}"
|
||||
)
|
||||
while not session.is_complete():
|
||||
try:
|
||||
capture_result = session.capture_current_combo()
|
||||
except Exception as exc: # noqa: BLE001
|
||||
self._on_capture_combo_failed(session, exc)
|
||||
return
|
||||
self._record_preprocess_capture(session, capture_result)
|
||||
try:
|
||||
while not session.is_complete():
|
||||
try:
|
||||
capture_result = session.capture_current_combo()
|
||||
except Exception as exc: # noqa: BLE001
|
||||
self._on_capture_combo_failed(session, exc)
|
||||
return
|
||||
self._record_preprocess_capture(session, capture_result)
|
||||
finally:
|
||||
self._end_preprocess_capture()
|
||||
|
||||
def _begin_preprocess_capture(self) -> bool:
|
||||
"""Mark a blocking combo capture as running; refuse when one already is.
|
||||
|
||||
Returns False for a duplicate request (e.g. a click delivered while an
|
||||
error dialog inside a capture pumps the event loop).
|
||||
"""
|
||||
if self._preprocess_capture_busy:
|
||||
self._log("Preprocess combo capture already in progress; ignoring duplicate request.")
|
||||
return False
|
||||
self._preprocess_capture_busy = True
|
||||
# Disable the sequence action buttons for the whole blocked window.
|
||||
self._update_capture_dialog_state()
|
||||
return True
|
||||
|
||||
def _end_preprocess_capture(self) -> None:
|
||||
"""Re-enable capture actions after the pending input backlog is discarded.
|
||||
|
||||
The zero-delay timer fires only after Qt has dispatched the window-system
|
||||
events queued while the capture blocked the loop; those clicks hit the
|
||||
still-disabled buttons and are dropped, then the buttons come back.
|
||||
"""
|
||||
self._preprocess_capture_busy = False
|
||||
QTimer.singleShot(0, self._update_capture_dialog_state)
|
||||
|
||||
def _on_capture_combo_failed(
|
||||
self,
|
||||
@@ -817,6 +858,10 @@ class AppWindowPreprocessMixin:
|
||||
and state.current_combo is not None
|
||||
),
|
||||
variant_count=state.variant_count,
|
||||
# While a blocking capture is executing, every action stays disabled no
|
||||
# matter what the session state allows: clicks queued during the freeze
|
||||
# must land on disabled buttons (see `_end_preprocess_capture`).
|
||||
actions_enabled=not self._preprocess_capture_busy,
|
||||
)
|
||||
|
||||
def _cleanup_capture_session(self) -> None:
|
||||
|
||||
Reference in New Issue
Block a user