3 from __future__ import with_statement
4 from __future__ import division
9 from PyQt4 import QtCore
10 from PyQt4 import QtGui
13 _moduleLogger = logging.getLogger(__name__)
16 class QPieDisplay(QtGui.QWidget):
18 def __init__(self, parent = None, flags = QtCore.Qt.Window):
19 QtGui.QWidget.__init__(self, parent, flags)
21 self._size = QtCore.QSize(128, 128)
22 self._canvas = QtGui.QPixmap(self._size)
23 self._mask = QtGui.QBitmap(self._canvas.size())
24 self._mask.fill(QtCore.Qt.color0)
25 self._generate_mask(self._mask)
26 self._canvas.setMask(self._mask)
31 def showEvent(self, showEvent):
32 self.setMask(self._mask)
34 QtGui.QWidget.showEvent(self, showEvent)
36 def paintEvent(self, paintEvent):
37 painter = QtGui.QPainter(self._canvas)
38 painter.setRenderHint(QtGui.QPainter.Antialiasing, True)
39 adjustmentRect = self._canvas.rect().adjusted(0, 0, -1, -1)
41 painter.setBrush(self.palette().window())
42 painter.setPen(self.palette().mid().color())
43 painter.drawRect(self._canvas.rect())
45 background = self.palette().highlight().color()
46 painter.setPen(QtCore.Qt.NoPen)
47 painter.setBrush(background)
48 painter.drawPie(adjustmentRect, 0, 360 * 16)
50 dark = self.palette().mid().color()
51 painter.setPen(QtGui.QPen(dark, 1))
52 painter.setBrush(QtCore.Qt.NoBrush)
53 painter.drawEllipse(adjustmentRect)
55 screen = QtGui.QPainter(self)
56 screen.drawPixmap(QtCore.QPoint(0, 0), self._canvas)
57 QtGui.QWidget.paintEvent(self, paintEvent)
59 def mousePressEvent(self, mouseEvent):
62 def mouseReleaseEvent(self, mouseEvent):
63 if self._child is None:
64 lastMousePos = mouseEvent.pos()
65 globalButtonPos = self.mapToGlobal(lastMousePos)
66 self._child = QPieDisplay(None, QtCore.Qt.SplashScreen)
67 self._child.move(globalButtonPos)
73 def _generate_mask(self, mask):
75 Specifies on the mask the shape of the pie menu
77 painter = QtGui.QPainter(mask)
78 painter.setPen(QtCore.Qt.color1)
79 painter.setBrush(QtCore.Qt.color1)
80 painter.drawRect(mask.rect())
85 layout = QtGui.QGridLayout()
88 button = QtGui.QPushButton("%s,%s" % (i, k))
89 button.setSizePolicy(QtGui.QSizePolicy(
90 QtGui.QSizePolicy.MinimumExpanding,
91 QtGui.QSizePolicy.MinimumExpanding,
92 QtGui.QSizePolicy.PushButton,
94 self._create_callback(button)
95 layout.addWidget(button, i, k)
97 centralWidget = QtGui.QWidget()
98 centralWidget.setLayout(layout)
99 centralWidget.setContentsMargins(0, 0, 0, 0)
101 self._window = QtGui.QMainWindow()
102 self._window.setAttribute(QtCore.Qt.WA_DeleteOnClose, True)
103 self._window.setWindowTitle("Buttons!")
104 self._window.setCentralWidget(centralWidget)
110 def _create_callback(self, button):
111 button.clicked.connect(lambda: self._on_click(button))
113 def _on_click(self, button):
114 if self._child is None:
115 buttonCorner = pos = QtCore.QPoint(0, 0)
116 globalButtonPos = button.mapToGlobal(pos)
117 self._child = QPieDisplay(None, QtCore.Qt.SplashScreen)
118 self._child.move(globalButtonPos)
125 if __name__ == "__main__":
126 app = QtGui.QApplication([])