class PaletteSelectorLayout(QGroupBox): """ Qt Layout class for a palette """ def __init__(self, fgIndex, bgIndex, palette, informFunction, parent=None): super(PaletteSelectorLayout, self).__init__("", parent) if ZXAttribute.paletteCount() != 2: raise Exception( "The palette selector is current designed for 2 palettes only") self._bright = palette self._fgIndex = fgIndex self._bgIndex = bgIndex self._informFunction = informFunction vert_layout = QVBoxLayout() self.setLayout(vert_layout) vert_layout.addWidget(QLabel("Palette Selector:")) vert_layout.addSpacing(20) # Add check box to select brightness bright_select = QCheckBox("Bright Enabled") vert_layout.addWidget(bright_select) if palette == 1: bright_select.setChecked(True) bright_select.clicked.connect(self._brightSelect) vert_layout.addSpacing(10) # Foreground color checkboxes self._fg_group = QButtonGroup() self._fg_group.setExclusive(True) self._createLayout(vert_layout, "Foreground color:", self._fg_group, self._fgIndexSelect, fgIndex) vert_layout.addSpacing(10) # Background color checkboxes self._bg_group = QButtonGroup() self._bg_group.setExclusive(True) self._createLayout(vert_layout, "Background color:", self._bg_group, self._bgIndexSelect, bgIndex) def _createLayout(self, vert_layout, labelText, buttonGroup, clickSlot, setIndex): horiz_layout = QHBoxLayout() vert_layout.addLayout(horiz_layout) horiz_layout.addWidget(QLabel(labelText)) for index in range(0, ZXAttribute.paletteSize()): button = QCheckBox() color = QColor(*ZXAttribute.getPaletteColor(index, 0)) button.setStyleSheet("background-color: {}".format(color.name())) button.setText(ZXAttribute.getPaletteName(index, 0)) if index == setIndex: button.setChecked(True) buttonGroup.addButton(button, index) horiz_layout.addWidget(button) button.clicked.connect(clickSlot) @Slot() def _brightSelect(self, checked): if not checked: self._bright = 0 else: self._bright = 1 self._informFunction(self.fgIndex, self.bgIndex, self.palette) @Slot() def _fgIndexSelect(self, checked): self._fgIndex = self._fg_group.id(self.sender()) self._informFunction(self.fgIndex, self.bgIndex, self.palette) @Slot() def _bgIndexSelect(self, checked): self._bgIndex = self._bg_group.id(self.sender()) self._informFunction(self.fgIndex, self.bgIndex, self.palette) @property def palette(self): return self._bright @property def fgIndex(self): return self._fgIndex @property def bgIndex(self): return self._bgIndex
class MultiCheckWidget(QGroupBox): """Qt Widget to show multiple checkboxes for a sequence of numbers. Args: count: The number of checkboxes to show. title: Display title for group of checkboxes. selected: List of checkbox numbers to initially check. default: Whether to default boxes as checked. """ def __init__(self, *args, count: int, title: Optional[str] = "", selected: Optional[List] = None, default: Optional[bool] = False, **kwargs): super(MultiCheckWidget, self).__init__(*args, **kwargs) # QButtonGroup is the logical container # it allows us to get list of checked boxes more easily self.check_group = QButtonGroup() self.check_group.setExclusive(False) # more than one can be checked if title != "": self.setTitle(title) self.setFlat(False) else: self.setFlat(True) if selected is None: selected = list(range(count)) if default else [] check_layout = QGridLayout() self.setLayout(check_layout) for i in range(count): check = QCheckBox("%d" % (i)) # call signal/slot on self when one of the checkboxes is changed check.stateChanged.connect(lambda e: self.selectionChanged.emit()) self.check_group.addButton(check, i) check_layout.addWidget(check, i // 8, i % 8) self.setSelected(selected) """ selectionChanged signal sent when a checkbox gets a stateChanged signal """ selectionChanged = Signal() def getSelected(self) -> list: """Method to get list of the checked checkboxes. Returns: list of checked checkboxes """ selected = [] for check_button in self.check_group.buttons(): if check_button.isChecked(): selected.append(self.check_group.id(check_button)) return selected def setSelected(self, selected: list): """Method to set some checkboxes as checked. Args: selected: List of checkboxes to check. Returns: None """ for check_button in self.check_group.buttons(): if self.check_group.id(check_button) in selected: check_button.setChecked(True) else: check_button.setChecked(False) def boundingRect(self) -> QRectF: """Method required by Qt. """ return QRectF() def paint(self, painter, option, widget=None): """Method required by Qt. """ pass
class PreferencesDocumentPresetsPage(QWidget): preferencesChanged = Signal() def __init__(self, parent=None): super().__init__(parent) # Title title = QLabel( self.tr("<strong style=\"font-size:large;\">{0}</strong>").format( self.title())) # # Content: Header Labels rdbDefaultHeaderLabelHorizontalLetters = QRadioButton( self.tr("Letters")) rdbDefaultHeaderLabelHorizontalLetters.setToolTip( self. tr("Capital letters as default horizontal header labels of new documents" )) rdbDefaultHeaderLabelHorizontalNumbers = QRadioButton( self.tr("Numbers")) rdbDefaultHeaderLabelHorizontalNumbers.setToolTip( self. tr("Decimal numbers as default horizontal header labels of new documents" )) self._grpDefaultHeaderLabelHorizontal = QButtonGroup(self) self._grpDefaultHeaderLabelHorizontal.addButton( rdbDefaultHeaderLabelHorizontalLetters, Preferences.HeaderLabel.Letter.value) self._grpDefaultHeaderLabelHorizontal.addButton( rdbDefaultHeaderLabelHorizontalNumbers, Preferences.HeaderLabel.Decimal.value) self._grpDefaultHeaderLabelHorizontal.buttonClicked.connect( self._onPreferencesChanged) defaultHeaderLabelHorizontalBox = QHBoxLayout() defaultHeaderLabelHorizontalBox.addWidget( rdbDefaultHeaderLabelHorizontalLetters) defaultHeaderLabelHorizontalBox.addWidget( rdbDefaultHeaderLabelHorizontalNumbers) rdbDefaultHeaderLabelVerticalLetters = QRadioButton(self.tr("Letters")) rdbDefaultHeaderLabelVerticalLetters.setToolTip( self. tr("Capital letters as default vertical header labels of new documents" )) rdbDefaultHeaderLabelVerticalNumbers = QRadioButton(self.tr("Numbers")) rdbDefaultHeaderLabelVerticalNumbers.setToolTip( self. tr("Decimal numbers as default vertical header labels of new documents" )) self._grpDefaultHeaderLabelVertical = QButtonGroup() self._grpDefaultHeaderLabelVertical.addButton( rdbDefaultHeaderLabelVerticalLetters, Preferences.HeaderLabel.Letter.value) self._grpDefaultHeaderLabelVertical.addButton( rdbDefaultHeaderLabelVerticalNumbers, Preferences.HeaderLabel.Decimal.value) self._grpDefaultHeaderLabelVertical.buttonClicked.connect( self._onPreferencesChanged) defaultHeaderLabelVerticalBox = QHBoxLayout() defaultHeaderLabelVerticalBox.addWidget( rdbDefaultHeaderLabelVerticalLetters) defaultHeaderLabelVerticalBox.addWidget( rdbDefaultHeaderLabelVerticalNumbers) defaultHeaderLabelLayout = QFormLayout() defaultHeaderLabelLayout.addRow( self.tr("Labels of the horizontal header"), defaultHeaderLabelHorizontalBox) defaultHeaderLabelLayout.addRow( self.tr("Labels of the vertical header"), defaultHeaderLabelVerticalBox) defaultHeaderLabelGroup = QGroupBox(self.tr("Header Labels")) defaultHeaderLabelGroup.setLayout(defaultHeaderLabelLayout) # # Content: Cell Counts self._spbDefaultCellCountColumn = QSpinBox() self._spbDefaultCellCountColumn.setRange(1, 1000) self._spbDefaultCellCountColumn.setToolTip( self.tr("Default number of columns of new documents")) self._spbDefaultCellCountColumn.valueChanged.connect( self._onPreferencesChanged) self._spbDefaultCellCountRow = QSpinBox() self._spbDefaultCellCountRow.setRange(1, 1000) self._spbDefaultCellCountRow.setToolTip( self.tr("Default number of rows of new documents")) self._spbDefaultCellCountRow.valueChanged.connect( self._onPreferencesChanged) defaultCellCountLayout = QFormLayout() defaultCellCountLayout.addRow(self.tr("Number of columns"), self._spbDefaultCellCountColumn) defaultCellCountLayout.addRow(self.tr("Number of rows"), self._spbDefaultCellCountRow) defaultCellCountGroup = QGroupBox(self.tr("Cell Counts")) defaultCellCountGroup.setLayout(defaultCellCountLayout) # Main layout self._layout = QVBoxLayout(self) self._layout.addWidget(title) self._layout.addWidget(defaultHeaderLabelGroup) self._layout.addWidget(defaultCellCountGroup) self._layout.addStretch(1) def setZeroMargins(self): self._layout.setContentsMargins(0, 0, 0, 0) def title(self): return self.tr("Document Presets") def _onPreferencesChanged(self): self.preferencesChanged.emit() def setDefaultHeaderLabelHorizontal(self, type): if type.value != self._grpDefaultHeaderLabelHorizontal.checkedId(): self._onPreferencesChanged() for button in self._grpDefaultHeaderLabelHorizontal.buttons(): if self._grpDefaultHeaderLabelHorizontal.id(button) == type.value: button.setChecked(True) def defaultHeaderLabelHorizontal(self): return Preferences.HeaderLabel( self._grpDefaultHeaderLabelHorizontal.checkedId()) def setDefaultHeaderLabelVertical(self, type): if type.value != self._grpDefaultHeaderLabelVertical.checkedId(): self._onPreferencesChanged() for button in self._grpDefaultHeaderLabelVertical.buttons(): if self._grpDefaultHeaderLabelVertical.id(button) == type.value: button.setChecked(True) def defaultHeaderLabelVertical(self): return Preferences.HeaderLabel( self._grpDefaultHeaderLabelVertical.checkedId()) def setDefaultCellCountColumn(self, val): self._spbDefaultCellCountColumn.setValue(val) def defaultCellCountColumn(self): return self._spbDefaultCellCountColumn.value() def setDefaultCellCountRow(self, val): self._spbDefaultCellCountRow.setValue(val) def defaultCellCountRow(self): return self._spbDefaultCellCountRow.value()