From c25e20a10c8094103ec5979b58ad1c7c7cdbccec Mon Sep 17 00:00:00 2001 From: appleb_m Date: Fri, 20 Mar 2026 16:57:32 +0100 Subject: [PATCH] GUI: main window add restore default view and way to recover refernece samples panel, also capture default window state. --- src/aare/gui/main_window.py | 70 +++++++++++++++++++++++++++++++------ 1 file changed, 60 insertions(+), 10 deletions(-) diff --git a/src/aare/gui/main_window.py b/src/aare/gui/main_window.py index 06d0c67f..458de6f1 100644 --- a/src/aare/gui/main_window.py +++ b/src/aare/gui/main_window.py @@ -47,6 +47,7 @@ from aare.gui.threads.camera_thread import SampleCameraThread from aare.gui.threads.prediction_subscriber import PredictionSubscriber from aare.gui.threads.daq_worker import DAQWorker from aare.gui.threads.jfjoch_viewer import JFJochDBusClient +from aare.gui.tutorials.tutorial_registration import register_tutorials from aare.gui.widgets.alert_banner import AlertBanner from aare.gui.widgets.camera_image import SampleCameraImageLabel from aare.gui.widgets.no_wheel_scroll_area import NoWheelScrollArea @@ -76,6 +77,7 @@ class MainWindow(QMainWindow): self._beamline_recovery_dialog = None self._controls_help_dialog = None self._cleanup_done = False + self._default_window_state = None # Tutorial manager (define tutorials after widgets exist) self._tutorial_event_bus = TutorialEventBus(self) @@ -221,6 +223,11 @@ class MainWindow(QMainWindow): self.ref_tools_dock.setAllowedAreas(Qt.DockWidgetArea.BottomDockWidgetArea) self.addDockWidget(Qt.DockWidgetArea.BottomDockWidgetArea, self.ref_tools_dock) self.tabifyDockWidget(self.ref_tools_dock, self.tell_samples_dock) + if self.__decoded_token.staff: + self.ref_tools_dock.show() + self.ref_tools_dock.raise_() + else: + self.ref_tools_dock.hide() self.sample_logic = SampleMountLogic() @@ -282,6 +289,7 @@ class MainWindow(QMainWindow): self.setWindowTitle("AareGUI") self.create_menu_bar() + self._capture_default_window_state() self._restore_window_state() # Define tutorials now that the UI exists @@ -522,35 +530,41 @@ class MainWindow(QMainWindow): file_menu.addAction(quit_action) view_menu = menu_bar.addMenu("View") + show_samples_action = QAction("Show Sample List", self) show_samples_action.setCheckable(True) show_samples_action.setChecked(True) - show_samples_action.triggered.connect(lambda: self.tell_samples_dock.setVisible(show_samples_action.isChecked())) - - # When dock visibility changes, update the action's checked state + show_samples_action.triggered.connect(lambda checked: self.tell_samples_dock.setVisible(checked)) self.tell_samples_dock.visibilityChanged.connect(show_samples_action.setChecked) view_menu.addAction(show_samples_action) + if self.__decoded_token.staff: + show_reference_tools_action = QAction("Show Reference Tools", self) + show_reference_tools_action.setCheckable(True) + show_reference_tools_action.setChecked(True) + show_reference_tools_action.triggered.connect( + lambda checked: self.ref_tools_dock.setVisible(checked) + ) + self.ref_tools_dock.visibilityChanged.connect(show_reference_tools_action.setChecked) + view_menu.addAction(show_reference_tools_action) + show_job_list_action = QAction("Show job List", self) show_job_list_action.setCheckable(True) show_job_list_action.setChecked(True) - show_job_list_action.triggered.connect(self.job_list_dock.setVisible) - # When dock visibility changes, update the action's checked state - show_job_list_action.triggered.connect(lambda: self.job_list_dock.setVisible(show_job_list_action.isChecked())) + show_job_list_action.triggered.connect(lambda checked: self.job_list_dock.setVisible(checked)) + self.job_list_dock.visibilityChanged.connect(show_job_list_action.setChecked) view_menu.addAction(show_job_list_action) show_manual_sample_action = QAction("Show manual sample", self) show_manual_sample_action.setCheckable(True) show_manual_sample_action.setChecked(True) - show_manual_sample_action.triggered.connect(self.manual_sample_dock.setVisible) - # When dock visibility changes, update the action's checked state - show_manual_sample_action.triggered.connect(lambda: self.manual_sample_dock.setVisible(show_manual_sample_action.isChecked())) + show_manual_sample_action.triggered.connect(lambda checked: self.manual_sample_dock.setVisible(checked)) + self.manual_sample_dock.visibilityChanged.connect(show_manual_sample_action.setChecked) view_menu.addAction(show_manual_sample_action) show_face_panel_action = QAction("Show face detection", self) show_face_panel_action.setCheckable(True) show_face_panel_action.setChecked(False) - #show_face_panel_action.triggered.connect(self.face_panel_dock.setVisible) show_face_panel_action.triggered.connect(lambda checked: self.face_panel_dock.setVisible(checked)) self.face_panel_dock.visibilityChanged.connect(show_face_panel_action.setChecked) view_menu.addAction(show_face_panel_action) @@ -566,6 +580,7 @@ class MainWindow(QMainWindow): show_smargon_trace_action.setCheckable(True) show_smargon_trace_action.setChecked(False) show_smargon_trace_action.triggered.connect(lambda checked: self.smargon_trace_dock.setVisible(checked)) + self.smargon_trace_dock.visibilityChanged.connect(show_smargon_trace_action.setChecked) self.smargon_trace_dock.visibilityChanged.connect( lambda visible: self.smargon_trace_panel.refresh_plot(force=True) if visible else None ) @@ -578,6 +593,12 @@ class MainWindow(QMainWindow): self.log_dock.visibilityChanged.connect(show_log_action.setChecked) view_menu.addAction(show_log_action) + view_menu.addSeparator() + + restore_default_view_action = QAction("Restore Default View", self) + restore_default_view_action.triggered.connect(self.restore_default_view) + view_menu.addAction(restore_default_view_action) + help_menu = menu_bar.addMenu("Help") about_action = QAction("About", self) # Action for 'About' about_action.triggered.connect(self.show_about_dialog) @@ -606,6 +627,32 @@ class MainWindow(QMainWindow): start_interactive_tutorial_action.triggered.connect(self.start_interactive_tutorial) help_menu.addAction(start_interactive_tutorial_action) + def _capture_default_window_state(self) -> None: + self._default_window_state = self.saveState() + + @Slot() + def restore_default_view(self) -> None: + if self._default_window_state is not None: + self.restoreState(self._default_window_state) + + self.tell_samples_dock.setVisible(True) + self.job_list_dock.setVisible(True) + self.manual_sample_dock.setVisible(True) + + self.face_panel_dock.setVisible(False) + self.fluor_panel_dock.setVisible(False) + self.smargon_trace_dock.setVisible(False) + self.log_dock.setVisible(False) + + if self.__decoded_token.staff: + self.ref_tools_dock.setVisible(True) + self.ref_tools_dock.raise_() + else: + self.ref_tools_dock.setVisible(False) + self.tell_samples_dock.raise_() + + self.video_tab.setCurrentIndex(0) + def show_about_dialog(self): QMessageBox.about( self, @@ -684,6 +731,9 @@ class MainWindow(QMainWindow): if state is not None: self.restoreState(state) + if not self.__decoded_token.staff: + self.ref_tools_dock.hide() + def closeEvent(self, event) -> None: try: settings = QSettings()