def _create_line_edit_widget( self, name: str, attribute: Attribute[Any], ) -> QWidget: widget: Union[SecretLineEditWidget, QLineEdit] if attribute.secret: widget = SecretLineEditWidget(parent=self, ) as_signal_instance(widget.text_edited).connect( partial( self._on_line_edit_changed, widget, name, attribute, ), ) else: widget = QLineEdit(self) if isinstance(attribute.default, str): widget.setPlaceholderText(attribute.default) as_signal_instance(widget.textEdited).connect( partial( self._on_line_edit_changed, widget, name, attribute, ), ) return widget
def save_as(self, ) -> None: """Engage the saving process into a new file.""" entry = self._entry save_invalid = self._prompt_save_invalid_entry(entry=entry, ) if not save_invalid: return path_format = self._prompt_new_file( format_filters=self._file_format_dialog_filters.get_filters_string( ), ) if not path_format: return file_path, file_format = path_format if entry.configuration is None: entry.configuration = RootConfiguration() saved = self._save_to_file( entry=entry, file_path=file_path, file_format=file_format, ) if not saved: return as_signal_instance(self.root_configuration_saved_as).emit( file_path, file_format, )
def _create_add_button( self, icon: Optional[QIcon], text: Optional[str], tool_tip: Optional[str], entry_args: Dict[str, Any], size: QSize, icon_size: QSize, ) -> QToolButton: widget = QToolButton(self) widget.setToolButtonStyle(Qt.ToolButtonTextUnderIcon) if text: widget.setText(text) if icon: widget.setIcon(icon) if tool_tip: widget.setToolTip(tool_tip) widget.setFixedSize(size) widget.setIconSize(icon_size) as_signal_instance(widget.clicked).connect( partial( self._on_add_button_clicked, entry_args, ), ) return widget
def _create_exit_action(self, ) -> QAction: action = QAction('E&xit', self) action.setObjectName('action_exit') action.setShortcuts(QKeySequence.Quit) action.setStatusTip('Exit the application') as_signal_instance(action.triggered).connect(self._on_exit_triggered, ) return action
def set_model( self, model: ExportableDictModel, ) -> None: """ Set the model. Args: model: an exportable dict model """ signals = { model.dataChanged, model.rowsInserted, model.rowsRemoved, } for signal in signals: as_signal_instance(signal).connect( partial( self._on_model_data_changed, model, ), ) self._table.setModel(model) selection_model = self._table.selectionModel() as_signal_instance(selection_model.selectionChanged).connect( self._on_selection_changed, )
def __init__( self, settings: QSettings, entry: RootConfigurationEntry, parent: Optional[QWidget] = None, *args: Any, **kwargs: Any, ) -> None: """ Initialize self. Args: settings: application settings entry: a root configuration entry parent: a parent widget args: extra arguments kwargs: extra keyword arguments """ super().__init__( parent, *args, **kwargs, ) self._entry = entry self._settings = settings self._file_format_dialog_filters = FileFormatDialogFilters( formats=AVAILABLE_FORMATS, ) self._init_ui() self._on_entry_changed() as_signal_instance(self._log_entry_available).connect( self._on_log_entry_available, ) self._thread_running = False
def _create_tab_widget(self, ) -> QTabWidget: widget = QTabWidget(self) widget.setTabsClosable(True) widget.setCornerWidget(self._create_buttons_widget()) as_signal_instance(widget.tabCloseRequested).connect( self._on_tab_close_requested, ) return widget
def _create_tab_widget(self, ) -> QTabWidget: widget = QTabWidget(self) widget.setTabsClosable(True) as_signal_instance(widget.currentChanged).connect( self._on_current_tab_changed, ) as_signal_instance(widget.tabCloseRequested).connect( self._on_tab_close_requested, ) return widget
def _create_about_action(self, ) -> QAction: action = QAction('&About', self) action.setObjectName('action_about') action.setIcon(QIcon(':/resources/icons/ywh2bt.png')) action.setStatusTip('Show information about this application') as_signal_instance(action.triggered).connect( self._on_about_triggered, ) return action
def _create_schema_doc_action(self, ) -> QAction: action = QAction('&Schema documentation', self) action.setObjectName('action_schema_doc') action.setIcon(self.style().standardIcon(QStyle.SP_DialogHelpButton)) action.setStatusTip('Show configuration schema documentation') as_signal_instance(action.triggered).connect( self._on_schema_doc_triggered, ) return action
def _on_model_data_changed( self, model: ExportableDictModel, top_left: QModelIndex, bottom_right: QModelIndex, roles: List[int], ) -> None: as_signal_instance(self.dataChanged).emit(model.get_value())
def _create_save_as_action(self, ) -> QAction: action = QAction('&Save as...', self) action.setObjectName('action_save_as') action.setEnabled(False) action.setStatusTip('Save the current configuration in a new file') as_signal_instance(action.triggered).connect( self._on_save_as_configuration_triggered, ) return action
def _on_current_tab_changed( self, tab_index: int, ) -> None: entry = None if tab_index >= 0: entry = self._entries[tab_index] as_signal_instance(self.current_entry_changed).emit(entry, )
def _create_open_action(self, ) -> QAction: action = QAction('&Open...', self) action.setObjectName('action_open') action.setIcon(self.style().standardIcon(QStyle.SP_DialogOpenButton)) action.setShortcuts(QKeySequence.Open) action.setStatusTip('Open a configuration file') as_signal_instance(action.triggered).connect( self._on_open_file_triggered, ) return action
def _create_edit_tab_widget(self, ) -> AttributesContainerWidget: widget = AttributesContainerWidget( parent=self, container_class=RootConfiguration, container=self._entry.configuration, ) as_signal_instance(widget.container_changed).connect( self._on_root_configuration_modified, ) return widget
def _on_root_configuration_modified( self, configuration: RootConfiguration, ) -> None: self._entry.configuration = configuration self._validate_entry() self._update_raw_widget() as_signal_instance(self.root_configuration_modified).emit( self._entry, )
def _create_sync_action(self, ) -> QAction: action = QAction('&Sync...', self) action.setObjectName('action_sync') action.setEnabled(False) action.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay)) action.setStatusTip('Synchronize the current configuration file') as_signal_instance(action.triggered).connect( self._on_sync_configuration_triggered, ) return action
def _create_add_button(self, ) -> QPushButton: widget = QPushButton( '+', self, ) widget.setFixedSize(constants.SMALL_BUTTON_SIZE) as_signal_instance(widget.clicked).connect( self._on_add_button_clicked, ) return widget
def _create_new_action(self, ) -> QAction: action = QAction('&New', self) action.setObjectName('action_new') action.setIcon(self.style().standardIcon(QStyle.SP_FileIcon)) action.setShortcuts(QKeySequence.New) action.setStatusTip('Create a new configuration file') as_signal_instance(action.triggered).connect( self._on_new_file_triggered, ) return action
def _create_raw_widget(self, ) -> QWidget: widget = QPlainTextEdit(self) font = QFontDatabase.systemFont(QFontDatabase.FixedFont) font.setFixedPitch(True) metrics = QFontMetrics(font) widget.setFont(font) widget.setTabStopDistance(2 * metrics.width(' ')) as_signal_instance(widget.textChanged).connect(self._on_raw_changed, ) return widget
def _create_value_widget(self, ) -> AttributesContainerWidget: widget = AttributesContainerWidget( parent=self, container_class=self._entry.value.__class__, container=self._entry.value, ) as_signal_instance(widget.container_changed).connect( self._on_value_changed, ) return widget
def _create_save_action(self, ) -> QAction: action = QAction('&Save...', self) action.setObjectName('action_save') action.setEnabled(False) action.setIcon(self.style().standardIcon(QStyle.SP_DialogSaveButton)) action.setShortcuts(QKeySequence.Save) action.setStatusTip('Save the current configuration file') as_signal_instance(action.triggered).connect( self._on_save_configuration_triggered, ) return action
def _create_test_action(self, ) -> QAction: action = QAction('&Test...', self) action.setObjectName('action_test') action.setEnabled(False) action.setIcon(self.style().standardIcon(QStyle.SP_DialogApplyButton)) action.setStatusTip( 'Test the connection to the trackers and to YesWeHack programs') as_signal_instance(action.triggered).connect( self._on_test_configuration_triggered, ) return action
def _create_del_button(self, ) -> QPushButton: widget = QPushButton( '-', self, ) widget.setFixedSize(constants.SMALL_BUTTON_SIZE) widget.setEnabled(False) as_signal_instance(widget.clicked).connect( self._on_del_button_clicked, ) return widget
def _on_attribute_value_changed( self, widget: QWidget, name: str, attribute: Attribute[Any], value: Any, ) -> None: if self._container is None: self._container = self._container_class() setattr(self._container, name, value) as_signal_instance(self.container_changed).emit(self._container)
def _create_close_action( self, ) -> QAction: action = QAction('&Close', self) action.setObjectName('action_close') action.setShortcuts(QKeySequence.Close) action.setStatusTip('Close') as_signal_instance(action.triggered).connect( self._on_close_triggered, ) return action
def _create_reload_action(self, ) -> QAction: action = QAction('&Reload from disk', self) action.setObjectName('action_reload') action.setEnabled(False) action.setIcon(self.style().standardIcon(QStyle.SP_BrowserReload)) action.setShortcuts(QKeySequence.Refresh) action.setStatusTip( 'Reload the current configuration file from the disk') as_signal_instance(action.triggered).connect( self._on_reload_configuration_triggered, ) return action
def _on_check_box_state_changed( self, state: int, ) -> None: states = { 0: Qt.Unchecked, 1: Qt.PartiallyChecked, 2: Qt.Checked, } self._update_label_for_state(state=states[state], ) as_signal_instance(self.stateChanged).emit(states[state])
def _on_raw_changed(self, ) -> None: raw = self._raw_widget.toPlainText() try: self._entry.raw = raw except CoreException as e: self._log( log_type=LogType.error, message=_format_error(error=e, ), ) self._on_entry_changed(update_raw=False, ) as_signal_instance(self.root_configuration_modified).emit( self._entry, )
def _on_context_menu_requested( self, position: QPoint, ) -> None: menu = QMenu(self) action_clear = menu.addAction('Clear') as_signal_instance(action_clear.triggered).connect( self._on_clear_action_triggered, ) menu.popup( self.mapToGlobal(position), )