diff --git a/shell/view/clipboardicon.py b/shell/view/clipboardicon.py index f0c609b8..48e8bebb 100644 --- a/shell/view/clipboardicon.py +++ b/shell/view/clipboardicon.py @@ -1,16 +1,17 @@ import logging -from sugar.graphics.menuicon import MenuIcon +from sugar.graphics.canvasicon import CanvasIcon from view.clipboardmenu import ClipboardMenu from sugar.graphics.iconcolor import IconColor from sugar.activity import activityfactory from sugar.clipboard import clipboardservice from sugar import util -class ClipboardIcon(MenuIcon): +class ClipboardIcon(CanvasIcon): - def __init__(self, menu_shell, object_id, name): - MenuIcon.__init__(self, menu_shell) + def __init__(self, popup_context, object_id, name): + CanvasIcon.__init__(self) + self._popup_context = popup_context self._object_id = object_id self._name = name self._percent = 0 @@ -19,12 +20,15 @@ class ClipboardIcon(MenuIcon): self.connect('activated', self._icon_activated_cb) self._menu = None - def create_menu(self): + def get_popup(self): self._menu = ClipboardMenu(self._name, self._percent, self._preview, self._activity) self._menu.connect('action', self._popup_action_cb) return self._menu + def get_popup_context(self): + return self._popup_context + def set_state(self, name, percent, icon_name, preview, activity): self._name = name self._percent = percent @@ -60,8 +64,8 @@ class ClipboardIcon(MenuIcon): def _icon_activated_cb(self, icon): self._open_file() - def _popup_action_cb(self, popup, action): - self.popdown() + def _popup_action_cb(self, popup, menu_item): + action = menu_item.props.action_id if action == ClipboardMenu.ACTION_STOP_DOWNLOAD: raise "Stopping downloads still not implemented." diff --git a/shell/view/clipboardmenu.py b/shell/view/clipboardmenu.py index 77e50387..1ea53616 100644 --- a/shell/view/clipboardmenu.py +++ b/shell/view/clipboardmenu.py @@ -1,16 +1,23 @@ +from gettext import gettext as _ + import hippo -from sugar.graphics.menu import Menu +from sugar.graphics.menu import Menu, MenuItem from sugar.graphics.canvasicon import CanvasIcon from sugar.graphics.ClipboardBubble import ClipboardBubble +from sugar.graphics import color +from sugar.graphics import font -class ClipboardMenuItem(ClipboardBubble): +class ClipboardProgressBar(ClipboardBubble): def __init__(self, percent = 0): self._text_item = None ClipboardBubble.__init__(self, percent=percent) self._text_item = hippo.CanvasText(text=str(percent) + ' %') + self._text_item.props.color = color.LABEL_TEXT.get_int() + self._text_item.props.font_desc = font.DEFAULT.get_pango_desc() + self.append(self._text_item) def do_set_property(self, pspec, value): @@ -30,57 +37,69 @@ class ClipboardMenu(Menu): Menu.__init__(self, name) if percent < 100: - self._progress_bar = ClipboardMenuItem(percent) - self._root.append(self._progress_bar) + self._progress_bar = ClipboardProgressBar(percent) + self.append(self._progress_bar) else: self._progress_bar = None - self._remove_icon = None - self._open_icon = None - self._stop_icon = None - - self.add_item(preview, wrap=True) + self._remove_item = None + self._open_item = None + self._stop_item = None + + if preview: + self._preview_text = hippo.CanvasText(text=preview, + size_mode=hippo.CANVAS_SIZE_WRAP_WORD) + self._preview_text.props.color = color.LABEL_TEXT.get_int() + self._preview_text.props.font_desc = font.DEFAULT.get_pango_desc() + self.append(self._preview_text) self._update_icons(percent, activity) def _update_icons(self, percent, activity): - if percent == 100 and activity: - if not self._remove_icon: - self._remove_icon = CanvasIcon(icon_name='theme:stock-remove') - self.add_action(self._remove_icon, ClipboardMenu.ACTION_DELETE) + if not self._remove_item: + self._remove_item = MenuItem(ClipboardMenu.ACTION_DELETE, + _('Remove'), + 'theme:stock-remove') + self.add_item(self._remove_item) - if not self._open_icon: - self._open_icon = CanvasIcon(icon_name='theme:stock-keep') - self.add_action(self._open_icon, ClipboardMenu.ACTION_OPEN) + if not self._open_item: + self._open_item = MenuItem(ClipboardMenu.ACTION_OPEN, + _('Open'), + 'theme:stock-keep') + self.add_item(self._open_item) - if self._stop_icon: - self.remove_action(self._stop_icon) - self._stop_icon = None + if self._stop_item: + self.remove_item(self._stop_item) + self._stop_item = None elif percent == 100 and not activity: - if not self._remove_icon: - self._remove_icon = CanvasIcon(icon_name='theme:stock-remove') - self.add_action(self._remove_icon, ClipboardMenu.ACTION_DELETE) + if not self._remove_item: + self._remove_item = MenuItem(ClipboardMenu.ACTION_DELETE, + _('Remove'), + 'theme:stock-remove') + self.add_item(self._remove_item) - if self._open_icon: - self.remove_action(self._open_icon) - self._open_icon = None + if self._open_item: + self.remove_item(self._open_item) + self._open_item = None - if self._stop_icon: - self.remove_action(self._stop_icon) - self._stop_icon = None + if self._stop_item: + self.remove_item(self._stop_item) + self._stop_item = None else: - if not self._stop_icon: - self._stop_icon = CanvasIcon(icon_name='theme:stock-close') - self.add_action(self._stop_icon, ClipboardMenu.ACTION_STOP_DOWNLOAD) + if not self._stop_item: + self._stop_item = MenuItem(ClipboardMenu.ACTION_STOP_DOWNLOAD, + _('Stop download'), + 'theme:stock-close') + self.add_item(self._stop_item) - if self._remove_icon: - self.remove_action(self._remove_icon) - self._remove_icon = None + if self._remove_item: + self.remove_item(self._remove_item) + self._remove_item = None - if self._open_icon: - self.remove_action(self._open_icon) - self._open_icon = None + if self._open_item: + self.remove_item(self._open_item) + self._open_item = None def set_state(self, name, percent, preview, activity): self.set_title(name) diff --git a/shell/view/frame/Makefile.am b/shell/view/frame/Makefile.am index 1aaabd6b..c4e6dc22 100644 --- a/shell/view/frame/Makefile.am +++ b/shell/view/frame/Makefile.am @@ -10,4 +10,5 @@ sugar_PYTHON = \ ZoomBox.py \ notificationtray.py \ overlaybox.py \ - PanelWindow.py + PanelWindow.py \ + framepopupcontext.py diff --git a/shell/view/frame/PanelWindow.py b/shell/view/frame/PanelWindow.py index 24f268d8..e14f6b4b 100644 --- a/shell/view/frame/PanelWindow.py +++ b/shell/view/frame/PanelWindow.py @@ -17,7 +17,6 @@ import gtk import hippo -from sugar.graphics.menushell import MenuShell from sugar.graphics import units class PanelWindow(gtk.Window): @@ -51,13 +50,8 @@ class PanelWindow(gtk.Window): self.add(self._canvas) self._canvas.show() - self._menu_shell = MenuShell(self._canvas) - self.resize(width, height) - def get_menu_shell(self): - return self._menu_shell - def get_root(self): return self._bg diff --git a/shell/view/frame/ZoomBox.py b/shell/view/frame/ZoomBox.py index 4d68a482..57bc78a5 100644 --- a/shell/view/frame/ZoomBox.py +++ b/shell/view/frame/ZoomBox.py @@ -42,9 +42,10 @@ class ActivityMenu(Menu): 'theme:stock-close')) class ActivityButton(IconButton): - def __init__(self, shell, activity_model): + def __init__(self, shell, activity_model, popup_context): self._shell = shell self._activity_model = activity_model + self._popup_context = popup_context icon_name = self._activity_model.get_icon_name() icon_color = self._activity_model.get_icon_color() @@ -57,7 +58,7 @@ class ActivityButton(IconButton): return menu def get_popup_context(self): - return self._shell.get_popup_context() + return self._popup_context def _action_cb(self, menu, menu_item): # TODO: Wouldn't be better to share/close the activity associated with @@ -73,11 +74,11 @@ class ActivityButton(IconButton): activity.close() class ZoomBox(hippo.CanvasBox): - def __init__(self, shell, menu_shell): + def __init__(self, shell, popup_context): hippo.CanvasBox.__init__(self, orientation=hippo.ORIENTATION_HORIZONTAL) self._shell = shell - self._menu_shell = menu_shell + self._popup_context = popup_context self._activity_icon = None icon = IconButton(icon_name='theme:stock-zoom-mesh') @@ -106,7 +107,7 @@ class ZoomBox(hippo.CanvasBox): self.remove(self._activity_icon) if home_activity: - icon = ActivityButton(self._shell, home_activity) + icon = ActivityButton(self._shell, home_activity, self._popup_context) self.append(icon) self._activity_icon = icon else: diff --git a/shell/view/frame/clipboardbox.py b/shell/view/frame/clipboardbox.py index d230e062..d5e435ea 100644 --- a/shell/view/frame/clipboardbox.py +++ b/shell/view/frame/clipboardbox.py @@ -37,9 +37,9 @@ class _ContextMap: class ClipboardBox(hippo.CanvasBox): - def __init__(self, menu_shell): + def __init__(self, popup_context): hippo.CanvasBox.__init__(self) - self._menu_shell = menu_shell + self._popup_context = popup_context self._icons = {} self._context_map = _ContextMap() @@ -74,7 +74,7 @@ class ClipboardBox(hippo.CanvasBox): on_disk = False) def _object_added_cb(self, cb_service, object_id, name): - icon = ClipboardIcon(self._menu_shell, object_id, name) + icon = ClipboardIcon(self._popup_context, object_id, name) self.append(icon) self._icons[object_id] = icon diff --git a/shell/view/frame/clipboardpanelwindow.py b/shell/view/frame/clipboardpanelwindow.py index 5df7b037..30b9cb2e 100644 --- a/shell/view/frame/clipboardpanelwindow.py +++ b/shell/view/frame/clipboardpanelwindow.py @@ -17,10 +17,9 @@ class ClipboardPanelWindow(PanelWindow): clipboard = gtk.Clipboard() clipboard.connect("owner-change", self._owner_change_cb) - menu_shell = self.get_menu_shell() root = self.get_root() - box = ClipboardBox(menu_shell) + box = ClipboardBox(frame.get_popup_context()) root.append(box) # Receiving dnd drops diff --git a/shell/view/frame/frame.py b/shell/view/frame/frame.py index 8a3cb9d0..f8a89ee7 100644 --- a/shell/view/frame/frame.py +++ b/shell/view/frame/frame.py @@ -27,9 +27,9 @@ from view.frame.FriendsBox import FriendsBox from view.frame.PanelWindow import PanelWindow from view.frame.clipboardpanelwindow import ClipboardPanelWindow from view.frame.notificationtray import NotificationTray +from view.frame.framepopupcontext import FramePopupContext from model.ShellModel import ShellModel from sugar.graphics.timeline import Timeline -from sugar.graphics.menushell import MenuShell from sugar.graphics import units _ANIMATION = False @@ -62,6 +62,12 @@ class Frame: self._event_frame.connect('leave', self._event_frame_leave_cb) self._event_frame.show() + self._popup_context = FramePopupContext() + self._popup_context.connect('activated', + self._popup_context_activated_cb) + self._popup_context.connect('deactivated', + self._popup_context_deactivated_cb) + self._top_panel = self._create_top_panel() self._bottom_panel = self._create_bottom_panel() self._left_panel = self._create_left_panel() @@ -70,20 +76,11 @@ class Frame: shell.get_model().connect('notify::state', self._shell_state_changed_cb) - popup_context = shell.get_popup_context() - popup_context.connect('activated', - self._popup_context_activated_cb) - popup_context.connect('deactivated', - self._popup_context_deactivated_cb) - def _create_top_panel(self): panel = self._create_panel(hippo.ORIENTATION_HORIZONTAL) - menu_shell = panel.get_menu_shell() root = panel.get_root() - menu_shell.set_position(MenuShell.BOTTOM) - - box = ZoomBox(self._shell, menu_shell) + box = ZoomBox(self._shell, self._popup_context) root.append(box) tray = NotificationTray() @@ -103,11 +100,8 @@ class Frame: def _create_bottom_panel(self): panel = self._create_panel(hippo.ORIENTATION_HORIZONTAL) - menu_shell = panel.get_menu_shell() root = panel.get_root() - menu_shell.set_position(MenuShell.TOP) - box = ActivitiesBox(self._shell) root.append(box) @@ -115,12 +109,9 @@ class Frame: def _create_right_panel(self): panel = self._create_panel(hippo.ORIENTATION_VERTICAL) - menu_shell = panel.get_menu_shell() root = panel.get_root() - menu_shell.set_position(MenuShell.LEFT) - - box = FriendsBox(self._shell, menu_shell) + box = FriendsBox(self._shell, self._popup_context) root.append(box) return panel @@ -158,19 +149,6 @@ class Frame: panel.connect('enter-notify-event', self._enter_notify_cb) panel.connect('leave-notify-event', self._leave_notify_cb) - menu_shell = panel.get_menu_shell() - menu_shell.connect('activated', - self._menu_shell_activated_cb) - menu_shell.connect('deactivated', - self._menu_shell_deactivated_cb) - - def _menu_shell_activated_cb(self, menu_shell): - self._timeline.goto('slide_in', True) - - def _menu_shell_deactivated_cb(self, menu_shell): - if self._mode != Frame.STICKY and not self._hover_frame: - self._timeline.play('before_slide_out', 'slide_out') - def _popup_context_activated_cb(self, popup_context): self._timeline.goto('slide_in', True) @@ -205,8 +183,7 @@ class Frame: def _leave_notify(self, panel): self._hover_frame = False - if not panel.get_menu_shell().is_active() and \ - not self._shell.get_popup_context().is_active() and \ + if not self._popup_context.is_active() and \ (self._mode == Frame.HIDE_ON_LEAVE or \ self._mode == Frame.AUTOMATIC): self._timeline.play('before_slide_out', 'slide_out') @@ -281,3 +258,6 @@ class Frame: def is_visible(self): return self._top_panel.props.visible + + def get_popup_context(self): + return self._popup_context diff --git a/shell/view/frame/framepopupcontext.py b/shell/view/frame/framepopupcontext.py new file mode 100644 index 00000000..cf35293a --- /dev/null +++ b/shell/view/frame/framepopupcontext.py @@ -0,0 +1,26 @@ +# Copyright (C) 2007, One Laptop Per Child +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. +import gobject +import hippo + +from sugar.graphics.popupcontext import PopupContext + +class FramePopupContext(PopupContext): + __gtype_name__ = 'SugarFramePopupContext' + + def __init__(self): + PopupContext.__init__(self) diff --git a/sugar/graphics/menu.py b/sugar/graphics/menu.py index e32eabe9..9dfc6f37 100644 --- a/sugar/graphics/menu.py +++ b/sugar/graphics/menu.py @@ -98,6 +98,9 @@ class Menu(Popup): item.connect('button-press-event', self._item_button_press_event_cb) self.append(item) + def remove_item(self, item): + self.remove(item) + def add_separator(self): box = hippo.CanvasBox() box.props.background_color = color.MENU_SEPARATOR.get_int()