This does the first half of the work, revealing the palette
immediately upon right click. It doesn't handle the dismissal
correctly. (It can be dismissed on roll-out, rather than explicitly.
I wonder if it matters...) Anyway, my only real question about the
patch is whether there is a meaningful constant for the right mouse
button; I couldn't find one, but checking with '== 3' feels unclean.
- Eben
From be529d5719e77570ec20d69f7edfbb2784f5566c Mon Sep 17 00:00:00 2001
From: Eben Eliason <[EMAIL PROTECTED]>
Date: Fri, 23 May 2008 16:38:18 -0400
Subject: [PATCH] Reveal palettes on right-click
This immediately reveals the full palette for an
object when it is right clicked. A future change should
be made to require explicit dismissal (option chosen,
click outside, escape) when one is explicitly invoked.
---
sugar/graphics/palette.py | 46 +++++++++++++++++++++++++++++++++-----------
1 files changed, 34 insertions(+), 12 deletions(-)
diff --git a/sugar/graphics/palette.py b/sugar/graphics/palette.py
index 61c94b7..9efcccc 100644
--- a/sugar/graphics/palette.py
+++ b/sugar/graphics/palette.py
@@ -210,10 +210,10 @@ class Palette(gtk.Window):
self._menu_content_separator = gtk.HSeparator()
- self._popup_anim = animator.Animator(0.3, 10)
+ self._popup_anim = animator.Animator(.5, 10)
self._popup_anim.add(_PopupAnimation(self))
- self._secondary_anim = animator.Animator(1.0, 10)
+ self._secondary_anim = animator.Animator(2.0, 10)
self._secondary_anim.add(_SecondaryAnimation(self))
self._popdown_anim = animator.Animator(0.6, 10)
@@ -311,6 +311,7 @@ class Palette(gtk.Window):
if self._invoker is not None:
self._invoker.disconnect(self._enter_invoker_hid)
self._invoker.disconnect(self._leave_invoker_hid)
+ self._invoker.disconnect(self._right_click_invoker_hid)
self._invoker = invoker
if invoker is not None:
@@ -318,6 +319,8 @@ class Palette(gtk.Window):
'mouse-enter', self._invoker_mouse_enter_cb)
self._leave_invoker_hid = self._invoker.connect(
'mouse-leave', self._invoker_mouse_leave_cb)
+ self._right_click_invoker_hid = self._invoker.connect(
+ 'right-click', self._invoker_right_click_cb)
if hasattr(invoker.props, 'widget'):
self._label.props.accel_widget = invoker.props.widget
@@ -584,9 +587,6 @@ class Palette(gtk.Window):
self.palette_state = state
- def _invoker_mouse_enter_cb(self, invoker):
- self._mouse_detector.start()
-
def _mouse_slow_cb(self, widget):
self._mouse_detector.stop()
self._palette_do_popup()
@@ -608,10 +608,20 @@ class Palette(gtk.Window):
self.popup(immediate=immediate)
+ def _invoker_mouse_enter_cb(self, invoker):
+ self._mouse_detector.start()
+
def _invoker_mouse_leave_cb(self, invoker):
self._mouse_detector.stop()
self.popdown()
+ def _invoker_right_click_cb(self, invoker):
+ self._popup_anim.stop()
+ self._secondary_anim.stop()
+ self._popdown_anim.stop()
+ self._set_state(self.SECONDARY)
+ self._show()
+
def _enter_notify_event_cb(self, widget, event):
if event.detail != gtk.gdk.NOTIFY_INFERIOR:
self._popdown_anim.stop()
@@ -704,6 +714,7 @@ class Invoker(gobject.GObject):
__gsignals__ = {
'mouse-enter': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([])),
'mouse-leave': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([])),
+ 'right-click': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([])),
'focus-out': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([]))
}
@@ -871,8 +882,9 @@ class WidgetInvoker(Invoker):
Invoker.__init__(self)
self._widget = widget
- widget.connect('enter-notify-event', self._enter_notify_event_cb)
- widget.connect('leave-notify-event', self._leave_notify_event_cb)
+ widget.connect('enter-notify-event', self.__enter_notify_event_cb)
+ widget.connect('leave-notify-event', self.__leave_notify_event_cb)
+ widget.connect('button-release-event', self.__button_release_event_cb)
def get_rect(self):
allocation = self._widget.get_allocation()
@@ -917,12 +929,16 @@ class WidgetInvoker(Invoker):
self._widget.allocation.width,
self._widget.allocation.height)
- def _enter_notify_event_cb(self, widget, event):
+ def __enter_notify_event_cb(self, widget, event):
self.emit('mouse-enter')
- def _leave_notify_event_cb(self, widget, event):
+ def __leave_notify_event_cb(self, widget, event):
self.emit('mouse-leave')
+ def __button_release_event_cb(self, widget, event):
+ if event.button == 3:
+ self.emit('right-click')
+
def get_toplevel(self):
return self._widget.get_toplevel()
@@ -945,8 +961,8 @@ class CanvasInvoker(Invoker):
self._item = item
self._position_hint = self.AT_CURSOR
- item.connect('motion-notify-event',
- self._motion_notify_event_cb)
+ item.connect('motion-notify-event', self.__motion_notify_event_cb)
+ item.connect('button-release-event', self.__button_release_event_cb)
def get_default_position(self):
return self.AT_CURSOR
@@ -960,7 +976,7 @@ class CanvasInvoker(Invoker):
else:
return gtk.gdk.Rectangle()
- def _motion_notify_event_cb(self, button, event):
+ def __motion_notify_event_cb(self, button, event):
if event.detail == hippo.MOTION_DETAIL_ENTER:
context = self._item.get_context()
self.emit('mouse-enter')
@@ -969,6 +985,12 @@ class CanvasInvoker(Invoker):
return False
+ def __button_release_event_cb(self, button, event):
+ if event.button == 3:
+ self.emit('right-click')
+
+ return False
+
def get_toplevel(self):
return hippo.get_canvas_for_item(self._item).get_toplevel()
--
1.5.3.3
_______________________________________________
Sugar mailing list
[email protected]
http://lists.laptop.org/listinfo/sugar