96 lines
3.0 KiB
Python
96 lines
3.0 KiB
Python
|
|
# coding:utf-8
|
||
|
|
from PySide6.QtCore import Qt, QPoint
|
||
|
|
from PySide6.QtGui import QAction
|
||
|
|
|
||
|
|
|
||
|
|
from .acrylic_menu import AcrylicMenuBase, AcrylicMenuActionListWidget
|
||
|
|
from .acrylic_line_edit import AcrylicLineEditBase
|
||
|
|
from ..widgets.combo_box import ComboBoxMenu, ComboBox, EditableComboBox
|
||
|
|
from ..widgets.menu import MenuAnimationType, RoundMenu, IndicatorMenuItemDelegate
|
||
|
|
from ..settings import SettingCard
|
||
|
|
from ...common.config import OptionsConfigItem, qconfig
|
||
|
|
|
||
|
|
|
||
|
|
class AcrylicComboMenuActionListWidget(AcrylicMenuActionListWidget):
|
||
|
|
|
||
|
|
def _topMargin(self):
|
||
|
|
return 2
|
||
|
|
|
||
|
|
|
||
|
|
class AcrylicComboBoxMenu(AcrylicMenuBase, RoundMenu):
|
||
|
|
|
||
|
|
def __init__(self, parent=None):
|
||
|
|
super().__init__(parent=parent)
|
||
|
|
self.setUpMenu(AcrylicComboMenuActionListWidget(self))
|
||
|
|
|
||
|
|
self.view.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
|
||
|
|
self.view.setItemDelegate(IndicatorMenuItemDelegate())
|
||
|
|
self.view.setObjectName('comboListWidget')
|
||
|
|
self.setItemHeight(33)
|
||
|
|
|
||
|
|
def exec(self, pos, ani=True, aniType=MenuAnimationType.DROP_DOWN):
|
||
|
|
return super().exec(pos, ani, aniType)
|
||
|
|
|
||
|
|
|
||
|
|
class AcrylicComboBox(ComboBox):
|
||
|
|
""" Acrylic combo box """
|
||
|
|
|
||
|
|
def _createComboMenu(self):
|
||
|
|
return AcrylicComboBoxMenu(self)
|
||
|
|
|
||
|
|
|
||
|
|
class AcrylicEditableComboBox(AcrylicLineEditBase, EditableComboBox):
|
||
|
|
""" Acrylic combo box """
|
||
|
|
|
||
|
|
def _createComboMenu(self):
|
||
|
|
return AcrylicComboBoxMenu(self)
|
||
|
|
|
||
|
|
|
||
|
|
class AcrylicComboBoxSettingCard(SettingCard):
|
||
|
|
""" Setting card with a combo box """
|
||
|
|
|
||
|
|
def __init__(self, configItem: OptionsConfigItem, icon, title, content=None, texts=None, parent=None):
|
||
|
|
"""
|
||
|
|
Parameters
|
||
|
|
----------
|
||
|
|
configItem: OptionsConfigItem
|
||
|
|
configuration item operated by the card
|
||
|
|
|
||
|
|
icon: str | QIcon | FluentIconBase
|
||
|
|
the icon to be drawn
|
||
|
|
|
||
|
|
title: str
|
||
|
|
the title of card
|
||
|
|
|
||
|
|
content: str
|
||
|
|
the content of card
|
||
|
|
|
||
|
|
texts: List[str]
|
||
|
|
the text of items
|
||
|
|
|
||
|
|
parent: QWidget
|
||
|
|
parent widget
|
||
|
|
"""
|
||
|
|
super().__init__(icon, title, content, parent)
|
||
|
|
self.configItem = configItem
|
||
|
|
self.comboBox = AcrylicComboBox(self)
|
||
|
|
self.hBoxLayout.addWidget(self.comboBox, 0, Qt.AlignRight)
|
||
|
|
self.hBoxLayout.addSpacing(16)
|
||
|
|
|
||
|
|
self.optionToText = {o: t for o, t in zip(configItem.options, texts)}
|
||
|
|
for text, option in zip(texts, configItem.options):
|
||
|
|
self.comboBox.addItem(text, userData=option)
|
||
|
|
|
||
|
|
self.comboBox.setCurrentText(self.optionToText[qconfig.get(configItem)])
|
||
|
|
self.comboBox.currentIndexChanged.connect(self._onCurrentIndexChanged)
|
||
|
|
configItem.valueChanged.connect(self.setValue)
|
||
|
|
|
||
|
|
def _onCurrentIndexChanged(self, index: int):
|
||
|
|
qconfig.set(self.configItem, self.comboBox.itemData(index))
|
||
|
|
|
||
|
|
def setValue(self, value):
|
||
|
|
if value not in self.optionToText:
|
||
|
|
return
|
||
|
|
|
||
|
|
self.comboBox.setCurrentText(self.optionToText[value])
|
||
|
|
qconfig.set(self.configItem, value)
|