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.
84 lines
2.5 KiB
84 lines
2.5 KiB
# coding:utf-8
|
|
|
|
from PySide6.QtCore import Qt, QSize
|
|
from PySide6.QtGui import QPainter, QColor, QPalette
|
|
from PySide6.QtWidgets import QTreeWidget, QStyledItemDelegate, QStyle, QTreeView
|
|
|
|
from ...common.style_sheet import FluentStyleSheet, themeColor, isDarkTheme
|
|
from ...common.font import getFont
|
|
from .scroll_area import SmoothScrollDelegate
|
|
|
|
|
|
class TreeItemDelegate(QStyledItemDelegate):
|
|
""" Tree item delegate """
|
|
|
|
def __init__(self, parent: QTreeView):
|
|
super().__init__(parent)
|
|
|
|
def paint(self, painter, option, index):
|
|
painter.setRenderHints(
|
|
QPainter.Antialiasing | QPainter.TextAntialiasing)
|
|
super().paint(painter, option, index)
|
|
|
|
if not (option.state & (QStyle.State_Selected | QStyle.State_MouseOver)):
|
|
return
|
|
|
|
painter.save()
|
|
painter.setPen(Qt.NoPen)
|
|
|
|
# draw background
|
|
h = option.rect.height() - 4
|
|
c = 255 if isDarkTheme() else 0
|
|
painter.setBrush(QColor(c, c, c, 9))
|
|
painter.drawRoundedRect(
|
|
4, option.rect.y() + 2, self.parent().width() - 8, h, 4, 4)
|
|
|
|
# draw indicator
|
|
if option.state & QStyle.State_Selected and self.parent().horizontalScrollBar().value() == 0:
|
|
painter.setBrush(themeColor())
|
|
painter.drawRoundedRect(4, 9+option.rect.y(), 3, h - 13, 1.5, 1.5)
|
|
|
|
painter.restore()
|
|
|
|
def initStyleOption(self, option, index):
|
|
super().initStyleOption(option, index)
|
|
option.font = getFont(13)
|
|
if isDarkTheme():
|
|
option.palette.setColor(QPalette.Text, Qt.white)
|
|
option.palette.setColor(QPalette.HighlightedText, Qt.white)
|
|
else:
|
|
option.palette.setColor(QPalette.Text, Qt.black)
|
|
option.palette.setColor(QPalette.HighlightedText, Qt.black)
|
|
|
|
|
|
class TreeViewBase:
|
|
""" Tree view base class """
|
|
|
|
def _initView(self):
|
|
self.scrollDelagate = SmoothScrollDelegate(self)
|
|
|
|
self.setItemDelegate(TreeItemDelegate(self))
|
|
self.setIconSize(QSize(16, 16))
|
|
|
|
FluentStyleSheet.TREE_VIEW.apply(self)
|
|
|
|
def drawBranches(self, painter, rect, index):
|
|
rect.moveLeft(15)
|
|
return QTreeView.drawBranches(self, painter, rect, index)
|
|
|
|
|
|
class TreeWidget(TreeViewBase, QTreeWidget):
|
|
""" Tree widget """
|
|
|
|
def __init__(self, parent=None):
|
|
super().__init__(parent=parent)
|
|
self._initView()
|
|
|
|
|
|
class TreeView(TreeViewBase, QTreeView):
|
|
""" Tree view """
|
|
|
|
def __init__(self, parent=None):
|
|
super().__init__(parent=parent)
|
|
self._initView()
|