summaryrefslogtreecommitdiffstats
path: root/dragmove/dragmovecharm.py
blob: 81bfc492b532e82e594f5bc271a771401c8c4b12 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#############################################################################
##
## Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
## Contact: Qt Software Information (qt-info@nokia.com)
##
## This file is part of the Graphics Dojo project on Qt Labs.
##
## This file may be used under the terms of the GNU General Public
## License version 2.0 or 3.0 as published by the Free Software Foundation
## and appearing in the file LICENSE.GPL included in the packaging of
## this file.  Please review the following information to ensure GNU
## General Public Licensing requirements will be met:
## http://www.fsf.org/licensing/licenses/info/GPLv2.html and
## http://www.gnu.org/copyleft/gpl.html.
##
## If you are unsure which license is appropriate for your use, please
## contact the sales department at qt-sales@nokia.com.
##
## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
##
#############################################################################

from PyQt4.QtCore import QEvent, QObject, QPoint, Qt
from PyQt4.QtGui import QMouseEvent, QWidget

class DragMoveData:
    def __init__(self):
        self.isMoving = False
        self.startDrag = QPoint()

class DragMoveCharm(QObject):

    def __init__(self, parent = None):
    
        QObject.__init__(self, parent)
        self.dragMoveData = {}
    
    def activateOn(self, widget):
    
        if widget in self.dragMoveData:
            return
        
        data = DragMoveData()
        data.startDrag = QPoint(0, 0)
        data.isMoving = False
        self.dragMoveData[widget] = data
        
        widget.installEventFilter(self)
    
    def deactivateFrom(self, widget):
    
        del self.dragMoveData[widget]
        self.dragMoveData.remove(widget)
        widget.removeEventFilter(self)
    
    def eventFilter(self, object, event):
    
        if not isinstance(object, QWidget):
            return False
        
        widget = object
        
        type = event.type()
        if type != QEvent.MouseButtonPress and \
            type != QEvent.MouseButtonRelease and \
            type != QEvent.MouseMove:
            return False
        
        if isinstance(event, QMouseEvent):
            if event.modifiers() != Qt.NoModifier:
                return False
            button = event.button()
            mouseEvent = event
        
        try:
            data = self.dragMoveData[widget]
        except KeyError:
            return False
        
        consumed = False
        
        if type == QEvent.MouseButtonPress and button == Qt.LeftButton:
            data.startDrag = QPoint(mouseEvent.globalPos())
            data.isMoving = True
            event.accept()
            consumed = True
        
        if type == QEvent.MouseButtonRelease:
            data.startDrag = QPoint(0, 0)
            data.isMoving = False
        
        if type == QEvent.MouseMove and data.isMoving:
            pos = mouseEvent.globalPos()
            widget.move(widget.pos() + pos - data.startDrag)
            data.startDrag = QPoint(pos)
            consumed = True
        
        return consumed