You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
2.7 KiB
86 lines
2.7 KiB
# 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()
|