""" Filename: viewerlauncher.py Description: Viewer launcher window Author: Tyler de Zeeuw License: GPL-3.0 """ # External library imports from PySide6.QtWidgets import QPushButton, QWidget, QVBoxLayout from PySide6.QtCore import QTimer from src.analysis.exporttocsv import ExportToCSVWidget from src.analysis.intergroupbrainimage import InterGroupBrainImageWidget from src.analysis.crossgroupbrainimage import CrossGroupBrainImageWidget from src.analysis.intergroupfunctionalconnectivity import InterGroupFunctionalConnectivityWidget from src.analysis.intergroupstats import InterGroupStatsWidget from src.analysis.crossgroupstats import CrossGroupStatsWidget from src.analysis.participantimage import ParticipantImageViewerWidget from src.analysis.participantbrain import ParticipantBrainViewerWidget from src.analysis.participantfoldchannels import ParticipantFoldChannelsWidget from src.analysis.participantfunctionalconnectivity import ParticipantFunctionalConnectivityWidget from src.shared.shareddata import APP_NAME class ViewerLauncherWidget(QWidget): def __init__(self, haemo_dict, epochs_dict, cha_dict, df_ind_dict, design_matrix_dict, config_dict, fig_bytes_dict, contrast_results_dict, folding_bypass, json_location): super().__init__() self.setWindowTitle(f"Viewer Launcher - {APP_NAME.upper()}") group_dict = {f: c.get("GROUP", "Unknown") for f, c in config_dict.items()} btn_data = [ ("Participant Image Viewer", ParticipantImageViewerWidget, [haemo_dict, fig_bytes_dict], True), ("Participant Brain Viewer", ParticipantBrainViewerWidget, [haemo_dict, cha_dict], True), ("Participant Fold Channels Viewer", ParticipantFoldChannelsWidget, [haemo_dict, cha_dict], False), ("Participant Functional Connectivity Viewer [BETA]", ParticipantFunctionalConnectivityWidget, [haemo_dict, epochs_dict], True), ("Inter-Group Functional Connectivity Viewer [BETA]", InterGroupFunctionalConnectivityWidget, [haemo_dict, group_dict, config_dict], True), ("Inter-Group Stats Viewer", InterGroupStatsWidget, [haemo_dict, cha_dict, df_ind_dict, design_matrix_dict, contrast_results_dict, group_dict, json_location], True), ("Cross-Group Stats Viewer", CrossGroupStatsWidget, [haemo_dict, cha_dict, df_ind_dict, design_matrix_dict, contrast_results_dict, group_dict, json_location], True), ("Inter-Group Brain and Image Viewer", InterGroupBrainImageWidget, [haemo_dict, cha_dict, df_ind_dict, design_matrix_dict, contrast_results_dict, group_dict], True), ("Cross-Group Brain and Image Viewer", CrossGroupBrainImageWidget, [haemo_dict, df_ind_dict, design_matrix_dict, contrast_results_dict, group_dict], True), ("Export To CSV Viewer", ExportToCSVWidget, [haemo_dict, cha_dict, df_ind_dict, design_matrix_dict, contrast_results_dict, group_dict, config_dict], True) ] layout = QVBoxLayout(self) for label, widget_class, args, requires_bypass in btn_data: btn = QPushButton(f"Open {label}") # Connect directly to the generic opener btn.clicked.connect(lambda _, c=widget_class, b=btn, a=args: self._open_viewer(c, b, *a)) btn.setEnabled(not (requires_bypass and folding_bypass)) layout.addWidget(btn) def _open_viewer(self, widget_class, btn, *args): # Instantiate and show dynamically self.active_viewer = widget_class(*args) self.active_viewer.show() self._trigger_success(btn) def _launch(self, func, btn, *args): func(*args) self._trigger_success(btn) def _trigger_success(self, button): """Temporarily adds a green checkmark to the button text.""" original_text = button.text() button.setText(f"{original_text} ✔") button.setStyleSheet("color: green; font-weight: bold;") # Revert after 1 second QTimer.singleShot(1000, lambda: self._revert_button(button, original_text)) def _revert_button(self, button, original_text): button.setText(original_text) button.setStyleSheet("")