def _init_ui(self): # Fixed Radio Button self.rb_fixed = QtWidgets.QRadioButton("Fixed Radius:") self.le_fixed = QtWidgets.QLineEdit() self.le_fixed.setMinimumWidth(150) self.le_fixed.setVisible(False) self.le_fixed.textEdited.connect(self.le_fixed_text_edited) self.rb_fixed.clicked.connect(self.rb_fixed_clicked) # QStackedWidget le_fixed self.tmp1 = QtWidgets.QWidget() self.sw_fixed = QtWidgets.QStackedWidget() self.sw_fixed.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) self.sw_fixed.addWidget(self.le_fixed) self.sw_fixed.addWidget(self.tmp1) self.sw_fixed.setCurrentIndex(1) # Custom Radio Button + Table self.rb_custom = QtWidgets.QRadioButton("Custom:") self.tw_cutoff = CutoffTableWidget(self._radii) self.tw_cutoff.text_edited.connect(self.tw_cutoff_text_edited) self.rb_custom.clicked.connect(self.rb_custom_clicked) # Preset Combo Box self.cb_preset = CutoffPresetComboBox() self.cb_preset.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) self.cb_preset.preset_selected.connect(self.cb_preset_selected) # History button self.pb_history = QtWidgets.QPushButton("History", self) self.pb_history.setMinimumWidth(0) self.pb_history.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) self.pb_history.setAutoDefault(False) self.pb_history.clicked.connect(self.pb_history_clicked) if len(cutoff_history.filtered_history(self._radii.keys(), preferred_filenames_with_frames=\ self._preferred_filenames_with_frames)) == 0: self.pb_history.setVisible(False) # Preset save self.cb_preset_save = QtWidgets.QCheckBox("Save as Preset", self) self.le_preset_save = QtWidgets.QLineEdit() self.le_preset_save.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) self.le_preset_save.textChanged.connect(self.le_preset_save_changed) self.la_main = QtWidgets.QGridLayout() self.la_main.setContentsMargins(0, 0, 0, 0) self.la_fixed = QtWidgets.QHBoxLayout() self.la_fixed.setContentsMargins(0, 0, 0, 0) self.la_custom = QtWidgets.QHBoxLayout() self.la_custom.setContentsMargins(0, 0, 0, 0) self.la_preset_save = QtWidgets.QHBoxLayout() self.la_preset_save.setContentsMargins(0, 0, 0, 0) self.la_fixed.addWidget(self.rb_fixed) self.la_fixed.addWidget(self.sw_fixed) self.la_main.addLayout(self.la_fixed, 0, 0, 1, 2) self.la_custom.addWidget(self.rb_custom) self.la_main.addLayout(self.la_custom, 1, 0, 1, 2) self.la_main.addWidget(self.tw_cutoff, 2, 0, 1, 2) self.la_main.addWidget(self.cb_preset, 3, 0, 1, 1) self.la_main.addWidget(self.pb_history, 3, 1, 1, 1) self.la_preset_save.addWidget(self.cb_preset_save) self.la_preset_save.addWidget(self.le_preset_save) self.la_main.addLayout(self.la_preset_save, 4, 0, 1, 2) self.setLayout(self.la_main) self.rb_fixed.click()
class RadiiWidget(QtWidgets.QWidget): class RadiiType: FIXED = 0 CUSTOM = 1 def __init__(self, radii, file_frame_dict, parent=None): super(RadiiWidget, self).__init__(parent) self._radii = radii self._file_frame_dict = file_frame_dict self._preferred_filenames_with_frames = dict( (os.path.basename(filepath), frames) for filepath, frames in self._file_frame_dict.iteritems()) self._discard_preset_choice_on_next_rb_click = True # Default value is True self._selected_radii_type = RadiiWidget.RadiiType.FIXED self._init_ui() self._init_cutoff_radii() def _init_ui(self): # Fixed Radio Button self.rb_fixed = QtWidgets.QRadioButton("Fixed Radius:") self.le_fixed = QtWidgets.QLineEdit() self.le_fixed.setMinimumWidth(150) self.le_fixed.setVisible(False) self.le_fixed.textEdited.connect(self.le_fixed_text_edited) self.rb_fixed.clicked.connect(self.rb_fixed_clicked) # QStackedWidget le_fixed self.tmp1 = QtWidgets.QWidget() self.sw_fixed = QtWidgets.QStackedWidget() self.sw_fixed.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) self.sw_fixed.addWidget(self.le_fixed) self.sw_fixed.addWidget(self.tmp1) self.sw_fixed.setCurrentIndex(1) # Custom Radio Button + Table self.rb_custom = QtWidgets.QRadioButton("Custom:") self.tw_cutoff = CutoffTableWidget(self._radii) self.tw_cutoff.text_edited.connect(self.tw_cutoff_text_edited) self.rb_custom.clicked.connect(self.rb_custom_clicked) # Preset Combo Box self.cb_preset = CutoffPresetComboBox() self.cb_preset.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) self.cb_preset.preset_selected.connect(self.cb_preset_selected) # History button self.pb_history = QtWidgets.QPushButton("History", self) self.pb_history.setMinimumWidth(0) self.pb_history.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) self.pb_history.setAutoDefault(False) self.pb_history.clicked.connect(self.pb_history_clicked) if len(cutoff_history.filtered_history(self._radii.keys(), preferred_filenames_with_frames=\ self._preferred_filenames_with_frames)) == 0: self.pb_history.setVisible(False) # Preset save self.cb_preset_save = QtWidgets.QCheckBox("Save as Preset", self) self.le_preset_save = QtWidgets.QLineEdit() self.le_preset_save.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) self.le_preset_save.textChanged.connect(self.le_preset_save_changed) self.la_main = QtWidgets.QGridLayout() self.la_main.setContentsMargins(0, 0, 0, 0) self.la_fixed = QtWidgets.QHBoxLayout() self.la_fixed.setContentsMargins(0, 0, 0, 0) self.la_custom = QtWidgets.QHBoxLayout() self.la_custom.setContentsMargins(0, 0, 0, 0) self.la_preset_save = QtWidgets.QHBoxLayout() self.la_preset_save.setContentsMargins(0, 0, 0, 0) self.la_fixed.addWidget(self.rb_fixed) self.la_fixed.addWidget(self.sw_fixed) self.la_main.addLayout(self.la_fixed, 0, 0, 1, 2) self.la_custom.addWidget(self.rb_custom) self.la_main.addLayout(self.la_custom, 1, 0, 1, 2) self.la_main.addWidget(self.tw_cutoff, 2, 0, 1, 2) self.la_main.addWidget(self.cb_preset, 3, 0, 1, 1) self.la_main.addWidget(self.pb_history, 3, 1, 1, 1) self.la_preset_save.addWidget(self.cb_preset_save) self.la_preset_save.addWidget(self.le_preset_save) self.la_main.addLayout(self.la_preset_save, 4, 0, 1, 2) self.setLayout(self.la_main) self.rb_fixed.click() def _init_cutoff_radii(self, cutoff_radii=None): elements = self._radii.keys() if cutoff_radii is None: filtered_history = cutoff_history.filtered_history( elements, preferred_filenames_with_frames=self. _preferred_filenames_with_frames) if not filtered_history: cutoff_radii = config.Computation.std_cutoff_radius else: cutoff_radii = filtered_history[0].radii self.cutoff_radii = cutoff_radii def rb_fixed_clicked(self): self.sw_fixed.setCurrentIndex(0) if self._selected_radii_type != RadiiWidget.RadiiType.FIXED and self._discard_preset_choice_on_next_rb_click: self.cb_preset.discard_preset_choice() self._selected_radii_type = RadiiWidget.RadiiType.FIXED self._discard_preset_choice_on_next_rb_click = True def rb_custom_clicked(self): self.sw_fixed.setCurrentIndex(1) if self._selected_radii_type != RadiiWidget.RadiiType.CUSTOM and self._discard_preset_choice_on_next_rb_click: self.cb_preset.discard_preset_choice() self._selected_radii_type = RadiiWidget.RadiiType.CUSTOM self._discard_preset_choice_on_next_rb_click = True def le_fixed_text_edited(self): self.cb_preset.discard_preset_choice() def tw_cutoff_text_edited(self): self.cb_preset.discard_preset_choice() self.rb_custom.click() self.cb_preset.discard_preset_choice() def pb_history_clicked(self): cutoff_history_dialog = CutoffHistoryDialog( self, self._radii.keys(), self._preferred_filenames_with_frames) return_value = cutoff_history_dialog.exec_() if return_value == QtWidgets.QDialog.Rejected: return self._init_cutoff_radii(cutoff_history_dialog.selected_radii) def le_preset_save_changed(self, text): self.cb_preset_save.setChecked(text.strip() != '') def cb_preset_selected(self, selected_preset): self.cutoff_radii = selected_preset.radii @property def save_preset_name(self): if not self.cb_preset_save.isChecked(): return None preset_name = self.le_preset_save.text().strip() if not re.match('[a-zA-Z0-9_]+', preset_name): message = QtWidgets.QMessageBox() message.setStandardButtons(QtWidgets.QMessageBox.Ok) message.setText( "{} is not valid preset name. Only A-Z, a-z, 0-9 and _ are valid characters" .format(preset_name)) message.exec_() return None return preset_name @property def cutoff_radii(self): if self.rb_fixed.isChecked() and hasattr(self, "le_fixed"): try: radius_as_text = self.le_fixed.text() radius = float(radius_as_text) return radius except ValueError: message = QtWidgets.QMessageBox() message.setStandardButtons(QtWidgets.QMessageBox.Ok) message.setText("Incorrect input: {}".format(radius_as_text)) message.exec_() raise if self.rb_custom.isChecked(): elem_to_cutoff_radius = {} for i, elem in enumerate(self._radii): try: current_radius_as_text = self.tw_cutoff.cellWidget( i, 1).text() current_radius = float(current_radius_as_text) elem_to_cutoff_radius[elem] = current_radius except ValueError: message = QtWidgets.QMessageBox() message.setStandardButtons(QtWidgets.QMessageBox.Ok) message.setText( "Incorrect input: {}".format(current_radius_as_text)) message.exec_() raise return elem_to_cutoff_radius @cutoff_radii.setter def cutoff_radii(self, cutoff_radii): elements = self._radii.keys() if not isinstance(cutoff_radii, collections.Iterable): cutoff_radii = dict( (elem, float(cutoff_radii)) for elem in elements) # Check if all cutoff radii are equal if len(set(cutoff_radii.values())) == 1: self._discard_preset_choice_on_next_rb_click = False self.rb_fixed.click() self.le_fixed.setText(str(cutoff_radii.values()[0])) else: self._discard_preset_choice_on_next_rb_click = False self.rb_custom.click() for i, elem in enumerate(self._radii): self.tw_cutoff.cellWidget(i, 1).setText(str(cutoff_radii[elem]))
class RadiiWidget(QtWidgets.QWidget): class RadiiType: FIXED = 0 CUSTOM = 1 def __init__(self, radii, file_frame_dict, parent=None): super(RadiiWidget, self).__init__(parent) self._radii = radii self._file_frame_dict = file_frame_dict self._preferred_filenames_with_frames = dict((os.path.basename(filepath), frames) for filepath, frames in self._file_frame_dict.iteritems()) self._discard_preset_choice_on_next_rb_click = True # Default value is True self._selected_radii_type = RadiiWidget.RadiiType.FIXED self._init_ui() self._init_cutoff_radii() def _init_ui(self): # Fixed Radio Button self.rb_fixed = QtWidgets.QRadioButton("Fixed Radius:") self.le_fixed = QtWidgets.QLineEdit() self.le_fixed.setMinimumWidth(150) self.le_fixed.setVisible(False) self.le_fixed.textEdited.connect(self.le_fixed_text_edited) self.rb_fixed.clicked.connect(self.rb_fixed_clicked) # QStackedWidget le_fixed self.tmp1 = QtWidgets.QWidget() self.sw_fixed = QtWidgets.QStackedWidget() self.sw_fixed.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) self.sw_fixed.addWidget(self.le_fixed) self.sw_fixed.addWidget(self.tmp1) self.sw_fixed.setCurrentIndex(1) # Custom Radio Button + Table self.rb_custom = QtWidgets.QRadioButton("Custom:") self.tw_cutoff = CutoffTableWidget(self._radii) self.tw_cutoff.text_edited.connect(self.tw_cutoff_text_edited) self.rb_custom.clicked.connect(self.rb_custom_clicked) # Preset Combo Box self.cb_preset = CutoffPresetComboBox() self.cb_preset.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) self.cb_preset.preset_selected.connect(self.cb_preset_selected) # History button self.pb_history = QtWidgets.QPushButton("History", self) self.pb_history.setMinimumWidth(0) self.pb_history.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) self.pb_history.setAutoDefault(False) self.pb_history.clicked.connect(self.pb_history_clicked) if len(cutoff_history.filtered_history(self._radii.keys(), preferred_filenames_with_frames=\ self._preferred_filenames_with_frames)) == 0: self.pb_history.setVisible(False) # Preset save self.cb_preset_save = QtWidgets.QCheckBox("Save as Preset", self) self.le_preset_save = QtWidgets.QLineEdit() self.le_preset_save.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) self.le_preset_save.textChanged.connect(self.le_preset_save_changed) self.la_main = QtWidgets.QGridLayout() self.la_main.setContentsMargins(0, 0, 0, 0) self.la_fixed = QtWidgets.QHBoxLayout() self.la_fixed.setContentsMargins(0, 0, 0, 0) self.la_custom = QtWidgets.QHBoxLayout() self.la_custom.setContentsMargins(0, 0, 0, 0) self.la_preset_save = QtWidgets.QHBoxLayout() self.la_preset_save.setContentsMargins(0, 0, 0, 0) self.la_fixed.addWidget(self.rb_fixed) self.la_fixed.addWidget(self.sw_fixed) self.la_main.addLayout(self.la_fixed, 0, 0, 1, 2) self.la_custom.addWidget(self.rb_custom) self.la_main.addLayout(self.la_custom, 1, 0, 1, 2) self.la_main.addWidget(self.tw_cutoff, 2, 0, 1, 2) self.la_main.addWidget(self.cb_preset, 3, 0, 1, 1) self.la_main.addWidget(self.pb_history, 3, 1, 1, 1) self.la_preset_save.addWidget(self.cb_preset_save) self.la_preset_save.addWidget(self.le_preset_save) self.la_main.addLayout(self.la_preset_save, 4, 0, 1, 2) self.setLayout(self.la_main) self.rb_fixed.click() def _init_cutoff_radii(self, cutoff_radii=None): elements = self._radii.keys() if cutoff_radii is None: filtered_history = cutoff_history.filtered_history(elements, preferred_filenames_with_frames= self._preferred_filenames_with_frames) if not filtered_history: cutoff_radii = config.Computation.std_cutoff_radius else: cutoff_radii = filtered_history[0].radii self.cutoff_radii = cutoff_radii def rb_fixed_clicked(self): self.sw_fixed.setCurrentIndex(0) if self._selected_radii_type != RadiiWidget.RadiiType.FIXED and self._discard_preset_choice_on_next_rb_click: self.cb_preset.discard_preset_choice() self._selected_radii_type = RadiiWidget.RadiiType.FIXED self._discard_preset_choice_on_next_rb_click = True def rb_custom_clicked(self): self.sw_fixed.setCurrentIndex(1) if self._selected_radii_type != RadiiWidget.RadiiType.CUSTOM and self._discard_preset_choice_on_next_rb_click: self.cb_preset.discard_preset_choice() self._selected_radii_type = RadiiWidget.RadiiType.CUSTOM self._discard_preset_choice_on_next_rb_click = True def le_fixed_text_edited(self): self.cb_preset.discard_preset_choice() def tw_cutoff_text_edited(self): self.cb_preset.discard_preset_choice() self.rb_custom.click() self.cb_preset.discard_preset_choice() def pb_history_clicked(self): cutoff_history_dialog = CutoffHistoryDialog(self, self._radii.keys(), self._preferred_filenames_with_frames) return_value = cutoff_history_dialog.exec_() if return_value == QtWidgets.QDialog.Rejected: return self._init_cutoff_radii(cutoff_history_dialog.selected_radii) def le_preset_save_changed(self, text): self.cb_preset_save.setChecked(text.strip() != '') def cb_preset_selected(self, selected_preset): self.cutoff_radii = selected_preset.radii @property def save_preset_name(self): if not self.cb_preset_save.isChecked(): return None preset_name = self.le_preset_save.text().strip() if not re.match('[a-zA-Z0-9_]+', preset_name): message = QtWidgets.QMessageBox() message.setStandardButtons(QtWidgets.QMessageBox.Ok) message.setText("{} is not valid preset name. Only A-Z, a-z, 0-9 and _ are valid characters".format( preset_name) ) message.exec_() return None return preset_name @property def cutoff_radii(self): if self.rb_fixed.isChecked() and hasattr(self, "le_fixed"): try: radius_as_text = self.le_fixed.text() radius = float(radius_as_text) return radius except ValueError: message = QtWidgets.QMessageBox() message.setStandardButtons(QtWidgets.QMessageBox.Ok) message.setText("Incorrect input: {}".format(radius_as_text)) message.exec_() raise if self.rb_custom.isChecked(): elem_to_cutoff_radius = {} for i, elem in enumerate(self._radii): try: current_radius_as_text = self.tw_cutoff.cellWidget(i, 1).text() current_radius = float(current_radius_as_text) elem_to_cutoff_radius[elem] = current_radius except ValueError: message = QtWidgets.QMessageBox() message.setStandardButtons(QtWidgets.QMessageBox.Ok) message.setText("Incorrect input: {}".format(current_radius_as_text)) message.exec_() raise return elem_to_cutoff_radius @cutoff_radii.setter def cutoff_radii(self, cutoff_radii): elements = self._radii.keys() if not isinstance(cutoff_radii, collections.Iterable): cutoff_radii = dict((elem, float(cutoff_radii)) for elem in elements) # Check if all cutoff radii are equal if len(set(cutoff_radii.values())) == 1: self._discard_preset_choice_on_next_rb_click = False self.rb_fixed.click() self.le_fixed.setText(str(cutoff_radii.values()[0])) else: self._discard_preset_choice_on_next_rb_click = False self.rb_custom.click() for i, elem in enumerate(self._radii): self.tw_cutoff.cellWidget(i, 1).setText(str(cutoff_radii[elem]))