Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/shell
diff options
context:
space:
mode:
authorMarco Pesenti Gritti <marco@localhost.localdomain>2006-08-19 09:56:49 (GMT)
committer Marco Pesenti Gritti <marco@localhost.localdomain>2006-08-19 09:56:49 (GMT)
commit58ddb555c44a02f33ddf9ef549db0a2395c82da1 (patch)
tree2af84134fddd64c77a90b0e4f45aedf7636641da /shell
parente5eef2e183fc13a0d7bbc1faff7c6c48c75671ae (diff)
parentf8c4f0bd66309fda38047d47fb57c47409dcecf0 (diff)
Merge demo4 branch
Diffstat (limited to 'shell')
-rw-r--r--shell/ActivityHost.py6
-rw-r--r--shell/ActivityRegistry.py12
-rw-r--r--shell/ChatController.py3
-rw-r--r--shell/HomeWindow.py165
-rw-r--r--shell/Makefile.am5
-rwxr-xr-xshell/Shell.py58
-rw-r--r--shell/data/Makefile.am6
-rw-r--r--shell/data/activity-placeholder.pngbin3163 -> 0 bytes
-rw-r--r--shell/data/home-background.pngbin70665 -> 0 bytes
-rw-r--r--shell/data/kbdconfig6
-rw-r--r--shell/home/FriendsModel.py40
-rw-r--r--shell/home/FriendsView.py45
-rw-r--r--shell/home/HomeModel.py13
-rw-r--r--shell/home/HomeView.py128
-rw-r--r--shell/home/HomeWindow.py48
-rw-r--r--shell/home/Makefile.am10
-rw-r--r--shell/home/MeshModel.py (renamed from shell/ActivitiesModel.py)2
-rw-r--r--shell/home/MeshView.py63
-rw-r--r--shell/home/__init__.py0
-rw-r--r--shell/session/Emulator.py4
-rw-r--r--shell/sugar-zoom14
21 files changed, 442 insertions, 186 deletions
diff --git a/shell/ActivityHost.py b/shell/ActivityHost.py
index 639c589..84577c1 100644
--- a/shell/ActivityHost.py
+++ b/shell/ActivityHost.py
@@ -20,9 +20,15 @@ class ActivityHost:
self._gdk_window = gtk.gdk.window_foreign_new(self._xid)
self._people_window = PeopleWindow(shell, self)
+ info = self._shell.get_registry().get_activity(self._default_type)
+ self._icon_name = info.get_icon()
+
def get_id(self):
return self._id
+ def get_icon_name(self):
+ return self._icon_name
+
def share(self):
self._people_window.share()
self._activity.share()
diff --git a/shell/ActivityRegistry.py b/shell/ActivityRegistry.py
index acf379c..5ff0059 100644
--- a/shell/ActivityRegistry.py
+++ b/shell/ActivityRegistry.py
@@ -8,6 +8,7 @@ class ActivityModule:
def __init__(self, name, activity_id, directory):
self._name = name
+ self._icon = None
self._id = activity_id
self._directory = directory
self._show_launcher = False
@@ -20,6 +21,14 @@ class ActivityModule:
"""Get the activity identifier"""
return self._id
+ def get_icon(self):
+ """Get the activity icon name"""
+ return self._icon
+
+ def set_icon(self, icon):
+ """Set the activity icon name"""
+ self._icon = icon
+
def get_directory(self):
"""Get the path to activity directory."""
return self._directory
@@ -97,6 +106,9 @@ class ActivityRegistry:
if cp.has_option('Activity', 'show_launcher'):
module.set_show_launcher(True)
+ if cp.has_option('Activity', 'icon'):
+ module.set_icon(cp.get('Activity', 'icon'))
+
module.set_default_type(default_type)
return True
diff --git a/shell/ChatController.py b/shell/ChatController.py
index 96d2fd0..00bab80 100644
--- a/shell/ChatController.py
+++ b/shell/ChatController.py
@@ -13,7 +13,8 @@ class ChatController:
self._shell.connect('activity-closed', self.__activity_closed_cb)
- def __activity_closed_cb(self, shell, activity_id):
+ def __activity_closed_cb(self, shell, activity):
+ activity_id = activity.get_id()
if self._id_to_name.has_key(activity_id):
name = self._id_to_name[activity_id]
del self._name_to_chat[name]
diff --git a/shell/HomeWindow.py b/shell/HomeWindow.py
deleted file mode 100644
index 25a777b..0000000
--- a/shell/HomeWindow.py
+++ /dev/null
@@ -1,165 +0,0 @@
-from gettext import gettext as _
-
-import gtk
-import wnck
-
-from sugar.activity import ActivityFactory
-from ActivitiesModel import ActivitiesModel
-from sugar.presence.PresenceService import PresenceService
-
-class NewActivityButton(gtk.MenuToolButton):
- def __init__(self, home):
- gtk.MenuToolButton.__init__(self, None, _('New Activity'))
-
- self._home = home
-
- self.set_menu(gtk.Menu())
- self.connect("show-menu", self.__show_menu_cb)
-
- def __show_menu_cb(self, button):
- menu = gtk.Menu()
-
- for module in self._home.list_activities():
- if module.get_show_launcher():
- item = gtk.MenuItem(module.get_name(), False)
- activity_id = module.get_id()
- item.connect('activate',
- self.__menu_item_activate_cb, activity_id)
- menu.append(item)
- item.show()
-
- self.set_menu(menu)
-
- def __menu_item_activate_cb(self, item, activity_id):
- self._home.create(activity_id)
-
-class Toolbar(gtk.Toolbar):
- def __init__(self, shell):
- gtk.Toolbar.__init__(self)
-
- new_activity_button = NewActivityButton(shell)
- self.insert(new_activity_button, -1)
- new_activity_button.show()
-
-class ActivitiesGrid(gtk.VBox):
- def __init__(self, shell, model):
- gtk.VBox.__init__(self, shell)
-
- self._shell = shell
- self._buttons = {}
-
- for activity in model:
- self._add(activity)
- model.connect('activity-added', self.__activity_added_cb)
- model.connect('activity-removed', self.__activity_removed_cb)
-
- def __activity_added_cb(self, model, activity):
- self._add(activity)
-
- def __activity_removed_cb(self, model, activity):
- self._remove(window)
-
- def _remove(self, activity):
- button = self._buttons[activity.get_id()]
- self.remove(button)
-
- def _add(self, activity):
- button = gtk.Button(activity.get_title())
- button.connect('clicked', self.__button_clicked_cb, activity)
- self.pack_start(button, False)
- button.show()
-
- self._buttons[activity.get_id()] = button
-
- def __button_clicked_cb(self, button, info):
- self._shell.join_activity(info.get_service())
-
-class TasksGrid(gtk.VBox):
- def __init__(self, home):
- gtk.VBox.__init__(self)
-
- self._home = home
- self._buttons = {}
-
- screen = wnck.screen_get_default()
- for window in screen.get_windows():
- if not window.is_skip_tasklist():
- self._add(window)
- screen.connect('window_opened', self.__window_opened_cb)
- screen.connect('window_closed', self.__window_closed_cb)
-
- def __window_opened_cb(self, screen, window):
- if not window.is_skip_tasklist():
- self._add(window)
-
- def __window_closed_cb(self, screen, window):
- if not window.is_skip_tasklist():
- self._remove(window)
-
- def _remove(self, window):
- button = self._buttons[window.get_xid()]
- self.remove(button)
-
- def __window_name_changed_cb(self, window, button):
- button.set_label(window.get_name())
-
- def _add(self, window):
- button = gtk.Button(window.get_name())
- window.connect('name-changed', self.__window_name_changed_cb, button)
- button.connect('clicked', self.__button_clicked_cb, window)
- self.pack_start(button, False)
- button.show()
-
- self._buttons[window.get_xid()] = button
-
- def __button_clicked_cb(self, button, window):
- self._home.activate(window)
-
-class HomeWindow(gtk.Window):
- def __init__(self, shell):
- gtk.Window.__init__(self)
-
- self._shell = shell
-
- self.connect('realize', self.__realize_cb)
-
- vbox = gtk.VBox(False, 6)
- vbox.set_border_width(24)
-
- toolbar = Toolbar(self)
- vbox.pack_start(toolbar, False)
- toolbar.show()
-
- label = gtk.Label('Open activities:')
- label.set_alignment(0.0, 0.5)
- vbox.pack_start(label, False)
- label.show()
-
- grid = TasksGrid(self)
- vbox.pack_start(grid)
- grid.show()
-
- label = gtk.Label('Shared activities:')
- label.set_alignment(0.0, 0.5)
- vbox.pack_start(label, False)
- label.show()
-
- model = ActivitiesModel(shell.get_registry())
- grid = ActivitiesGrid(shell, model)
- vbox.pack_start(grid)
- grid.show()
-
- self.add(vbox)
- vbox.show()
-
- def __realize_cb(self, window):
- self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DESKTOP)
-
- def list_activities(self):
- return self._shell.get_registry().list_activities()
-
- def create(self, activity_name):
- self._shell.start_activity(activity_name)
-
- def activate(self, activity_window):
- activity_window.activate(gtk.get_current_event_time())
diff --git a/shell/Makefile.am b/shell/Makefile.am
index 5642a4a..61483ae 100644
--- a/shell/Makefile.am
+++ b/shell/Makefile.am
@@ -1,4 +1,4 @@
-SUBDIRS = data session PresenceService
+SUBDIRS = data session home PresenceService
bin_SCRIPTS = \
sugar \
@@ -6,18 +6,17 @@ bin_SCRIPTS = \
sugar-activity-factory \
sugar-console \
sugar-people \
+ sugar-zoom \
sugar-presence-service
sugardir = $(pkgdatadir)/shell
sugar_PYTHON = \
__init__.py \
- ActivitiesModel.py \
ActivityHost.py \
ActivityRegistry.py \
ChatController.py \
ConsoleWindow.py \
Owner.py \
- HomeWindow.py \
PeopleWindow.py \
PresenceView.py \
Shell.py
diff --git a/shell/Shell.py b/shell/Shell.py
index 614e1d1..5876f70 100755
--- a/shell/Shell.py
+++ b/shell/Shell.py
@@ -8,7 +8,8 @@ import gobject
import wnck
from ActivityRegistry import ActivityRegistry
-from HomeWindow import HomeWindow
+from home.HomeWindow import HomeWindow
+from home.HomeModel import HomeModel
from sugar import env
from Owner import ShellOwner
from sugar.presence.PresenceService import PresenceService
@@ -37,9 +38,25 @@ class ShellDbusService(dbus.service.Object):
def show_console(self):
gobject.idle_add(self.__show_console_idle)
+ @dbus.service.method('com.redhat.Sugar.Shell')
+ def zoom_in(self):
+ self._shell.zoom_in()
+
+ @dbus.service.method('com.redhat.Sugar.Shell')
+ def zoom_out(self):
+ self._shell.zoom_out()
+
class Shell(gobject.GObject):
+ ZOOM_MESH = 0
+ ZOOM_FRIENDS = 1
+ ZOOM_HOME = 2
+ ZOOM_ACTIVITY = 3
+
__gsignals__ = {
- 'activity-closed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([str]))
+ 'activity-opened': (gobject.SIGNAL_RUN_FIRST,
+ gobject.TYPE_NONE, ([gobject.TYPE_PYOBJECT])),
+ 'activity-closed': (gobject.SIGNAL_RUN_FIRST,
+ gobject.TYPE_NONE, ([gobject.TYPE_PYOBJECT]))
}
def __init__(self, registry):
@@ -48,6 +65,7 @@ class Shell(gobject.GObject):
self._screen = wnck.screen_get_default()
self._registry = registry
self._hosts = {}
+ self._zoom_level = Shell.ZOOM_HOME
def start(self):
session_bus = dbus.SessionBus()
@@ -60,7 +78,8 @@ class Shell(gobject.GObject):
self._chat_controller = ChatController(self)
self._chat_controller.listen()
- self._home_window = HomeWindow(self)
+ home_model = HomeModel(self._registry)
+ self._home_window = HomeWindow(self, home_model)
self._home_window.show()
self._screen.connect('window-opened', self.__window_opened_cb)
@@ -71,14 +90,16 @@ class Shell(gobject.GObject):
def __window_opened_cb(self, screen, window):
if window.get_window_type() == wnck.WINDOW_NORMAL:
- self._hosts[window.get_xid()] = ActivityHost(self, window)
+ host = ActivityHost(self, window)
+ self._hosts[window.get_xid()] = host
+ self.emit('activity-opened', host)
def __window_closed_cb(self, screen, window):
if window.get_window_type() == wnck.WINDOW_NORMAL:
xid = window.get_xid()
- activity = self._hosts[xid]
- self.emit('activity-closed', activity.get_id())
+ host = self._hosts[xid]
+ self.emit('activity-closed', host)
del self._hosts[xid]
@@ -154,3 +175,28 @@ class Shell(gobject.GObject):
def get_chat_controller(self):
return self._chat_controller
+
+ def _set_zoom_level(self, level):
+ self._zoom_level = level
+
+ if level == Shell.ZOOM_ACTIVITY:
+ self._screen.toggle_showing_desktop(False)
+ else:
+ self._screen.toggle_showing_desktop(True)
+
+ if level == Shell.ZOOM_HOME:
+ self._home_window.set_view(HomeWindow.HOME_VIEW)
+ elif level == Shell.ZOOM_FRIENDS:
+ self._home_window.set_view(HomeWindow.FRIENDS_VIEW)
+ elif level == Shell.ZOOM_MESH:
+ self._home_window.set_view(HomeWindow.MESH_VIEW)
+
+ def zoom_in(self):
+ level = self._zoom_level + 1
+ if level <= Shell.ZOOM_ACTIVITY:
+ self._set_zoom_level(level)
+
+ def zoom_out(self):
+ level = self._zoom_level - 1
+ if level >= Shell.ZOOM_MESH:
+ self._set_zoom_level(level)
diff --git a/shell/data/Makefile.am b/shell/data/Makefile.am
index fa14d6b..1f0f9c0 100644
--- a/shell/data/Makefile.am
+++ b/shell/data/Makefile.am
@@ -1,8 +1,4 @@
confdir = $(pkgdatadir)
conf_DATA = kbdconfig
-imagesdir = $(pkgdatadir)
-images_DATA = \
- home-background.png
-
-EXTRA_DIST = $(conf_DATA) $(images_DATA)
+EXTRA_DIST = $(conf_DATA)
diff --git a/shell/data/activity-placeholder.png b/shell/data/activity-placeholder.png
deleted file mode 100644
index 9fea97b..0000000
--- a/shell/data/activity-placeholder.png
+++ /dev/null
Binary files differ
diff --git a/shell/data/home-background.png b/shell/data/home-background.png
deleted file mode 100644
index 346b5dc..0000000
--- a/shell/data/home-background.png
+++ /dev/null
Binary files differ
diff --git a/shell/data/kbdconfig b/shell/data/kbdconfig
index ef9d96a..71d8032 100644
--- a/shell/data/kbdconfig
+++ b/shell/data/kbdconfig
@@ -5,7 +5,7 @@
<Alt>n=next
<Alt>p=prev
<Alt>c=close
-f1=desktop
-f2=!sugar-people
-f3=!sugar-console
+f1=!sugar-zoom out
+f2=!sugar-zoom in
+f3=!sugar-people
f4=!sugar-activity org.sugar.Terminal
diff --git a/shell/home/FriendsModel.py b/shell/home/FriendsModel.py
new file mode 100644
index 0000000..6f18083
--- /dev/null
+++ b/shell/home/FriendsModel.py
@@ -0,0 +1,40 @@
+import gobject
+
+from sugar.presence.PresenceService import PresenceService
+
+class Friend:
+ def __init__(self, buddy):
+ self._buddy = buddy
+
+ def get_name(self):
+ return self._buddy.get_name()
+
+class FriendsModel(gobject.GObject):
+ __gsignals__ = {
+ 'friend-added': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
+ ([gobject.TYPE_PYOBJECT])),
+ 'friend-removed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
+ ([gobject.TYPE_PYOBJECT]))
+ }
+
+ def __init__(self):
+ gobject.GObject.__init__(self)
+
+ self._friends = []
+
+ self._pservice = PresenceService()
+ self._pservice.connect("buddy-appeared", self.__buddy_appeared_cb)
+
+ for buddy in self._pservice.get_buddies():
+ self.add_friend(buddy)
+
+ def add_friend(self, buddy):
+ friend = Friend(buddy)
+ self._friends.append(friend)
+ self.emit('friend-added', friend)
+
+ def __iter__(self):
+ return self._friends.__iter__()
+
+ def __buddy_appeared_cb(self, pservice, buddy):
+ self.add_friend(buddy)
diff --git a/shell/home/FriendsView.py b/shell/home/FriendsView.py
new file mode 100644
index 0000000..b12616a
--- /dev/null
+++ b/shell/home/FriendsView.py
@@ -0,0 +1,45 @@
+import random
+
+import goocanvas
+
+from sugar.canvas.IconItem import IconItem
+
+class Model(goocanvas.CanvasModelSimple):
+ def __init__(self, data_model):
+ goocanvas.CanvasModelSimple.__init__(self)
+
+ root = self.get_root_item()
+
+ item = goocanvas.Rect(width=1200, height=900,
+ fill_color="#d8d8d8")
+ root.add_child(item)
+
+ for friend in data_model:
+ self.add_friend(friend)
+
+ data_model.connect('friend-added', self.__friend_added_cb)
+
+ def add_friend(self, friend):
+ root = self.get_root_item()
+
+ icon = IconItem('stock-buddy', 'green', 48)
+ icon.set_property('x', random.random() * 1100)
+ icon.set_property('y', random.random() * 800)
+
+ root.add_child(icon)
+
+ def __friend_added_cb(self, data_model, friend):
+ self.add_friend(friend)
+
+class FriendsView(goocanvas.CanvasView):
+ def __init__(self, shell, data_model):
+ goocanvas.CanvasView.__init__(self)
+ self._shell = shell
+
+ self.connect("item_view_created", self.__item_view_created_cb)
+
+ canvas_model = Model(data_model)
+ self.set_model(canvas_model)
+
+ def __item_view_created_cb(self, view, item_view, item):
+ pass
diff --git a/shell/home/HomeModel.py b/shell/home/HomeModel.py
new file mode 100644
index 0000000..5f4965d
--- /dev/null
+++ b/shell/home/HomeModel.py
@@ -0,0 +1,13 @@
+from home.FriendsModel import FriendsModel
+from home.MeshModel import MeshModel
+
+class HomeModel:
+ def __init__(self, registry):
+ self._friends = FriendsModel()
+ self._mesh = MeshModel(registry)
+
+ def get_friends(self):
+ return self._friends
+
+ def get_mesh(self):
+ return self._mesh
diff --git a/shell/home/HomeView.py b/shell/home/HomeView.py
new file mode 100644
index 0000000..09627b6
--- /dev/null
+++ b/shell/home/HomeView.py
@@ -0,0 +1,128 @@
+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):
+ ICON_SIZE = 30
+
+ def __init__(self, activity):
+ IconItem.__init__(self, activity.get_icon(), 'white',
+ ActivityItem.ICON_SIZE)
+ 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)
+ x = (ActivityItem.ICON_SIZE + 6) * self.get_n_children()
+ item.set_property('x', x)
+ 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..86c83ab
--- /dev/null
+++ b/shell/home/HomeWindow.py
@@ -0,0 +1,48 @@
+import gtk
+
+from home.MeshView import MeshView
+from home.HomeView import HomeView
+from home.FriendsView import FriendsView
+
+class HomeWindow(gtk.Window):
+ HOME_VIEW = 0
+ FRIENDS_VIEW = 1
+ MESH_VIEW = 2
+
+ def __init__(self, shell, model):
+ 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()
+
+ friends_view = FriendsView(shell, model.get_friends())
+ self._nb.append_page(friends_view)
+ self._setup_canvas(friends_view)
+ friends_view.show()
+
+ mesh_view = MeshView(shell, model.get_mesh())
+ self._setup_canvas(mesh_view)
+ self._nb.append_page(mesh_view)
+ mesh_view.show()
+
+ self.add(self._nb)
+ self._nb.show()
+
+ def set_view(self, view):
+ self._nb.set_current_page(view)
+
+ 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..2a86a26
--- /dev/null
+++ b/shell/home/Makefile.am
@@ -0,0 +1,10 @@
+sugardir = $(pkgdatadir)/shell/home
+sugar_PYTHON = \
+ __init__.py \
+ FriendsModel.py \
+ FriendsView.py \
+ MeshModel.py \
+ MeshView.py \
+ HomeView.py \
+ HomeWindow.py \
+ HomeModel.py
diff --git a/shell/ActivitiesModel.py b/shell/home/MeshModel.py
index c46256d..b2163ac 100644
--- a/shell/ActivitiesModel.py
+++ b/shell/home/MeshModel.py
@@ -19,7 +19,7 @@ class ActivityInfo:
def get_service(self):
return self._service
-class ActivitiesModel(gobject.GObject):
+class MeshModel(gobject.GObject):
__gsignals__ = {
'activity-added': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
([gobject.TYPE_PYOBJECT])),
diff --git a/shell/home/MeshView.py b/shell/home/MeshView.py
new file mode 100644
index 0000000..bd8f230
--- /dev/null
+++ b/shell/home/MeshView.py
@@ -0,0 +1,63 @@
+import random
+
+import goocanvas
+
+from sugar.canvas.IconItem import IconItem
+
+class ActivityItem(IconItem):
+ def __init__(self, activity, registry):
+ info = registry.get_activity(activity.get_type())
+ icon_name = info.get_icon()
+
+ IconItem.__init__(self, icon_name, 'green', 48)
+
+ self._activity = activity
+
+ def get_service(self):
+ return self._activity.get_service()
+
+class Model(goocanvas.CanvasModelSimple):
+ def __init__(self, data_model, registry):
+ goocanvas.CanvasModelSimple.__init__(self)
+ self._registry = registry
+
+ root = self.get_root_item()
+
+ item = goocanvas.Rect(width=1200, height=900,
+ fill_color="#d8d8d8")
+ root.add_child(item)
+
+ for activity in data_model:
+ self.add_activity(activity)
+
+ data_model.connect('activity-added', self.__activity_added_cb)
+
+ def add_activity(self, activity):
+ root = self.get_root_item()
+
+ item = ActivityItem(activity, self._registry)
+ item.set_property('x', random.random() * 1100)
+ item.set_property('y', random.random() * 800)
+ root.add_child(item)
+
+ def __activity_added_cb(self, data_model, activity):
+ self.add_activity(activity)
+
+class MeshView(goocanvas.CanvasView):
+ def __init__(self, shell, data_model):
+ goocanvas.CanvasView.__init__(self)
+ self._shell = shell
+
+ self.connect("item_view_created", self.__item_view_created_cb)
+
+ canvas_model = Model(data_model, shell.get_registry())
+ self.set_model(canvas_model)
+
+ def __activity_button_press_cb(self, view, target, event, service):
+ self._shell.join_activity(service)
+
+ 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_service())
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
diff --git a/shell/session/Emulator.py b/shell/session/Emulator.py
index 2bb2b3a..c18d92e 100644
--- a/shell/session/Emulator.py
+++ b/shell/session/Emulator.py
@@ -30,7 +30,7 @@ def get_display_number():
class XephyrProcess(Process):
def __init__(self):
self._display = get_display_number()
- cmd = 'Xephyr :%d -ac -screen 640x480' % (self._display)
+ cmd = 'Xephyr :%d -ac -screen 800x600' % (self._display)
Process.__init__(self, cmd)
def get_name(self):
@@ -43,7 +43,7 @@ class XephyrProcess(Process):
class XnestProcess(Process):
def __init__(self):
self._display = get_display_number()
- cmd = 'Xnest :%d -ac -geometry 640x480' % (self._display)
+ cmd = 'Xnest :%d -ac -geometry 800x600' % (self._display)
Process.__init__(self, cmd)
def get_name(self):
diff --git a/shell/sugar-zoom b/shell/sugar-zoom
new file mode 100644
index 0000000..ee43517
--- /dev/null
+++ b/shell/sugar-zoom
@@ -0,0 +1,14 @@
+#!/usr/bin/python
+import sys
+
+import dbus
+import dbus.glib
+
+bus = dbus.SessionBus()
+proxy_obj = bus.get_object('com.redhat.Sugar.Shell', '/com/redhat/Sugar/Shell')
+shell = dbus.Interface(proxy_obj, 'com.redhat.Sugar.Shell')
+
+if sys.argv[1] == 'in':
+ shell.zoom_in()
+elif sys.argv[1] == 'out':
+ shell.zoom_out()