Exemplo n.º 1
0
    def eventFilter(self, object, event):

        if not object.isWidgetType():
            return False;

        eventType = event.type()
        if eventType != QtCore.QEvent.MouseButtonPress and \
           eventType != QtCore.QEvent.MouseButtonRelease and \
           eventType != QtCore.QEvent.MouseMove:
            return False

        if event.modifiers() != Qt.NoModifier:
            return False

        if not self.d.flickData.has_key(object):
            return False

        data = self.d.flickData[object]
        found, newIgnored = removeAll(data.ignored, event)
        if found:
            data.ignored = newIgnored
            return False

        consumed = False

        if data.state == FlickData.Steady:
            if eventType == QtCore.QEvent.MouseButtonPress:
                if event.buttons() == Qt.LeftButton:
                    consumed = True
                    data.state = FlickData.Pressed
                    data.pressPos = copy.copy(event.pos())
                    data.offset = scrollOffset(data.widget)

        elif data.state == FlickData.Pressed:
            if eventType == QtCore.QEvent.MouseButtonRelease:
                consumed = True
                data.state = FlickData.Steady
                event1 = QtCore.QMouseEvent(QtCore.QEvent.MouseButtonPress,
                                            data.pressPos, Qt.LeftButton,
                                            Qt.LeftButton, Qt.NoModifier)
                event2 = QtCore.QMouseEvent(event)
                data.ignored.append(event1)
                data.ignored.append(event2)
                QtGui.QApplication.postEvent(object, event1)
                QtGui.QApplication.postEvent(object, event2)
            elif eventType == QtCore.QEvent.MouseMove:
                consumed = True
                data.state = FlickData.ManualScroll
                data.dragPos = QtGui.QCursor.pos()
                if not self.d.ticker.isActive():
                    self.d.ticker.start(20, self)

        elif data.state == FlickData.ManualScroll:
            if eventType == QtCore.QEvent.MouseMove:
                consumed = True
                pos = event.pos()
                delta = pos - data.pressPos
                setScrollOffset(data.widget, data.offset - delta)
            elif eventType == QtCore.QEvent.MouseButtonRelease:
                consumed = True
                data.state = FlickData.AutoScroll

        elif data.state == FlickData.AutoScroll:
            if eventType == QtCore.QEvent.MouseButtonPress:
                consumed = True
                data.state = FlickData.Stop
                data.speed = QtCore.QPoint(0, 0)
            elif eventType == QtCore.QEvent.MouseButtonRelease:
                consumed = True
                data.state = FlickData.Steady
                data.speed = QtCore.QPoint(0, 0)

        elif data.state == FlickData.Stop:
            if eventType == QtCore.QEvent.MouseButtonRelease:
                consumed = True
                data.state = FlickData.Steady
            elif eventType == QtCore.QEvent.MouseMove:
                consumed = True
                data.state = FlickData.ManualScroll
                data.dragPos = QtGui.QCursor.pos()
                if not self.d.ticker.isActive():
                    self.d.ticker.start(20, self)

        return consumed