Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/sugar/graphics/palette.py
diff options
context:
space:
mode:
authorTomeu Vizoso <tomeu@tomeuvizoso.net>2007-07-09 12:26:41 (GMT)
committer Tomeu Vizoso <tomeu@tomeuvizoso.net>2007-07-09 12:26:41 (GMT)
commita4f4d969fea4787aaecf8cafd1095a412d01a432 (patch)
treed99d99c7f3e2cc50724866819b1e7dcf3b68bb7a /sugar/graphics/palette.py
parent8b72656ca429cd43f26b9c5edc2479a756914149 (diff)
Popdown when the toplevel of the parent item loses focus.
Diffstat (limited to 'sugar/graphics/palette.py')
-rw-r--r--sugar/graphics/palette.py55
1 files changed, 36 insertions, 19 deletions
diff --git a/sugar/graphics/palette.py b/sugar/graphics/palette.py
index c241def..b15f473 100644
--- a/sugar/graphics/palette.py
+++ b/sugar/graphics/palette.py
@@ -146,7 +146,9 @@ class Palette(gobject.GObject):
def do_set_property(self, pspec, value):
if pspec.name == 'invoker':
self._invoker = value
- self._invoker.add_listener(self)
+ self._invoker.connect('mouse-enter', self._invoker_mouse_enter_cb)
+ self._invoker.connect('mouse-leave', self._invoker_mouse_leave_cb)
+ self._invoker.connect('focus-out', self._invoker_focus_out_cb)
elif pspec.name == 'position':
self._position = value
else:
@@ -237,6 +239,8 @@ class Palette(gobject.GObject):
if not self._in_screen(x, y):
x, y = self._get_position(_TOP_RIGHT)
+ self._invoker.connect_to_parent()
+
self._palette_popup_sid = _palette_observer.connect('popup',
self._palette_observer_popup_cb)
self._menu.popup(x, y)
@@ -268,12 +272,15 @@ class Palette(gobject.GObject):
else:
self._hide()
- def invoker_mouse_enter(self):
+ def _invoker_mouse_enter_cb(self, invoker):
self.popup()
- def invoker_mouse_leave(self):
+ def _invoker_mouse_leave_cb(self, invoker):
self.popdown()
+ def _invoker_focus_out_cb(self, invoker):
+ self._hide()
+
def _enter_notify_event_cb(self, widget, event):
if event.detail == gtk.gdk.NOTIFY_NONLINEAR:
self._popdown_anim.stop()
@@ -382,26 +389,30 @@ class _PopdownAnimation(animator.Animation):
if current == 1.0:
self._palette._hide()
-class Invoker(object):
- def __init__(self):
- self._listeners = []
-
- def add_listener(self, listener):
- self._listeners.append(listener)
+class Invoker(gobject.GObject):
+ __gtype_name__ = 'SugarPaletteInvoker'
- def notify_mouse_enter(self):
- for listener in self._listeners:
- listener.invoker_mouse_enter()
+ __gsignals__ = {
+ 'mouse-enter': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([])),
+ 'mouse-leave': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([])),
+ 'focus-out': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([]))
+ }
- def notify_mouse_leave(self):
- for listener in self._listeners:
- listener.invoker_mouse_leave()
+ def __init__(self):
+ gobject.GObject.__init__(self)
def get_screen_area(self):
width = gtk.gdk.screen_width()
height = gtk.gdk.screen_height()
return gtk.gdk.Rectangle(0, 0, width, height)
+ def connect_to_parent(self):
+ window = self.get_toplevel()
+ window.connect('focus-out-event', self._window_focus_out_event_cb)
+
+ def _window_focus_out_event_cb(self, widget, event):
+ self.emit('focus-out')
+
class WidgetInvoker(Invoker):
def __init__(self, widget):
Invoker.__init__(self)
@@ -422,10 +433,13 @@ class WidgetInvoker(Invoker):
return gtk.gdk.Rectangle(x, y, width, height)
def _enter_notify_event_cb(self, widget, event):
- self.notify_mouse_enter()
+ self.emit('mouse-enter')
def _leave_notify_event_cb(self, widget, event):
- self.notify_mouse_leave()
+ self.emit('mouse-leave')
+
+ def get_toplevel(self):
+ return self._widget.get_toplevel()
class CanvasInvoker(Invoker):
def __init__(self, item):
@@ -446,12 +460,15 @@ class CanvasInvoker(Invoker):
def _motion_notify_event_cb(self, button, event):
if event.detail == hippo.MOTION_DETAIL_ENTER:
- self.notify_mouse_enter()
+ self.emit('mouse-enter')
elif event.detail == hippo.MOTION_DETAIL_LEAVE:
- self.notify_mouse_leave()
+ self.emit('mouse-leave')
return False
+ def get_toplevel(self):
+ return hippo.get_canvas_for_item(self._item).get_toplevel()
+
class _PaletteObserver(gobject.GObject):
__gtype_name__ = 'SugarPaletteObserver'