Ejemplo n.º 1
0
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)
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
0
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()
Ejemplo n.º 4
0
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()
Ejemplo n.º 5
0
    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 }")
Ejemplo n.º 7
0
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)
Ejemplo n.º 8
0
    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)