diff options
author | Marco 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) |
commit | 24dae31a9d1bb2141db3bfd0364f2d95219fc7fa (patch) | |
tree | da9a75e64a4dfda0d6535959e9bf03c5aefbf213 /shell/home | |
parent | 825758018df41500182c8834dc19e7893d353b3a (diff) |
Starting to create the mesh view...
Diffstat (limited to 'shell/home')
-rw-r--r-- | shell/home/ActivitiesModel.py | 60 | ||||
-rw-r--r-- | shell/home/HomeView.py | 123 | ||||
-rw-r--r-- | shell/home/HomeWindow.py | 35 | ||||
-rw-r--r-- | shell/home/Makefile.am | 6 | ||||
-rw-r--r-- | shell/home/MeshView.py | 20 | ||||
-rw-r--r-- | shell/home/__init__.py | 0 |
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 |