eric7/EricWidgets/EricLineEditButton.py

branch
eric7
changeset 8358
144a6b854f70
parent 8356
68ec9c3d4de5
child 8557
17fb004af51d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric7/EricWidgets/EricLineEditButton.py	Sat May 22 19:58:24 2021 +0200
@@ -0,0 +1,97 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2010 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a button class to be used with EricLineEdit.
+"""
+
+from PyQt6.QtCore import Qt, QPoint, QPointF
+from PyQt6.QtGui import QPainter, QPainterPath
+from PyQt6.QtWidgets import QAbstractButton
+
+
+# TODO: Get rid of this
+class EricLineEditButton(QAbstractButton):
+    """
+    Class implementing a button to be used with EricLineEdit.
+    """
+    def __init__(self, parent=None):
+        """
+        Constructor
+        
+        @param parent reference to the parent widget (QWidget)
+        """
+        super().__init__(parent)
+        
+        self.__menu = None
+        self.__image = None
+        
+        self.setFocusPolicy(Qt.FocusPolicy.NoFocus)
+        self.setCursor(Qt.CursorShape.ArrowCursor)
+        self.setMinimumSize(16, 16)
+        
+        self.clicked.connect(self.__clicked)
+    
+    def setMenu(self, menu):
+        """
+        Public method to set the button menu.
+        
+        @param menu reference to the menu (QMenu)
+        """
+        self.__menu = menu
+        self.update()
+    
+    def menu(self):
+        """
+        Public method to get a reference to the menu.
+        
+        @return reference to the associated menu (QMenu)
+        """
+        return self.__menu
+    
+    def setIcon(self, icon):
+        """
+        Public method to set the button icon.
+        
+        @param icon icon to be set (QIcon)
+        """
+        if icon.isNull():
+            self.__image = None
+        else:
+            self.__image = icon.pixmap(16, 16).toImage()
+        super().setIcon(icon)
+    
+    def __clicked(self):
+        """
+        Private slot to handle a button click.
+        """
+        if self.__menu:
+            pos = self.mapToGlobal(QPoint(0, self.height()))
+            self.__menu.exec(pos)
+    
+    def paintEvent(self, evt):
+        """
+        Protected method handling a paint event.
+        
+        @param evt reference to the paint event (QPaintEvent)
+        """
+        painter = QPainter(self)
+        
+        if self.__image is not None and not self.__image.isNull():
+            x = (self.width() - self.__image.width()) // 2 - 1
+            y = (self.height() - self.__image.height()) // 2 - 1
+            painter.drawImage(x, y, self.__image)
+        
+        if self.__menu is not None:
+            triagPath = QPainterPath()
+            startPos = QPointF(self.width() - 5, self.height() - 3)
+            triagPath.moveTo(startPos)
+            triagPath.lineTo(startPos.x() + 4, startPos.y())
+            triagPath.lineTo(startPos.x() + 2, startPos.y() + 2)
+            triagPath.closeSubpath()
+            painter.setPen(Qt.GlobalColor.black)
+            painter.setBrush(Qt.GlobalColor.black)
+            painter.setRenderHint(QPainter.RenderHint.Antialiasing, False)
+            painter.drawPath(triagPath)

eric ide

mercurial