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

Reply via email to