Ticket #3992: 0004-CursurInvoker-add-long-press-gesture-to-raise-Palett.patch

File 0004-CursurInvoker-add-long-press-gesture-to-raise-Palett.patch, 4.0 KB (added by erikos, 11 years ago)

CursorInvoker: add long-press

  • src/sugar3/graphics/palettewindow.py

    From d01e9c6d61ef43b4c4f92cf56030d460c2238a39 Mon Sep 17 00:00:00 2001
    From: olpc user <olpc@xo-6d-61-0c.localdomain>
    Date: Thu, 25 Oct 2012 09:42:00 +0000
    Subject: [PATCH 4/4] CursurInvoker: add long-press gesture to raise Palette
    
    This adds long-press gesture detection to the CursorInvoker
    used in the EventIcon. This will make this gesture available
    for the View icons for example.
    
    We need to keep a boolean around to detect when a lon-press
    event has happened and ignore the button-release event in
    that case.
    
    We add as well checks in the CursorInvoker and WidgetInvoker
    for the enter events if they are of type Gdk.CrossingMode.NORMAL,
    otherwise the Gdk.CrossingMode.TOUCH_BEGIN enter events that are detected
    when a touch starts are handled and interfer.
    ---
     src/sugar3/graphics/palettewindow.py | 23 +++++++++++++++++++++--
     1 file changed, 21 insertions(+), 2 deletions(-)
    
    diff --git a/src/sugar3/graphics/palettewindow.py b/src/sugar3/graphics/palettewindow.py
    index 5965441..0407bfc 100644
    a b from gi.repository import Gdk 
    2929from gi.repository import Gtk
    3030from gi.repository import GObject
    3131
     32from gi.repository import SugarGestures
    3233from sugar3.graphics import palettegroup
    3334from sugar3.graphics import animator
    3435from sugar3.graphics import style
    class WidgetInvoker(Invoker): 
    10621063                                 gap[0], gap[1], gap[1] + gap[2])
    10631064
    10641065    def __enter_notify_event_cb(self, widget, event):
    1065         self.notify_mouse_enter()
     1066        if event.mode == Gdk.CrossingMode.NORMAL:
     1067            self.notify_mouse_enter()
    10661068
    10671069    def __leave_notify_event_cb(self, widget, event):
    10681070        if event.mode == Gdk.CrossingMode.NORMAL:
    class CursorInvoker(Invoker): 
    11041106        self._leave_hid = None
    11051107        self._release_hid = None
    11061108        self._item = None
     1109        self._long_pressed_recognized = False
     1110        self._long_pressed_hid = None
     1111        self._long_pressed_controller = SugarGestures.LongPressController()
    11071112
    11081113        if parent:
    11091114            self.attach(parent)
    class CursorInvoker(Invoker): 
    11181123                                             self.__leave_notify_event_cb)
    11191124        self._release_hid = self._item.connect('button-release-event',
    11201125                                               self.__button_release_event_cb)
     1126        self._long_pressed_hid = self._long_pressed_controller.connect('pressed', \
     1127                self.__long_pressed_event_cb, self._item)
     1128        self._long_pressed_controller.attach(self._item, \
     1129                SugarGestures.EventControllerFlags.NONE)
    11211130
    11221131    def detach(self):
    11231132        Invoker.detach(self)
    11241133        self._item.disconnect(self._enter_hid)
    11251134        self._item.disconnect(self._leave_hid)
    11261135        self._item.disconnect(self._release_hid)
     1136        self._long_pressed_controller.detach(self._item)
     1137        self._long_pressed_controller.disconnect(self._long_pressed_hid)
    11271138
    11281139    def get_default_position(self):
    11291140        return self.AT_CURSOR
    class CursorInvoker(Invoker): 
    11381149        return rect
    11391150
    11401151    def __enter_notify_event_cb(self, button, event):
    1141         self.notify_mouse_enter()
     1152        if event.mode == Gdk.CrossingMode.NORMAL:
     1153            self.notify_mouse_enter()
    11421154        return False
    11431155
    11441156    def __leave_notify_event_cb(self, button, event):
    class CursorInvoker(Invoker): 
    11471159        return False
    11481160
    11491161    def __button_release_event_cb(self, button, event):
     1162        if self._long_pressed_recognized:
     1163            self._long_pressed_recognized = False
     1164            return True
    11501165        if event.button == 1:
    11511166            if self.props.toggle_palette:
    11521167                self.notify_toggle_state()
    class CursorInvoker(Invoker): 
    11561171        else:
    11571172            return False
    11581173
     1174    def __long_pressed_event_cb(self, controller, x, y, widget):
     1175        self._long_pressed_recognized = True
     1176        self.notify_right_click()
     1177
    11591178    def get_toplevel(self):
    11601179        return self._item.get_toplevel()
    11611180