source: orange/Orange/OrangeCanvas/canvas/view.py @ 11616:2e29f6b9b531

Revision 11616:2e29f6b9b531, 4.5 KB checked in by Ales Erjavec <ales.erjavec@…>, 10 months ago (diff)

Change canvas background when the signal propagation is paused.

Line 
1"""
2Canvas Graphics View
3"""
4import logging
5
6from PyQt4.QtGui import QGraphicsView, QCursor, QIcon
7from PyQt4.QtCore import Qt, QRect, QSize, QRectF, QPoint, QTimer
8
9log = logging.getLogger(__name__)
10
11
12class CanvasView(QGraphicsView):
13    """Canvas View handles the zooming.
14    """
15
16    def __init__(self, *args):
17        QGraphicsView.__init__(self, *args)
18        self.setAlignment(Qt.AlignTop | Qt.AlignLeft)
19
20        self.__backgroundIcon = QIcon()
21
22        self.__autoScroll = False
23        self.__autoScrollMargin = 16
24        self.__autoScrollTimer = QTimer(self)
25        self.__autoScrollTimer.timeout.connect(self.__autoScrollAdvance)
26
27    def setScene(self, scene):
28        QGraphicsView.setScene(self, scene)
29        self._ensureSceneRect(scene)
30
31    def _ensureSceneRect(self, scene):
32        r = scene.addRect(QRectF(0, 0, 400, 400))
33        scene.sceneRect()
34        scene.removeItem(r)
35
36    def setAutoScrollMargin(self, margin):
37        self.__autoScrollMargin = margin
38
39    def autoScrollMargin(self):
40        return self.__autoScrollMargin
41
42    def setAutoScroll(self, enable):
43        self.__autoScroll = enable
44
45    def autoScroll(self):
46        return self.__autoScroll
47
48    def mousePressEvent(self, event):
49        QGraphicsView.mousePressEvent(self, event)
50
51    def mouseMoveEvent(self, event):
52        if event.buttons() & Qt.LeftButton:
53            if not self.__autoScrollTimer.isActive() and \
54                    self.__shouldAutoScroll(event.pos()):
55                self.__startAutoScroll()
56
57        QGraphicsView.mouseMoveEvent(self, event)
58
59    def mouseReleaseEvent(self, event):
60        if event.button() & Qt.LeftButton:
61            self.__stopAutoScroll()
62
63        return QGraphicsView.mouseReleaseEvent(self, event)
64
65    def __shouldAutoScroll(self, pos):
66        if self.__autoScroll:
67            margin = self.__autoScrollMargin
68            viewrect = self.contentsRect()
69            rect = viewrect.adjusted(margin, margin, -margin, -margin)
70            # only do auto scroll when on the viewport's margins
71            return not rect.contains(pos) and viewrect.contains(pos)
72        else:
73            return False
74
75    def __startAutoScroll(self):
76        self.__autoScrollTimer.start(10)
77        log.debug("Auto scroll timer started")
78
79    def __stopAutoScroll(self):
80        if self.__autoScrollTimer.isActive():
81            self.__autoScrollTimer.stop()
82            log.debug("Auto scroll timer stopped")
83
84    def __autoScrollAdvance(self):
85        """Advance the auto scroll
86        """
87        pos = QCursor.pos()
88        pos = self.mapFromGlobal(pos)
89        margin = self.__autoScrollMargin
90
91        vvalue = self.verticalScrollBar().value()
92        hvalue = self.horizontalScrollBar().value()
93
94        vrect = QRect(0, 0, self.width(), self.height())
95
96        # What should be the speed
97        advance = 10
98
99        # We only do auto scroll if the mouse is inside the view.
100        if vrect.contains(pos):
101            if pos.x() < vrect.left() + margin:
102                self.horizontalScrollBar().setValue(hvalue - advance)
103            if pos.y() < vrect.top() + margin:
104                self.verticalScrollBar().setValue(vvalue - advance)
105            if pos.x() > vrect.right() - margin:
106                self.horizontalScrollBar().setValue(hvalue + advance)
107            if pos.y() > vrect.bottom() - margin:
108                self.verticalScrollBar().setValue(vvalue + advance)
109
110            if self.verticalScrollBar().value() == vvalue and \
111                    self.horizontalScrollBar().value() == hvalue:
112                self.__stopAutoScroll()
113        else:
114            self.__stopAutoScroll()
115
116        log.debug("Auto scroll advance")
117
118    def setBackgroundIcon(self, icon):
119        if not isinstance(icon, QIcon):
120            raise TypeError("A QIcon expected.")
121
122        if self.__backgroundIcon != icon:
123            self.__backgroundIcon = icon
124            self.viewport().update()
125
126    def backgroundIcon(self):
127        return QIcon(self.__backgroundIcon)
128
129    def drawBackground(self, painter, rect):
130        QGraphicsView.drawBackground(self, painter, rect)
131
132        if not self.__backgroundIcon.isNull():
133            painter.setClipRect(rect)
134            vrect = QRect(QPoint(0, 0), self.viewport().size())
135            vrect = self.mapToScene(vrect).boundingRect()
136
137            pm = self.__backgroundIcon.pixmap(
138                vrect.size().toSize().boundedTo(QSize(200, 200))
139            )
140            pmrect = QRect(QPoint(0, 0), pm.size())
141            pmrect.moveCenter(vrect.center().toPoint())
142            if rect.toRect().intersects(pmrect):
143                painter.drawPixmap(pmrect, pm)
Note: See TracBrowser for help on using the repository browser.