def _setupUi(self): ld_clkmis = QLabel('Clock missing', alignment=Qt.AlignCenter) led_clkmis = SiriusLedAlert(self, self.dev_pref+':CLKMISS') lb_clkmis = PyDMLabel(self, self.dev_pref+':CLKMISS_COUNT') ld_pllulk = QLabel('PLL Unlocked', alignment=Qt.AlignCenter) led_pllulk = SiriusLedAlert(self, self.dev_pref+':PLL_UNLOCK') lb_pllulk = PyDMLabel(self, self.dev_pref+':PLL_UNLOCK_COUNT') ld_dcmulk = QLabel('DCM unlocked', alignment=Qt.AlignCenter) led_dcmulk = SiriusLedAlert(self, self.dev_pref+':DCM_UNLOCK') lb_dcmulk = PyDMLabel(self, self.dev_pref+':DCM_UNLOCK_COUNT') ld_avcovr = QLabel('ADC Overrange', alignment=Qt.AlignCenter) led_avcovr = SiriusLedAlert(self, self.dev_pref+':ADC_OVR') lb_avcovr = PyDMLabel(self, self.dev_pref+':ADC_OVR_COUNT') ld_outsat = QLabel('Output satured', alignment=Qt.AlignCenter) led_outsat = SiriusLedAlert(self, self.dev_pref+':SAT') lb_outsat = PyDMLabel(self, self.dev_pref+':SAT_COUNT') ld_fiderr = QLabel('Fiducial Error', alignment=Qt.AlignCenter) led_fiderr = SiriusLedAlert(self, self.dev_pref+':FID_ERR') lb_fiderr = PyDMLabel(self, self.dev_pref+':FID_ERR_COUNT') ld_intvl = QLabel('Interval [s]', alignment=Qt.AlignCenter) lb_intvl = PyDMLabel(self, self.dev_pref+':RST_COUNT') pb_intvl = SiriusPushButton( self, init_channel=self.dev_pref+':CNTRST', pressValue=1, releaseValue=0) pb_intvl.setText('Reset') pb_intvl.setToolTip('Reset Counts') pb_intvl.setIcon(qta.icon('fa5s.sync')) pb_intvl.setObjectName('conf') wid = QWidget(self) set_bbb_color(wid, self._device) lay = QGridLayout(wid) lay.setContentsMargins(0, 0, 0, 0) if self._is_resumed: lay.addWidget( QLabel('<h3>Status</h3>', self, alignment=Qt.AlignCenter), 0, 0, 1, 3) lay.addItem( QSpacerItem(1, 10, QSzPlcy.Ignored, QSzPlcy.Fixed), 1, 0) lay.addWidget( QLabel('<h4>Description</h4>', self, alignment=Qt.AlignCenter), 2, 1) lay.addWidget( QLabel('<h4>Count</h4>', self, alignment=Qt.AlignCenter), 2, 2) lay.addWidget(led_clkmis, 3, 0) lay.addWidget(ld_clkmis, 3, 1) lay.addWidget(lb_clkmis, 3, 2) lay.addWidget(led_pllulk, 4, 0) lay.addWidget(ld_pllulk, 4, 1) lay.addWidget(lb_pllulk, 4, 2) lay.addWidget(led_dcmulk, 5, 0) lay.addWidget(ld_dcmulk, 5, 1) lay.addWidget(lb_dcmulk, 5, 2) lay.addWidget(led_avcovr, 6, 0) lay.addWidget(ld_avcovr, 6, 1) lay.addWidget(lb_avcovr, 6, 2) lay.addWidget(led_outsat, 7, 0) lay.addWidget(ld_outsat, 7, 1) lay.addWidget(lb_outsat, 7, 2) lay.addWidget(led_fiderr, 8, 0) lay.addWidget(ld_fiderr, 8, 1) lay.addWidget(lb_fiderr, 8, 2) lay.addItem(QSpacerItem(1, 10, QSzPlcy.Ignored, QSzPlcy.Fixed), 8, 0) hlay = QHBoxLayout() lay.addLayout(hlay, 9, 0, 1, 3) hlay.addWidget(ld_intvl) hlay.addWidget(lb_intvl) hlay.addStretch() hlay.addWidget(pb_intvl) mainlay = QHBoxLayout(self) mainlay.setContentsMargins(0, 0, 0, 0) mainlay.addWidget(wid)
def __init__(self, parent): super().__init__() self.parent = parent #self.html = "<h1>UniqueBible.app</h1><p>This is '<b>Main View</b>'.</p>" #self.mainView = WebEngineView(self, "main") #self.mainView.setHtml(self.html, baseUrl) #self.studyView = WebEngineView(self, "study") #self.studyView.setHtml("This is '<b>Study View</b>'.", baseUrl) self.instantSplitter = QSplitter(Qt.Vertical, parent) if config.landscapeMode: self.parallelSplitter = QSplitter(Qt.Horizontal) else: self.parallelSplitter = QSplitter(Qt.Vertical) self.mainView = TabWidget(self, "main") self.parent.mainView = self.mainView for i in range(config.numberOfTab): tabView = WebEngineView(self, "main") self.mainView.addTab( tabView, "{1}{0}".format(i + 1, config.thisTranslation["tabBible"])) tabView.titleChanged.connect(self.parent.mainTextCommandChanged) tabView.loadFinished.connect(self.parent.finishMainViewLoading) self.studyView = TabWidget(self, "study") self.parent.studyView = self.studyView for i in range(config.numberOfTab): tabView = WebEngineView(self, "study") self.studyView.addTab( tabView, "{1}{0}".format(i + 1, config.thisTranslation["tabStudy"])) tabView.titleChanged.connect(self.parent.studyTextCommandChanged) tabView.loadFinished.connect(self.parent.finishStudyViewLoading) self.instantView = WebEngineView(self, "instant") self.instantView.setHtml( "<link id='theme_stylesheet' rel='stylesheet' type='text/css' href='css/{1}.css'><link id='theme_stylesheet' rel='stylesheet' type='text/css' href='css/custom.css'><p style='font-family:{0};'><u><b>Bottom Window</b></u><br>Display instant information on this window by hovering over verse numbers, tagged words or bible reference links.</p>" .format(config.font, config.theme), config.baseUrl) self.parallelSplitter.addWidget(self.mainView) self.parallelSplitter.addWidget(self.studyView) self.parallelSplitter.setHandleWidth(5) self.instantSplitter.setHandleWidth(5) self.instantSplitter.addWidget(self.parallelSplitter) self.instantSplitter.addWidget(self.instantView) # Adding signals self.instantSplitter.splitterMoved.connect(self.onInstantSplitterMoved) self.parallelSplitter.splitterMoved.connect( self.onParallelSplitterMoved) self.layout = QGridLayout() self.layout.setContentsMargins(0, 10, 0, 3) # self.layout.setHorizontalSpacing(0) # self.layout.setVerticalSpacing(2) self.layout.addWidget(self.instantSplitter) self.setLayout(self.layout)
def _setupIntlkGroup(self, intlktype): if 'General' in intlktype: pvstr = '' elif 'Sum' in intlktype: pvstr = 'MinSum' elif 'Translation' in intlktype: pvstr = 'Trans' elif 'Angulation' in intlktype: pvstr = 'Ang' wid = QGroupBox(intlktype) lay = QGridLayout(wid) lay.setAlignment(Qt.AlignTop | Qt.AlignHCenter) row = 0 ld_enblsel = QLabel('Enable: ', alignment=Qt.AlignRight | Qt.AlignBottom) lay.addWidget(ld_enblsel, row, 0) sel_enbl_wind = create_window_from_widget( BPMIntlkEnblWidget, title='BPM Orbit Interlock - ' + intlktype + ' Enable State') bt_enblsel = QPushButton(qta.icon('fa5s.tasks'), '', self) bt_enblsel.setToolTip('Open window to set BPMs enable state.') bt_enblsel.setObjectName('sel') bt_enblsel.setStyleSheet( '#sel{min-width:25px; max-width:25px; icon-size:20px;}') connect_window(bt_enblsel, sel_enbl_wind, parent=self, propty='Intlk' + pvstr + 'En-Sel', title=intlktype + ' Enable', prefix=self.prefix) lay.addWidget(bt_enblsel, row, 1) ch2vals = dict() for bpm in self.BPM_NAMES: chn = bpm.substitute(prefix=self.prefix, propty='Intlk' + pvstr + 'En-Sts') ch2vals[chn] = 1 led_enblsts = FamBPMIntlkEnblStateLed(self, ch2vals) lay.addWidget(led_enblsts, row, 2) if 'General' not in intlktype: row += 1 ld_lim = QLabel('Thresholds: ', alignment=Qt.AlignRight | Qt.AlignBottom) lay.addWidget(ld_lim, row, 0) sel_lim_wind = create_window_from_widget( BPMIntlkLimSPWidget, title='BPM Orbit Interlock - ' + intlktype + (' Threshold' if 'Thres' not in intlktype else '') + ' Setpoint') bt_lim = QPushButton(qta.icon('fa5s.tasks'), '', self) bt_lim.setToolTip('Open window to set BPMs thresholds.') bt_lim.setObjectName('sel') bt_lim.setStyleSheet( '#sel{min-width:25px; max-width:25px; icon-size:20px;}') connect_window(bt_lim, sel_lim_wind, parent=self, metric=intlktype, prefix=self.prefix) lay.addWidget(bt_lim, row, 1) if 'Sum' not in intlktype: row += 1 ld_clr = QLabel('Reset All: ', self, alignment=Qt.AlignRight | Qt.AlignBottom) lay.addWidget(ld_clr, row, 0) bt_clr = FamBPMButton(self, self.prefix, 'Intlk' + pvstr + 'Clr-Sel', '', value=1) bt_clr.setIcon(qta.icon('fa5s.sync')) bt_clr.setObjectName('clr') bt_clr.setStyleSheet( '#clr{min-width:25px; max-width:25px; icon-size:20px;}') lay.addWidget(bt_clr, row, 1) return wid
def setup_gui(self): """Setup the main layout of the widget.""" layout = QGridLayout(self) layout.setContentsMargins(0, 0, 0, 0) layout.addWidget(self.canvas, 0, 0, Qt.AlignCenter) layout.setSizeConstraint(layout.SetFixedSize)
def create_layout(self): cancel_box = QHBoxLayout() cancel_box.addWidget(self.close_button) grid1 = QGridLayout() grid2 = QGridLayout() #----------------------------------------- # setup self.radio_rectangular = QRadioButton('Rectangular') self.radio_cylindrical = QRadioButton('Cylindrical') self.radio_spherical = QRadioButton('Spherical') coord_type_layout = QHBoxLayout() coord_type_layout.addWidget(self.radio_rectangular) coord_type_layout.addWidget(self.radio_cylindrical) coord_type_layout.addWidget(self.radio_spherical) location_layout = QHBoxLayout() location_layout.addWidget(self.location_x_edit) location_layout.addWidget(self.location_y_edit) location_layout.addWidget(self.location_z_edit) checkboxs = QButtonGroup(self) checkboxs.addButton(self.checkbox_show) checkboxs.addButton(self.checkbox_hide) vbox1 = QVBoxLayout() vbox1.addWidget(self.checkbox_show) vbox1.addWidget(self.checkbox_hide) #vbox1.addLayout(checkboxs) #----------------------------------------- irow = 0 grid1.addWidget(self.all_nodes_header, irow, 0) irow += 1 grid1.addWidget(self.color, irow, 0) grid1.addWidget(self.color_edit, irow, 1) irow += 1 grid1.addWidget(self.opacity, irow, 0) grid1.addWidget(self.opacity_edit, irow, 1) irow += 1 grid1.addWidget(self.point_size, irow, 0) grid1.addWidget(self.point_size_edit, irow, 1) irow += 1 #----------------------------------------- irow = 0 grid2.addWidget(self.nodes_header, irow, 0) irow += 1 grid2.addWidget(self.name, irow, 0) grid2.addWidget(self.name_edit, irow, 1) irow += 1 grid2.addWidget(self.description, irow, 0) grid2.addWidget(self.description_edit, irow, 1) irow += 1 #| All Nodes: | #| Color red | #| PointSize 3 | #| Opacity 0.3 | #| Show/Hide | #| | #| Name LEwingTip | #| Location X Y Z | #| Coord 0 | #| CoordType R, C, S | #| | #| Previous Next | grid2.addWidget(self.coord, irow, 0) grid2.addWidget(self.coord_edit, irow, 1) irow += 1 grid2.addWidget(self.coord_type, irow, 0) grid2.addLayout(coord_type_layout, irow, 1) irow += 1 grid2.addWidget(self.location, irow, 0) grid2.addLayout(location_layout, irow, 1) irow += 1 #------------------------------------ vbox = QVBoxLayout() vbox.addLayout(grid1) vbox.addLayout(vbox1) vbox.addStretch() vbox.addWidget(self.table) vbox.addLayout(grid2) vbox.addStretch() #vbox.addWidget(self.check_apply) vbox.addLayout(cancel_box) self.setLayout(vbox)
def setup_and_check(self, data, title='', readonly=False, xlabels=None, ylabels=None): """ Setup ArrayEditor: return False if data is not supported, True otherwise """ self.data = data readonly = readonly or not self.data.flags.writeable is_record_array = data.dtype.names is not None is_masked_array = isinstance(data, np.ma.MaskedArray) if data.ndim > 3: self.error(_("Arrays with more than 3 dimensions are not " "supported")) return False if xlabels is not None and len(xlabels) != self.data.shape[1]: self.error(_("The 'xlabels' argument length do no match array " "column number")) return False if ylabels is not None and len(ylabels) != self.data.shape[0]: self.error(_("The 'ylabels' argument length do no match array row " "number")) return False if not is_record_array: dtn = data.dtype.name if dtn not in SUPPORTED_FORMATS and not dtn.startswith('str') \ and not dtn.startswith('unicode'): arr = _("%s arrays") % data.dtype.name self.error(_("%s are currently not supported") % arr) return False self.layout = QGridLayout() self.setLayout(self.layout) self.setWindowIcon(ima.icon('arredit')) if title: title = to_text_string(title) + " - " + _("NumPy array") else: title = _("Array editor") if readonly: title += ' (' + _('read only') + ')' self.setWindowTitle(title) self.resize(600, 500) # Stack widget self.stack = QStackedWidget(self) if is_record_array: for name in data.dtype.names: self.stack.addWidget(ArrayEditorWidget(self, data[name], readonly, xlabels, ylabels)) elif is_masked_array: self.stack.addWidget(ArrayEditorWidget(self, data, readonly, xlabels, ylabels)) self.stack.addWidget(ArrayEditorWidget(self, data.data, readonly, xlabels, ylabels)) self.stack.addWidget(ArrayEditorWidget(self, data.mask, readonly, xlabels, ylabels)) elif data.ndim == 3: pass else: self.stack.addWidget(ArrayEditorWidget(self, data, readonly, xlabels, ylabels)) self.arraywidget = self.stack.currentWidget() if self.arraywidget: self.arraywidget.model.dataChanged.connect( self.save_and_close_enable) self.stack.currentChanged.connect(self.current_widget_changed) self.layout.addWidget(self.stack, 1, 0) # Buttons configuration btn_layout = QHBoxLayout() if is_record_array or is_masked_array or data.ndim == 3: if is_record_array: btn_layout.addWidget(QLabel(_("Record array fields:"))) names = [] for name in data.dtype.names: field = data.dtype.fields[name] text = name if len(field) >= 3: title = field[2] if not is_text_string(title): title = repr(title) text += ' - '+title names.append(text) else: names = [_('Masked data'), _('Data'), _('Mask')] if data.ndim == 3: # QSpinBox self.index_spin = QSpinBox(self, keyboardTracking=False) self.index_spin.valueChanged.connect(self.change_active_widget) # QComboBox names = [str(i) for i in range(3)] ra_combo = QComboBox(self) ra_combo.addItems(names) ra_combo.currentIndexChanged.connect(self.current_dim_changed) # Adding the widgets to layout label = QLabel(_("Axis:")) btn_layout.addWidget(label) btn_layout.addWidget(ra_combo) self.shape_label = QLabel() btn_layout.addWidget(self.shape_label) label = QLabel(_("Index:")) btn_layout.addWidget(label) btn_layout.addWidget(self.index_spin) self.slicing_label = QLabel() btn_layout.addWidget(self.slicing_label) # set the widget to display when launched self.current_dim_changed(self.last_dim) else: ra_combo = QComboBox(self) ra_combo.currentIndexChanged.connect(self.stack.setCurrentIndex) ra_combo.addItems(names) btn_layout.addWidget(ra_combo) if is_masked_array: label = QLabel(_("<u>Warning</u>: changes are applied separately")) label.setToolTip(_("For performance reasons, changes applied "\ "to masked array won't be reflected in "\ "array's data (and vice-versa).")) btn_layout.addWidget(label) btn_layout.addStretch() if not readonly: self.btn_save_and_close = QPushButton(_('Save and Close')) self.btn_save_and_close.setDisabled(True) self.btn_save_and_close.clicked.connect(self.accept) btn_layout.addWidget(self.btn_save_and_close) self.btn_close = QPushButton(_('Close')) self.btn_close.setAutoDefault(True) self.btn_close.setDefault(True) self.btn_close.clicked.connect(self.reject) btn_layout.addWidget(self.btn_close) self.layout.addLayout(btn_layout, 2, 0) self.setMinimumSize(400, 300) # Make the dialog act as a window self.setWindowFlags(Qt.Window) return True
def setup_page(self): newcb = self.create_checkbox # -------------------- Plugin status group ----------------------------- plugin_state_group = QGroupBox(_('Plugin status')) plugin_state_layout = QVBoxLayout() self.completion_box = newcb( _("Enable code completion and linting in the editor"), 'enable') plugin_state_layout.addWidget(self.completion_box) plugin_state_group.setLayout(plugin_state_layout) self.completion_box.toggled.connect(self.enable_disable_plugin) # ------------------- Providers status group --------------------------- self.provider_checkboxes = [] providers_layout = QGridLayout() self.providers_group = QGroupBox(_("Providers")) for i, (provider_key, provider_name) in enumerate(self.providers): cb = newcb(_('Enable {0} provider').format(provider_name), ('enabled_providers', provider_key), default=True) providers_layout.addWidget(cb, i, 0) self.provider_checkboxes.append(cb) self.providers_group.setLayout(providers_layout) completions_wait_for_ms = self.create_spinbox( _("Time to wait for all providers to return (ms):"), None, 'completions_wait_for_ms', min_=0, max_=10000, step=10, tip=_("Beyond this timeout the first available provider " "will be returned")) completion_hint_box = newcb(_("Show completion details"), 'completions_hint', section='editor') automatic_completion_box = newcb(_("Show completions on the fly"), 'automatic_completions', section='editor') completions_after_characters = self.create_spinbox( _("Show automatic completions after characters entered:"), None, 'automatic_completions_after_chars', min_=1, step=1, tip=_("Default is 3"), section='editor') code_snippets_box = newcb(_("Enable code snippets"), 'enable_code_snippets') kite_cta_box = newcb( _("Notify me when Kite can provide missing completions " "(but is unavailable)"), 'kite_call_to_action') # ------------------- Completions group --------------------------- self.completions_group = QGroupBox(_('Completions')) completions_layout = QGridLayout() completions_layout.addWidget(completion_hint_box, 0, 0) completions_layout.addWidget(code_snippets_box, 1, 0) completions_layout.addWidget(automatic_completion_box, 2, 0) completions_layout.addWidget(kite_cta_box, 3, 0) completions_layout.addWidget(completions_after_characters.plabel, 4, 0) completions_layout.addWidget(completions_after_characters.spinbox, 4, 1) completions_layout.addWidget(completions_wait_for_ms.plabel, 5, 0) completions_layout.addWidget(completions_wait_for_ms.spinbox, 5, 1) completions_layout.setColumnStretch(2, 6) self.completions_group.setLayout(completions_layout) def disable_completion_after_characters(state): completions_after_characters.plabel.setEnabled(state) completions_after_characters.spinbox.setEnabled(state) automatic_completion_box.toggled.connect( disable_completion_after_characters) layout = QVBoxLayout() layout.addWidget(plugin_state_group) layout.addWidget(self.completions_group) layout.addWidget(self.providers_group) layout.addStretch(1) self.setLayout(layout)
def __init__(self, parent, text): QWidget.__init__(self, parent) self.text_editor = QTextEdit(self) self.text_editor.setText(text) self.text_editor.setReadOnly(True) # Type frame type_layout = QHBoxLayout() type_label = QLabel(_("Import as")) type_layout.addWidget(type_label) data_btn = QRadioButton(_("data")) data_btn.setChecked(True) self._as_data = True type_layout.addWidget(data_btn) code_btn = QRadioButton(_("code")) self._as_code = False type_layout.addWidget(code_btn) txt_btn = QRadioButton(_("text")) type_layout.addWidget(txt_btn) h_spacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) type_layout.addItem(h_spacer) type_frame = QFrame() type_frame.setLayout(type_layout) # Opts frame grid_layout = QGridLayout() grid_layout.setSpacing(0) col_label = QLabel(_("Column separator:")) grid_layout.addWidget(col_label, 0, 0) col_w = QWidget() col_btn_layout = QHBoxLayout() self.tab_btn = QRadioButton(_("Tab")) self.tab_btn.setChecked(False) col_btn_layout.addWidget(self.tab_btn) other_btn_col = QRadioButton(_("other")) other_btn_col.setChecked(True) col_btn_layout.addWidget(other_btn_col) col_w.setLayout(col_btn_layout) grid_layout.addWidget(col_w, 0, 1) self.line_edt = QLineEdit(",") self.line_edt.setMaximumWidth(30) self.line_edt.setEnabled(True) other_btn_col.toggled.connect(self.line_edt.setEnabled) grid_layout.addWidget(self.line_edt, 0, 2) row_label = QLabel(_("Row separator:")) grid_layout.addWidget(row_label, 1, 0) row_w = QWidget() row_btn_layout = QHBoxLayout() self.eol_btn = QRadioButton(_("EOL")) self.eol_btn.setChecked(True) row_btn_layout.addWidget(self.eol_btn) other_btn_row = QRadioButton(_("other")) row_btn_layout.addWidget(other_btn_row) row_w.setLayout(row_btn_layout) grid_layout.addWidget(row_w, 1, 1) self.line_edt_row = QLineEdit(";") self.line_edt_row.setMaximumWidth(30) self.line_edt_row.setEnabled(False) other_btn_row.toggled.connect(self.line_edt_row.setEnabled) grid_layout.addWidget(self.line_edt_row, 1, 2) grid_layout.setRowMinimumHeight(2, 15) other_group = QGroupBox(_("Additional options")) other_layout = QGridLayout() other_group.setLayout(other_layout) skiprows_label = QLabel(_("Skip rows:")) other_layout.addWidget(skiprows_label, 0, 0) self.skiprows_edt = QLineEdit('0') self.skiprows_edt.setMaximumWidth(30) intvalid = QIntValidator(0, len(to_text_string(text).splitlines()), self.skiprows_edt) self.skiprows_edt.setValidator(intvalid) other_layout.addWidget(self.skiprows_edt, 0, 1) other_layout.setColumnMinimumWidth(2, 5) comments_label = QLabel(_("Comments:")) other_layout.addWidget(comments_label, 0, 3) self.comments_edt = QLineEdit('#') self.comments_edt.setMaximumWidth(30) other_layout.addWidget(self.comments_edt, 0, 4) self.trnsp_box = QCheckBox(_("Transpose")) #self.trnsp_box.setEnabled(False) other_layout.addWidget(self.trnsp_box, 1, 0, 2, 0) grid_layout.addWidget(other_group, 3, 0, 2, 0) opts_frame = QFrame() opts_frame.setLayout(grid_layout) data_btn.toggled.connect(opts_frame.setEnabled) data_btn.toggled.connect(self.set_as_data) code_btn.toggled.connect(self.set_as_code) # self.connect(txt_btn, SIGNAL("toggled(bool)"), # self, SLOT("is_text(bool)")) # Final layout layout = QVBoxLayout() layout.addWidget(type_frame) layout.addWidget(self.text_editor) layout.addWidget(opts_frame) self.setLayout(layout)
def __init__(self, parent, data=None, readonly=False, bg_value=None, bg_gradient='blue-red', minvalue=None, maxvalue=None, digits=None): QWidget.__init__(self, parent) assert bg_gradient in gradient_map if data is not None and np.isscalar(data): readonly = True self.readonly = readonly # prepare internal views and models self.model_axes = AxesArrayModel(parent=self, readonly=readonly) self.view_axes = AxesView(parent=self, model=self.model_axes) self.model_hlabels = LabelsArrayModel(parent=self, readonly=readonly) self.view_hlabels = LabelsView(parent=self, model=self.model_hlabels, hpos=RIGHT, vpos=TOP) self.model_vlabels = LabelsArrayModel(parent=self, readonly=readonly) self.view_vlabels = LabelsView(parent=self, model=self.model_vlabels, hpos=LEFT, vpos=BOTTOM) self.model_data = DataArrayModel(parent=self, readonly=readonly, minvalue=minvalue, maxvalue=maxvalue) self.view_data = DataView(parent=self, model=self.model_data) # in case data is None self.data_adapter = None # Create vertical and horizontal scrollbars self.vscrollbar = ScrollBar(self, self.view_data.verticalScrollBar()) self.hscrollbar = ScrollBar(self, self.view_data.horizontalScrollBar()) # Synchronize resizing self.view_axes.horizontalHeader().sectionResized.connect( self.view_vlabels.updateSectionWidth) self.view_axes.verticalHeader().sectionResized.connect( self.view_hlabels.updateSectionHeight) self.view_hlabels.horizontalHeader().sectionResized.connect( self.view_data.updateSectionWidth) self.view_vlabels.verticalHeader().sectionResized.connect( self.view_data.updateSectionHeight) # Synchronize auto-resizing self.view_axes.horizontalHeader().sectionHandleDoubleClicked.connect( self.resize_axes_column_to_contents) self.view_hlabels.horizontalHeader( ).sectionHandleDoubleClicked.connect( self.resize_hlabels_column_to_contents) self.view_axes.verticalHeader().sectionHandleDoubleClicked.connect( self.resize_axes_row_to_contents) self.view_vlabels.verticalHeader().sectionHandleDoubleClicked.connect( self.resize_vlabels_row_to_contents) # synchronize specific methods self.view_axes.allSelected.connect(self.view_data.selectAll) self.view_data.signal_copy.connect(self.copy) self.view_data.signal_excel.connect(self.to_excel) self.view_data.signal_paste.connect(self.paste) self.view_data.signal_plot.connect(self.plot) # propagate changes (add new items in the QUndoStack attribute of MappingEditor) self.model_data.newChanges.connect(self.data_changed) # Synchronize scrolling # data <--> hlabels self.view_data.horizontalScrollBar().valueChanged.connect( self.view_hlabels.horizontalScrollBar().setValue) self.view_hlabels.horizontalScrollBar().valueChanged.connect( self.view_data.horizontalScrollBar().setValue) # data <--> vlabels self.view_data.verticalScrollBar().valueChanged.connect( self.view_vlabels.verticalScrollBar().setValue) self.view_vlabels.verticalScrollBar().valueChanged.connect( self.view_data.verticalScrollBar().setValue) # Synchronize selecting columns(rows) via hor.(vert.) header of x(y)labels view self.view_hlabels.horizontalHeader().sectionPressed.connect( self.view_data.selectColumn) self.view_hlabels.horizontalHeader().sectionEntered.connect( self.view_data.selectNewColumn) self.view_vlabels.verticalHeader().sectionPressed.connect( self.view_data.selectRow) self.view_vlabels.verticalHeader().sectionEntered.connect( self.view_data.selectNewRow) # following lines are required to keep usual selection color # when selecting rows/columns via headers of label views. # Otherwise, selected rows/columns appear in grey. self.view_data.setStyleSheet("""QTableView { selection-background-color: palette(highlight); selection-color: white; }""") # set external borders array_frame = QFrame(self) array_frame.setFrameStyle(QFrame.StyledPanel) # remove borders of internal tables self.view_axes.setFrameStyle(QFrame.NoFrame) self.view_hlabels.setFrameStyle(QFrame.NoFrame) self.view_vlabels.setFrameStyle(QFrame.NoFrame) self.view_data.setFrameStyle(QFrame.NoFrame) # Set layout of table views: # [ axes ][hlabels]|V| # [vlabels][ data ]|s| # | H. scrollbar | array_layout = QGridLayout() array_layout.addWidget(self.view_axes, 0, 0) array_layout.addWidget(self.view_hlabels, 0, 1) array_layout.addWidget(self.view_vlabels, 1, 0) self.view_data.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) array_layout.addWidget(self.view_data, 1, 1) array_layout.addWidget(self.vscrollbar, 0, 2, 2, 1) array_layout.addWidget(self.hscrollbar, 2, 0, 1, 2) array_layout.setSpacing(0) array_layout.setContentsMargins(0, 0, 0, 0) array_frame.setLayout(array_layout) # Set filters and buttons layout self.filters_layout = QHBoxLayout() self.btn_layout = QHBoxLayout() self.btn_layout.setAlignment(Qt.AlignLeft) label = QLabel("Digits") self.btn_layout.addWidget(label) spin = QSpinBox(self) spin.valueChanged.connect(self.digits_changed) self.digits_spinbox = spin self.btn_layout.addWidget(spin) self.digits = 0 scientific = QCheckBox(_('Scientific')) scientific.stateChanged.connect(self.scientific_changed) self.scientific_checkbox = scientific self.btn_layout.addWidget(scientific) self.use_scientific = False gradient_chooser = QComboBox() gradient_chooser.setMaximumSize(120, 20) gradient_chooser.setIconSize(QSize(100, 20)) pixmap = QPixmap(100, 15) pixmap.fill(Qt.white) gradient_chooser.addItem(QIcon(pixmap), " ") pixmap.fill(Qt.transparent) painter = QPainter(pixmap) for name, gradient in available_gradients[1:]: qgradient = gradient.as_qgradient() # * fill with white because gradient can be transparent and if we do not "start from whilte", it skews the # colors. # * 1 and 13 instead of 0 and 15 to have a transparent border around/between the gradients painter.fillRect(0, 1, 100, 13, Qt.white) painter.fillRect(0, 1, 100, 13, qgradient) gradient_chooser.addItem(QIcon(pixmap), name, gradient) # without this, we can crash python :) del painter, pixmap # select default gradient # requires Qt5+ # gradient_chooser.setCurrentText(bg_gradient) gradient_chooser.setCurrentIndex( gradient_chooser.findText(bg_gradient)) gradient_chooser.currentIndexChanged.connect(self.gradient_changed) self.btn_layout.addWidget(gradient_chooser) self.gradient_chooser = gradient_chooser # Set widget layout layout = QVBoxLayout() layout.addLayout(self.filters_layout) layout.addWidget(array_frame) layout.addLayout(self.btn_layout) layout.setContentsMargins(0, 0, 0, 0) self.setLayout(layout) # set gradient self.model_data.set_bg_gradient(gradient_map[bg_gradient]) # set data if data is not None: self.set_data(data, bg_value=bg_value, digits=digits) # See http://doc.qt.io/qt-4.8/qt-draganddrop-fridgemagnets-dragwidget-cpp.html for an example self.setAcceptDrops(True)
def __init__(self, parent, t_range, f_range): super().__init__(parent) self.setWindowTitle("ERDS maps") vbox = QVBoxLayout(self) grid = QGridLayout() grid.addWidget(QLabel("Frequency range:"), 0, 0) self._f1 = QDoubleSpinBox() self._f1.setRange(*f_range) self._f1.setValue(f_range[0]) self._f1.setDecimals(1) self._f1.setSuffix(" Hz") grid.addWidget(self._f1, 0, 1) self._f2 = QDoubleSpinBox() self._f2.setRange(*f_range) self._f2.setValue(f_range[1]) self._f2.setDecimals(1) self._f2.setSuffix(" Hz") grid.addWidget(self._f2, 0, 2) grid.addWidget(QLabel("Step size:"), 1, 0) self._step = QDoubleSpinBox() self._step.setRange(0.1, 5) self._step.setValue(1) self._step.setDecimals(1) self._step.setSingleStep(0.1) self._step.setSuffix(" Hz") grid.addWidget(self._step, 1, 1) grid.addWidget(QLabel("Time range:"), 2, 0) self._t1 = QDoubleSpinBox() self._t1.setRange(*t_range) self._t1.setValue(t_range[0]) self._t1.setDecimals(1) self._step.setSingleStep(0.1) self._t1.setSuffix(" s") grid.addWidget(self._t1, 2, 1) self._t2 = QDoubleSpinBox() self._t2.setRange(*t_range) self._t2.setValue(t_range[1]) self._t2.setDecimals(1) self._step.setSingleStep(0.1) self._t2.setSuffix(" s") grid.addWidget(self._t2, 2, 2) grid.addWidget(QLabel("Baseline:"), 3, 0) self._b1 = QDoubleSpinBox() self._b1.setRange(*t_range) self._b1.setValue(t_range[0]) self._b1.setDecimals(1) self._step.setSingleStep(0.1) self._b1.setSuffix(" s") grid.addWidget(self._b1, 3, 1) self._b2 = QDoubleSpinBox() self._b2.setRange(*t_range) self._b2.setValue(0) self._b2.setDecimals(1) self._step.setSingleStep(0.1) self._b2.setSuffix(" s") grid.addWidget(self._b2, 3, 2) vbox.addLayout(grid) buttonbox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) vbox.addWidget(buttonbox) buttonbox.accepted.connect(self.accept) buttonbox.rejected.connect(self.reject) vbox.setSizeConstraint(QVBoxLayout.SetFixedSize)
def add_track_panel(self, layout): self.track_panel = QGroupBox("Track tracing") track_layout = QGridLayout() add_button( "Add track", track_layout, self.add_track, 5, 0, ) add_button( "Trace tracks", track_layout, self.run_track_analysis, 5, 1, ) self.summarise_track_checkbox = add_checkbox( track_layout, self.summarise_track_default, "Summarise", 0, ) self.add_surface_point_checkbox = add_checkbox( track_layout, self.add_surface_point_default, "Add surface point", 1, ) self.fit_degree = add_int_box( track_layout, self.fit_degree_default, 1, 5, "Fit degree", 2, ) self.spline_smoothing = add_float_box( track_layout, self.spline_smoothing_default, 0, 1, "Spline smoothing", 0.1, 3, ) self.spline_points = add_int_box( track_layout, self.spline_points_default, 1, 10000, "Spline points", 4, ) track_layout.setColumnMinimumWidth(1, 150) self.track_panel.setLayout(track_layout) layout.addWidget(self.track_panel, 3, 0, 1, 2) layout.setAlignment(QtCore.Qt.AlignTop) layout.setSpacing(4) self.track_panel.setVisible(False)
def create_layout(self): grid = QGridLayout() self.method_label = QLabel('Method:') self.location_method_label = QLabel('Method:') self.location_label = QLabel('Location:') self.zaxis_method_label = QLabel('Z-Axis Method:') self.method_projected_label1 = QLabel('Exact') self.method_projected_label2 = QLabel('Projected') self.method_projected_label3 = QLabel('Exact') self.cid_label = QLabel('Coordinate System:') self.x_label = QLabel('X') self.y_label = QLabel('Y') self.z_label = QLabel('Z') self.location_label.setAlignment(Qt.AlignCenter) self.cid_label.setAlignment(Qt.AlignCenter) self.method_label.setAlignment(Qt.AlignCenter) self.location_method_label.setAlignment(Qt.AlignCenter) self.method_projected_label1.setAlignment(Qt.AlignCenter) self.method_projected_label2.setAlignment(Qt.AlignCenter) self.method_projected_label3.setAlignment(Qt.AlignCenter) self.x_label.setAlignment(Qt.AlignCenter) self.y_label.setAlignment(Qt.AlignCenter) self.z_label.setAlignment(Qt.AlignCenter) irow = 0 grid.addWidget(self.method_label, irow, 0) grid.addWidget(self.method_pulldown, irow, 1) irow += 1 self._add_grid_layout(grid, irow, is_cord2r=True) #---------------------------------------------- grid2 = QGridLayout() irow = 0 grid2.addWidget(self.method_label, irow, 0) grid2.addWidget(self.method_pulldown, irow, 1) irow += 1 self._add_grid_layout(grid2, irow, is_cord2r=False) #---------------------------------------------- #grid_smt.addWidget(self.p1_smt_label, irow, 0) #irow += 1 #grid_smt.addWidget(self.p2_smt_label, irow, 0) #irow += 1 self.export_checkbox = QCheckBox() self.csv_label = QLabel('CSV Filename:') self.csv_edit = QLineEdit() self.csv_button = QPushButton('Browse...') self.export_checkbox.clicked.connect(self.on_export_checkbox) self.csv_button.clicked.connect(self.on_browse_csv) self.csv_label.setEnabled(False) self.csv_edit.setEnabled(False) self.csv_button.setEnabled(False) hbox_csv = QHBoxLayout() hbox_csv.addWidget(self.export_checkbox) hbox_csv.addWidget(self.csv_label) hbox_csv.addWidget(self.csv_edit) hbox_csv.addWidget(self.csv_button) #---------------------------------------------- add_remove_box = QHBoxLayout() add_remove_box.addWidget(self.add_button) add_remove_box.addWidget(self.remove_button) ok_cancel_box = QHBoxLayout() ok_cancel_box.addWidget(self.apply_button) ok_cancel_box.addWidget(self.cancel_button) vbox = QVBoxLayout() #if 0: #button_frame = QFrame() ##button_frame.setFrameStyle(QFrame.Plain | QFrame.Box) #button_frame.setFrameStyle(QFrame.Box) #button_frame.setLayout(grid) #else: #button_frame = QGroupBox() #button_frame.setLayout(grid) #vbox.addWidget(button_frame) vbox.addLayout(grid) #vbox.addStretch() vbox.addLayout(hbox_csv) vbox.addStretch() #----------------------- vbox.addLayout(add_remove_box) vbox.addLayout(ok_cancel_box) self.on_method(0) self.on_zaxis_method(0) self.setLayout(vbox)
def create_layout(self): cancel_box = QHBoxLayout() cancel_box.addWidget(self.close_button) grid1 = QGridLayout() grid2 = QGridLayout() #----------------------------------------- # setup self.radio_rectangular = QRadioButton('Rectangular') self.radio_cylindrical = QRadioButton('Cylindrical') self.radio_spherical = QRadioButton('Spherical') coord_type_layout = QHBoxLayout() coord_type_layout.addWidget(self.radio_rectangular) coord_type_layout.addWidget(self.radio_cylindrical) coord_type_layout.addWidget(self.radio_spherical) checkboxs = QButtonGroup(self) checkboxs.addButton(self.checkbox_region_all) checkboxs.addButton(self.checkbox_region_ids) vbox1 = QVBoxLayout() vbox1.addWidget(self.checkbox_region_all) vbox1.addWidget(self.checkbox_region_ids) #vbox1.addLayout(checkboxs) #----------------------------------------- irow = 0 grid2.addWidget(self.name, irow, 0) grid2.addWidget(self.name_edit, irow, 1) irow += 1 #grid2.addWidget(self.name, irow, 0) grid2.addWidget(self.description_edit, irow, 1) irow += 1 grid2.addWidget(self.location_x, irow, 0) grid2.addWidget(self.location_x_edit, irow, 1) irow += 1 grid2.addWidget(self.location_y, irow, 0) grid2.addWidget(self.location_y_edit, irow, 1) irow += 1 grid2.addWidget(self.location_z, irow, 0) grid2.addWidget(self.location_z_edit, irow, 1) irow += 1 #| Name EngineInlet | #| RegionMode * RegionID | #| * All | #| | #| AllowedRegions: | #| Region ID 3 | #| | #| PickMode * All | #| Pick Mode x On/Off | #| Pick Angle 20 deg | #| | #| Revert | #| RenumberRegions | #| Close | grid2.addWidget(self.region_id, irow, 0) grid2.addWidget(self.region_id_edit, irow, 1) irow += 1 #grid2.addWidget(self.pick_mode, irow, 0) grid2.addWidget(self.checkbox_pick_mode, irow, 0) irow += 1 grid2.addWidget(self.pick_angle, irow, 0) grid2.addWidget(self.pick_angle_edit, irow, 1) irow += 1 #grid2.addWidget(self.pi, irow, 0) #grid2.addLayout(coord_type_layout, irow, 1) #irow += 1 #grid2.addWidget(self.location, irow, 0) #grid2.addLayout(location_layout, irow, 1) #irow += 1 #------------------------------------ vbox = QVBoxLayout() vbox.addLayout(grid1) #vbox.addLayout(vbox1) #vbox.addStretch() vbox.addWidget(self.table) vbox.addLayout(grid2) vbox.addStretch() #vbox.addWidget(self.check_apply) vbox.addLayout(cancel_box) self.setLayout(vbox)
def setup_page(self): self.ICON = ima.icon('genprefs') newcb = self.create_checkbox # --- Interface general_group = QGroupBox(_("General")) languages = LANGUAGE_CODES.items() language_choices = sorted([(val, key) for key, val in languages]) language_combo = self.create_combobox(_('Language:'), language_choices, 'interface_language', restart=True) opengl_options = ['Automatic', 'Desktop', 'Software', 'GLES'] opengl_choices = list( zip(opengl_options, [c.lower() for c in opengl_options])) opengl_combo = self.create_combobox(_('Rendering engine:'), opengl_choices, 'opengl', restart=True) single_instance_box = newcb(_("Use a single instance"), 'single_instance', tip=_("Set this to open external<br> " "Python files in an already running " "instance (Requires a restart)")) prompt_box = newcb(_("Prompt when exiting"), 'prompt_on_exit') popup_console_box = newcb( _("Show internal Spyder errors to report " "them to Github"), 'show_internal_errors') check_updates = newcb(_("Check for updates on startup"), 'check_updates_on_startup') # Decide if it's possible to activate or not single instance mode if running_in_mac_app(): self.set_option("single_instance", True) single_instance_box.setEnabled(False) comboboxes_advanced_layout = QHBoxLayout() cbs_adv_grid = QGridLayout() cbs_adv_grid.addWidget(language_combo.label, 0, 0) cbs_adv_grid.addWidget(language_combo.combobox, 0, 1) cbs_adv_grid.addWidget(opengl_combo.label, 1, 0) cbs_adv_grid.addWidget(opengl_combo.combobox, 1, 1) comboboxes_advanced_layout.addLayout(cbs_adv_grid) comboboxes_advanced_layout.addStretch(1) general_layout = QVBoxLayout() general_layout.addLayout(comboboxes_advanced_layout) general_layout.addWidget(single_instance_box) general_layout.addWidget(prompt_box) general_layout.addWidget(popup_console_box) general_layout.addWidget(check_updates) general_group.setLayout(general_layout) # --- Theme interface_group = QGroupBox(_("Interface")) vertdock_box = newcb(_("Vertical title bars in panes"), 'vertical_dockwidget_titlebars') verttabs_box = newcb(_("Vertical tabs in panes"), 'vertical_tabs') animated_box = newcb(_("Animated toolbars and panes"), 'animated_docks') tear_off_box = newcb(_("Tear off menus"), 'tear_off_menus', tip=_("Set this to detach any<br> " "menu from the main window")) margin_box = newcb(_("Custom margin for panes:"), 'use_custom_margin') margin_spin = self.create_spinbox("", _("pixels"), 'custom_margin', 0, 0, 30) margin_box.toggled.connect(margin_spin.spinbox.setEnabled) margin_box.toggled.connect(margin_spin.slabel.setEnabled) margin_spin.spinbox.setEnabled(self.get_option('use_custom_margin')) margin_spin.slabel.setEnabled(self.get_option('use_custom_margin')) cursor_box = newcb(_("Cursor blinking:"), 'use_custom_cursor_blinking') cursor_spin = self.create_spinbox( "", _("ms"), 'custom_cursor_blinking', default=QApplication.cursorFlashTime(), min_=0, max_=5000, step=100) cursor_box.toggled.connect(cursor_spin.spinbox.setEnabled) cursor_box.toggled.connect(cursor_spin.slabel.setEnabled) cursor_spin.spinbox.setEnabled( self.get_option('use_custom_cursor_blinking')) cursor_spin.slabel.setEnabled( self.get_option('use_custom_cursor_blinking')) margins_cursor_layout = QGridLayout() margins_cursor_layout.addWidget(margin_box, 0, 0) margins_cursor_layout.addWidget(margin_spin.spinbox, 0, 1) margins_cursor_layout.addWidget(margin_spin.slabel, 0, 2) margins_cursor_layout.addWidget(cursor_box, 1, 0) margins_cursor_layout.addWidget(cursor_spin.spinbox, 1, 1) margins_cursor_layout.addWidget(cursor_spin.slabel, 1, 2) margins_cursor_layout.setColumnStretch(2, 100) # Layout interface interface_layout = QVBoxLayout() interface_layout.addWidget(vertdock_box) interface_layout.addWidget(verttabs_box) interface_layout.addWidget(animated_box) interface_layout.addWidget(tear_off_box) interface_layout.addLayout(margins_cursor_layout) interface_group.setLayout(interface_layout) # --- Status bar sbar_group = QGroupBox(_("Status bar")) show_status_bar = newcb(_("Show status bar"), 'show_status_bar') memory_box = newcb(_("Show memory usage every"), 'memory_usage/enable', tip=self.main.mem_status.toolTip()) memory_spin = self.create_spinbox("", _(" ms"), 'memory_usage/timeout', min_=100, max_=1000000, step=100) memory_box.toggled.connect(memory_spin.setEnabled) memory_spin.setEnabled(self.get_option('memory_usage/enable')) memory_box.setEnabled(self.main.mem_status.is_supported()) memory_spin.setEnabled(self.main.mem_status.is_supported()) cpu_box = newcb(_("Show CPU usage every"), 'cpu_usage/enable', tip=self.main.cpu_status.toolTip()) cpu_spin = self.create_spinbox("", _(" ms"), 'cpu_usage/timeout', min_=100, max_=1000000, step=100) cpu_box.toggled.connect(cpu_spin.setEnabled) cpu_spin.setEnabled(self.get_option('cpu_usage/enable')) cpu_box.setEnabled(self.main.cpu_status.is_supported()) cpu_spin.setEnabled(self.main.cpu_status.is_supported()) status_bar_o = self.get_option('show_status_bar') show_status_bar.toggled.connect(memory_box.setEnabled) show_status_bar.toggled.connect(memory_spin.setEnabled) show_status_bar.toggled.connect(cpu_box.setEnabled) show_status_bar.toggled.connect(cpu_spin.setEnabled) memory_box.setEnabled(status_bar_o) memory_spin.setEnabled(status_bar_o) cpu_box.setEnabled(status_bar_o) cpu_spin.setEnabled(status_bar_o) # Layout status bar cpu_memory_layout = QGridLayout() cpu_memory_layout.addWidget(memory_box, 0, 0) cpu_memory_layout.addWidget(memory_spin, 0, 1) cpu_memory_layout.addWidget(cpu_box, 1, 0) cpu_memory_layout.addWidget(cpu_spin, 1, 1) sbar_layout = QVBoxLayout() sbar_layout.addWidget(show_status_bar) sbar_layout.addLayout(cpu_memory_layout) sbar_group.setLayout(sbar_layout) # --- Screen resolution Group (hidpi) screen_resolution_group = QGroupBox(_("Screen resolution")) screen_resolution_bg = QButtonGroup(screen_resolution_group) screen_resolution_label = QLabel( _("Configuration for high DPI " "screens<br><br>" "Please see " "<a href=\"{0}\">{0}</a><> " "for more information about " "these options (in " "English).").format(HDPI_QT_PAGE)) screen_resolution_label.setWordWrap(True) normal_radio = self.create_radiobutton( _("Normal"), 'normal_screen_resolution', button_group=screen_resolution_bg) auto_scale_radio = self.create_radiobutton( _("Enable auto high DPI scaling"), 'high_dpi_scaling', button_group=screen_resolution_bg, tip=_("Set this for high DPI displays"), restart=True) custom_scaling_radio = self.create_radiobutton( _("Set a custom high DPI scaling"), 'high_dpi_custom_scale_factor', button_group=screen_resolution_bg, tip=_("Set this for high DPI displays when " "auto scaling does not work"), restart=True) custom_scaling_edit = self.create_lineedit( "", 'high_dpi_custom_scale_factors', tip=_("Enter values for different screens " "separated by semicolons ';', " "float values are supported"), alignment=Qt.Horizontal, regex=r"[0-9]+(?:\.[0-9]*)(;[0-9]+(?:\.[0-9]*))*", restart=True) normal_radio.toggled.connect(custom_scaling_edit.setDisabled) auto_scale_radio.toggled.connect(custom_scaling_edit.setDisabled) custom_scaling_radio.toggled.connect(custom_scaling_edit.setEnabled) # Layout Screen resolution screen_resolution_layout = QVBoxLayout() screen_resolution_layout.addWidget(screen_resolution_label) screen_resolution_inner_layout = QGridLayout() screen_resolution_inner_layout.addWidget(normal_radio, 0, 0) screen_resolution_inner_layout.addWidget(auto_scale_radio, 1, 0) screen_resolution_inner_layout.addWidget(custom_scaling_radio, 2, 0) screen_resolution_inner_layout.addWidget(custom_scaling_edit, 2, 1) screen_resolution_layout.addLayout(screen_resolution_inner_layout) screen_resolution_group.setLayout(screen_resolution_layout) tabs = QTabWidget() tabs.addTab(self.create_tab(screen_resolution_group, interface_group), _("Interface")) tabs.addTab(self.create_tab(general_group, sbar_group), _("Advanced Settings")) vlayout = QVBoxLayout() vlayout.addWidget(tabs) self.setLayout(vlayout)
def _setupRawReadings(self): self.label_waveread = QLabel('<h3>Current Raw Readings</h3>', self, alignment=Qt.AlignCenter) self.wavegraph = PyDMWaveformPlot(self) self.wavegraph.setLabels(left='Current [mA]', bottom='Index') channel = 'FAKE:Readings' self.rawreadings_channel = SignalChannel( self.dcct_prefix.substitute(propty='RawReadings-Mon')) self.rawreadings_channel.new_value_signal[np.ndarray].connect( self._updateRawBuffer) self.wavegraph.addChannel(y_channel=channel, name='Current Raw Readings', color='blue', lineWidth=2, lineStyle=Qt.SolidLine) self.wavegraph.autoRangeX = True self.wavegraph.autoRangeY = True self.wavegraph.backgroundColor = QColor(255, 255, 255) self.wavegraph.showLegend = False self.wavegraph.showXGrid = True self.wavegraph.showYGrid = True self.wavegraph.plotItem.showButtons() self.wavecurve = self.wavegraph.curveAtIndex(0) wid = QWidget() lay = QGridLayout(wid) lay.setAlignment(Qt.AlignTop) lay.setRowStretch(0, 1) lay.setRowStretch(1, 9) lay.addWidget(self.label_waveread, 0, 0) lay.addWidget(self.wavegraph, 1, 0) # Smoothing evgname = SiriusPVName(_LLTimeSearch.get_evg_name()) self._evnt_dly = SignalChannel( evgname.substitute(prefix=self.prefix, propty='Dig' + self.device.sec + 'Delay-RB')) self._evnt_dly.new_value_signal[float].connect(self.updateRawXAxis) self._trig_dly = SignalChannel( self.dcct_prefix.substitute(dis='TI', propty='Delay-RB')) self._trig_dly.new_value_signal[float].connect(self.updateRawXAxis) self._smpl_cnt = SignalChannel( self.dcct_prefix.substitute(propty='FastSampleCnt-RB')) self._smpl_cnt.new_value_signal[float].connect(self.updateRawXAxis) self._meas_per = SignalChannel( self.dcct_prefix.substitute(propty='FastMeasPeriod-RB')) self._meas_per.new_value_signal[float].connect(self.updateRawXAxis) self.cb_timeaxis = QCheckBox('Use time axis', self) self.cb_timeaxis.setChecked(True) self.cb_timeaxis.stateChanged.connect(self.updateRawXAxis) self.cb_timeaxis.setLayoutDirection(Qt.RightToLeft) lay.addWidget(self.cb_timeaxis, 2, 0, alignment=Qt.AlignLeft) lay.setRowStretch(2, 1) l_smoothmethod = QLabel('Method: ', self) self.cb_smoothmethod = QComboBox(self) self.cb_smoothmethod.addItems(['Average', 'Median']) self.cb_smoothmethod.currentTextChanged.connect( self.setRawSmoothMethod) l_smoothnracq = QLabel('Nr.Acqs.: ', self) self.sb_smoothnracq = QSpinBoxPlus(self) self.sb_smoothnracq.setValue(1) self.sb_smoothnracq.valueChanged.connect(self.setRawSmoothNrAcq) l_smoothbuff = QLabel('Buffer Size: ', self) l_smoothbuff.setSizePolicy(QSzPly.Minimum, QSzPly.Preferred) self.label_buffsize = QLabel('', self) self.label_buffsize.setStyleSheet('min-width:3em; max-width:3em;') self.pb_resetbuff = QPushButton(qta.icon('mdi.delete-empty'), '', self) self.pb_resetbuff.setToolTip('Reset buffer') self.pb_resetbuff.setObjectName('resetbuff') self.pb_resetbuff.setStyleSheet( "#resetbuff{min-width:25px; max-width:25px; icon-size:20px;}") self.pb_resetbuff.clicked.connect(self.resetRawBuffer) hlay_buff = QHBoxLayout() hlay_buff.addWidget(self.label_buffsize) hlay_buff.addWidget(self.pb_resetbuff) l_down = QLabel('Downsampling: ', self) self.sb_down = QSpinBoxPlus(self) self.sb_down.setValue(1) self.sb_down.valueChanged.connect(self.setRawDownsampling) gbox_smooth = QGroupBox('Smoothing of Readings') glay_smooth = QGridLayout(gbox_smooth) glay_smooth.addWidget(l_smoothmethod, 0, 0) glay_smooth.addWidget(self.cb_smoothmethod, 0, 1) glay_smooth.addWidget(l_smoothnracq, 1, 0) glay_smooth.addWidget(self.sb_smoothnracq, 1, 1) glay_smooth.addWidget(QLabel(''), 0, 2) glay_smooth.addWidget(l_smoothbuff, 0, 3) glay_smooth.addLayout(hlay_buff, 0, 4, 1, 2) glay_smooth.addWidget(l_down, 1, 3) glay_smooth.addWidget(self.sb_down, 1, 4, 1, 2) glay_smooth.setColumnStretch(0, 10) glay_smooth.setColumnStretch(1, 10) glay_smooth.setColumnStretch(2, 2) glay_smooth.setColumnStretch(3, 10) glay_smooth.setColumnStretch(4, 5) glay_smooth.setColumnStretch(5, 5) lay.addWidget(gbox_smooth, 3, 0) lay.setRowStretch(3, 3) gbox_smooth.setStyleSheet(""" .QLabel{ qproperty-alignment: 'AlignVCenter | AlignRight';} QPushButton{ min-width:3em; max-width:3em;}""") return wid
def _setupMainBarWidget(self): # Shift machshift_pvname = SiriusPVName( 'AS-Glob:AP-MachShift:Mode-Sel').substitute(prefix=self._prefix) self._cb_shift = SiriusEnumComboBox(self, machshift_pvname) self._lb_shift = MachShiftLabel(self, prefix=self._prefix) self._lb_shift.setStyleSheet( 'QLabel{max-height: 2em; min-width: 7em;}') self.wid_shift = QGroupBox('Mach.Shift', self) lay_shift = QVBoxLayout(self.wid_shift) lay_shift.addWidget(self._cb_shift) lay_shift.addWidget(self._lb_shift) # Injection System self.wid_is_summ = InjSysStbyControlWidget(self, is_summary=True) self.wid_injsys = QGroupBox('Inj.System', self) lay_injsys = QGridLayout(self.wid_injsys) lay_injsys.setContentsMargins(0, 0, 0, 0) lay_injsys.addWidget(self.wid_is_summ, 0, 0) # self.wid_is_full = InjSysStbyControlWidget(self, is_summary=False) # self.wid_is_full.setVisible(False) # lay_injsys.addWidget(self.wid_is_full, 0, 0) # self._icon_expd = qta.icon('fa5s.plus') # self._icon_comp = qta.icon('fa5s.minus') # self.bt_is_tgl = QPushButton(self._icon_expd, '', self) # self.bt_is_tgl.clicked.connect(self._handle_injsys_details_vis) # self.bt_is_tgl.setObjectName('bt') # self.bt_is_tgl.setStyleSheet(""" # #bt{ # min-width: 0.8em; max-width: 0.8em; # min-height: 0.8em; max-height: 0.8em; # icon-size:12px;} # """) # lay_injsys.addWidget( # self.bt_is_tgl, 0, 1, alignment=Qt.AlignRight | Qt.AlignBottom) # EGun egun_dev = SiriusPVName('LI-01:EG-TriggerPS').substitute( prefix=self._prefix) self._sb_eguntrg = PyDMStateButton( self, egun_dev.substitute(propty_name='enable')) self._led_eguntrg = SiriusLedState( self, egun_dev.substitute(propty_name='enablereal')) self._led_eguntrg.setStyleSheet( 'QLed{min-width: 1.29em; max-width: 1.29em;}') self.wid_egun = self._create_groupwidget('EGun Trig.', [ self._sb_eguntrg, ], [ self._led_eguntrg, ]) # Injection self._pb_tiinj = EVGInjectionButton(self, self._prefix) self._pb_topup = PyDMStateButton( self, init_channel=self._inj_prefix.substitute(propty='TopUpState-Sel')) self._pb_topup.setVisible(False) self._led_injti = EVGInjectionLed(self, self._prefix) self._lb_injcnt = PyDMLabel(self) self._lb_injcnt.setToolTip( 'Count injection pulses when Egun Trigger is enabled.') ch_injcnt = SiriusPVName( 'AS-Glob:AP-CurrInfo:InjCount-Mon').substitute(prefix=self._prefix) self._lb_injcnt.channel = ch_injcnt self._lb_injcnt.setStyleSheet('QLabel{max-width: 3.5em;}') hbox_injsts = QHBoxLayout() hbox_injsts.setContentsMargins(0, 0, 0, 0) hbox_injsts.addWidget(self._led_injti) hbox_injsts.addWidget(self._lb_injcnt) self.wid_inj = QGroupBox('Injection', self) lay_inj = QGridLayout(self.wid_inj) lay_inj.setAlignment(Qt.AlignCenter) lay_inj.addWidget(self._pb_tiinj, 0, 0) lay_inj.addWidget(self._pb_topup, 0, 0) lay_inj.addLayout(hbox_injsts, 1, 0) # Current curr_pvname = SiriusPVName( 'SI-Glob:AP-CurrInfo:Current-Mon').substitute(prefix=self._prefix) self._lb_curr = PyDMLabel(self, curr_pvname) self._lb_curr.showUnits = True self._lb_curr.setStyleSheet(""" QLabel{ font-size: 18pt; qproperty-alignment: AlignCenter; min-width: 5.5em; max-width: 5.5em; }""") self.wid_curr = QGroupBox('Current', self) lay_curr = QHBoxLayout(self.wid_curr) lay_curr.addWidget(self._lb_curr) # TopUp status self._lb_tusts = PyDMLabel( self, self._inj_prefix.substitute(propty='TopUpState-Sts')) self._lb_tusts.setAlignment(Qt.AlignCenter) self._lb_tusts.setStyleSheet('QLabel{max-height:2em;}') self._ld_tunow = QLabel('Now:', self, alignment=Qt.AlignRight | Qt.AlignVCenter) self._lb_tunow = ClockLabel(self) self._lb_tunow.setStyleSheet('QLabel{max-height:2em;}') self._ld_tunxt = QLabel('Next:', self, alignment=Qt.AlignRight | Qt.AlignVCenter) self._lb_tunxt = SiriusLabel( self, self._inj_prefix.substitute(propty='TopUpNextInj-Mon')) self._lb_tunxt.displayFormat = SiriusLabel.DisplayFormat.Time self._lb_tunxt.setAlignment(Qt.AlignCenter) self._lb_tunxt.setStyleSheet('QLabel{max-height:2em;}') self._pb_round = PyDMPushButton( self, label='', icon=qta.icon('mdi.tilde'), pressValue=1, init_channel=self._inj_prefix.substitute( propty='TopUpNextInjRound-Cmd')) self._pb_round.setObjectName('but') self._pb_round.setStyleSheet( '#but{min-width:18px; max-width:18px; icon-size:16px;}') self.wid_tusts = QGroupBox('Top-up status') self.wid_tusts.setVisible(False) lay_tusts = QGridLayout(self.wid_tusts) lay_tusts.addWidget(self._lb_tusts, 0, 0, 1, 2) lay_tusts.addWidget(self._ld_tunow, 1, 0) lay_tusts.addWidget(self._lb_tunow, 1, 1) lay_tusts.addWidget(self._ld_tunxt, 2, 0) lay_tusts.addWidget(self._lb_tunxt, 2, 1) lay_tusts.addWidget(self._pb_round, 2, 2) wid = QWidget() lay = QGridLayout(wid) lay.setContentsMargins(0, 0, 0, 0) lay.addWidget(self.wid_shift, 0, 0) lay.addWidget(self.wid_injsys, 0, 1) lay.addWidget(self.wid_egun, 0, 2) lay.addWidget(self.wid_inj, 0, 3) lay.addWidget(self.wid_tusts, 0, 4) lay.addWidget(self.wid_curr, 0, 5) lay.setColumnStretch(0, 3) lay.setColumnStretch(1, 2) lay.setColumnStretch(2, 2) lay.setColumnStretch(3, 2) lay.setColumnStretch(4, 4) lay.setColumnStretch(5, 3) wid.setStyleSheet('.QLabel{min-height: 1em; max-height: 1em;}') return wid
def __init__(self, parent=None): QDialog.__init__(self, parent=parent) self._shortcuts_summary_title = _("Spyder Keyboard ShortCuts") # Calculate font and amount of elements in each column according screen size width, height = self.get_screen_resolution() font_size = height / 80 font_size = max(min(font_size, MAX_FONT_SIZE), MIN_FONT_SIZE) shortcuts_column = (height - 8 * font_size) / (font_size + 16) # Widgets style = """ QDialog { margin:0px; padding:0px; border-radius: 2px; }""" self.setStyleSheet(style) font_names = QFont() font_names.setPointSize(font_size) font_names.setBold(True) font_keystr = QFont() font_keystr.setPointSize(font_size) font_title = QFont() font_title.setPointSize(font_size + 2) font_title.setBold(True) title_label = QLabel(self._shortcuts_summary_title) title_label.setAlignment(Qt.AlignCenter) title_label.setFont(font_title) # iter over shortcuts and create GroupBox for each context # with shortcuts in a grid columns_layout = QHBoxLayout() added_shortcuts = 0 group = None # group shortcuts by context shortcuts = groupby(sorted(iter_shortcuts()), key=itemgetter(0)) for context, group_shortcuts in shortcuts: for i, (context, name, keystr) in enumerate(group_shortcuts): # start of every column if added_shortcuts == 0: column_layout = QVBoxLayout() # at start of new context add previous context group if i == 0 and added_shortcuts > 0: column_layout.addWidget(group) # create group at start of column or context if added_shortcuts == 0 or i == 0: if context == '_': context = 'Global' group = QGroupBox(context.capitalize()) group.setFont(font_names) group_layout = QGridLayout() group.setLayout(group_layout) # Count space for titles added_shortcuts += 1 # Widgets label_name = QLabel(name.capitalize().replace('_', ' ')) label_name.setFont(font_names) keystr = QKeySequence(keystr).toString(QKeySequence.NativeText) label_keystr = QLabel(keystr) label_keystr.setFont(font_keystr) group_layout.addWidget(label_name, i, 0) group_layout.addWidget(label_keystr, i, 1) added_shortcuts += 1 if added_shortcuts >= shortcuts_column: column_layout.addWidget(group) columns_layout.addLayout(column_layout) added_shortcuts = 0 column_layout.addWidget(group) column_layout.addStretch() # avoid lasts sections to appear too big columns_layout.addLayout(column_layout) # Scroll widget self.scroll_widget = QWidget() self.scroll_widget.setLayout(columns_layout) self.scroll_area = QScrollArea() self.scroll_area.setWidget(self.scroll_widget) # widget setup self.setWindowFlags(Qt.FramelessWindowHint) self.setWindowOpacity(0.95) # layout self._layout = QVBoxLayout() self._layout.addWidget(title_label) self._layout.addWidget(self.scroll_area) self.setLayout(self._layout) self.setGeometry(0, 0, width, height)
def _setupSettingsWidget(self): # group of labels to set the same stylesheet labelsdesc, labelsmon = list(), list() # Mode self._ld_injmode = QLabel('Mode', self) labelsdesc.append(self._ld_injmode) self._cb_injmode = SiriusEnumComboBox( self, self._inj_prefix.substitute(propty='Mode-Sel')) self._lb_injmode = PyDMLabel( self, self._inj_prefix.substitute(propty='Mode-Sts')) self._lb_injmode.showUnits = True labelsmon.append(self._lb_injmode) # Target current self._ld_currtgt = QLabel('Target Curr.', self) labelsdesc.append(self._ld_currtgt) self._sb_currtgt = SiriusSpinbox( self, self._inj_prefix.substitute(propty='TargetCurrent-SP')) self._sb_currtgt.showStepExponent = False self._lb_currtgt = PyDMLabel( self, self._inj_prefix.substitute(propty='TargetCurrent-RB')) self._lb_currtgt.showUnits = True labelsmon.append(self._lb_currtgt) # mode specific configurations self.wid_dcdtls = self._setupDecayModeWidget() self.wid_tudtls = self._setupTopUpModeWidget() self.wid_tudtls.setVisible(False) # Mon self._ld_injset = QLabel('Setup ok', self) labelsdesc.append(self._ld_injset) self._led_injset = InjDiagLed(self) # Type self._ld_injtype = QLabel('Type', self) labelsdesc.append(self._ld_injtype) self._cb_injtype = SiriusEnumComboBox( self, self._inj_prefix.substitute(propty='Type-Sel')) self._lb_injtype = PyDMLabel( self, self._inj_prefix.substitute(propty='Type-Sts')) labelsmon.append(self._lb_injtype) self._lb_injtype_mon = PyDMLabel( self, self._inj_prefix.substitute(propty='Type-Mon')) labelsmon.append(self._lb_injtype_mon) self._ch_injtype = SiriusConnectionSignal( self._inj_prefix.substitute(propty='Type-Sel')) self._ch_injtype.new_value_signal[int].connect( self._handle_injtype_settings_vis) # Single bunch bias voltage self._ld_sbbias = QLabel('SB Bias Voltage', self) labelsdesc.append(self._ld_sbbias) self._sb_sbbias = SiriusSpinbox( self, self._inj_prefix.substitute(propty='SglBunBiasVolt-SP')) self._sb_sbbias.showStepExponent = False self._lb_sbbias = PyDMLabel( self, self._inj_prefix.substitute(propty='SglBunBiasVolt-RB')) self._lb_sbbias.showUnits = True labelsmon.append(self._lb_sbbias) self._ld_sbbias.setVisible(False) self._sb_sbbias.setVisible(False) self._lb_sbbias.setVisible(False) # Multi bunch bias voltage self._ld_mbbias = QLabel('MB Bias Volt.', self) labelsdesc.append(self._ld_mbbias) self._sb_mbbias = SiriusSpinbox( self, self._inj_prefix.substitute(propty='MultBunBiasVolt-SP')) self._sb_mbbias.showStepExponent = False self._lb_mbbias = PyDMLabel( self, self._inj_prefix.substitute(propty='MultBunBiasVolt-RB')) self._lb_mbbias.showUnits = True labelsmon.append(self._lb_mbbias) # bias voltage mon ch_bias_mon = SiriusPVName('LI-01:EG-BiasPS').substitute( prefix=self._prefix, propty_name='voltinsoft') self._lb_bias_mon = PyDMLabel(self, ch_bias_mon) self._lb_bias_mon.showUnits = True labelsmon.append(self._lb_bias_mon) # Filament current op value self._ld_filaopcurr = QLabel('Fila.Op. Curr.', self) labelsdesc.append(self._ld_filaopcurr) self._sb_filaopcurr = SiriusSpinbox( self, self._inj_prefix.substitute(propty='FilaOpCurr-SP')) self._sb_filaopcurr.showStepExponent = False self._lb_filaopcurr = PyDMLabel( self, self._inj_prefix.substitute(propty='FilaOpCurr-RB')) self._lb_filaopcurr.showUnits = True labelsmon.append(self._lb_filaopcurr) ch_filacurr_mon = SiriusPVName('LI-01:EG-FilaPS').substitute( prefix=self._prefix, propty_name='currentinsoft') self._lb_filaopcurr_mon = PyDMLabel(self, ch_filacurr_mon) self._lb_filaopcurr_mon.showUnits = True labelsmon.append(self._lb_filaopcurr_mon) # High voltage op value self._ld_hvopvolt = QLabel('HV.Op. Volt.', self) labelsdesc.append(self._ld_hvopvolt) self._sb_hvopvolt = SiriusSpinbox( self, self._inj_prefix.substitute(propty='HVOpVolt-SP')) self._sb_hvopvolt.showStepExponent = False self._lb_hvopvolt = PyDMLabel( self, self._inj_prefix.substitute(propty='HVOpVolt-RB')) self._lb_hvopvolt.showUnits = True labelsmon.append(self._lb_hvopvolt) ch_hvvolt_mon = SiriusPVName('LI-01:EG-HVPS').substitute( prefix=self._prefix, propty_name='voltinsoft') self._lb_hvopvolt_mon = PyDMLabel(self, ch_hvvolt_mon) self._lb_hvopvolt_mon.showUnits = True labelsmon.append(self._lb_hvopvolt_mon) # header ld_sp = QLabel('<h4>SP</h4>', self, alignment=Qt.AlignCenter) ld_rb = QLabel('<h4>RB</h4>', self, alignment=Qt.AlignCenter) ld_mon = QLabel('<h4>Mon</h4>', self, alignment=Qt.AlignCenter) # Bucket list self._wid_bl = BucketList(self, prefix=self._prefix, min_size=15, show_graph=True) self._wid_bl.setSizePolicy(QSzPlcy.Preferred, QSzPlcy.MinimumExpanding) wid1 = QWidget() wid1.setSizePolicy(QSzPlcy.Preferred, QSzPlcy.Fixed) glay1 = QGridLayout(wid1) glay1.setAlignment(Qt.AlignTop) glay1.addWidget(self._ld_injset, 0, 0) glay1.addWidget(self._led_injset, 0, 1) glay1.addWidget(self._ld_injmode, 1, 0) glay1.addWidget(self._cb_injmode, 1, 1) glay1.addWidget(self._lb_injmode, 1, 2) glay1.addWidget(self._ld_currtgt, 2, 0) glay1.addWidget(self._sb_currtgt, 2, 1) glay1.addWidget(self._lb_currtgt, 2, 2) glay1.addWidget(self.wid_tudtls, 3, 0, 2, 3) glay1.addWidget(self.wid_dcdtls, 3, 0, 2, 3) glay1.setColumnStretch(0, 3) glay1.setColumnStretch(1, 2) glay1.setColumnStretch(2, 2) wid2 = QWidget() wid2.setSizePolicy(QSzPlcy.Preferred, QSzPlcy.Fixed) glay2 = QGridLayout(wid2) glay2.setAlignment(Qt.AlignTop) glay2.addWidget(ld_sp, 0, 1) glay2.addWidget(ld_rb, 0, 2) glay2.addWidget(ld_mon, 0, 3) glay2.addWidget(self._ld_injtype, 1, 0) glay2.addWidget(self._cb_injtype, 1, 1) glay2.addWidget(self._lb_injtype, 1, 2) glay2.addWidget(self._lb_injtype_mon, 1, 3) glay2.addWidget(self._ld_sbbias, 2, 0) glay2.addWidget(self._sb_sbbias, 2, 1) glay2.addWidget(self._lb_sbbias, 2, 2) glay2.addWidget(self._ld_mbbias, 2, 0) glay2.addWidget(self._sb_mbbias, 2, 1) glay2.addWidget(self._lb_mbbias, 2, 2) glay2.addWidget(self._lb_bias_mon, 2, 3) glay2.addWidget(self._ld_filaopcurr, 4, 0) glay2.addWidget(self._sb_filaopcurr, 4, 1) glay2.addWidget(self._lb_filaopcurr, 4, 2) glay2.addWidget(self._lb_filaopcurr_mon, 4, 3) glay2.addWidget(self._ld_hvopvolt, 5, 0) glay2.addWidget(self._sb_hvopvolt, 5, 1) glay2.addWidget(self._lb_hvopvolt, 5, 2) glay2.addWidget(self._lb_hvopvolt_mon, 5, 3) glay2.setColumnStretch(0, 3) glay2.setColumnStretch(1, 2) glay2.setColumnStretch(2, 2) glay2.setColumnStretch(3, 2) wid = QGroupBox('Settings') lay = QGridLayout(wid) lay.addWidget(wid1, 0, 0, alignment=Qt.AlignTop) lay.addWidget(wid2, 0, 1, alignment=Qt.AlignTop) lay.addWidget(self._wid_bl, 1, 0, 1, 2) lay.setColumnStretch(0, 3) lay.setColumnStretch(1, 4) for lbl in labelsdesc: lbl.setStyleSheet(""" QLabel{ min-width: 6.5em; max-width: 6.5em; min-height: 1.5em; qproperty-alignment: 'AlignRight | AlignVCenter'; }""") for lbl in labelsmon: lbl.setStyleSheet("PyDMLabel{qproperty-alignment: AlignCenter;}") return wid
def create_layout(self): grid = QGridLayout() irow = 0 grid.addWidget(self.font_size_label, irow, 0) grid.addWidget(self.font_size_edit, irow, 1) grid.addWidget(self.font_size_button, irow, 2) irow += 1 grid.addWidget(self.gradient_scale_label, irow, 0) grid.addWidget(self.gradient_scale_checkbox, irow, 1) irow += 1 grid.addWidget(self.background_color2_label, irow, 0) grid.addWidget(self.background_color2_edit, irow, 1) irow += 1 grid.addWidget(self.background_color_label, irow, 0) grid.addWidget(self.background_color_edit, irow, 1) irow += 1 grid.addWidget(self.text_color_label, irow, 0) grid.addWidget(self.text_color_edit, irow, 1) irow += 1 grid.addWidget(self.text_size_label, irow, 0) grid.addWidget(self.text_size_edit, irow, 1) grid.addWidget(self.text_size_button, irow, 2) irow += 1 grid.addWidget(self.annotation_color_label, irow, 0) grid.addWidget(self.annotation_color_edit, irow, 1) irow += 1 grid.addWidget(self.annotation_size_label, irow, 0) grid.addWidget(self.annotation_size_edit, irow, 1) grid.addWidget(self.annotation_size_button, irow, 2) irow += 1 #grid.addWidget(self.clipping_min_label, irow, 0) #grid.addWidget(self.clipping_min_edit, irow, 1) #grid.addWidget(self.clipping_min_button, irow, 2) #irow += 1 #grid.addWidget(self.clipping_max_label, irow, 0) #grid.addWidget(self.clipping_max_edit, irow, 1) #grid.addWidget(self.clipping_max_button, irow, 2) #irow += 1 grid.addWidget(self.coord_scale_label, irow, 0) grid.addWidget(self.coord_scale_edit, irow, 1) grid.addWidget(self.coord_scale_button, irow, 2) irow += 1 grid.addWidget(self.coord_text_scale_label, irow, 0) grid.addWidget(self.coord_text_scale_edit, irow, 1) grid.addWidget(self.coord_text_scale_button, irow, 2) irow += 1 #----------------------------------------------- grid.addWidget(self.magnify_label, irow, 0) grid.addWidget(self.magnify_edit, irow, 1) irow += 1 grid.addWidget(self.picker_size_label, irow, 0) grid.addWidget(self.picker_size_edit, irow, 1) irow += 1 #self.create_legend_widgets() #grid2 = self.create_legend_layout() ok_cancel_box = QHBoxLayout() ok_cancel_box.addWidget(self.apply_button) ok_cancel_box.addWidget(self.ok_button) ok_cancel_box.addWidget(self.cancel_button) vbox = QVBoxLayout() vbox.addLayout(grid) #vbox.addStretch() #vbox.addLayout(grid2) vbox.addStretch() vbox.addLayout(ok_cancel_box) self.setLayout(vbox)
def __init__(self, layer): super().__init__(layer) self.layer.events.mode.connect(self._on_mode_change) self.layer.events.edge_width.connect(self._on_edge_width_change) self.layer.events.current_edge_color.connect( self._on_current_edge_color_change ) self.layer.events.current_face_color.connect( self._on_current_face_color_change ) self.layer.events.editable.connect(self._on_editable_change) self.layer.text.events.visible.connect(self._on_text_visibility_change) sld = QSlider(Qt.Horizontal) sld.setFocusPolicy(Qt.NoFocus) sld.setMinimum(0) sld.setMaximum(40) sld.setSingleStep(1) value = self.layer.current_edge_width if isinstance(value, Iterable): if isinstance(value, list): value = np.asarray(value) value = value.mean() sld.setValue(int(value)) sld.valueChanged.connect(self.changeWidth) self.widthSlider = sld self.select_button = QtModeRadioButton( layer, 'select', Mode.SELECT, tooltip='Select shapes' ) self.direct_button = QtModeRadioButton( layer, 'direct', Mode.DIRECT, tooltip='Select vertices' ) self.panzoom_button = QtModeRadioButton( layer, 'zoom', Mode.PAN_ZOOM, tooltip='Pan/zoom', checked=True ) self.rectangle_button = QtModeRadioButton( layer, 'rectangle', Mode.ADD_RECTANGLE, tooltip='Add rectangles' ) self.ellipse_button = QtModeRadioButton( layer, 'ellipse', Mode.ADD_ELLIPSE, tooltip='Add ellipses' ) self.line_button = QtModeRadioButton( layer, 'line', Mode.ADD_LINE, tooltip='Add lines' ) self.path_button = QtModeRadioButton( layer, 'path', Mode.ADD_PATH, tooltip='Add paths' ) self.polygon_button = QtModeRadioButton( layer, 'polygon', Mode.ADD_POLYGON, tooltip='Add polygons' ) self.vertex_insert_button = QtModeRadioButton( layer, 'vertex_insert', Mode.VERTEX_INSERT, tooltip='Insert vertex' ) self.vertex_remove_button = QtModeRadioButton( layer, 'vertex_remove', Mode.VERTEX_REMOVE, tooltip='Remove vertex' ) self.move_front_button = QtModePushButton( layer, 'move_front', slot=self.layer.move_to_front, tooltip='Move to front', ) self.move_back_button = QtModePushButton( layer, 'move_back', slot=self.layer.move_to_back, tooltip='Move to back', ) self.delete_button = QtModePushButton( layer, 'delete_shape', slot=self.layer.remove_selected, tooltip='Delete selected shapes', ) self.button_group = QButtonGroup(self) self.button_group.addButton(self.select_button) self.button_group.addButton(self.direct_button) self.button_group.addButton(self.panzoom_button) self.button_group.addButton(self.rectangle_button) self.button_group.addButton(self.ellipse_button) self.button_group.addButton(self.line_button) self.button_group.addButton(self.path_button) self.button_group.addButton(self.polygon_button) self.button_group.addButton(self.vertex_insert_button) self.button_group.addButton(self.vertex_remove_button) button_grid = QGridLayout() button_grid.addWidget(self.vertex_remove_button, 0, 2) button_grid.addWidget(self.vertex_insert_button, 0, 3) button_grid.addWidget(self.delete_button, 0, 4) button_grid.addWidget(self.direct_button, 0, 5) button_grid.addWidget(self.select_button, 0, 6) button_grid.addWidget(self.panzoom_button, 0, 7) button_grid.addWidget(self.move_back_button, 1, 1) button_grid.addWidget(self.move_front_button, 1, 2) button_grid.addWidget(self.ellipse_button, 1, 3) button_grid.addWidget(self.rectangle_button, 1, 4) button_grid.addWidget(self.polygon_button, 1, 5) button_grid.addWidget(self.line_button, 1, 6) button_grid.addWidget(self.path_button, 1, 7) button_grid.setContentsMargins(5, 0, 0, 5) button_grid.setColumnStretch(0, 1) button_grid.setSpacing(4) self.faceColorEdit = QColorSwatchEdit( initial_color=self.layer.current_face_color, tooltip='click to set current face color', ) self._on_current_face_color_change() self.edgeColorEdit = QColorSwatchEdit( initial_color=self.layer.current_edge_color, tooltip='click to set current edge color', ) self._on_current_edge_color_change() self.faceColorEdit.color_changed.connect(self.changeFaceColor) self.edgeColorEdit.color_changed.connect(self.changeEdgeColor) text_disp_cb = QCheckBox() text_disp_cb.setToolTip('toggle text visibility') text_disp_cb.setChecked(self.layer.text.visible) text_disp_cb.stateChanged.connect(self.change_text_visibility) self.textDispCheckBox = text_disp_cb # grid_layout created in QtLayerControls # addWidget(widget, row, column, [row_span, column_span]) self.grid_layout.addLayout(button_grid, 0, 0, 1, 2) self.grid_layout.addWidget(QLabel('opacity:'), 1, 0) self.grid_layout.addWidget(self.opacitySlider, 1, 1) self.grid_layout.addWidget(QLabel('edge width:'), 2, 0) self.grid_layout.addWidget(self.widthSlider, 2, 1) self.grid_layout.addWidget(QLabel('blending:'), 3, 0) self.grid_layout.addWidget(self.blendComboBox, 3, 1) self.grid_layout.addWidget(QLabel('face color:'), 4, 0) self.grid_layout.addWidget(self.faceColorEdit, 4, 1) self.grid_layout.addWidget(QLabel('edge color:'), 5, 0) self.grid_layout.addWidget(self.edgeColorEdit, 5, 1) self.grid_layout.addWidget(QLabel('display text:'), 6, 0) self.grid_layout.addWidget(self.textDispCheckBox, 6, 1) self.grid_layout.setRowStretch(7, 1) self.grid_layout.setColumnStretch(1, 1) self.grid_layout.setSpacing(4)
def setup_ui(self): self.setWindowTitle('Neuroport DBS - Electrodes Depth') self.setWindowFlags(Qt.FramelessWindowHint) self.move(WINDOWDIMS_DEPTH[0], WINDOWDIMS_DEPTH[1]) self.setFixedSize(WINDOWDIMS_DEPTH[2], WINDOWDIMS_DEPTH[3]) self.show() self.plot_widget = QWidget() self.setCentralWidget(self.plot_widget) # define Qt GUI elements v_layout = QVBoxLayout() v_layout.setSpacing(0) v_layout.setContentsMargins(10, 0, 10, 10) h_layout = QHBoxLayout() self.comboBox_com_port = QComboBox() h_layout.addWidget(self.comboBox_com_port) self.pushButton_open = QPushButton("Open") h_layout.addWidget(self.pushButton_open) h_layout.addStretch() self.label_offset = QLabel("Offset: ") h_layout.addWidget(self.label_offset) self.doubleSpinBox_offset = QDoubleSpinBox() self.doubleSpinBox_offset.setMinimum(-100.00) self.doubleSpinBox_offset.setMaximum(100.00) self.doubleSpinBox_offset.setSingleStep(1.00) self.doubleSpinBox_offset.setDecimals(2) self.doubleSpinBox_offset.setValue(-10.00) self.doubleSpinBox_offset.setFixedWidth(60) h_layout.addWidget(self.doubleSpinBox_offset) h_layout.addStretch() h_layout.addWidget(QLabel("Stream to :")) self.chk_NSP = QCheckBox("NSP") self.chk_NSP.setChecked(True) h_layout.addWidget(self.chk_NSP) h_layout.addSpacing(5) self.chk_LSL = QCheckBox("LSL") self.chk_LSL.clicked.connect(self.on_chk_LSL_clicked) self.chk_LSL.click( ) # default is enabled, click call to trigger LSL stream creation. h_layout.addWidget(self.chk_LSL) h_layout.addSpacing(5) send_btn = QPushButton("Send") send_btn.clicked.connect(self.send) h_layout.addWidget(send_btn) h_layout.addSpacing(5) quit_btn = QPushButton('X') quit_btn.setMaximumWidth(20) quit_btn.clicked.connect(QApplication.instance().quit) quit_btn.setStyleSheet("QPushButton { color: white; " "background-color : red; " "border-color : red; " "border-width: 2px}") h_layout.addWidget(quit_btn) v_layout.addLayout(h_layout) # define Qt GUI elements # add a frame for the LCD numbers self.lcd_frame = QFrame() self.lcd_frame.setFrameShape(1) lcd_layout = QGridLayout() self.lcd_frame.setLayout(lcd_layout) # RAW reading from DDU self.raw_ddu = QLCDNumber() self.raw_ddu.setDigitCount(7) self.raw_ddu.setFrameShape(0) self.raw_ddu.setSmallDecimalPoint(True) self.raw_ddu.setFixedHeight(50) self.raw_ddu.display("{0:.3f}".format(0)) lcd_layout.addWidget(self.raw_ddu, 0, 3, 2, 3) self.offset_ddu = QLCDNumber() self.offset_ddu.setDigitCount(7) self.offset_ddu.setFixedHeight(150) self.offset_ddu.display("{0:.3f}".format(-10)) self.offset_ddu.setFrameShape(0) lcd_layout.addWidget(self.offset_ddu, 2, 0, 5, 6) v_layout.addWidget(self.lcd_frame) self.plot_widget.setLayout(v_layout) # Populate control panel items for port in serial.tools.list_ports.comports(): self.comboBox_com_port.addItem(port.device) self.comboBox_com_port.addItem("cbsdk playback") # Connect signals & slots self.pushButton_open.clicked.connect(self.on_open_clicked) self.comboBox_com_port.currentIndexChanged.connect( self.on_comboBox_com_port_changed)
def __init__(self, parent, project_types): """Project creation dialog.""" super(ProjectDialog, self).__init__(parent=parent) self.plugin = parent self._project_types = project_types self.project_data = {} self.setWindowFlags( self.windowFlags() & ~Qt.WindowContextHelpButtonHint) # Variables current_python_version = '.'.join([to_text_string(sys.version_info[0]), to_text_string(sys.version_info[1])]) python_versions = ['2.7', '3.4', '3.5'] if current_python_version not in python_versions: python_versions.append(current_python_version) python_versions = sorted(python_versions) self.project_name = None self.location = get_home_dir() # Widgets self.groupbox = QGroupBox() self.radio_new_dir = QRadioButton(_("New directory")) self.radio_from_dir = QRadioButton(_("Existing directory")) self.label_project_name = QLabel(_('Project name')) self.label_location = QLabel(_('Location')) self.label_project_type = QLabel(_('Project type')) self.label_python_version = QLabel(_('Python version')) self.text_project_name = QLineEdit() self.text_location = QLineEdit(get_home_dir()) self.combo_project_type = QComboBox() self.combo_python_version = QComboBox() self.label_information = QLabel("") self.button_select_location = create_toolbutton( self, triggered=self.select_location, icon=ima.icon('DirOpenIcon'), tip=_("Select directory")) self.button_cancel = QPushButton(_('Cancel')) self.button_create = QPushButton(_('Create')) self.bbox = QDialogButtonBox(Qt.Horizontal) self.bbox.addButton(self.button_cancel, QDialogButtonBox.ActionRole) self.bbox.addButton(self.button_create, QDialogButtonBox.ActionRole) # Widget setup self.combo_python_version.addItems(python_versions) self.radio_new_dir.setChecked(True) self.text_location.setEnabled(True) self.text_location.setReadOnly(True) self.button_cancel.setDefault(True) self.button_cancel.setAutoDefault(True) self.button_create.setEnabled(False) for (id_, name) in [(pt_id, pt.get_name()) for pt_id, pt in project_types.items()]: self.combo_project_type.addItem(name, id_) self.combo_python_version.setCurrentIndex( python_versions.index(current_python_version)) self.setWindowTitle(_('Create new project')) self.setFixedWidth(500) self.label_python_version.setVisible(False) self.combo_python_version.setVisible(False) # Layouts layout_top = QHBoxLayout() layout_top.addWidget(self.radio_new_dir) layout_top.addWidget(self.radio_from_dir) layout_top.addStretch(1) self.groupbox.setLayout(layout_top) layout_grid = QGridLayout() layout_grid.addWidget(self.label_project_name, 0, 0) layout_grid.addWidget(self.text_project_name, 0, 1, 1, 2) layout_grid.addWidget(self.label_location, 1, 0) layout_grid.addWidget(self.text_location, 1, 1) layout_grid.addWidget(self.button_select_location, 1, 2) layout_grid.addWidget(self.label_project_type, 2, 0) layout_grid.addWidget(self.combo_project_type, 2, 1, 1, 2) layout_grid.addWidget(self.label_python_version, 3, 0) layout_grid.addWidget(self.combo_python_version, 3, 1, 1, 2) layout_grid.addWidget(self.label_information, 4, 0, 1, 3) layout = QVBoxLayout() layout.addWidget(self.groupbox) layout.addSpacing(10) layout.addLayout(layout_grid) layout.addStretch() layout.addSpacing(20) layout.addWidget(self.bbox) self.setLayout(layout) # Signals and slots self.button_create.clicked.connect(self.create_project) self.button_cancel.clicked.connect(self.close) self.radio_from_dir.clicked.connect(self.update_location) self.radio_new_dir.clicked.connect(self.update_location) self.text_project_name.textChanged.connect(self.update_location)
def __init__(self, layer): super().__init__(layer) self.layer.events.mode.connect(self.set_mode) self.layer.events.edge_width.connect(self._on_edge_width_change) self.layer.events.edge_color.connect(self._on_edge_color_change) self.layer.events.face_color.connect(self._on_face_color_change) self.layer.events.editable.connect(self._on_editable_change) sld = QSlider(Qt.Horizontal) sld.setFocusPolicy(Qt.NoFocus) sld.setMinimum(0) sld.setMaximum(40) sld.setSingleStep(1) value = self.layer.edge_width if isinstance(value, Iterable): if isinstance(value, list): value = np.asarray(value) value = value.mean() sld.setValue(int(value)) sld.valueChanged[int].connect( lambda value=sld: self.changeWidth(value) ) self.widthSlider = sld face_comboBox = QComboBox() colors = self.layer._colors for c in colors: face_comboBox.addItem(c) face_comboBox.activated[str].connect( lambda text=face_comboBox: self.changeFaceColor(text) ) self.faceComboBox = face_comboBox self.faceColorSwatch = QFrame() self.faceColorSwatch.setObjectName('swatch') self.faceColorSwatch.setToolTip('Face color swatch') self._on_face_color_change(None) edge_comboBox = QComboBox() colors = self.layer._colors for c in colors: edge_comboBox.addItem(c) edge_comboBox.activated[str].connect( lambda text=edge_comboBox: self.changeEdgeColor(text) ) self.edgeComboBox = edge_comboBox self.edgeColorSwatch = QFrame() self.edgeColorSwatch.setObjectName('swatch') self.edgeColorSwatch.setToolTip('Edge color swatch') self._on_edge_color_change(None) self.select_button = QtModeButton( layer, 'select', Mode.SELECT, 'Select shapes' ) self.direct_button = QtModeButton( layer, 'direct', Mode.DIRECT, 'Select vertices' ) self.panzoom_button = QtModeButton( layer, 'zoom', Mode.PAN_ZOOM, 'Pan/zoom' ) self.rectangle_button = QtModeButton( layer, 'rectangle', Mode.ADD_RECTANGLE, 'Add rectangles' ) self.ellipse_button = QtModeButton( layer, 'ellipse', Mode.ADD_ELLIPSE, 'Add ellipses' ) self.line_button = QtModeButton( layer, 'line', Mode.ADD_LINE, 'Add lines' ) self.path_button = QtModeButton( layer, 'path', Mode.ADD_PATH, 'Add paths' ) self.polygon_button = QtModeButton( layer, 'polygon', Mode.ADD_POLYGON, 'Add polygons' ) self.vertex_insert_button = QtModeButton( layer, 'vertex_insert', Mode.VERTEX_INSERT, 'Insert vertex' ) self.vertex_remove_button = QtModeButton( layer, 'vertex_remove', Mode.VERTEX_REMOVE, 'Remove vertex' ) self.move_front_button = QtMoveFrontButton(layer) self.move_back_button = QtMoveBackButton(layer) self.delete_button = QtDeleteShapeButton(layer) self.panzoom_button.setChecked(True) self.button_group = QButtonGroup(self) self.button_group.addButton(self.select_button) self.button_group.addButton(self.direct_button) self.button_group.addButton(self.panzoom_button) self.button_group.addButton(self.rectangle_button) self.button_group.addButton(self.ellipse_button) self.button_group.addButton(self.line_button) self.button_group.addButton(self.path_button) self.button_group.addButton(self.polygon_button) self.button_group.addButton(self.vertex_insert_button) self.button_group.addButton(self.vertex_remove_button) button_grid = QGridLayout() button_grid.addWidget(self.vertex_remove_button, 0, 1) button_grid.addWidget(self.vertex_insert_button, 0, 2) button_grid.addWidget(self.delete_button, 0, 3) button_grid.addWidget(self.direct_button, 0, 4) button_grid.addWidget(self.select_button, 0, 5) button_grid.addWidget(self.panzoom_button, 0, 6) button_grid.addWidget(self.move_back_button, 1, 0) button_grid.addWidget(self.move_front_button, 1, 1) button_grid.addWidget(self.ellipse_button, 1, 2) button_grid.addWidget(self.rectangle_button, 1, 3) button_grid.addWidget(self.polygon_button, 1, 4) button_grid.addWidget(self.line_button, 1, 5) button_grid.addWidget(self.path_button, 1, 6) button_grid.setColumnStretch(2, 2) button_grid.setSpacing(4) # grid_layout created in QtLayerControls # addWidget(widget, row, column, [row_span, column_span]) self.grid_layout.addLayout(button_grid, 0, 0, 1, 3) self.grid_layout.addWidget(QLabel('opacity:'), 1, 0) self.grid_layout.addWidget(self.opacitySilder, 1, 1, 1, 2) self.grid_layout.addWidget(QLabel('edge width:'), 2, 0) self.grid_layout.addWidget(self.widthSlider, 2, 1, 1, 2) self.grid_layout.addWidget(QLabel('blending:'), 3, 0) self.grid_layout.addWidget(self.blendComboBox, 3, 1, 1, 2) self.grid_layout.addWidget(QLabel('face color:'), 4, 0) self.grid_layout.addWidget(self.faceComboBox, 4, 2) self.grid_layout.addWidget(self.faceColorSwatch, 4, 1) self.grid_layout.addWidget(QLabel('edge color:'), 5, 0) self.grid_layout.addWidget(self.edgeComboBox, 5, 2) self.grid_layout.addWidget(self.edgeColorSwatch, 5, 1) self.grid_layout.setRowStretch(6, 1) self.grid_layout.setColumnStretch(1, 1) self.grid_layout.setSpacing(4)
def __init__(self, parent, language=None, cmd='', host='127.0.0.1', port=2084, args='', external=False, stdio=False, configurations={}, **kwargs): super(LSPServerEditor, self).__init__(parent) description = _( "To create a new server configuration, you need to select a " "programming language, set the command to start its associated " "server and enter any arguments that should be passed to it on " "startup. Additionally, you can set the server's hostname and " "port if connecting to an external server, " "or to a local one using TCP instead of stdio pipes." "<br><br>" "<i>Note</i>: You can use the placeholders <tt>{host}</tt> and " "<tt>{port}</tt> in the server arguments field to automatically " "fill in the respective values.<br>") self.parent = parent self.external = external # Widgets self.server_settings_description = QLabel(description) self.lang_cb = QComboBox(self) self.external_cb = QCheckBox(_('External server'), self) self.host_label = QLabel(_('Host:')) self.host_input = QLineEdit(self) self.port_label = QLabel(_('Port:')) self.port_spinner = QSpinBox(self) self.cmd_label = QLabel(_('Command:')) self.cmd_input = QLineEdit(self) self.args_label = QLabel(_('Arguments:')) self.args_input = QLineEdit(self) self.json_label = QLabel(self.JSON_VALID, self) self.conf_label = QLabel(_('<b>Server Configuration:</b>')) self.conf_input = CodeEditor(None) self.bbox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) self.button_ok = self.bbox.button(QDialogButtonBox.Ok) self.button_cancel = self.bbox.button(QDialogButtonBox.Cancel) # Widget setup self.setMinimumSize(self.MIN_SIZE) self.setWindowTitle(_('LSP server editor')) self.server_settings_description.setWordWrap(True) self.lang_cb.setToolTip( _('Programming language provided by the LSP server')) self.lang_cb.addItem(_('Select a language')) self.lang_cb.addItems(LSP_LANGUAGES) self.button_ok.setEnabled(False) if language is not None: idx = LSP_LANGUAGES.index(language) self.lang_cb.setCurrentIndex(idx + 1) self.button_ok.setEnabled(True) self.host_input.setPlaceholderText('127.0.0.1') self.host_input.setText(host) self.host_input.textChanged.connect(lambda x: self.validate()) self.port_spinner.setToolTip(_('TCP port number of the server')) self.port_spinner.setMinimum(1) self.port_spinner.setMaximum(60000) self.port_spinner.setValue(port) self.cmd_input.setText(cmd) self.cmd_input.setPlaceholderText('/absolute/path/to/command') self.args_input.setToolTip( _('Additional arguments required to start the server')) self.args_input.setText(args) self.args_input.setPlaceholderText(r'--host {host} --port {port}') self.conf_input.setup_editor(language='json', color_scheme=CONF.get( 'appearance', 'selected'), wrap=False, edge_line=True, highlight_current_line=True, highlight_current_cell=True, occurrence_highlighting=True, auto_unindent=True, font=get_font(), filename='config.json', folding=False) self.conf_input.set_language('json', 'config.json') self.conf_input.setToolTip( _('Additional LSP server configuration ' 'set at runtime. JSON required')) try: conf_text = json.dumps(configurations, indent=4, sort_keys=True) except Exception: conf_text = '{}' self.conf_input.set_text(conf_text) self.external_cb.setToolTip( _('Check if the server runs on a remote location')) self.external_cb.setChecked(external) self.stdio_cb = QCheckBox(_('Use stdio pipes for communication'), self) self.stdio_cb.setToolTip( _('Check if the server communicates ' 'using stdin/out pipes')) self.stdio_cb.setChecked(stdio) # Layout setup hlayout = QHBoxLayout() general_vlayout = QVBoxLayout() general_vlayout.addWidget(self.server_settings_description) vlayout = QVBoxLayout() lang_group = QGroupBox(_('Language')) lang_layout = QVBoxLayout() lang_layout.addWidget(self.lang_cb) lang_group.setLayout(lang_layout) vlayout.addWidget(lang_group) server_group = QGroupBox(_('Language server')) server_layout = QGridLayout() server_layout.addWidget(self.cmd_label, 0, 0) server_layout.addWidget(self.cmd_input, 0, 1) server_layout.addWidget(self.args_label, 1, 0) server_layout.addWidget(self.args_input, 1, 1) server_group.setLayout(server_layout) vlayout.addWidget(server_group) address_group = QGroupBox(_('Server address')) host_layout = QVBoxLayout() host_layout.addWidget(self.host_label) host_layout.addWidget(self.host_input) port_layout = QVBoxLayout() port_layout.addWidget(self.port_label) port_layout.addWidget(self.port_spinner) conn_info_layout = QHBoxLayout() conn_info_layout.addLayout(host_layout) conn_info_layout.addLayout(port_layout) address_group.setLayout(conn_info_layout) vlayout.addWidget(address_group) advanced_group = QGroupBox(_('Advanced')) advanced_layout = QVBoxLayout() advanced_layout.addWidget(self.external_cb) advanced_layout.addWidget(self.stdio_cb) advanced_group.setLayout(advanced_layout) vlayout.addWidget(advanced_group) conf_layout = QVBoxLayout() conf_layout.addWidget(self.conf_label) conf_layout.addWidget(self.conf_input) conf_layout.addWidget(self.json_label) vlayout.addStretch() hlayout.addLayout(vlayout, 2) hlayout.addLayout(conf_layout, 3) general_vlayout.addLayout(hlayout) general_vlayout.addWidget(self.bbox) self.setLayout(general_vlayout) self.form_status(False) # Signals if not external: self.cmd_input.textChanged.connect(lambda x: self.validate()) self.external_cb.stateChanged.connect(self.set_local_options) self.stdio_cb.stateChanged.connect(self.set_stdio_options) self.lang_cb.currentIndexChanged.connect(self.lang_selection_changed) self.conf_input.textChanged.connect(self.validate) self.bbox.accepted.connect(self.accept) self.bbox.rejected.connect(self.reject) # Final setup if language is not None: self.form_status(True) self.validate() if stdio: self.set_stdio_options(True) if external: self.set_local_options(True)
def insert_row(self, row=-1, title='', sample_runs='', sample_mass_density='N/A', sample_chemical_formula='N/A', packing_fraction='N/A', align_and_focus_args={}, sample_placzek_arguments={}, normalization_placzek_arguments={}): self.table_ui.insertRow(row) self.set_row_height(row, COLUMN_DEFAULT_HEIGHT) _list_ui_to_unlock = [self.table_ui] _dimension_widgets = {'label': None, 'value': 'N/A', 'units': None} _full_dimension_widgets = { 'radius': copy.deepcopy(_dimension_widgets), 'radius2': copy.deepcopy(_dimension_widgets), 'height': copy.deepcopy(_dimension_widgets) } _text_button = {'text': None, 'button': None} _mass_density_options = {'value': "N/A", "selected": False} _mass_density_infos = { 'number_density': copy.deepcopy(_mass_density_options), 'mass_density': copy.deepcopy(_mass_density_options), 'mass': copy.deepcopy(_mass_density_options), 'molecular_mass': np.NaN, 'total_number_of_atoms': np.NaN, } _material_infos = {'mantid_format': None, 'addie_format': None} _mass_density_infos['mass_density']["selected"] = True _master_table_row_ui = { 'active': None, 'title': None, 'sample': { 'runs': None, 'background': { 'runs': None, 'background': None, }, 'material': copy.deepcopy(_text_button), 'material_infos': copy.deepcopy(_material_infos), 'mass_density': copy.deepcopy(_text_button), 'mass_density_infos': copy.deepcopy(_mass_density_infos), 'packing_fraction': None, 'geometry': copy.deepcopy(_full_dimension_widgets), 'shape': None, 'abs_correction': None, 'mult_scat_correction': None, 'inelastic_correction': None, 'placzek_button': None, 'placzek_infos': None, }, 'normalization': { 'runs': None, 'background': { 'runs': None, 'background': None, }, 'material': copy.deepcopy(_text_button), 'material_infos': copy.deepcopy(_material_infos), 'mass_density': copy.deepcopy(_text_button), 'mass_density_infos': copy.deepcopy(_mass_density_infos), 'packing_fraction': None, 'geometry': copy.deepcopy(_full_dimension_widgets), 'shape': None, 'abs_correction': None, 'mult_scat_correction': None, 'inelastic_correction': None, 'placzek_button': None, 'placzek_infos': None, }, 'align_and_focus_args_button': None, 'align_and_focus_args_infos': {}, 'align_and_focus_args_use_global': True, } random_key = self.generate_random_key() self.key = random_key # block main table events self.table_ui.blockSignals(True) # column 0 (active or not checkBox) _layout = QHBoxLayout() _widget = QCheckBox() _widget.setCheckState(QtCore.Qt.Checked) _widget.setEnabled(True) _master_table_row_ui['active'] = _widget _spacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) _layout.addItem(_spacer) _layout.addWidget(_widget) _spacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) _layout.addItem(_spacer) _layout.addStretch() _new_widget = QWidget() _new_widget.setLayout(_layout) _widget.stateChanged.connect( lambda state=0, key=random_key: self.main_window. master_table_select_state_changed(state, key)) column = 0 self.table_ui.setCellWidget(row, column, _new_widget) # sample column += 1 # column 1 - title _item = QTableWidgetItem(title) _master_table_row_ui['title'] = _item self.table_ui.setItem(row, column, _item) # column 2 - sample runs column += 1 _item = QTableWidgetItem(sample_runs) _master_table_row_ui['sample']['runs'] = _item self.table_ui.setItem(row, column, _item) # column 3 - background runs column += 1 _item = QTableWidgetItem("") _master_table_row_ui['sample']['background']['runs'] = _item self.table_ui.setItem(row, column, _item) # column 4 - background background column += 1 _item = QTableWidgetItem("") _master_table_row_ui['sample']['background']['background'] = _item self.table_ui.setItem(row, column, _item) # column 5 - material (chemical formula) column += 1 clean_sample_chemical_formula = format_chemical_formula_equation( sample_chemical_formula) _material_text = QLineEdit(clean_sample_chemical_formula) _material_text = QLabel(clean_sample_chemical_formula) _material_button = QPushButton("...") _material_button.setFixedHeight(CONFIG_BUTTON_HEIGHT) _material_button.setFixedWidth(CONFIG_BUTTON_WIDTH) _material_button.pressed.connect( lambda key=random_key: self.main_window. master_table_sample_material_button_pressed(key)) _verti_layout = QVBoxLayout() _verti_layout.addWidget(_material_text) _verti_layout.addWidget(_material_button) _material_widget = QWidget() _material_widget.setLayout(_verti_layout) self.table_ui.setCellWidget(row, column, _material_widget) _master_table_row_ui['sample']['material']['text'] = _material_text _master_table_row_ui['sample']['material']['button'] = _material_button # column 6 - mass density column += 1 _mass_text = QLineEdit(sample_mass_density) _mass_text.returnPressed.connect( lambda key=random_key: self.main_window. master_table_sample_mass_density_line_edit_entered(key)) _mass_units = QLabel("g/cc") _top_widget = QWidget() _top_layout = QHBoxLayout() _top_layout.addWidget(_mass_text) _top_layout.addWidget(_mass_units) _top_widget.setLayout(_top_layout) _mass_button = QPushButton("...") _mass_button.setFixedHeight(CONFIG_BUTTON_HEIGHT) _mass_button.setFixedWidth(CONFIG_BUTTON_WIDTH) _mass_button.pressed.connect( lambda key=random_key: self.main_window. master_table_sample_mass_density_button_pressed(key)) _verti_layout = QVBoxLayout() _verti_layout.addWidget(_top_widget) _verti_layout.addWidget(_mass_button) _mass_widget = QWidget() _mass_widget.setLayout(_verti_layout) self.table_ui.setCellWidget(row, column, _mass_widget) _master_table_row_ui['sample']['mass_density']['text'] = _mass_text _master_table_row_ui['sample']['mass_density']['button'] = _mass_button # column 7 - packing fraction column += 1 if packing_fraction == "N/A": packing_fraction = "{}".format(self.main_window.packing_fraction) _item = QTableWidgetItem(packing_fraction) _master_table_row_ui['sample']['packing_fraction'] = _item self.table_ui.setItem(row, column, _item) # column 8 - shape (cylinder or sphere) column += 1 _layout = QHBoxLayout() _layout.setContentsMargins(0, 0, 0, 0) _widget = QComboBox() _shape_default_index = 0 _widget.currentIndexChanged.connect( lambda index=_shape_default_index, key=random_key: self.main_window .master_table_sample_shape_changed(index, key)) _list_ui_to_unlock.append(_widget) _widget.blockSignals(True) _widget.addItem("Cylinder") _widget.addItem("Sphere") _widget.addItem("Hollow Cylinder") _master_table_row_ui['sample']['shape'] = _widget _layout.addWidget(_widget) _w = QWidget() _w.setLayout(_layout) self.table_ui.setCellWidget(row, column, _w) # column 9 - dimensions column += 1 # layout 1 _grid_layout = QGridLayout() _label1 = QLabel("Radius:") _grid_layout.addWidget(_label1, 1, 0) _value1 = QLabel("N/A") _grid_layout.addWidget(_value1, 1, 1) _dim1 = QLabel("cm") _grid_layout.addWidget(_dim1, 1, 2) _label2 = QLabel("Radius:") _label2.setVisible(False) _grid_layout.addWidget(_label2, 2, 0) _value2 = QLabel("N/A") _value2.setVisible(False) _grid_layout.addWidget(_value2, 2, 1) _dim2 = QLabel("cm") _dim2.setVisible(False) _grid_layout.addWidget(_dim2, 2, 2) _label3 = QLabel("Height:") _grid_layout.addWidget(_label3, 3, 0) _value3 = QLabel("N/A") _grid_layout.addWidget(_value3, 3, 1) _dim3 = QLabel("cm") _grid_layout.addWidget(_dim3, 3, 2) _master_table_row_ui['sample']['geometry']['radius']['value'] = _value1 _master_table_row_ui['sample']['geometry']['radius2'][ 'value'] = _value2 _master_table_row_ui['sample']['geometry']['height']['value'] = _value3 _master_table_row_ui['sample']['geometry']['radius']['label'] = _label1 _master_table_row_ui['sample']['geometry']['radius2'][ 'label'] = _label2 _master_table_row_ui['sample']['geometry']['height']['label'] = _label3 _master_table_row_ui['sample']['geometry']['radius']['units'] = _dim1 _master_table_row_ui['sample']['geometry']['radius2']['units'] = _dim2 _master_table_row_ui['sample']['geometry']['height']['units'] = _dim3 _geometry_widget = QWidget() _geometry_widget.setLayout(_grid_layout) _set_dimensions_button = QPushButton("...") _set_dimensions_button.setFixedHeight(CONFIG_BUTTON_HEIGHT) _set_dimensions_button.setFixedWidth(CONFIG_BUTTON_WIDTH) _verti_layout = QVBoxLayout() _verti_layout.addWidget(_geometry_widget) _verti_layout.addWidget(_set_dimensions_button) _verti_widget = QWidget() _verti_widget.setLayout(_verti_layout) _set_dimensions_button.pressed.connect( lambda key=random_key: self.main_window. master_table_sample_dimensions_setter_button_pressed(key)) self.table_ui.setCellWidget(row, column, _verti_widget) # column 10 - abs. correction column += 1 _layout = QHBoxLayout() _layout.setContentsMargins(0, 0, 0, 0) _widget = QComboBox() _shape_default_value = 0 list_abs_correction = self.get_absorption_correction_list( shape=_shape_default_value) _widget.currentIndexChanged.connect( lambda value=list_abs_correction[0], key=random_key: self. main_window.master_table_sample_abs_correction_changed(value, key)) _widget.blockSignals(True) _list_ui_to_unlock.append(_widget) for _item in list_abs_correction: _widget.addItem(_item) _master_table_row_ui['sample']['abs_correction'] = _widget _layout.addWidget(_widget) _w = QWidget() _w.setLayout(_layout) self.table_ui.setCellWidget(row, column, _w) # column 11 - multi. scattering correction column += 1 _layout = QHBoxLayout() _layout.setContentsMargins(0, 0, 0, 0) _widget = QComboBox() list_multi_scat_correction = self.get_multi_scat_correction_list( shape=_shape_default_value) _widget.currentIndexChanged.connect( lambda value=list_multi_scat_correction[ 0], key=random_key: self.main_window. master_table_sample_multi_scattering_correction_changed( value, key)) _widget.blockSignals(True) _list_ui_to_unlock.append(_widget) for _item in list_multi_scat_correction: _widget.addItem(_item) _master_table_row_ui['sample']['mult_scat_correction'] = _widget _layout.addWidget(_widget) _w = QWidget() _w.setLayout(_layout) self.table_ui.setCellWidget(row, column, _w) # column 12 - inelastic correction column += 1 _layout = QHBoxLayout() _layout.setContentsMargins(0, 0, 0, 0) _widget1 = QComboBox() _widget1.setMinimumHeight(20) list_inelastic_correction = self.get_inelastic_scattering_list( shape=_shape_default_value) for _item in list_inelastic_correction: _widget1.addItem(_item) _master_table_row_ui['sample']['inelastic_correction'] = _widget1 _button = QPushButton("...") _button.setFixedHeight(CONFIG_BUTTON_HEIGHT) _button.setFixedWidth(CONFIG_BUTTON_WIDTH) _button.pressed.connect( lambda key=random_key: self.main_window. master_table_sample_placzek_button_pressed(key)) _master_table_row_ui['sample']['placzek_button'] = _button _button.setVisible(False) _master_table_row_ui['sample']['placzek_button'] = _button _layout.addWidget(_widget1) _layout.addWidget(_button) _widget = QWidget() _widget.setLayout(_layout) _default_value = 'None' _widget1.currentIndexChanged.connect( lambda value=_default_value, key=random_key: self.main_window. master_table_sample_inelastic_correction_changed(value, key)) _widget.blockSignals(True) _list_ui_to_unlock.append(_widget) self.table_ui.setCellWidget(row, column, _widget) # save default placzek settings _sample_formated_placzek_default = self.formated_placzek_default( sample_placzek_arguments) _master_table_row_ui['sample'][ 'placzek_infos'] = _sample_formated_placzek_default ## normalization # column 13 - sample runs column += 1 _item = QTableWidgetItem("") self.table_ui.setItem(row, column, _item) # column 14 - background runs column += 1 _item = QTableWidgetItem("") self.table_ui.setItem(row, column, _item) # column 15 - background background column += 1 _item = QTableWidgetItem("") self.table_ui.setItem(row, column, _item) # column 16 - material (chemical formula) column += 1 #_material_text = QLineEdit("") _material_text = QLabel("N/A") _material_button = QPushButton("...") _material_button.setFixedHeight(CONFIG_BUTTON_HEIGHT) _material_button.setFixedWidth(CONFIG_BUTTON_WIDTH) _material_button.pressed.connect( lambda key=random_key: self.main_window. master_table_normalization_material_button_pressed(key)) _verti_layout = QVBoxLayout() _verti_layout.addWidget(_material_text) _verti_layout.addWidget(_material_button) _material_widget = QWidget() _material_widget.setLayout(_verti_layout) self.table_ui.setCellWidget(row, column, _material_widget) _master_table_row_ui['normalization']['material'][ 'text'] = _material_text _master_table_row_ui['normalization']['material'][ 'button'] = _material_button # column 17 - mass density column += 1 _mass_text = QLineEdit("N/A") _mass_text.returnPressed.connect( lambda key=random_key: self.main_window. master_table_normalization_mass_density_line_edit_entered(key)) _mass_units = QLabel("g/cc") _top_widget = QWidget() _top_layout = QHBoxLayout() _top_layout.addWidget(_mass_text) _top_layout.addWidget(_mass_units) _top_widget.setLayout(_top_layout) _mass_button = QPushButton("...") _mass_button.setFixedWidth(CONFIG_BUTTON_WIDTH) _mass_button.setFixedHeight(CONFIG_BUTTON_HEIGHT) _mass_button.pressed.connect( lambda key=random_key: self.main_window. master_table_normalization_mass_density_button_pressed(key)) _verti_layout = QVBoxLayout() _verti_layout.addWidget(_top_widget) _verti_layout.addWidget(_mass_button) _mass_widget = QWidget() _mass_widget.setLayout(_verti_layout) self.table_ui.setCellWidget(row, column, _mass_widget) _master_table_row_ui['normalization']['mass_density'][ 'text'] = _mass_text _master_table_row_ui['normalization']['mass_density'][ 'button'] = _mass_button # column 18 - packing fraction column += 1 _item = QTableWidgetItem("") self.table_ui.setItem(row, column, _item) # column 19 - shape (cylinder or sphere) column += 1 _layout = QHBoxLayout() _layout.setContentsMargins(0, 0, 0, 0) _widget = QComboBox() _widget.currentIndexChanged.connect( lambda value=_shape_default_value, key=random_key: self.main_window .master_table_normalization_shape_changed(value, key)) _widget.blockSignals(True) _list_ui_to_unlock.append(_widget) _widget.addItem("Cylinder") _widget.addItem("Sphere") _widget.addItem("Hollow Cylinder") _master_table_row_ui['normalization']['shape'] = _widget _layout.addWidget(_widget) _w = QWidget() _w.setLayout(_layout) self.table_ui.setCellWidget(row, column, _w) # column 20 - dimensions column += 1 # layout 1 _grid_layout = QGridLayout() _label1 = QLabel("Radius:") _grid_layout.addWidget(_label1, 1, 0) _value1 = QLabel("N/A") _grid_layout.addWidget(_value1, 1, 1) _dim1 = QLabel("cm") _grid_layout.addWidget(_dim1, 1, 2) _label2 = QLabel("Radius:") _label2.setVisible(False) _grid_layout.addWidget(_label2, 2, 0) _value2 = QLabel("N/A") _value2.setVisible(False) _grid_layout.addWidget(_value2, 2, 1) _dim2 = QLabel("cm") _dim2.setVisible(False) _grid_layout.addWidget(_dim2, 2, 2) _label3 = QLabel("Height:") _grid_layout.addWidget(_label3, 3, 0) _value3 = QLabel("N/A") _grid_layout.addWidget(_value3, 3, 1) _dim3 = QLabel("cm") _grid_layout.addWidget(_dim3, 3, 2) _master_table_row_ui['normalization']['geometry']['radius'][ 'value'] = _value1 _master_table_row_ui['normalization']['geometry']['radius2'][ 'value'] = _value2 _master_table_row_ui['normalization']['geometry']['height'][ 'value'] = _value3 _master_table_row_ui['normalization']['geometry']['radius'][ 'label'] = _label1 _master_table_row_ui['normalization']['geometry']['radius2'][ 'label'] = _label2 _master_table_row_ui['normalization']['geometry']['height'][ 'label'] = _label3 _master_table_row_ui['normalization']['geometry']['radius'][ 'units'] = _dim1 _master_table_row_ui['normalization']['geometry']['radius2'][ 'units'] = _dim2 _master_table_row_ui['normalization']['geometry']['height'][ 'units'] = _dim3 _geometry_widget = QWidget() _geometry_widget.setLayout(_grid_layout) _set_dimensions_button = QPushButton("...") _set_dimensions_button.setFixedHeight(CONFIG_BUTTON_HEIGHT) _set_dimensions_button.setFixedWidth(CONFIG_BUTTON_WIDTH) _verti_layout = QVBoxLayout() _verti_layout.addWidget(_geometry_widget) _verti_layout.addWidget(_set_dimensions_button) _verti_widget = QWidget() _verti_widget.setLayout(_verti_layout) _set_dimensions_button.pressed.connect( lambda key=random_key: self.main_window. master_table_normalization_dimensions_setter_button_pressed( key)) # noqa self.table_ui.setCellWidget(row, column, _verti_widget) # column 21 - abs. correction column += 1 _layout = QHBoxLayout() _layout.setContentsMargins(0, 0, 0, 0) _widget = QComboBox() _widget.currentIndexChanged.connect( lambda value=list_abs_correction[0], key=random_key: self. main_window.master_table_normalization_abs_correction_changed( value, key)) # noqa _widget.blockSignals(True) _list_ui_to_unlock.append(_widget) for _item in list_abs_correction: _widget.addItem(_item) _widget.setCurrentIndex(0) _master_table_row_ui['normalization']['abs_correction'] = _widget _layout.addWidget(_widget) _w = QWidget() _w.setLayout(_layout) self.table_ui.setCellWidget(row, column, _w) # column 24 - multi. scattering correction column += 1 _layout = QHBoxLayout() _layout.setContentsMargins(0, 0, 0, 0) _widget = QComboBox() _widget.currentIndexChanged.connect( lambda value=list_multi_scat_correction[ 0], key=random_key: self.main_window. master_table_normalization_multi_scattering_correction_changed( value, key)) # noqa _widget.blockSignals(True) _list_ui_to_unlock.append(_widget) for _item in list_multi_scat_correction: _widget.addItem(_item) _widget.setCurrentIndex(0) _master_table_row_ui['normalization']['mult_scat_correction'] = _widget _layout.addWidget(_widget) _w = QWidget() _w.setLayout(_layout) self.table_ui.setCellWidget(row, column, _w) # column 22 - inelastic correction column += 1 _layout = QHBoxLayout() _layout.setContentsMargins(0, 0, 0, 0) _widget1 = QComboBox() _widget1.setMinimumHeight(20) list_inelastic_correction = self.get_inelastic_scattering_list( shape=_shape_default_value) for _item in list_inelastic_correction: _widget1.addItem(_item) _widget1.setCurrentIndex(0) _master_table_row_ui['normalization'][ 'inelastic_correction'] = _widget1 _button = QPushButton("...") _button.setFixedWidth(CONFIG_BUTTON_WIDTH) _button.setFixedHeight(CONFIG_BUTTON_HEIGHT) _button.pressed.connect( lambda key=random_key: self.main_window. master_table_normalization_placzek_button_pressed(key)) _master_table_row_ui['normalization']['placzek_button'] = _button _button.setVisible(False) _layout.addWidget(_widget1) _layout.addWidget(_button) _widget = QWidget() _widget.setLayout(_layout) _default_value = 'None' _widget1.currentIndexChanged.connect( lambda value=_default_value, key=random_key: self.main_window. master_table_normalization_inelastic_correction_changed( value, key)) # noqa _widget.blockSignals(True) _list_ui_to_unlock.append(_widget) self.table_ui.setCellWidget(row, column, _widget) # automatically populate placzek infos with default values _norm_formated_placzek_default = self.formated_placzek_default( normalization_placzek_arguments) _master_table_row_ui['normalization'][ 'placzek_infos'] = _norm_formated_placzek_default # column 23 - key/value pair column += 1 _layout = QHBoxLayout() _spacer_kv1 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) _layout.addItem(_spacer_kv1) _button = QPushButton("...") _layout.addWidget(_button) _button.setFixedWidth(CONFIG_BUTTON_WIDTH) _button.setFixedHeight(CONFIG_BUTTON_HEIGHT) _button.pressed.connect(lambda key=random_key: self.main_window. master_table_keyvalue_button_pressed(key)) _new_widget = QWidget() _new_widget.setLayout(_layout) self.table_ui.setCellWidget(row, column, _new_widget) _master_table_row_ui['align_and_focus_args_button'] = _button _spacer_kv2 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) _layout.addItem(_spacer_kv2) _layout.addStretch() align_and_focus_args = self.add_global_key_value_to_local_key_value( align_and_focus_args) _master_table_row_ui[ 'align_and_focus_args_infos'] = align_and_focus_args # Recap. self.main_window.master_table_list_ui[ random_key] = _master_table_row_ui self.unlock_signals_ui(list_ui=_list_ui_to_unlock) self.main_window.check_status_of_right_click_buttons()
def setup_page(self): newcb = self.create_checkbox # --- Introspection --- # Basic features group basic_features_group = QGroupBox(_("Basic features")) completion_box = newcb(_("Enable code completion"), 'code_completion') enable_hover_hints_box = newcb( _("Enable hover hints"), 'enable_hover_hints', tip=_("If enabled, hovering the mouse pointer over an object\n" "name will display that object's signature and/or\n" "docstring (if present).")) goto_definition_box = newcb( _("Enable Go to definition"), 'jedi_definition', tip=_("If enabled, left-clicking on an object name while \n" "pressing the {} key will go to that object's definition\n" "(if resolved).".format(self.CTRL))) follow_imports_box = newcb( _("Follow imports when going to a " "definition"), 'jedi_definition/follow_imports') show_signature_box = newcb(_("Show calltips"), 'jedi_signature_help') basic_features_layout = QVBoxLayout() basic_features_layout.addWidget(completion_box) basic_features_layout.addWidget(enable_hover_hints_box) basic_features_layout.addWidget(goto_definition_box) basic_features_layout.addWidget(follow_imports_box) basic_features_layout.addWidget(show_signature_box) basic_features_group.setLayout(basic_features_layout) # Advanced group advanced_group = QGroupBox(_("Advanced")) modules_textedit = self.create_textedit( _("Preload the following modules to make completion faster " "and more accurate:"), 'preload_modules') if is_dark_interface(): modules_textedit.textbox.setStyleSheet( "border: 1px solid #32414B;") advanced_layout = QVBoxLayout() advanced_layout.addWidget(modules_textedit) advanced_group.setLayout(advanced_layout) # --- Linting --- # Linting options linting_label = QLabel( _("Spyder can optionally highlight syntax " "errors and possible problems with your " "code in the editor.")) linting_label.setOpenExternalLinks(True) linting_label.setWordWrap(True) linting_check = self.create_checkbox(_("Enable basic linting"), 'pyflakes') linting_complexity_box = self.create_checkbox( _("Enable complexity linting with " "the Mccabe package"), 'mccabe') # Linting layout linting_layout = QVBoxLayout() linting_layout.addWidget(linting_label) linting_layout.addWidget(linting_check) linting_layout.addWidget(linting_complexity_box) linting_widget = QWidget() linting_widget.setLayout(linting_layout) # --- Code style tab --- # Code style label pep_url = ( '<a href="https://www.python.org/dev/peps/pep-0008">PEP 8</a>') code_style_codes_url = _( "<a href='http://pycodestyle.pycqa.org/en/stable" "/intro.html#error-codes'>pycodestyle error codes</a>") code_style_label = QLabel( _("Spyder can use pycodestyle to analyze your code for " "conformance to the {} convention. You can also " "manually show or hide specific warnings by their " "{}.").format(pep_url, code_style_codes_url)) code_style_label.setOpenExternalLinks(True) code_style_label.setWordWrap(True) # Code style checkbox code_style_check = self.create_checkbox(_("Enable code style linting"), 'pycodestyle') # Code style options self.code_style_filenames_match = self.create_lineedit( _("Only check filenames matching these patterns:"), 'pycodestyle/filename', alignment=Qt.Horizontal, word_wrap=False, placeholder=_("Check Python files: *.py")) self.code_style_exclude = self.create_lineedit( _("Exclude files or directories matching these patterns:"), 'pycodestyle/exclude', alignment=Qt.Horizontal, word_wrap=False, placeholder=_("Exclude all test files: (?!test_).*\\.py")) code_style_select = self.create_lineedit( _("Show the following errors or warnings:").format( code_style_codes_url), 'pycodestyle/select', alignment=Qt.Horizontal, word_wrap=False, placeholder=_("Example codes: E113, W391")) code_style_ignore = self.create_lineedit( _("Ignore the following errors or warnings:"), 'pycodestyle/ignore', alignment=Qt.Horizontal, word_wrap=False, placeholder=_("Example codes: E201, E303")) code_style_max_line_length = self.create_spinbox( _("Maximum allowed line length:"), None, 'pycodestyle/max_line_length', min_=10, max_=500, step=1, tip=_("Default is 79")) # Code style layout code_style_g_layout = QGridLayout() code_style_g_layout.addWidget(self.code_style_filenames_match.label, 1, 0) code_style_g_layout.addWidget(self.code_style_filenames_match.textbox, 1, 1) code_style_g_layout.addWidget(self.code_style_exclude.label, 2, 0) code_style_g_layout.addWidget(self.code_style_exclude.textbox, 2, 1) code_style_g_layout.addWidget(code_style_select.label, 3, 0) code_style_g_layout.addWidget(code_style_select.textbox, 3, 1) code_style_g_layout.addWidget(code_style_ignore.label, 4, 0) code_style_g_layout.addWidget(code_style_ignore.textbox, 4, 1) code_style_g_layout.addWidget(code_style_max_line_length.plabel, 5, 0) code_style_g_layout.addWidget(code_style_max_line_length.spinbox, 5, 1) # Set Code style options enabled/disabled code_style_g_widget = QWidget() code_style_g_widget.setLayout(code_style_g_layout) code_style_g_widget.setEnabled(self.get_option('pycodestyle')) code_style_check.toggled.connect(code_style_g_widget.setEnabled) # Code style layout code_style_layout = QVBoxLayout() code_style_layout.addWidget(code_style_label) code_style_layout.addWidget(code_style_check) code_style_layout.addWidget(code_style_g_widget) code_style_widget = QWidget() code_style_widget.setLayout(code_style_layout) # --- Docstring tab --- # Docstring style label numpy_url = ("<a href='https://numpydoc.readthedocs.io/en/" "latest/format.html'>Numpy</a>") pep257_url = ( "<a href='https://www.python.org/dev/peps/pep-0257/'>PEP 257</a>") docstring_style_codes = _( "<a href='http://www.pydocstyle.org/en/stable" "/error_codes.html'>page</a>") docstring_style_label = QLabel( _("Here you can decide if you want to perform style analysis on " "your docstrings according to the {} or {} conventions. You can " "also decide if you want to show or ignore specific errors, " "according to the codes found on this {}.").format( numpy_url, pep257_url, docstring_style_codes)) docstring_style_label.setOpenExternalLinks(True) docstring_style_label.setWordWrap(True) # Docstring style checkbox docstring_style_check = self.create_checkbox( _("Enable docstring style linting"), 'pydocstyle') # Docstring style options docstring_style_convention = self.create_combobox( _("Choose the convention used to lint docstrings: "), (("Numpy", 'numpy'), ("PEP 257", 'pep257'), ("Custom", 'custom')), 'pydocstyle/convention') self.docstring_style_select = self.create_lineedit( _("Show the following errors:"), 'pydocstyle/select', alignment=Qt.Horizontal, word_wrap=False, placeholder=_("Example codes: D413, D414")) self.docstring_style_ignore = self.create_lineedit( _("Ignore the following errors:"), 'pydocstyle/ignore', alignment=Qt.Horizontal, word_wrap=False, placeholder=_("Example codes: D107, D402")) self.docstring_style_match = self.create_lineedit( _("Only check filenames matching these patterns:"), 'pydocstyle/match', alignment=Qt.Horizontal, word_wrap=False, placeholder=_("Skip test files: (?!test_).*\\.py")) self.docstring_style_match_dir = self.create_lineedit( _("Only check in directories matching these patterns:"), 'pydocstyle/match_dir', alignment=Qt.Horizontal, word_wrap=False, placeholder=_("Skip dot directories: [^\\.].*")) # Custom option handling docstring_style_convention.combobox.currentTextChanged.connect( self.setup_docstring_style_convention) current_convention = docstring_style_convention.combobox.currentText() self.setup_docstring_style_convention(current_convention) # Docstring style layout docstring_style_g_layout = QGridLayout() docstring_style_g_layout.addWidget(docstring_style_convention.label, 1, 0) docstring_style_g_layout.addWidget(docstring_style_convention.combobox, 1, 1) docstring_style_g_layout.addWidget(self.docstring_style_select.label, 2, 0) docstring_style_g_layout.addWidget(self.docstring_style_select.textbox, 2, 1) docstring_style_g_layout.addWidget(self.docstring_style_ignore.label, 3, 0) docstring_style_g_layout.addWidget(self.docstring_style_ignore.textbox, 3, 1) docstring_style_g_layout.addWidget(self.docstring_style_match.label, 4, 0) docstring_style_g_layout.addWidget(self.docstring_style_match.textbox, 4, 1) docstring_style_g_layout.addWidget( self.docstring_style_match_dir.label, 5, 0) docstring_style_g_layout.addWidget( self.docstring_style_match_dir.textbox, 5, 1) # Set Docstring style options enabled/disabled docstring_style_g_widget = QWidget() docstring_style_g_widget.setLayout(docstring_style_g_layout) docstring_style_g_widget.setEnabled(self.get_option('pydocstyle')) docstring_style_check.toggled.connect( docstring_style_g_widget.setEnabled) # Docstring style layout docstring_style_layout = QVBoxLayout() docstring_style_layout.addWidget(docstring_style_label) docstring_style_layout.addWidget(docstring_style_check) docstring_style_layout.addWidget(docstring_style_g_widget) docstring_style_widget = QWidget() docstring_style_widget.setLayout(docstring_style_layout) # --- Advanced tab --- # Advanced label advanced_label = QLabel( _("<b>Warning</b>: Only modify these values if " "you know what you're doing!")) advanced_label.setWordWrap(True) advanced_label.setAlignment(Qt.AlignJustify) # Advanced options self.advanced_command_launch = self.create_lineedit( _("Command to launch the Python language server: "), 'advanced/command_launch', alignment=Qt.Horizontal, word_wrap=False) self.advanced_host = self.create_lineedit( _("IP Address and port to bind the server to: "), 'advanced/host', alignment=Qt.Horizontal, word_wrap=False) self.advanced_port = self.create_spinbox(":", "", 'advanced/port', min_=1, max_=65535, step=1) self.external_server = self.create_checkbox( _("This is an external server"), 'advanced/external') self.use_stdio = self.create_checkbox( _("Use stdio pipes to communicate with server"), 'advanced/stdio') self.use_stdio.stateChanged.connect(self.disable_tcp) self.external_server.stateChanged.connect(self.disable_stdio) # Advanced layout advanced_g_layout = QGridLayout() advanced_g_layout.addWidget(self.advanced_command_launch.label, 1, 0) advanced_g_layout.addWidget(self.advanced_command_launch.textbox, 1, 1) advanced_g_layout.addWidget(self.advanced_host.label, 2, 0) advanced_host_port_g_layout = QGridLayout() advanced_host_port_g_layout.addWidget(self.advanced_host.textbox, 1, 0) advanced_host_port_g_layout.addWidget(self.advanced_port.plabel, 1, 1) advanced_host_port_g_layout.addWidget(self.advanced_port.spinbox, 1, 2) advanced_g_layout.addLayout(advanced_host_port_g_layout, 2, 1) advanced_widget = QWidget() advanced_layout = QVBoxLayout() advanced_layout.addWidget(advanced_label) advanced_layout.addSpacing(12) advanced_layout.addLayout(advanced_g_layout) advanced_layout.addWidget(self.external_server) advanced_layout.addWidget(self.use_stdio) advanced_widget.setLayout(advanced_layout) # --- Other servers tab --- # Section label servers_label = QLabel( _("Spyder uses the <a href=\"{lsp_url}\">Language Server " "Protocol</a> to provide code completion and linting " "for its Editor. Here, you can setup and configure LSP servers " "for languages other than Python, so Spyder can provide such " "features for those languages as well.").format(lsp_url=LSP_URL)) servers_label.setOpenExternalLinks(True) servers_label.setWordWrap(True) servers_label.setAlignment(Qt.AlignJustify) # Servers table table_group = QGroupBox(_('Available servers:')) self.table = LSPServerTable(self, text_color=ima.MAIN_FG_COLOR) self.table.setMaximumHeight(150) table_layout = QVBoxLayout() table_layout.addWidget(self.table) table_group.setLayout(table_layout) # Buttons self.reset_btn = QPushButton(_("Reset to default values")) self.new_btn = QPushButton(_("Set up a new server")) self.delete_btn = QPushButton(_("Delete currently selected server")) self.delete_btn.setEnabled(False) # Slots connected to buttons self.new_btn.clicked.connect(self.create_new_server) self.reset_btn.clicked.connect(self.reset_to_default) self.delete_btn.clicked.connect(self.delete_server) # Buttons layout btns = [self.new_btn, self.delete_btn, self.reset_btn] buttons_layout = QGridLayout() for i, btn in enumerate(btns): buttons_layout.addWidget(btn, i, 1) buttons_layout.setColumnStretch(0, 1) buttons_layout.setColumnStretch(1, 2) buttons_layout.setColumnStretch(2, 1) # Combined layout servers_widget = QWidget() servers_layout = QVBoxLayout() servers_layout.addSpacing(-10) servers_layout.addWidget(servers_label) servers_layout.addWidget(table_group) servers_layout.addSpacing(10) servers_layout.addLayout(buttons_layout) servers_widget.setLayout(servers_layout) # --- Tabs organization --- tabs = QTabWidget() tabs.addTab(self.create_tab(basic_features_group, advanced_group), _('Introspection')) tabs.addTab(self.create_tab(linting_widget), _('Linting')) tabs.addTab(self.create_tab(code_style_widget), _('Code style')) tabs.addTab(self.create_tab(docstring_style_widget), _('Docstring style')) tabs.addTab(self.create_tab(advanced_widget), _('Advanced')) tabs.addTab(self.create_tab(servers_widget), _('Other languages')) vlayout = QVBoxLayout() vlayout.addWidget(tabs) self.setLayout(vlayout)
def __init__(self, parent, enable_replace=False): QWidget.__init__(self, parent) self.enable_replace = enable_replace self.editor = None self.is_code_editor = None glayout = QGridLayout() glayout.setContentsMargins(0, 0, 0, 0) self.setLayout(glayout) self.close_button = create_toolbutton( self, triggered=self.hide, icon=ima.icon('DialogCloseButton')) glayout.addWidget(self.close_button, 0, 0) # Find layout self.search_text = PatternComboBox(self, tip=_("Search string"), adjust_to_minimum=False) self.return_shift_pressed.connect( lambda: self.find(changed=False, forward=False, rehighlight=False, multiline_replace_check=False)) self.return_pressed.connect( lambda: self.find(changed=False, forward=True, rehighlight=False, multiline_replace_check=False)) self.search_text.lineEdit().textEdited.connect( self.text_has_been_edited) self.number_matches_text = QLabel(self) self.previous_button = create_toolbutton(self, triggered=self.find_previous, icon=ima.icon('ArrowUp')) self.next_button = create_toolbutton(self, triggered=self.find_next, icon=ima.icon('ArrowDown')) self.next_button.clicked.connect(self.update_search_combo) self.previous_button.clicked.connect(self.update_search_combo) self.re_button = create_toolbutton(self, icon=ima.icon('advanced'), tip=_("Regular expression")) self.re_button.setCheckable(True) self.re_button.toggled.connect(lambda state: self.find()) self.case_button = create_toolbutton(self, icon=get_icon("upper_lower.png"), tip=_("Case Sensitive")) self.case_button.setCheckable(True) self.case_button.toggled.connect(lambda state: self.find()) self.words_button = create_toolbutton(self, icon=get_icon("whole_words.png"), tip=_("Whole words")) self.words_button.setCheckable(True) self.words_button.toggled.connect(lambda state: self.find()) self.highlight_button = create_toolbutton( self, icon=get_icon("highlight.png"), tip=_("Highlight matches")) self.highlight_button.setCheckable(True) self.highlight_button.toggled.connect(self.toggle_highlighting) hlayout = QHBoxLayout() self.widgets = [ self.close_button, self.search_text, self.number_matches_text, self.previous_button, self.next_button, self.re_button, self.case_button, self.words_button, self.highlight_button ] for widget in self.widgets[1:]: hlayout.addWidget(widget) glayout.addLayout(hlayout, 0, 1) # Replace layout replace_with = QLabel(_("Replace with:")) self.replace_text = PatternComboBox(self, adjust_to_minimum=False, tip=_('Replace string')) self.replace_text.valid.connect( lambda _: self.replace_find(focus_replace_text=True)) self.replace_button = create_toolbutton( self, text=_('Replace/find next'), icon=ima.icon('DialogApplyButton'), triggered=self.replace_find, text_beside_icon=True) self.replace_sel_button = create_toolbutton( self, text=_('Replace selection'), icon=ima.icon('DialogApplyButton'), triggered=self.replace_find_selection, text_beside_icon=True) self.replace_sel_button.clicked.connect(self.update_replace_combo) self.replace_sel_button.clicked.connect(self.update_search_combo) self.replace_all_button = create_toolbutton( self, text=_('Replace all'), icon=ima.icon('DialogApplyButton'), triggered=self.replace_find_all, text_beside_icon=True) self.replace_all_button.clicked.connect(self.update_replace_combo) self.replace_all_button.clicked.connect(self.update_search_combo) self.replace_layout = QHBoxLayout() widgets = [ replace_with, self.replace_text, self.replace_button, self.replace_sel_button, self.replace_all_button ] for widget in widgets: self.replace_layout.addWidget(widget) glayout.addLayout(self.replace_layout, 1, 1) self.widgets.extend(widgets) self.replace_widgets = widgets self.hide_replace() self.search_text.setTabOrder(self.search_text, self.replace_text) self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) self.shortcuts = self.create_shortcuts(parent) self.highlight_timer = QTimer(self) self.highlight_timer.setSingleShot(True) self.highlight_timer.setInterval(1000) self.highlight_timer.timeout.connect(self.highlight_matches) self.search_text.installEventFilter(self)
def __init__(self, parent=None, *, dir_path=""): super().__init__(parent) self.__dir_path = "" self.__save_tiff = True self.__save_txt = False self.__interpolate_on = False self.__quant_norm_on = False self.__dset_list = [] self.__dset_sel = 0 self.__scaler_list = [] self.__scaler_sel = 0 self.setWindowTitle("Export XRF Maps to TIFF and/or TXT Files") self.setMinimumHeight(600) self.setMinimumWidth(600) self.resize(600, 600) self.te_saved_files = QTextEdit() set_tooltip( self.te_saved_files, "The list of <b>data file groups</b> about to be created.") self.te_saved_files.setReadOnly(True) self.combo_select_dataset = QComboBox() self.combo_select_dataset.currentIndexChanged.connect( self.combo_select_dataset_current_index_changed) self._fill_dataset_combo() set_tooltip( self.combo_select_dataset, "Select <b>dataset</b>. Initially, the selection matches the dataset activated " "in <b>XRF Maps</b> tab, but the selection may be changed if different dataset " "needs to be saved.", ) self.combo_normalization = QComboBox() self.combo_normalization.currentIndexChanged.connect( self.combo_normalization_current_index_changed) self._fill_scaler_combo() set_tooltip( self.combo_normalization, "Select <b>scaler</b> used for data normalization. Initially, the selection matches " "the scaler activated in <b>XRF Maps</b> tab, but the selection may be changed " "if needed", ) self.cb_interpolate = QCheckBox("Interpolate to uniform grid") self.cb_interpolate.setChecked( Qt.Checked if self.__interpolate_on else Qt.Unchecked) self.cb_interpolate.stateChanged.connect( self.cb_interpolate_state_changed) set_tooltip( self.cb_interpolate, "Interpolate pixel coordinates to <b>uniform grid</b>. The initial choice is " "copied from <b>XRF Maps</b> tab.", ) self.cb_quantitative = QCheckBox("Quantitative normalization") self.cb_quantitative.setChecked( Qt.Checked if self.__quant_norm_on else Qt.Unchecked) self.cb_quantitative.stateChanged.connect( self.cb_quantitative_state_changed) set_tooltip( self.cb_quantitative, "Apply <b>quantitative normalization</b> before saving the maps. " "The initial choice is copied from <b>XRF Maps</b> tab.", ) self.group_settings = QGroupBox( "Settings (selections from XRF Maps tab)") grid = QGridLayout() grid.addWidget(self.combo_select_dataset, 0, 0) grid.addWidget(self.combo_normalization, 0, 1) grid.addWidget(self.cb_interpolate, 1, 0) grid.addWidget(self.cb_quantitative, 1, 1) self.group_settings.setLayout(grid) self.le_dir_path = LineEditReadOnly() set_tooltip( self.le_dir_path, "<b>Root directory</b> for saving TIFF and TXT files. The files will be saved " "in subdirectories inside the root directory.", ) self.pb_dir_path = PushButtonMinimumWidth("..") set_tooltip(self.pb_dir_path, "Change to <b>root directory</b> for TIFF and TXT files.") self.pb_dir_path.clicked.connect(self.pb_dir_path_clicked) self.pb_dir_path.setDefault(False) self.pb_dir_path.setAutoDefault(False) self.cb_save_tiff = QCheckBox("Save TIFF") set_tooltip(self.cb_save_tiff, "Save XRF Maps as <b>TIFF</b> files.") self.cb_save_tiff.setChecked( Qt.Checked if self.__save_tiff else Qt.Unchecked) self.cb_save_tiff.stateChanged.connect(self.cb_save_tiff_state_changed) self.cb_save_txt = QCheckBox("Save TXT") self.cb_save_txt.setChecked( Qt.Checked if self.__save_txt else Qt.Unchecked) set_tooltip(self.cb_save_txt, "Save XRF Maps as <b>TXT</b> files.") self.cb_save_txt.stateChanged.connect(self.cb_save_txt_state_changed) vbox = QVBoxLayout() hbox = QHBoxLayout() hbox.addWidget(self.group_settings) hbox.addStretch(1) vbox.addLayout(hbox) hbox = QHBoxLayout() hbox.addWidget( QLabel("The following groups of files will be created:")) hbox.addStretch(1) vbox.addLayout(hbox) vbox.addWidget(self.te_saved_files) hbox = QHBoxLayout() hbox.addWidget(QLabel("Directory: ")) hbox.addWidget(self.pb_dir_path) hbox.addWidget(self.le_dir_path) vbox.addLayout(hbox) self.button_box = QDialogButtonBox(QDialogButtonBox.Save | QDialogButtonBox.Cancel) self.pb_save = self.button_box.button(QDialogButtonBox.Save) self.pb_save.setDefault(False) self.pb_save.setAutoDefault(False) self.pb_cancel = self.button_box.button(QDialogButtonBox.Cancel) self.pb_cancel.setDefault(True) self.pb_cancel.setAutoDefault(True) self.button_box.accepted.connect(self.accept) self.button_box.rejected.connect(self.reject) hbox = QHBoxLayout() hbox.addStretch(1) hbox.addWidget(self.cb_save_tiff) hbox.addWidget(self.cb_save_txt) hbox.addStretch(1) hbox.addWidget(self.button_box) vbox.addLayout(hbox) self.setLayout(vbox) # Set and display file path dir_path = os.path.expanduser(dir_path) self.dir_path = dir_path self._update_pb_save() self._update_saved_file_groups()
def setup_page(self): self.ICON = ima.icon('eyedropper') names = self.get_option("names") try: names.pop(names.index(u'Custom')) except ValueError: pass custom_names = self.get_option("custom_names", []) # Interface options theme_group = QGroupBox(_("Main interface")) # Interface Widgets ui_themes = ['Automatic', 'Light', 'Dark'] ui_theme_choices = list( zip(ui_themes, [ui_theme.lower() for ui_theme in ui_themes])) ui_theme_combo = self.create_combobox(_('Interface theme'), ui_theme_choices, 'ui_theme', restart=True) styles = [str(txt) for txt in list(QStyleFactory.keys())] # Don't offer users the possibility to change to a different # style in Gtk-based desktops # See spyder-ide/spyder#2036. if is_gtk_desktop() and ('GTK+' in styles): styles = ['GTK+'] choices = list(zip(styles, [style.lower() for style in styles])) style_combo = self.create_combobox(_('Qt windows style'), choices, 'windows_style', default=self.main.default_style) self.style_combobox = style_combo.combobox themes = ['Spyder 2', 'Spyder 3'] icon_choices = list(zip(themes, [theme.lower() for theme in themes])) icons_combo = self.create_combobox(_('Icon theme'), icon_choices, 'icon_theme', restart=True) theme_comboboxes_layout = QGridLayout() theme_comboboxes_layout.addWidget(ui_theme_combo.label, 0, 0) theme_comboboxes_layout.addWidget(ui_theme_combo.combobox, 0, 1) theme_comboboxes_layout.addWidget(style_combo.label, 1, 0) theme_comboboxes_layout.addWidget(self.style_combobox, 1, 1) theme_comboboxes_layout.addWidget(icons_combo.label, 2, 0) theme_comboboxes_layout.addWidget(icons_combo.combobox, 2, 1) theme_layout = QVBoxLayout() theme_layout.addLayout(theme_comboboxes_layout) theme_group.setLayout(theme_layout) # Syntax coloring options syntax_group = QGroupBox(_("Syntax highlighting theme")) # Syntax Widgets edit_button = QPushButton(_("Edit selected scheme")) create_button = QPushButton(_("Create new scheme")) self.delete_button = QPushButton(_("Delete scheme")) self.reset_button = QPushButton(_("Reset to defaults")) self.preview_editor = CodeEditor(self) self.stacked_widget = QStackedWidget(self) self.scheme_editor_dialog = SchemeEditor(parent=self, stack=self.stacked_widget) self.scheme_choices_dict = {} schemes_combobox_widget = self.create_combobox('', [('', '')], 'selected') self.schemes_combobox = schemes_combobox_widget.combobox # Syntax layout syntax_layout = QGridLayout(syntax_group) btns = [ self.schemes_combobox, edit_button, self.reset_button, create_button, self.delete_button ] for i, btn in enumerate(btns): syntax_layout.addWidget(btn, i, 1) syntax_layout.setColumnStretch(0, 1) syntax_layout.setColumnStretch(1, 2) syntax_layout.setColumnStretch(2, 1) syntax_layout.setContentsMargins(0, 12, 0, 12) # Fonts options fonts_group = QGroupBox(_("Fonts")) # Fonts widgets plain_text_font = self.create_fontgroup( option='font', title=_("Plain text"), fontfilters=QFontComboBox.MonospacedFonts, without_group=True) rich_text_font = self.create_fontgroup(option='rich_font', title=_("Rich text"), without_group=True) # Fonts layouts fonts_layout = QGridLayout(fonts_group) fonts_layout.addWidget(plain_text_font.fontlabel, 0, 0) fonts_layout.addWidget(plain_text_font.fontbox, 0, 1) fonts_layout.addWidget(plain_text_font.sizelabel, 0, 2) fonts_layout.addWidget(plain_text_font.sizebox, 0, 3) fonts_layout.addWidget(rich_text_font.fontlabel, 1, 0) fonts_layout.addWidget(rich_text_font.fontbox, 1, 1) fonts_layout.addWidget(rich_text_font.sizelabel, 1, 2) fonts_layout.addWidget(rich_text_font.sizebox, 1, 3) fonts_layout.setRowStretch(fonts_layout.rowCount(), 1) # Left options layout options_layout = QVBoxLayout() options_layout.addWidget(theme_group) options_layout.addWidget(syntax_group) options_layout.addWidget(fonts_group) # Right preview layout preview_group = QGroupBox(_("Preview")) preview_layout = QVBoxLayout() preview_layout.addWidget(self.preview_editor) preview_group.setLayout(preview_layout) # Combined layout combined_layout = QGridLayout() combined_layout.setRowStretch(0, 1) combined_layout.setColumnStretch(1, 100) combined_layout.addLayout(options_layout, 0, 0) combined_layout.addWidget(preview_group, 0, 1) self.setLayout(combined_layout) # Signals and slots create_button.clicked.connect(self.create_new_scheme) edit_button.clicked.connect(self.edit_scheme) self.reset_button.clicked.connect(self.reset_to_default) self.delete_button.clicked.connect(self.delete_scheme) self.schemes_combobox.currentIndexChanged.connect(self.update_preview) self.schemes_combobox.currentIndexChanged.connect(self.update_buttons) # Setup for name in names: self.scheme_editor_dialog.add_color_scheme_stack(name) for name in custom_names: self.scheme_editor_dialog.add_color_scheme_stack(name, custom=True) self.update_combobox() self.update_preview() self.update_qt_style_combobox()
def __init__(self, filetype, filename): super().__init__() from BiblesSqlite import Bible self.fontDatabase = QFontDatabase() self.filetype = filetype self.filename = filename self.setWindowTitle(config.thisTranslation["modify_database"]) self.layout = QVBoxLayout() self.setMinimumWidth(300) if filetype == "bible": self.bible = Bible(filename) self.bible.addMissingColumns() (fontName, fontSize) = self.bible.getFontInfo() if fontName is None: fontName = "" if fontSize is None: fontSize = "" self.layout.addWidget( QLabel("{0}: {1}".format(config.thisTranslation["name"], filename))) row = QHBoxLayout() row.addWidget( QLabel("{0}: ".format(config.thisTranslation["title"]))) self.bibleTitle = QLineEdit() self.bibleTitle.setText(self.bible.bibleInfo()) self.bibleTitle.setMaxLength(100) row.addWidget(self.bibleTitle) self.layout.addLayout(row) grid = QGridLayout() self.builtinFonts = [""] + self.fontDatabase.families() try: index = self.builtinFonts.index( fontName.replace(".builtin", "")) except: index = 0 self.useBuiltinFont = QRadioButton() self.useBuiltinFont.clicked.connect( lambda: self.selectRadio("builtin")) grid.addWidget(self.useBuiltinFont, 0, 0) grid.addWidget(QLabel("{0}: ".format("Built-in font")), 0, 1) self.builtinFontList = QComboBox() self.builtinFontList.addItems(self.builtinFonts) self.builtinFontList.setCurrentIndex(index) grid.addWidget(self.builtinFontList, 0, 2) fonts = sorted(glob.glob(r"htmlResources/fonts/*.*")) self.fontFiles = [''] + [os.path.basename(font) for font in fonts] try: index = self.fontFiles.index(fontName) except: index = 0 row = QHBoxLayout() self.useFileFont = QRadioButton() self.useFileFont.clicked.connect(lambda: self.selectRadio("file")) grid.addWidget(self.useFileFont, 1, 0) row.addStretch(1) grid.addWidget(QLabel("{0}: ".format("Font file")), 1, 1) self.fileFontList = QComboBox() self.fileFontList.addItems(self.fontFiles) self.fileFontList.setCurrentIndex(index) grid.addWidget(self.fileFontList, 1, 2) self.layout.addLayout(grid) else: self.layout.addWidget( QLabel("{0} is not supported".format(filetype))) row = QHBoxLayout() row.addWidget( QLabel("{0}: ".format(config.thisTranslation["menu2_fontSize"]))) self.fontSize = QLineEdit() self.fontSize.setText(fontSize) self.fontSize.setMaxLength(20) row.addWidget(self.fontSize) self.layout.addLayout(row) self.languageCodes = ["" ] + [value for value in Languages.code.values()] row = QHBoxLayout() row.addWidget( QLabel("{0}: ".format(config.thisTranslation["menu_language"]))) self.languageList = QComboBox() row.addWidget(self.languageList) self.languageList.addItems(self.languageCodes) self.languageList.setCurrentIndex( self.languageCodes.index(self.bible.getLanguage())) self.layout.addLayout(row) buttons = QDialogButtonBox.Ok | QDialogButtonBox.Cancel self.buttonBox = QDialogButtonBox(buttons) self.buttonBox.accepted.connect(self.save) self.buttonBox.accepted.connect(self.accept) self.buttonBox.rejected.connect(self.reject) self.layout.addWidget(self.buttonBox) self.setLayout(self.layout) if ".ttf" in fontName: self.selectRadio("file") else: self.selectRadio("builtin")