Let the main class inherit from gtk.DrawingArea.
[pysize.git] / ui / gtk / pysize_widget_mouse.py
blobc067e72953c7ebac9e159d5016e33069da25b74a
1 import pygtk
2 pygtk.require('2.0')
3 import gtk
4 assert gtk.pygtk_version >= (2, 8)
6 class _point:
7 def __init__(self, x, y):
8 self.x = x
9 self.y = y
11 def _event_point(event):
12 if event.is_hint:
13 x, y, state = event.window.get_pointer()
14 point = _point(x, y)
15 else:
16 point = _point(event.x, event.y)
17 return point
19 class PysizeWidget_Mouse(object):
20 def __init__(self, options, args):
21 self.connect('motion-notify-event', self._motion_notify_event)
22 self.connect('button-press-event', self._button_press_event)
23 self.connect('button-release-event', self._button_release_event)
24 self.cursor_node = None
25 self.button_press_node = None
26 self._set_cursor_node(None)
28 def _set_cursor_node(self, cursor_node):
29 self.cursor_node = cursor_node
30 self.emit('hover-changed', cursor_node)
32 def _get_node_here(self, event):
33 point = _point(event.x, event.y)
34 for node in self.tree.root:
35 if node.contains_point(point):
36 return node
38 def _motion_notify_event(self, widget, event):
39 point = _event_point(event)
40 prev_selection = new_selection = self.cursor_node
41 if not (self.cursor_node and self.cursor_node.contains_point(point)):
42 # The cursor is no more in the same node
43 mask = 0x00
44 for node in self.tree.root:
45 if node.contains_point(point) != (node == prev_selection):
46 if node == prev_selection:
47 new_selection = None
48 mask |= 0x1
49 else:
50 new_selection = node
51 mask |= 0x2
52 if mask == 0x3:
53 break
54 if prev_selection != new_selection:
55 self._set_cursor_node(new_selection)
56 self._queue_node_redraw(prev_selection)
57 self._queue_node_redraw(new_selection)
59 def _button_press_event(self, widget, event):
60 node = self._get_node_here(event)
61 if node != self.button_press_node:
62 self._queue_node_redraw(self.button_press_node)
63 self._queue_node_redraw(node)
64 self.button_press_node = node
66 def _button_release_event(self, widget, event):
67 node = self._get_node_here(event)
68 if node == self.button_press_node:
69 if event.state & gtk.gdk.CONTROL_MASK:
70 if node in self.selected_nodes:
71 self.selected_nodes.remove(node)
72 else:
73 self.selected_nodes.append(node)
74 else:
75 for n in self.selected_nodes:
76 self._queue_node_redraw(n)
77 self.selected_nodes = [node]
78 self._queue_node_redraw(node)
79 else:
80 self._queue_node_redraw(self.button_press_node)
81 self.button_press_node = None