From e62b3ae80c3a650d705e8ee3db86c7f3cf75e80f Mon Sep 17 00:00:00 2001
From: Simon Schampijer <simon@laptop.org>
Date: Tue, 30 Oct 2012 09:30:31 +0100
Subject: [PATCH toolkit-gtk3] 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>
---
src/sugar3/graphics/palettewindow.py | 19 ++++++++++++-------
1 file changed, 12 insertions(+), 7 deletions(-)
diff --git a/src/sugar3/graphics/palettewindow.py b/src/sugar3/graphics/palettewindow.py
index 0407bfc..6e33efe 100644
a
|
b
|
class _PaletteMenuWidget(Gtk.Menu): |
205 | 205 | return False |
206 | 206 | |
207 | 207 | def _motion_notify_cb(self, widget, event): |
208 | | rect = self._invoker.get_rect() |
209 | 208 | x = event.x_root |
210 | 209 | y = event.y_root |
211 | | in_invoker = x >= rect.x and x < (rect.x + rect.width) \ |
212 | | and y >= rect.y and y < (rect.y + rect.height) |
| 210 | |
| 211 | if type(self._invoker) is CellRendererInvoker: |
| 212 | in_invoker = self._invoker.point_in_cell_renderer(x, y) |
| 213 | else: |
| 214 | rect = self._invoker.get_rect() |
| 215 | in_invoker = x >= rect.x and x < (rect.x + rect.width) \ |
| 216 | and y >= rect.y and y < (rect.y + rect.height) |
| 217 | |
213 | 218 | if in_invoker != self._mouse_in_invoker: |
214 | 219 | self._mouse_in_invoker = in_invoker |
215 | 220 | self._reevaluate_state() |
… |
… |
class CellRendererInvoker(Invoker): |
1256 | 1261 | def __motion_notify_event_cb(self, widget, event): |
1257 | 1262 | if event.window != widget.get_bin_window(): |
1258 | 1263 | return |
1259 | | if self._point_in_cell_renderer(event.x, event.y): |
| 1264 | if self.point_in_cell_renderer(event.x, event.y): |
1260 | 1265 | |
1261 | 1266 | tree_view = self._tree_view |
1262 | 1267 | path, column_, x_, y_ = tree_view.get_path_at_pos(int(event.x), |
… |
… |
class CellRendererInvoker(Invoker): |
1295 | 1300 | return False |
1296 | 1301 | |
1297 | 1302 | def __button_release_event_cb(self, widget, event): |
1298 | | if event.button == 1 and self._point_in_cell_renderer(event.x, |
| 1303 | if event.button == 1 and self.point_in_cell_renderer(event.x, |
1299 | 1304 | event.y): |
1300 | 1305 | tree_view = self._tree_view |
1301 | 1306 | path, column_, x_, y_ = tree_view.get_path_at_pos(int(event.x), |
… |
… |
class CellRendererInvoker(Invoker): |
1303 | 1308 | self._cell_renderer.emit('clicked', path) |
1304 | 1309 | # So the treeview receives it and knows a drag isn't going on |
1305 | 1310 | return False |
1306 | | if event.button == 3 and self._point_in_cell_renderer(event.x, |
| 1311 | if event.button == 3 and self.point_in_cell_renderer(event.x, |
1307 | 1312 | event.y): |
1308 | 1313 | self.notify_right_click() |
1309 | 1314 | return True |
1310 | 1315 | else: |
1311 | 1316 | return False |
1312 | 1317 | |
1313 | | def _point_in_cell_renderer(self, event_x, event_y): |
| 1318 | def point_in_cell_renderer(self, event_x, event_y): |
1314 | 1319 | pos = self._tree_view.get_path_at_pos(int(event_x), int(event_y)) |
1315 | 1320 | if pos is None: |
1316 | 1321 | return False |