class NewPBDialog(TimerDialog): """ Dialog showing a message congratulating the user on a new PB. The dialog has an 'Ok' button, but will also timeout after a few milliseconds. Parameters ---------- timeout : int Number of milliseconds for the dialog to be shown. Default is 3000. """ def __init__(self, timeout=3000): super().__init__(timeout=timeout) self.label = QLabel() font = self.label.font() font.setPointSize(14) self.label.setFont(font) self.buttonBox = QDialogButtonBox(QDialogButtonBox.Ok) self.okButton = self.buttonBox.button(QDialogButtonBox.Ok) self.okButton.clicked.connect(self.accept) self.layout = QVBoxLayout() self.layout.addWidget(self.label) self.layout.addWidget(self.buttonBox) self.setLayout(self.layout) self.setWindowTitle("New personal best") def setMessage(self, text): self.label.setText(text)
class UILoadingDialog(object): def __init__(self): self.layout = self.waiting = self.label = None def setup_ui(self, dialog): dialog.setObjectName("Dialog") dialog.resize(600, 200) dialog.setModal(True) self.layout = QHBoxLayout(dialog) self.layout.setObjectName("hbox_layout") self.waiting = QtWaitingSpinner(dialog, centerOnParent=False) self.waiting.setObjectName("waiting") self.label = QLabel('Loading model result...') font = self.label.font() font.setPointSize(16) self.label.setFont(font) self.label.setStyleSheet("QLabel { color : black; }") self.layout.addWidget(self.waiting) self.layout.addWidget(self.label) QMetaObject.connectSlotsByName(dialog)
class Application(QApplication): def __init__(self, argv): # call the parent (QApplication) constructor super().__init__(argv) # create the main window self.window = QMainWindow() # create a label to hold our text self.label = QLabel(text="Hello world!", ) # set the label to align in the center self.label.setAlignment( QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter ) # get the current font and make it a little bigger font = self.label.font() font.setPointSize(24) # reapply the font to the label self.label.setFont(font) # add our label to the central widget of the window self.window.setCentralWidget(self.label) # display the main window self.window.show()
class FitParam(object): def __init__( self, name, value, min, max, logscale=False, steps=5000, format="%.3f", size_offset=0, unit="", ): self.name = name self.value = value self.min = min self.max = max self.logscale = logscale self.steps = steps self.format = format self.unit = unit self.prefix_label = None self.lineedit = None self.unit_label = None self.slider = None self.button = None self._widgets = [] self._size_offset = size_offset self._refresh_callback = None self.dataset = FitParamDataSet(title=_("Curve fitting parameter")) def copy(self): """Return a copy of this fitparam""" return self.__class__( self.name, self.value, self.min, self.max, self.logscale, self.steps, self.format, self._size_offset, self.unit, ) def create_widgets(self, parent, refresh_callback): self._refresh_callback = refresh_callback self.prefix_label = QLabel() font = self.prefix_label.font() font.setPointSize(font.pointSize() + self._size_offset) self.prefix_label.setFont(font) self.button = QPushButton() self.button.setIcon(get_icon("settings.png")) self.button.setToolTip( _("Edit '%s' fit parameter properties") % self.name) self.button.clicked.connect(lambda: self.edit_param(parent)) self.lineedit = QLineEdit() self.lineedit.editingFinished.connect(self.line_editing_finished) self.unit_label = QLabel(self.unit) self.slider = QSlider() self.slider.setOrientation(Qt.Horizontal) self.slider.setRange(0, self.steps - 1) self.slider.valueChanged.connect(self.slider_value_changed) self.update(refresh=False) self.add_widgets([ self.prefix_label, self.lineedit, self.unit_label, self.slider, self.button, ]) def add_widgets(self, widgets): self._widgets += widgets def get_widgets(self): return self._widgets def set_scale(self, state): self.logscale = state > 0 self.update_slider_value() def set_text(self, fmt=None): style = "<span style='color: #444444'><b>%s</b></span>" self.prefix_label.setText(style % self.name) if self.value is None: value_str = "" else: if fmt is None: fmt = self.format value_str = fmt % self.value self.lineedit.setText(value_str) self.lineedit.setDisabled(self.value == self.min and self.max == self.min) def line_editing_finished(self): try: self.value = float(self.lineedit.text()) except ValueError: self.set_text() self.update_slider_value() self._refresh_callback() def slider_value_changed(self, int_value): if self.logscale: total_delta = np.log10(1 + self.max - self.min) self.value = (self.min + 10**(total_delta * int_value / (self.steps - 1)) - 1) else: total_delta = self.max - self.min self.value = self.min + total_delta * int_value / (self.steps - 1) self.set_text() self._refresh_callback() def update_slider_value(self): if self.value is None or self.min is None or self.max is None: self.slider.setEnabled(False) if self.slider.parent() and self.slider.parent().isVisible(): self.slider.show() elif self.value == self.min and self.max == self.min: self.slider.hide() else: self.slider.setEnabled(True) if self.slider.parent() and self.slider.parent().isVisible(): self.slider.show() if self.logscale: value_delta = max([np.log10(1 + self.value - self.min), 0.0]) total_delta = np.log10(1 + self.max - self.min) else: value_delta = self.value - self.min total_delta = self.max - self.min intval = int(self.steps * value_delta / total_delta) self.slider.blockSignals(True) self.slider.setValue(intval) self.slider.blockSignals(False) def edit_param(self, parent): update_dataset(self.dataset, self) if self.dataset.edit(parent=parent): restore_dataset(self.dataset, self) if self.value > self.max: self.max = self.value if self.value < self.min: self.min = self.value self.update() def update(self, refresh=True): self.unit_label.setText(self.unit) self.slider.setRange(0, self.steps - 1) self.update_slider_value() self.set_text() if refresh: self._refresh_callback()
def setup_page(self): if ERR_MSG: label = QLabel(_("Could not load plugin:\n{0}".format(ERR_MSG))) layout = QVBoxLayout() layout.addWidget(label) self.setLayout(layout) return # Layout parameter indent = QCheckBox().sizeHint().width() # General options options_group = QGroupBox(_("Options")) # Hack : the spinbox widget will be added to self.spinboxes spinboxes_before = set(self.spinboxes) passes_spin = self.create_spinbox( _("Number of pep8 passes: "), "", 'passes', default=0, min_=0, max_=1000000, step=1) spinbox = set(self.spinboxes) - spinboxes_before spinbox = spinbox.pop() spinbox.setSpecialValueText(_("Infinite")) aggressive1_checkbox = self.create_checkbox( "Aggressivity level 1", "aggressive1", default=False) aggressive1_label = QLabel(_( "Allow possibly unsafe fixes (E711 and W6), shorten lines" " and remove trailing whitespace more aggressively (in" " docstrings and multiline strings).")) aggressive1_label.setWordWrap(True) aggressive1_label.setIndent(indent) font_description = aggressive1_label.font() font_description.setPointSizeF(font_description.pointSize() * 0.9) aggressive1_label.setFont(font_description) aggressive2_checkbox = self.create_checkbox( "Aggressivity level 2", "aggressive2", default=False) aggressive2_label = QLabel(_( "Allow more possibly unsafe fixes (E712) and shorten lines.")) aggressive2_label.setWordWrap(True) aggressive2_label.setIndent(indent) aggressive2_label.setFont(font_description) aggressive1_checkbox.toggled.connect( aggressive2_checkbox.setEnabled) aggressive1_checkbox.toggled.connect( aggressive2_label.setEnabled) aggressive2_checkbox.setEnabled(aggressive1_checkbox.isChecked()) aggressive2_label.setEnabled(aggressive1_checkbox.isChecked()) # Enable/disable error codes fix_layout = QVBoxLayout() last_group = "" FIX_LIST.sort(key=lambda item: item[0][1]) for code, description in FIX_LIST: # Create a new group if necessary if code[1] != last_group: last_group = code[1] group = QGroupBox(_(self.GROUPS.get(code[1], ""))) fix_layout.addWidget(group) group_layout = QVBoxLayout(group) # Checkbox for the option text = code default = True if code in DEFAULT_IGNORE: text += _(" (UNSAFE)") default = False option = self.create_checkbox(text, code, default=default) # Label for description if code in self.CODES: label = QLabel("{autopep8} ({pep8}).".format( autopep8=_(description).rstrip("."), pep8=self.CODES[code])) else: label = QLabel(_(description)) label.setWordWrap(True) label.setIndent(indent) label.setFont(font_description) # Add widgets to layout option_layout = QVBoxLayout() option_layout.setSpacing(0) option_layout.addWidget(option) option_layout.addWidget(label) group_layout.addLayout(option_layout) # Special cases if code in ("E711", "W6"): aggressive1_checkbox.toggled.connect(option.setEnabled) aggressive1_checkbox.toggled.connect(label.setEnabled) option.setEnabled(aggressive1_checkbox.isChecked()) label.setEnabled(aggressive1_checkbox.isChecked()) if code == "E712": def e712_enabled(): enabled = (aggressive1_checkbox.isChecked() and aggressive2_checkbox.isChecked()) option.setEnabled(enabled) label.setEnabled(enabled) aggressive1_checkbox.toggled.connect(e712_enabled) aggressive2_checkbox.toggled.connect(e712_enabled) e712_enabled() # General layout aggressive2_layout = QVBoxLayout() margins = aggressive2_layout.contentsMargins() margins.setLeft(indent) aggressive2_layout.setContentsMargins(margins) aggressive2_layout.addWidget(aggressive2_checkbox) aggressive2_layout.addWidget(aggressive2_label) options_layout = QVBoxLayout() options_layout.addWidget(passes_spin) options_layout.addWidget(aggressive1_checkbox) options_layout.addWidget(aggressive1_label) options_layout.addLayout(aggressive2_layout) options_group.setLayout(options_layout) widget_scroll = QWidget() widget_scroll.setLayout(fix_layout) fix_scroll = QScrollArea() fix_scroll.setWidget(widget_scroll) fix_scroll.setWidgetResizable(True) fig_out_layout = QVBoxLayout() fig_out_layout.addWidget(fix_scroll, 1) fix_group = QGroupBox(_("Errors/warnings to fix")) fix_group.setLayout(fig_out_layout) vlayout = QVBoxLayout() vlayout.addWidget(options_group) vlayout.addWidget(fix_group, 1) self.setLayout(vlayout)
class ImageQualityPanel(QWidget): """ The image quality panel is a Widget in the user interface that shows visually how high the image quality is at the moment. """ def __init__(self, napari_viewer: Viewer): super().__init__(napari_viewer.window.qt_viewer) self._viewer = napari_viewer self.setObjectName("Image quality") # setup user interface self.label = QLabel("0") font = self.label.font() font.setPointSize(30) self.label.setFont(font) self.reset_button = QPushButton("Reset") self.reset_button.clicked.connect(self._reset) self.setLayout(QHBoxLayout(self)) self.layout().addWidget(self.label) self.layout().addWidget(self.reset_button) self.layout().addStretch() # initial state self._reset() # threading # https://napari.org/guides/stable/threading.html @thread_worker def loop_run(): while True: # endless loop # get currently active layer selected_layers = self._viewer.layers.selection if len(selected_layers) > 0: # measure quality and update GUI quality = determine_quality(selected_layers.active.data) self._update_quality(quality) time.sleep(0.1) yield # Start the loop worker = loop_run() worker.start() def _reset(self): self.best_quality = 0 def _update_quality(self, quality): """ Updates the image quality display """ if self.best_quality < quality: self.best_quality = quality # put current quality in label self.label.setText(str(quality)[0:5]) # color label according to quality ratio_to_best = quality / self.best_quality if ratio_to_best > 0.9: self.label.setStyleSheet("QLabel { color : green }") elif ratio_to_best > 0.5: self.label.setStyleSheet("QLabel { color : yellow }") else: self.label.setStyleSheet("QLabel { color : red }")
class VizTabs(QTabWidget): def __init__(self, parent=None): self._parent = parent super().__init__(parent) self.oneDViewer = None self.strainSliceViewer = None self.vtk3dviewer = None self.plot_1d = QStackedWidget() self.plot_2d = QStackedWidget() self.plot_3d = QStackedWidget() self.message = QLabel("Load project files") self.message.setAlignment(Qt.AlignCenter) font = self.message.font() font.setPointSize(20) self.message.setFont(font) self.message2 = QLabel("Load project files") self.message2.setAlignment(Qt.AlignCenter) self.message2.setFont(font) self.plot_2d.addWidget(self.message) self.plot_3d.addWidget(self.message2) self.addTab(self.plot_1d, "1D") self.addTab(self.plot_2d, "2D") self.addTab(self.plot_3d, "3D") self.set_1d_mode(False) self.setCornerWidget(QLabel("Visualization Pane "), corner=Qt.TopLeftCorner) def set_1d_mode(self, oned): self.setTabEnabled(0, oned) self.setTabEnabled(1, not oned) self.setTabEnabled(2, not USING_THINLINC and not DISABLE_3D and not oned) def set_ws(self, field): if field is not None: try: ws = field.to_md_histo_workspace() except Exception as e: self._parent.show_failure_msg("Failed to generate field", str(e), traceback.format_exc()) ws = None else: ws = None if ws: if len(ws.getNonIntegratedDimensions()) == 1: self.set_1d_mode(True) if self.oneDViewer: self.plot_1d.removeWidget(self.oneDViewer) fig = Figure() self.oneDViewer = FigureCanvas(fig) # get scan direction for d in ('x', 'y', 'z'): dim = getattr(field, d) if not np.allclose(dim, dim[0], atol=0.1): scan_dir = d # create simple 1D plot ax = fig.add_subplot(111) ax.errorbar(getattr(field, scan_dir), field.values, field.errors, marker='o') ax.set_xlabel(f'{scan_dir} (mm)') self.plot_1d.addWidget(self.oneDViewer) self.plot_1d.setCurrentIndex(1) else: self.set_1d_mode(False) if self.strainSliceViewer: self.strainSliceViewer.set_new_workspace(ws) else: self.strainSliceViewer = StrainSliceViewer(ws, parent=self) self.plot_2d.addWidget(self.strainSliceViewer.view) self.plot_2d.setCurrentIndex(1) self.strainSliceViewer.set_new_field( field, bin_widths=[ ws.getDimension(n).getBinWidth() for n in range(3) ]) if not USING_THINLINC and not DISABLE_3D: if self.vtk3dviewer: self.vtk3dviewer.set_ws(ws) else: self.vtk3dviewer = VTK3DView(ws) self.plot_3d.addWidget(self.vtk3dviewer) self.plot_3d.setCurrentIndex(1) else: self.set_1d_mode(False) if self.oneDViewer is not None: self.plot_1d.removeWidget(self.oneDViewer) self.oneDViewer = None if self.strainSliceViewer is not None: self.plot_2d.removeWidget(self.strainSliceViewer.view) self.strainSliceViewer = None if self.vtk3dviewer: self.plot_3d.removeWidget(self.vtk3dviewer) self.vtk3dviewer = None def set_message(self, text): self.message.setText(text) self.message2.setText(text)
def setup_page(self): if ERR_MSG: label = QLabel(_("Could not load plugin:\n{0}".format(ERR_MSG))) layout = QVBoxLayout() layout.addWidget(label) self.setLayout(layout) return # Layout parameter indent = QCheckBox().sizeHint().width() # General options options_group = QGroupBox(_("Options")) # Hack : the spinbox widget will be added to self.spinboxes spinboxes_before = set(self.spinboxes) passes_spin = self.create_spinbox(_("Number of pep8 passes: "), "", 'passes', default=0, min_=0, max_=1000000, step=1) spinbox = set(self.spinboxes) - spinboxes_before spinbox = spinbox.pop() spinbox.setSpecialValueText(_("Infinite")) aggressive1_checkbox = self.create_checkbox("Aggressivity level 1", "aggressive1", default=False) aggressive1_label = QLabel( _("Allow possibly unsafe fixes (E711 and W6), shorten lines" " and remove trailing whitespace more aggressively (in" " docstrings and multiline strings).")) aggressive1_label.setWordWrap(True) aggressive1_label.setIndent(indent) font_description = aggressive1_label.font() font_description.setPointSizeF(font_description.pointSize() * 0.9) aggressive1_label.setFont(font_description) aggressive2_checkbox = self.create_checkbox("Aggressivity level 2", "aggressive2", default=False) aggressive2_label = QLabel( _("Allow more possibly unsafe fixes (E712) and shorten lines.")) aggressive2_label.setWordWrap(True) aggressive2_label.setIndent(indent) aggressive2_label.setFont(font_description) aggressive1_checkbox.toggled.connect(aggressive2_checkbox.setEnabled) aggressive1_checkbox.toggled.connect(aggressive2_label.setEnabled) aggressive2_checkbox.setEnabled(aggressive1_checkbox.isChecked()) aggressive2_label.setEnabled(aggressive1_checkbox.isChecked()) # Enable/disable error codes fix_layout = QVBoxLayout() last_group = "" FIX_LIST.sort(key=lambda item: item[0][1]) for code, description in FIX_LIST: # Create a new group if necessary if code[1] != last_group: last_group = code[1] group = QGroupBox(_(self.GROUPS.get(code[1], ""))) fix_layout.addWidget(group) group_layout = QVBoxLayout(group) # Checkbox for the option text = code default = True if code in DEFAULT_IGNORE: text += _(" (UNSAFE)") default = False option = self.create_checkbox(text, code, default=default) # Label for description if code in self.CODES: label = QLabel("{autopep8} ({pep8}).".format( autopep8=_(description).rstrip("."), pep8=self.CODES[code])) else: label = QLabel(_(description)) label.setWordWrap(True) label.setIndent(indent) label.setFont(font_description) # Add widgets to layout option_layout = QVBoxLayout() option_layout.setSpacing(0) option_layout.addWidget(option) option_layout.addWidget(label) group_layout.addLayout(option_layout) # Special cases if code in ("E711", "W6"): aggressive1_checkbox.toggled.connect(option.setEnabled) aggressive1_checkbox.toggled.connect(label.setEnabled) option.setEnabled(aggressive1_checkbox.isChecked()) label.setEnabled(aggressive1_checkbox.isChecked()) if code == "E712": def e712_enabled(): enabled = (aggressive1_checkbox.isChecked() and aggressive2_checkbox.isChecked()) option.setEnabled(enabled) label.setEnabled(enabled) aggressive1_checkbox.toggled.connect(e712_enabled) aggressive2_checkbox.toggled.connect(e712_enabled) e712_enabled() # General layout aggressive2_layout = QVBoxLayout() margins = aggressive2_layout.contentsMargins() margins.setLeft(indent) aggressive2_layout.setContentsMargins(margins) aggressive2_layout.addWidget(aggressive2_checkbox) aggressive2_layout.addWidget(aggressive2_label) options_layout = QVBoxLayout() options_layout.addWidget(passes_spin) options_layout.addWidget(aggressive1_checkbox) options_layout.addWidget(aggressive1_label) options_layout.addLayout(aggressive2_layout) options_group.setLayout(options_layout) widget_scroll = QWidget() widget_scroll.setLayout(fix_layout) fix_scroll = QScrollArea() fix_scroll.setWidget(widget_scroll) fix_scroll.setWidgetResizable(True) fig_out_layout = QVBoxLayout() fig_out_layout.addWidget(fix_scroll, 1) fix_group = QGroupBox(_("Errors/warnings to fix")) fix_group.setLayout(fig_out_layout) vlayout = QVBoxLayout() vlayout.addWidget(options_group) vlayout.addWidget(fix_group, 1) self.setLayout(vlayout)