From 7468faa840203399542c1b5085a8c744df4eb14f Mon Sep 17 00:00:00 2001 From: Marco Pesenti Gritti Date: Fri, 6 Jul 2007 14:36:59 +0200 Subject: [PATCH] Implement palette groups. Use them to not popdown frame when hover a palette. --- shell/view/clipboardmenu.py | 2 ++ shell/view/frame/ActivitiesBox.py | 7 ++++++- shell/view/frame/FriendsBox.py | 1 + shell/view/frame/frame.py | 17 +++++++++++++---- sugar/graphics/Makefile.am | 1 + sugar/graphics/palette.py | 31 +++++++++++++++++++++++++++++-- 6 files changed, 52 insertions(+), 7 deletions(-) diff --git a/shell/view/clipboardmenu.py b/shell/view/clipboardmenu.py index 9be8fb87..648442a6 100644 --- a/shell/view/clipboardmenu.py +++ b/shell/view/clipboardmenu.py @@ -44,6 +44,8 @@ class ClipboardMenu(Palette): self._percent = percent self._activity = activity + self.set_group_id('frame') + if percent < 100: self._progress_bar = gtk.ProgressBar() self._update_progress_bar() diff --git a/shell/view/frame/ActivitiesBox.py b/shell/view/frame/ActivitiesBox.py index 032a8bb2..034ccabd 100644 --- a/shell/view/frame/ActivitiesBox.py +++ b/shell/view/frame/ActivitiesBox.py @@ -18,6 +18,7 @@ import hippo import logging from sugar.graphics import units +from sugar.graphics.palette import Palette from sugar.graphics.xocolor import XoColor from sugar.graphics.iconbutton import IconButton from sugar import profile @@ -27,7 +28,11 @@ from model import bundleregistry class ActivityButton(IconButton): def __init__(self, activity): IconButton.__init__(self, icon_name=activity.get_icon()) - self.set_tooltip(activity.get_name()) + + palette = Palette(activity.get_name()) + palette.set_group_id('frame') + self.set_palette(palette) + self._activity = activity def get_bundle_id(self): diff --git a/shell/view/frame/FriendsBox.py b/shell/view/frame/FriendsBox.py index cde51f56..18b57d39 100644 --- a/shell/view/frame/FriendsBox.py +++ b/shell/view/frame/FriendsBox.py @@ -25,6 +25,7 @@ from model.BuddyModel import BuddyModel class FriendIcon(BuddyIcon): def __init__(self, shell, buddy): BuddyIcon.__init__(self, shell, buddy) + self.get_palette().set_group_id('frame') def prelight(self, enter): if enter: diff --git a/shell/view/frame/frame.py b/shell/view/frame/frame.py index 2b215767..3f3367b3 100644 --- a/shell/view/frame/frame.py +++ b/shell/view/frame/frame.py @@ -20,6 +20,11 @@ import gtk import gobject import hippo +from sugar.graphics import animator +from sugar.graphics import units +from sugar.graphics import palettegroup +from sugar.clipboard import clipboardservice + from view.frame.eventarea import EventArea from view.frame.ActivitiesBox import ActivitiesBox from view.frame.ZoomBox import ZoomBox @@ -28,9 +33,6 @@ from view.frame.FriendsBox import FriendsBox from view.frame.framewindow import FrameWindow from view.frame.clipboardpanelwindow import ClipboardPanelWindow from model.shellmodel import ShellModel -from sugar.graphics import animator -from sugar.graphics import units -from sugar.clipboard import clipboardservice MODE_NONE = 0 MODE_MOUSE = 1 @@ -126,6 +128,9 @@ class Frame(object): self.mode = MODE_NONE self.visible = False + self._palette_group = palettegroup.get_group('frame') + self._palette_group.connect('popdown', self._palette_group_popdown_cb) + self._left_panel = None self._right_panel = None self._top_panel = None @@ -309,10 +314,14 @@ class Frame(object): if not self._hover: return - if not self._is_hover(): + if not self._is_hover() and not self._palette_group.is_up(): self._hover = False self._mouse_listener.mouse_leave() + def _palette_group_popdown_cb(self, group): + if not self._is_hover(): + self._mouse_listener.mouse_leave() + def _drag_motion_cb(self, window, context, x, y, time): self._mouse_listener.mouse_enter() diff --git a/sugar/graphics/Makefile.am b/sugar/graphics/Makefile.am index d906569e..b68821b8 100644 --- a/sugar/graphics/Makefile.am +++ b/sugar/graphics/Makefile.am @@ -16,6 +16,7 @@ sugar_PYTHON = \ radiotoolbutton.py \ roundbox.py \ palette.py \ + palettegroup.py \ panel.py \ spreadlayout.py \ toggletoolbutton.py \ diff --git a/sugar/graphics/palette.py b/sugar/graphics/palette.py index 3a816d58..a22df744 100644 --- a/sugar/graphics/palette.py +++ b/sugar/graphics/palette.py @@ -1,4 +1,4 @@ -# Copyright (C) 2007, Eduardo Silva (edsiper@gmail.com) +# Copyright (C) 2007, Eduardo Silva # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -22,6 +22,7 @@ import gobject import time import hippo +from sugar.graphics import palettegroup from sugar.graphics import animator from sugar.graphics import units from sugar import _sugarext @@ -51,9 +52,18 @@ class Palette(gobject.GObject): 0, gobject.PARAM_READWRITE) } + __gsignals__ = { + 'popup' : (gobject.SIGNAL_RUN_FIRST, + gobject.TYPE_NONE, ([])), + 'popdown' : (gobject.SIGNAL_RUN_FIRST, + gobject.TYPE_NONE, ([])) + } + def __init__(self, label, accel_path=None): gobject.GObject.__init__(self) + self._group_id = None + self._up = False self._position = self.AUTOMATIC self._palette_popup_sid = None @@ -88,6 +98,9 @@ class Palette(gobject.GObject): self._menu.connect('button-press-event', self._button_press_event_cb) + def is_up(self): + return self._up + def set_primary_text(self, label, accel_path=None): self._primary.set_label(label, accel_path) @@ -119,7 +132,15 @@ class Palette(gobject.GObject): def append_button(self, button): self._button_bar.append_button(button) self._button_bar.show() - + + def set_group_id(self, group_id): + if self._group_id: + group = palettegroup.get_group(self._group_id) + group.remove(self) + if group_id: + group = palettegroup.get_group(group_id) + group.add(self) + def do_set_property(self, pspec, value): if pspec.name == 'invoker': self._invoker = value @@ -206,7 +227,10 @@ class Palette(gobject.GObject): self._palette_popup_sid = _palette_observer.connect('popup', self._palette_observer_popup_cb) self._menu.popup(x, y) + + self._up = True _palette_observer.emit('popup', self) + self.emit('popup') def _hide(self): if not self._palette_popup_sid is None: @@ -214,6 +238,9 @@ class Palette(gobject.GObject): self._palette_popup_sid = None self._menu.popdown() + self._up = False + self.emit('popdown') + def popup(self): self._popdown_anim.stop() self._popup_anim.start()