source: orange/Orange/OrangeCanvas/canvas/view.py @ 11238:5cf4ba13c9f7

Revision 11238:5cf4ba13c9f7, 3.6 KB checked in by Ales Erjavec <ales.erjavec@…>, 16 months ago (diff)

Added auto scrolling to CanvasView.

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