Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/sugar3/graphics/palettewindow.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/sugar3/graphics/palettewindow.py')
-rw-r--r--src/sugar3/graphics/palettewindow.py46
1 files changed, 45 insertions, 1 deletions
diff --git a/src/sugar3/graphics/palettewindow.py b/src/sugar3/graphics/palettewindow.py
index e1fde4a..0740358 100644
--- a/src/sugar3/graphics/palettewindow.py
+++ b/src/sugar3/graphics/palettewindow.py
@@ -152,6 +152,7 @@ class _PaletteMenuWidget(Gtk.Menu):
menu.connect('motion-notify-event', self._motion_notify_cb)
menu.connect('enter-notify-event', self._enter_notify_cb)
menu.connect('leave-notify-event', self._leave_notify_cb)
+ menu.connect('button-release-event', self._button_release_event_cb)
self._entered = False
self._mouse_in_palette = False
self._mouse_in_invoker = False
@@ -187,6 +188,9 @@ class _PaletteMenuWidget(Gtk.Menu):
def _enter_notify_cb(self, widget, event):
if event.mode in (Gdk.CrossingMode.GRAB, Gdk.CrossingMode.GTK_GRAB):
return False
+ if event.get_source_device().get_source() == \
+ Gdk.InputSource.TOUCHSCREEN:
+ return False
if Gtk.get_event_widget(event) not in self._menus:
return False
@@ -197,6 +201,9 @@ class _PaletteMenuWidget(Gtk.Menu):
def _leave_notify_cb(self, widget, event):
if event.mode in (Gdk.CrossingMode.GRAB, Gdk.CrossingMode.GTK_GRAB):
return False
+ if event.get_source_device().get_source() == \
+ Gdk.InputSource.TOUCHSCREEN:
+ return False
if Gtk.get_event_widget(event) not in self._menus:
return False
@@ -205,6 +212,9 @@ class _PaletteMenuWidget(Gtk.Menu):
return False
def _motion_notify_cb(self, widget, event):
+ if event.get_source_device().get_source() == \
+ Gdk.InputSource.TOUCHSCREEN:
+ return False
x = event.x_root
y = event.y_root
@@ -219,6 +229,20 @@ class _PaletteMenuWidget(Gtk.Menu):
self._mouse_in_invoker = in_invoker
self._reevaluate_state()
+ def _button_release_event_cb(self, widget, event):
+ x = event.x_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) \
+ and y >= rect.y and y < (rect.y + rect.height)
+
+ if in_invoker:
+ return True
+
def _reevaluate_state(self):
if self._entered:
# If we previously advised that the mouse was inside, but now the
@@ -1251,8 +1275,11 @@ class CellRendererInvoker(Invoker):
self._motion_hid = None
self._leave_hid = None
self._release_hid = None
+ self._long_pressed_hid = None
self.path = None
+ self._long_pressed_controller = SugarGestures.LongPressController()
+
def attach_cell_renderer(self, tree_view, cell_renderer):
self._tree_view = tree_view
self._cell_renderer = cell_renderer
@@ -1263,7 +1290,10 @@ class CellRendererInvoker(Invoker):
self.__leave_notify_event_cb)
self._release_hid = tree_view.connect('button-release-event',
self.__button_release_event_cb)
-
+ self._long_pressed_hid = self._long_pressed_controller.connect( \
+ 'pressed', self.__long_pressed_event_cb, tree_view)
+ self._long_pressed_controller.attach(tree_view,
+ SugarGestures.EventControllerFlags.NONE)
Invoker.attach(self, cell_renderer)
def detach(self):
@@ -1271,6 +1301,8 @@ class CellRendererInvoker(Invoker):
self._tree_view.disconnect(self._motion_hid)
self._tree_view.disconnect(self._leave_hid)
self._tree_view.disconnect(self._release_hid)
+ self._long_pressed_controller.detach(self._tree_view)
+ self._long_pressed_controller.disconnect(self._long_pressed_hid)
def get_rect(self):
allocation = self._tree_view.get_allocation()
@@ -1310,11 +1342,18 @@ class CellRendererInvoker(Invoker):
self.palette = None
self.path = path
+ if event.get_source_device().get_source() == \
+ Gdk.InputSource.TOUCHSCREEN:
+ return False
self.notify_mouse_enter()
else:
if self.path is not None:
self._redraw_path(self.path)
self.path = None
+
+ if event.get_source_device().get_source() == \
+ Gdk.InputSource.TOUCHSCREEN:
+ return False
self.notify_mouse_leave()
def _redraw_path(self, path):
@@ -1349,6 +1388,11 @@ class CellRendererInvoker(Invoker):
else:
return False
+ def __long_pressed_event_cb(self, controller, x, y, widget):
+ if self.point_in_cell_renderer(x, y):
+ controller.reset()
+ self.notify_right_click()
+
def point_in_cell_renderer(self, event_x, event_y):
pos = self._tree_view.get_path_at_pos(int(event_x), int(event_y))
if pos is None: