Ignore:
Timestamp:
12/13/12 17:56:23 (16 months ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Message:

Added auto scrolling to CanvasView.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • Orange/OrangeCanvas/canvas/view.py

    r11113 r11238  
    22Canvas Graphics View 
    33""" 
     4import logging 
    45 
    5 from PyQt4.QtGui import QGraphicsView 
    6 from PyQt4.QtCore import Qt, QPointF, QSizeF, QRectF 
     6from PyQt4.QtGui import QGraphicsView, QCursor 
     7from PyQt4.QtCore import Qt, QRect, QRectF, QTimer 
     8 
     9log = logging.getLogger(__name__) 
    710 
    811 
     
    1518        self.setAlignment(Qt.AlignTop | Qt.AlignLeft) 
    1619 
    17     def push_zoom_rect(self, rect): 
    18         """Zoom into the rect. 
    19         """ 
    20         raise NotImplementedError 
    21  
    22     def pop_zoom(self): 
    23         """Pop a zoom level. 
    24         """ 
    25         raise NotImplementedError 
     20        self.__autoScroll = False 
     21        self.__autoScrollMargin = 16 
     22        self.__autoScrollTimer = QTimer(self) 
     23        self.__autoScrollTimer.timeout.connect(self.__autoScrollAdvance) 
    2624 
    2725    def setScene(self, scene): 
     
    3331        scene.sceneRect() 
    3432        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 TracChangeset for help on using the changeset viewer.