source: orange/orange/OrangeWidgets/OWGraphics.py @ 7937:f2a4a13e4a10

Revision 7937:f2a4a13e4a10, 4.7 KB checked in by ales_erjavec <ales.erjavec@…>, 3 years ago (diff)

Added OWGraphics module. Contains some common classes for Qt's graphics framework.

Line 
1""" Module extending Qt's graphics framework
2"""
3
4from PyQt4.QtCore import *
5from PyQt4.QtGui import *
6
7DEBUG = False
8
9class GtI(QGraphicsSimpleTextItem):
10    if DEBUG:
11        def paint(self, painter, option, widget =0):
12            QGraphicsSimpleTextItem.paint(self, painter, option, widget)
13            painter.drawRect(self.boundingRect())
14           
15   
16class GraphicsSimpleTextLayoutItem(QGraphicsLayoutItem):
17    """ A Graphics layout item wrapping a QGraphicsSimpleTextItem alowing it
18    to be managed by a layout.
19    """
20    def __init__(self, text_item, orientation=Qt.Horizontal, parent=None):
21        QGraphicsLayoutItem.__init__(self, parent)
22        self.orientation = orientation
23        self.text_item = text_item
24        if orientation == Qt.Vertical:
25            self.text_item.rotate(-90)
26            self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
27        else:
28            self.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Expanding)
29       
30    def setGeometry(self, rect):
31        QGraphicsLayoutItem.setGeometry(self, rect)
32        if self.orientation == Qt.Horizontal:
33            self.text_item.setPos(rect.topLeft())
34        else:
35            self.text_item.setPos(rect.bottomLeft())
36       
37    def sizeHint(self, which, constraint=QSizeF()):
38        if which in [Qt.PreferredSize]:
39            size = self.text_item.boundingRect().size()
40            if self.orientation == Qt.Horizontal:
41                return size
42            else:
43                return QSizeF(size.height(), size.width())
44        else:
45            return QSizeF()
46   
47    def setFont(self, font):
48        self.text_item.setFont(font)
49        self.updateGeometry()
50       
51    def setText(self, text):
52        self.text_item.setText(text)
53        self.updateGeometry()
54       
55    def setToolTip(self, tip):
56        self.text_item.setToolTip(tip)
57       
58       
59class GraphicsSimpleTextList(QGraphicsWidget):
60    """ A simple text list widget.
61    """
62    def __init__(self, labels=[], orientation=Qt.Vertical, parent=None, scene=None):
63        QGraphicsWidget.__init__(self, parent)
64        layout = QGraphicsLinearLayout(orientation)
65        layout.setContentsMargins(0, 0, 0, 0)
66        layout.setSpacing(0)
67        self.setLayout(layout)
68        self.orientation = orientation
69        self.alignment = Qt.AlignCenter
70        self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
71        self.set_labels(labels)
72       
73        if scene is not None:
74            scene.addItem(self)
75       
76    def clear(self):
77        """ Remove all text items.
78        """
79        layout = self.layout()
80        for i in reversed(range(layout.count())):
81            item = layout.itemAt(i)
82            item.text_item.setParentItem(None)
83            if self.scene():
84                self.scene().removeItem(item.text_item)
85            layout.removeAt(i)
86       
87        self.label_items = []
88        self.updateGeometry()
89       
90    def set_labels(self, labels):
91        """ Set the text labels to show in the widget.
92        """
93        self.clear()
94        orientation = Qt.Horizontal if self.orientation == Qt.Vertical else Qt.Vertical
95        for text in labels:
96#            item = QGraphicsSimpleTextItem(text, self)
97            item = GtI(text, self)
98            item.setFont(self.font())
99            item.setToolTip(text)
100            item = GraphicsSimpleTextLayoutItem(item, orientation, parent=self)
101            self.layout().addItem(item)
102            self.layout().setAlignment(item, self.alignment)
103            self.label_items.append(item)
104           
105        self.layout().activate()
106        self.updateGeometry()
107   
108    def setAlignment(self, alignment):
109        """ Set alignment of text items in the widget
110        """
111        self.alignment = alignment
112        layout = self.layout()
113        for i in range(layout.count()):
114            layout.setAlignment(layout.itemAt(i), alignment)
115           
116    def setVisible(self, bool):
117        QGraphicsWidget.setVisible(self, bool)
118        self.updateGeometry()
119           
120    def setFont(self, font):
121        """ Set the font for the text.
122        """
123        QGraphicsWidget.setFont(self, font)
124        for item in self.label_items:
125            item.setFont(font)
126        self.layout().invalidate()
127        self.updateGeometry()
128       
129    def sizeHint(self, which, constraint=QRectF()):
130        if not self.isVisible():
131            return QSizeF(0, 0)
132        else:
133            return QGraphicsWidget.sizeHint(self, which, constraint)
134       
135    def __iter__(self):
136        return iter(self.label_items)
137           
138    if DEBUG:
139        def paint(self, painter, options, widget=0):
140            rect =  self.geometry()
141            rect.translate(-self.pos())
142            painter.drawRect(rect)
Note: See TracBrowser for help on using the repository browser.