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.
55 lines
1.5 KiB
55 lines
1.5 KiB
# coding: utf-8
|
|
from enum import Enum
|
|
|
|
from PySide6.QtCore import Qt
|
|
from PySide6.QtGui import QPainter
|
|
from PySide6.QtWidgets import QCheckBox, QStyle, QStyleOptionButton, QWidget
|
|
|
|
from ...common.icon import FluentIconBase, Theme, getIconColor
|
|
from ...common.style_sheet import FluentStyleSheet
|
|
from ...common.overload import singledispatchmethod
|
|
|
|
|
|
class CheckBoxIcon(FluentIconBase, Enum):
|
|
""" CheckBoxIcon """
|
|
|
|
ACCEPT = "Accept"
|
|
PARTIAL_ACCEPT = "PartialAccept"
|
|
|
|
def path(self, theme=Theme.AUTO):
|
|
c = getIconColor(theme, reverse=True)
|
|
return f':/qfluentwidgets/images/check_box/{self.value}_{c}.svg'
|
|
|
|
|
|
|
|
class CheckBox(QCheckBox):
|
|
""" Check box """
|
|
|
|
@singledispatchmethod
|
|
def __init__(self, parent: QWidget = None):
|
|
super().__init__(parent)
|
|
FluentStyleSheet.CHECK_BOX.apply(self)
|
|
|
|
@__init__.register
|
|
def _(self, text: str, parent: QWidget = None):
|
|
self.__init__(parent)
|
|
self.setText(text)
|
|
|
|
def paintEvent(self, e):
|
|
super().paintEvent(e)
|
|
painter = QPainter(self)
|
|
|
|
if not self.isEnabled():
|
|
painter.setOpacity(0.8)
|
|
|
|
# get the rect of indicator
|
|
opt = QStyleOptionButton()
|
|
opt.initFrom(self)
|
|
rect = self.style().subElementRect(QStyle.SE_CheckBoxIndicator, opt, self)
|
|
|
|
# draw indicator
|
|
if self.checkState() == Qt.Checked:
|
|
CheckBoxIcon.ACCEPT.render(painter, rect)
|
|
elif self.checkState() == Qt.PartiallyChecked:
|
|
CheckBoxIcon.PARTIAL_ACCEPT.render(painter, rect)
|