class QKeithleyConfig(QVisaConfigure.QVisaConfigure): def __init__(self): # Inherits QVisaConfigure -> QWidget super(QKeithleyConfig, self).__init__() # Create Icon for QMessageBox self.gen_main_layout() # Main layout def gen_main_layout(self): # Create configuration layout self._layout = QVBoxLayout() # Set application icon self._icon = QIcon(os.path.join(os.path.dirname(os.path.realpath(__file__)), "python.ico")) # Insturment initialization widget self._device_widget = self._gen_device_control() self._device_widget.set_init_callback("init_keithley") self._device_widget.set_select_callback("updatedevice_pages") # QStackedWidget for insturment configurations self.device_pages = QStackedWidget() # Add comm widget and inst pages self._layout.addWidget(self._device_widget) self._layout.addStretch(1) self._layout.addWidget(self.device_pages) # Set application layout self.setLayout(self._layout) self.setFixedWidth(350) # Callback to handle addr initialization def init_keithley(self): # Initialize Keithley Device = self._device_widget.init( keithley2400.keithley2400 ) # Build configuration widget for Keithley if Device is not None: self.device_pages.addWidget( QKeithleyConfigWidget( self, Device.get_property("name") ) ) # This will update the QStackedWidget to show the correct QKeithleyWidget def update_device_pages(self): # Get current text Device = self._device_widget.get_current_inst() if Device is not None: # Loop through QStacked widget children for _page in list( self.device_pages.findChildren(QKeithleyConfigWidget) ): # If insturment name matches page name if _page.name == Device.get_property("name"): # Set widget page self.device_pages.setCurrentWidget(_page)
class SettingsWindow(QDialog): def __init__(self): super().__init__() self.setWindowTitle('nParse Settings') layout = QVBoxLayout() top_layout = QHBoxLayout() self._list_widget = QListWidget() self._list_widget.setObjectName('SettingsList') self._list_widget.setSelectionMode(QListWidget.SingleSelection) self._list_widget.currentItemChanged.connect(self._switch_stack) self._widget_stack = QStackedWidget() self._widget_stack.setObjectName('SettingsStack') top_layout.addWidget(self._list_widget, 0) top_layout.addWidget(self._widget_stack, 1) settings = self._create_settings() if settings: for setting_name, stacked_widget in settings: self._list_widget.addItem(QListWidgetItem(setting_name)) self._widget_stack.addWidget(stacked_widget) self._list_widget.setCurrentRow(0) self._list_widget.setMaximumWidth( self._list_widget.minimumSizeHint().width()) self._list_widget.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) buttons = QWidget() buttons.setObjectName('SettingsButtons') buttons_layout = QHBoxLayout() buttons_layout.setContentsMargins(0, 0, 0, 0) save_button = QPushButton('Save') save_button.setAutoDefault(False) save_button.clicked.connect(self._save) buttons_layout.addWidget(save_button) cancel_button = QPushButton('Cancel') cancel_button.setAutoDefault(False) cancel_button.clicked.connect(self._cancelled) buttons_layout.addWidget(cancel_button) buttons_layout.insertStretch(0) buttons.setLayout(buttons_layout) layout.addLayout(top_layout, 1) layout.addWidget(buttons, 0) self.setLayout(layout) self._set_values() def _save(self): for stacked_widget in self._widget_stack.findChildren(QFrame): for widget in stacked_widget.children(): wt = type(widget) if wt == QCheckBox: key1, key2 = widget.objectName().split(':') config.data[key1][key2] = widget.isChecked() elif wt == QSpinBox: key1, key2 = widget.objectName().split(':') config.data[key1][key2] = widget.value() elif wt == QLineEdit: key1, key2 = widget.objectName().split(':') config.data[key1][key2] = widget.text() config.save() self.accept() def _cancelled(self): self._set_values() self.reject() def showEvent(self, _): self._set_values() def closeEvent(self, _): self._set_values() self.reject() def _switch_stack(self): if self._list_widget.selectedIndexes(): self._widget_stack.setCurrentIndex(self._list_widget.currentRow()) def _set_values(self): for stacked_widget in self._widget_stack.findChildren(QFrame): for widget in stacked_widget.children(): wt = type(widget) if wt == QCheckBox: key1, key2 = widget.objectName().split(':') widget.setChecked(config.data[key1][key2]) elif wt == QSpinBox: key1, key2 = widget.objectName().split(':') widget.setValue(config.data[key1][key2]) elif wt == QLineEdit: key1, key2 = widget.objectName().split(':') widget.setText(config.data[key1][key2]) def _create_settings(self): stacked_widgets = [] # General Settings general_settings = QFrame() gsl = QFormLayout() gsl.setFieldGrowthPolicy(QFormLayout.AllNonFixedFieldsGrow) gsl.addRow(SettingsHeader('general')) gsl_update_check = QCheckBox() gsl_update_check.setObjectName('general:update_check') gsl.addRow('Check for Updates', gsl_update_check) gsl.addRow(SettingsHeader('parsers')) gsl_opacity = QSpinBox() gsl_opacity.setRange(1, 100) gsl_opacity.setSingleStep(5) gsl_opacity.setSuffix('%') gsl_opacity.setObjectName('general:parser_opacity') gsl.addRow('Parser Window Opacity (% 1-100)', gsl_opacity) gsl_scaling = QSpinBox() gsl_scaling.setRange(100, 300) gsl_scaling.setSingleStep(5) gsl_scaling.setSuffix('%') gsl_scaling.setObjectName('general:qt_scale_factor') gsl.addRow('Window Scaling Factor', gsl_scaling) gsl.addRow(SettingsHeader('experimental')) gsl_enable_plugins = QCheckBox() gsl_enable_plugins.setObjectName('general:enable_plugins') gsl.addRow('Enable Plugins', gsl_enable_plugins) gsl_safe_mode = QCheckBox() gsl_safe_mode.setObjectName('general:safe_mode') gsl.addRow('Safe Mode', gsl_safe_mode) general_settings.setLayout(gsl) stacked_widgets.append(('General', general_settings)) # Spell Settings spells_settings = QFrame() ssl = QFormLayout() ssl.setFieldGrowthPolicy(QFormLayout.AllNonFixedFieldsGrow) ssl.addRow(SettingsHeader('general')) ssl_casting_window = QCheckBox() ssl_casting_window.setWhatsThis(WHATS_THIS_CASTING_WINDOW) ssl_casting_window.setObjectName('spells:use_casting_window') ssl.addRow('Use Casting Window', ssl_casting_window) ssl_casting_window_buffer = QSpinBox() ssl_casting_window_buffer.setWhatsThis(WHATS_THIS_CASTING_BUFFER) ssl_casting_window_buffer.setRange(1, 4000) ssl_casting_window_buffer.setSingleStep(100) ssl_casting_window_buffer.setObjectName('spells:casting_window_buffer') ssl.addRow( 'Casting Window Buffer (msec 1-4000)', ssl_casting_window_buffer ) ssl_open_custom = QPushButton("Edit") ssl_open_custom.clicked.connect(self._get_custom_timers) row = ssl.addRow('Custom Timers', ssl_open_custom) ssl.addRow(SettingsHeader('experimental')) ssl_secondary_duration = QCheckBox() ssl_secondary_duration.setWhatsThis(WHATS_THIS_PVP_DURATION) ssl_secondary_duration.setObjectName('spells:use_secondary_all') ssl.addRow('Use PvP Durations', ssl_secondary_duration) ssl_save_spells = QCheckBox() ssl_save_spells.setObjectName('spells:save_spells') ssl.addRow('Save Spells Between Sessions', ssl_save_spells) spells_settings.setLayout(ssl) stacked_widgets.append(('Spells', spells_settings)) # caoilainn fork # log streaming push_settings = QFrame() push = QFormLayout() push.setFieldGrowthPolicy(QFormLayout.AllNonFixedFieldsGrow) push.addRow(SettingsHeader('push notifications (experimental)')) push_enable = QCheckBox() push_enable.setWhatsThis(WHATS_THIS_PUSH_NOTIFICATIONS) push_enable.setObjectName('push:push_enabled') push.addRow('Use Push Notifications', push_enable) push_timer_expiry = QCheckBox() push_timer_expiry.setObjectName('push:timer_expiry') push.addRow('Push When Timer Expires', push_timer_expiry) push_afk_only = QCheckBox() push_afk_only.setObjectName('push:afk_only') push.addRow('Triggers Only When AFK', push_afk_only) push_timer_afk_only = QCheckBox() push_timer_afk_only.setObjectName('push:timer_expiry_afk_only') push.addRow('Timers Only When AFK', push_timer_afk_only) push_afk_idle_time = QSpinBox() push_afk_idle_time.setRange(0, 600) push_afk_idle_time.setSingleStep(1) push_afk_idle_time.setSuffix('s') push_afk_idle_time.setObjectName('push:idle_time_to_afk') push.addRow('Idle time to be AFK', push_afk_idle_time) push.addWidget(QLabel("You are always afk when using /afk.\n(0 to disable idle timer)")) push_api_key = QLineEdit() push_api_key.setMaxLength(512) push_api_key.setObjectName('push:prowl_api_key') push.addRow('Prowl API Key', push_api_key) push_edit_triggers = QPushButton("Edit") push_edit_triggers.clicked.connect(self._get_push_triggers) push.addRow('Push Triggers', push_edit_triggers) push_settings.setLayout(push) stacked_widgets.append(('Push', push_settings)) # Map Settings map_settings = QFrame() msl = QFormLayout() msl.setFieldGrowthPolicy(QFormLayout.AllNonFixedFieldsGrow) msl.addRow(SettingsHeader('general')) msl_line_width = QSpinBox() msl_line_width.setObjectName('maps:line_width') msl_line_width.setRange(1, 10) msl_line_width.setSingleStep(1) msl.addRow('Map Line Width', msl_line_width) msl_grid_line_width = QSpinBox() msl_grid_line_width.setObjectName('maps:grid_line_width') msl_grid_line_width.setRange(1, 10) msl_grid_line_width.setSingleStep(1) msl.addRow('Grid Line Width', msl_grid_line_width) msl.addRow(SettingsHeader('z levels')) msl_current_z_alpha = QSpinBox() msl_current_z_alpha.setRange(1, 100) msl_current_z_alpha.setSingleStep(1) msl_current_z_alpha.setSuffix('%') msl_current_z_alpha.setObjectName('maps:current_z_alpha') msl.addRow('Current Z Opacity', msl_current_z_alpha) msl_closest_z_alpha = QSpinBox() msl_closest_z_alpha.setRange(1, 100) msl_closest_z_alpha.setSingleStep(1) msl_closest_z_alpha.setSuffix('%') msl_closest_z_alpha.setObjectName('maps:closest_z_alpha') msl.addRow('Closest Z Opacity', msl_closest_z_alpha) msl_other_z_alpha = QSpinBox() msl_other_z_alpha.setRange(1, 100) msl_other_z_alpha.setSingleStep(1) msl_other_z_alpha.setSuffix('%') msl_other_z_alpha.setObjectName('maps:other_z_alpha') msl.addRow('Other Z Opacity', msl_other_z_alpha) map_settings.setLayout(msl) stacked_widgets.append(('Maps', map_settings)) return stacked_widgets def _get_custom_timers(self): dialog = CustomTriggerSettings() dialog.exec() def _get_push_triggers(self): dialog = PushTriggerSettings() dialog.exec()