diff options
author | Tomeu Vizoso <tomeu@tomeuvizoso.net> | 2006-11-15 12:56:19 (GMT) |
---|---|---|
committer | Tomeu Vizoso <tomeu@tomeuvizoso.net> | 2006-11-15 12:56:19 (GMT) |
commit | 59d57a03d9673e4f8f9c07aa7ba84edef32b8976 (patch) | |
tree | 825251fb38b27e97555f23d26026f60b7957d3ef /shell | |
parent | 66acd2a91b0f0b98ef3428e4a4c14f21d8aa0f1f (diff) |
First implementation of ClipboardService. Implement pdf viewing and downloading via ClipboardService.
Diffstat (limited to 'shell')
-rw-r--r-- | shell/view/ClipboardIcon.py | 38 | ||||
-rw-r--r-- | shell/view/ClipboardMenu.py | 56 | ||||
-rw-r--r-- | shell/view/Makefile.am | 2 | ||||
-rw-r--r-- | shell/view/frame/ClipboardBox.py | 42 | ||||
-rw-r--r-- | shell/view/frame/Frame.py | 6 | ||||
-rw-r--r-- | shell/view/frame/Makefile.am | 1 | ||||
-rw-r--r-- | shell/view/stylesheet.py | 18 |
7 files changed, 162 insertions, 1 deletions
diff --git a/shell/view/ClipboardIcon.py b/shell/view/ClipboardIcon.py new file mode 100644 index 0000000..429fc99 --- /dev/null +++ b/shell/view/ClipboardIcon.py @@ -0,0 +1,38 @@ +from sugar.graphics.menuicon import MenuIcon +from view.ClipboardMenu import ClipboardMenu +from sugar.activity import ActivityFactory +from sugar.clipboard import ClipboardService + +class ClipboardIcon(MenuIcon): + + def __init__(self, menu_shell, name, file_name): + MenuIcon.__init__(self, menu_shell, icon_name='activity-xbook') + self._name = name + self._file_name = file_name + self._percent = 0 + self.connect('activated', self._icon_activated_cb) + self._menu = None + + def create_menu(self): + self._menu = ClipboardMenu(self._name, self._percent) + self._menu.connect('action', self._popup_action_cb) + return self._menu + + def set_percent(self, percent): + self._percent = percent + if self._menu: + self._menu.set_percent(percent) + + def _icon_activated_cb(self, icon): + if self._percent == 100: + activity = ActivityFactory.create("org.laptop.sugar.Xbook") + activity.execute("open_document", [self._file_name]) + + def _popup_action_cb(self, popup, action): + self.popdown() + + if action == ClipboardMenu.ACTION_STOP_DOWNLOAD: + raise "Stopping downloads still not implemented." + elif action == ClipboardMenu.ACTION_DELETE: + cb_service = ClipboardService.get_instance() + cb_service.delete_object(self._file_name) diff --git a/shell/view/ClipboardMenu.py b/shell/view/ClipboardMenu.py new file mode 100644 index 0000000..44ca798 --- /dev/null +++ b/shell/view/ClipboardMenu.py @@ -0,0 +1,56 @@ +import gtk +import gobject +import hippo + +from sugar.graphics.menu import Menu +from sugar.graphics.canvasicon import CanvasIcon +from sugar.graphics.ClipboardBubble import ClipboardBubble +from sugar.graphics import style + +class ClipboardMenuItem(ClipboardBubble): + + def __init__(self, percent = 0, stylesheet="clipboard.Bubble"): + ClipboardBubble.__init__(self, percent = percent) + style.apply_stylesheet(self, stylesheet) + +class ClipboardMenu(Menu): + + ACTION_DELETE = 0 + ACTION_SHARE = 1 + ACTION_STOP_DOWNLOAD = 2 + + def __init__(self, name, percent): + Menu.__init__(self, name) + + self._progress_bar = ClipboardMenuItem(percent) + self._root.append(self._progress_bar) + + #icon = CanvasIcon(icon_name='stock-share-mesh') + #self.add_action(icon, ClipboardMenu.ACTION_SHARE) + + self._remove_icon = None + self._stop_icon = None + + self._create_icons(percent) + + def _create_icons(self, percent): + if percent == 100: + if not self._remove_icon: + self._remove_icon = CanvasIcon(icon_name='stock-remove') + self.add_action(self._remove_icon, ClipboardMenu.ACTION_DELETE) + + if self._stop_icon: + self.remove_action(self._stop_icon) + self._stop_icon = None + else: + if not self._stop_icon: + self._stop_icon = CanvasIcon(icon_name='stock-close') + self.add_action(self._stop_icon, ClipboardMenu.ACTION_STOP_DOWNLOAD) + + if self._remove_icon: + self.remove_action(self._remove_icon) + self._remove_icon = None + + def set_percent(self, percent): + self._progress_bar.set_property('percent', percent) + self._create_icons(percent) diff --git a/shell/view/Makefile.am b/shell/view/Makefile.am index bf77593..bd90a2d 100644 --- a/shell/view/Makefile.am +++ b/shell/view/Makefile.am @@ -7,6 +7,8 @@ sugar_PYTHON = \ FirstTimeDialog.py \ BuddyIcon.py \ BuddyMenu.py \ + ClipboardIcon.py \ + ClipboardMenu.py \ OverlayWindow.py \ Shell.py \ dconmanager.py \ diff --git a/shell/view/frame/ClipboardBox.py b/shell/view/frame/ClipboardBox.py new file mode 100644 index 0000000..849c7e0 --- /dev/null +++ b/shell/view/frame/ClipboardBox.py @@ -0,0 +1,42 @@ +import logging +import dbus +import hippo + +from sugar.graphics import style +from view.ClipboardIcon import ClipboardIcon +from sugar.clipboard import ClipboardService + +class ClipboardBox(hippo.CanvasBox): + + def __init__(self, frame, menu_shell): + hippo.CanvasBox.__init__(self) + self._frame = frame + self._menu_shell = menu_shell + self._icons = {} + + cb_service = ClipboardService.get_instance() + cb_service.connect('object-added', self._object_added_cb) + cb_service.connect('object-deleted', self._object_deleted_cb) + cb_service.connect('object-state-changed', self._object_state_changed_cb) + + def _object_added_cb(self, cb_service, name, mimeType, fileName): + icon = ClipboardIcon(self._menu_shell, name, fileName) + style.apply_stylesheet(icon, 'frame.BuddyIcon') + self.append(icon) + self._icons[fileName] = icon + + if not self._frame.is_visible(): + self._frame.show_and_hide(0.1) + + logging.debug('ClipboardBox: ' + fileName + ' was added.') + + def _object_deleted_cb(self, cb_service, fileName): + icon = self._icons[fileName] + self.remove(icon) + del self._icons[fileName] + logging.debug('ClipboardBox: ' + fileName + ' was deleted.') + + def _object_state_changed_cb(self, cb_service, fileName, percent): + icon = self._icons[fileName] + icon.set_percent(percent) + logging.debug('ClipboardBox: ' + fileName + ' state was changed.') diff --git a/shell/view/frame/Frame.py b/shell/view/frame/Frame.py index fd3c11e..37f28cb 100644 --- a/shell/view/frame/Frame.py +++ b/shell/view/frame/Frame.py @@ -23,6 +23,7 @@ from view.frame.ActivitiesBox import ActivitiesBox from view.frame.ZoomBox import ZoomBox from view.frame.overlaybox import OverlayBox from view.frame.FriendsBox import FriendsBox +from view.frame.ClipboardBox import ClipboardBox from view.frame.PanelWindow import PanelWindow from view.frame.notificationtray import NotificationTray from view.frame.shutdownicon import ShutdownIcon @@ -205,7 +206,10 @@ class Frame: root.append(box) # Left panel - self._create_panel(grid, 0, 1, 1, 10) + [menu_shell, root] = self._create_panel(grid, 0, 1, 1, 10) + + box = ClipboardBox(self, menu_shell) + root.append(box) def _create_panel(self, grid, x, y, width, height): panel = PanelWindow() diff --git a/shell/view/frame/Makefile.am b/shell/view/frame/Makefile.am index 81a5406..5d96a23 100644 --- a/shell/view/frame/Makefile.am +++ b/shell/view/frame/Makefile.am @@ -2,6 +2,7 @@ sugardir = $(pkgdatadir)/shell/view/frame sugar_PYTHON = \ __init__.py \ ActivitiesBox.py \ + ClipboardBox.py \ FriendsBox.py \ PanelWindow.py \ Frame.py \ diff --git a/shell/view/stylesheet.py b/shell/view/stylesheet.py index e6c0688..1870f9c 100644 --- a/shell/view/stylesheet.py +++ b/shell/view/stylesheet.py @@ -60,3 +60,21 @@ friends_FriendIcon = { friends_ActivityIcon = { 'size' : style.standard_icon_size } + +clipboard_bubble = { + 'fill-color' : 0x646464FF, + 'stroke-color' : 0x646464FF, + 'progress-color': 0x333333FF, + 'spacing' : style.space_unit, + 'padding' : style.space_unit * 1.5 +} + +clipboard_menu_item_title = { + 'xalign': hippo.ALIGNMENT_START, + 'padding-left': 5, + 'color' : 0xFFFFFFFF, + 'font' : style.get_font_description('Bold', 1.2) +} + +style.register_stylesheet("clipboard.Bubble", clipboard_bubble) +style.register_stylesheet("clipboard.MenuItem.Title", clipboard_menu_item_title) |