class MainWindow(QMainWindow): """Handle all subwindows.""" def __init__(self, s=None, *args, **kwargs): super(MainWindow, self).__init__(*args, **kwargs) self.settings = s self.actions = {} self.views = {} self.toolbar = None self.init_ui() self.init_actions() self.init_menu() self.add_view(CensusView(), 'census') self.add_view(GedcomView(), 'gedcom') self.add_view(DNAView(), 'dna') open_windows = self.settings.get('window') for window, state in open_windows.items(): if state: self.actions[window].trigger() def init_ui(self): """Initialize UI.""" main_size = self.settings.get('main.size') print(main_size) if main_size: self.resize(*main_size) else: self.resize(640, 480) self.central_widget = QMdiArea() self.setCentralWidget(self.central_widget) def init_menu(self): """Initialize the main menu.""" menubar = self.menuBar() menubar.setNativeMenuBar(False) filemenu = menubar.addMenu('&File') filemenu.addAction(self.actions['preferences']) filemenu.addAction(self.actions['exit']) self.viewmenu = menubar.addMenu('&View') windowmenu = menubar.addMenu("&Window") windowmenu.addAction(self.actions['cascade']) windowmenu.addAction(self.actions['tile']) helpmenu = menubar.addMenu("&Help") helpmenu.addAction(self.actions['about']) def view_chosen(self, t): data = t.data() self.central_widget.set_current(data) self.settings.set('current_view', data) def init_toolbar(self): self.toolbar = self.addToolBar('Exit') self.toolbar.addAction(self.actions['exit']) def init_actions(self): self.actions['exit'] = QAction(QIcon(ICONS['exit']), '&Exit', self) self.actions['exit'].setShortcut('Ctrl+Q') self.actions['exit'].menuRole = QAction.QuitRole self.actions['exit'].triggered.connect(self.close) self.actions['preferences'] = QAction("Preferences", self) self.actions['preferences'].menuRole = QAction.PreferencesRole self.actions['preferences'].triggered.connect(self.preferences) self.actions['about'] = QAction("&About", self) self.actions['about'].menuRole = QAction.AboutRole self.actions['about'].triggered.connect(self.about) self.actions['tile'] = QAction("Tile", self) self.actions['tile'].triggered.connect( self.central_widget.tileSubWindows) self.actions['cascade'] = QAction("Cascade", self) self.actions['cascade'].triggered.connect( self.central_widget.cascadeSubWindows) def toggle_view(self, actionname): action = self.actions[actionname] if action.isChecked(): self.open_window(self.views[actionname]) self.settings.set("window.{}".format(actionname), True) else: self.close_window(self.views[actionname]) self.settings.set("window.{}".format(actionname), False) def about(self): about = QMessageBox() about.setTextFormat(Qt.RichText) about.setText("Created by Greger Stolt Nilsen") about.setInformativeText("<br />".join([ "Icons from <a href='https://icons8.com/'>Icons8</a>", "Source at <a href='https://github.com/gregersn/gensplorer'>GitHub</a>" ])) about.exec_() def preferences(self): preferences = dialogs.Preferences(self.settings) preferences.exec_() def add_view(self, w, name): sub = QMdiSubWindow() sub.setWidget(w) self.views[name] = sub self.actions[name] = QAction( w.display_name if hasattr(w, 'display_name') else name, self, checkable=True) self.actions[name].setData(name) self.actions[name].triggered.connect(lambda: self.toggle_view(name)) self.viewmenu.addAction(self.actions[name]) def add_window(self, w): sub = QMdiSubWindow() sub.setWidget(w) self.central_widget.addSubWindow(sub) sub.show() def open_window(self, w): print("Opening window", w) self.central_widget.addSubWindow(w) w.show() def close_window(self, w): print("Closing window", w) self.central_widget.removeSubWindow(w) def closeEvent(self, event): print("Close event") self.settings.set("main.size", (self.size().width(), self.size().height())) self.settings.save()