From b6c837134e51c1e799904fc86b40fe5302e9fd74 Mon Sep 17 00:00:00 2001 From: Simon Schampijer Date: Thu, 21 Oct 2010 16:44:25 +0000 Subject: add EventListener for 'mouseout' to popdown palette #10407 from SL #1314 --- (limited to 'palettes.py') diff --git a/palettes.py b/palettes.py index 1f3bfc2..d191b49 100644 --- a/palettes.py +++ b/palettes.py @@ -20,6 +20,7 @@ import urlparse from gettext import gettext as _ import gtk +import gobject import xpcom from xpcom import components from xpcom.components import interfaces @@ -32,6 +33,23 @@ from sugar.activity import activity import downloadmanager +class MouseOutListener(gobject.GObject): + _com_interfaces_ = interfaces.nsIDOMEventListener + + __gsignals__ = { + 'mouse-out': (gobject.SIGNAL_RUN_FIRST, + gobject.TYPE_NONE, + ([])) + } + + def __init__(self, target): + gobject.GObject.__init__(self) + self._target = target + + def handleEvent(self, event): + self.emit('mouse-out') + + class ContentInvoker(Invoker): _com_interfaces_ = interfaces.nsIDOMEventListener @@ -39,6 +57,8 @@ class ContentInvoker(Invoker): Invoker.__init__(self) self._position_hint = self.AT_CURSOR self._browser = browser + self._mouseout_listener = None + self._popdown_handler_id = None def get_default_position(self): return self.AT_CURSOR @@ -54,6 +74,7 @@ class ContentInvoker(Invoker): return target = event.target + if target.tagName.lower() == 'a': if target.firstChild: @@ -76,6 +97,30 @@ class ContentInvoker(Invoker): self.palette = ImagePalette(title, target.src, target.ownerDocument) self.notify_right_click() + else: + return + + if self._popdown_handler_id is not None: + self._popdown_handler_id = self.palette.connect( \ + 'popdown', self.__palette_popdown_cb) + + self._mouseout_listener = MouseOutListener(target) + wrapper = xpcom.server.WrapObject(self._mouseout_listener, + interfaces.nsIDOMEventListener) + target.addEventListener('mouseout', wrapper, False) + self._mouseout_listener.connect('mouse-out', self.__moved_out_cb) + + def __moved_out_cb(self, listener): + self.palette.popdown() + + def __palette_popdown_cb(self, palette): + if self._mouseout_listener is not None: + wrapper = xpcom.server.WrapObject(self._mouseout_listener, + interfaces.nsIDOMEventListener) + self._mouseout_listener._target.removeEventListener('mouseout', + wrapper, False) + del self._mouseout_listener + class LinkPalette(Palette): def __init__(self, browser, title, url, owner_document): -- cgit v0.9.1