No need to revert a choice from the user.
[pysize.git] / ui / gtk / pysize_widget_mouse.py
blob1372942b4f9c2a1f162b2c95ab7895f722c8f773
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, path):
21 self.connect('motion-notify-event', type(self)._motion_notify_event)
22 self.connect('button-press-event', type(self)._button_press_event)
23 self.connect('button-release-event', type(self)._button_release_event)
24 self.connect('building-tree-state-changed', type(self)._reset_mouse)
25 self.cursor_node = None
26 self.button_press_node = None
27 self.set_cursor_node(None)
29 def set_cursor_node(self, cursor_node):
30 self.cursor_node = cursor_node
31 self.emit('hover-changed', cursor_node)
33 def _reset_mouse(self, unused_tree):
34 self.set_cursor_node(None)
35 self.button_press_node = None
37 def _get_node_here(self, event):
38 point = _point(event.x, event.y)
39 for node in self.tree.root:
40 if node.contains_point(point):
41 return node
43 def _motion_notify_event(self, event):
44 point = _event_point(event)
45 prev_selection = new_selection = self.cursor_node
46 if not (self.cursor_node and self.cursor_node.contains_point(point)):
47 # The cursor is no more in the same node
48 mask = 0x00
49 for node in self.tree.root:
50 if node.contains_point(point) != (node == prev_selection):
51 if node == prev_selection:
52 new_selection = None
53 mask |= 0x1
54 else:
55 new_selection = node
56 mask |= 0x2
57 if mask == 0x3:
58 break
59 if prev_selection != new_selection:
60 self.set_cursor_node(new_selection)
61 self.queue_node_redraw(prev_selection)
62 self.queue_node_redraw(new_selection)
63 return True
65 def _handle_double_click(self, node):
66 if not (node and node.is_real()):
67 return False
68 self.path = node.get_fullpath()
69 self.schedule_new_tree()
71 def _button_press_event(self, event):
72 if event.button == 1:
73 node = self._get_node_here(event)
74 if event.type == gtk.gdk._2BUTTON_PRESS:
75 return self._handle_double_click(node)
76 if node != self.button_press_node:
77 self.queue_node_redraw(self.button_press_node)
78 self.queue_node_redraw(node)
79 self.button_press_node = node
80 return True
81 return False
83 def _button_release_event(self, event):
84 node = self._get_node_here(event)
85 if node == self.button_press_node:
86 if event.state & gtk.gdk.CONTROL_MASK:
87 if node in self.selected_nodes:
88 self.selected_nodes.remove(node)
89 else:
90 self.selected_nodes.append(node)
91 else:
92 for n in self.selected_nodes:
93 self.queue_node_redraw(n)
94 self.selected_nodes = [node]
95 self.queue_node_redraw(node)
96 else:
97 self.queue_node_redraw(self.button_press_node)
98 self.button_press_node = None
99 return True