1# -*- coding: utf-8 -*-
2
3# Copyright (c) 2010 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
4#
5
6"""
7Module implementing a button class to be used with E5LineEdit.
8"""
9
10from PyQt5.QtCore import Qt, QPoint, QPointF
11from PyQt5.QtGui import QPainter, QPainterPath
12from PyQt5.QtWidgets import QAbstractButton
13
14
15class E5LineEditButton(QAbstractButton):
16    """
17    Class implementing a button to be used with E5LineEdit.
18    """
19    def __init__(self, parent=None):
20        """
21        Constructor
22
23        @param parent reference to the parent widget (QWidget)
24        """
25        super().__init__(parent)
26
27        self.__menu = None
28        self.__image = None
29
30        self.setFocusPolicy(Qt.FocusPolicy.NoFocus)
31        self.setCursor(Qt.CursorShape.ArrowCursor)
32        self.setMinimumSize(16, 16)
33
34        self.clicked.connect(self.__clicked)
35
36    def setMenu(self, menu):
37        """
38        Public method to set the button menu.
39
40        @param menu reference to the menu (QMenu)
41        """
42        self.__menu = menu
43        self.update()
44
45    def menu(self):
46        """
47        Public method to get a reference to the menu.
48
49        @return reference to the associated menu (QMenu)
50        """
51        return self.__menu
52
53    def setIcon(self, icon):
54        """
55        Public method to set the button icon.
56
57        @param icon icon to be set (QIcon)
58        """
59        if icon.isNull():
60            self.__image = None
61        else:
62            self.__image = icon.pixmap(16, 16).toImage()
63        super().setIcon(icon)
64
65    def __clicked(self):
66        """
67        Private slot to handle a button click.
68        """
69        if self.__menu:
70            pos = self.mapToGlobal(QPoint(0, self.height()))
71            self.__menu.exec(pos)
72
73    def paintEvent(self, evt):
74        """
75        Protected method handling a paint event.
76
77        @param evt reference to the paint event (QPaintEvent)
78        """
79        painter = QPainter(self)
80
81        if self.__image is not None and not self.__image.isNull():
82            x = (self.width() - self.__image.width()) // 2 - 1
83            y = (self.height() - self.__image.height()) // 2 - 1
84            painter.drawImage(x, y, self.__image)
85
86        if self.__menu is not None:
87            triagPath = QPainterPath()
88            startPos = QPointF(self.width() - 5, self.height() - 3)
89            triagPath.moveTo(startPos)
90            triagPath.lineTo(startPos.x() + 4, startPos.y())
91            triagPath.lineTo(startPos.x() + 2, startPos.y() + 2)
92            triagPath.closeSubpath()
93            painter.setPen(Qt.GlobalColor.black)
94            painter.setBrush(Qt.GlobalColor.black)
95            painter.setRenderHint(QPainter.RenderHint.Antialiasing, False)
96            painter.drawPath(triagPath)
97