# coding:utf-8 from typing import Union from PySide6.QtCore import Signal from PySide6.QtGui import QIcon from PySide6.QtWidgets import QButtonGroup, QLabel from ...common.config import OptionsConfigItem, qconfig from ...common.icon import FluentIconBase from ..widgets.button import RadioButton from .expand_setting_card import ExpandSettingCard class OptionsSettingCard(ExpandSettingCard): """ setting card with a group of options """ optionChanged = Signal(OptionsConfigItem) def __init__(self, configItem, icon: Union[str, QIcon, FluentIconBase], title, content=None, texts=None, parent=None): """ Parameters ---------- configItem: OptionsConfigItem options config item icon: str | QIcon | FluentIconBase the icon to be drawn title: str the title of setting card content: str the content of setting card texts: List[str] the texts of radio buttons parent: QWidget parent window """ super().__init__(icon, title, content, parent) self.texts = texts or [] self.configItem = configItem self.configName = configItem.name self.choiceLabel = QLabel(self) self.buttonGroup = QButtonGroup(self) self.addWidget(self.choiceLabel) # create buttons self.viewLayout.setSpacing(19) self.viewLayout.setContentsMargins(48, 18, 0, 18) for text, option in zip(texts, configItem.options): button = RadioButton(text, self.view) self.buttonGroup.addButton(button) self.viewLayout.addWidget(button) button.setProperty(self.configName, option) self._adjustViewSize() self.setValue(qconfig.get(self.configItem)) configItem.valueChanged.connect(self.setValue) self.buttonGroup.buttonClicked.connect(self.__onButtonClicked) def __onButtonClicked(self, button: RadioButton): """ button clicked slot """ if button.text() == self.choiceLabel.text(): return value = button.property(self.configName) qconfig.set(self.configItem, value) self.choiceLabel.setText(button.text()) self.choiceLabel.adjustSize() self.optionChanged.emit(self.configItem) def setValue(self, value): """ select button according to the value """ qconfig.set(self.configItem, value) for button in self.viewLayout.widgets: isChecked = button.property(self.configName) == value button.setChecked(isChecked) if isChecked: self.choiceLabel.setText(button.text()) self.choiceLabel.adjustSize()