From 5d2c5b98fff34eed18f7aede574fe2eeea8cd664 Mon Sep 17 00:00:00 2001 From: Aleksey Lim Date: Mon, 13 Jul 2009 02:58:49 +0000 Subject: [PATCH] Do not hide sub-widget when sub-palette was opened --- examples/toolbar.py | 13 ++++++++++++ src/sugar/graphics/toolbar.py | 37 +++++++++++++++++++++++++++-------- 2 files changed, 42 insertions(+), 8 deletions(-) diff --git a/examples/toolbar.py b/examples/toolbar.py index ad07f370..66c09f09 100644 --- a/examples/toolbar.py +++ b/examples/toolbar.py @@ -1,5 +1,6 @@ import gtk +from sugar.graphics.toolbutton import ToolButton from sugar.graphics.toolbar import Toolbar, ToolbarButton from sugar.graphics import style @@ -33,5 +34,17 @@ tollbarbutton_3 = ToolbarButton( icon_name='activity-journal') toolbar.top.insert(tollbarbutton_3, -1) +subbar = gtk.Toolbar() +subbutton = ToolButton( + icon_name='document-send', + tooltip='document-send') +subbar.insert(subbutton, -1) +subbar.show_all() + +tollbarbutton_4 = ToolbarButton( + page=subbar, + icon_name='document-save') +toolbar.top.insert(tollbarbutton_4, -1) + window.show_all() gtk.main() diff --git a/src/sugar/graphics/toolbar.py b/src/sugar/graphics/toolbar.py index 131bd9d7..c675bf92 100644 --- a/src/sugar/graphics/toolbar.py +++ b/src/sugar/graphics/toolbar.py @@ -23,6 +23,7 @@ from sugar.graphics.toolbutton import ToolButton from sugar.graphics.palette import _PopupAnimation, _PopdownAnimation from sugar.graphics.palette import MouseSpeedDetector, Invoker from sugar.graphics import animator +from sugar.graphics import palettegroup class ToolbarButton(ToolButton): def __init__(self, **kwargs): @@ -213,6 +214,7 @@ class _Palette(gtk.Window): self._invoker = None self._up = False self._invoker_hids = [] + self.__focus = 0 self._popup_anim = animator.Animator(.5, 10) self._popup_anim.add(_PopupAnimation(self)) @@ -233,6 +235,9 @@ class _Palette(gtk.Window): self._mouse_detector = MouseSpeedDetector(self, 200, 5) self._mouse_detector.connect('motion-slow', self._mouse_slow_cb) + group = palettegroup.get_group('default') + group.connect('popdown', self.__group_popdown_cb) + def is_up(self): return self._up @@ -255,11 +260,11 @@ class _Palette(gtk.Window): self._invoker = invoker if invoker is not None: self._invoker_hids.append(self._invoker.connect( - 'mouse-enter', self._invoker_mouse_enter_cb)) + 'mouse-enter', self.__invoker_mouse_enter_cb)) self._invoker_hids.append(self._invoker.connect( - 'mouse-leave', self._invoker_mouse_leave_cb)) + 'mouse-leave', self.__invoker_mouse_leave_cb)) self._invoker_hids.append(self._invoker.connect( - 'right-click', self._invoker_right_click_cb)) + 'right-click', self.__invoker_right_click_cb)) def get_invoker(self): return self._invoker @@ -321,25 +326,41 @@ class _Palette(gtk.Window): self.popup(immediate=False) - def _invoker_mouse_enter_cb(self, invoker): + def __handle_focus(self, delta): + self.__focus += delta + if self.__focus not in (0, 1): + logging.error('_Palette.__focus=%s not in (0, 1)' % self.__focus) + + if self.__focus == 0: + group = palettegroup.get_group('default') + if not group.is_up(): + self.popdown() + + def __group_popdown_cb(self, group): + if self.__focus == 0: + self.popdown(immediate=True) + + def __invoker_mouse_enter_cb(self, invoker): self._mouse_detector.start() + self.__handle_focus(+1) - def _invoker_mouse_leave_cb(self, invoker): + def __invoker_mouse_leave_cb(self, invoker): self._mouse_detector.stop() - self.popdown() + self.__handle_focus(-1) - def _invoker_right_click_cb(self, invoker): + def __invoker_right_click_cb(self, invoker): self.popup(immediate=True) def __enter_notify_event_cb(self, widget, event): if event.detail != gtk.gdk.NOTIFY_INFERIOR and \ event.mode == gtk.gdk.CROSSING_NORMAL: self._popdown_anim.stop() + self.__handle_focus(+1) def __leave_notify_event_cb(self, widget, event): if event.detail != gtk.gdk.NOTIFY_INFERIOR and \ event.mode == gtk.gdk.CROSSING_NORMAL: - self.popdown() + self.__handle_focus(-1) def __show_cb(self, widget): self._invoker.notify_popup()