def __init__(self, editor, layout=None, *args, **kw): super(_FilterTableView, self).__init__(editor, *args, **kw) # vlayout = QVBoxLayout() # layout.setSpacing(2) # self.table = table = _myFilterTableView(parent) # self.table = table = _TableView(parent) # table.setSizePolicy(QSizePolicy.Fixed, # QSizePolicy.Fixed) # table.setMinimumHeight(100) # table.setMaximumHeight(50) # table.setFixedHeight(50) # table.setFixedWidth(50) hl = QHBoxLayout() self.button = button = QPushButton() button.setIcon(icon('delete').create_icon()) button.setEnabled(False) button.setFlat(True) button.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) button.setFixedWidth(15) button.setFixedHeight(15) self.text = text = QLineEdit() hl.addWidget(text) hl.addWidget(button) # vlayout.addLayout(hl) layout.addLayout(hl)
class RadialForcePropertiesWidget(QWidget): """ This widget modifies properties of a radial force """ # noinspection PyUnresolvedReferences def __init__(self, parent=None): super(RadialForcePropertiesWidget, self).__init__(parent) self.radial_force = None self.name_editor = QLineEdit() self.name_editor_groupbox = QGroupBox("Name") self.name_editor_groupbox_layout = QHBoxLayout() self.name_editor_groupbox.setLayout(self.name_editor_groupbox_layout) self.name_editor_groupbox_layout.addWidget(self.name_editor) self.name_editor_groupbox_layout.addStretch() self.explicit_bezier_curve_widget = ExplicitBezierCurveWidget() main_layout = QVBoxLayout() main_layout.addWidget(self.name_editor_groupbox) main_layout.addWidget(self.explicit_bezier_curve_widget) main_layout.addStretch() self.setLayout(main_layout) self.name_editor.textChanged.connect(self.name_editor_text_changed) self.explicit_bezier_curve_widget.bezier_curve_changed.connect(self.bezier_curve_changed) self.setDisabled(True) def switch_to_radial_force(self, radial_force): """ This method initializes widget with current state of radial force provided and keeps and eye on specific radial force by writing changes to RadialForce object as far as properties are modified in graphical interface :param radial_force: a radial force in concern :type radial_force: engine.RadialForce :return: Nothing """ self.radial_force = radial_force self.name_editor.setText(self.radial_force.name) self.explicit_bezier_curve_widget.deserialize(self.radial_force.bezier_curve) self.setEnabled(True) def name_editor_text_changed(self, value): self.radial_force.name = value def bezier_curve_changed(self, bezier_curve): self.radial_force.bezier_curve = bezier_curve def invalidate(self): self.switch_to_radial_force(self.radial_force)
def __init__(self, editor, layout=None, *args, **kw): super(_FilterTableView, self).__init__(editor, *args, **kw) # layout = QVBoxLayout() # layout.setSpacing(1) # self.table = table = _TableView(parent) hl = QHBoxLayout() # hl.setSpacing(10) # self.button = button = QPushButton() button.setIcon(icon('delete').create_icon()) button.setEnabled(False) button.setFlat(True) button.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) button.setFixedWidth(15) button.setFixedHeight(15) self.text = text = QLineEdit() self.cb = cb = QCheckBox() # text.setEnabled(False) button.setEnabled(False) # table.setEnabled(False) # cb.setSizePolicy(QSizePolicy.Fixed, # QSizePolicy.Fixed) # cb.setFixedWidth(20) # cb.setFixedHeight(20) # hl.addWidget(cb) hl.addWidget(text) hl.addWidget(button) layout.addLayout(hl)
def _dispose_items(self): """ Disposes of each current list item. """ layout = self.layout() if not layout: layout = QHBoxLayout() layout.setSpacing(10) self.setLayout(layout) return child = layout.takeAt(0) while child is not None: control = child.widget() if control is not None: control.deleteLater() child = layout.takeAt(0) del child
def _init_ui(self, txt): self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint | QtCore.Qt.FramelessWindowHint) pal = QPalette() color = QColor() color.setNamedColor(self._window_bgcolor) color.setAlpha(255 * self._opacity) pal.setColor(QPalette.Background, color) self.setAutoFillBackground(True) self.setPalette(pal) wm, hm = 5, 5 spacing = 8 layout = QVBoxLayout() layout.setSpacing(spacing) layout.setContentsMargins(wm, hm, wm, hm) nlines, ts = self._generate_text(txt) qlabel = QLabel('\n'.join(ts)) ss = 'QLabel {{color: {}; font-family:{}, sans-serif; font-size: {}px}}'.format(self._color, self._font, self._fontsize) qlabel.setStyleSheet(ss) layout.addWidget(qlabel) hlabel = QLabel('double click to dismiss') hlabel.setStyleSheet('QLabel {font-size: 10px}') hlayout = QHBoxLayout() hlayout.addStretch() hlayout.addWidget(hlabel) hlayout.addStretch() layout.addLayout(hlayout) self.setLayout(layout) font = QFont(self._font, self._fontsize) fm = QFontMetrics(font) pw = max([fm.width(ti) for ti in ts]) ph = (fm.height() + 2) * nlines w = pw + wm * 2 h = ph + (hm + spacing + 1) * 2 self.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) self.setFixedWidth(w) self.setFixedHeight(h) self.setMask(mask(self.rect(), 10))
class AtomPropertiesWidget(QWidget): """ This widget modifies properties of a specific atom """ def __init__(self, parent=None): super(AtomPropertiesWidget, self).__init__(parent) self.atom = None self.name_editor = QLineEdit() self.name_editor_groupbox = QGroupBox("Name") self.name_editor_groupbox_layout = QHBoxLayout() self.name_editor_groupbox.setLayout(self.name_editor_groupbox_layout) self.name_editor_groupbox_layout.addWidget(self.name_editor) self.name_editor_groupbox_layout.addStretch() main_layout = QVBoxLayout() main_layout.addWidget(self.name_editor_groupbox) main_layout.addStretch() self.setLayout(main_layout) self.name_editor.textChanged.connect(self.name_editor_text_changed) self.setDisabled(True) def switch_to_atom(self, atom): """ This method initializes widget with current state of atom provided and keeps and eye on specific atom writing changes to atom object as far as properties are modified in graphical interface :param atom: an atom in concern :type atom: engine.atom :return: Nothing """ self.atom = atom self.name_editor.setText(self.atom.name) self.setEnabled(True) def name_editor_text_changed(self, value): self.atom.name = value def invalidate(self): self.switch_to_atom(self.atom)
def __init__(self, *args, **kw): super(ComboBoxWidget, self).__init__(*args, **kw) layout = QHBoxLayout() layout.setSpacing(2) self.combo = combo = QComboBox() combo.setSizeAdjustPolicy(QComboBox.AdjustToContents) combo.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Fixed) self.button = button = QPushButton() button.setEnabled(False) button.setIcon(icon('add').create_icon()) button.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) button.setFixedWidth(20) button.setFixedHeight(20) layout.addWidget(combo) layout.addSpacing(10) layout.addWidget(button) self.setLayout(layout)
def __init__(self, parent=None): """ """ super(SplineEditorWidget, self).__init__(parent) main_layout = QHBoxLayout() properties_widget = PropertiesWidget() self.spline_editor_scene = SplineEditorScene( parent_layout=properties_widget.control_points_group_box_layout) # Layouting main_layout.addWidget(self.spline_editor_scene) main_layout.addWidget(properties_widget) self.setLayout(main_layout) # Connecting signals and slots self.spline_editor_scene.easing_curve_code_changed.connect(properties_widget.processCodeChanged) self.spline_editor_scene.easing_curve_code_changed.connect(self.process_easing_curve_code_changed)
def __init__(self, parent, *args, **kw): super(QDiffEdit, self).__init__(*args, **kw) self.left = LinkedTextEdit() self.left.orientation = 'left' self.left.setReadOnly(True) self.right = LinkedTextEdit() self.right.orientation = 'right' self.right.setReadOnly(True) self.connector = QDiffConnector() self.left.linked_widget = self.right self.right.linked_widget = self.left self.left.connector = self.connector self.right.connector = self.connector layout = QHBoxLayout() layout.setSpacing(0) layout.addWidget(self.left) layout.addWidget(self.connector) layout.addWidget(self.right) self.setLayout(layout)
def __init__(self, parent=None): super(AtomPropertiesWidget, self).__init__(parent) self.atom = None self.name_editor = QLineEdit() self.name_editor_groupbox = QGroupBox("Name") self.name_editor_groupbox_layout = QHBoxLayout() self.name_editor_groupbox.setLayout(self.name_editor_groupbox_layout) self.name_editor_groupbox_layout.addWidget(self.name_editor) self.name_editor_groupbox_layout.addStretch() main_layout = QVBoxLayout() main_layout.addWidget(self.name_editor_groupbox) main_layout.addStretch() self.setLayout(main_layout) self.name_editor.textChanged.connect(self.name_editor_text_changed) self.setDisabled(True)
def __init__(self, parent=None): super(RadialForcePropertiesWidget, self).__init__(parent) self.radial_force = None self.name_editor = QLineEdit() self.name_editor_groupbox = QGroupBox("Name") self.name_editor_groupbox_layout = QHBoxLayout() self.name_editor_groupbox.setLayout(self.name_editor_groupbox_layout) self.name_editor_groupbox_layout.addWidget(self.name_editor) self.name_editor_groupbox_layout.addStretch() self.explicit_bezier_curve_widget = ExplicitBezierCurveWidget() main_layout = QVBoxLayout() main_layout.addWidget(self.name_editor_groupbox) main_layout.addWidget(self.explicit_bezier_curve_widget) main_layout.addStretch() self.setLayout(main_layout) self.name_editor.textChanged.connect(self.name_editor_text_changed) self.explicit_bezier_curve_widget.bezier_curve_changed.connect(self.bezier_curve_changed) self.setDisabled(True)
def __init__(self, universe, parent=None): super(NaturalLawPropertiesWidget, self).__init__(parent) self.natural_law = None self.universe = universe self.name_editor = QLineEdit() self.name_editor_groupbox = QGroupBox("Name") self.name_editor_groupbox_layout = QHBoxLayout() self.name_editor_groupbox.setLayout(self.name_editor_groupbox_layout) self.name_editor_groupbox_layout.addWidget(self.name_editor) self.name_editor_groupbox_layout.addStretch() self.force_combo_box = QComboBox() self.force_combo_box.setModel(ForcesInUniverseListModel(universe)) self.atom_in_combo_box = QComboBox() self.atom_in_combo_box.setModel(AtomsInUniverseListModel(universe)) self.atom_out_combo_box = QComboBox() self.atom_out_combo_box.setModel(AtomsInUniverseListModel(universe)) self.transformation_label = QLabel() self.conversion_scheme_groupbox = QGroupBox("Conversion scheme") self.conversion_scheme_groupbox.setVisible(False) self.conversion_scheme_groupbox_layout = QGridLayout() self.conversion_scheme_groupbox.setLayout(self.conversion_scheme_groupbox_layout) self.conversion_scheme_groupbox_layout.addWidget(self.atom_in_combo_box, 1, 0) self.conversion_scheme_groupbox_layout.addWidget(self.force_combo_box, 0, 1) self.conversion_scheme_groupbox_layout.addWidget(self.atom_out_combo_box, 1, 2) self.conversion_scheme_groupbox_layout.addWidget(self.transformation_label, 1, 1) self.conversion_rate_formula_label = LatexLabelWidget() self.multiplicative_component_label = QLabel(u"υ = ") self.multiplicative_component_label.setFont(QFont("Times New Roman", 15, italic=True)) self.multiplicative_component_double_spinbox = QDoubleSpinBox() self.additive_component_label = QLabel(u"s = ") self.additive_component_label.setFont(QFont("Times New Roman", 15, italic=True)) self.additive_component_double_spinbox = QDoubleSpinBox() self.conversion_rate_groupbox = QGroupBox("Conversion rate") self.conversion_rate_groupbox_layout = QGridLayout() self.conversion_rate_groupbox.setLayout(self.conversion_rate_groupbox_layout) self.conversion_rate_groupbox_layout.addWidget(self.conversion_rate_formula_label, 0, 0, 1, 2) self.conversion_rate_groupbox_layout.addWidget(self.multiplicative_component_label, 1, 0) self.conversion_rate_groupbox_layout.addWidget(self.multiplicative_component_double_spinbox, 1, 1) self.conversion_rate_groupbox_layout.addWidget(self.additive_component_label, 2, 0) self.conversion_rate_groupbox_layout.addWidget(self.additive_component_double_spinbox, 2, 1) main_layout = QVBoxLayout() main_layout.addWidget(self.name_editor_groupbox) main_layout.addWidget(self.conversion_scheme_groupbox) main_layout.addWidget(self.conversion_rate_groupbox) main_layout.addStretch() self.setLayout(main_layout) self.name_editor.textChanged.connect(self.name_editor_text_changed) self.multiplicative_component_double_spinbox.valueChanged.connect(self.multiplicative_component_value_changed) self.additive_component_double_spinbox.valueChanged.connect(self.additive_component_value_changed) self.atom_in_combo_box.currentIndexChanged.connect(self.atom_in_combo_box_current_index_changed) self.setDisabled(True)
def __init__(self, parent=None): super(ExplicitBezierCurveWidget, self).__init__(parent) graphics_view = QGraphicsView() def graphics_view_resize_event(event): assert isinstance(event, QResizeEvent) graphics_view.fitInView(QRectF(0, -SCENE_SIZE_2, SCENE_SIZE, SCENE_SIZE), Qt.KeepAspectRatio) super(QGraphicsView, graphics_view).resizeEvent(event) graphics_view.resizeEvent = graphics_view_resize_event self.explicit_bezier_curve_scene = ExplicitBezierCurveScene(self) graphics_view.setScene(self.explicit_bezier_curve_scene) graphics_view.setRenderHints(QPainter.Antialiasing | QPainter.SmoothPixmapTransform) properties_group_box = QGroupBox() properties_group_box.setTitle("Properties") properties_group_box_layout = QVBoxLayout() properties_group_box.setLayout(properties_group_box_layout) # Degree degree_layout = QHBoxLayout() properties_group_box_layout.addLayout(degree_layout) degree_label = QLabel("Polynomial degree") self.degree_spinbox = QSpinBox() self.degree_spinbox.setRange(MIN_POLYNOMIAL_DEGREE, MAX_POLYNOMIAL_DEGREE) self.degree_spinbox.setValue(POLYNOMIAL_DEGREE_DEFAULT) self.degree_spinbox.valueChanged.connect(self.process_degree_changed) degree_label.setBuddy(self.degree_spinbox) degree_layout.addWidget(degree_label) degree_layout.addWidget(self.degree_spinbox) # X - range x_layout = QHBoxLayout() x_label = QLabel("X:") x_layout.addWidget(x_label) properties_group_box_layout.addLayout(x_layout) min_x_value_label = QLabel("Min") x_layout.addWidget(min_x_value_label) self.min_x_value_spinbox = QDoubleSpinBox() x_layout.addWidget(self.min_x_value_spinbox) self.min_x_value_spinbox.setRange(MIN_X_VALUE, DEFAULT_MAX_X_VALUE-MIN_X_RANGE) self.min_x_value_spinbox.setValue(DEFAULT_MIN_X_VALUE) self.min_x_value_spinbox.valueChanged.connect(self.process_min_x_value_changed) max_x_value_label = QLabel("Max") x_layout.addWidget(max_x_value_label) self.max_x_value_spinbox = QDoubleSpinBox() x_layout.addWidget(self.max_x_value_spinbox) self.max_x_value_spinbox.setRange(DEFAULT_MIN_X_VALUE - MIN_X_RANGE, MAX_X_VALUE) self.max_x_value_spinbox.setValue(DEFAULT_MAX_X_VALUE) self.max_x_value_spinbox.valueChanged.connect(self.process_max_x_value_changed) # Y - range y_layout = QHBoxLayout() properties_group_box_layout.addLayout(y_layout) y_label = QLabel("Y:") y_layout.addWidget(y_label) min_y_value_label = QLabel("Min") y_layout.addWidget(min_y_value_label) self.min_y_value_spinbox = QDoubleSpinBox() self.min_y_value_spinbox.setRange(MIN_Y_VALUE, DEFAULT_MAX_Y_VALUE-MIN_Y_RANGE) self.min_y_value_spinbox.setValue(DEFAULT_MIN_Y_VALUE) self.min_y_value_spinbox.valueChanged.connect(self.process_min_value_changed) min_y_value_label.setBuddy(self.min_y_value_spinbox) y_layout.addWidget(self.min_y_value_spinbox) max_y_value_label = QLabel("Max") y_layout.addWidget(max_y_value_label) self.max_y_value_spinbox = QDoubleSpinBox() self.max_y_value_spinbox.setRange(DEFAULT_MIN_Y_VALUE - MIN_Y_RANGE, MAX_Y_VALUE) self.max_y_value_spinbox.setValue(DEFAULT_MAX_Y_VALUE) self.max_y_value_spinbox.valueChanged.connect(self.process_max_value_changed) max_y_value_label.setBuddy(self.max_y_value_spinbox) y_layout.addWidget(self.max_y_value_spinbox) properties_group_box_layout.addStretch() self.polynom_widget = LatexLabelWidget() main_layout = QVBoxLayout() upper_layout = QVBoxLayout() upper_layout.addWidget(graphics_view) upper_layout.addWidget(properties_group_box) main_layout.addLayout(upper_layout) main_layout.addWidget(self.polynom_widget) self.setLayout(main_layout) self.process_control_points_changed()
def __init__(self, parent=None): super(PaneWidget, self).__init__(parent) self.point_label = QLabel("p<N>") self.x_label = QLabel("x") self.y_label = QLabel("y") self.x_spin_box = QDoubleSpinBox() self.y_spin_box = QDoubleSpinBox() self.smooth_checkbox = QCheckBox() main_layout = QHBoxLayout() main_layout.addWidget(self.point_label) main_layout.addWidget(self.x_label) main_layout.addWidget(self.x_spin_box) main_layout.addWidget(self.y_label) main_layout.addWidget(self.y_spin_box) main_layout.addWidget(self.smooth_checkbox) main_layout.addSpacing(0) self.setLayout(main_layout)
def __init__(self, parent=None): super(UniverseWidget, self).__init__(parent) self.universe_graphics_scene = UniverseScene(self) self.universe_graphics_view = QGraphicsView(self.universe_graphics_scene) self.universe_graphics_view.setRenderHint(QPainter.Antialiasing) self.game_scene_widget = GameSceneWidget() self.game_scene_widget.visualization.universe = self.universe_graphics_scene.universe_item.universe self.middle_container_widget = QTabWidget() self.middle_container_widget.addTab(self.universe_graphics_view, "Elements relations") self.middle_container_widget.addTab(self.game_scene_widget, "Game scene") self.matters_stencils_scene = QGraphicsScene() self.matters_stencils_view = QGraphicsView(self.matters_stencils_scene) self.matters_stencils_scene.addItem(MatterToolboxItem()) self.atoms_stencils_scene = QGraphicsScene() self.atoms_stencils_view = QGraphicsView(self.atoms_stencils_scene) self.atoms_stencils_scene.addItem(AtomToolboxItem()) self.forces_stencils_scene = QGraphicsScene() self.forces_stencils_view = QGraphicsView(self.forces_stencils_scene) radial_force_toolbox_item = RadialForceToolboxItem() expression_based_force_toolbox_item = ExpressionBasedForceToolboxItem() bitmap_force_toolbox_item = BitmapForceToolboxItem() self.forces_stencils_scene.addItem(radial_force_toolbox_item) self.forces_stencils_scene.addItem(expression_based_force_toolbox_item) self.forces_stencils_scene.addItem(bitmap_force_toolbox_item) force_stencils_container_graphics_layout = QGraphicsLinearLayout(Qt.Vertical) force_stencils_container_graphics_layout.addItem(radial_force_toolbox_item) force_stencils_container_graphics_layout.addItem(expression_based_force_toolbox_item) force_stencils_container_graphics_layout.addItem(bitmap_force_toolbox_item) force_stencils_container_graphics_widget = QGraphicsWidget() force_stencils_container_graphics_widget.setLayout(force_stencils_container_graphics_layout) self.forces_stencils_scene.addItem(force_stencils_container_graphics_widget) self.natural_laws_stencils_scene = QGraphicsScene() self.natural_laws_stencils_view = QGraphicsView(self.natural_laws_stencils_scene) self.natural_laws_stencils_scene.addItem(NaturalLawToolboxItem()) self.agents_stencils_scene = QGraphicsScene() self.agents_stencils_view = QGraphicsView(self.agents_stencils_scene) self.agents_stencils_scene.addItem(AgentToolboxItem()) self.sensors_stencils_scene = QGraphicsScene() self.sensors_stencils_view = QGraphicsView(self.sensors_stencils_scene) self.sensors_stencils_scene.addItem(SensorToolboxItem()) self.tool_box = QToolBox() self.tool_box.addItem(self.matters_stencils_view, "Matters") self.tool_box.addItem(self.atoms_stencils_view, "Atoms") self.tool_box.addItem(self.forces_stencils_view, "Forces") self.tool_box.addItem(self.natural_laws_stencils_view, "Natural laws") self.tool_box.addItem(self.agents_stencils_view, "Agents") self.tool_box.addItem(self.sensors_stencils_view, "Sensors") self.properties_widget = PropertiesWidget(self.game_scene_widget.visualization.universe) main_layout = QHBoxLayout() main_layout.addWidget(self.tool_box, 1) main_layout.addWidget(self.middle_container_widget, 3) main_layout.addWidget(self.properties_widget, 1) self.setCentralWidget(QWidget()) self.centralWidget().setLayout(main_layout) self.universe_graphics_scene.properties_bindings_update_required.connect( self.update_properties_bindings) self.universe_graphics_scene.properties_bindings_disconnect_required.connect( self.disconnect_graphics_item_from_properties_widget) self.create_actions() self.setup_toolbar()
class NaturalLawPropertiesWidget(QWidget): """ This widget modifies properties of a natural law """ def __init__(self, universe, parent=None): super(NaturalLawPropertiesWidget, self).__init__(parent) self.natural_law = None self.universe = universe self.name_editor = QLineEdit() self.name_editor_groupbox = QGroupBox("Name") self.name_editor_groupbox_layout = QHBoxLayout() self.name_editor_groupbox.setLayout(self.name_editor_groupbox_layout) self.name_editor_groupbox_layout.addWidget(self.name_editor) self.name_editor_groupbox_layout.addStretch() self.force_combo_box = QComboBox() self.force_combo_box.setModel(ForcesInUniverseListModel(universe)) self.atom_in_combo_box = QComboBox() self.atom_in_combo_box.setModel(AtomsInUniverseListModel(universe)) self.atom_out_combo_box = QComboBox() self.atom_out_combo_box.setModel(AtomsInUniverseListModel(universe)) self.transformation_label = QLabel() self.conversion_scheme_groupbox = QGroupBox("Conversion scheme") self.conversion_scheme_groupbox.setVisible(False) self.conversion_scheme_groupbox_layout = QGridLayout() self.conversion_scheme_groupbox.setLayout(self.conversion_scheme_groupbox_layout) self.conversion_scheme_groupbox_layout.addWidget(self.atom_in_combo_box, 1, 0) self.conversion_scheme_groupbox_layout.addWidget(self.force_combo_box, 0, 1) self.conversion_scheme_groupbox_layout.addWidget(self.atom_out_combo_box, 1, 2) self.conversion_scheme_groupbox_layout.addWidget(self.transformation_label, 1, 1) self.conversion_rate_formula_label = LatexLabelWidget() self.multiplicative_component_label = QLabel(u"υ = ") self.multiplicative_component_label.setFont(QFont("Times New Roman", 15, italic=True)) self.multiplicative_component_double_spinbox = QDoubleSpinBox() self.additive_component_label = QLabel(u"s = ") self.additive_component_label.setFont(QFont("Times New Roman", 15, italic=True)) self.additive_component_double_spinbox = QDoubleSpinBox() self.conversion_rate_groupbox = QGroupBox("Conversion rate") self.conversion_rate_groupbox_layout = QGridLayout() self.conversion_rate_groupbox.setLayout(self.conversion_rate_groupbox_layout) self.conversion_rate_groupbox_layout.addWidget(self.conversion_rate_formula_label, 0, 0, 1, 2) self.conversion_rate_groupbox_layout.addWidget(self.multiplicative_component_label, 1, 0) self.conversion_rate_groupbox_layout.addWidget(self.multiplicative_component_double_spinbox, 1, 1) self.conversion_rate_groupbox_layout.addWidget(self.additive_component_label, 2, 0) self.conversion_rate_groupbox_layout.addWidget(self.additive_component_double_spinbox, 2, 1) main_layout = QVBoxLayout() main_layout.addWidget(self.name_editor_groupbox) main_layout.addWidget(self.conversion_scheme_groupbox) main_layout.addWidget(self.conversion_rate_groupbox) main_layout.addStretch() self.setLayout(main_layout) self.name_editor.textChanged.connect(self.name_editor_text_changed) self.multiplicative_component_double_spinbox.valueChanged.connect(self.multiplicative_component_value_changed) self.additive_component_double_spinbox.valueChanged.connect(self.additive_component_value_changed) self.atom_in_combo_box.currentIndexChanged.connect(self.atom_in_combo_box_current_index_changed) self.setDisabled(True) def switch_to_natural_law(self, natural_law): """ This method initializes widget with current state of natural law provided and keeps and eye on specific natural law by writing changes to NaturalLaw object as far as properties are modified in graphical interface :param natural_law: a natural law in concern :type natural_law: engine.NaturalLaw :return: Nothing """ self.natural_law = natural_law self.name_editor.setText(self.natural_law.name) if self.natural_law.atom_in is not None: self.atom_in_combo_box.setCurrentIndex(self.universe.atoms.index(self.natural_law.atom_in)) if self.natural_law.atom_out is not None: self.atom_out_combo_box.setCurrentIndex(self.universe.atoms.index(self.natural_law.atom_out)) if self.natural_law.accelerator is not None: self.force_combo_box.setCurrentIndex(self.universe.forces.index(self.natural_law.accelerator)) self.multiplicative_component_double_spinbox.setValue(self.natural_law.multiplicative_component) self.additive_component_double_spinbox.setValue(self.natural_law.additive_component) self.update_conversion_rate_formula_label() self.setEnabled(True) def invalidate(self): self.switch_to_natural_law(self.natural_law) def name_editor_text_changed(self, value): self.natural_law.name = value def multiplicative_component_value_changed(self, value): self.natural_law.multiplicative_component = value self.update_conversion_rate_formula_label() def additive_component_value_changed(self, value): self.natural_law.additive_component = value self.update_conversion_rate_formula_label() def update_conversion_rate_formula_label(self): self.conversion_rate_formula_label.text.set_text( "$ f * \upsilon + s = f * {upsilon} + {s} $".format( upsilon=self.natural_law.multiplicative_component, s=self.natural_law.additive_component ) ) self.conversion_rate_formula_label.draw() def atom_in_combo_box_current_index_changed(self, index): # here we should remove the previous connection. pass