GtkMenu: use point_in_cell_renderer for CellRendereInvoker to check if a point is in, part of SL #3921

We use get_rect to check if the mouse is still over the invoker
in order to know when to popdown the Palette. The CellRendererInvoker
did return the allocation of the TreeView so far.

We already have a point_in_cell_renderer method in the
CellRendererInvoker so we can use this to check if the mouse pointer
is over the cell or not. The method point_in_cell_renderer is made
public to make it clearer that it can be used from the outside.

Signed-off-by: Simon Schampijer <simon@laptop.org>
Acked-by: Manuel Quiñones <manuq@laptop.org>
This commit is contained in:
Simon Schampijer 2012-10-30 09:30:31 +01:00
parent 2a76b10ce0
commit 8af0d49591

View File

@ -205,11 +205,16 @@ class _PaletteMenuWidget(Gtk.Menu):
return False return False
def _motion_notify_cb(self, widget, event): def _motion_notify_cb(self, widget, event):
rect = self._invoker.get_rect()
x = event.x_root x = event.x_root
y = event.y_root y = event.y_root
if type(self._invoker) is CellRendererInvoker:
in_invoker = self._invoker.point_in_cell_renderer(x, y)
else:
rect = self._invoker.get_rect()
in_invoker = x >= rect.x and x < (rect.x + rect.width) \ in_invoker = x >= rect.x and x < (rect.x + rect.width) \
and y >= rect.y and y < (rect.y + rect.height) and y >= rect.y and y < (rect.y + rect.height)
if in_invoker != self._mouse_in_invoker: if in_invoker != self._mouse_in_invoker:
self._mouse_in_invoker = in_invoker self._mouse_in_invoker = in_invoker
self._reevaluate_state() self._reevaluate_state()
@ -1256,7 +1261,7 @@ class CellRendererInvoker(Invoker):
def __motion_notify_event_cb(self, widget, event): def __motion_notify_event_cb(self, widget, event):
if event.window != widget.get_bin_window(): if event.window != widget.get_bin_window():
return return
if self._point_in_cell_renderer(event.x, event.y): if self.point_in_cell_renderer(event.x, event.y):
tree_view = self._tree_view tree_view = self._tree_view
path, column_, x_, y_ = tree_view.get_path_at_pos(int(event.x), path, column_, x_, y_ = tree_view.get_path_at_pos(int(event.x),
@ -1295,7 +1300,7 @@ class CellRendererInvoker(Invoker):
return False return False
def __button_release_event_cb(self, widget, event): def __button_release_event_cb(self, widget, event):
if event.button == 1 and self._point_in_cell_renderer(event.x, if event.button == 1 and self.point_in_cell_renderer(event.x,
event.y): event.y):
tree_view = self._tree_view tree_view = self._tree_view
path, column_, x_, y_ = tree_view.get_path_at_pos(int(event.x), path, column_, x_, y_ = tree_view.get_path_at_pos(int(event.x),
@ -1303,14 +1308,14 @@ class CellRendererInvoker(Invoker):
self._cell_renderer.emit('clicked', path) self._cell_renderer.emit('clicked', path)
# So the treeview receives it and knows a drag isn't going on # So the treeview receives it and knows a drag isn't going on
return False return False
if event.button == 3 and self._point_in_cell_renderer(event.x, if event.button == 3 and self.point_in_cell_renderer(event.x,
event.y): event.y):
self.notify_right_click() self.notify_right_click()
return True return True
else: else:
return False return False
def _point_in_cell_renderer(self, event_x, event_y): def point_in_cell_renderer(self, event_x, event_y):
pos = self._tree_view.get_path_at_pos(int(event_x), int(event_y)) pos = self._tree_view.get_path_at_pos(int(event_x), int(event_y))
if pos is None: if pos is None:
return False return False