Ticket #1314: mouseout.patch

File mouseout.patch, 2.7 KB (added by erikos, 12 years ago)

addEventListener for 'mouseout' to popdown palette

  • palettes.py

    diff --git a/palettes.py b/palettes.py
    index d5a4eb9..8ab0b22 100644
    a b import urlparse 
    2121from gettext import gettext as _
    2222
    2323import gtk
     24import gobject
    2425import xpcom
    2526from xpcom import components
    2627from xpcom.components import interfaces
    from sugar.activity import activity 
    3334
    3435import downloadmanager
    3536
     37class MouseOutListener(gobject.GObject):
     38    _com_interfaces_ = interfaces.nsIDOMEventListener
     39
     40    __gsignals__ = {
     41        'mouse-out': (gobject.SIGNAL_RUN_FIRST,
     42                      gobject.TYPE_NONE,
     43                      ([]))
     44    }
     45
     46    def __init__(self, target):
     47        gobject.GObject.__init__(self)
     48        self._target = target
     49
     50    def handleEvent(self, event):
     51        self.emit('mouse-out')
     52
     53
    3654class ContentInvoker(Invoker):
    3755    _com_interfaces_ = interfaces.nsIDOMEventListener
    3856
    class ContentInvoker(Invoker): 
    4058        Invoker.__init__(self)
    4159        self._position_hint = self.AT_CURSOR
    4260        self._browser = browser
     61        self._mouseout_listener = None
     62        self._popdown_handler_id = None
    4363
    4464    def get_default_position(self):
    4565        return self.AT_CURSOR
    class ContentInvoker(Invoker): 
    5575            return
    5676
    5777        target = event.target
     78
    5879        if target.tagName.lower() == 'a':
    5980
    6081            if target.firstChild:
    class ContentInvoker(Invoker): 
    7798
    7899            self.palette = ImagePalette(title, target.src, target.ownerDocument)
    79100            self.notify_right_click()
     101        else:
     102            return
     103       
     104        if self._popdown_handler_id is not None:
     105            self._popdown_handler_id = self.palette.connect( \
     106                'popdown', self.__palette_popdown_cb)
     107
     108        self._mouseout_listener = MouseOutListener(target)
     109        wrapper = xpcom.server.WrapObject(self._mouseout_listener,
     110                                          interfaces.nsIDOMEventListener)
     111        target.addEventListener('mouseout', wrapper, False)
     112        self._mouseout_listener.connect('mouse-out', self.__moved_out_cb)
     113
     114    def __moved_out_cb(self, listener):
     115        self.palette.popdown()
     116
     117    def __palette_popdown_cb(self, palette):
     118        if self._mouseout_listener is not None:
     119            wrapper = xpcom.server.WrapObject(self._mouseout_listener,
     120                                              interfaces.nsIDOMEventListener)
     121            self._mouseout_listener._target.removeEventListener('mouseout',
     122                                                                wrapper, False)
     123            del self._mouseout_listener
     124
    80125
    81126class LinkPalette(Palette):
    82127    def __init__(self, browser, title, url, owner_document):