Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomeu Vizoso <tomeu@tomeuvizoso.net>2006-11-05 18:52:46 (GMT)
committer Tomeu Vizoso <tomeu@tomeuvizoso.net>2006-11-05 18:52:46 (GMT)
commita7e4092b0e4f3d30a21ee5a7982aecd5252a0822 (patch)
treedea15838e34861e902ebe991cbeabb1a72599bcd
parentb9f75c14727b30b9cd07b18c2c15f15d71201bb4 (diff)
Created SugarDownloadManager and ClipboardService's wrapper. Show and hide the frame when adding an object to the clipboard.
-rw-r--r--.gitignore1
-rw-r--r--activities/web/webactivity.py50
-rw-r--r--configure.ac1
-rw-r--r--lib/python/_sugar.defs18
-rw-r--r--lib/python/_sugar.override2
-rw-r--r--lib/src/Makefile.am4
-rw-r--r--lib/src/SugarContentHandler.cpp3
-rw-r--r--lib/src/SugarDownload.cpp14
-rw-r--r--lib/src/sugar-browser-chandler.h46
-rw-r--r--lib/src/sugar-download-manager.c (renamed from lib/src/sugar-browser-chandler.c)52
-rw-r--r--lib/src/sugar-download-manager.h55
-rw-r--r--services/clipboard/ClipboardService.py18
-rw-r--r--shell/view/ClipboardIcon.py22
-rw-r--r--shell/view/ClipboardMenu.py30
-rw-r--r--shell/view/frame/ClipboardBox.py47
-rw-r--r--shell/view/frame/Frame.py2
-rw-r--r--sugar/Makefile.am2
-rw-r--r--sugar/clipboard/ClipboardService.py73
-rw-r--r--sugar/clipboard/Makefile.am5
-rw-r--r--sugar/clipboard/__init__.py0
-rw-r--r--sugar/graphics/Makefile.am1
-rw-r--r--sugar/graphics/menu.py8
22 files changed, 270 insertions, 184 deletions
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 <nsCExternalHandlerService.h>
#include <nsIFile.h>
-#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 <glib-object.h>
-#include <glib.h>
-
-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 <glib-object.h>
+#include <glib.h>
+
+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)