Source code for qudi.core.gui.main_gui.mainwindow

# -*- coding: utf-8 -*-
"""
This file contains the QMainWindow class for the Qudi main GUI.

Copyright (c) 2021, the qudi developers. See the AUTHORS.md file at the top-level directory of this
distribution and on <https://github.com/Ulm-IQO/qudi-core/>

This file is part of qudi.

Qudi is free software: you can redistribute it and/or modify it under the terms of
the GNU Lesser General Public License as published by the Free Software Foundation,
either version 3 of the License, or (at your option) any later version.

Qudi is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License along with qudi.
If not, see <https://www.gnu.org/licenses/>.
"""

import os
from PySide2 import QtCore, QtGui, QtWidgets
from qudi.core.gui.main_gui.logwidget import LogWidget
from qudi.core.gui.main_gui.remotewidget import RemoteWidget
from qudi.core.gui.main_gui.aboutqudidialog import AboutQudiDialog
from qudi.core.gui.main_gui.settingsdialog import SettingsDialog
from qudi.core.gui.main_gui.modulewidget import ModuleWidget
from qudi.core.gui.main_gui.configwidget import ConfigQTreeWidget
from qudi.util.paths import get_artwork_dir
from qudi.util.widgets.advanced_dockwidget import AdvancedDockWidget
from qtconsole.rich_jupyter_widget import RichJupyterWidget


[docs] class QudiMainWindow(QtWidgets.QMainWindow): """ Main Window definition for the manager GUI. """
[docs] def __init__(self, parent=None, debug_mode=False, **kwargs): super().__init__(parent, **kwargs) self.setWindowTitle('qudi: Manager') screen_size = QtWidgets.QApplication.instance().primaryScreen().availableSize() width = (screen_size.width() * 3) // 4 height = (screen_size.height() * 3) // 4 self.resize(width, height) self.module_widget = ModuleWidget() self.module_widget.setObjectName('moduleTabWidget') self.setCentralWidget(self.module_widget) # Create actions # Toolbar actions icon_path = os.path.join(get_artwork_dir(), 'icons') self.action_load_configuration = QtWidgets.QAction() self.action_load_configuration.setIcon( QtGui.QIcon(os.path.join(icon_path, 'document-open'))) self.action_load_configuration.setText('Load configuration') self.action_load_configuration.setToolTip('Load configuration') self.action_open_configuration_editor = QtWidgets.QAction() self.action_open_configuration_editor.setIcon( QtGui.QIcon(os.path.join(icon_path, 'document-new')) ) self.action_open_configuration_editor.setText('New configuration') self.action_open_configuration_editor.setToolTip( 'Open the graphical configuration editor for editing or creating a new qudi ' 'configuration' ) self.action_reload_qudi = QtWidgets.QAction() self.action_reload_qudi.setIcon( QtGui.QIcon(os.path.join(icon_path, 'view-refresh'))) self.action_reload_qudi.setText('Reload current configuration') self.action_reload_qudi.setToolTip('Reload current configuration') self.action_load_all_modules = QtWidgets.QAction() self.action_load_all_modules.setIcon( QtGui.QIcon(os.path.join(icon_path, 'dialog-warning'))) self.action_load_all_modules.setText('Load all modules') self.action_load_all_modules.setToolTip('Load all available modules found in configuration') # quit action self.action_quit = QtWidgets.QAction() self.action_quit.setIcon(QtGui.QIcon(os.path.join(icon_path, 'application-exit'))) self.action_quit.setText('Quit qudi') self.action_quit.setToolTip('Quit qudi') self.action_quit.setShortcut(QtGui.QKeySequence('Ctrl+Q')) # view actions self.action_view_console = QtWidgets.QAction() self.action_view_console.setCheckable(True) self.action_view_console.setChecked(True) self.action_view_console.setText('Show console') self.action_view_console.setToolTip('Show IPython console') self.action_view_log = QtWidgets.QAction() self.action_view_log.setCheckable(True) self.action_view_log.setChecked(True) self.action_view_log.setText('Show log') self.action_view_log.setToolTip('Show log dockwidget') self.action_view_config = QtWidgets.QAction() self.action_view_config.setCheckable(True) self.action_view_config.setChecked(False) self.action_view_config.setText('Show configuration') self.action_view_config.setToolTip('Show configuration dockwidget') self.action_view_remote = QtWidgets.QAction() self.action_view_remote.setCheckable(True) self.action_view_remote.setChecked(False) self.action_view_remote.setText('Show remote') self.action_view_remote.setToolTip('Show remote connections dockwidget') self.action_view_threads = QtWidgets.QAction() self.action_view_threads.setCheckable(True) self.action_view_threads.setChecked(False) self.action_view_threads.setText('Show threads') self.action_view_threads.setToolTip('Show threads dockwidget') self.action_view_default = QtWidgets.QAction() self.action_view_default.setText('Restore default') self.action_view_default.setToolTip('Restore default view') # Dialog actions self.action_settings = QtWidgets.QAction() self.action_settings.setIcon(QtGui.QIcon(os.path.join(icon_path, 'configure'))) self.action_settings.setText('Settings') self.action_settings.setToolTip('Open settings dialog') self.action_about_qudi = QtWidgets.QAction() self.action_about_qudi.setIcon( QtGui.QIcon(os.path.join(icon_path, 'go-home'))) self.action_about_qudi.setText('About qudi') self.action_about_qudi.setToolTip('Read up about qudi') self.action_about_qt = QtWidgets.QAction() self.action_about_qt.setIcon( QtGui.QIcon(os.path.join(icon_path, 'go-home'))) self.action_about_qt.setText('About Qt') self.action_about_qt.setToolTip('Read up about Qt') # Create toolbar self.toolbar = QtWidgets.QToolBar() self.toolbar.setObjectName('QudiMainWindow Toolbar') self.toolbar.setOrientation(QtCore.Qt.Horizontal) self.toolbar.addAction(self.action_open_configuration_editor) self.toolbar.addAction(self.action_load_configuration) self.toolbar.addAction(self.action_reload_qudi) self.toolbar.addSeparator() self.toolbar.addAction(self.action_load_all_modules) self.addToolBar(self.toolbar) # Create menu bar self.menubar = QtWidgets.QMenuBar() menu = QtWidgets.QMenu('File') menu.addAction(self.action_open_configuration_editor) menu.addSeparator() menu.addAction(self.action_load_configuration) menu.addAction(self.action_reload_qudi) menu.addSeparator() menu.addAction(self.action_load_all_modules) menu.addSeparator() menu.addAction(self.action_settings) menu.addSeparator() menu.addAction(self.action_quit) self.menubar.addMenu(menu) menu = QtWidgets.QMenu('View') menu.addAction(self.action_view_console) menu.addAction(self.action_view_log) menu.addAction(self.action_view_config) menu.addAction(self.action_view_remote) menu.addAction(self.action_view_threads) menu.addSeparator() menu.addAction(self.action_view_default) self.menubar.addMenu(menu) menu = QtWidgets.QMenu('About') menu.addAction(self.action_about_qudi) menu.addAction(self.action_about_qt) self.menubar.addMenu(menu) self.setMenuBar(self.menubar) # Create status bar self.statusbar = QtWidgets.QStatusBar() self.setStatusBar(self.statusbar) self.version_label = QtWidgets.QLabel() self.version_label.setOpenExternalLinks(True) self.statusbar.addWidget(self.version_label) # Create dialogues self.about_qudi_dialog = AboutQudiDialog() self.about_qudi_dialog.setWindowTitle('About qudi') self.settings_dialog = SettingsDialog() # Create dockwidgets self.config_widget = ConfigQTreeWidget() self.config_dockwidget = AdvancedDockWidget('Configuration') self.config_dockwidget.setWidget(self.config_widget) self.config_dockwidget.setAllowedAreas( QtCore.Qt.BottomDockWidgetArea | QtCore.Qt.LeftDockWidgetArea ) self.log_widget = LogWidget(debug_mode=debug_mode) self.log_dockwidget = AdvancedDockWidget('Log') self.log_dockwidget.setWidget(self.log_widget) self.log_dockwidget.setAllowedAreas(QtCore.Qt.BottomDockWidgetArea) self.remote_widget = RemoteWidget() self.remote_dockwidget = AdvancedDockWidget('Remote modules') self.remote_dockwidget.setWidget(self.remote_widget) self.remote_dockwidget.setAllowedAreas(QtCore.Qt.BottomDockWidgetArea) self.threads_widget = QtWidgets.QListView() self.threads_dockwidget = AdvancedDockWidget('Threads') self.threads_dockwidget.setWidget(self.threads_widget) self.threads_dockwidget.setAllowedAreas(QtCore.Qt.BottomDockWidgetArea) self.console_widget = RichJupyterWidget() self.console_dockwidget = AdvancedDockWidget('Console') self.console_dockwidget.setWidget(self.console_widget) self.console_dockwidget.setAllowedAreas( QtCore.Qt.RightDockWidgetArea | QtCore.Qt.LeftDockWidgetArea) # Add dockwidgets to main window self.addDockWidget(QtCore.Qt.BottomDockWidgetArea, self.config_dockwidget) self.addDockWidget(QtCore.Qt.BottomDockWidgetArea, self.log_dockwidget) self.addDockWidget(QtCore.Qt.BottomDockWidgetArea, self.remote_dockwidget) self.addDockWidget(QtCore.Qt.BottomDockWidgetArea, self.threads_dockwidget) self.addDockWidget(QtCore.Qt.RightDockWidgetArea, self.console_dockwidget) # Synchronize dockwidget visibility change signals self.config_dockwidget.sigClosed.connect(lambda: self.action_view_config.setChecked(False)) self.log_dockwidget.sigClosed.connect( lambda: self.action_view_log.setChecked(False)) self.remote_dockwidget.sigClosed.connect( lambda: self.action_view_remote.setChecked(False)) self.threads_dockwidget.sigClosed.connect( lambda: self.action_view_threads.setChecked(False)) self.console_dockwidget.sigClosed.connect( lambda: self.action_view_console.setChecked(False)) self.action_view_config.toggled.connect(self.config_dockwidget.setVisible) self.action_view_log.toggled.connect(self.log_dockwidget.setVisible) self.action_view_remote.toggled.connect(self.remote_dockwidget.setVisible) self.action_view_threads.toggled.connect(self.threads_dockwidget.setVisible) self.action_view_console.toggled.connect(self.console_dockwidget.setVisible) # Connect dialog open signals self.action_about_qudi.triggered.connect(self.about_qudi_dialog.open) self.action_about_qt.triggered.connect(QtWidgets.QApplication.aboutQt) self.action_settings.triggered.connect(self.settings_dialog.exec_) # modal return