def create(name, oname): oname += '-dock' d = QDockWidget(name, self) d.setObjectName(oname) # Needed for saveState ac = d.toggleViewAction() desc = _('Toggle %s') % name.replace('&', '') self.keyboard.register_shortcut( oname, desc, description=desc, action=ac, group=_('Windows')) actions[oname] = ac setattr(self, oname.replace('-', '_'), d) return d
def setup_sidebar(self): self.sidebar = sidebar = QDockWidget() sidebar.setFixedWidth(120) self.layout = layout = QVBoxLayout() layout.addStretch() if self.data.get('vertices', None): self.add_label(name='label_vertices', text='Vertex size: {0}'.format(self.vertex_size)) self.add_slider(name='slider_vertices', value=self.vertex_size, minimum=0, maximum=100, interval=10, callback=self.vertex_callback) if self.data.get('edges', None) or self.data.get('faces', None): self.add_label(name='label_edges', text='Edge width: {0}'.format(self.edge_width)) self.add_slider(name='slider_edges', value=self.edge_width, minimum=0, maximum=100, interval=10, callback=self.edge_callback) self.add_label(name='label_opacity', text='Opacity: {0}'.format(100)) self.add_slider(name='slider_opacity', value=100, minimum=0, maximum=100, interval=10, callback=self.opacity_callback) if self.data.get('voxels', None) is not None: self.add_label(name='label_gradient', text='Gradient: {0}'.format(0)) self.add_slider(name='slider_gradient', value=0, minimum=0, maximum=100, interval=10, callback=self.gradient_callback) widget = QWidget(self.sidebar) widget.setLayout(layout) self.sidebar.setWidget(widget) self.main.addDockWidget(Qt.LeftDockWidgetArea, sidebar)
def create_dock(title, name, area, areas=Qt.DockWidgetArea.LeftDockWidgetArea | Qt.DockWidgetArea.RightDockWidgetArea): ans = QDockWidget(title, self) ans.setObjectName(name) self.addDockWidget(area, ans) ans.setVisible(False) ans.visibilityChanged.connect(self.dock_visibility_changed) return ans
def create_dock(title, name, area, areas=Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea): ans = QDockWidget(title, self) ans.setObjectName(name) self.addDockWidget(area, ans) ans.setVisible(False) return ans
def setup_sidebar(self): self.sidebar = sidebar = QDockWidget() sidebar.setFixedWidth(self.sidebar_width) self.layout = layout = QVBoxLayout() layout.addStretch() widget = QWidget(sidebar) widget.setLayout(layout) sidebar.setWidget(widget) self.main.addDockWidget(Qt.LeftDockWidgetArea, sidebar) if self.data.get('vertices', None): self.add_label(name='vertices', text='Vertex size: {0}'.format(self.vertex_size)) self.add_slider(name='vertices', value=self.vertex_size, min=0, max=100, callback=self.vertex_callback) if self.data.get('edges', None) or self.data.get('faces', None): self.add_label(name='edges', text='Edge width: {0}'.format(self.edge_width)) self.add_slider(name='edges', value=self.edge_width, min=0, max=100, callback=self.edge_callback) self.add_label(name='opacity', text='Opacity: {0}'.format(100)) self.add_slider(name='opacity', value=100, min=0, max=100, callback=self.opacity_callback) if self.data.get('voxels', None) is not None: self.add_label(name='gradient', text='Gradient: {0}'.format(0)) self.add_slider(name='gradient', value=0, min=0, max=100, callback=self.gradient_callback) else: self.add_checkbox(name='axes', text='Show axes', checked=True, callback=self.axes_callback)
def __init__(self, graph_field, side_widget, main_controller: MainController, io_controller: IOController, command_handler, *args, **kwargs): super(MainWindow, self).__init__(*args, **kwargs) self.setupUi(self) self.__command_handler = command_handler self.__graph_field = graph_field self.__main_controller = main_controller self.__io_controller = io_controller self.__file_path = "" self.setCentralWidget(graph_field) self.__conditional_actions = [] dock = QDockWidget(QCoreApplication.translate("main_window", "Operations"), self) dock.setWidget(side_widget) dock.setFeatures(dock.DockWidgetMovable | dock.DockWidgetFloatable) self.addDockWidget(Qt.RightDockWidgetArea, dock) # Observe can_undo and can_redo on command handler # to enable/disable und and redo buttons self.__command_handler.can_undo.observe( lambda old, new: self.action_undo.setDisabled(not new)) self.__command_handler.can_redo.observe( lambda old, new: self.action_redo.setDisabled(not new)) # Observe selection changes self.__graph_field.selection.observe( self.__handle_selection_change) # Connect triggers to methods self.action_redo.triggered.connect(self.__command_handler.redo) self.action_undo.triggered.connect(self.__command_handler.undo) self.action_save.triggered.connect(self.__save) self.action_save_as.triggered.connect(self.__save_as) self.action_select_all.triggered.connect(self.__select_all) self.action_open.triggered.connect(self.__open) self.action_new.triggered.connect(self.__new) self.action_exit.triggered.connect(lambda: self.close()) self.action_about.triggered.connect(self.__about) self.__conditional_actions.append(ConditionalAction( [MinNumNodesOrBranchesSelected(1)], self.action_remove_branch_or_node, self.action_remove_branch_or_node.triggered, lambda sel, *args: self.__main_controller.remove_nodes_and_branches(sel) )) # Creat inital graph self.__new()
def customize_ui(self, ui): self._view = ui ui.tool_bar.addSeparator() # to be detected later for toc population ui.annotation_toc_model = None ui.annotation_toc = None # HACK? # append a callback to the javaScriptWindowObjectCleared # signal receiver. If you don't do this, the `py_annotator` # object will be empty (has no python functions callable) # from js ui.view.document.mainFrame().javaScriptWindowObjectCleared.connect( self.add_window_objects) ui.annotation_toc_dock = d = QDockWidget(_('Annotations'), ui) ui.annotation_toc_container = w = QWidget(ui) w.l = QVBoxLayout(w) d.setObjectName('annotation-toc-dock') d.setWidget(w) # d.close() # start hidden? or leave default ui.addDockWidget(Qt.LeftDockWidgetArea, d) d.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea) name = 'action_annotate' pixmap = QPixmap() pixmap.loadFromData( self.load_resources(['images/icon.png']).itervalues().next()) icon = QIcon(pixmap) ac = ui.annotation_toc_dock.toggleViewAction() ac.setIcon(icon) setattr(ui.tool_bar, name, ac) ac.setObjectName(name) ui.tool_bar.addAction(ac)
def __init__(self, debug_javascript): MainWindow.__init__(self, None) self.setWindowTitle(_('E-book viewer')) self.base_window_title = unicode(self.windowTitle()) self.setObjectName('EbookViewer') self.setWindowIcon(QIcon(I('viewer.png'))) self.setDockOptions(self.AnimatedDocks | self.AllowTabbedDocks) self.centralwidget = c = QWidget(self) c.setObjectName('centralwidget') self.setCentralWidget(c) self.central_layout = cl = QGridLayout(c) cl.setSpacing(0) c.setLayout(cl), cl.setContentsMargins(0, 0, 0, 0) self.view = v = DocumentView(self) v.setMinimumSize(100, 100) self.view.initialize_view(debug_javascript) v.setObjectName('view') cl.addWidget(v) self.vertical_scrollbar = vs = QScrollBar(c) vs.setOrientation(Qt.Vertical), vs.setObjectName("vertical_scrollbar") cl.addWidget(vs, 0, 1, 2, 1) self.horizontal_scrollbar = hs = QScrollBar(c) hs.setOrientation(Qt.Vertical), hs.setObjectName("horizontal_scrollbar") cl.addWidget(hs, 1, 0, 1, 1) self.tool_bar = tb = QToolBar(self) tb.setObjectName('tool_bar'), tb.setIconSize(QSize(32, 32)) self.addToolBar(Qt.LeftToolBarArea, tb) self.tool_bar2 = tb2 = QToolBar(self) tb2.setObjectName('tool_bar2') self.addToolBar(Qt.TopToolBarArea, tb2) self.tool_bar.setContextMenuPolicy(Qt.PreventContextMenu) self.tool_bar2.setContextMenuPolicy(Qt.PreventContextMenu) self.pos = DoubleSpinBox() self.pos.setDecimals(1) self.pos.setSuffix('/'+_('Unknown')+' ') self.pos.setMinimum(1.) self.tool_bar2.addWidget(self.pos) self.tool_bar2.addSeparator() self.reference = Reference() self.tool_bar2.addWidget(self.reference) self.tool_bar2.addSeparator() self.search = SearchBox2(self) self.search.setMinimumContentsLength(20) self.search.initialize('viewer_search_history') self.search.setToolTip(_('Search for text in book')) self.search.setMinimumWidth(200) self.tool_bar2.addWidget(self.search) self.toc_dock = d = QDockWidget(_('Table of Contents'), self) self.toc = TOCView(self) d.setObjectName('toc-dock') d.setWidget(self.toc) d.close() # starts out hidden self.addDockWidget(Qt.LeftDockWidgetArea, d) d.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea) self.bookmarks_dock = d = QDockWidget(_('Bookmarks'), self) self.bookmarks = BookmarkManager(self) d.setObjectName('bookmarks-dock') d.setWidget(self.bookmarks) d.close() # starts out hidden self.addDockWidget(Qt.RightDockWidgetArea, d) d.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea) self.create_actions() self.metadata = Metadata(self.centralwidget) self.history = History(self.action_back, self.action_forward) self.full_screen_label = QLabel(''' <center> <h1>%s</h1> <h3>%s</h3> <h3>%s</h3> <h3>%s</h3> </center> '''%(_('Full screen mode'), _('Right click to show controls'), _('Tap in the left or right page margin to turn pages'), _('Press Esc to quit')), self.centralWidget()) self.full_screen_label.setVisible(False) self.full_screen_label.final_height = 200 self.full_screen_label.setFocusPolicy(Qt.NoFocus) self.full_screen_label.setStyleSheet(''' QLabel { text-align: center; background-color: white; color: black; border-width: 1px; border-style: solid; border-radius: 20px; } ''') self.clock_label = QLabel('99:99', self.centralWidget()) self.clock_label.setVisible(False) self.clock_label.setFocusPolicy(Qt.NoFocus) self.info_label_style = ''' QLabel { text-align: center; border-width: 1px; border-style: solid; border-radius: 8px; background-color: %s; color: %s; font-family: monospace; font-size: larger; padding: 5px; }''' self.pos_label = QLabel('2000/4000', self.centralWidget()) self.pos_label.setVisible(False) self.pos_label.setFocusPolicy(Qt.NoFocus) self.resize(653, 746) if workaround_broken_under_mouse is not None: for bar in (self.tool_bar, self.tool_bar2): for ac in bar.actions(): m = ac.menu() if m is not None: m.aboutToHide.connect(partial(workaround_broken_under_mouse, bar.widgetForAction(ac)))
class MainWindowMPDJ(QMainWindow): """Display the main window of the application where the connections and other stuff is edited by the user.""" def show(self): """Shows this window (maximized). I will work on a better solution.""" QMainWindow.showMaximized(self) def update(self): """Updates the view.""" global_properties = GlobalProperties.get_instance() mpdj_data = global_properties.mpdj_data self.tf_min_per_selection.setText( str(mpdj_data.min_units_per_node_touch)) self.tf_max_per_selection.setText( str(mpdj_data.max_units_per_node_touch)) self.tf_min_global_song_duration.setText( str(mpdj_data.global_min_song_duration)) self.tf_max_global_song_duration.setText( str(mpdj_data.global_max_song_duration)) self.cb_global_limit_overflow.setChecked( mpdj_data.limit_overspill_global) self.tf_global_node_max_overflow_minutes.setText( str(mpdj_data.global_node_max_overspill)) self.tf_global_node_max_overflow_minutes.setDisabled( not mpdj_data.limit_overspill_global) text_to_find = mpdj_data.unit_per_node_touch.gui_representation() index = self.combo_box_minutes_or_titles.findText( text_to_find, Qt.MatchFixedString) self.combo_box_minutes_or_titles.setCurrentIndex(index) # self.limit_artist_play_chk_box.setChecked( # global_properties.mpdj_data.limit_artist_in_node_touch) self.chk_box_graph_is_directed.setChecked(mpdj_data.graph_is_directed) self.setWindowTitle('MPDJ: {}'.format( global_properties.path_of_current_file)) def write_min_global_song_duration_to_mpdj(self): """Writes min global song duration to mpdj.""" global_properties = GlobalProperties.get_instance() global_properties.mpdj_data.global_min_song_duration = int( self.tf_min_global_song_duration.text()) def write_max_global_song_duration_to_mpdj(self): """Writes min global song duration to mpdj.""" global_properties = GlobalProperties.get_instance() global_properties.mpdj_data.global_max_song_duration = int( self.tf_max_global_song_duration.text()) def write_min_per_note_to_mpdj(self): """Write the selected min count per node touch to the mpdj which is currently worked on.""" global_properties = GlobalProperties.get_instance() global_properties.mpdj_data.min_units_per_node_touch = int( self.tf_min_per_selection.text()) def write_max_per_note_to_mpdj(self): """Writes the selected max count per node touch to the mpdj which is currently worked on.""" global_properties = GlobalProperties.get_instance() global_properties.mpdj_data.max_units_per_node_touch = int( self.tf_max_per_selection.text()) def write_unit_per_node_touch_to_mpdj(self): """Writes the selected unit for min and max per touch to the mpdj. This does not do anything at the moment. Has to be implemented properly""" global_properties = GlobalProperties.get_instance() selection_text = self.combo_box_minutes_or_titles.currentText() global_properties.mpdj_data.unit_per_node_touch = UnitPerNodeTouch[ selection_text.upper()] def write_limit_artists_played_to_mpdj(self): # """Write to the current mpdj if the artist are limited per node touch.""" global_properties = GlobalProperties.get_instance() state = self.limit_artist_play_chk_box.isChecked() global_properties.mpdj_data.limit_artists_in_node_touch = state def write_limit_overspill_to_mpdj(self): global_properties = GlobalProperties.get_instance() state = self.cb_global_limit_overflow.isChecked() global_properties.mpdj_data.limit_overspill_global = state def write_global_node_max_overflow_to_mpdj(self): global_properties = GlobalProperties.get_instance() global_node_max_overflow_text = self.tf_global_node_max_overflow_minutes.text( ) if global_node_max_overflow_text: new_max_overflow = int(global_node_max_overflow_text) global_properties.mpdj_data.global_node_max_overspill = new_max_overflow def write_graph_is_directed_to_mpdj(self): """Write if the graph is directed to mpd, this should be changed somehow, since this does only concern the editing of the connections.""" global_properties = GlobalProperties.get_instance() state = self.chk_box_graph_is_directed.isChecked() global_properties.mpdj_data.graph_is_directed = state def file_dialog(self, load_save_type=QFileDialog.AcceptSave): """Opens an file save dialog and returns the selected filename.""" file_save_dialog = QFileDialog(self) file_save_dialog.setFileMode(QFileDialog.AnyFile) file_save_dialog.setAcceptMode(load_save_type) file_save_dialog.setNameFilters( ["MPDJ files (*.{})".format(FILE_SUFFIX)]) file_save_dialog.selectNameFilter( "MPDJ files (*.{})".format(FILE_SUFFIX)) file_save_dialog.setDefaultSuffix((FILE_SUFFIX)) exec_value = file_save_dialog.exec() if exec_value == 0: return None file_names = file_save_dialog.selectedFiles() if len(file_names) != 1: message_box = QMessageBox() message_box.setText('Please select only one file!') message_box.setWindowTitle('Save error.') message_box.setStandardButtons(QMessageBox.Ok) message_box.setIcon(QMessageBox.Information) message_box.exec_() return None return file_names[0] def file_save_as(self): """Saves the file. opens a file_dialog which asks for the filename.""" file_name = self.file_dialog(load_save_type=QFileDialog.AcceptSave) if file_name: self.save_mpdj_data_to_file(file_name) def save_mpdj_data_to_file(self, p_file_name: str): """Saves the current mpdj data to the file by the path given in p_file_name.""" try: global_properties = GlobalProperties.get_instance() global_properties.save_mpdj_data_to_file(p_file_name) self.statusBar().showMessage('Saved to {}'.format(p_file_name), 5000) except (OSError, IOError) as exception: message_box = QMessageBox() message_box.setText('Error saving the file: {}'.format( str(exception))) message_box.setWindowTitle('Error saving the file.') message_box.setStandardButtons(QMessageBox.Ok) message_box.setIcon(QMessageBox.Warning) message_box.exec_() def file_save(self): """Saves the current mpdj data to the current file.""" global_properties = GlobalProperties.get_instance() if len(global_properties.path_of_current_file) > 0: self.save_mpdj_data_to_file(global_properties.path_of_current_file) else: self.file_save_as() def file_load(self): """Loads mpdj data from a file. Opens a file dialog which asks for the file to load.""" global_properties = GlobalProperties.get_instance() file_name = self.file_dialog(load_save_type=QFileDialog.AcceptOpen) if file_name: if global_properties.changes_happened_since_last_save: retval = show_discard_data_ok_cancel_message() if not global_properties.changes_happened_since_last_save or retval == QMessageBox.Ok: try: global_properties.load_mpdjdata_from_file(file_name) except AttributeError as err: message_box = QMessageBox() message_box.setText( 'Error reading your MPDJ-File: {}'.format(err)) message_box.setWindowTitle('Load error.') message_box.setStandardButtons(QMessageBox.Ok) message_box.setIcon(QMessageBox.Warning) message_box.exec_() def __init__(self): """Constructor""" QMainWindow.__init__(self) global_properties = GlobalProperties.get_instance() self.connection_table = ConnectionTableWidget() global_properties.add_listener(self.connection_table) self.setCentralWidget(self.connection_table) self.connection_table.update() self.menu_bar = self.menuBar() self.menu_file = self.menu_bar.addMenu('File') self.menu_file.addAction('New', file_new_clicked) self.menu_file.addAction('Open', self.file_load) self.menu_file.addSeparator() self.menu_file.addAction('Save', self.file_save) self.menu_file.addAction('Save as', self.file_save_as) self.menu_file.addSeparator() self.menu_file.addAction('Exit', sys.exit) self.menu_file = self.menu_bar.addMenu('Connections') self.make_birectional_menu = self.menu_file.addMenu( 'Make bidirectional') self.make_birectional_menu.addAction("with and", make_bidirectional_and) self.make_birectional_menu.addAction("with or", make_bidirectional_or) self.menu_selection = self.menu_bar.addMenu('Selections') self.action_add_selection = self.menu_selection.addAction( 'Add Selection') self.action_add_selection.triggered.connect( create_add_selection_window) self.action_merge_selections = self.menu_selection.addAction( 'Merge Selections') self.action_merge_selections.triggered.connect( create_merge_selectoon_window) self.setMenuBar(self.menu_bar) self.statusBar().showMessage('Welcome to mpdj!', 5000) self.mpdj_options_dock = QDockWidget("MPDJ Options Panel", self) self.mpdj_options_dock_layout = QFormLayout() self.mpdj_docked_widget = QWidget() self.tf_min_global_song_duration = QLineEdit() self.tf_min_global_song_duration.setValidator( QIntValidator(0, 2147483647)) self.mpdj_options_dock_layout.addRow('Global min song duration:', self.tf_min_global_song_duration) self.tf_min_global_song_duration.editingFinished.connect( self.write_min_global_song_duration_to_mpdj) self.tf_max_global_song_duration = QLineEdit() self.tf_max_global_song_duration.setValidator( QIntValidator(0, 2147483647)) self.mpdj_options_dock_layout.addRow('Global max song duration:', self.tf_max_global_song_duration) self.tf_max_global_song_duration.editingFinished.connect( self.write_max_global_song_duration_to_mpdj) self.tf_min_per_selection = QLineEdit() self.tf_min_per_selection.setValidator(QIntValidator(0, 2147483647)) self.mpdj_options_dock_layout.addRow('Min per Node touch:', self.tf_min_per_selection) self.tf_min_per_selection.editingFinished.connect( self.write_min_per_note_to_mpdj) self.tf_max_per_selection = QLineEdit() self.tf_max_per_selection.setValidator(QIntValidator(0, 2147483647)) self.mpdj_options_dock_layout.addRow('Max per Node touch:', self.tf_max_per_selection) self.tf_max_per_selection.editingFinished.connect( self.write_max_per_note_to_mpdj) self.combo_box_minutes_or_titles = QComboBox() self.combo_box_minutes_or_titles.addItems( [unit.gui_representation() for unit in UnitPerNodeTouch]) self.mpdj_options_dock_layout.addRow('Unit:', self.combo_box_minutes_or_titles) self.combo_box_minutes_or_titles.currentTextChanged.connect( self.write_unit_per_node_touch_to_mpdj) self.tf_global_node_max_overflow_minutes = QLineEdit() self.tf_global_node_max_overflow_minutes.setValidator( QIntValidator(0, 2147483647)) self.tf_global_node_max_overflow_minutes.editingFinished.connect( self.write_global_node_max_overflow_to_mpdj) self.cb_global_limit_overflow = QCheckBox() self.cb_global_limit_overflow.stateChanged.connect(lambda: list( map(lambda m: m(), [ lambda: self.tf_global_node_max_overflow_minutes.setDisabled( not self.cb_global_limit_overflow.isChecked()), self. write_limit_overspill_to_mpdj ]))) self.overflow_layoout = QHBoxLayout() self.overflow_layoout.addWidget(self.cb_global_limit_overflow) self.overflow_layoout.addWidget( self.tf_global_node_max_overflow_minutes) self.mpdj_options_dock_layout.addRow("Limit overflow:", self.overflow_layoout) self.mpdj_docked_widget.setLayout(self.mpdj_options_dock_layout) self.mpdj_options_dock.setWidget(self.mpdj_docked_widget) self.addDockWidget(Qt.LeftDockWidgetArea, self.mpdj_options_dock) self.chk_box_graph_is_directed = QCheckBox() self.chk_box_graph_is_directed.stateChanged.connect( self.write_graph_is_directed_to_mpdj) self.mpdj_options_dock_layout.addRow(QLabel('Graph is directed'), self.chk_box_graph_is_directed) self.opened_selection_window = None global_properties.add_listener(self) self.update()
def __init__(self): """Constructor""" QMainWindow.__init__(self) global_properties = GlobalProperties.get_instance() self.connection_table = ConnectionTableWidget() global_properties.add_listener(self.connection_table) self.setCentralWidget(self.connection_table) self.connection_table.update() self.menu_bar = self.menuBar() self.menu_file = self.menu_bar.addMenu('File') self.menu_file.addAction('New', file_new_clicked) self.menu_file.addAction('Open', self.file_load) self.menu_file.addSeparator() self.menu_file.addAction('Save', self.file_save) self.menu_file.addAction('Save as', self.file_save_as) self.menu_file.addSeparator() self.menu_file.addAction('Exit', sys.exit) self.menu_file = self.menu_bar.addMenu('Connections') self.make_birectional_menu = self.menu_file.addMenu( 'Make bidirectional') self.make_birectional_menu.addAction("with and", make_bidirectional_and) self.make_birectional_menu.addAction("with or", make_bidirectional_or) self.menu_selection = self.menu_bar.addMenu('Selections') self.action_add_selection = self.menu_selection.addAction( 'Add Selection') self.action_add_selection.triggered.connect( create_add_selection_window) self.action_merge_selections = self.menu_selection.addAction( 'Merge Selections') self.action_merge_selections.triggered.connect( create_merge_selectoon_window) self.setMenuBar(self.menu_bar) self.statusBar().showMessage('Welcome to mpdj!', 5000) self.mpdj_options_dock = QDockWidget("MPDJ Options Panel", self) self.mpdj_options_dock_layout = QFormLayout() self.mpdj_docked_widget = QWidget() self.tf_min_global_song_duration = QLineEdit() self.tf_min_global_song_duration.setValidator( QIntValidator(0, 2147483647)) self.mpdj_options_dock_layout.addRow('Global min song duration:', self.tf_min_global_song_duration) self.tf_min_global_song_duration.editingFinished.connect( self.write_min_global_song_duration_to_mpdj) self.tf_max_global_song_duration = QLineEdit() self.tf_max_global_song_duration.setValidator( QIntValidator(0, 2147483647)) self.mpdj_options_dock_layout.addRow('Global max song duration:', self.tf_max_global_song_duration) self.tf_max_global_song_duration.editingFinished.connect( self.write_max_global_song_duration_to_mpdj) self.tf_min_per_selection = QLineEdit() self.tf_min_per_selection.setValidator(QIntValidator(0, 2147483647)) self.mpdj_options_dock_layout.addRow('Min per Node touch:', self.tf_min_per_selection) self.tf_min_per_selection.editingFinished.connect( self.write_min_per_note_to_mpdj) self.tf_max_per_selection = QLineEdit() self.tf_max_per_selection.setValidator(QIntValidator(0, 2147483647)) self.mpdj_options_dock_layout.addRow('Max per Node touch:', self.tf_max_per_selection) self.tf_max_per_selection.editingFinished.connect( self.write_max_per_note_to_mpdj) self.combo_box_minutes_or_titles = QComboBox() self.combo_box_minutes_or_titles.addItems( [unit.gui_representation() for unit in UnitPerNodeTouch]) self.mpdj_options_dock_layout.addRow('Unit:', self.combo_box_minutes_or_titles) self.combo_box_minutes_or_titles.currentTextChanged.connect( self.write_unit_per_node_touch_to_mpdj) self.tf_global_node_max_overflow_minutes = QLineEdit() self.tf_global_node_max_overflow_minutes.setValidator( QIntValidator(0, 2147483647)) self.tf_global_node_max_overflow_minutes.editingFinished.connect( self.write_global_node_max_overflow_to_mpdj) self.cb_global_limit_overflow = QCheckBox() self.cb_global_limit_overflow.stateChanged.connect(lambda: list( map(lambda m: m(), [ lambda: self.tf_global_node_max_overflow_minutes.setDisabled( not self.cb_global_limit_overflow.isChecked()), self. write_limit_overspill_to_mpdj ]))) self.overflow_layoout = QHBoxLayout() self.overflow_layoout.addWidget(self.cb_global_limit_overflow) self.overflow_layoout.addWidget( self.tf_global_node_max_overflow_minutes) self.mpdj_options_dock_layout.addRow("Limit overflow:", self.overflow_layoout) self.mpdj_docked_widget.setLayout(self.mpdj_options_dock_layout) self.mpdj_options_dock.setWidget(self.mpdj_docked_widget) self.addDockWidget(Qt.LeftDockWidgetArea, self.mpdj_options_dock) self.chk_box_graph_is_directed = QCheckBox() self.chk_box_graph_is_directed.stateChanged.connect( self.write_graph_is_directed_to_mpdj) self.mpdj_options_dock_layout.addRow(QLabel('Graph is directed'), self.chk_box_graph_is_directed) self.opened_selection_window = None global_properties.add_listener(self) self.update()