source: orange/orange/OrangeWidgets/OWToolbars.py @ 8735:065a34c267f2

Revision 8735:065a34c267f2, 8.9 KB checked in by matejd <matejd@…>, 3 years ago (diff)

Moved over code from qtgraph branch, turned primitives into a module (plot.primitives); added Visualize Qt folder to setup.py packages

Line 
1from PyQt4.QtCore import *
2from PyQt4.QtGui import *
3import os.path
4import OWGUI
5
6dir = os.path.dirname(__file__) + "/icons/"
7dlg_zoom = dir + "Dlg_zoom.png"
8dlg_zoom_selection = dir + "Dlg_zoom_selection.png"
9dlg_pan = dir + "Dlg_pan_hand.png"
10dlg_select = dir + "Dlg_arrow.png"
11dlg_rect = dir + "Dlg_rect.png"
12dlg_poly = dir + "Dlg_poly.png"
13dlg_zoom_extent = dir + "Dlg_zoom_extent.png"
14dlg_undo = dir + "Dlg_undo.png"
15dlg_clear = dir + "Dlg_clear.png"
16dlg_send = dir + "Dlg_send.png"
17dlg_browseRectangle = dir + "Dlg_browseRectangle.png"
18dlg_browseCircle = dir + "Dlg_browseCircle.png"
19
20dlg_zoom_selection = dir + "Dlg_zoom_selection.png"
21dlg_pan = dir + "Dlg_pan_hand.png"
22dlg_select = dir + "Dlg_arrow.png"
23dlg_zoom_extent = dir + "dlg_zoom_extent.png"
24
25
26def createButton(parent, text, action = None, icon = None, toggle = 0):
27    btn = QToolButton(parent)
28    btn.setMinimumSize(30,30)
29    if parent.layout() is not None:
30        parent.layout().addWidget(btn)
31    btn.setCheckable(toggle)
32    if action:
33        parent.connect(btn, SIGNAL("clicked()"), action)
34    if icon:
35        btn.setIcon(icon)
36    btn.setToolTip(text)
37    return btn
38
39class ZoomSelectToolbar(QGroupBox):
40#                (tooltip, attribute containing the button, callback function, button icon, button cursor, toggle)
41    IconSpace, IconZoom, IconPan, IconSelect, IconRectangle, IconPolygon, IconRemoveLast, IconRemoveAll, IconSendSelection, IconZoomExtent, IconZoomSelection = range(11)
42
43    DefaultButtons = 1, 4, 5, 0, 6, 7, 8
44    SelectButtons = 3, 4, 5, 0, 6, 7, 8
45    NavigateButtons = 1, 9, 10, 0, 2
46
47    def __init__(self, widget, parent, graph, autoSend = 0, buttons = (1, 4, 5, 0, 6, 7, 8), name = "Zoom / Select", exclusiveList = "__toolbars"):
48        if not hasattr(ZoomSelectToolbar, "builtinFunctions"):
49            ZoomSelectToolbar.builtinFunctions = \
50                 (None,
51                 ("Zooming", "buttonZoom", "activateZooming", QIcon(dlg_zoom), Qt.ArrowCursor, 1),
52                 ("Panning", "buttonPan", "activatePanning", QIcon(dlg_pan), Qt.OpenHandCursor, 1),
53                 ("Selection", "buttonSelect", "activateSelection", QIcon(dlg_select), Qt.CrossCursor, 1),
54                 ("Rectangle selection", "buttonSelectRect", "activateRectangleSelection", QIcon(dlg_rect), Qt.CrossCursor, 1),
55                 ("Polygon selection", "buttonSelectPoly", "activatePolygonSelection", QIcon(dlg_poly), Qt.CrossCursor, 1),
56                 ("Remove last selection", "buttonRemoveLastSelection", "removeLastSelection", QIcon(dlg_undo), None, 0),
57                 ("Remove all selections", "buttonRemoveAllSelections", "removeAllSelections", QIcon(dlg_clear), None, 0),
58                 ("Send selections", "buttonSendSelections", "sendData", QIcon(dlg_send), None, 0),
59                 ("Zoom to extent", "buttonZoomExtent", "zoomExtent", QIcon(dlg_zoom_extent), None, 0),
60                 ("Zoom selection", "buttonZoomSelection", "zoomSelection", QIcon(dlg_zoom_selection), None, 0)
61                )
62
63        QGroupBox.__init__(self, name, parent)
64        self.setLayout(QHBoxLayout())
65        self.layout().setMargin(6)
66        self.layout().setSpacing(4)
67        if parent.layout() is not None:
68            parent.layout().addWidget(self)
69
70        self.graph = graph # save graph. used to send signals
71        self.exclusiveList = exclusiveList
72
73        self.widget = None
74        self.functions = [type(f) == int and self.builtinFunctions[f] or f for f in buttons]
75        for b, f in enumerate(self.functions):
76            if not f:
77                self.layout().addSpacing(10)
78            else:
79                button = createButton(self, f[0], lambda x=b: self.action(x), f[3], toggle = f[5])
80                setattr(self, f[1], button)
81                if f[1] == "buttonSendSelections":
82                    button.setEnabled(not autoSend)
83
84        if not hasattr(widget, exclusiveList):
85            setattr(widget, exclusiveList, [self])
86        else:
87            getattr(widget, exclusiveList).append(self)
88
89        self.widget = widget    # we set widget here so that it doesn't affect the value of self.widget.toolbarSelection
90        self.action(0)
91
92
93    def action(self, b):
94        f = self.functions[b]
95        if not f:
96            return
97
98        if f[5]:
99            if hasattr(self.widget, "toolbarSelection"):
100                self.widget.toolbarSelection = b
101            for tbar in getattr(self.widget, self.exclusiveList):
102                for fi, ff in enumerate(tbar.functions):
103                    if ff and ff[5]:
104                        getattr(tbar, ff[1]).setChecked(self == tbar and fi == b)
105        getattr(self.graph, f[2])()
106
107        cursor = f[4]
108        if not cursor is None:
109            self.graph.setCursor(cursor)
110
111
112    # for backward compatibility with a previous version of this class
113    def actionZooming(self): self.action(0)
114    def actionRectangleSelection(self): self.action(3)
115    def actionPolygonSelection(self): self.action(4)
116
117
118class NavigateSelectToolbar(QWidget):
119#                (tooltip, attribute containing the button, callback function, button icon, button cursor, toggle)
120
121    IconSpace, IconZoom, IconPan, IconSelect, IconRectangle, IconPolygon, IconRemoveLast, IconRemoveAll, IconSendSelection, IconZoomExtent, IconZoomSelection = range(11)
122
123    def __init__(self, widget, parent, graph, autoSend = 0, buttons = (1, 4, 5, 0, 6, 7, 8)):
124        if not hasattr(NavigateSelectToolbar, "builtinFunctions"):
125            NavigateSelectToolbar.builtinFunctions = (None,
126                 ("Zooming", "buttonZoom", "activateZooming", QIcon(dlg_zoom), Qt.CrossCursor, 1, "navigate"),
127                 ("Panning", "buttonPan", "activatePanning", QIcon(dlg_pan), Qt.OpenHandCursor, 1, "navigate"),
128                 ("Selection", "buttonSelect", "activateSelection", QIcon(dlg_select), Qt.ArrowCursor, 1, "select"),
129                 ("Selection", "buttonSelectRect", "activateRectangleSelection", QIcon(dlg_select), Qt.ArrowCursor, 1, "select"),
130                 ("Polygon selection", "buttonSelectPoly", "activatePolygonSelection", QIcon(dlg_poly), Qt.ArrowCursor, 1, "select"),
131                 ("Remove last selection", "buttonRemoveLastSelection", "removeLastSelection", QIcon(dlg_undo), None, 0, "select"),
132                 ("Remove all selections", "buttonRemoveAllSelections", "removeAllSelections", QIcon(dlg_clear), None, 0, "select"),
133                 ("Send selections", "buttonSendSelections", "sendData", QIcon(dlg_send), None, 0, "select"),
134                 ("Zoom to extent", "buttonZoomExtent", "zoomExtent", QIcon(dlg_zoom_extent), None, 0, "navigate"),
135                 ("Zoom selection", "buttonZoomSelection", "zoomSelection", QIcon(dlg_zoom_selection), None, 0, "navigate")
136                )
137
138        QWidget.__init__(self, parent)
139        self.setLayout(QVBoxLayout())
140        self.layout().setSpacing(0)
141        self.layout().setContentsMargins(0,25,0,0)
142       
143        if parent.layout() is not None:
144            parent.layout().addWidget(self)
145
146        self.navigate = OWGUI.widgetBox(self, 0, orientation = "vertical", margin=2)
147        self.select = OWGUI.widgetBox(self, "", orientation = "vertical")
148
149        self.graph = graph # save graph. used to send signals
150        self.widget = widget    # we set widget here so that it doesn't affect the value of self.widget.toolbarSelection
151
152        self.functions = [type(f) == int and self.builtinFunctions[f] or f for f in buttons]
153        for b, f in enumerate(self.functions):
154            if not f:
155                #self.layout().addSpacing(10)
156                pass
157            elif f[0] == "" or f[1] == "" or f[2] == "":
158                self.navigate.layout().addSpacing(10)
159            else:
160                button = createButton(self.navigate, f[0], lambda x=b: self.action(x), f[3], toggle = f[5])
161                setattr(self.navigate, f[1], button)
162                if f[1] == "buttonSendSelections":
163                    button.setEnabled(not autoSend)                   
164
165        if hasattr(self.widget, "toolbarSelection"):
166            self.action(self.widget.toolbarSelection)
167        else:
168            self.action(0)
169           
170    def action(self, b):
171        f = self.functions[b]
172        if not f:
173            return
174
175        if f[5]:
176            if hasattr(self.widget, "toolbarSelection"):
177                self.widget.toolbarSelection = b
178            for fi, ff in enumerate(self.functions):
179                if ff and ff[5]:
180                    #if ff[6] == "navigate":
181                    getattr(self.navigate, ff[1]).setChecked(fi == b)
182                    #if ff[6] == "select":
183                    #    getattr(self.select, ff[1]).setChecked(fi == b)
184               
185        try:
186            getattr(self.graph, f[2])()
187        except:
188            getattr(self.widget, f[2])()
189
190        cursor = f[4]
191        if not cursor is None:
192            self.graph.setCursor(cursor)
193
194
195
196    # for backward compatibility with a previous version of this class
197    def actionZooming(self): self.action(0)
198    def actionRectangleSelection(self): self.action(3)
199    def actionPolygonSelection(self): self.action(4)
200
Note: See TracBrowser for help on using the repository browser.