class ColorSelector(QWidget): def __init__(self, initial_color=MPL_DEFAULT, parent=None): super(ColorSelector, self).__init__(parent=parent) self.initial_color = QColor(initial_color) # Create line edit and push button and add to a horizontal layout self.line_edit = QLineEdit(self) self.button = QPushButton(self) self.h_layout = QHBoxLayout(self) self.h_layout.addWidget(self.line_edit) self.h_layout.addWidget(self.button) self.h_layout.setContentsMargins(0, 0, 0, 0) self.line_edit.setText(self.initial_color.name()) self.line_edit.setReadOnly(True) self.button.setAutoFillBackground(True) self.button.setFlat(True) self.update_color_button() # Signals self.button.clicked.connect(self.launch_qcolor_dialog) self.line_edit.textChanged.connect(self.update_color_button) def get_color(self): return self.line_edit.text() def launch_qcolor_dialog(self): color_dialog = QColorDialog(self) color_dialog.setCurrentColor(QColor(self.get_color())) color_dialog.colorSelected.connect( lambda: self.set_line_edit(color_dialog.selectedColor().name())) color_dialog.setModal(True) color_dialog.show() def set_color(self, color_hex): self.line_edit.setText(color_hex) def set_line_edit(self, color_hex): self.line_edit.setText(color_hex) def update_color_button(self): palette = QPalette(self.button.palette()) qcolor = QColor(self.get_color()) palette.setColor(QPalette.Button, qcolor) self.button.setPalette(palette) self.button.update()
class ColorSelector(QWidget): def __init__(self, initial_color=MPL_DEFAULT, parent=None): super(ColorSelector, self).__init__(parent=parent) self.initial_color = QColor(initial_color) # Create line edit and push button and add to a horizontal layout self.line_edit = QLineEdit(self) self.button = QPushButton(self) self.h_layout = QHBoxLayout(self) self.h_layout.addWidget(self.line_edit) self.h_layout.addWidget(self.button) self.h_layout.setContentsMargins(0, 0, 0, 0) self.line_edit.setText(self.initial_color.name()) self.prev_color = self.initial_color.name() # Color input only allows valid hex codes. re = QRegExp('^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$') validator = ColorValidator(re, self.line_edit, self) self.line_edit.setValidator(validator) self.button.setAutoFillBackground(True) self.button.setFlat(True) self.update_color_button() # Signals self.button.clicked.connect(self.launch_qcolor_dialog) self.line_edit.textChanged.connect(self.update_color_button) self.line_edit.editingFinished.connect( self.convert_three_digit_hex_to_six) def get_color(self): return self.line_edit.text() def launch_qcolor_dialog(self): color_dialog = QColorDialog(self) color_dialog.setCurrentColor(QColor(self.get_color())) color_dialog.colorSelected.connect( lambda: self.set_line_edit(color_dialog.selectedColor().name())) color_dialog.accepted.connect( lambda: self.set_prev_color(color_dialog.selectedColor().name())) color_dialog.setModal(True) color_dialog.show() def set_prev_color(self, color): self.prev_color = color def set_color(self, color_hex): self.line_edit.setText(color_hex) def set_line_edit(self, color_hex): self.line_edit.setText(color_hex) def update_color_button(self): palette = QPalette(self.button.palette()) qcolor = QColor(self.get_color()) palette.setColor(QPalette.Button, qcolor) self.button.setPalette(palette) self.button.update() def convert_three_digit_hex_to_six(self): color = self.get_color() # If a 3-digit hex code is inputted, it is converted to 6 digits # by duplicating each digit. if len(color) == 4: new = '#{}'.format(''.join(2 * c for c in color.lstrip('#'))) self.set_color(new) color = new self.prev_color = color
class EditGeometryProperties(PyDialog): force = True def __init__(self, data, win_parent=None): """ +------------------+ | Edit Actor Props | +------------------+------+ | Name1 | | Name2 | | Name3 | | Name4 | | | | Active_Name main | | Color box | | Line_Width 2 | | Point_Size 2 | | Bar_Scale 2 | | Opacity 0.5 | | Show/Hide | | | | Apply OK Cancel | +-------------------------+ """ PyDialog.__init__(self, data, win_parent) self.set_font_size(data['font_size']) del self.out_data['font_size'] self.setWindowTitle('Edit Geometry Properties') self.allow_update = True #default #self.win_parent = win_parent #self.out_data = data self.keys = sorted(data.keys()) self.keys = data.keys() keys = self.keys #nrows = len(keys) self.active_key = 'main' items = list(keys) header_labels = ['Groups'] table_model = Model(items, header_labels, self) view = SingleChoiceQTableView(self) #Call your custom QTableView here view.setModel(table_model) #if qt_version == 4: #view.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) self.table = view #self.opacity_edit.valueChanged.connect(self.on_opacity) #mListWidget, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(itemClicked(QListWidgetItem*))); #self.table.itemClicked.connect(self.table.mouseDoubleClickEvent) actor_obj = data[self.active_key] name = actor_obj.name line_width = actor_obj.line_width point_size = actor_obj.point_size bar_scale = actor_obj.bar_scale opacity = actor_obj.opacity color = actor_obj.color show = actor_obj.is_visible self.representation = actor_obj.representation # table header = self.table.horizontalHeader() header.setStretchLastSection(True) self._default_is_apply = False self.name = QLabel("Name:") self.name_edit = QLineEdit(str(name)) self.name_edit.setDisabled(True) self.color = QLabel("Color:") self.color_edit = QPushButton() #self.color_edit.setFlat(True) color = self.out_data[self.active_key].color qcolor = QtGui.QColor() qcolor.setRgb(*color) #print('color =%s' % str(color)) palette = QtGui.QPalette(self.color_edit.palette()) # make a copy of the palette #palette.setColor(QtGui.QPalette.Active, QtGui.QPalette.Base, \ #qcolor) palette.setColor(QtGui.QPalette.Background, QtGui.QColor('blue')) # ButtonText self.color_edit.setPalette(palette) self.color_edit.setStyleSheet("QPushButton {" "background-color: rgb(%s, %s, %s);" % tuple(color) + #"border:1px solid rgb(255, 170, 255); " "}") self.use_slider = True self.is_opacity_edit_active = False self.is_opacity_edit_slider_active = False self.is_line_width_edit_active = False self.is_line_width_edit_slider_active = False self.is_point_size_edit_active = False self.is_point_size_edit_slider_active = False self.is_bar_scale_edit_active = False self.is_bar_scale_edit_slider_active = False self.opacity = QLabel("Opacity:") self.opacity_edit = QDoubleSpinBox(self) self.opacity_edit.setRange(0.1, 1.0) self.opacity_edit.setDecimals(1) self.opacity_edit.setSingleStep(0.1) self.opacity_edit.setValue(opacity) if self.use_slider: self.opacity_slider_edit = QSlider(QtCore.Qt.Horizontal) self.opacity_slider_edit.setRange(1, 10) self.opacity_slider_edit.setValue(opacity * 10) self.opacity_slider_edit.setTickInterval(1) self.opacity_slider_edit.setTickPosition(QSlider.TicksBelow) self.line_width = QLabel("Line Width:") self.line_width_edit = QSpinBox(self) self.line_width_edit.setRange(1, MAX_LINE_WIDTH) self.line_width_edit.setSingleStep(1) self.line_width_edit.setValue(line_width) if self.use_slider: self.line_width_slider_edit = QSlider(QtCore.Qt.Horizontal) self.line_width_slider_edit.setRange(1, MAX_LINE_WIDTH) self.line_width_slider_edit.setValue(line_width) self.line_width_slider_edit.setTickInterval(1) self.line_width_slider_edit.setTickPosition(QSlider.TicksBelow) if self.representation in ['point', 'surface']: self.line_width.setEnabled(False) self.line_width_edit.setEnabled(False) self.line_width_slider_edit.setEnabled(False) self.point_size = QLabel("Point Size:") self.point_size_edit = QSpinBox(self) self.point_size_edit.setRange(1, MAX_POINT_SIZE) self.point_size_edit.setSingleStep(1) self.point_size_edit.setValue(point_size) self.point_size.setVisible(False) self.point_size_edit.setVisible(False) if self.use_slider: self.point_size_slider_edit = QSlider(QtCore.Qt.Horizontal) self.point_size_slider_edit.setRange(1, MAX_POINT_SIZE) self.point_size_slider_edit.setValue(point_size) self.point_size_slider_edit.setTickInterval(1) self.point_size_slider_edit.setTickPosition(QSlider.TicksBelow) self.point_size_slider_edit.setVisible(False) if self.representation in ['wire', 'surface']: self.point_size.setEnabled(False) self.point_size_edit.setEnabled(False) if self.use_slider: self.point_size_slider_edit.setEnabled(False) self.bar_scale = QLabel("Bar Scale:") self.bar_scale_edit = QDoubleSpinBox(self) #self.bar_scale_edit.setRange(0.01, 1.0) # was 0.1 #self.bar_scale_edit.setRange(0.05, 5.0) self.bar_scale_edit.setDecimals(1) #self.bar_scale_edit.setSingleStep(bar_scale / 10.) self.bar_scale_edit.setSingleStep(0.1) self.bar_scale_edit.setValue(bar_scale) #if self.use_slider: #self.bar_scale_slider_edit = QSlider(QtCore.Qt.Horizontal) #self.bar_scale_slider_edit.setRange(1, 100) # 1/0.05 = 100/5.0 #self.bar_scale_slider_edit.setValue(opacity * 0.05) #self.bar_scale_slider_edit.setTickInterval(10) #self.bar_scale_slider_edit.setTickPosition(QSlider.TicksBelow) if self.representation != 'bar': self.bar_scale.setEnabled(False) self.bar_scale_edit.setEnabled(False) self.bar_scale.setVisible(False) self.bar_scale_edit.setVisible(False) #self.bar_scale_slider_edit.setVisible(False) #self.bar_scale_slider_edit.setEnabled(False) # show/hide self.checkbox_show = QCheckBox("Show") self.checkbox_hide = QCheckBox("Hide") self.checkbox_show.setChecked(show) self.checkbox_hide.setChecked(not show) if name == 'main': self.color.setEnabled(False) self.color_edit.setEnabled(False) self.point_size.setEnabled(False) self.point_size_edit.setEnabled(False) if self.use_slider: self.point_size_slider_edit.setEnabled(False) self.cancel_button = QPushButton("Close") self.create_layout() self.set_connections() def on_delete(self, irow): """deletes an actor based on the row number""" if irow == 0: # main return nkeys = len(self.keys) if nkeys in [0, 1]: return name = self.keys[irow] nrows = nkeys - 1 self.keys.pop(irow) header_labels = ['Groups'] table_model = Model(self.keys, header_labels, self) self.table.setModel(table_model) if len(self.keys) == 0: self.update() self.set_as_null() return if irow == nrows: irow -= 1 new_name = self.keys[irow] self.update_active_name(new_name) if self.is_gui: self.win_parent.delete_actor(name) def set_as_null(self): """sets the null case""" self.name.setVisible(False) self.name_edit.setVisible(False) self.color.setVisible(False) self.color_edit.setVisible(False) self.line_width.setVisible(False) self.line_width_edit.setVisible(False) self.point_size.setVisible(False) self.point_size_edit.setVisible(False) self.bar_scale.setVisible(False) self.bar_scale_edit.setVisible(False) self.opacity.setVisible(False) self.opacity_edit.setVisible(False) self.opacity_slider_edit.setVisible(False) self.point_size_slider_edit.setVisible(False) self.line_width_slider_edit.setVisible(False) self.checkbox_show.setVisible(False) self.checkbox_hide.setVisible(False) def on_update_geometry_properties_window(self, data): """Not Implemented""" return #new_keys = sorted(data.keys()) #if self.active_key in new_keys: #i = new_keys.index(self.active_key) #else: #i = 0 #self.table.update_data(new_keys) #self.out_data = data #self.update_active_key(i) def update_active_key(self, index): """ Parameters ---------- index : PyQt4.QtCore.QModelIndex the index of the list Internal Parameters ------------------- name : str the name of obj obj : CoordProperties, AltGeometry the storage object for things like line_width, point_size, etc. """ name = str(index.data()) #print('name = %r' % name) #i = self.keys.index(self.active_key) self.update_active_name(name) def update_active_name(self, name): self.active_key = name self.name_edit.setText(name) obj = self.out_data[name] if isinstance(obj, CoordProperties): opacity = 1.0 representation = 'coord' is_visible = obj.is_visible elif isinstance(obj, AltGeometry): line_width = obj.line_width point_size = obj.point_size bar_scale = obj.bar_scale opacity = obj.opacity representation = obj.representation is_visible = obj.is_visible self.color_edit.setStyleSheet("QPushButton {" "background-color: rgb(%s, %s, %s);" % tuple(obj.color) + #"border:1px solid rgb(255, 170, 255); " "}") self.allow_update = False self.force = False self.line_width_edit.setValue(line_width) self.point_size_edit.setValue(point_size) self.bar_scale_edit.setValue(bar_scale) self.force = True self.allow_update = True else: raise NotImplementedError(obj) #allowed_representations = [ #'main', 'surface', 'coord', 'toggle', 'wire', 'point', 'bar'] if self.representation != representation: self.representation = representation #if representation not in allowed_representations: #msg = 'name=%r; representation=%r is invalid\nrepresentations=%r' % ( #name, representation, allowed_representations) if self.representation == 'coord': self.color.setVisible(False) self.color_edit.setVisible(False) self.line_width.setVisible(False) self.line_width_edit.setVisible(False) self.point_size.setVisible(False) self.point_size_edit.setVisible(False) self.bar_scale.setVisible(False) self.bar_scale_edit.setVisible(False) self.opacity.setVisible(False) self.opacity_edit.setVisible(False) if self.use_slider: self.opacity_slider_edit.setVisible(False) self.point_size_slider_edit.setVisible(False) self.line_width_slider_edit.setVisible(False) #self.bar_scale_slider_edit.setVisible(False) else: self.color.setVisible(True) self.color_edit.setVisible(True) self.line_width.setVisible(True) self.line_width_edit.setVisible(True) self.point_size.setVisible(True) self.point_size_edit.setVisible(True) self.bar_scale.setVisible(True) #self.bar_scale_edit.setVisible(True) self.opacity.setVisible(True) self.opacity_edit.setVisible(True) if self.use_slider: self.opacity_slider_edit.setVisible(True) self.line_width_slider_edit.setVisible(True) self.point_size_slider_edit.setVisible(True) #self.bar_scale_slider_edit.setVisible(True) if name == 'main': self.color.setEnabled(False) self.color_edit.setEnabled(False) self.point_size.setEnabled(False) self.point_size_edit.setEnabled(False) self.line_width.setEnabled(True) self.line_width_edit.setEnabled(True) self.bar_scale.setEnabled(False) self.bar_scale_edit.setEnabled(False) show_points = False show_line_width = True show_bar_scale = False if self.use_slider: self.line_width_slider_edit.setEnabled(True) #self.bar_scale_slider_edit.setVisible(False) else: self.color.setEnabled(True) self.color_edit.setEnabled(True) show_points = False if self.representation in ['point', 'wire+point']: show_points = True show_line_width = False if self.representation in ['wire', 'wire+point', 'bar', 'toggle']: show_line_width = True if representation == 'bar': show_bar_scale = True else: show_bar_scale = False #self.bar_scale_button.setVisible(show_bar_scale) #self.bar_scale_edit.setSingleStep(bar_scale / 10.) #if self.use_slider: #self.bar_scale_slider_edit.setEnabled(False) self.point_size.setEnabled(show_points) self.point_size_edit.setEnabled(show_points) self.point_size.setVisible(show_points) self.point_size_edit.setVisible(show_points) self.line_width.setEnabled(show_line_width) self.line_width_edit.setEnabled(show_line_width) self.bar_scale.setEnabled(show_bar_scale) self.bar_scale_edit.setEnabled(show_bar_scale) self.bar_scale.setVisible(show_bar_scale) self.bar_scale_edit.setVisible(show_bar_scale) if self.use_slider: self.point_size_slider_edit.setEnabled(show_points) self.point_size_slider_edit.setVisible(show_points) self.line_width_slider_edit.setEnabled(show_line_width) #if self.representation in ['wire', 'surface']: self.opacity_edit.setValue(opacity) #if self.use_slider: #self.opacity_slider_edit.setValue(opacity*10) self.checkbox_show.setChecked(is_visible) self.checkbox_hide.setChecked(not is_visible) passed = self.on_validate() #self.on_apply(force=True) # TODO: was turned on...do I want this??? #self.allow_update = True def create_layout(self): ok_cancel_box = QHBoxLayout() ok_cancel_box.addWidget(self.cancel_button) grid = QGridLayout() irow = 0 grid.addWidget(self.name, irow, 0) grid.addWidget(self.name_edit, irow, 1) irow += 1 grid.addWidget(self.color, irow, 0) grid.addWidget(self.color_edit, irow, 1) irow += 1 grid.addWidget(self.opacity, irow, 0) if self.use_slider: grid.addWidget(self.opacity_edit, irow, 2) grid.addWidget(self.opacity_slider_edit, irow, 1) else: grid.addWidget(self.opacity_edit, irow, 1) irow += 1 grid.addWidget(self.line_width, irow, 0) if self.use_slider: grid.addWidget(self.line_width_edit, irow, 2) grid.addWidget(self.line_width_slider_edit, irow, 1) else: grid.addWidget(self.line_width_edit, irow, 1) irow += 1 grid.addWidget(self.point_size, irow, 0) if self.use_slider: grid.addWidget(self.point_size_edit, irow, 2) grid.addWidget(self.point_size_slider_edit, irow, 1) else: grid.addWidget(self.point_size_edit, irow, 1) irow += 1 grid.addWidget(self.bar_scale, irow, 0) if self.use_slider and 0: grid.addWidget(self.bar_scale_edit, irow, 2) grid.addWidget(self.bar_scale_slider_edit, irow, 1) else: grid.addWidget(self.bar_scale_edit, irow, 1) irow += 1 checkboxs = QButtonGroup(self) checkboxs.addButton(self.checkbox_show) checkboxs.addButton(self.checkbox_hide) vbox = QVBoxLayout() vbox.addWidget(self.table, stretch=1) vbox.addLayout(grid) vbox1 = QVBoxLayout() vbox1.addWidget(self.checkbox_show) vbox1.addWidget(self.checkbox_hide) vbox.addLayout(vbox1) vbox.addStretch() #vbox.addWidget(self.check_apply) vbox.addLayout(ok_cancel_box) self.setLayout(vbox) def set_connections(self): self.opacity_edit.valueChanged.connect(self.on_opacity) self.line_width_edit.valueChanged.connect(self.on_line_width) self.point_size_edit.valueChanged.connect(self.on_point_size) self.bar_scale_edit.valueChanged.connect(self.on_bar_scale) if self.use_slider: self.opacity_slider_edit.valueChanged.connect(self.on_opacity_slider) self.line_width_slider_edit.valueChanged.connect(self.on_line_width_slider) self.point_size_slider_edit.valueChanged.connect(self.on_point_size_slider) #self.bar_scale_slider_edit.valueChanged.connect(self.on_bar_scale_slider) # self.connect(self.opacity_edit, QtCore.SIGNAL('clicked()'), self.on_opacity) # self.connect(self.line_width, QtCore.SIGNAL('clicked()'), self.on_line_width) # self.connect(self.point_size, QtCore.SIGNAL('clicked()'), self.on_point_size) if qt_version == 4: self.connect(self, QtCore.SIGNAL('triggered()'), self.closeEvent) self.color_edit.clicked.connect(self.on_color) self.checkbox_show.clicked.connect(self.on_show) self.checkbox_hide.clicked.connect(self.on_hide) self.cancel_button.clicked.connect(self.on_cancel) # closeEvent def keyPressEvent(self, event): if event.key() == QtCore.Qt.Key_Escape: self.close() def closeEvent(self, event): self.on_cancel() def on_color(self): """called when the user clicks on the color box""" name = self.active_key obj = self.out_data[name] rgb_color_ints = obj.color msg = name col = QColorDialog.getColor(QtGui.QColor(*rgb_color_ints), self, "Choose a %s color" % msg) if col.isValid(): color_float = col.getRgbF()[:3] obj.color = color_float color_int = [int(colori * 255) for colori in color_float] self.color_edit.setStyleSheet("QPushButton {" "background-color: rgb(%s, %s, %s);" % tuple(color_int) + #"border:1px solid rgb(255, 170, 255); " "}") self.on_apply(force=self.force) #print(self.allow_update) def on_show(self): """shows the actor""" name = self.active_key is_checked = self.checkbox_show.isChecked() self.out_data[name].is_visible = is_checked self.on_apply(force=self.force) def on_hide(self): """hides the actor""" name = self.active_key is_checked = self.checkbox_hide.isChecked() self.out_data[name].is_visible = not is_checked self.on_apply(force=self.force) def on_line_width(self): """increases/decreases the wireframe (for solid bodies) or the bar thickness""" self.is_line_width_edit_active = True name = self.active_key line_width = self.line_width_edit.value() self.out_data[name].line_width = line_width if not self.is_line_width_edit_slider_active: if self.use_slider: self.line_width_slider_edit.setValue(line_width) self.is_line_width_edit_active = False self.on_apply(force=self.force) self.is_line_width_edit_active = False def on_line_width_slider(self): """increases/decreases the wireframe (for solid bodies) or the bar thickness""" self.is_line_width_edit_slider_active = True #name = self.active_key line_width = self.line_width_slider_edit.value() if not self.is_line_width_edit_active: self.line_width_edit.setValue(line_width) self.is_line_width_edit_slider_active = False def on_point_size(self): """increases/decreases the point size""" self.is_point_size_edit_active = True name = self.active_key point_size = self.point_size_edit.value() self.out_data[name].point_size = point_size if not self.is_point_size_edit_slider_active: if self.use_slider: self.point_size_slider_edit.setValue(point_size) self.is_point_size_edit_active = False self.on_apply(force=self.force) self.is_point_size_edit_active = False def on_point_size_slider(self): """increases/decreases the point size""" self.is_point_size_edit_slider_active = True #name = self.active_key point_size = self.point_size_slider_edit.value() if not self.is_point_size_edit_active: self.point_size_edit.setValue(point_size) self.is_point_size_edit_slider_active = False def on_bar_scale(self): """ Vectors start at some xyz coordinate and can increase in length. Increases/decreases the length scale factor. """ self.is_bar_scale_edit_active = True name = self.active_key float_bar_scale = self.bar_scale_edit.value() self.out_data[name].bar_scale = float_bar_scale if not self.is_bar_scale_edit_slider_active: #int_bar_scale = int(round(float_bar_scale * 20, 0)) #if self.use_slider: #self.bar_scale_slider_edit.setValue(int_bar_scale) self.is_bar_scale_edit_active = False self.on_apply(force=self.force) self.is_bar_scale_edit_active = False def on_bar_scale_slider(self): """ Vectors start at some xyz coordinate and can increase in length. Increases/decreases the length scale factor. """ self.is_bar_scale_edit_slider_active = True #name = self.active_key int_bar_scale = self.bar_scale_slider_edit.value() if not self.is_bar_scale_edit_active: float_bar_scale = int_bar_scale / 20. self.bar_scale_edit.setValue(float_bar_scale) self.is_bar_scale_edit_slider_active = False def on_opacity(self): """ opacity = 1.0 (solid/opaque) opacity = 0.0 (invisible) """ self.is_opacity_edit_active = True name = self.active_key float_opacity = self.opacity_edit.value() self.out_data[name].opacity = float_opacity if not self.is_opacity_edit_slider_active: int_opacity = int(round(float_opacity * 10, 0)) if self.use_slider: self.opacity_slider_edit.setValue(int_opacity) self.is_opacity_edit_active = False self.on_apply(force=self.force) self.is_opacity_edit_active = False def on_opacity_slider(self): """ opacity = 1.0 (solid/opaque) opacity = 0.0 (invisible) """ self.is_opacity_edit_slider_active = True #name = self.active_key int_opacity = self.opacity_slider_edit.value() if not self.is_opacity_edit_active: float_opacity = int_opacity / 10. self.opacity_edit.setValue(float_opacity) self.is_opacity_edit_slider_active = False def on_validate(self): self.out_data['clicked_ok'] = True self.out_data['clicked_cancel'] = False old_obj = self.out_data[self.active_key] old_obj.line_width = self.line_width_edit.value() old_obj.point_size = self.point_size_edit.value() old_obj.bar_scale = self.bar_scale_edit.value() old_obj.opacity = self.opacity_edit.value() #old_obj.color = self.color_edit old_obj.is_visible = self.checkbox_show.isChecked() return True #name_value, flag0 = self.check_name(self.name_edit) #ox_value, flag1 = self.check_float(self.transparency_edit) #if flag0 and flag1: #self.out_data['clicked_ok'] = True #return True #return False @property def is_gui(self): return hasattr(self.win_parent, 'on_update_geometry_properties') def on_apply(self, force=False): passed = self.on_validate() #print("passed=%s force=%s allow=%s" % (passed, force, self.allow_update)) if (passed or force) and self.allow_update and self.is_gui: #print('obj = %s' % self.out_data[self.active_key]) self.win_parent.on_update_geometry_properties(self.out_data, name=self.active_key) return passed def on_cancel(self): passed = self.on_apply(force=True) if passed: self.close()
class EditNodeProperties(QDialog): def __init__(self, data, win_parent=None): """ +-----------------+ | Edit Node Props | +-----------------+------+ | LEwingTip | | Node2 | | Node3 | | Node4 | | | | 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 | | | | Close | +------------------------+ """ QDialog.__init__(self, win_parent) self.setWindowTitle('Edit Node Properties') #default self.win_parent = win_parent self.out_data = data point_properties = data['point_properties'] print(point_properties) #name = point_properties.name point_size = point_properties.point_size opacity = point_properties.opacity color = point_properties.color show = point_properties.is_visible self.points = data['points'] self.keys = sorted(self.points.keys()) keys = self.keys #nrows = len(keys) active_point = data['active_point'] #self.active_key = keys[0] self.active_key = active_point name = self.active_key description = self.points[self.active_key][0] self._use_old_table = False items = ['Node %i' % val for val in keys] header_labels = ['Nodes'] table_model = Model(items, header_labels, self) view = SingleChoiceQTableView(self) #Call your custom QTableView here view.setModel(table_model) view.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) self.table = view #self.representation = actor_obj.representation #print('rep =', self.representation) table = self.table #headers = [QtCore.QString('Groups')] header = table.horizontalHeader() header.setStretchLastSection(True) #---------------------------------------------- #self._default_is_apply = False self.color = QLabel("Color:") self.color_edit = QPushButton() #self.color_edit.setFlat(True) color = self.out_data['point_properties'].color opacity = self.out_data['point_properties'].opacity show = self.out_data['point_properties'].is_visible #color = self.out_data[self.active_key].color qcolor = QColor() qcolor.setRgb(*color) #print('color =%s' % str(color)) palette = QPalette( self.color_edit.palette()) # make a copy of the palette #palette.setColor(QPalette.Active, QPalette.Base, \ #qcolor) palette.setColor(QPalette.Background, QColor('blue')) # ButtonText self.color_edit.setPalette(palette) self.color_edit.setStyleSheet("QPushButton {" "background-color: rgb(%s, %s, %s);" % tuple(color) + #"border:1px solid rgb(255, 170, 255); " "}") self.all_nodes_header = QLabel("All Nodes:") self.point_size = QLabel("Point Size:") self.point_size_edit = QSpinBox(self) self.point_size_edit.setRange(1, 10) self.point_size_edit.setSingleStep(1) self.point_size_edit.setValue(point_size) self.opacity = QLabel("Opacity:") self.opacity_edit = QDoubleSpinBox(self) self.opacity_edit.setRange(0.1, 1.0) self.opacity_edit.setDecimals(1) self.opacity_edit.setSingleStep(0.1) self.opacity_edit.setValue(opacity) # show/hide self.checkbox_show = QCheckBox("Show") self.checkbox_hide = QCheckBox("Hide") self.checkbox_show.setChecked(show) self.checkbox_hide.setChecked(not show) #---------------------------------------------- self.nodes_header = QLabel("Single Node:") self.name = QLabel("ID:") self.name_edit = QLineEdit('Node %i' % name) self.name_edit.setDisabled(True) self.description = QLabel("Description:") self.description_edit = QLineEdit(str(description)) #self.description_edit.setDisabled(True) location_x = 0.1 location_y = 0.1 location_z = 0.1 self.location = QLabel("Location:") self.location_x_edit = QDoubleSpinBox(self) self.location_y_edit = QDoubleSpinBox(self) self.location_z_edit = QDoubleSpinBox(self) #self.location_x_edit.setDecimals(1) delta_x = abs(location_x) / 100. if location_x != 0.0 else 0.1 delta_y = abs(location_y) / 100. if location_y != 0.0 else 0.1 delta_z = abs(location_z) / 100. if location_z != 0.0 else 0.1 self.location_x_edit.setSingleStep(delta_x) self.location_y_edit.setSingleStep(delta_y) self.location_z_edit.setSingleStep(delta_z) self.location_x_edit.setValue(location_x) self.location_y_edit.setValue(location_y) self.location_z_edit.setValue(location_z) self.coord = QLabel("Coord:") self.coord_edit = QSpinBox(self) self.coord_edit.setRange(0, 99999999) #self.coord_edit.setSingleStep(1) self.coord_edit.setValue(0) self.coord_type = QLabel("Coord Type:") #---------------------------------------------- # closing #if self._default_is_apply: #self.apply_button.setDisabled(True) self.close_button = QPushButton("Close") self.create_layout() self.set_connections() def update_active_key(self, index): name = self.active_key old_obj = self.out_data['points'][name] #self.active_key #self.points[self.active_key] old_obj[0] = str(self.description_edit.text()) #old_obj.coord = self.description_edit.value() #old_obj.description = self.description_edit.value() #old_obj.description = self.description_edit.value() str_name = str(index.data().toString()) name = int(str_name[5:]) #i = self.keys.index(self.active_key) self.active_key = name point = self.points[self.active_key] #1 : ['LERoot', 0, 'R', 1.0, 2.0, 3.0], self.name_edit.setText(str(self.active_key)) self.description_edit.setText(point[0]) self.coord_edit.setValue(point[1]) if point[2] == 'R': self.radio_rectangular.setChecked(True) elif point[2] == 'C': self.radio_cylindrical.setChecked(True) elif point[2] == 'S': self.radio_spherical.setChecked(True) self.location_x_edit.setValue(point[3]) self.location_y_edit.setValue(point[4]) self.location_z_edit.setValue(point[5]) #obj = self.out_data[name] #point_size = obj.point_size #opacity = obj.opacity #representation = obj.representation #is_visible = obj.is_visible #self.opacity_edit.setValue(opacity) #self.checkbox_show.setChecked(is_visible) #self.checkbox_hide.setChecked(not is_visible) #def on_name_select(self): #print('on_name_select') #return 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 set_connections(self): """creates the actions for the menu""" self.opacity_edit.valueChanged.connect(self.on_opacity) #self.connect(self.point_size, QtCore.SIGNAL('clicked()'), self.on_point_size) #self.point_size_edit.clicked.connect(self.on_point_size) # need to update name?? self.color_edit.clicked.connect(self.on_color) self.checkbox_show.clicked.connect(self.on_show) self.checkbox_hide.clicked.connect(self.on_hide) self.description_edit.textEdited.connect( self.on_description) # valueChanged???? self.coord_edit.valueChanged.connect(self.on_coord) self.radio_rectangular.clicked.connect(self.on_coord_type) self.radio_cylindrical.clicked.connect(self.on_coord_type) self.radio_spherical.clicked.connect(self.on_coord_type) self.location_x_edit.valueChanged.connect(self.on_location_x) self.location_y_edit.valueChanged.connect(self.on_location_y) self.location_z_edit.valueChanged.connect(self.on_location_z) #self.connect(self.check_apply, QtCore.SIGNAL('clicked()'), self.on_check_apply) #self.connect(self.apply_button, QtCore.SIGNAL('clicked()'), self.on_apply) #self.connect(self.ok_button, QtCore.SIGNAL('clicked()'), self.on_ok) self.close_button.clicked.connect(self.on_close) def on_color(self): obj = self.out_data['point_properties'] rgb_color_ints = obj.color msg = 'Points' col = QColorDialog.getColor(QColor(*rgb_color_ints), self, "Choose a %s color" % msg) if col.isValid(): color = col.getRgbF()[:3] obj.color = color #print('new_color =', color) self.color_edit.setStyleSheet( "QPushButton {" "background-color: rgb(%s, %s, %s);" % tuple(obj.color) + #"border:1px solid rgb(255, 170, 255); " "}") def on_show(self): is_checked = self.checkbox_show.isChecked() self.out_data['point_properties'].is_visible = is_checked def on_hide(self): is_checked = self.checkbox_hide.isChecked() self.out_data['point_properties'].is_visible = not is_checked def on_point_size(self): point_size = self.point_size_edit.value() self.out_data['point_properties'].point_size = point_size def on_opacity(self): opacity = self.opacity_edit.value() self.out_data['point_properties'].opacity = opacity def on_description(self): #1 : ['LERoot', 0, 'R', 1.0, 2.0, 3.0], name = self.active_key description = self.description_edit.value() self.out_data['points'][name][0] = description def on_coord(self): #1 : ['LERoot', 0, 'R', 1.0, 2.0, 3.0], name = self.active_key coord_id = self.coord_edit.value() self.out_data['points'][name][1] = coord_id def on_coord_type(self): #1 : ['LERoot', 0, 'R', 1.0, 2.0, 3.0], name = self.active_key if self.radio_rectangular.isChecked(): coord_type = 'R' elif self.radio_cylindrical.isChecked(): coord_type = 'C' elif self.radio_spherical.isChecked(): coord_type = 'S' else: raise NotImplementedError() self.out_data['points'][name][2] = coord_type def on_location_x(self): #1 : ['LERoot', 0, 'R', 1.0, 2.0, 3.0], name = self.active_key value = self.coord_edit.value() self.out_data['points'][name][3] = value def on_location_y(self): #1 : ['LERoot', 0, 'R', 1.0, 2.0, 3.0], name = self.active_key value = self.coord_edit.value() self.out_data['points'][name][4] = value def on_location_z(self): #1 : ['LERoot', 0, 'R', 1.0, 2.0, 3.0], name = self.active_key value = self.coord_edit.value() self.out_data['points'][name][5] = value def closeEvent(self, event): event.accept() #def on_default_name(self): #self.name_edit.setText(str(self._default_name)) #self.name_edit.setStyleSheet("QLineEdit{background: white;}") #def check_name(self, cell): #text = str(cell.text()).strip() #if len(text): #cell.setStyleSheet("QLineEdit{background: white;}") #return text, True #else: #cell.setStyleSheet("QLineEdit{background: red;}") #return None, False def on_validate(self): self.out_data['clicked_ok'] = True self.out_data['clicked_cancel'] = False old_obj = self.out_data[self.active_key] old_obj.point_size = self.point_size_edit.value() old_obj.opacity = self.opacity_edit.value() old_obj.is_visible = self.checkbox_show.isChecked() return True #name_value, flag0 = self.check_name(self.name_edit) #ox_value, flag1 = check_float(self.transparency_edit) #if flag0 and flag1: #self.out_data['clicked_ok'] = True #return True #return False def on_apply(self): passed = self.on_validate() if passed: self.win_parent.on_update_gui_nodes(self.out_data) return passed def on_ok(self): passed = self.on_apply() if passed: self.close() #self.destroy() def on_close(self): self.out_data['clicked_close'] = True self.close()
class ConfigDialog(QDialog): """A dialog to set values in cnapy-config.txt""" def __init__(self, appdata: CnaData): QDialog.__init__(self) self.setWindowTitle("Configure CNApy") cross_icon = QIcon(":/icons/cross.png") cross = cross_icon.pixmap(QSize(32, 32)) self.appdata = appdata self.oeng = appdata.octave_engine self.meng = appdata.matlab_engine self.layout = QVBoxLayout() self.cna_ok = False descr = QLabel("\ Some functionalities in CNApy need a working CNA installation.\n \ To use CNA you need either Matlab >= R2019 or Octave >= 5 .\n \ Below you can choose a Matlab directory or the Octave executable.\n \ Only if one of the engines is green your CNA directory can be validated." ) self.layout.addWidget(descr) ml = QHBoxLayout() label = QLabel("Matlab") label.setFixedWidth(100) ml.addWidget(label) self.ml_label = QLabel() self.ml_label.setPixmap(cross) self.ml_label.setFixedWidth(100) ml.addWidget(self.ml_label) self.choose_ml_path_btn = QPushButton("Choose Matlab folder") self.choose_ml_path_btn.setFixedWidth(300) ml.addWidget(self.choose_ml_path_btn) label2 = QLabel("") label2.setFixedWidth(30) ml.addWidget(label2) self.matlab_path = QLabel() self.matlab_path.setMinimumWidth(200) self.matlab_path.setText(self.appdata.matlab_path) ml.addWidget(self.matlab_path) self.layout.addItem(ml) oc = QHBoxLayout() label = QLabel("Octave") label.setFixedWidth(100) oc.addWidget(label) self.oc_label = QLabel() self.oc_label.setPixmap(cross) self.oc_label.setFixedWidth(100) oc.addWidget(self.oc_label) self.choose_oc_exe_btn = QPushButton("Choose Octave octave-cli(.exe)") self.choose_oc_exe_btn.setFixedWidth(300) oc.addWidget(self.choose_oc_exe_btn) label2 = QLabel("") label2.setFixedWidth(30) oc.addWidget(label2) self.oc_exe = QLabel() self.oc_exe.setText(self.appdata.octave_executable) self.oc_exe.setMinimumWidth(200) oc.addWidget(self.oc_exe) self.layout.addItem(oc) h9 = QHBoxLayout() label = QLabel("Selected engine:") h9.addWidget(label) label2 = QLabel("") label2.setFixedWidth(30) h9.addWidget(label2) self.selected_engine = QComboBox() self.selected_engine.addItem("None") h9.addWidget(self.selected_engine) label2 = QLabel("") label2.setMinimumWidth(200) h9.addWidget(label2) self.layout.addItem(h9) cna_l = QHBoxLayout() label = QLabel("CNA") label.setFixedWidth(100) cna_l.addWidget(label) self.cna_label = QLabel() self.cna_label.setPixmap(cross) self.cna_label.setFixedWidth(100) cna_l.addWidget(self.cna_label) self.choose_cna_path_btn = QPushButton("Choose CNA directory") self.choose_cna_path_btn.setFixedWidth(300) cna_l.addWidget(self.choose_cna_path_btn) label2 = QLabel("") label2.setFixedWidth(30) cna_l.addWidget(label2) self.cna_path = QLabel() self.cna_path.setMinimumWidth(200) self.cna_path.setText(self.appdata.cna_path) cna_l.addWidget(self.cna_path) self.layout.addItem(cna_l) h2 = QHBoxLayout() label = QLabel("Default color for values in a scenario:") h2.addWidget(label) self.scen_color_btn = QPushButton() self.scen_color_btn.setFixedWidth(100) palette = self.scen_color_btn.palette() palette.setColor(QPalette.Button, self.appdata.scen_color) self.scen_color_btn.setPalette(palette) h2.addWidget(self.scen_color_btn) self.layout.addItem(h2) h3 = QHBoxLayout() label = QLabel( "Default color for computed values not part of the scenario:") h3.addWidget(label) self.comp_color_btn = QPushButton() self.comp_color_btn.setFixedWidth(100) palette = self.comp_color_btn.palette() palette.setColor(QPalette.Button, self.appdata.comp_color) self.comp_color_btn.setPalette(palette) h3.addWidget(self.comp_color_btn) self.layout.addItem(h3) h4 = QHBoxLayout() label = QLabel("Special Color used for non equal flux bounds:") h4.addWidget(label) self.spec1_color_btn = QPushButton() self.spec1_color_btn.setFixedWidth(100) palette = self.spec1_color_btn.palette() palette.setColor(QPalette.Button, self.appdata.special_color_1) self.spec1_color_btn.setPalette(palette) h4.addWidget(self.spec1_color_btn) self.layout.addItem(h4) h5 = QHBoxLayout() label = QLabel( "Special Color 2 used for non equal flux bounds that exclude 0:") h5.addWidget(label) self.spec2_color_btn = QPushButton() self.spec2_color_btn.setFixedWidth(100) palette = self.spec2_color_btn.palette() palette.setColor(QPalette.Button, self.appdata.special_color_2) self.spec2_color_btn.setPalette(palette) h5.addWidget(self.spec2_color_btn) self.layout.addItem(h5) h6 = QHBoxLayout() label = QLabel("Color used for empty reaction boxes:") h6.addWidget(label) self.default_color_btn = QPushButton() self.default_color_btn.setFixedWidth(100) palette = self.default_color_btn.palette() palette.setColor(QPalette.Button, self.appdata.default_color) self.default_color_btn.setPalette(palette) h6.addWidget(self.default_color_btn) self.layout.addItem(h6) h = QHBoxLayout() label = QLabel("Work directory:") h.addWidget(label) self.work_directory = QPushButton() self.work_directory.setText(self.appdata.work_directory) h.addWidget(self.work_directory) self.layout.addItem(h) h7 = QHBoxLayout() label = QLabel("Shown number of digits after the decimal point:") h7.addWidget(label) self.rounding = QLineEdit() self.rounding.setFixedWidth(100) self.rounding.setText(str(self.appdata.rounding)) validator = QIntValidator(0, 20, self) self.rounding.setValidator(validator) h7.addWidget(self.rounding) self.layout.addItem(h7) h8 = QHBoxLayout() label = QLabel( "Absolute tolerance used to compare float values in the UI:") h8.addWidget(label) self.abs_tol = QLineEdit() self.abs_tol.setFixedWidth(100) self.abs_tol.setText(str(self.appdata.abs_tol)) validator = QDoubleValidator(self) validator.setTop(1) self.abs_tol.setValidator(validator) h8.addWidget(self.abs_tol) self.layout.addItem(h8) l2 = QHBoxLayout() self.button = QPushButton("Apply Changes") self.cancel = QPushButton("Close") l2.addWidget(self.button) l2.addWidget(self.cancel) self.layout.addItem(l2) self.setLayout(self.layout) # Connecting the signal self.choose_ml_path_btn.clicked.connect(self.choose_ml_path) self.choose_oc_exe_btn.clicked.connect(self.choose_oc_exe) self.choose_cna_path_btn.clicked.connect(self.choose_cna_path) self.work_directory.clicked.connect(self.choose_work_directory) self.scen_color_btn.clicked.connect(self.choose_scen_color) self.comp_color_btn.clicked.connect(self.choose_comp_color) self.spec1_color_btn.clicked.connect(self.choose_spec1_color) self.spec2_color_btn.clicked.connect(self.choose_spec2_color) self.default_color_btn.clicked.connect(self.choose_default_color) self.selected_engine.currentTextChanged.connect(self.update) self.cancel.clicked.connect(self.reject) self.button.clicked.connect(self.apply) self.check_all() if self.meng is not None: self.selected_engine.insertItem(1, "Matlab") if self.appdata.selected_engine == "matlab": self.selected_engine.setCurrentIndex(1) if self.oeng is not None: self.selected_engine.insertItem(1, "Octave") if self.appdata.selected_engine == "octave": self.selected_engine.setCurrentIndex(1) self.update() def update(self): cross_icon = QIcon(":/icons/cross.png") cross = cross_icon.pixmap(QSize(32, 32)) check_icon = QIcon(":/icons/check.png") check = check_icon.pixmap(QSize(32, 32)) selected_engine = self.selected_engine.currentText() if selected_engine == "None": qmark_icon = QIcon(":/icons/qmark.png") qmark = qmark_icon.pixmap(QSize(32, 32)) self.cna_label.setPixmap(qmark) else: if self.cna_ok: self.cna_label.setPixmap(check) else: self.cna_label.setPixmap(cross) if self.oeng is not None: # disable button if octave is already working self.oc_label.setPixmap(check) else: self.oc_label.setPixmap(cross) if self.meng is not None: self.ml_label.setPixmap(check) else: self.ml_label.setPixmap(cross) self.selected_engine.currentTextChanged.disconnect(self.update) self.selected_engine.clear() self.selected_engine.addItem("None") if self.meng is not None: self.selected_engine.addItem("Matlab") if self.oeng is not None: self.selected_engine.addItem("Octave") # if selected_engine is "None": self.selected_engine.setCurrentIndex(0) if selected_engine == "Matlab": self.selected_engine.setCurrentIndex(1) if selected_engine == "Octave": if self.selected_engine.count() == 2: self.selected_engine.setCurrentIndex(1) elif self.selected_engine.count() == 3: self.selected_engine.setCurrentIndex(2) self.selected_engine.currentTextChanged.connect(self.update) def choose_ml_path(self): dialog = QFileDialog(self, directory=self.matlab_path.text()) dialog.setFileMode(QFileDialog.DirectoryOnly) directory: str = dialog.getExistingDirectory() if not directory or len( directory) == 0 or not os.path.exists(directory): return self.choose_ml_path_btn.setEnabled(False) self.matlab_path.setText(directory) self.try_install_matlab_engine(directory) self.check_matlab() self.choose_ml_path_btn.setEnabled(True) self.update() def try_install_matlab_engine(self, directory: str): try: path = os.path.join(directory, 'extern/engines/python') cwd = os.getcwd() os.chdir(path) temp_dir = TemporaryDirectory() os.system("python setup.py build --build-base=" + temp_dir.name + ' install') os.chdir(cwd) except FileNotFoundError: # no Matlab engine found pass def choose_oc_exe(self): dialog = QFileDialog(self, directory=self.oc_exe.text()) filename: str = dialog.getOpenFileName(directory=os.getcwd())[0] if not filename or len(filename) == 0 or not os.path.exists(filename): return self.oc_exe.setText(filename) if os.path.isfile(filename): os.environ['OCTAVE_EXECUTABLE'] = filename self.choose_oc_exe_btn.setEnabled(False) self.check_octave() self.choose_oc_exe_btn.setEnabled(True) self.update() def check_all(self): self.check_octave() self.check_matlab() self.check_cna() def check_octave(self): if self.oeng is None: self.oeng = try_octave_engine(self.oc_exe.text()) def check_matlab(self): # only recheck matlab if necessary if self.meng is None: self.meng = try_matlab_engine() def choose_cna_path(self): dialog = QFileDialog(self, directory=self.cna_path.text()) dialog.setFileMode(QFileDialog.DirectoryOnly) directory: str = dialog.getExistingDirectory() if not directory or len( directory) == 0 or not os.path.exists(directory): return self.cna_path.setText(directory) self.update() self.reset_engine() self.check_cna() self.update() def choose_work_directory(self): dialog = QFileDialog(self, directory=self.work_directory.text()) directory: str = dialog.getExistingDirectory() if not directory or len( directory) == 0 or not os.path.exists(directory): return self.work_directory.setText(directory) def reset_engine(self): # This resets the engines if self.oeng is None: self.meng = try_matlab_engine() else: self.oeng = try_octave_engine(self.oc_exe.text()) def check_cna(self): if self.oeng is not None: self.cna_ok = try_cna(self.oeng, self.cna_path.text()) elif self.meng is not None: self.cna_ok = try_cna(self.meng, self.cna_path.text()) def choose_scen_color(self): palette = self.scen_color_btn.palette() initial = palette.color(QPalette.Button) dialog = QColorDialog(self) color: str = dialog.getColor(initial) if color.isValid(): palette.setColor(QPalette.Button, color) self.scen_color_btn.setPalette(palette) def choose_comp_color(self): palette = self.comp_color_btn.palette() initial = palette.color(QPalette.Button) dialog = QColorDialog(self) color: str = dialog.getColor(initial) if color.isValid(): palette.setColor(QPalette.Button, color) self.comp_color_btn.setPalette(palette) def choose_spec1_color(self): palette = self.spec1_color_btn.palette() initial = palette.color(QPalette.Button) dialog = QColorDialog(self) color: str = dialog.getColor(initial) if color.isValid(): palette.setColor(QPalette.Button, color) self.spec1_color_btn.setPalette(palette) def choose_spec2_color(self): palette = self.spec2_color_btn.palette() initial = palette.color(QPalette.Button) dialog = QColorDialog(self) color: str = dialog.getColor(initial) if color.isValid(): palette.setColor(QPalette.Button, color) self.spec2_color_btn.setPalette(palette) def choose_default_color(self): palette = self.default_color_btn.palette() initial = palette.color(QPalette.Button) dialog = QColorDialog(self) color: str = dialog.getColor(initial) if color.isValid(): palette.setColor(QPalette.Button, color) self.default_color_btn.setPalette(palette) def apply(self): self.appdata.matlab_path = self.matlab_path.text() self.appdata.octave_executable = self.oc_exe.text() self.appdata.cna_path = self.cna_path.text() self.appdata.matlab_engine = self.meng self.appdata.octave_engine = self.oeng if self.selected_engine.currentText() == "None": self.appdata.selected_engine = None elif self.selected_engine.currentText() == "Matlab": self.appdata.selected_engine = "matlab" elif self.selected_engine.currentText() == "Octave": self.appdata.selected_engine = "octave" self.appdata.select_engine() self.appdata.window.disable_enable_dependent_actions() self.appdata.work_directory = self.work_directory.text() palette = self.scen_color_btn.palette() self.appdata.scen_color = palette.color(QPalette.Button) palette = self.comp_color_btn.palette() self.appdata.comp_color = palette.color(QPalette.Button) palette = self.spec1_color_btn.palette() self.appdata.special_color_1 = palette.color(QPalette.Button) palette = self.spec2_color_btn.palette() self.appdata.special_color_2 = palette.color(QPalette.Button) palette = self.default_color_btn.palette() self.appdata.default_color = palette.color(QPalette.Button) self.appdata.rounding = int(self.rounding.text()) self.appdata.abs_tol = float(self.abs_tol.text()) parser = configparser.ConfigParser() parser.add_section('cnapy-config') parser.set('cnapy-config', 'version', self.appdata.version) parser.set('cnapy-config', 'matlab_path', self.appdata.matlab_path) parser.set('cnapy-config', 'OCTAVE_EXECUTABLE', self.appdata.octave_executable) parser.set('cnapy-config', 'work_directory', self.appdata.work_directory) parser.set('cnapy-config', 'cna_path', self.appdata.cna_path) parser.set('cnapy-config', 'scen_color', str(self.appdata.scen_color.rgb())) parser.set('cnapy-config', 'comp_color', str(self.appdata.comp_color.rgb())) parser.set('cnapy-config', 'spec1_color', str(self.appdata.special_color_1.rgb())) parser.set('cnapy-config', 'spec2_color', str(self.appdata.special_color_2.rgb())) parser.set('cnapy-config', 'default_color', str(self.appdata.default_color.rgb())) parser.set('cnapy-config', 'rounding', str(self.appdata.rounding)) parser.set('cnapy-config', 'abs_tol', str(self.appdata.abs_tol)) parser.set('cnapy-config', 'selected_engine', str(self.appdata.selected_engine)) try: fp = open(self.appdata.conf_path, "w") except FileNotFoundError: os.makedirs( appdirs.user_config_dir("cnapy", roaming=True, appauthor=False)) fp = open(self.appdata.conf_path, "w") parser.write(fp) fp.close() self.accept()
class EditBoundaryConditions(QDialog): def __init__(self, data, win_parent=None): """ +---------+ | Painter | +---------+---------+ | Name1 | | Name2 | | Name3 | | Name4 | | | | x by cell ___ | | x by angle ___ | | | | box elements | | | | Add Remove | | | | Apply OK Cancel | +-------------------+ """ QDialog.__init__(self, win_parent) self.setWindowTitle('Edit Boundary Conditions') #default self.win_parent = win_parent self.out_data = data self.keys = sorted(data.keys()) keys = self.keys nrows = len(keys) self.active_key = keys[0] self._use_old_table = False items = keys header_labels = ['Groups'] table_model = Model(items, header_labels, self) view = SingleChoiceQTableView(self) #Call your custom QTableView here view.setModel(table_model) #view.horizontalHeader().setResizeMode(QtGui.QHeaderView.Stretch) #TODO: fixme self.table = view actor_obj = data[self.active_key] name = actor_obj.name line_width = actor_obj.line_width point_size = actor_obj.point_size opacity = actor_obj.opacity color = actor_obj.color show = actor_obj.is_visible self.representation = actor_obj.representation table = self.table #headers = [QtCore.QString('Groups')] header = table.horizontalHeader() header.setStretchLastSection(True) self._default_is_apply = False self.name = QLabel("Name:") self.name_edit = QLineEdit(str(name)) self.name_edit.setDisabled(True) self.color = QLabel("Color:") self.color_edit = QPushButton() #self.color_edit.setFlat(True) color = self.out_data[self.active_key].color qcolor = QtGui.QColor() qcolor.setRgb(*color) #print('color =%s' % str(color)) palette = QtGui.QPalette( self.color_edit.palette()) # make a copy of the palette #palette.setColor(QtGui.QPalette.Active, QtGui.QPalette.Base, \ #qcolor) palette.setColor(QtGui.QPalette.Background, QtGui.QColor('blue')) # ButtonText self.color_edit.setPalette(palette) self.color_edit.setStyleSheet("QPushButton {" "background-color: rgb(%s, %s, %s);" % tuple(color) + #"border:1px solid rgb(255, 170, 255); " "}") self.opacity = QLabel('Opacity:') self.opacity_edit = QDoubleSpinBox(self) self.opacity_edit.setRange(0.1, 1.0) self.opacity_edit.setDecimals(1) self.opacity_edit.setSingleStep(0.1) self.opacity_edit.setValue(opacity) self.line_width = QLabel('Line Width:') self.line_width_edit = QSpinBox(self) self.line_width_edit.setRange(1, 10) self.line_width_edit.setSingleStep(1) self.line_width_edit.setValue(line_width) if self.representation in ['point', 'surface']: self.line_width.setEnabled(False) self.line_width_edit.setEnabled(False) self.point_size = QLabel('Point Size:') self.point_size_edit = QSpinBox(self) self.point_size_edit.setRange(1, 10) self.point_size_edit.setSingleStep(1) self.point_size_edit.setValue(point_size) if self.representation in ['wire', 'surface']: self.point_size.setEnabled(False) self.point_size_edit.setEnabled(False) # show/hide self.checkbox_show = QCheckBox("Show") self.checkbox_hide = QCheckBox("Hide") self.checkbox_show.setChecked(show) self.checkbox_hide.setChecked(not show) # closing self.apply_button = QPushButton("Apply") #if self._default_is_apply: #self.apply_button.setDisabled(True) self.ok_button = QPushButton("OK") self.cancel_button = QPushButton("Cancel") self.create_layout() self.set_connections() def update_active_key(self, index): old_obj = self.out_data[self.active_key] old_obj.line_width = self.line_width_edit.value() old_obj.point_size = self.point_size_edit.value() old_obj.opacity = self.opacity_edit.value() old_obj.is_visible = self.checkbox_show.isChecked() name = index.data() #i = self.keys.index(self.active_key) self.active_key = name self.name_edit.setText(name) obj = self.out_data[name] line_width = obj.line_width point_size = obj.point_size opacity = obj.opacity representation = obj.representation is_visible = obj.is_visible self.color_edit.setStyleSheet("QPushButton {" "background-color: rgb(%s, %s, %s);" % tuple(obj.color) + #"border:1px solid rgb(255, 170, 255); " "}") self.line_width_edit.setValue(line_width) self.point_size_edit.setValue(point_size) if self.representation != representation: self.representation = representation if self.representation == 'point': self.point_size.setEnabled(True) self.point_size_edit.setEnabled(True) else: self.point_size.setEnabled(False) self.point_size_edit.setEnabled(False) if self.representation == ['wire']: self.line_width.setEnabled(True) self.line_width_edit.setEnabled(True) else: self.line_width.setEnabled(False) self.line_width_edit.setEnabled(False) #if self.representation in ['wire', 'surface']: self.opacity_edit.setValue(opacity) self.checkbox_show.setChecked(is_visible) self.checkbox_hide.setChecked(not is_visible) #def on_name_select(self): #print('on_name_select') #return def create_layout(self): 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) grid = QGridLayout() irow = 0 grid.addWidget(self.name, irow, 0) grid.addWidget(self.name_edit, irow, 1) irow += 1 grid.addWidget(self.color, irow, 0) grid.addWidget(self.color_edit, irow, 1) irow += 1 grid.addWidget(self.opacity, irow, 0) grid.addWidget(self.opacity_edit, irow, 1) irow += 1 grid.addWidget(self.line_width, irow, 0) grid.addWidget(self.line_width_edit, irow, 1) irow += 1 grid.addWidget(self.point_size, irow, 0) grid.addWidget(self.point_size_edit, irow, 1) irow += 1 checkboxs = QButtonGroup(self) checkboxs.addButton(self.checkbox_show) checkboxs.addButton(self.checkbox_hide) vbox = QVBoxLayout() vbox.addWidget(self.table) vbox.addLayout(grid) if 0: vbox.addWidget(self.checkbox_show) vbox.addWidget(self.checkbox_hide) else: vbox1 = QVBoxLayout() vbox1.addWidget(self.checkbox_show) vbox1.addWidget(self.checkbox_hide) vbox.addLayout(vbox1) vbox.addStretch() #vbox.addWidget(self.check_apply) vbox.addLayout(ok_cancel_box) self.setLayout(vbox) def set_connections(self): """creates the actions for the menu""" self.opacity_edit.valueChanged.connect(self.on_opacity) # clicked? self.line_width_edit.valueChanged.connect( self.on_line_width) # clicked? self.point_size_edit.valueChanged.connect( self.on_point_size) # clicked? self.color_edit.clicked.connect(self.on_color) self.checkbox_show.clicked.connect(self.on_show) self.checkbox_hide.clicked.connect(self.on_hide) #self.opacity_edit.clicked.connect(self.on_opacity) #self.connect(self.opacity_edit, QtCore.SIGNAL('clicked()'), self.on_opacity) #self.connect(self.line_width, QtCore.SIGNAL('clicked()'), self.on_line_width) #self.connect(self.point_size, QtCore.SIGNAL('clicked()'), self.on_point_size) #self.connect(self.color_edit, QtCore.SIGNAL('clicked()'), self.on_color) #self.connect(self.checkbox_show, QtCore.SIGNAL('clicked()'), self.on_show) #self.connect(self.checkbox_hide, QtCore.SIGNAL('clicked()'), self.on_hide) #self.connect(self.check_apply, QtCore.SIGNAL('clicked()'), self.on_check_apply) self.apply_button.clicked.connect(self.on_apply) self.ok_button.clicked.connect(self.on_ok) self.cancel_button.clicked.connect(self.on_cancel) #self.connect(self.apply_button, QtCore.SIGNAL('clicked()'), self.on_apply) #self.connect(self.ok_button, QtCore.SIGNAL('clicked()'), self.on_ok) #self.connect(self.cancel_button, QtCore.SIGNAL('clicked()'), self.on_cancel) #self.connect(self, QtCore.SIGNAL('triggered()'), self.closeEvent) def keyPressEvent(self, event): if event.key() == QtCore.Qt.Key_Escape: self.close() def closeEvent(self, event): self.out_data['close'] = True event.accept() def on_color(self): name = self.active_key obj = self.out_data[name] rgb_color_ints = obj.color msg = name col = QColorDialog.getColor(QtGui.QColor(*rgb_color_ints), self, "Choose a %s color" % msg) if col.isValid(): color = col.getRgbF()[:3] obj.color = color #print('new_color =', color) self.color_edit.setStyleSheet( "QPushButton {" "background-color: rgb(%s, %s, %s);" % tuple(obj.color) + #"border:1px solid rgb(255, 170, 255); " "}") def on_show(self): name = self.active_key is_checked = self.checkbox_show.isChecked() self.out_data[name].is_visible = is_checked def on_hide(self): name = self.active_key is_checked = self.checkbox_hide.isChecked() self.out_data[name].is_visible = not is_checked def on_line_width(self): name = self.active_key line_width = self.line_width_edit.value() self.out_data[name].line_width = line_width def on_point_size(self): name = self.active_key point_size = self.point_size_edit.value() self.out_data[name].point_size = point_size def on_opacity(self): name = self.active_key opacity = self.opacity_edit.value() self.out_data[name].opacity = opacity #def on_axis(self, text): ##print(self.combo_axis.itemText()) #self._axis = str(text) #self.plane.setText('Point on %s? Plane:' % self._axis) #self.point_a.setText('Point on %s Axis:' % self._axis) #self.point_b.setText('Point on %s%s Plane:' % (self._axis, self._plane)) #def on_plane(self, text): #self._plane = str(text) #self.point_b.setText('Point on %s%s Plane:' % (self._axis, self._plane)) def on_check_apply(self): is_checked = self.check_apply.isChecked() self.apply_button.setDisabled(is_checked) def _on_float(self, field): try: eval_float_from_string(field.text()) field.setStyleSheet("QLineEdit{background: white;}") except ValueError: field.setStyleSheet("QLineEdit{background: red;}") #def on_default_name(self): #self.name_edit.setText(str(self._default_name)) #self.name_edit.setStyleSheet("QLineEdit{background: white;}") #def check_name(self, cell): #text = str(cell.text()).strip() #if len(text): #cell.setStyleSheet("QLineEdit{background: white;}") #return text, True #else: #cell.setStyleSheet("QLineEdit{background: red;}") #return None, False def on_validate(self): self.out_data['clicked_ok'] = True self.out_data['clicked_cancel'] = False old_obj = self.out_data[self.active_key] old_obj.line_width = self.line_width_edit.value() old_obj.point_size = self.point_size_edit.value() old_obj.opacity = self.opacity_edit.value() old_obj.is_visible = self.checkbox_show.isChecked() return True #name_value, flag0 = self.check_name(self.name_edit) #ox_value, flag1 = check_float(self.transparency_edit) #if flag0 and flag1: #self.out_data['clicked_ok'] = True #return True #return False def on_apply(self): passed = self.on_validate() if passed: self.win_parent.on_update_geometry_properties(self.out_data) return passed def on_ok(self): passed = self.on_apply() if passed: self.close() #self.destroy() def on_cancel(self): self.out_data['clicked_ok'] = False self.out_data['clicked_cancel'] = True self.close()