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 |
29 | 29 | from gi.repository import Gtk |
30 | 30 | from gi.repository import GObject |
31 | 31 | |
| 32 | from gi.repository import SugarGestures |
32 | 33 | from sugar3.graphics import palettegroup |
33 | 34 | from sugar3.graphics import animator |
34 | 35 | from sugar3.graphics import style |
… |
… |
class WidgetInvoker(Invoker): |
1062 | 1063 | gap[0], gap[1], gap[1] + gap[2]) |
1063 | 1064 | |
1064 | 1065 | 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() |
1066 | 1068 | |
1067 | 1069 | def __leave_notify_event_cb(self, widget, event): |
1068 | 1070 | if event.mode == Gdk.CrossingMode.NORMAL: |
… |
… |
class CursorInvoker(Invoker): |
1104 | 1106 | self._leave_hid = None |
1105 | 1107 | self._release_hid = None |
1106 | 1108 | self._item = None |
| 1109 | self._long_pressed_recognized = False |
| 1110 | self._long_pressed_hid = None |
| 1111 | self._long_pressed_controller = SugarGestures.LongPressController() |
1107 | 1112 | |
1108 | 1113 | if parent: |
1109 | 1114 | self.attach(parent) |
… |
… |
class CursorInvoker(Invoker): |
1118 | 1123 | self.__leave_notify_event_cb) |
1119 | 1124 | self._release_hid = self._item.connect('button-release-event', |
1120 | 1125 | 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) |
1121 | 1130 | |
1122 | 1131 | def detach(self): |
1123 | 1132 | Invoker.detach(self) |
1124 | 1133 | self._item.disconnect(self._enter_hid) |
1125 | 1134 | self._item.disconnect(self._leave_hid) |
1126 | 1135 | self._item.disconnect(self._release_hid) |
| 1136 | self._long_pressed_controller.detach(self._item) |
| 1137 | self._long_pressed_controller.disconnect(self._long_pressed_hid) |
1127 | 1138 | |
1128 | 1139 | def get_default_position(self): |
1129 | 1140 | return self.AT_CURSOR |
… |
… |
class CursorInvoker(Invoker): |
1138 | 1149 | return rect |
1139 | 1150 | |
1140 | 1151 | 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() |
1142 | 1154 | return False |
1143 | 1155 | |
1144 | 1156 | def __leave_notify_event_cb(self, button, event): |
… |
… |
class CursorInvoker(Invoker): |
1147 | 1159 | return False |
1148 | 1160 | |
1149 | 1161 | def __button_release_event_cb(self, button, event): |
| 1162 | if self._long_pressed_recognized: |
| 1163 | self._long_pressed_recognized = False |
| 1164 | return True |
1150 | 1165 | if event.button == 1: |
1151 | 1166 | if self.props.toggle_palette: |
1152 | 1167 | self.notify_toggle_state() |
… |
… |
class CursorInvoker(Invoker): |
1156 | 1171 | else: |
1157 | 1172 | return False |
1158 | 1173 | |
| 1174 | def __long_pressed_event_cb(self, controller, x, y, widget): |
| 1175 | self._long_pressed_recognized = True |
| 1176 | self.notify_right_click() |
| 1177 | |
1159 | 1178 | def get_toplevel(self): |
1160 | 1179 | return self._item.get_toplevel() |
1161 | 1180 | |