From a7e4092b0e4f3d30a21ee5a7982aecd5252a0822 Mon Sep 17 00:00:00 2001 From: Tomeu Vizoso Date: Sun, 05 Nov 2006 18:52:46 +0000 Subject: Created SugarDownloadManager and ClipboardService's wrapper. Show and hide the frame when adding an object to the clipboard. --- diff --git a/.gitignore b/.gitignore index 0748927..edc5592 100644 --- a/.gitignore +++ b/.gitignore @@ -53,3 +53,4 @@ lib/src/sugar-marshal.c lib/src/sugar-marshal.h lib/src/stamp-sugar-marshal.c lib/src/stamp-sugar-marshal.h +services/clipboard/org.laptop.Clipboard.service diff --git a/activities/web/webactivity.py b/activities/web/webactivity.py index c36e2ac..6fc0fac 100644 --- a/activities/web/webactivity.py +++ b/activities/web/webactivity.py @@ -23,6 +23,7 @@ import dbus import _sugar from sugar.activity import ActivityFactory from sugar.activity.Activity import Activity +from sugar.clipboard import ClipboardService from sugar import env from sugar.graphics import style import web.stylesheet @@ -105,35 +106,28 @@ def start(): style.load_stylesheet(web.stylesheet) - chandler = _sugar.get_browser_chandler() - chandler.connect('download-started', download_started_cb) - chandler.connect('download-completed', download_completed_cb) - chandler.connect('download-cancelled', download_started_cb) - chandler.connect('download-progress', download_progress_cb) + download_manager = _sugar.get_download_manager() + download_manager.connect('download-started', download_started_cb) + download_manager.connect('download-completed', download_completed_cb) + download_manager.connect('download-cancelled', download_started_cb) + download_manager.connect('download-progress', download_progress_cb) def stop(): gtkmozembed.pop_startup() -def download_started_cb(chandler, url, mimeType, tmpFileName): - bus = dbus.SessionBus() - proxy_obj = bus.get_object('org.laptop.Clipboard', '/org/laptop/Clipboard') - iface = dbus.Interface(proxy_obj, 'org.laptop.Clipboard') - iface.add_object(mimeType, tmpFileName) - -def download_completed_cb(chandler, tmpFileName): - bus = dbus.SessionBus() - proxy_obj = bus.get_object('org.laptop.Clipboard', '/org/laptop/Clipboard') - iface = dbus.Interface(proxy_obj, 'org.laptop.Clipboard') - iface.update_object_state(tmpFileName, 100) - -def download_cancelled_cb(chandler, tmpFileName): - bus = dbus.SessionBus() - proxy_obj = bus.get_object('org.laptop.Clipboard', '/org/laptop/Clipboard') - iface = dbus.Interface(proxy_obj, 'org.laptop.Clipboard') - iface.delete_object(tmpFileName, 100) - -def download_progress_cb(chandler, tmpFileName, progress): - bus = dbus.SessionBus() - proxy_obj = bus.get_object('org.laptop.Clipboard', '/org/laptop/Clipboard') - iface = dbus.Interface(proxy_obj, 'org.laptop.Clipboard') - iface.update_object_state(tmpFileName, progress) +def download_started_cb(download_manager, url, mimeType, tmpFileName): + cbService = ClipboardService.get_instance() + cbService.add_object(mimeType, tmpFileName) + +def download_completed_cb(download_manager, tmpFileName): + cbService = ClipboardService.get_instance() + cbService.update_object_state(tmpFileName, 100) + +def download_cancelled_cb(download_manager, tmpFileName): + cbService = ClipboardService.get_instance() + #FIXME: Needs to update the state of the object to 'download stopped' + #cbService.update_object_state(tmpFileName, 100) + +def download_progress_cb(download_manager, tmpFileName, progress): + cbService = ClipboardService.get_instance() + cbService.update_object_state(tmpFileName, progress) diff --git a/configure.ac b/configure.ac index 78ab43f..d192edb 100644 --- a/configure.ac +++ b/configure.ac @@ -78,6 +78,7 @@ sugar/__installed__.py sugar/activity/Makefile sugar/chat/Makefile sugar/chat/sketchpad/Makefile +sugar/clipboard/Makefile sugar/graphics/Makefile sugar/p2p/Makefile sugar/presence/Makefile diff --git a/lib/python/_sugar.defs b/lib/python/_sugar.defs index 5a31c91..6a42d96 100644 --- a/lib/python/_sugar.defs +++ b/lib/python/_sugar.defs @@ -35,11 +35,11 @@ (gtype-id "SUGAR_TYPE_PUSH_SCROLLER") ) -(define-object BrowserChandler +(define-object DownloadManager (in-module "Sugar") (parent "GObject") - (c-name "SugarBrowserChandler") - (gtype-id "SUGAR_TYPE_BROWSER_CHANDLER") + (c-name "SugarDownloadManager") + (gtype-id "SUGAR_TYPE_DOWNLOAD_MANAGER") ) ;; Enumerations and flags ... @@ -181,14 +181,14 @@ ) ) -;; From sugar-browser-chandler.h +;; From sugar-download-manager.h -(define-function sugar_browser_chandler_get_type - (c-name "sugar_browser_chandler_get_type") +(define-function sugar_download_manager_get_type + (c-name "sugar_download_manager_get_type") (return-type "GType") ) -(define-function get_browser_chandler - (c-name "sugar_get_browser_chandler") - (return-type "SugarBrowserChandler*") +(define-function get_download_manager + (c-name "sugar_get_download_manager") + (return-type "SugarDownloadManager*") ) diff --git a/lib/python/_sugar.override b/lib/python/_sugar.override index 9d27bbe..f1f5cd7 100644 --- a/lib/python/_sugar.override +++ b/lib/python/_sugar.override @@ -9,7 +9,7 @@ headers #include "sugar-address-entry.h" #include "sugar-tray-manager.h" #include "sugar-push-scroller.h" -#include "sugar-browser-chandler.h" +#include "sugar-download-manager.h" %% modulename gecko diff --git a/lib/src/Makefile.am b/lib/src/Makefile.am index 0224885..7416f83 100644 --- a/lib/src/Makefile.am +++ b/lib/src/Makefile.am @@ -19,8 +19,8 @@ libsugarprivate_la_SOURCES = \ sugar-address-entry.c \ sugar-browser.h \ sugar-browser.cpp \ - sugar-browser-chandler.h \ - sugar-browser-chandler.c \ + sugar-download-manager.h \ + sugar-download-manager.c \ SugarContentHandler.h \ SugarContentHandler.cpp \ SugarDownload.h \ diff --git a/lib/src/SugarContentHandler.cpp b/lib/src/SugarContentHandler.cpp index b39b20b..de30aec 100644 --- a/lib/src/SugarContentHandler.cpp +++ b/lib/src/SugarContentHandler.cpp @@ -1,9 +1,6 @@ #include #include -#include "sugar-browser-chandler.h" -#include "SugarDownload.h" - #include "SugarContentHandler.h" GSugarContentHandler::GSugarContentHandler() diff --git a/lib/src/SugarDownload.cpp b/lib/src/SugarDownload.cpp index 62ca5ac..b087670 100644 --- a/lib/src/SugarDownload.cpp +++ b/lib/src/SugarDownload.cpp @@ -1,4 +1,4 @@ -#include "sugar-browser-chandler.h" +#include "sugar-download-manager.h" #include "SugarDownload.h" @@ -36,7 +36,7 @@ NS_IMETHODIMP GSugarDownload::OnStateChange (nsIWebProgress *aWebProgress, nsIRequest *aRequest, PRUint32 aStateFlags, nsresult aStatus) { - SugarBrowserChandler *browser_chandler = sugar_get_browser_chandler(); + SugarDownloadManager *download_manager = sugar_get_download_manager(); if (((aStateFlags & STATE_IS_REQUEST) && (aStateFlags & STATE_IS_NETWORK) && @@ -49,7 +49,7 @@ GSugarDownload::OnStateChange (nsIWebProgress *aWebProgress, nsIRequest *aReques mMIMEInfo->GetMIMEType(mimeType); mSource->GetSpec(url); - sugar_browser_chandler_download_started(browser_chandler, + sugar_download_manager_download_started(download_manager, url.get(), mimeType.get(), mTargetFileName.get()); @@ -60,10 +60,10 @@ GSugarDownload::OnStateChange (nsIWebProgress *aWebProgress, nsIRequest *aReques aStateFlags == STATE_STOP) { if (NS_SUCCEEDED (aStatus)) { - sugar_browser_chandler_download_completed(browser_chandler, + sugar_download_manager_download_completed(download_manager, mTargetFileName.get()); } else { - sugar_browser_chandler_download_cancelled(browser_chandler, + sugar_download_manager_download_cancelled(download_manager, mTargetFileName.get()); } } @@ -92,11 +92,11 @@ GSugarDownload::OnProgressChange64 (nsIWebProgress *aWebProgress, PRInt64 aCurTotalProgress, PRInt64 aMaxTotalProgress) { - SugarBrowserChandler *browser_chandler = sugar_get_browser_chandler(); + SugarDownloadManager *download_manager = sugar_get_download_manager(); PRInt32 percentComplete = (PRInt32)(((float)aCurSelfProgress / (float)aMaxSelfProgress) * 100.0); - sugar_browser_chandler_update_progress(browser_chandler, + sugar_download_manager_update_progress(download_manager, mTargetFileName.get(), percentComplete); diff --git a/lib/src/sugar-browser-chandler.h b/lib/src/sugar-browser-chandler.h deleted file mode 100644 index f851b70..0000000 --- a/lib/src/sugar-browser-chandler.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef __SUGAR_BROWSER_CHANDLER_H__ -#define __SUGAR_BROWSER_CHANDLER_H__ - -#include -#include - -G_BEGIN_DECLS - -typedef struct _SugarBrowserChandler SugarBrowserChandler; -typedef struct _SugarBrowserChandlerClass SugarBrowserChandlerClass; - -#define SUGAR_TYPE_BROWSER_CHANDLER (sugar_browser_chandler_get_type()) -#define SUGAR_BROWSER_CHANDLER(object) (G_TYPE_CHECK_INSTANCE_CAST((object), SUGAR_TYPE_BROWSER_CHANDLER, SugarBrowserChandler)) -#define SUGAR_BROWSER_CHANDLER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), SUGAR_TYPE_BROWSER_CHANDLER, SugarBrowserChandlerClass)) -#define SUGAR_IS_BROWSER_CHANDLER(object) (G_TYPE_CHECK_INSTANCE_TYPE((object), SUGAR_TYPE_BROWSER_CHANDLER)) -#define SUGAR_IS_BROWSER_CHANDLER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), SUGAR_TYPE_BROWSER_CHANDLER)) -#define SUGAR_BROWSER_CHANDLER_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS((object), SUGAR_TYPE_BROWSER_CHANDLER, SugarBrowserChandlerClass)) - -struct _SugarBrowserChandler { - GObject base_instance; -}; - -struct _SugarBrowserChandlerClass { - GObjectClass base_class; - - void (* handle_content) (char *url, char *tmp_file_name); - -}; - -GType sugar_browser_chandler_get_type (void); -SugarBrowserChandler *sugar_get_browser_chandler (void); -void sugar_browser_chandler_download_started (SugarBrowserChandler *chandler, - const char *url, - const char *mime_type, - const char *tmp_file_name); -void sugar_browser_chandler_download_completed (SugarBrowserChandler *chandler, - const char *tmp_file_name); -void sugar_browser_chandler_download_cancelled (SugarBrowserChandler *chandler, - const char *tmp_file_name); -void sugar_browser_chandler_update_progress (SugarBrowserChandler *chandler, - const char *tmp_file_name, - const int percent); - -G_END_DECLS - -#endif diff --git a/lib/src/sugar-browser-chandler.c b/lib/src/sugar-download-manager.c index da6e9d0..c3ffcf2 100644 --- a/lib/src/sugar-browser-chandler.c +++ b/lib/src/sugar-download-manager.c @@ -1,5 +1,5 @@ #include "sugar-marshal.h" -#include "sugar-browser-chandler.h" +#include "sugar-download-manager.h" enum { DOWNLOAD_STARTED, @@ -10,23 +10,23 @@ enum { }; static guint signals[LAST_SIGNAL] = { 0 }; -G_DEFINE_TYPE(SugarBrowserChandler, sugar_browser_chandler, G_TYPE_OBJECT) +G_DEFINE_TYPE(SugarDownloadManager, sugar_download_manager, G_TYPE_OBJECT) -SugarBrowserChandler *browserChandler = NULL; +SugarDownloadManager *DownloadManager = NULL; static void -sugar_browser_chandler_init(SugarBrowserChandler *browserChandler) +sugar_download_manager_init(SugarDownloadManager *DownloadManager) { } static void -sugar_browser_chandler_class_init(SugarBrowserChandlerClass *browser_chandler_class) +sugar_download_manager_class_init(SugarDownloadManagerClass *download_manager_class) { signals[DOWNLOAD_STARTED] = g_signal_new ("download-started", - G_OBJECT_CLASS_TYPE (browser_chandler_class), + G_OBJECT_CLASS_TYPE (download_manager_class), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (SugarBrowserChandlerClass, handle_content), + G_STRUCT_OFFSET (SugarDownloadManagerClass, handle_content), NULL, NULL, sugar_marshal_VOID__STRING_STRING_STRING, G_TYPE_NONE, 3, @@ -36,9 +36,9 @@ sugar_browser_chandler_class_init(SugarBrowserChandlerClass *browser_chandler_cl signals[DOWNLOAD_COMPLETED] = g_signal_new ("download-completed", - G_OBJECT_CLASS_TYPE (browser_chandler_class), + G_OBJECT_CLASS_TYPE (download_manager_class), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (SugarBrowserChandlerClass, handle_content), + G_STRUCT_OFFSET (SugarDownloadManagerClass, handle_content), NULL, NULL, sugar_marshal_VOID__STRING, G_TYPE_NONE, 1, @@ -46,9 +46,9 @@ sugar_browser_chandler_class_init(SugarBrowserChandlerClass *browser_chandler_cl signals[DOWNLOAD_CANCELLED] = g_signal_new ("download-cancelled", - G_OBJECT_CLASS_TYPE (browser_chandler_class), + G_OBJECT_CLASS_TYPE (download_manager_class), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (SugarBrowserChandlerClass, handle_content), + G_STRUCT_OFFSET (SugarDownloadManagerClass, handle_content), NULL, NULL, sugar_marshal_VOID__STRING, G_TYPE_NONE, 1, @@ -56,9 +56,9 @@ sugar_browser_chandler_class_init(SugarBrowserChandlerClass *browser_chandler_cl signals[DOWNLOAD_PROGRESS] = g_signal_new ("download-progress", - G_OBJECT_CLASS_TYPE (browser_chandler_class), + G_OBJECT_CLASS_TYPE (download_manager_class), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (SugarBrowserChandlerClass, handle_content), + G_STRUCT_OFFSET (SugarDownloadManagerClass, handle_content), NULL, NULL, sugar_marshal_VOID__STRING_INT, G_TYPE_NONE, 2, @@ -66,22 +66,22 @@ sugar_browser_chandler_class_init(SugarBrowserChandlerClass *browser_chandler_cl G_TYPE_INT); } -SugarBrowserChandler * -sugar_get_browser_chandler() +SugarDownloadManager * +sugar_get_download_manager() { - if(browserChandler == NULL) - browserChandler = g_object_new(SUGAR_TYPE_BROWSER_CHANDLER, NULL); + if(DownloadManager == NULL) + DownloadManager = g_object_new(SUGAR_TYPE_DOWNLOAD_MANAGER, NULL); - return browserChandler; + return DownloadManager; } void -sugar_browser_chandler_download_started (SugarBrowserChandler *browser_chandler, +sugar_download_manager_download_started (SugarDownloadManager *download_manager, const char *url, const char *mime_type, const char *tmp_file_name) { - g_signal_emit(browser_chandler, + g_signal_emit(download_manager, signals[DOWNLOAD_STARTED], 0 /* details */, url, @@ -90,30 +90,30 @@ sugar_browser_chandler_download_started (SugarBrowserChandler *browser_chandler, } void -sugar_browser_chandler_download_completed (SugarBrowserChandler *browser_chandler, +sugar_download_manager_download_completed (SugarDownloadManager *download_manager, const char *tmp_file_name) { - g_signal_emit(browser_chandler, + g_signal_emit(download_manager, signals[DOWNLOAD_COMPLETED], 0 /* details */, tmp_file_name); } -void sugar_browser_chandler_download_cancelled (SugarBrowserChandler *browser_chandler, +void sugar_download_manager_download_cancelled (SugarDownloadManager *download_manager, const char *tmp_file_name) { - g_signal_emit(browser_chandler, + g_signal_emit(download_manager, signals[DOWNLOAD_CANCELLED], 0 /* details */, tmp_file_name); } void -sugar_browser_chandler_update_progress (SugarBrowserChandler *browser_chandler, +sugar_download_manager_update_progress (SugarDownloadManager *download_manager, const char *tmp_file_name, const int percent) { - g_signal_emit(browser_chandler, + g_signal_emit(download_manager, signals[DOWNLOAD_PROGRESS], 0 /* details */, tmp_file_name, diff --git a/lib/src/sugar-download-manager.h b/lib/src/sugar-download-manager.h new file mode 100644 index 0000000..2d112d8 --- /dev/null +++ b/lib/src/sugar-download-manager.h @@ -0,0 +1,55 @@ +#ifndef __SUGAR_DOWNLOAD_MANAGER_H__ +#define __SUGAR_DOWNLOAD_MANAGER_H__ + +#include +#include + +G_BEGIN_DECLS + +typedef struct _SugarDownloadManager SugarDownloadManager; +typedef struct _SugarDownloadManagerClass SugarDownloadManagerClass; + +#define SUGAR_TYPE_DOWNLOAD_MANAGER (sugar_download_manager_get_type()) +#define SUGAR_DOWNLOAD_MANAGER(object) (G_TYPE_CHECK_INSTANCE_CAST((object), SUGAR_TYPE_DOWNLOAD_MANAGER, SugarDownloadManager)) +#define SUGAR_DOWNLOAD_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), SUGAR_TYPE_DOWNLOAD_MANAGER, SugarDownloadManagerClass)) +#define SUGAR_IS_DOWNLOAD_MANAGER(object) (G_TYPE_CHECK_INSTANCE_TYPE((object), SUGAR_TYPE_DOWNLOAD_MANAGER)) +#define SUGAR_IS_DOWNLOAD_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), SUGAR_TYPE_DOWNLOAD_MANAGER)) +#define SUGAR_DOWNLOAD_MANAGER_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS((object), SUGAR_TYPE_DOWNLOAD_MANAGER, SugarDownloadManagerClass)) + +struct _SugarDownloadManager { + GObject base_instance; +}; + +struct _SugarDownloadManagerClass { + GObjectClass base_class; + + void (* handle_content) (char *url, char *tmp_file_name); + +}; + +GType sugar_download_manager_get_type(void); + +SugarDownloadManager *sugar_get_download_manager(void); + +void sugar_download_manager_download_started( + SugarDownloadManager *download_manager, + const char *url, + const char *mime_type, + const char *tmp_file_name); + +void sugar_download_manager_download_completed( + SugarDownloadManager *download_manager, + const char *tmp_file_name); + +void sugar_download_manager_download_cancelled( + SugarDownloadManager *download_manager, + const char *tmp_file_name); + +void sugar_download_manager_update_progress( + SugarDownloadManager *download_manager, + const char *tmp_file_name, + const int percent); + +G_END_DECLS + +#endif diff --git a/services/clipboard/ClipboardService.py b/services/clipboard/ClipboardService.py index 35ac3a2..9ed9217 100644 --- a/services/clipboard/ClipboardService.py +++ b/services/clipboard/ClipboardService.py @@ -22,30 +22,30 @@ import dbus import dbus.service from sugar import env -_CLIPBOARD_SERVICE = "org.laptop.Clipboard" -_CLIPBOARD_DBUS_INTERFACE = "org.laptop.Clipboard" -_CLIPBOARD_OBJECT_PATH = "/org/laptop/Clipboard" - class ClipboardDBusServiceHelper(dbus.service.Object): + + _CLIPBOARD_DBUS_INTERFACE = "org.laptop.Clipboard" + _CLIPBOARD_OBJECT_PATH = "/org/laptop/Clipboard" + def __init__(self, parent): self._parent = parent bus = dbus.SessionBus() - bus_name = dbus.service.BusName(_CLIPBOARD_DBUS_INTERFACE, bus=bus) - dbus.service.Object.__init__(self, bus_name, _CLIPBOARD_OBJECT_PATH) + bus_name = dbus.service.BusName(self._CLIPBOARD_DBUS_INTERFACE, bus=bus) + dbus.service.Object.__init__(self, bus_name, self._CLIPBOARD_OBJECT_PATH) @dbus.service.method(_CLIPBOARD_DBUS_INTERFACE, in_signature="ss", out_signature="") def add_object(self, mimeType, fileName): - logging.debug('Added object of type ' + mimeType + ' with path at ' + fileName) self.object_added(mimeType, fileName) + logging.debug('Added object of type ' + mimeType + ' with path at ' + fileName) @dbus.service.method(_CLIPBOARD_DBUS_INTERFACE, in_signature="s", out_signature="") def delete_object(self, fileName): - logging.debug('Deleted object with path at ' + fileName) self.object_deleted(fileName) - + logging.debug('Deleted object with path at ' + fileName) + @dbus.service.method(_CLIPBOARD_DBUS_INTERFACE, in_signature="si", out_signature="") def update_object_state(self, fileName, percent): diff --git a/shell/view/ClipboardIcon.py b/shell/view/ClipboardIcon.py index 9a9b6f4..db23353 100644 --- a/shell/view/ClipboardIcon.py +++ b/shell/view/ClipboardIcon.py @@ -1,10 +1,12 @@ 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, file_name): - MenuIcon.__init__(self, menu_shell, icon_name='stock-written-doc') + MenuIcon.__init__(self, menu_shell, icon_name='activity-xbook') self._file_name = file_name self._percent = 0 self.connect('activated', self._icon_activated_cb) @@ -21,13 +23,15 @@ class ClipboardIcon(MenuIcon): self._menu.set_percent(percent) def _icon_activated_cb(self, icon): - activity = ActivityFactory.create("org.laptop.sugar.Xbook") - activity.execute("open_document", [self._file_name]) + 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_DELETE: -# activity = self._shell.get_current_activity() -# activity.invite(ps_buddy) - pass + 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 index 16a0384..0964fc3 100644 --- a/shell/view/ClipboardMenu.py +++ b/shell/view/ClipboardMenu.py @@ -43,16 +43,32 @@ class ClipboardMenu(Menu): 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) + #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: - icon = CanvasIcon(icon_name='stock-remove') - self.add_action(icon, ClipboardMenu.ACTION_DELETE) + 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: - icon = CanvasIcon(icon_name='stock-close') - self.add_action(icon, ClipboardMenu.ACTION_STOP_DOWNLOAD) + 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/frame/ClipboardBox.py b/shell/view/frame/ClipboardBox.py index 9eae973..1ca1a8c 100644 --- a/shell/view/frame/ClipboardBox.py +++ b/shell/view/frame/ClipboardBox.py @@ -4,58 +4,39 @@ import hippo from sugar.graphics import style from view.ClipboardIcon import ClipboardIcon +from sugar.clipboard import ClipboardService class ClipboardBox(hippo.CanvasBox): - - _CLIPBOARD_SERVICE = "org.laptop.Clipboard" - _CLIPBOARD_OBJECT_PATH = "/org/laptop/Clipboard" - def __init__(self, shell, menu_shell): + def __init__(self, frame, menu_shell): hippo.CanvasBox.__init__(self) - self._shell = shell + self._frame = frame self._menu_shell = menu_shell self._icons = {} - - bus = dbus.SessionBus() - bus.add_signal_receiver(self.name_owner_changed_cb, - signal_name="NameOwnerChanged", - dbus_interface="org.freedesktop.DBus") - # Try to register to ClipboardService, if we fail, we'll try later. - try: - self._connect_clipboard_signals() - except dbus.DBusException, exception: - pass - def _connect_clipboard_signals(self): - bus = dbus.SessionBus() - proxy_obj = bus.get_object(self._CLIPBOARD_SERVICE, self._CLIPBOARD_OBJECT_PATH) - iface = dbus.Interface(proxy_obj, self._CLIPBOARD_SERVICE) - iface.connect_to_signal('object_added', self.object_added_callback) - iface.connect_to_signal('object_deleted', self.object_deleted_callback) - iface.connect_to_signal('object_state_updated', self.object_state_updated_callback) + 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-updated', self._object_state_updated_cb) - def name_owner_changed_cb(self, name, old, new): - if name != self._CLIPBOARD_SERVICE: - return - if (not old and not len(old)) and (new and len(new)): - # ClipboardService started up - self._connect_clipboard_signals() - - def object_added_callback(self, mimeType, fileName): + def _object_added_cb(self, cb_service, mimeType, fileName): icon = ClipboardIcon(self._menu_shell, 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_callback(self, fileName): + def _object_deleted_cb(self, cb_service, fileName): icon = self._icons[fileName] self.remove(icon) - self._icons.remove(icon) + del self._icons[fileName] logging.debug('ClipboardBox: ' + fileName + ' was deleted.') - def object_state_updated_callback(self, fileName, percent): + def _object_state_updated_cb(self, cb_service, fileName, percent): icon = self._icons[fileName] icon.set_percent(percent) logging.debug('ClipboardBox: ' + fileName + ' state was updated.') diff --git a/shell/view/frame/Frame.py b/shell/view/frame/Frame.py index ad6a390..4a5f31a 100644 --- a/shell/view/frame/Frame.py +++ b/shell/view/frame/Frame.py @@ -201,7 +201,7 @@ class Frame: # Left panel [menu_shell, root] = self._create_panel(grid, 0, 1, 1, 10) - box = ClipboardBox(self._shell, menu_shell) + box = ClipboardBox(self, menu_shell) root.append(box) def _create_panel(self, grid, x, y, width, height): diff --git a/sugar/Makefile.am b/sugar/Makefile.am index ae2e2ee..905555a 100644 --- a/sugar/Makefile.am +++ b/sugar/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = activity chat graphics p2p presence +SUBDIRS = activity chat clipboard graphics p2p presence sugardir = $(pythondir)/sugar sugar_PYTHON = \ diff --git a/sugar/clipboard/ClipboardService.py b/sugar/clipboard/ClipboardService.py new file mode 100644 index 0000000..e189653 --- /dev/null +++ b/sugar/clipboard/ClipboardService.py @@ -0,0 +1,73 @@ +import dbus +import gobject + +DBUS_SERVICE = "org.laptop.Clipboard" +DBUS_INTERFACE = "org.laptop.Clipboard" +DBUS_PATH = "/org/laptop/Clipboard" + +class ClipboardService(gobject.GObject): + + __gsignals__ = { + 'object-added': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, + ([str, str])), + 'object-deleted': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, + ([str])), + 'object-state-updated': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, + ([str, int])), + } + + def __init__(self): + gobject.GObject.__init__(self) + + self._dbus_service = None + bus = dbus.SessionBus() + bus.add_signal_receiver(self._name_owner_changed_cb, + signal_name="NameOwnerChanged", + dbus_interface="org.freedesktop.DBus") + # Try to register to ClipboardService, if we fail, we'll try later. + try: + self._connect_clipboard_signals() + except dbus.DBusException, exception: + pass + + def _connect_clipboard_signals(self): + bus = dbus.SessionBus() + proxy_obj = bus.get_object(DBUS_SERVICE, DBUS_PATH) + self._dbus_service = dbus.Interface(proxy_obj, DBUS_SERVICE) + self._dbus_service.connect_to_signal('object_added', self._object_added_cb) + self._dbus_service.connect_to_signal('object_deleted', self._object_deleted_cb) + self._dbus_service.connect_to_signal('object_state_updated', + self._object_state_updated_cb) + + def _name_owner_changed_cb(self, name, old, new): + if name != DBUS_SERVICE: + return + + if (not old and not len(old)) and (new and len(new)): + # ClipboardService started up + self._connect_clipboard_signals() + + def _object_added_cb(self, mimeType, fileName): + self.emit('object-added', mimeType, fileName) + + def _object_deleted_cb(self, fileName): + self.emit('object-deleted', fileName) + + def _object_state_updated_cb(self, fileName, percent): + self.emit('object-state-updated', fileName, percent) + + def add_object(self, mimeType, fileName): + self._dbus_service.add_object(mimeType, fileName) + + def delete_object(self, fileName): + self._dbus_service.delete_object(fileName) + + def update_object_state(self, fileName, percent): + self._dbus_service.update_object_state(fileName, percent) + +_clipboard_service = None +def get_instance(): + global _clipboard_service + if not _clipboard_service: + _clipboard_service = ClipboardService() + return _clipboard_service diff --git a/sugar/clipboard/Makefile.am b/sugar/clipboard/Makefile.am new file mode 100644 index 0000000..dbfabe9 --- /dev/null +++ b/sugar/clipboard/Makefile.am @@ -0,0 +1,5 @@ +sugardir = $(pythondir)/sugar/clipboard +sugar_PYTHON = \ + __init__.py \ + ClipboardService.py + diff --git a/sugar/clipboard/__init__.py b/sugar/clipboard/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/sugar/clipboard/__init__.py diff --git a/sugar/graphics/Makefile.am b/sugar/graphics/Makefile.am index 83b0920..9828c8c 100644 --- a/sugar/graphics/Makefile.am +++ b/sugar/graphics/Makefile.am @@ -4,6 +4,7 @@ sugar_PYTHON = \ bubble.py \ canvasicon.py \ colors.py \ + ClipboardBubble.py \ grid.py \ iconcolor.py \ menu.py \ diff --git a/sugar/graphics/menu.py b/sugar/graphics/menu.py index 5404cf5..9c031ba 100644 --- a/sugar/graphics/menu.py +++ b/sugar/graphics/menu.py @@ -49,6 +49,7 @@ class Menu(gtk.Window): self._root.append(content_box) self._action_box = None + self._action_box_separator = None def _create_separator(self): separator = hippo.CanvasBox() @@ -56,8 +57,8 @@ class Menu(gtk.Window): return separator def _create_action_box(self): - separator = self._create_separator() - self._root.append(separator) + self._action_box_separator = self._create_separator() + self._root.append(self._action_box_separator) self._action_box = hippo.CanvasBox( orientation=hippo.ORIENTATION_HORIZONTAL) @@ -71,5 +72,8 @@ class Menu(gtk.Window): icon.connect('activated', self._action_clicked_cb, action_id) self._action_box.append(icon) + def remove_action(self, icon): + self._action_box.remove(icon) + def _action_clicked_cb(self, icon, action): self.emit('action', action) -- cgit v0.9.1