From fdf016395e07100b5d5a0faf7a2239c44282db18 Mon Sep 17 00:00:00 2001 From: Mike Kipps Date: Wed, 3 Jun 2026 09:30:16 -0400 Subject: [PATCH] Point the Basic-Mode Sweep tab at Advanced Mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Sweep results tab is always visible, but the controls to run a sweep (start/stop/steps + the Run-sweep button) live in the Advanced-Mode-only box, hidden by default. So a Basic-Mode user saw a Sweep tab whose placeholder said "Run a frequency sweep..." with no button anywhere — making the feature look broken ("sweep doesn't do anything"). The sweep is an Advanced feature by design (spec §8), so rather than move the controls, the empty tab now tells the truth: in Basic Mode it reads "The frequency sweep is an Advanced-Mode feature. Use View -> Promote to Advanced Mode to run one." Promoting drops the hint back to the normal ready-to-run prompt. SweepView.clear() gained an optional message argument to carry it. Tests: the Basic-Mode tab names Advanced Mode; promoting clears the hint. Suite 512 -> 514. Co-Authored-By: Claude Opus 4.8 (1M context) --- src/ars_wireworks/ui/main_window.py | 15 +++++++++++++++ src/ars_wireworks/ui/sweep_view.py | 6 +++--- tests/test_sweep.py | 24 ++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/src/ars_wireworks/ui/main_window.py b/src/ars_wireworks/ui/main_window.py index efb5de4..8faba7a 100644 --- a/src/ars_wireworks/ui/main_window.py +++ b/src/ars_wireworks/ui/main_window.py @@ -149,6 +149,13 @@ {"dipole", "inverted_v", "ocfd", "random_wire", "vertical"} ) +#: Shown in the Sweep tab in Basic Mode, where the sweep controls are hidden — +#: the frequency sweep is an Advanced-Mode feature (spec §8). +_SWEEP_BASIC_PROMPT = ( + "The frequency sweep is an Advanced-Mode feature.\n" + "Use View → Promote to Advanced Mode to run one." +) + #: QSettings key for the persisted window geometry (spec §10). _GEOMETRY_KEY = "window/geometry" @@ -539,6 +546,8 @@ def _promote_to_advanced(self) -> None: self._advanced_radials_box.setVisible(True) self._advanced_yagi_box.setVisible(True) self._advanced_path_box.setVisible(True) + # The sweep controls are now available — drop the Basic-Mode hint. + self._sweep_view.clear() centre = self._frequency.value() self._sweep_start.setValue(centre * 0.95) self._sweep_stop.setValue(centre * 1.05) @@ -1435,6 +1444,10 @@ def _build_central_widget(self) -> QWidget: self._buildsheet_view = BuildSheetView() self._path_view = PathView() self._sweep_view = SweepView() + if not self._advanced: + # The sweep controls are Advanced-only, so point Basic-Mode users + # to them instead of an empty "run a sweep" prompt with no button. + self._sweep_view.clear(_SWEEP_BASIC_PROMPT) results_tabs = QTabWidget() results_tabs.addTab(self._output, "Summary") results_tabs.addTab(self._pattern_view, "Radiation pattern") @@ -1772,6 +1785,8 @@ def _silently_promote_to_advanced(self) -> None: self._advanced_radials_box.setVisible(True) self._advanced_yagi_box.setVisible(True) self._advanced_path_box.setVisible(True) + # The sweep controls are now available — drop the Basic-Mode hint. + self._sweep_view.clear() def _reset_loaded_components( self, diff --git a/src/ars_wireworks/ui/sweep_view.py b/src/ars_wireworks/ui/sweep_view.py index 37a784a..2fe5757 100644 --- a/src/ars_wireworks/ui/sweep_view.py +++ b/src/ars_wireworks/ui/sweep_view.py @@ -34,7 +34,7 @@ def show_sweep(self, sweep: SweepResults) -> None: draw_sweep_plot(self._figure, sweep) self._canvas.draw_idle() - def clear(self) -> None: - """Show the placeholder — no sweep has run yet.""" - draw_placeholder(self._figure, _PROMPT) + def clear(self, message: str = _PROMPT) -> None: + """Show a placeholder message — the pre-run (or unavailable) state.""" + draw_placeholder(self._figure, message) self._canvas.draw_idle() diff --git a/tests/test_sweep.py b/tests/test_sweep.py index 134f048..64fa764 100644 --- a/tests/test_sweep.py +++ b/tests/test_sweep.py @@ -47,3 +47,27 @@ def test_main_window_runs_a_sweep(qapp) -> None: window._sweep_steps.setValue(3) window._on_run_sweep() assert window._sweep_view._figure.axes[0].lines + + +def _placeholder_text(window) -> str: + texts = window._sweep_view._figure.axes[0].texts + return texts[0].get_text() if texts else "" + + +def test_basic_mode_sweep_tab_points_to_advanced(qapp) -> None: + from ars_wireworks.ui.main_window import MainWindow + + window = MainWindow() + # Basic Mode by default: the Sweep tab explains the controls are Advanced. + assert not window._advanced + assert "Advanced Mode" in _placeholder_text(window) + + +def test_promoting_drops_the_basic_sweep_hint(qapp) -> None: + from ars_wireworks.ui.main_window import MainWindow + + window = MainWindow() + window._silently_promote_to_advanced() + # After promotion the hint is gone — the ready-to-run prompt shows instead. + assert "Advanced Mode" not in _placeholder_text(window) + assert "sweep" in _placeholder_text(window).lower()