def __init__(self, viewer, metadata_levels, initial_classes, *args, **kwargs): super(Classifier,self).__init__(*args,**kwargs) self.viewer = viewer # open image if not already open if len(self.viewer.layers)<1: msg = QMessageBox() msg.setIcon(QMessageBox.Information) msg.setText("No image open, please select an image in the following dialog.") msg.exec() self.viewer.window.qt_viewer._open_files_dialog() if len(self.viewer.layers)<1: # still no image open raise ValueError("Could not find image layers.") # get image shape self.shape = self.viewer.layers[0].shape # check metadata levels if not metadata_levels: self.metadata_levels = [f'dim_{dim}' for dim in range(len(self.shape[:-2]))] elif len(metadata_levels)!=len(self.shape[:-2]): metadata_levels_warning = NapariNotification((f'Number of metadata_levels ({len(metadata_levels)}) does not match ' f'number of leading image dimensions ({len(self.shape[:-2])}); will use default metadata_levels.'), severity='warning') metadata_levels_warning.show() self.metadata_levels = [f'dim_{dim}' for dim in range(len(self.shape[:-2]))] else: self.metadata_levels = metadata_levels # load metadata self.load_metadata() # initialize widget layout = QHBoxLayout() ## io panel save_button = QPushButton('Save...',self) save_button.clicked.connect(self.save_results) io_panel = QWidget() io_layout = QVBoxLayout() io_layout.addWidget(save_button) io_panel.setLayout(io_layout) layout.addWidget(io_panel) ## class panel classes_panel = QGroupBox('classes') classes_panel.setMinimumWidth(CLASS_PANEL_MINIMUM_WIDTH) ### layout for adding classes add_classes_layout = QHBoxLayout() add_class_button = QPushButton('Add class',self) add_class_button.clicked.connect(self.click_add_class) self.new_class_text = QLineEdit(self) self.new_class_text.setAlignment(Qt.AlignLeft) add_classes_layout.addWidget(add_class_button) add_classes_layout.addWidget(self.new_class_text) ### layout for class buttons self.class_button_layout = QGridLayout() ### add sub layouts to class panel classes_layout = QVBoxLayout() classes_layout.addLayout(add_classes_layout) classes_layout.addLayout(self.class_button_layout) classes_panel.setLayout(classes_layout) layout.addWidget(classes_panel) ## set widget layout layout.setAlignment(Qt.AlignTop) layout.setSpacing(4) self.setLayout(layout) self.setMaximumHeight(GUI_MAXIMUM_HEIGHT) self.setMaximumWidth(GUI_MAXIMUM_WIDTH) # initialize classes self.classes = [] if initial_classes is not None: for initial_class in initial_classes: self.add_class(initial_class)
def generate_pv_controls(self, pv_name, curve_color): """ Generate a set of widgets to manage the appearance of a curve. The set of widgets includes: 1. A checkbox which shows the curve on the chart if checked, and hide the curve if not checked 2. Three buttons -- Modify..., Focus, and Remove. Modify... will bring up the Curve Settings dialog. Focus adjusts the chart's zooming for the current curve. Remove will delete the curve from the chart Parameters ---------- pv_name: str The name of the PV the current curve is being plotted for curve_color : QColor The color of the curve to paint for the checkbox label to help the user track the curve to the checkbox """ individual_curve_layout = QVBoxLayout() size_policy = QSizePolicy() size_policy.setVerticalPolicy(QSizePolicy.Fixed) size_policy.setHorizontalPolicy(QSizePolicy.Fixed) individual_curve_grpbx = QGroupBox() individual_curve_grpbx.setMinimumWidth(300) individual_curve_grpbx.setMinimumHeight(120) individual_curve_grpbx.setAlignment(Qt.AlignTop) individual_curve_grpbx.setSizePolicy(size_policy) individual_curve_grpbx.setObjectName(pv_name + "_grb") individual_curve_grpbx.setLayout(individual_curve_layout) checkbox = QCheckBox(parent=individual_curve_grpbx) checkbox.setObjectName(pv_name + "_chb") palette = checkbox.palette() palette.setColor(QPalette.Active, QPalette.WindowText, curve_color) checkbox.setPalette(palette) display_name = pv_name.split("://")[1] if len(display_name) > MAX_DISPLAY_PV_NAME_LENGTH: # Only display max allowed number of characters of the PV Name display_name = display_name[ :int(MAX_DISPLAY_PV_NAME_LENGTH / 2) - 1] + "..." + \ display_name[ -int(MAX_DISPLAY_PV_NAME_LENGTH / 2) + 2:] checkbox.setText(display_name) data_text = QLabel(parent=individual_curve_grpbx) data_text.setWordWrap(True) data_text.setObjectName(pv_name + "_lbl") data_text.setPalette(palette) checkbox.setChecked(True) checkbox.toggled.connect( partial(self.handle_curve_chkbox_toggled, checkbox)) if not self.chart.findCurve(pv_name).isVisible(): checkbox.setChecked(False) modify_curve_btn = QPushButton("Modify...", parent=individual_curve_grpbx) modify_curve_btn.setObjectName(pv_name + "_btn_modify") modify_curve_btn.setMaximumWidth(80) modify_curve_btn.clicked.connect( partial(self.display_curve_settings_dialog, pv_name)) focus_curve_btn = QPushButton("Focus", parent=individual_curve_grpbx) focus_curve_btn.setObjectName(pv_name + "_btn_focus") focus_curve_btn.setMaximumWidth(80) focus_curve_btn.clicked.connect(partial(self.focus_curve, pv_name)) clear_curve_btn = QPushButton("Clear", parent=individual_curve_grpbx) clear_curve_btn.setObjectName(pv_name + "_btn_clear") clear_curve_btn.setMaximumWidth(80) clear_curve_btn.clicked.connect(partial(self.clear_curve, pv_name)) # annotate_curve_btn = QPushButton("Annotate...", # parent=individual_curve_grpbx) # annotate_curve_btn.setObjectName(pv_name+"_btn_ann") # annotate_curve_btn.setMaximumWidth(80) # annotate_curve_btn.clicked.connect( # partial(self.annotate_curve, pv_name)) remove_curve_btn = QPushButton("Remove", parent=individual_curve_grpbx) remove_curve_btn.setObjectName(pv_name + "_btn_remove") remove_curve_btn.setMaximumWidth(80) remove_curve_btn.clicked.connect(partial(self.remove_curve, pv_name)) curve_btn_layout = QHBoxLayout() curve_btn_layout.setSpacing(5) curve_btn_layout.addWidget(modify_curve_btn) curve_btn_layout.addWidget(focus_curve_btn) curve_btn_layout.addWidget(clear_curve_btn) # curve_btn_layout.addWidget(annotate_curve_btn) curve_btn_layout.addWidget(remove_curve_btn) individual_curve_layout.addWidget(checkbox) individual_curve_layout.addWidget(data_text) individual_curve_layout.addLayout(curve_btn_layout) self.curve_settings_layout.addWidget(individual_curve_grpbx) self.tab_panel.setCurrentIndex(0)