eric7/WebBrowser/GreaseMonkey/GreaseMonkeyConfiguration/GreaseMonkeyConfigurationListDelegate.py

branch
eric7
changeset 8312
800c432b34c8
parent 8260
2161475d9639
child 8318
962bce857696
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric7/WebBrowser/GreaseMonkey/GreaseMonkeyConfiguration/GreaseMonkeyConfigurationListDelegate.py	Sat May 15 18:45:04 2021 +0200
@@ -0,0 +1,218 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2012 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a delegate for the special list widget for GreaseMonkey
+scripts.
+"""
+
+from PyQt5.QtCore import Qt, QSize, QRect
+from PyQt5.QtGui import QFontMetrics, QPalette, QFont
+from PyQt5.QtWidgets import QStyle, QStyledItemDelegate, QApplication
+from PyQt5.QtWidgets import QStyleOptionViewItem
+
+import UI.PixmapCache
+import Globals
+
+
+class GreaseMonkeyConfigurationListDelegate(QStyledItemDelegate):
+    """
+    Class implementing a delegate for the special list widget for GreaseMonkey
+    scripts.
+    """
+    IconSize = 32
+    RemoveIconSize = 16
+    CheckBoxSize = 18
+    MinPadding = 5
+    ItemWidth = 200
+    
+    def __init__(self, parent=None):
+        """
+        Constructor
+        
+        @param parent reference to the parent object (QObject)
+        """
+        super().__init__(parent)
+        
+        self.__removePixmap = UI.PixmapCache.getIcon(
+            "greaseMonkeyTrash").pixmap(
+                GreaseMonkeyConfigurationListDelegate.RemoveIconSize)
+        self.__rowHeight = 0
+        self.__padding = 0
+    
+    def padding(self):
+        """
+        Public method to get the padding used.
+        
+        @return padding used (integer)
+        """
+        return self.__padding
+    
+    def paint(self, painter, option, index):
+        """
+        Public method to paint the specified list item.
+        
+        @param painter painter object to paint to (QPainter)
+        @param option style option used for painting (QStyleOptionViewItem)
+        @param index model index of the item (QModelIndex)
+        """
+        opt = QStyleOptionViewItem(option)
+        self.initStyleOption(opt, index)
+        
+        widget = opt.widget
+        style = widget.style() if widget is not None else QApplication.style()
+        height = opt.rect.height()
+        center = height // 2 + opt.rect.top()
+        
+        # Prepare title font
+        titleFont = QFont(opt.font)
+        titleFont.setBold(True)
+        titleFont.setPointSize(titleFont.pointSize() + 1)
+        
+        titleMetrics = QFontMetrics(titleFont)
+        colorRole = (
+            QPalette.ColorRole.Text
+            if Globals.isWindowsPlatform() else
+            (QPalette.ColorRole.HighlightedText
+             if opt.state & QStyle.StateFlag.State_Selected else
+             QPalette.ColorRole.Text)
+        )
+        
+        leftPos = self.__padding
+        rightPos = (
+            opt.rect.right() - self.__padding -
+            GreaseMonkeyConfigurationListDelegate.RemoveIconSize
+        )
+        
+        # Draw background
+        style.drawPrimitive(
+            QStyle.PrimitiveElement.PE_PanelItemViewItem, opt, painter, widget)
+        
+        # Draw checkbox
+        checkBoxYPos = (
+            center -
+            GreaseMonkeyConfigurationListDelegate.CheckBoxSize // 2
+        )
+        opt2 = QStyleOptionViewItem(opt)
+        if opt2.checkState == Qt.CheckState.Checked:
+            opt2.state |= QStyle.StateFlag.State_On
+        else:
+            opt2.state |= QStyle.StateFlag.State_Off
+        styleCheckBoxRect = style.subElementRect(
+            QStyle.SubElement.SE_ViewItemCheckIndicator, opt2, widget)
+        opt2.rect = QRect(
+            leftPos, checkBoxYPos,
+            styleCheckBoxRect.width(), styleCheckBoxRect.height())
+        style.drawPrimitive(
+            QStyle.PrimitiveElement.PE_IndicatorViewItemCheck, opt2, painter,
+            widget)
+        leftPos = opt2.rect.right() + self.__padding
+        
+        # Draw icon
+        iconYPos = center - GreaseMonkeyConfigurationListDelegate.IconSize // 2
+        iconRect = QRect(leftPos, iconYPos,
+                         GreaseMonkeyConfigurationListDelegate.IconSize,
+                         GreaseMonkeyConfigurationListDelegate.IconSize)
+        pixmap = index.data(Qt.ItemDataRole.DecorationRole).pixmap(
+            GreaseMonkeyConfigurationListDelegate.IconSize)
+        painter.drawPixmap(iconRect, pixmap)
+        leftPos = iconRect.right() + self.__padding
+        
+        # Draw script name
+        name = index.data(Qt.ItemDataRole.DisplayRole)
+        leftTitleEdge = leftPos + 2
+        rightTitleEdge = rightPos - self.__padding
+        try:
+            leftPosForVersion = (
+                titleMetrics.horizontalAdvance(name) + self.__padding
+            )
+        except AttributeError:
+            leftPosForVersion = titleMetrics.width(name) + self.__padding
+        nameRect = QRect(leftTitleEdge, opt.rect.top() + self.__padding,
+                         rightTitleEdge - leftTitleEdge, titleMetrics.height())
+        painter.setFont(titleFont)
+        style.drawItemText(
+            painter, nameRect,
+            Qt.AlignmentFlag.AlignLeft, opt.palette, True,
+            name, colorRole)
+        
+        # Draw version
+        version = index.data(Qt.ItemDataRole.UserRole)
+        versionRect = QRect(
+            nameRect.x() + leftPosForVersion, nameRect.y(),
+            rightTitleEdge - leftTitleEdge, titleMetrics.height())
+        versionFont = titleFont
+        painter.setFont(versionFont)
+        style.drawItemText(
+            painter, versionRect,
+            Qt.AlignmentFlag.AlignLeft, opt.palette,
+            True, version, colorRole)
+        
+        # Draw description
+        infoYPos = nameRect.bottom() + opt.fontMetrics.leading()
+        infoRect = QRect(
+            nameRect.x(), infoYPos,
+            nameRect.width(), opt.fontMetrics.height())
+        info = opt.fontMetrics.elidedText(
+            index.data(Qt.ItemDataRole.UserRole + 1),
+            Qt.TextElideMode.ElideRight, infoRect.width())
+        painter.setFont(opt.font)
+        style.drawItemText(
+            painter, infoRect,
+            Qt.AlignmentFlag.AlignLeft | Qt.TextFlag.TextSingleLine,
+            opt.palette, True, info, colorRole)
+        
+        # Draw remove button
+        removeIconYPos = (
+            center -
+            GreaseMonkeyConfigurationListDelegate.RemoveIconSize // 2
+        )
+        removeIconRect = QRect(
+            rightPos, removeIconYPos,
+            GreaseMonkeyConfigurationListDelegate.RemoveIconSize,
+            GreaseMonkeyConfigurationListDelegate.RemoveIconSize)
+        painter.drawPixmap(removeIconRect, self.__removePixmap)
+    
+    def sizeHint(self, option, index):
+        """
+        Public method to get a size hint for the specified list item.
+        
+        @param option style option used for painting (QStyleOptionViewItem)
+        @param index model index of the item (QModelIndex)
+        @return size hint (QSize)
+        """
+        if not self.__rowHeight:
+            opt = QStyleOptionViewItem(option)
+            self.initStyleOption(opt, index)
+            
+            widget = opt.widget
+            style = (
+                widget.style() if widget is not None
+                else QApplication.style()
+            )
+            padding = style.pixelMetric(
+                QStyle.PixelMetric.PM_FocusFrameHMargin) + 1
+            
+            titleFont = opt.font
+            titleFont.setBold(True)
+            titleFont.setPointSize(titleFont.pointSize() + 1)
+            
+            self.__padding = (
+                padding
+                if padding > GreaseMonkeyConfigurationListDelegate.MinPadding
+                else GreaseMonkeyConfigurationListDelegate.MinPadding
+            )
+            
+            titleMetrics = QFontMetrics(titleFont)
+            
+            self.__rowHeight = (
+                2 * self.__padding +
+                opt.fontMetrics.leading() +
+                opt.fontMetrics.height() +
+                titleMetrics.height()
+            )
+        
+        return QSize(GreaseMonkeyConfigurationListDelegate.ItemWidth,
+                     self.__rowHeight)

eric ide

mercurial