from PyQt6.QtGui import QAction from PyQt6.QtWidgets import QMainWindow, QMenuBar from callbacks import CallbackDispatcher from callbacks import CallbackType from channel_calibration_dialog import ChannelCalibrationDialog from detektor_data import DetektorContainer from detektor_region import DetektorRegionState, DetektorRegion from open_file import OpenFileDialog from save_as_dialog import SaveAsFileDialog from change_start_dialog import ChangeStartDialog from parsers import export_to_xlsx class Menubar(QMenuBar): region: DetektorRegion = None def __init__(self, main_window: QMainWindow, region: DetektorRegion): super().__init__(main_window) self.main_window = main_window self.region = region CallbackDispatcher().register(CallbackType.REGION_STATE, self.update_enabled) CallbackDispatcher().register(CallbackType.DATA_PARSED, self.update_enabled) CallbackDispatcher().register(CallbackType.DATA_NOT_PARSED, self.update_enabled) CallbackDispatcher().register(CallbackType.DATA_TAINTED, self.update_enabled) ################################################## ### File ################################################## file_menu = self.addMenu('Soubor') self.open_action = QAction('Otevřít', self) self.open_action.setShortcut('Ctrl+O') self.open_action.triggered.connect(self.open_file_dialog) file_menu.addAction(self.open_action) self.save_action = QAction('Uložit', self) self.save_action.setShortcut('Ctrl+S') self.save_action.triggered.connect(self.save) file_menu.addAction(self.save_action) self.save_as_action = QAction('Uložit jako...', self) self.save_as_action.triggered.connect(self.save_as_dialog) file_menu.addAction(self.save_as_action) self.exit_action = QAction('Ukončit', self) self.exit_action.triggered.connect(self.quit) # Close the application self.exit_action.setShortcut('Ctrl+W') file_menu.addAction(self.exit_action) ################################################## ### Data ################################################## data_menu = self.addMenu('Data') # Create actions for the Edit menu self.revert_change_action = QAction('Zpět', self) self.revert_change_action.setShortcut('Ctrl+Z') self.revert_change_action.triggered.connect(self.revert_change) data_menu.addAction(self.revert_change_action) data_menu.addSeparator() self.add_selection_action = QAction('Přidat výběr', self) self.add_selection_action.setShortcut('Ctrl+A') self.add_selection_action.triggered.connect(self.region.set) data_menu.addAction(self.add_selection_action) self.cancel_selection_action = QAction('Zrušit výběr', self) self.cancel_selection_action.setShortcut('Esc') self.cancel_selection_action.triggered.connect(self.region.unset) data_menu.addAction(self.cancel_selection_action) self.delete_selection_action = QAction('Smazat výběr', self) self.delete_selection_action.setShortcut('Delete') self.delete_selection_action.triggered.connect(self.region.delete) data_menu.addAction(self.delete_selection_action) self.copy_action = QAction('Kopírovat', self) self.copy_action.setShortcut('Ctrl+C') self.copy_action.triggered.connect(self.region.copy) data_menu.addAction(self.copy_action) self.cut_action = QAction('Vyjmout', self) self.cut_action.setShortcut('Ctrl+X') self.cut_action.triggered.connect(self.region.cut) data_menu.addAction(self.cut_action) self.paste_action = QAction('Vložit na kurzor', self) self.paste_action.setShortcut('Ctrl+V') self.paste_action.triggered.connect(self.region.paste_at) data_menu.addAction(self.paste_action) self.paste_after_action = QAction('Vložit za výběr', self) self.paste_after_action.setShortcut('Ctrl+B') self.paste_after_action.triggered.connect(self.region.paste_after) data_menu.addAction(self.paste_after_action) self.paste_at_end_action = QAction('Vložit na konec', self) self.paste_at_end_action.setShortcut('Ctrl+K') self.paste_at_end_action.triggered.connect(self.region.paste_end) data_menu.addAction(self.paste_at_end_action) data_menu.addSeparator() self.change_start_action = QAction('Změnit datum a čas', self) self.change_start_action.setShortcut('Ctrl+M') self.change_start_action.triggered.connect(self.open_change_start_dialog) data_menu.addAction(self.change_start_action) self.calibrate_channel_action = QAction('Kalibrovat data kanálu', self) self.calibrate_channel_action.setShortcut('Ctrl+K') self.calibrate_channel_action.triggered.connect(self.open_calibrate_channel_dialog) data_menu.addAction(self.calibrate_channel_action) self.update_enabled() def update_enabled(self): if self.region.state == DetektorRegionState.UNSET: self.add_selection_action.setEnabled(True) self.cancel_selection_action.setEnabled(False) self.delete_selection_action.setEnabled(False) self.cut_action.setEnabled(False) self.copy_action.setEnabled(False) self.paste_action.setEnabled(False) self.paste_after_action.setEnabled(False) self.paste_at_end_action.setEnabled(False) elif self.region.state == DetektorRegionState.SET: self.add_selection_action.setEnabled(False) self.cancel_selection_action.setEnabled(True) self.delete_selection_action.setEnabled(True) self.cut_action.setEnabled(True) self.copy_action.setEnabled(True) self.paste_action.setEnabled(False) self.paste_after_action.setEnabled(False) self.paste_at_end_action.setEnabled(False) elif self.region.state == DetektorRegionState.COPIED: self.add_selection_action.setEnabled(False) self.cancel_selection_action.setEnabled(True) self.delete_selection_action.setEnabled(True) self.cut_action.setEnabled(True) self.copy_action.setEnabled(True) self.paste_action.setEnabled(True) self.paste_after_action.setEnabled(True) self.paste_at_end_action.setEnabled(True) if DetektorContainer().get().file_path is None: # no file path - no save self.save_action.setEnabled(False) self.calibrate_channel_action.setEnabled(False) self.change_start_action.setEnabled(False) else: if DetektorContainer().get().file_path.endswith('.xlsx'): # loaded XLSX -> we can save it self.save_action.setEnabled(True) else: # Loaded DBF -> no save self.save_action.setEnabled(False) self.calibrate_channel_action.setEnabled(True) self.change_start_action.setEnabled(True) if DetektorContainer().has_history(): self.revert_change_action.setEnabled(True) else: self.revert_change_action.setEnabled(False) def open_change_start_dialog(self): diag = ChangeStartDialog() def open_calibrate_channel_dialog(self): diag = ChannelCalibrationDialog(self.region) def open_file_dialog(self): diag = OpenFileDialog(DetektorContainer().get()) def save_as_dialog(self): diag = SaveAsFileDialog() def save(self): export_to_xlsx(DetektorContainer().get().file_path) def revert_change(self): DetektorContainer().revert() def quit(self): """ Decides what to do with the saving or quitting """ self.main_window.close()