Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/shell/home
diff options
context:
space:
mode:
authorMarco Pesenti Gritti <marco@localhost.localdomain>2006-08-18 23:29:42 (GMT)
committer Marco Pesenti Gritti <marco@localhost.localdomain>2006-08-18 23:29:42 (GMT)
commit24dae31a9d1bb2141db3bfd0364f2d95219fc7fa (patch)
treeda9a75e64a4dfda0d6535959e9bf03c5aefbf213 /shell/home
parent825758018df41500182c8834dc19e7893d353b3a (diff)
Starting to create the mesh view...
Diffstat (limited to 'shell/home')
-rw-r--r--shell/home/ActivitiesModel.py60
-rw-r--r--shell/home/HomeView.py123
-rw-r--r--shell/home/HomeWindow.py35
-rw-r--r--shell/home/Makefile.am6
-rw-r--r--shell/home/MeshView.py20
-rw-r--r--shell/home/__init__.py0
6 files changed, 244 insertions, 0 deletions
diff --git a/shell/home/ActivitiesModel.py b/shell/home/ActivitiesModel.py
new file mode 100644
index 0000000..c46256d
--- /dev/null
+++ b/shell/home/ActivitiesModel.py
@@ -0,0 +1,60 @@
+import gobject
+
+from sugar.presence.PresenceService import PresenceService
+from ActivityRegistry import ActivityRegistry
+
+class ActivityInfo:
+ def __init__(self, service):
+ self._service = service
+
+ def get_id(self):
+ return self._service.get_activity_id()
+
+ def get_type(self):
+ return self._service.get_type()
+
+ def get_title(self):
+ return self._service.get_published_value('title')
+
+ def get_service(self):
+ return self._service
+
+class ActivitiesModel(gobject.GObject):
+ __gsignals__ = {
+ 'activity-added': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
+ ([gobject.TYPE_PYOBJECT])),
+ 'activity-removed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
+ ([gobject.TYPE_PYOBJECT]))
+ }
+
+ def __init__(self, registry):
+ gobject.GObject.__init__(self)
+
+ self._activities = {}
+ self._registry = registry
+
+ self._pservice = PresenceService()
+ self._pservice.connect("service-appeared", self.__service_appeared_cb)
+
+ for service in self._pservice.get_services():
+ self.__check_service(service)
+
+ def has_activity(self, activity_id):
+ return self._activities.has_key(activity_id)
+
+ def add_activity(self, service):
+ activity_info = ActivityInfo(service)
+ self._activities[activity_info.get_id()] = (activity_info)
+ self.emit('activity-added', activity_info)
+
+ def __iter__(self):
+ activities = self._activities.values()
+ return activities.__iter__()
+
+ def __service_appeared_cb(self, pservice, service):
+ self.__check_service(service)
+
+ def __check_service(self, service):
+ if self._registry.get_activity(service.get_type()) != None:
+ if not self.has_activity(service.get_activity_id()):
+ self.add_activity(service)
diff --git a/shell/home/HomeView.py b/shell/home/HomeView.py
new file mode 100644
index 0000000..29f2e23
--- /dev/null
+++ b/shell/home/HomeView.py
@@ -0,0 +1,123 @@
+import gtk
+import goocanvas
+import wnck
+
+from sugar.canvas.IconItem import IconItem
+from sugar.canvas.DonutItem import DonutItem
+from sugar.canvas.DonutItem import PieceItem
+from sugar.canvas.DonutItem import PieceIcon
+
+class TasksItem(DonutItem):
+ def __init__(self, shell):
+ DonutItem.__init__(self, 250)
+
+ self._items = {}
+
+ shell.connect('activity_opened', self.__activity_opened_cb)
+ shell.connect('activity_closed', self.__activity_closed_cb)
+
+ def __activity_opened_cb(self, shell, activity):
+ self._add(activity)
+
+ def __activity_closed_cb(self, shell, activity):
+ self._remove(activity)
+
+ def _remove(self, activity):
+ item = self._items[activity.get_id()]
+ self.remove_piece(item)
+ del self._items[activity.get_id()]
+
+ def _add(self, activity):
+ icon_name = activity.get_icon_name()
+ item = self.add_piece(100 / 8, icon_name, 'blue')
+
+ # FIXME This really sucks. Fix goocanvas event handling.
+ item.set_data('activity', activity)
+ item.get_icon().set_data('activity', activity)
+
+ self._items[activity.get_id()] = item
+
+class ActivityItem(IconItem):
+ def __init__(self, activity):
+ IconItem.__init__(self, activity.get_icon(), 'white', 30)
+ self._activity = activity
+
+ def get_activity_id(self):
+ return self._activity.get_id()
+
+class ActivityBar(goocanvas.Group):
+ def __init__(self, shell):
+ goocanvas.Group.__init__(self)
+
+ self._shell = shell
+
+ registry = shell.get_registry()
+ for activity in registry.list_activities():
+ if activity.get_show_launcher():
+ self.add_activity(activity)
+
+ def add_activity(self, activity):
+ item = ActivityItem(activity)
+ self.add_child(item)
+
+class Background(goocanvas.Group):
+ def __init__(self):
+ goocanvas.Group.__init__(self)
+
+ item = goocanvas.Rect(width=1200, height=900,
+ fill_color="#4f4f4f")
+ self.add_child(item)
+
+ item = goocanvas.Rect(x=50, y=50, width=1100, height=800,
+ line_width=0, fill_color="#d8d8d8",
+ radius_x=30, radius_y=30)
+ self.add_child(item)
+
+ item = goocanvas.Text(text="My Activities",
+ x=60, y=10, fill_color="white",
+ font="Sans 21")
+ self.add_child(item)
+
+class Model(goocanvas.CanvasModelSimple):
+ def __init__(self, shell):
+ goocanvas.CanvasModelSimple.__init__(self)
+
+ root = self.get_root_item()
+
+ background = Background()
+ root.add_child(background)
+
+ activity_bar = ActivityBar(shell)
+ activity_bar.translate(50, 860)
+ root.add_child(activity_bar)
+
+ tasks = TasksItem(shell)
+ tasks.translate(600, 450)
+ root.add_child(tasks)
+
+class HomeView(goocanvas.CanvasView):
+ def __init__(self, shell):
+ goocanvas.CanvasView.__init__(self)
+ self._shell = shell
+
+ self.connect("item_view_created", self.__item_view_created_cb)
+
+ canvas_model = Model(shell)
+ self.set_model(canvas_model)
+
+ def __item_view_created_cb(self, view, item_view, item):
+ if isinstance(item, ActivityItem):
+ item_view.connect("button_press_event",
+ self.__activity_button_press_cb,
+ item.get_activity_id())
+ elif isinstance(item, PieceItem) or \
+ isinstance(item, PieceIcon):
+ item_view.connect("button_press_event",
+ self.__task_button_press_cb)
+
+ def __activity_button_press_cb(self, view, target, event, activity_id):
+ self._shell.start_activity(activity_id)
+
+ def __task_button_press_cb(self, view, target, event):
+ activity = view.get_item().get_data('activity')
+ activity.present()
diff --git a/shell/home/HomeWindow.py b/shell/home/HomeWindow.py
new file mode 100644
index 0000000..d66020e
--- /dev/null
+++ b/shell/home/HomeWindow.py
@@ -0,0 +1,35 @@
+import gtk
+
+from home.MeshView import MeshView
+from home.HomeView import HomeView
+
+class HomeWindow(gtk.Window):
+ def __init__(self, shell):
+ gtk.Window.__init__(self)
+
+ self.connect('realize', self.__realize_cb)
+
+ self._nb = gtk.Notebook()
+ self._nb.set_show_tabs(False)
+ self._nb.set_show_border(False)
+
+ home_view = HomeView(shell)
+ self._nb.append_page(home_view)
+ self._setup_canvas(home_view)
+ home_view.show()
+
+ mesh_view = MeshView(shell)
+ self._setup_canvas(mesh_view)
+ self._nb.append_page(mesh_view)
+ mesh_view.show()
+
+ self.add(self._nb)
+ self._nb.show()
+
+ def _setup_canvas(self, canvas):
+ canvas.set_bounds(0, 0, 1200, 900)
+ canvas.set_scale(float(800) / float(1200))
+ canvas.set_size_request(800, 600)
+
+ def __realize_cb(self, window):
+ self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DESKTOP)
diff --git a/shell/home/Makefile.am b/shell/home/Makefile.am
new file mode 100644
index 0000000..184570e
--- /dev/null
+++ b/shell/home/Makefile.am
@@ -0,0 +1,6 @@
+sugardir = $(pkgdatadir)/shell
+sugar_PYTHON = \
+ __init__.py \
+ MeshView.py \
+ HomeView.py \
+ Window.py
diff --git a/shell/home/MeshView.py b/shell/home/MeshView.py
new file mode 100644
index 0000000..7b2e5f6
--- /dev/null
+++ b/shell/home/MeshView.py
@@ -0,0 +1,20 @@
+import goocanvas
+
+class Model(goocanvas.CanvasModelSimple):
+ def __init__(self, shell):
+ goocanvas.CanvasModelSimple.__init__(self)
+
+ root = self.get_root_item()
+
+class MeshView(goocanvas.CanvasView):
+ def __init__(self, shell):
+ goocanvas.CanvasView.__init__(self)
+ self._shell = shell
+
+ self.connect("item_view_created", self.__item_view_created_cb)
+
+ canvas_model = Model(shell)
+ self.set_model(canvas_model)
+
+ def __item_view_created_cb(self, view, item_view, item):
+ pass
diff --git a/shell/home/__init__.py b/shell/home/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/shell/home/__init__.py