from typing import Union, TYPE_CHECKING, Dict
from qtpy.QtCore import QObject, QLocale
from qtpy import QtCore, QtWidgets
from pyqtgraph.dockarea import DockArea
from pymodaq_gui.utils.dock import DockArea, Dock
from pymodaq_gui.managers.action_manager import ActionManager
from pymodaq_gui.managers.parameter_manager import ParameterManager
from pymodaq_gui.parameter import ParameterTree
[docs]
class CustomApp(QObject, ActionManager, ParameterManager):
"""Base Class to ease the implementation of User Interfaces
Inherits the MixIns ActionManager and ParameterManager classes. You have to subclass some methods and make
concrete implementation of a given number of methods:
* setup_actions: mandatory, see :class:`pymodaq.utils.managers.action_manager.ActionManager`
* value_changed: non mandatory, see :class:`pymodaq.utils.managers.parameter_manager.ParameterManager`
* child_added: non mandatory, see :class:`pymodaq.utils.managers.parameter_manager.ParameterManager`
* param_deleted: non mandatory, see :class:`pymodaq.utils.managers.parameter_manager.ParameterManager`
* setup_docks: mandatory
* setup_menu: non mandatory
* connect_things: mandatory
Parameters
----------
parent: DockArea or QtWidget
See Also
--------
:class:`pymodaq.utils.managers.action_manager.ActionManager`,
:class:`pymodaq.utils.managers.parameter_manager.ParameterManager`,
:class:`pymodaq.utils.managers.modules_manager.ModulesManager`,
"""
log_signal = QtCore.Signal(str)
params = []
def __init__(self, parent: Union[DockArea, QtWidgets.QMainWindow, QtWidgets.QWidget] = None,
tree: ParameterTree = None):
QObject.__init__(self)
ActionManager.__init__(self)
ParameterManager.__init__(self, tree=tree)
if not (isinstance(parent, DockArea) or
isinstance(parent, QtWidgets.QMainWindow) or
isinstance(parent, QtWidgets.QWidget)):
parent = QtWidgets.QWidget()
self.parent = parent
if isinstance(parent, DockArea):
self.dockarea: DockArea = parent
self.mainwindow: QtWidgets.QMainWindow = parent.parent()
elif isinstance(parent, QtWidgets.QMainWindow):
self.dockarea: DockArea = None
self.mainwindow: QtWidgets.QMainWindow = parent
else:
self.dockarea: DockArea = None
self.mainwindow: QtWidgets.QMainWindow = None
self.docks: Dict[str, Dock] = dict([])
self.statusbar = None
self._menubar: QtWidgets.QMenuBar = None
self.set_toolbar(QtWidgets.QToolBar()) # create self._toolbar
if self.mainwindow is not None:
self.mainwindow.addToolBar(self._toolbar)
self._menubar = self.mainwindow.menuBar()
self.statusbar = self.mainwindow.statusBar()
self.reference_toolbar('main', self._toolbar)
[docs]
def setup_ui(self):
self.setup_docks()
self.setup_actions() # see ActionManager MixIn class
try:
self.setup_menu(self._menubar)
except TypeError:
self.setup_menu() # for backcompatibility
self.connect_things()
self.do_things_after_ui_setup()
[docs]
def quit_fun(self):
"""Method to be subclassed in order to define a custom quit function
"""
self.mainwindow.close()
[docs]
def do_things_after_ui_setup(self):
"""Non mandatory method to be subclassed in order to do things after the UI setup
"""
pass
[docs]
def setup_docks(self):
"""Mandatory method to be subclassed to setup the docks layout
Examples
--------
>>>self.docks['ADock'] = gutils.Dock('ADock name')
>>>self.dockarea.addDock(self.docks['ADock'])
>>>self.docks['AnotherDock'] = gutils.Dock('AnotherDock name')
>>>self.dockarea.addDock(self.docks['AnotherDock'''], 'bottom', self.docks['ADock'])
See Also
--------
pyqtgraph.dockarea.Dock
"""
raise NotImplementedError
[docs]
def connect_things(self):
"""Connect actions and/or other widgets signal to methods"""
raise NotImplementedError