class SpinBoxAction(QWidget): def __init__(self, parent=None, text: str = "", min: int = 0, max: int = 10, val: int = 5): super().__init__(parent=parent) self.setLayout(QtWidgets.QHBoxLayout(self)) self.label = QLabel(text) self.layout().addWidget(self.label) self.layout().setMargin(1) self.combo = QSpinBox(self) self.layout().addWidget(self.combo) self.setRange(min, max) self.combo.setValue(val) def setText(self, text: str) -> None: self.label.setText(text) def setRange(self, min: int, max: int) -> None: self.combo.setMinimum(min) self.combo.setMaximum(max) def getSelectedItem(self) -> int: return self.combo.value()
def change_deltagen_port(self): box = QMessageBox(self) box.setText( _('Port zwischen 3000-3999 angeben. ' 'Muss mit DeltaGen>Preferences>Tools>External Commands übereinstimmen.' )) box.setWindowTitle(_('DeltaGen Kommando Port')) port = QSpinBox(box) port.setMinimum(3000) port.setMaximum(3999) port.setValue(KnechtSettings.dg.get('port', DG_TCP_PORT)) box.layout().addWidget(port, box.layout().rowCount() - 1, 0, 1, box.layout().columnCount()) box.layout().addWidget( box.layout().takeAt(box.layout().rowCount() - 1).widget(), box.layout().rowCount(), 0, 1, box.layout().columnCount()) box.exec_() if 3000 <= port.value() <= 3999: KnechtSettings.dg['port'] = port.value() box = QMessageBox(self) box.setText( _('Anwendung neu starten um geänderten Port zu übernehmen.')) box.setWindowTitle(_('Neustart erforderlich')) box.exec_()
def __create_spinbox_label(self, value: int, label: str, minimum: int, maximum: int, min_width: int = 200) -> Tuple[Dict, Dict]: """__create_line_label will create a spinner and corresponding label Arguments: value {int} -- Default value label {str} -- Label name minimum {int} -- Minimum value maximum {int} -- Maximum value min_width {int} -- Minium width (default: {200}) Returns: Tuple[Dict, Dict] -- Line Edit, Label """ spin_box = QSpinBox() spin_box.setValue(value) spin_box.setMinimumWidth(min_width) spin_box.setMinimum(minimum) spin_box.setMaximum(maximum) label = QLabel(label) label.setBuddy(spin_box) return spin_box, label
def createEditor(self, parent, option, index): spinBox = QSpinBox(parent) spinBox.setMinimum(-100000) spinBox.setMaximum(100000) self.connect(spinBox, SIGNAL("valueChanged(int)"), self, SLOT("valueChanged()")) return spinBox
class Config(SignalNode.Config): """Config widget displayed for ArtificialDelay.""" def __init__(self, parent=None): super().__init__(parent=parent) self.delay = QSpinBox() self.delay.setSuffix(" ms") self.delay.setMinimum(0) self.delay.setMaximum(1000000) self.delay.valueChanged.connect(self.updateModel) layout = QFormLayout() self.setLayout(layout) layout.addRow("Delay:", self.delay) def updateModel(self): n = self.node() if n is None: return n.setDelay(self.delay.value()) def updateView(self): n = self.node() if n is None: return self.delay.blockSignals(True) self.delay.setValue(n.delay()) self.delay.blockSignals(False)
class MainWindow(QDialog): def onSpinPointsChanged(self): self.OpenGLWidget.setIterations(self.iterationsSpinBox.value()) self.iterationsSlider.setValue(self.iterationsSpinBox.value()) # onSpinPointsChanged def onSliderPointsChanged(self): self.OpenGLWidget.setIterations(self.iterationsSpinBox.value()) self.iterationsSpinBox.setValue(self.iterationsSlider.value()) # onSliderPointsChanged def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.setFixedSize(1200, 920) self.setWindowTitle("Vlasov Roman lr3") # OpenGL widget glWidgetW = 800 glWidgetH = 900 self.OpenGLWidget = OpenGLView() self.OpenGLWidget.setFixedSize(glWidgetW, glWidgetH) self.OpenGLWidget.setIterations(0) # number of iterations minIter = 0 maxIter = 6 self.iterationsLabel = QLabel("Number of iterations: ") self.iterationsSpinBox = QSpinBox() self.iterationsSpinBox.setMinimum(minIter) self.iterationsSpinBox.setMaximum(maxIter) self.iterationsSpinBox.valueChanged.connect(self.onSpinPointsChanged) self.iterationsSlider = QSlider(QtCore.Qt.Horizontal) self.iterationsSlider.setMinimum(minIter) self.iterationsSlider.setMaximum(maxIter) self.iterationsSlider.valueChanged.connect(self.onSliderPointsChanged) self.iterationsMinLabel = QLabel("Min: %d" % minIter) self.iterationsMinLabel.setFixedWidth(40) self.iterationsMaxLabel = QLabel("Max: %d" % maxIter) self.iterationsMaxLabel.setFixedWidth(60) line1 = QFrame() line1.setFrameShape(QFrame.HLine) layoutAmount = QHBoxLayout() layoutAmount.addWidget(self.iterationsMinLabel) layoutAmount.addWidget(self.iterationsSpinBox) layoutAmount.addWidget(self.iterationsMaxLabel) # tools panel layout layoutTools = QVBoxLayout() layoutTools.addWidget(self.iterationsLabel) layoutTools.addLayout(layoutAmount) layoutTools.addWidget(self.iterationsSlider) verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding) layoutTools.addItem(verticalSpacer) # window layout layout = QHBoxLayout() layout.addWidget(self.OpenGLWidget) layout.addLayout(layoutTools) self.setLayout(layout)
class QFlightSlotEditor(QGroupBox): def __init__(self, package_model: PackageModel, flight: Flight, game: Game): super().__init__("Slots") self.package_model = package_model self.flight = flight self.game = game self.inventory = self.game.aircraft_inventory.for_control_point( flight.from_cp) available = self.inventory.available(self.flight.unit_type) max_count = self.flight.count + available if max_count > 4: max_count = 4 layout = QGridLayout() self.aircraft_count = QLabel("Aircraft count:") self.aircraft_count_spinner = QSpinBox() self.aircraft_count_spinner.setMinimum(1) self.aircraft_count_spinner.setMaximum(max_count) self.aircraft_count_spinner.setValue(flight.count) self.aircraft_count_spinner.valueChanged.connect( self._changed_aircraft_count) layout.addWidget(self.aircraft_count, 0, 0) layout.addWidget(self.aircraft_count_spinner, 0, 1) layout.addWidget(QLabel("Squadron:"), 1, 0) layout.addWidget(QLabel(str(self.flight.squadron)), 1, 1) layout.addWidget(QLabel("Assigned pilots:"), 2, 0) self.roster_editor = FlightRosterEditor(flight.roster) layout.addLayout(self.roster_editor, 2, 1) self.setLayout(layout) def _changed_aircraft_count(self): old_count = self.flight.count new_count = int(self.aircraft_count_spinner.value()) self.game.aircraft_inventory.return_from_flight(self.flight) self.flight.resize(new_count) try: self.game.aircraft_inventory.claim_for_flight(self.flight) except ValueError: # The UI should have prevented this, but if we ran out of aircraft # then roll back the inventory change. difference = new_count - self.flight.count available = self.inventory.available(self.flight.unit_type) logging.error( f"Could not add {difference} additional aircraft to " f"{self.flight} because {self.flight.departure} has only " f"{available} {self.flight.unit_type} remaining") self.game.aircraft_inventory.claim_for_flight(self.flight) self.flight.resize(old_count) return self.roster_editor.resize(new_count)
def createEditor(self, parent, option, index): if index.column() != 4: return QSqlRelationalDelegate.createEditor(self, parent, option, index) # For editing the year, return a spinbox with a range from -1000 to 2100. spinbox = QSpinBox(parent) spinbox.setFrame(False) spinbox.setMaximum(2100) spinbox.setMinimum(-1000) return spinbox
def createEditor( self, parent: QWidget, option: QStyleOptionViewItem, index: QModelIndex, ) -> PySide2.QtWidgets.QWidget: editor = QSpinBox(parent) editor.setFrame(False) editor.setMinimum(self.min) editor.setMaximum(self.max) return editor
class MyWidget(QWidget): def __init__(self): QWidget.__init__(self) self.amtLabel = QLabel('Loan Amount') self.roiLabel = QLabel('Rate of Interest') self.yrsLabel = QLabel('No. of Years') self.emiLabel = QLabel('EMI per month') self.emiValue = QLCDNumber() self.emiValue.setSegmentStyle(QLCDNumber.Flat) self.emiValue.setFixedSize(QSize(130, 30)) self.emiValue.setDigitCount(8) self.amtText = QLineEdit('10000') self.roiSpin = QSpinBox() self.roiSpin.setMinimum(1) self.roiSpin.setMaximum(15) self.yrsSpin = QSpinBox() self.yrsSpin.setMinimum(1) self.yrsSpin.setMaximum(20) self.roiDial = QDial() self.roiDial.setNotchesVisible(True) self.roiDial.setMaximum(15) self.roiDial.setMinimum(1) self.roiDial.setValue(1) self.yrsSlide = QSlider(Qt.Horizontal) self.yrsSlide.setMaximum(20) self.yrsSlide.setMinimum(1) self.calculateButton = QPushButton('Calculate EMI') self.myGridLayout = QGridLayout() self.myGridLayout.addWidget(self.amtLabel, 0, 0) self.myGridLayout.addWidget(self.roiLabel, 1, 0) self.myGridLayout.addWidget(self.yrsLabel, 2, 0) self.myGridLayout.addWidget(self.amtText, 0, 1) self.myGridLayout.addWidget(self.roiSpin, 1, 1) self.myGridLayout.addWidget(self.yrsSpin, 2, 1) self.myGridLayout.addWidget(self.roiDial, 1, 2) self.myGridLayout.addWidget(self.yrsSlide, 2, 2) self.myGridLayout.addWidget(self.calculateButton, 3, 1) self.setLayout(self.myGridLayout) self.setWindowTitle("A simple EMI calculator") self.roiDial.valueChanged.connect(self.roiSpin.setValue) self.connect(self.roiSpin, SIGNAL("valueChanged(int)"), self.roiDial.setValue) self.yrsSlide.valueChanged.connect(self.yrsSpin.setValue) self.connect(self.yrsSpin, SIGNAL("valueChanged(int)"),self.yrsSlide, SLOT("setValue(int)")) self.connect(self.calculateButton, SIGNAL("clicked()"),self.showEMI) def showEMI(self): loanAmount = float(self.amtText.text()) rateInterest = float(float(self.roiSpin.value() / 12) / 100) noMonths = int(self.yrsSpin.value() * 12) emi = (loanAmount * rateInterest) * ((((1 + rateInterest) ** noMonths) / (((1 + rateInterest) ** noMonths) - 1))) self.emiValue.display(emi) self.myGridLayout.addWidget(self.emiLabel, 4, 0) self.myGridLayout.addWidget(self.emiValue, 4, 2)
def onAdd(self): layout = QHBoxLayout() combo = QComboBox() spin = QSpinBox() spin.setMinimum(1) combo.currentIndexChanged.connect(self.onLibroSelect) for libro in self.libros: combo.addItem(libro['titulo'], libro) self.combos.append(combo) self.spins.append(spin) layout.addWidget(combo) layout.addWidget(spin) self.ui.layout_vertical_empleado.addLayout(layout) self.more()
class NetPositionUI(QWidget): def __init__(self, *args, **kwargs): super(NetPositionUI, self).__init__(*args, **kwargs) main_layout = QVBoxLayout() main_layout.setContentsMargins(QMargins(2, 1, 2, 1)) main_layout.setSpacing(1) # 操作栏 opt_layout = QHBoxLayout() self.interval_days = QSpinBox(self) self.interval_days.setMinimum(1) self.interval_days.setMaximum(30) self.interval_days.setValue(5) self.interval_days.setPrefix("日期间隔 ") self.interval_days.setSuffix(" 天") opt_layout.addWidget(self.interval_days) self.query_button = QPushButton('确定', self) opt_layout.addWidget(self.query_button) self.tip_label = QLabel('左侧可选择间隔天数,确定查询数据. ', self) opt_layout.addWidget(self.tip_label) opt_layout.addStretch() main_layout.addLayout(opt_layout) # 显示数据的表 self.data_table = QTableWidget(self) self.data_table.setFrameShape(QFrame.NoFrame) self.data_table.setEditTriggers(QAbstractItemView.NoEditTriggers) # 不可编辑 self.data_table.setFocusPolicy(Qt.NoFocus) # 去选中时的虚线框 self.data_table.setAlternatingRowColors(True) # 交替行颜色 self.data_table.horizontalHeader().setDefaultSectionSize(85) # 默认的标题头宽 self.data_table.verticalHeader().hide() self.data_table.verticalHeader().setDefaultSectionSize(18) # 设置行高(与下行代码同时才生效) self.data_table.verticalHeader().setMinimumSectionSize(18) main_layout.addWidget(self.data_table) self.setLayout(main_layout) self.tip_label.setObjectName("tipLabel") self.data_table.setObjectName("dataTable") self.data_table.horizontalHeader().setStyleSheet("QHeaderView::section," "QTableCornerButton::section{height:25px;background-color:rgb(243,245,248);font-weight:bold;font-size:13px}") self.setStyleSheet( "#tipLabel{color:rgb(230,50,50);font-weight:bold;}" "#dataTable::item{padding:2px}" "#dataTable{selection-color:rgb(255,255,255);selection-background-color:rgb(51,143,255);alternate-background-color:rgb(245,250,248)}" )
class RelayNumberDialog(QDialog): def __init__(self): super().__init__(GlobalAccess().get_main_window()) def exec_(self): self.init_ui() return super().exec_() def init_ui(self): self.setWindowTitle(_('Relay number')) self.setWindowIcon(QIcon(config.ICON)) self.setSizeGripEnabled(False) self.setModal(True) self.layout = QFormLayout(self) self.number_label = QLabel(_('First relay number')) self.number_item = QSpinBox() self.number_item.setMinimum(1001) self.number_item.setMaximum(9999) next_number = get_next_relay_number_protocol() self.number_item.setValue(next_number) self.layout.addRow(self.number_label, self.number_item) def cancel_changes(): self.close() def apply_changes(): try: self.apply_changes_impl() except Exception as e: logging.error(str(e)) self.close() button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) self.button_ok = button_box.button(QDialogButtonBox.Ok) self.button_ok.setText(_('OK')) self.button_ok.clicked.connect(apply_changes) self.button_cancel = button_box.button(QDialogButtonBox.Cancel) self.button_cancel.setText(_('Cancel')) self.button_cancel.clicked.connect(cancel_changes) self.layout.addRow(button_box) self.show() def apply_changes_impl(self): set_next_relay_number(self.number_item.value())
def add_spinner_for( self, row: int, name: str, description: BoundedIntOption ) -> None: def on_changed(value: int) -> None: self.settings.__dict__[name] = value if description.causes_expensive_game_update: self.write_full_settings() spinner = QSpinBox() spinner.setMinimum(description.min) spinner.setMaximum(description.max) spinner.setValue(self.settings.__dict__[name]) spinner.valueChanged.connect(on_changed) self.addWidget(spinner, row, 1, Qt.AlignRight)
def _on_group_changed(self, combo, v_type='ev', index=0, new_val='N/A'): self._rearrange_groups() layout = getattr(self.ui, f"layout_{v_type}{index}") for i in reversed(range(layout.count())): item = layout.itemAt(i) if item.widget() is not None: item.widget().setParent(None) for _ in range(5 - combo.currentIndex()): layout.addWidget(QWidget()) for _ in range(combo.currentIndex()): spin = QSpinBox(parent=self) spin.setMaximumSize(QSize(70, 100)) spin.setAlignment(Qt.AlignRight | Qt.AlignTrailing | Qt.AlignVCenter) spin.setMinimum(MIN_VARIABLES[v_type][index]) spin.setMaximum(MAX_VARIABLES[v_type][index]) layout.addWidget(spin)
def __init__(self): super().__init__() self.setWindowTitle("Line edit") widget = QSpinBox() # QDoubleSpinBox is for floats widget.setMinimum(-10) widget.setMaximum(3) # or: widget.setRange(-10, 3) widget.setPrefix("$") widget.setSuffix("c") widget.setSingleStep(3) widget.valueChanged.connect(self.value_changed) widget.valueChanged[str].connect(self.value_changed_str) self.setCentralWidget(widget)
def editor(self): w = QWidget() l = QFormLayout(w) width = QSpinBox() width.setMinimum(1) width.setMaximum(MAX_WIDTH) width.setValue(self.desc.width) l.addRow('Width', width) def _set_width(value): self.desc.width = value width.valueChanged.connect(_set_width) return w
def createEditor(self, parent): """ Creates a QSpinBox instance for GUI editing of integer values :param parent: the parent of the widget :return: a QSpinBox instance """ res = QSpinBox(parent) res.setFrame(False) if "min" in self._options: res.setMinimum(self._options["min"]) else: res.setMinimum(-2147483648) if "max" in self._options: res.setMaximum(self._options["max"]) else: res.setMaximum(2147483647) return res
def __init__(self): super().__init__() self.setWindowTitle("My App") widget = QSpinBox() # Or: widget = QDoubleSpinBox() widget.setMinimum(-10) widget.setMaximum(3) # Or: widget.setRange(-10,3) widget.setPrefix("$") widget.setSuffix("c") widget.setSingleStep(3) # Or e.g. 0.5 for QDoubleSpinBox widget.valueChanged.connect(self.value_changed) widget.textChanged.connect(self.value_changed_str) self.setCentralWidget(widget)
class VDlgEditCounter(VDialogEdit): def __init__(self, parent, current_val): """ Counter editor :param parent: gui's main window :param current_val: current field actual value (to set by default) """ VDialogEdit.__init__(self, parent, current_val) self.spin_box = QSpinBox() self.spin_box.setMinimum(-10) if current_val: self.spin_box.setValue(int(current_val)) self.main_layout.addWidget(self.spin_box, 0, 0, 1, 2) def new_value(self): return self.spin_box.value()
def show_party_form(self): party_form = QMessageBox() party_form.setWindowTitle('Create a network party') _label_name = QLabel('Name:') _label_limit = QLabel('Limit of players:') _edit_name = QLineEdit() _edit_name.setText(Miscellaneous.get_random_word()) _spinbox_limit = QSpinBox() _spinbox_limit.setMaximum(10) _spinbox_limit.setMinimum(1) _spinbox_limit.setValue(2) create_party_widgets = [_label_name, _edit_name, _label_limit, _spinbox_limit] for widget in create_party_widgets: party_form.layout().addWidget(widget) party_form.setStandardButtons(QMessageBox.Save | QMessageBox.Cancel) ret = party_form.exec_() if ret == QMessageBox.Save: _party_model = _edit_name.text(), int(_spinbox_limit.text()), self.controller.get_name() self.controller.create_party(_party_model)
def setupSTFTLayout(self): STFTSettLayout = QFormLayout(self) for winType in self.specWindows: if self.specWindows[winType][1] == int: paramEdit = QSpinBox() else: paramEdit = QDoubleSpinBox() paramEdit.setMinimum(self.specWindows[winType][2]) paramEdit.setMaximum(self.specWindows[winType][3]) paramEdit.setValue(self.specWindows[winType][4]) paramLabel = QLabel(self.specWindows[winType][0]) self.specWindows[winType] = [paramLabel, paramEdit] self.winTypeChooser = QComboBox() for winType in self.winTypes: self.winTypeChooser.addItem(winType) self.winTypeChooser.currentTextChanged.connect(self.windowChanged) self.winTypeChooser.setCurrentText('hann') STFTSettLayout.addRow('Window type', self.winTypeChooser) self.maxFreqEdit = QSpinBox() self.maxFreqEdit.setMaximum(self.fs / 2) self.maxFreqEdit.setValue(self.defaultParam['maxFreq']) STFTSettLayout.addRow('Max output Frequency (Hz)', self.maxFreqEdit) self.nPerSegEdit = QSpinBox() self.nPerSegEdit.setMaximum(1000) self.nPerSegEdit.setValue(self.defaultParam['nPerSeg']) STFTSettLayout.addRow('Length of segment (samples)', self.nPerSegEdit) self.nOverlapEdit = QSpinBox() self.nOverlapEdit.setMaximum(1000) self.nOverlapEdit.setValue(self.defaultParam['nOverlap']) STFTSettLayout.addRow('Overlap (samples)', self.nOverlapEdit) for winType in self.specWindows: paramLabel = self.specWindows[winType][0] paramEdit = self.specWindows[winType][1] STFTSettLayout.addRow(paramLabel, paramEdit)
class Window(QWidget): def __init__(self): super(Window, self).__init__() self.setWindowTitle("Pyside2 SpinBox") self.setGeometry(300, 300, 300, 300) self.createSpinBox() self.spinValue() def createSpinBox(self): vbox = QVBoxLayout() self.label = QLabel() self.spinBox = QSpinBox() self.spinBox.setMinimum(10) self.spinBox.setMaximum(100) self.spinBox.valueChanged.connect(self.spinValue) vbox.addWidget(self.label) vbox.addWidget(self.spinBox) self.setLayout(vbox) def spinValue(self): self.label.setText(str(self.spinBox.value()))
def editor(self): w = QWidget() l = QFormLayout(w) width = QSpinBox() width.setMinimum(1) width.setMaximum(MAX_WIDTH) width.setValue(self.desc.width) def _set_width(value): self.desc.width = value width.valueChanged.connect(_set_width) l.addRow('Width', width) num_inputs = QSpinBox() num_inputs.setMinimum(2) num_inputs.setValue(self.desc.num_inputs) num_inputs.valueChanged.connect(self._set_num_inputs) l.addRow('Number of inputs', num_inputs) return w
class SequenceRecordItem: def __init__(self, parent, seq_record, font): self.seq_record = seq_record self.parent = parent self.selectButton = QToolButton(parent) self.nameLabel = QLabel(parent) self.nameLabel.setFrameShape(QFrame.Box) self.nameLabel.setText(str(self.seq_record.name)) self.shiftLeftButton = QToolButton(parent) self.shiftLeftButton.setArrowType(Qt.LeftArrow) self.shiftRightButton = QToolButton(parent) self.shiftRightButton.setArrowType(Qt.RightArrow) self.shiftSpinBox = QSpinBox(parent) self.shiftSpinBox.setFrame(True) self.shiftSpinBox.setButtonSymbols(QSpinBox.NoButtons) self.shiftSpinBox.setMinimum(-999999) self.shiftSpinBox.setMaximum(999999) self.shiftSpinBox.setValue(0) self.seqLabel = SequenceRecordLabel(parent, font) self.widgets = [ self.selectButton, self.nameLabel, self.shiftLeftButton, self.shiftRightButton, self.shiftSpinBox, self.seqLabel ] self.shiftRightButton.clicked.connect(self.shiftSpinBox.stepUp) self.shiftLeftButton.clicked.connect(self.shiftSpinBox.stepDown) selected = False shift = 0 seq_select_beginning = 0 seq_select_end = 0
class QSettingsWindow(QDialog): def __init__(self, game: Game): super(QSettingsWindow, self).__init__() self.game = game self.setModal(True) self.setWindowTitle("Settings") self.setWindowIcon(CONST.ICONS["Settings"]) self.setMinimumSize(600, 250) self.initUi() def initUi(self): self.layout = QGridLayout() self.categoryList = QListView() self.right_layout = QStackedLayout() self.categoryList.setMaximumWidth(175) self.categoryModel = QStandardItemModel(self.categoryList) difficulty = QStandardItem("Difficulty") difficulty.setIcon(CONST.ICONS["Missile"]) difficulty.setEditable(False) difficulty.setSelectable(True) generator = QStandardItem("Mission Generator") generator.setIcon(CONST.ICONS["Generator"]) generator.setEditable(False) generator.setSelectable(True) cheat = QStandardItem("Cheat Menu") cheat.setIcon(CONST.ICONS["Cheat"]) cheat.setEditable(False) cheat.setSelectable(True) self.categoryList.setIconSize(QSize(32, 32)) self.categoryModel.appendRow(difficulty) self.categoryModel.appendRow(generator) self.categoryModel.appendRow(cheat) self.categoryList.setSelectionBehavior(QAbstractItemView.SelectRows) self.categoryList.setModel(self.categoryModel) self.categoryList.selectionModel().setCurrentIndex(self.categoryList.indexAt(QPoint(1,1)), QItemSelectionModel.Select) self.categoryList.selectionModel().selectionChanged.connect(self.onSelectionChanged) self.initDifficultyLayout() self.initGeneratorLayout() self.initCheatLayout() self.right_layout.addWidget(self.difficultyPage) self.right_layout.addWidget(self.generatorPage) self.right_layout.addWidget(self.cheatPage) self.layout.addWidget(self.categoryList, 0, 0, 1, 1) self.layout.addLayout(self.right_layout, 0, 1, 5, 1) self.setLayout(self.layout) def init(self): pass def initDifficultyLayout(self): self.difficultyPage = QWidget() self.difficultyLayout = QGridLayout() self.difficultyLayout.setAlignment(Qt.AlignTop) self.difficultyPage.setLayout(self.difficultyLayout) self.playerCoalitionSkill = QComboBox() self.enemyCoalitionSkill = QComboBox() self.enemyAASkill = QComboBox() for skill in CONST.SKILL_OPTIONS: self.playerCoalitionSkill.addItem(skill) self.enemyCoalitionSkill.addItem(skill) self.enemyAASkill.addItem(skill) self.playerCoalitionSkill.setCurrentIndex(CONST.SKILL_OPTIONS.index(self.game.settings.player_skill)) self.enemyCoalitionSkill.setCurrentIndex(CONST.SKILL_OPTIONS.index(self.game.settings.enemy_skill)) self.enemyAASkill.setCurrentIndex(CONST.SKILL_OPTIONS.index(self.game.settings.enemy_vehicle_skill)) self.playerCoalitionSkill.currentIndexChanged.connect(self.applySettings) self.enemyCoalitionSkill.currentIndexChanged.connect(self.applySettings) self.enemyAASkill.currentIndexChanged.connect(self.applySettings) self.difficultyLayout.addWidget(QLabel("Player coalition skill"), 0, 0) self.difficultyLayout.addWidget(self.playerCoalitionSkill, 0, 1, Qt.AlignRight) self.difficultyLayout.addWidget(QLabel("Enemy skill"), 1, 0) self.difficultyLayout.addWidget(self.enemyCoalitionSkill, 1, 1, Qt.AlignRight) self.difficultyLayout.addWidget(QLabel("Enemy AA and vehicles skill"), 2, 0) self.difficultyLayout.addWidget(self.enemyAASkill, 2, 1, Qt.AlignRight) self.difficultyLabel = QComboBox() [self.difficultyLabel.addItem(t) for t in CONST.LABELS_OPTIONS] self.difficultyLabel.setCurrentIndex(CONST.LABELS_OPTIONS.index(self.game.settings.labels)) self.difficultyLabel.currentIndexChanged.connect(self.applySettings) self.difficultyLayout.addWidget(QLabel("In Game Labels"), 3, 0) self.difficultyLayout.addWidget(self.difficultyLabel, 3, 1, Qt.AlignRight) self.noNightMission = QCheckBox() self.noNightMission.setChecked(self.game.settings.night_disabled) self.noNightMission.toggled.connect(self.applySettings) self.difficultyLayout.addWidget(QLabel("No night missions"), 4, 0) self.difficultyLayout.addWidget(self.noNightMission, 4, 1, Qt.AlignRight) self.mapVisibiitySelection = QComboBox() self.mapVisibiitySelection.addItem("All", ForcedOptions.Views.All) if self.game.settings.map_coalition_visibility == ForcedOptions.Views.All: self.mapVisibiitySelection.setCurrentIndex(0) self.mapVisibiitySelection.addItem("Fog of War", ForcedOptions.Views.Allies) if self.game.settings.map_coalition_visibility == ForcedOptions.Views.Allies: self.mapVisibiitySelection.setCurrentIndex(1) self.mapVisibiitySelection.addItem("Allies Only", ForcedOptions.Views.OnlyAllies) if self.game.settings.map_coalition_visibility == ForcedOptions.Views.OnlyAllies: self.mapVisibiitySelection.setCurrentIndex(2) self.mapVisibiitySelection.addItem("Own Aircraft Only", ForcedOptions.Views.MyAircraft) if self.game.settings.map_coalition_visibility == ForcedOptions.Views.MyAircraft: self.mapVisibiitySelection.setCurrentIndex(3) self.mapVisibiitySelection.addItem("Map Only", ForcedOptions.Views.OnlyMap) if self.game.settings.map_coalition_visibility == ForcedOptions.Views.OnlyMap: self.mapVisibiitySelection.setCurrentIndex(4) self.mapVisibiitySelection.currentIndexChanged.connect(self.applySettings) self.difficultyLayout.addWidget(QLabel("Map visibility options"), 5, 0) self.difficultyLayout.addWidget(self.mapVisibiitySelection, 5, 1, Qt.AlignRight) self.ext_views = QCheckBox() self.ext_views.setChecked(self.game.settings.external_views_allowed) self.ext_views.toggled.connect(self.applySettings) self.difficultyLayout.addWidget(QLabel("Allow external views"), 6, 0) self.difficultyLayout.addWidget(self.ext_views, 6, 1, Qt.AlignRight) def initGeneratorLayout(self): self.generatorPage = QWidget() self.generatorLayout = QVBoxLayout() self.generatorLayout.setAlignment(Qt.AlignTop) self.generatorPage.setLayout(self.generatorLayout) self.gameplay = QGroupBox("Gameplay") self.gameplayLayout = QGridLayout(); self.gameplayLayout.setAlignment(Qt.AlignTop) self.gameplay.setLayout(self.gameplayLayout) self.supercarrier = QCheckBox() self.supercarrier.setChecked(self.game.settings.supercarrier) self.supercarrier.toggled.connect(self.applySettings) self.generate_marks = QCheckBox() self.generate_marks.setChecked(self.game.settings.generate_marks) self.generate_marks.toggled.connect(self.applySettings) if not hasattr(self.game.settings, "include_jtac_if_available"): self.game.settings.include_jtac_if_available = True self.include_jtac_if_available = QCheckBox() self.include_jtac_if_available.setChecked(self.game.settings.include_jtac_if_available) self.include_jtac_if_available.toggled.connect(self.applySettings) self.gameplayLayout.addWidget(QLabel("Use Supercarrier Module"), 0, 0) self.gameplayLayout.addWidget(self.supercarrier, 0, 1, Qt.AlignRight) self.gameplayLayout.addWidget(QLabel("Put Objective Markers on Map"), 1, 0) self.gameplayLayout.addWidget(self.generate_marks, 1, 1, Qt.AlignRight) self.gameplayLayout.addWidget(QLabel("Include JTAC (If available)"), 2, 0) self.gameplayLayout.addWidget(self.include_jtac_if_available, 2, 1, Qt.AlignRight) self.performance = QGroupBox("Performance") self.performanceLayout = QGridLayout() self.performanceLayout.setAlignment(Qt.AlignTop) self.performance.setLayout(self.performanceLayout) self.smoke = QCheckBox() self.smoke.setChecked(self.game.settings.perf_smoke_gen) self.smoke.toggled.connect(self.applySettings) self.red_alert = QCheckBox() self.red_alert.setChecked(self.game.settings.perf_red_alert_state) self.red_alert.toggled.connect(self.applySettings) self.arti = QCheckBox() self.arti.setChecked(self.game.settings.perf_artillery) self.arti.toggled.connect(self.applySettings) self.moving_units = QCheckBox() self.moving_units.setChecked(self.game.settings.perf_moving_units) self.moving_units.toggled.connect(self.applySettings) self.infantry = QCheckBox() self.infantry.setChecked(self.game.settings.perf_infantry) self.infantry.toggled.connect(self.applySettings) self.ai_parking_start = QCheckBox() self.ai_parking_start.setChecked(self.game.settings.perf_ai_parking_start) self.ai_parking_start.toggled.connect(self.applySettings) self.destroyed_units = QCheckBox() self.destroyed_units.setChecked(self.game.settings.perf_destroyed_units) self.destroyed_units.toggled.connect(self.applySettings) self.culling = QCheckBox() self.culling.setChecked(self.game.settings.perf_culling) self.culling.toggled.connect(self.applySettings) self.culling_distance = QSpinBox() self.culling_distance.setMinimum(50) self.culling_distance.setMaximum(10000) self.culling_distance.setValue(self.game.settings.perf_culling_distance) self.culling_distance.valueChanged.connect(self.applySettings) self.performanceLayout.addWidget(QLabel("Smoke visual effect on frontline"), 0, 0) self.performanceLayout.addWidget(self.smoke, 0, 1, alignment=Qt.AlignRight) self.performanceLayout.addWidget(QLabel("SAM starts in RED alert mode"), 1, 0) self.performanceLayout.addWidget(self.red_alert, 1, 1, alignment=Qt.AlignRight) self.performanceLayout.addWidget(QLabel("Artillery strikes"), 2, 0) self.performanceLayout.addWidget(self.arti, 2, 1, alignment=Qt.AlignRight) self.performanceLayout.addWidget(QLabel("Moving ground units"), 3, 0) self.performanceLayout.addWidget(self.moving_units, 3, 1, alignment=Qt.AlignRight) self.performanceLayout.addWidget(QLabel("Generate infantry squads along vehicles"), 4, 0) self.performanceLayout.addWidget(self.infantry, 4, 1, alignment=Qt.AlignRight) self.performanceLayout.addWidget(QLabel("AI planes parking start (AI starts in flight if disabled)"), 5, 0) self.performanceLayout.addWidget(self.ai_parking_start, 5, 1, alignment=Qt.AlignRight) self.performanceLayout.addWidget(QLabel("Include destroyed units carcass"), 6, 0) self.performanceLayout.addWidget(self.destroyed_units, 6, 1, alignment=Qt.AlignRight) self.performanceLayout.addWidget(QHorizontalSeparationLine(), 7, 0, 1, 2) self.performanceLayout.addWidget(QLabel("Culling of distant units enabled"), 8, 0) self.performanceLayout.addWidget(self.culling, 8, 1, alignment=Qt.AlignRight) self.performanceLayout.addWidget(QLabel("Culling distance (km)"), 9, 0) self.performanceLayout.addWidget(self.culling_distance, 9, 1, alignment=Qt.AlignRight) self.generatorLayout.addWidget(self.gameplay) self.generatorLayout.addWidget(QLabel("Disabling settings below may improve performance, but will impact the overall quality of the experience.")) self.generatorLayout.addWidget(self.performance) def initCheatLayout(self): self.cheatPage = QWidget() self.cheatLayout = QGridLayout() self.cheatPage.setLayout(self.cheatLayout) self.moneyCheatBox = QGroupBox("Money Cheat") self.moneyCheatBox.setAlignment(Qt.AlignTop) self.moneyCheatBoxLayout = QGridLayout() self.moneyCheatBox.setLayout(self.moneyCheatBoxLayout) self.cheat25M = QPushButton("Cheat +25M") self.cheat50M = QPushButton("Cheat +50M") self.cheat100M = QPushButton("Cheat +100M") self.cheat200M = QPushButton("Cheat +200M") self.cheat500M = QPushButton("Cheat +500M") self.cheat1000M = QPushButton("Cheat +1000M") self.cheat25M.clicked.connect(lambda: self.cheatMoney(25)) self.cheat50M.clicked.connect(lambda: self.cheatMoney(50)) self.cheat100M.clicked.connect(lambda: self.cheatMoney(100)) self.cheat200M.clicked.connect(lambda: self.cheatMoney(200)) self.cheat500M.clicked.connect(lambda: self.cheatMoney(500)) self.cheat1000M.clicked.connect(lambda: self.cheatMoney(1000)) self.moneyCheatBoxLayout.addWidget(self.cheat25M, 0, 0) self.moneyCheatBoxLayout.addWidget(self.cheat50M, 0, 1) self.moneyCheatBoxLayout.addWidget(self.cheat100M, 1, 0) self.moneyCheatBoxLayout.addWidget(self.cheat200M, 1, 1) self.moneyCheatBoxLayout.addWidget(self.cheat500M, 2, 0) self.moneyCheatBoxLayout.addWidget(self.cheat1000M, 2, 1) self.cheatLayout.addWidget(self.moneyCheatBox, 0, 0) def cheatMoney(self, amount): self.game.budget += amount self.game.informations.append(Information("CHEATER", "You are a cheater and you should feel bad", self.game.turn)) GameUpdateSignal.get_instance().updateGame(self.game) def applySettings(self): self.game.settings.player_skill = CONST.SKILL_OPTIONS[self.playerCoalitionSkill.currentIndex()] self.game.settings.enemy_skill = CONST.SKILL_OPTIONS[self.enemyCoalitionSkill.currentIndex()] self.game.settings.enemy_vehicle_skill = CONST.SKILL_OPTIONS[self.enemyAASkill.currentIndex()] self.game.settings.labels = CONST.LABELS_OPTIONS[self.difficultyLabel.currentIndex()] self.game.settings.night_disabled = self.noNightMission.isChecked() self.game.settings.map_coalition_visibility = self.mapVisibiitySelection.currentData() self.game.settings.external_views_allowed = self.ext_views.isChecked() self.game.settings.generate_marks = self.generate_marks.isChecked() self.game.settings.include_jtac_if_available = self.include_jtac_if_available.isChecked() print(self.game.settings.map_coalition_visibility) self.game.settings.supercarrier = self.supercarrier.isChecked() self.game.settings.perf_red_alert_state = self.red_alert.isChecked() self.game.settings.perf_smoke_gen = self.smoke.isChecked() self.game.settings.perf_artillery = self.arti.isChecked() self.game.settings.perf_moving_units = self.moving_units.isChecked() self.game.settings.perf_infantry = self.infantry.isChecked() self.game.settings.perf_ai_parking_start = self.ai_parking_start.isChecked() self.game.settings.perf_destroyed_units = self.destroyed_units.isChecked() self.game.settings.perf_culling = self.culling.isChecked() self.game.settings.perf_culling_distance = int(self.culling_distance.value()) GameUpdateSignal.get_instance().updateGame(self.game) def onSelectionChanged(self): index = self.categoryList.selectionModel().currentIndex().row() self.right_layout.setCurrentIndex(index)
class Widget(QWidget): movie_url_label_text = "粘贴有 dailymotion 版的連續劇网址 (例子: https://dramaq.de/cn191023b/): " def __init__(self): QWidget.__init__(self) self.q = None self.pool = None self.top = QHBoxLayout() self.top.setMargin(10) self.middle = QVBoxLayout() self.middle.setMargin(10) self.radioButtonDailyMotionDrama = QRadioButton( "有 Dailymotion Drama 的網站") self.radioButtonAny = QRadioButton("其它類型網站 (例如 YouTube)") self.top.addWidget(self.radioButtonDailyMotionDrama) self.top.addWidget(self.radioButtonAny) self.url_label = QLabel() self.url = QLineEdit() self.url_label.setBuddy(self.url) self.middle.addWidget(self.url_label) self.middle.addWidget(self.url) self.browse_folder_label = QLabel("下載到:") self.browseFolder = QPushButton("選擇目錄") self.browse_folder_label.setBuddy(self.browseFolder) self.middle.addWidget(self.browse_folder_label) self.middle.addWidget(self.browseFolder) self.browse_folder_value = "" self.bk_cinemae_spin_from = 1 self.bk_cinemae_spin_to = 1 self.fromEpSpinBox = QSpinBox() self.fromEpSpinBox.setMinimum(1) self.fromEpSpinBox.setMaximum(2147483647) self.fromEpLabel = QLabel("&從第幾集開始下載:") self.fromEpLabel.setBuddy(self.fromEpSpinBox) self.toEpSpinBox = QSpinBox() self.toEpSpinBox.setMinimum(1) self.toEpSpinBox.setMaximum(2147483647) self.toEpLabel = QLabel("&到第幾集停止下載:") self.toEpLabel.setBuddy(self.toEpSpinBox) self.cinema_ly = QHBoxLayout() #self.cinema_ly.setMargin(10) self.cinema_ly.addWidget(self.fromEpLabel) self.cinema_ly.addWidget(self.fromEpSpinBox) self.cinema_ly.addWidget(self.toEpLabel) self.cinema_ly.addWidget(self.toEpSpinBox) self.middle.addLayout(self.cinema_ly) self.add = QPushButton("開始下載") self.add.setEnabled(False) self.middle.addWidget(self.add) self.stop_me = QPushButton("停止下載") self.stop_me.setEnabled(False) self.middle.addWidget(self.stop_me) self.log_area = QPlainTextEdit() self.log_area.setReadOnly(True) self.log_area.setMaximumBlockCount(1000) self.middle.addWidget(self.log_area) #self.table_view.setSizePolicy(size) #self.layout.addWidget(self.table) self.layout = QVBoxLayout() self.layout.addLayout(self.top) self.layout.addLayout(self.middle) self.setLayout(self.layout) self.radioButtonDailyMotionDrama.toggled.connect( self.choose_DailyMotionDrama_widgets) self.radioButtonAny.toggled.connect(self.choose_Any_widgets) self.url.textChanged[str].connect(self.check_disable_download) self.browseFolder.clicked.connect(self.add_folder) self.add.clicked.connect(self.start_download) self.stop_me.clicked.connect(self.stop_download) self.radioButtonDailyMotionDrama.setChecked( True) #set default only after .connect above # TESTING PURPOSE ''' self.url.setText('https://journalflash.com/cn191023b/') self.browse_folder_value = 'C:/Users/Administrator/Documents/duboku' ''' #set current process (not queue that one) log handler: logger = logging.getLogger(__name__) handler2 = LoggerWriter() logger.addHandler(handler2) logger.setLevel(logging.INFO) #DEBUG handler2.emitter.sigLog.connect(self.log_area.appendPlainText) sys.stdout = handler2 #LoggerWriter() #sys.stderr = handler2 #Seems no difference #handler2.emitter.sigLog.emit('hihi') @Slot() def choose_DailyMotionDrama_widgets(self): if self.radioButtonDailyMotionDrama.isChecked(): self.fromEpLabel.setEnabled(True) self.toEpLabel.setEnabled(True) self.fromEpSpinBox.setEnabled(True) self.toEpSpinBox.setEnabled(True) self.fromEpSpinBox.setValue(self.bk_cinemae_spin_from) self.toEpSpinBox.setValue(self.bk_cinemae_spin_to) self.fromEpLabel.setDisabled(True) self.toEpLabel.setDisabled(True) @Slot() def choose_Any_widgets(self): if self.radioButtonAny.isChecked(): self.fromEpSpinBox.setDisabled(True) self.toEpSpinBox.setDisabled(True) self.bk_cinemae_spin_from = self.fromEpSpinBox.value() self.bk_cinemae_spin_to = self.toEpSpinBox.value() self.fromEpSpinBox.setValue(1) self.toEpSpinBox.setValue(1) @Slot() def add_folder(self, s): #fname = QFileDialog.getOpenFileName(self, 'Open file', "c:\'", "Image files (*.jpg *.gif)") #fname = QFileDialog.getOpenFileName(self, 'Open file', '', QFileDialog.ShowDirsOnly) fname = QFileDialog.getExistingDirectory(self, '選擇下載至什麼目錄', '', QFileDialog.ShowDirsOnly) #print('repr: ' + repr(fname)) if fname and fname.strip(): fname = fname.strip() self.browse_folder_value = fname #if getOpenFileName, will return ('/home/xiaobai/Pictures/disco.jpg', 'Image files (*.jpg *.gif)') #, while if getExistingDirectory, will return single path string only self.browseFolder.setText(fname) self.check_disable_download(fname) #else: # print('User cancel') @Slot() def check_disable_download(self, s): if self.url.text() and self.browse_folder_value: self.add.setEnabled(True) else: self.add.setEnabled(False) def task_done(self, retVal): self.add.setEnabled(True) self.stop_me.setEnabled(False) @Slot() def stop_download(self): if self.q: self.q.close() if self.pool: self.pool.terminate() self.add.setEnabled(True) self.stop_me.setEnabled(False) print('下載停止。') @Slot() def start_download(self): if self.fromEpSpinBox.value() > self.toEpSpinBox.value(): self.log_area.setPlainText('[!] 從第幾集必須小於或等於到第幾集。') return #No need worry click twice too fast, it seems already handle by PySide2 self.add.setEnabled(False) self.stop_me.setEnabled(True) self.log_area.clear() dest_full_path = self.browse_folder_value ''' print('dest_full_path: ' + repr(dest_full_path)) print('self.url.text(): ' + repr(self.url.text())) print('self.fromEpSpinBox.value(): ' + repr(self.fromEpSpinBox.value())) print('self.toEpSpinBox.value(): ' + repr(self.toEpSpinBox.value())) ''' import drama_dailymotion_console #Windows can't set like that bcoz not update for args.url, must put explicitly #drama_dailymotion_console.redirect_stdout_to_custom_stdout(arg_url, ...etc, LoggerWriter()) #failed other process handler = LogHandlerOtherProcess() handler.emitter.sigLog.connect(self.log_area.appendPlainText) ''' #ref current process: logger = logging.getLogger(__name__) handler2 = LoggerWriter() logger.addHandler(handler2) logger.setLevel(logging.DEBUG) handler2.emitter.sigLog.connect(self.log_area.appendPlainText) sys.stdout = handler2 #LoggerWriter() #handler2.emitter.sigLog.emit('hihi') ''' #handler = LoggerWriter() #handler.emitter.sigLog.connect(self.log_area.appendPlainText) self.q = multiprocessing.Queue() self.ql = QueueListener(self.q, handler) self.ql.start() self.pool = multiprocessing.Pool(1, worker_init, [self.q]) if self.radioButtonDailyMotionDrama.isChecked(): self.pool.apply_async(drama_dailymotion_console.main, args=(dest_full_path, self.fromEpSpinBox.value(), self.toEpSpinBox.value(), self.url.text(), LoggerWriterOtherProcess(), False), callback=self.task_done) else: self.pool.apply_async(drama_dailymotion_console.main, args=(dest_full_path, self.fromEpSpinBox.value(), self.toEpSpinBox.value(), self.url.text(), LoggerWriterOtherProcess(), True), callback=self.task_done)
class Config(SignalNode.Config): """Config widget displayed for BandpassFilter.""" def __init__(self, parent=None): super().__init__(parent=parent) # Upper bound ---------------------------------------------------------------------------------------------- self.lower_bound_enable = QCheckBox() self.lower_bound_enable.setChecked(True) self.lower_bound_enable.stateChanged.connect(self.updateModel) self.lower_bound = QDoubleSpinBox() self.lower_bound.valueChanged.connect(self.updateModel) self.lower_bound.setMinimum(0) self.lower_bound.setMaximum(250) self.lower_bound.setSuffix(" Hz") layout = QHBoxLayout() layout.setContentsMargins(0, 0, 0, 0) lower_bound_widget = QWidget() lower_bound_widget.setContentsMargins(0, 0, 0, 0) lower_bound_widget.setLayout(layout) layout.addWidget(self.lower_bound_enable) layout.addWidget(self.lower_bound) # Lower bound ---------------------------------------------------------------------------------------------- self.upper_bound_enable = QCheckBox() self.upper_bound_enable.setChecked(True) self.upper_bound_enable.stateChanged.connect(self.updateModel) self.upper_bound = QDoubleSpinBox() self.upper_bound.valueChanged.connect(self.updateModel) self.upper_bound.setMinimum(0) self.upper_bound.setMaximum(250) self.upper_bound.setSuffix(" Hz") layout = QHBoxLayout() layout.setContentsMargins(0, 0, 0, 0) upper_bound_widget = QWidget() upper_bound_widget.setContentsMargins(0, 0, 0, 0) upper_bound_widget.setLayout(layout) layout.addWidget(self.upper_bound_enable) layout.addWidget(self.upper_bound) # Filter type and length ----------------------------------------------------------------------------------- self.filter_type = QComboBox() for name in BandpassFilter.filter_name_to_type: self.filter_type.addItem(name) self.filter_type.currentTextChanged.connect(self.updateModel) self.filter_length = QSpinBox() self.filter_length.setMinimum(2) self.filter_length.setMaximum(1000000) self.filter_length.setValue(1000) self.filter_length.valueChanged.connect(self.updateModel) self.filter_order = QSpinBox() self.filter_order.setRange(1, 4) self.filter_order.valueChanged.connect(self.updateModel) # ---------------------------------------------------------------------------------------------------------- layout = QFormLayout() layout.addRow("Lower bound:", lower_bound_widget) layout.addRow("Upper bound:", upper_bound_widget) layout.addRow("Filter type:", self.filter_type) layout.addRow("Filter order:", self.filter_order) layout.addRow("Filter length:", self.filter_length) self.setLayout(layout) def updateModel(self): n = self.node() if n is None: return if self.lower_bound_enable.isChecked(): lower_bound = self.lower_bound.value() else: lower_bound = None if self.upper_bound_enable.isChecked(): upper_bound = self.upper_bound.value() else: upper_bound = None filter_type = n.filter_name_to_type[self.filter_type.currentText()] filter_length = self.filter_length.value() filter_order = self.filter_order.value() n.setLowerBound(lower_bound) n.setUpperBound(upper_bound) n.setFilterType(filter_type) n.setFilterLength(filter_length) n.setFilterOrder(filter_order) def updateView(self): n = self.node() if n is None: return # Prevent view fields from emitting signals while they are updated self.lower_bound.blockSignals(True) self.upper_bound.blockSignals(True) self.filter_type.blockSignals(True) self.filter_length.blockSignals(True) self.filter_order.blockSignals(True) if n.upperBound() is None: self.upper_bound_enable.setChecked(False) else: self.upper_bound_enable.setChecked(True) self.upper_bound.setValue(n.upperBound()) if n.lowerBound() is None: self.lower_bound_enable.setChecked(False) else: self.lower_bound_enable.setChecked(True) self.lower_bound.setValue(n.lowerBound()) self.filter_type.setCurrentText( n.filter_type_to_name[n.filterType()]) self.filter_length.setValue(n.filterLength()) self.filter_order.setValue(n.filterOrder()) # Release the block and call adjust self.lower_bound.blockSignals(False) self.upper_bound.blockSignals(False) self.filter_type.blockSignals(False) self.filter_length.blockSignals(False) self.filter_order.blockSignals(False) self._adjust() def _adjust(self): """Adjust displayed values and limits in response to changes.""" # Enable spinbox widgets based on their checkbox self.lower_bound.setEnabled(self.lower_bound_enable.isChecked()) self.upper_bound.setEnabled(self.upper_bound_enable.isChecked()) # Adjust min and max so that lower_bound is never higher than upper_bound if self.lower_bound_enable.isChecked(): self.upper_bound.setMinimum(self.lower_bound.value()) else: self.upper_bound.setMinimum(0) if self.upper_bound_enable.isChecked(): self.lower_bound.setMaximum(self.upper_bound.value()) else: self.lower_bound.setMaximum(250) if self.filter_type.currentText() == "Butterworth": self.filter_order.setEnabled(True) else: self.filter_order.setEnabled(False)
class SettingsEditionDialog(QDialog): languages = {"Français": "fr", "English": "en"} def __init__(self): QDialog.__init__(self) self.setWindowTitle(tr("btn_config")) self.setFixedSize(QSize(700, 670)) # Retrieve current settings self.settings = AssetManager.getInstance().config_to_dico( AssetManager.getInstance().get_config_parser()) self.__restart_needed = False self.__restore_required = False # Version self.lab_version = QLabel(self.settings['main']['version']) # Language self.combo_language = QComboBox() self.combo_language.addItems(list(self.languages.keys())) for lang in self.languages: # Look for the current language to select it if self.languages[lang] == self.settings['main']['language']: self.combo_language.setCurrentText(lang) break # CSV separator self.csv_sep_edit = QLineEdit() self.csv_sep_edit.setMaxLength(2) self.csv_sep_edit.setFixedWidth(25) self.csv_sep_edit.setAlignment(Qt.AlignCenter) self.csv_sep_edit.setText(self.settings['main']['csv_separator']) # BDD path self.btn_bdd_path = QPushButton(self.settings['main']['bdd_path']) self.btn_bdd_path.clicked.connect(self.choose_bdd_path) # Port self.wepapp_port = QSpinBox() self.wepapp_port.setMinimum(1024) self.wepapp_port.setMaximum(65535) self.wepapp_port.setValue(int(self.settings['webapp']['port'])) # Colors self.tile_color = ColorChooser(self.settings['colors']['tile']) self.hovered_tile_color = ColorChooser( self.settings['colors']['hovered_tile']) self.hovered_empty_tile_color = ColorChooser( self.settings['colors']['hovered_empty_tile']) self.dragged_tile_color = ColorChooser( self.settings['colors']['dragged_tile']) self.drag_selected_tile_color = ColorChooser( self.settings['colors']['drag_selected_tile']) self.selected_tile_color = ColorChooser( self.settings['colors']['selected_tile']) self.tile_text_color = ColorChooser( self.settings['colors']['tile_text']) self.room_bg_color = ColorChooser(self.settings['colors']['room_bg']) self.room_grid_color = ColorChooser( self.settings['colors']['room_grid']) self.main_bg_color = ColorChooser(self.settings['colors']['main_bg']) self.board_bg_color = ColorChooser(self.settings['colors']['board_bg']) self.attr_colors = "" # Chosen colors self.attributes_colors_chooser = AttrColorsChooser( self.settings['colors']['attr_colors'].split()) # Sizes (unmodifiable) self.unmodifiable = QLabel(tr("unmodifiable_data")) self.unmodifiable.setAlignment(Qt.AlignCenter) self.desk_size = QLineEdit(self.settings['size']['desk']) self.desk_size.setEnabled(False) self.desk_size.setFixedWidth(50) self.grid_rows = QLineEdit(self.settings['size']['default_room_rows']) self.grid_rows.setEnabled(False) self.grid_rows.setFixedWidth(50) self.grid_cols = QLineEdit( self.settings['size']['default_room_columns']) self.grid_cols.setEnabled(False) self.grid_cols.setFixedWidth(50) # --- Buttons --- # Confirm button self.ok_btn = QPushButton(tr("btn_save")) self.ok_btn.clicked.connect(self.accept) self.ok_btn.setFocus() # Cancel button self.cancel_btn = QPushButton(tr("btn_cancel")) self.cancel_btn.clicked.connect(self.reject) # Restore defaults button self.restore_btn = QPushButton(tr("btn_restore")) self.restore_btn.clicked.connect(self.__restore) self.__set_layout() def __set_layout(self) -> None: """ Sets the dialog layout """ # Main layout layout = QVBoxLayout() layout.setMargin(0) layout.addSpacing(5) # Main section main_layout = QFormLayout() main_layout.addRow(tr("app_version"), self.lab_version) main_layout.addRow(tr("language"), self.combo_language) main_layout.addRow(tr("csv_sep"), self.csv_sep_edit) main_layout.addRow(tr("bdd_path"), self.btn_bdd_path) # Web app widget_port = QWidget() layout_port = QHBoxLayout() layout_port.setMargin(0) layout_port.addWidget(self.wepapp_port) layout_port.addWidget(ShutDownToolTip()) widget_port.setLayout(layout_port) main_layout.addRow(tr("web_port"), widget_port) layout.addLayout(main_layout) Separator(self.width(), layout) # Colors colors_layout1 = QFormLayout() colors_layout1.addRow(tr("tile"), self.tile_color) colors_layout1.addRow(tr("hovered_tile"), self.hovered_tile_color) colors_layout1.addRow(tr("hovered_empty_tile"), self.hovered_empty_tile_color) colors_layout1.addRow(tr("dragged_tile"), self.dragged_tile_color) colors_layout1.addRow(tr("drag_selected_tile"), self.drag_selected_tile_color) colors_layout1.addRow(tr("selected_tile"), self.selected_tile_color) colors_layout2 = QFormLayout() colors_layout2.addRow(tr("tile_text"), self.tile_text_color) colors_layout2.addRow(tr("room_bg"), self.room_bg_color) colors_layout2.addRow(tr("room_grid"), self.room_grid_color) colors_layout2.addRow(tr("main_bg"), self.main_bg_color) colors_layout2.addRow(tr("board_bg"), self.board_bg_color) colors_layout = QHBoxLayout() colors_layout.setMargin(0) colors_layout.addLayout(colors_layout1) colors_layout.addLayout(colors_layout2) layout.addLayout(colors_layout) layout.addSpacing(15) colors_layout3 = QFormLayout() colors_layout3.setMargin(0) colors_layout3.addRow(tr("attr_colors"), self.attributes_colors_chooser) layout.addLayout(colors_layout3) Separator(self.width(), layout) # Unmodifiable data sizes_layout = QFormLayout() sizes_layout.setMargin(0) sizes_layout.addRow(tr("desk_size"), self.desk_size) sizes_layout.addRow(tr("grid_rows"), self.grid_rows) sizes_layout.addRow(tr("grid_cols"), self.grid_cols) layout.addWidget(self.unmodifiable, alignment=Qt.AlignCenter) layout.addSpacing(5) layout.addLayout(sizes_layout) Separator(self.width(), layout) # Buttons layout_buttons = QHBoxLayout() layout_buttons.addWidget(self.ok_btn) layout_buttons.addWidget(self.restore_btn) layout_buttons.addWidget(self.cancel_btn) layout.addLayout(layout_buttons) self.setLayout(layout) self.setStyleSheet(get_stylesheet("dialog2")) def __restore(self) -> None: """ Restore default parameters before closing dialog """ self.__restart_needed = True self.__restore_required = True self.accept() def __new_settings(self) -> dict: """ Retrieves the new settings to use """ settings = self.settings # Language language = self.languages[self.combo_language.currentText()] if language != settings['main']['language']: settings['main']['language'] = language self.__restart_needed = True # CSV separator settings['main']['csv_separator'] = self.csv_sep_edit.text() # BDD path if self.btn_bdd_path.text() != settings['main']['bdd_path']: if self.btn_bdd_path.text().endswith("sdc_db"): settings['main']['bdd_path'] = self.btn_bdd_path.text() else: settings['main']['bdd_path'] = "" self.__restart_needed = True # Port if str(self.wepapp_port.value()) != settings['webapp']['port']: settings['webapp']['port'] = str(self.wepapp_port.value()) # Colors settings['colors']['tile'] = self.tile_color.get_color() settings['colors']['hovered_tile'] = self.hovered_tile_color.get_color( ) settings['colors'][ 'hovered_empty_tile'] = self.hovered_empty_tile_color.get_color() settings['colors']['dragged_tile'] = self.dragged_tile_color.get_color( ) settings['colors'][ 'drag_selected_tile'] = self.drag_selected_tile_color.get_color() settings['colors'][ 'selected_tile'] = self.selected_tile_color.get_color() settings['colors']['tile_text'] = self.tile_text_color.get_color() settings['colors']['room_grid'] = self.room_grid_color.get_color() if self.room_bg_color.get_color() != settings['colors']['room_bg']: settings['colors']['room_bg'] = self.room_bg_color.get_color() self.__restart_needed = True if self.main_bg_color.get_color() != settings['colors']['main_bg']: settings['colors']['main_bg'] = self.main_bg_color.get_color() self.__restart_needed = True if self.board_bg_color.get_color() != settings['colors']['board_bg']: settings['colors']['board_bg'] = self.board_bg_color.get_color() self.__restart_needed = True settings['colors']['attr_colors'] = self.attr_colors return settings def new_config(self) -> ConfigParser: """ Retrieves the new config parser object """ conf = ConfigParser() conf.read_dict(self.__new_settings()) return conf def need_restart(self): return self.__restart_needed def restore_default(self) -> bool: return self.__restore_required def accept(self) -> None: """ Performs actions before calling parent's accept method """ self.attr_colors = self.attributes_colors_chooser.get_colors_to_str() super().accept() def choose_bdd_path(self) -> None: """ Opens a file chooser to select the bdd path. Then sets the name as button text. """ bdd_path = QFileDialog.getOpenFileName(self, tr("bdd_path"), self.btn_bdd_path.text())[0] if bdd_path: self.btn_bdd_path.setText(bdd_path)
class Clock_widget(QMainWindow): def __init__(self, frameless=False, web=False, debug=0): super(Clock_widget, self).__init__() self.debug = debug self.frameless = frameless self.web = web self.analog = None self.bedtime = QTime(20, 15, 00) self.bedtime_grace_period = 10 self.LEDBall_state = 0 self.temp_update_interval = 10 self.n_updates = 0 self.temp_data = ['i', 0, 0, 0, 'o', 0, 0, 0, 'c', 0, 0] self.LCD_brightness = 150 self.resize(800, 460) self.setupUi(self) self.timer = QTimer(self) self.timer.timeout.connect(self.update) self.timer.start(1000) def setupUi(self, parent): """Setup the interfaces for the clock.""" if not self.objectName(): self.setObjectName(u"Clock") sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(parent.sizePolicy().hasHeightForWidth()) parent.setSizePolicy(sizePolicy) parent.setAutoFillBackground(True) parent.setWindowFlag(Qt.Widget, True) if os.uname().sysname == "Linux" or self.frameless: parent.setWindowFlag(Qt.FramelessWindowHint, True) self.tabWidget = QTabWidget(parent) self.tabWidget.setObjectName(u"tabWidget") self.tabWidget.setGeometry(QRect(0, 0, 800, 460)) # This works for Mac, but seems to not work with Linux/Arm/RPi # tabbar = self.tabWidget.tabBar() # tabbar.setMinimumSize(50, 24) # tabfont = QFont() # tabfont.setBold(True) # tabfont.setItalic(True) # tabfont.setPointSize(32) # tabbar.setFont(tabfont) # Setup the TABS self.clock = QWidget() self.clock.setObjectName(u"clock") self.tabWidget.addTab(self.clock, "") self.tabWidget.setTabText(self.tabWidget.indexOf(self.clock), "Clock") self.weather = QWeather(parent=None, debug=self.debug) self.tabWidget.addTab(self.weather, "") self.tabWidget.setTabText(self.tabWidget.indexOf(self.weather), "Weather") self.settings = QWidget() self.settings.setObjectName(u"settings") self.tabWidget.addTab(self.settings, "") self.tabWidget.setTabText(self.tabWidget.indexOf(self.settings), "Settings") self.tabWidget.setCurrentIndex(0) ################################################################################################# # Setup Clock Page ################################################################################################# self.analog = AnalogClock(self.clock) # DIGITAL clock in "clock" tab self.Digital = QLabel(self.clock) self.Digital.setObjectName(u"Digital") self.Digital.setGeometry(QRect(0, 5, 765, 71)) self.Digital.setAutoFillBackground(False) self.Digital.setStyleSheet(u"") self.Digital.setText(u"Current Time - Date + time") # Weather Icon self.weathericon = QWeatherIcon((480, 5), self.weather, parent=self.clock) self.weather.weather_updated.connect(self.weathericon.update) # Weather info on the Clock page. self.minipanel = QTempMiniPanel((475, 105), self.weather, parent=self.clock) self.weather.temp_updated.connect(self.minipanel.update) self.hilo = QHiLoTide((580, 5), parent=self.clock, debug=self.debug) # Moon phase self.moon = QMoon(pos=(450, 210), parent=self.clock, size=216, web=self.web) # Push buttons in "clock tab. push_button_width = 111 push_button_height = 40 push_button_x = 670 push_button_y = 220 self.ledball_off = QPushButton(self.clock) self.ledball_off.setObjectName(u"ledball_off") self.ledball_off.setText(u"LED off") self.ledball_off.setGeometry(QRect(push_button_x, push_button_y, push_button_width, push_button_height)) self.ledball_on = QPushButton(self.clock) self.ledball_on.setObjectName(u"ledball_on") self.ledball_on.setText(u"LED on ") self.ledball_on.setGeometry(QRect(push_button_x, push_button_y+push_button_height, push_button_width, push_button_height)) self.ledball_on2 = QPushButton(self.clock) self.ledball_on2.setObjectName(u"ledball_on2") self.ledball_on2.setText(u"LED on 2") self.ledball_on2.setGeometry(QRect(push_button_x, push_button_y+push_button_height*2, push_button_width, push_button_height)) self.sleep = QPushButton(self.clock) self.sleep.setObjectName(u"sleep") self.sleep.setText(u"Sleep") self.sleep.setGeometry(QRect(push_button_x, push_button_y+push_button_height*3+10, push_button_width, push_button_height)) ################################################################################################# # Setup Weather Page ################################################################################################# ################################################################################################# # Setup Setting Page ################################################################################################# self.timeEdit = QTimeEdit(self.settings) self.timeEdit.setObjectName(u"timeEdit") self.timeEdit.setDisplayFormat(u"h:mm AP") self.timeEdit.setGeometry(QRect(200, 30, 191, 41)) font8 = QFont() font8.setFamily(u"Gill Sans") font8.setPointSize(16) font8.setBold(False) font8.setItalic(False) font8.setWeight(50) self.timeEdit.setFont(font8) self.timeEdit.setAutoFillBackground(True) self.timeEdit.setTime(self.bedtime) self.bedtime_label = QLabel(self.settings) self.bedtime_label.setObjectName(u"bedtime_label") self.bedtime_label.setText(u"Set Bedtime:") self.bedtime_label.setGeometry(QRect(200, 0, 151, 31)) self.bedtime_label.setFont(font8) self.bedtime_label.setAutoFillBackground(True) self.Brightness_Value = QLCDNumber(self.settings) self.Brightness_Value.setObjectName(u"Brightness_Value") self.Brightness_Value.setGeometry(QRect(20, 120, 61, 31)) self.Brightness_Value.setStyleSheet(u"color: \"White\";\n" "margin:0px;\n" "border:0px;background:\"transparent\";") self.Brightness_Value.setDigitCount(3) self.Brightness_Value.setProperty("value", 180.000000000000000) self.Brightness = QSlider(self.settings) self.Brightness.setObjectName(u"Brightness") self.Brightness.setGeometry(QRect(30, 160, 51, 261)) self.Brightness.setAutoFillBackground(False) self.Brightness.setMaximum(255) self.Brightness.setValue(self.LCD_brightness) self.Brightness.setOrientation(Qt.Vertical) self.Brightness_label = QLabel(self.settings) self.Brightness_label.setObjectName(u"Brightness_label") self.Brightness_label.setText(u"Brightness") self.Brightness_label.setGeometry(QRect(20, 70, 101, 41)) font10 = QFont() font10.setFamily(u"Arial Black") font10.setPointSize(12) font10.setBold(True) font10.setWeight(75) self.Brightness_label.setFont(font10) self.temp_test = QLabel(self.settings) self.temp_test.setObjectName(u"temp_test") self.temp_test.setText(u"T20.5 C") self.temp_test.setFont(font8) self.temp_test.setGeometry(QRect(630, 60, 141, 51)) # self.temp_test.setFont(font_bold_20) self.temp_test_slide = QSlider(self.settings) self.temp_test_slide.setObjectName(u"temp_test_slide") self.temp_test_slide.setGeometry(QRect(660, 150, 51, 271)) self.temp_test_slide.setAutoFillBackground(False) self.temp_test_slide.setMinimum(-250) self.temp_test_slide.setMaximum(450) self.temp_test_slide.setSingleStep(5) self.temp_test_slide.setPageStep(25) self.temp_test_slide.setValue(38) self.temp_test_slide.setOrientation(Qt.Vertical) self.temp_check_outside = QCheckBox(self.settings) self.temp_check_outside.setObjectName(u"temp_check_outside") self.temp_check_outside.setText(u"Outside") self.temp_check_outside.setGeometry(QRect(640, 110, 86, 20)) self.grace_period = QSpinBox(self.settings) self.grace_period.setObjectName(u"grace_period") self.grace_period.setGeometry(QRect(411, 31, 111, 41)) self.grace_period.setFont(font8) self.grace_period.setMinimum(1) self.grace_period.setMaximum(60) self.grace_period.setValue(self.bedtime_grace_period) self.grace_period.setDisplayIntegerBase(10) self.grace_period_label = QLabel(self.settings) self.grace_period_label.setObjectName(u"grace_period_label") self.grace_period_label.setText(u"Grace period:") self.grace_period_label.setGeometry(QRect(410, 10, 111, 16)) self.grace_period_label.setFont(font8) ################################################################################################# # SET ALL LABEL TEXTS ################################################################################################# # if QT_CONFIG(tooltip) self.sleep.setToolTip(u"Put display to sleep") self.ledball_on2.setToolTip(u"Turn on the LED Ball, mode 2") self.ledball_on.setToolTip(u"Turn on the LED Ball.") self.ledball_off.setToolTip(u"Turn off the LED Ball.") # endif // QT_CONFIG(tooltip) ################################################################################################# # Make the Connections. ################################################################################################# self.temp_test_slide.valueChanged.connect(self.test_temp_update) self.temp_check_outside.clicked.connect(self.test_temp_update) self.ledball_off.clicked.connect(self.set_ledball_off) self.ledball_on.clicked.connect(self.set_ledball_on) self.ledball_on2.clicked.connect(self.set_ledball_on2) self.sleep.clicked.connect(self.set_sleep) self.timeEdit.timeChanged.connect(self.set_bedtime) self.grace_period.valueChanged.connect(self.set_grace_period) self.Brightness.valueChanged.connect(self.set_screen_brightness) self.Brightness.valueChanged.connect(self.Brightness_Value.display) def setup_from_json(self, json): """Set settings from the json dictionary passed.""" if "BedTime" in json: new_bedtime = QTime.fromString(json["BedTime"], "hh:mm:ss") if not new_bedtime.isValid(): new_bedtime = QTime.fromString(json["BedTime"], "hh:mm") if new_bedtime.isValid(): self.bedtime = new_bedtime self.timeEdit.setTime(self.bedtime) else: print("Could not set bedtime to {}".format(str(new_bedtime))) if "GracePeriod" in json: self.bedtime_grace_period = int(json["GracePeriod"]) self.grace_period.setValue(self.bedtime_grace_period) if "Brightness" in json: self.LCD_brightness = int(json["Brightness"]) self.Brightness.setValue(self.LCD_brightness) @Slot() def update(self): """This is called every second to perform the clock functions.""" AnalogClock.update(self) dtime = QDateTime.currentDateTime() text = dtime.toString("ddd MMM dd hh:mm:ss") self.Digital.setText(text) time = dtime.time() if self.bedtime < time < self.bedtime.addSecs(self.bedtime_grace_period * 60): self.Digital.setStyleSheet("color: rgba(200,100,0,200)") self.Digital.setText(text + " Bedtime") if self.bedtime < time < self.bedtime.addSecs(1) and self.LEDBall_state > 0: self.set_ledball_ready_for_bed() if self.bedtime.addSecs(self.bedtime_grace_period*60) < time < \ self.bedtime.addSecs(self.bedtime_grace_period*60 + 1): self.Digital.setStyleSheet("") self.set_ledball_off() self.turn_off_lcd() @Slot() def set_ledball_off(self): """Turn off the LED ball.""" if self.debug > 0: print("Set LED ball off.") os.system("ssh bbb1 \"./LEDBall_off.py\" >/dev/null") self.LEDBall_state = 0 @Slot() def set_ledball_ready_for_bed(self): """Set LED ball to very red.""" if self.LEDBall_state != 3: if self.debug > 0: print("Set LED ball to ready for bed.") os.system("ssh bbb1 \"./LEDBall_off.py && ./matrix.py 200 5.\" >/dev/null ") self.LEDBall_state = 3 @Slot() def set_ledball_on(self): """Turn LED ball to normal on""" if self.debug > 0: print("Set LED ball on.") os.system("(ssh bbb1 \"./LEDBall_off.py && ./matrix.py 200\" >/dev/null)") self.LEDBall_state = 1 @Slot() def set_ledball_on2(self): """Turn LED ball to alternate on""" if self.debug > 0: print("Set LED ball alternate on.") os.system("(ssh bbb1 \"./LEDBall_off.py && ./matrix.py 300 3. 50\" >/dev/null)"); self.LEDBall_state = 2 @Slot() def set_sleep(self): self.set_ledball_off() self.turn_off_lcd() def turn_off_lcd(self): """Turn the LCD off with the DPMS.""" if os.uname().sysname == "Linux": os.system("/usr/bin/xset dpms force off"); def set_pressure_color(selfs, obj, press, valid = True): """Set the color of obj according to the pressure. """ pressures = (900., 950., 1000., 1020., 1040.) colors = (0, 60, 120, 240, 300) if valid: if press < pressures[0]: press = pressures[0] + 0.0001 if press > pressures[-1]: press = pressures[-1] - 0.0001 i=0 while press > pressures[i]: i += 1 hue = int(((press - pressures[i-1])/(pressures[i] - pressures[i-1]))*(colors[i]-colors[i-1]) + colors[i-1]) color = QColor.fromHsv(hue, 255, 120, 255) obj.setStyleSheet("color: rgba({},{},{},255)".format(color.red(), color.green(), color.blue())) def set_temp_color(self, obj, temp, inside=True, invalid=False): """Set the color of obj depending on the temperature displayed by obj.""" temps = (-15., 16., 28., 40.) colors = (270, 145, 60, 0) if inside: temps = (12., 20., 25., 32.) if invalid: obj.setStyleSheet("color: rgba(100,100,100,100)") else: if temp < temps[0]: temp = temps[0] + 0.0001 if temp > temps[-1]: temp = temps[-1] - 0.0001 i = 0 while temp > temps[i]: i += 1 hue = int(((temp - temps[i-1])/(temps[i] - temps[i-1]))*(colors[i] - colors[i-1]) + colors[i-1]) color = QColor.fromHsv(hue, 255, 150, 255) obj.setStyleSheet("color: rgba({},{},{},255)".format(color.red(), color.green(), color.blue())) @Slot() def test_temp_update(self, val=None): """Update the temperature on the test slider.""" if val is None or type(val) is bool: val = self.temp_test_slide.value() temp = val*0.1 text = "{:6.2f} C".format(temp) self.temp_test.setText(text) self.set_temp_color(self.temp_test, temp, not self.temp_check_outside.isChecked(), False) @Slot() def set_bedtime(self, ntime): """Set the bedtime to a new time""" self.bedtime = ntime @Slot() def set_grace_period(self, grace): """Set the grace period to a new delta time""" self.bedtime_grace_period = grace @Slot() def set_screen_brightness(self, value): """Set the brightness of the screen on Raspberry Pi""" self.LCD_brightness = value if os.uname().sysname == "Linux": try: f = open("/sys/class/backlight/rpi_backlight/brightness", "w") f.write(str(value)) f.close() except Exception as e: print("Issue with opening brightness file \n",e)
class MainWindow(QMainWindow): def __init__(self, app, parent=None): super(MainWindow, self).__init__(parent) self.imagesDir = app.dir + '/images/' self.setWindowIcon(QIcon(self.imagesDir + 'icon.png')) self.path = '' self.settings = QSettings() self.lastDir = self.settings.value('lastDir', '') self.setMinimumWidth(540) self.supportedFormats = [] for f in QImageReader.supportedImageFormats(): self.supportedFormats.append(str(f.data(), encoding="utf-8")) self.fileWatcher = QFileSystemWatcher() self.fileWatcher.fileChanged.connect(self.fileChanged) # widgets self.showPixmapWidget = None self.tileWidthSpinBox = QSpinBox() self.tileWidthSpinBox.setValue(16) self.tileWidthSpinBox.setFixedWidth(50) self.tileWidthSpinBox.setMinimum(1) self.tileHeightSpinBox = QSpinBox() self.tileHeightSpinBox.setValue(16) self.tileHeightSpinBox.setFixedWidth(50) self.tileHeightSpinBox.setMinimum(1) self.paddingSpinBox = QSpinBox() self.paddingSpinBox.setFixedWidth(50) self.paddingSpinBox.setMinimum(1) self.transparentCheckbox = QCheckBox("Transparent") self.transparentCheckbox.setChecked(True) self.transparentCheckbox.stateChanged.connect(self.transparentChanged) self.backgroundColorEdit = ColorEdit() self.backgroundColorEdit.setEnabled(False) self.backgroundColorLabel = QLabel("Background color:") self.backgroundColorLabel.setEnabled(False) self.forcePotCheckBox = QCheckBox("Force PoT") self.forcePotCheckBox.setChecked(True) self.forcePotCheckBox.stateChanged.connect(self.forcePotChanged) self.reorderTilesCheckBox = QCheckBox("Reorder tiles") self.generateAndExportButton = QPushButton("Generate and export") self.generateAndExportButton.setFixedHeight(32) self.generateAndExportButton.clicked.connect(self.generateAndExportClicked) self.generateAndExportButton.setEnabled(False) self.pixmapWidget = PixmapWidget() self.pixmapWidget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.pixmapWidget.setPixmap(self.createDropTextPixmap()) self.pixmapWidget.dropSignal.connect(self.fileDropped) self.pixmapWidget.setMinimumHeight(300) # load settings self.tileWidthSpinBox.setValue(int(self.settings.value('tileWidth', 16))) self.tileHeightSpinBox.setValue(int(self.settings.value('tileHeight', 16))) self.paddingSpinBox.setValue(int(self.settings.value('padding', 1))) self.forcePotCheckBox.setChecked(True if self.settings.value('forcePot', 'true') == 'true' else False) self.reorderTilesCheckBox.setChecked(True if self.settings.value('reorderTiles', 'false') == 'true' else False) self.transparentCheckbox.setChecked(True if self.settings.value('transparent', 'false') == 'true' else False) self.backgroundColorEdit.setColorText(str(self.settings.value('backgroundColor', '#FF00FF'))) self.restoreGeometry(QByteArray(self.settings.value('MainWindow/geometry'))) self.restoreState(QByteArray(self.settings.value('MainWindow/windowState'))) # layout hl1 = QHBoxLayout() hl1.setContentsMargins(5, 5, 5, 5) hl1.addWidget(QLabel("Tile width:")) hl1.addSpacing(5) hl1.addWidget(self.tileWidthSpinBox) hl1.addSpacing(15) hl1.addWidget(QLabel("Tile height:")) hl1.addSpacing(5) hl1.addWidget(self.tileHeightSpinBox) hl1.addSpacing(15) hl1.addWidget(QLabel("Padding:")) hl1.addSpacing(5) hl1.addWidget(self.paddingSpinBox) hl1.addSpacing(15) hl1.addWidget(self.forcePotCheckBox) hl1.addSpacing(15) hl1.addWidget(self.reorderTilesCheckBox) hl1.addStretch() hl2 = QHBoxLayout() hl2.setContentsMargins(5, 5, 5, 5) hl2.addWidget(self.transparentCheckbox) hl2.addSpacing(15) hl2.addWidget(self.backgroundColorLabel) hl2.addSpacing(5) hl2.addWidget(self.backgroundColorEdit) hl2.addStretch() hl3 = QHBoxLayout() hl3.setContentsMargins(5, 5, 5, 5) hl3.addWidget(self.generateAndExportButton) vl = QVBoxLayout() vl.setContentsMargins(0, 0, 0, 0) vl.setSpacing(0) vl.addLayout(hl1) vl.addLayout(hl2) vl.addWidget(self.pixmapWidget) vl.addLayout(hl3) w = QWidget() w.setLayout(vl) self.setCentralWidget(w) self.setTitle() def setTitle(self): p = ' - ' + os.path.basename(self.path) if self.path else '' self.setWindowTitle(QCoreApplication.applicationName() + ' ' + QCoreApplication.applicationVersion() + p) def createDropTextPixmap(self): pixmap = QPixmap(481, 300) pixmap.fill(QColor("#333333")) painter = QPainter(pixmap) font = QFont("Arial") font.setPixelSize(28) font.setBold(True) fm = QFontMetrics(font) painter.setFont(font) painter.setPen(QPen(QColor("#888888"), 1)) text = "Drop the tileset image here" x = (pixmap.width()-fm.width(text))/2 y = (pixmap.height()+fm.height())/2 painter.drawText(x, y, text) del painter return pixmap def fileDropped(self, path): path = str(path) name, ext = os.path.splitext(path) ext = ext[1:] if not ext in self.supportedFormats: QMessageBox.warning(self, "Warning", "The dropped file is not supported") return pixmap = QPixmap(path) if pixmap.isNull(): QMessageBox.warning(self, "Warning", "Can't load the image") return if self.path: self.fileWatcher.removePath(self.path) self.path = path self.fileWatcher.addPath(self.path) self.pixmapWidget.setPixmap(pixmap) self.generateAndExportButton.setEnabled(True) self.setTitle() self.activateWindow() def fileChanged(self, path): #self.fileDropped(path) pass def transparentChanged(self): e = self.transparentCheckbox.isChecked() self.backgroundColorEdit.setEnabled(not e) self.backgroundColorLabel.setEnabled(not e) def forcePotChanged(self): e = self.forcePotCheckBox.isChecked() self.reorderTilesCheckBox.setEnabled(e) def generateAndExportClicked(self): g = Generator() g.tileWidth = self.tileWidthSpinBox.value() g.tileHeight = self.tileHeightSpinBox.value() g.forcePot = self.forcePotCheckBox.isChecked() g.isTransparent = self.transparentCheckbox.isChecked() g.bgColor = self.backgroundColorEdit.getColor() g.reorder = self.reorderTilesCheckBox.isChecked() g.padding = self.paddingSpinBox.value() target = g.create(self.pixmapWidget.pixmap); # export self.lastDir = os.path.dirname(self.path) targetPath = QFileDialog.getSaveFileName(self, 'Export', self.lastDir, 'PNG (*.png)') if targetPath: target.save(targetPath[0]) showPixmap = QPixmap.fromImage(target) if self.showPixmapWidget: self.showPixmapWidget.deleteLater() del self.showPixmapWidget self.showPixmapWidget = PixmapWidget() self.showPixmapWidget.setWindowIcon(self.windowIcon()) self.showPixmapWidget.setWindowTitle(os.path.basename(targetPath[0])) self.showPixmapWidget.resize(showPixmap.width(), showPixmap.height()) self.showPixmapWidget.setPixmap(showPixmap) self.showPixmapWidget.show() def closeEvent(self, event): if self.showPixmapWidget: self.showPixmapWidget.close() # save settings self.settings.setValue('tileWidth', self.tileWidthSpinBox.value()) self.settings.setValue('tileHeight', self.tileHeightSpinBox.value()) self.settings.setValue('padding', self.paddingSpinBox.value()) self.settings.setValue('forcePot', self.forcePotCheckBox.isChecked()) self.settings.setValue('reorderTiles', self.reorderTilesCheckBox.isChecked()) self.settings.setValue('transparent', self.transparentCheckbox.isChecked()) self.settings.setValue('backgroundColor', self.backgroundColorEdit.getColor().name()) self.settings.setValue('lastDir', self.lastDir) self.settings.setValue('MainWindow/geometry', self.saveGeometry()) self.settings.setValue('MainWindow/windowState', self.saveState()) super(MainWindow, self).closeEvent(event)