From a7701f6106e0549b62ccaf9f97328b0a21e3445b Mon Sep 17 00:00:00 2001
From: Tomeu Vizoso <[EMAIL PROTECTED]>
Date: Wed, 2 Apr 2008 13:48:53 +0200
Subject: [PATCH] Make Frame, Shell and ShellModel singletons and remove all those references dragged around constructors.

---
 src/main.py                      |    8 ++----
 src/model/shellmodel.py          |    9 ++++++++
 src/shellservice.py              |    9 +++++--
 src/view/BuddyIcon.py            |    5 +--
 src/view/BuddyMenu.py            |   21 ++++++++---------
 src/view/Shell.py                |   35 +++++++++++++++++++++---------
 src/view/frame/activitiestray.py |    6 ++--
 src/view/frame/devicestray.py    |    5 ++-
 src/view/frame/frame.py          |   23 ++++++++++++++------
 src/view/frame/friendstray.py    |   15 +++++++------
 src/view/frame/zoomtoolbar.py    |   29 ++++++++++++-------------
 src/view/home/FriendView.py      |    4 +-
 src/view/home/FriendsBox.py      |    8 +++---
 src/view/home/HomeBox.py         |    7 ++---
 src/view/home/HomeWindow.py      |    9 +++----
 src/view/home/MeshBox.py         |   19 ++++++++--------
 src/view/home/activitieslist.py  |   12 +++++-----
 src/view/home/activitiesring.py  |   43 +++++++++++++++++++------------------
 src/view/keyhandler.py           |   27 ++++++++++++-----------
 19 files changed, 162 insertions(+), 132 deletions(-)

diff --git a/src/main.py b/src/main.py
index e785707..c555754 100644
--- a/src/main.py
+++ b/src/main.py
@@ -32,8 +32,7 @@ from sugar import env
 from sugar import logger
 from sugar.profile import get_profile
 
-from view.Shell import Shell
-from model.shellmodel import ShellModel
+import view.Shell
 from shellservice import ShellService
 from hardware import hardwaremanager
 from intro import intro
@@ -139,9 +138,8 @@ def main():
                     print "Got Ctrl+C, continuing..."
                     break
 
-    model = ShellModel()
-    shell = Shell(model)
-    service = ShellService(shell)
+    view.Shell.initialize()
+    service = ShellService()
 
     try:
         gtk.main()
diff --git a/src/model/shellmodel.py b/src/model/shellmodel.py
index 5462e27..1834fcd 100644
--- a/src/model/shellmodel.py
+++ b/src/model/shellmodel.py
@@ -110,3 +110,12 @@ class ShellModel(gobject.GObject):
         if self._showing_desktop != showing_desktop:
             self._showing_desktop = showing_desktop
             self.notify('zoom-level')
+
+_instance = None
+
+def get_instance():
+    global _instance
+    if not _instance:
+        _instance = ShellModel()
+    return _instance
+
diff --git a/src/shellservice.py b/src/shellservice.py
index 458f941..add49d8 100644
--- a/src/shellservice.py
+++ b/src/shellservice.py
@@ -18,6 +18,9 @@
 import dbus
 import os
 
+from view import Shell
+from model import shellmodel
+
 _DBUS_SERVICE = "org.laptop.Shell"
 _DBUS_SHELL_IFACE = "org.laptop.Shell"
 _DBUS_OWNER_IFACE = "org.laptop.Shell.Owner"
@@ -46,9 +49,9 @@ class ShellService(dbus.service.Object):
 
     _rainbow = None
 
-    def __init__(self, shell):
-        self._shell = shell
-        self._shell_model = shell.get_model()
+    def __init__(self):
+        self._shell = Shell.get_instance()
+        self._shell_model = shellmodel.get_instance()
 
         self._owner = self._shell_model.get_owner()
         self._owner.connect('nick-changed', self._owner_nick_changed_cb)
diff --git a/src/view/BuddyIcon.py b/src/view/BuddyIcon.py
index be79264..ccc9c46 100644
--- a/src/view/BuddyIcon.py
+++ b/src/view/BuddyIcon.py
@@ -21,17 +21,16 @@ from sugar.graphics import style
 from view.BuddyMenu import BuddyMenu
 
 class BuddyIcon(CanvasIcon):
-    def __init__(self, shell, buddy, size=style.STANDARD_ICON_SIZE):
+    def __init__(self, buddy, size=style.STANDARD_ICON_SIZE):
         CanvasIcon.__init__(self, icon_name='computer-xo', size=size)
 
         self._greyed_out = False
-        self._shell = shell
         self._buddy = buddy
         self._buddy.connect('appeared', self._buddy_presence_change_cb)
         self._buddy.connect('disappeared', self._buddy_presence_change_cb)
         self._buddy.connect('color-changed', self._buddy_presence_change_cb)
 
-        palette = BuddyMenu(shell, buddy)
+        palette = BuddyMenu(buddy)
         self.set_palette(palette)
 
         self._update_color()
diff --git a/src/view/BuddyMenu.py b/src/view/BuddyMenu.py
index d72ed5b..2bdb6d9 100644
--- a/src/view/BuddyMenu.py
+++ b/src/view/BuddyMenu.py
@@ -24,10 +24,12 @@ from sugar.graphics.menuitem import MenuItem
 from sugar.graphics.icon import Icon
 from sugar.presence import presenceservice
 
+from model import shellmodel
+import view.Shell
+
 class BuddyMenu(Palette):
-    def __init__(self, shell, buddy):
+    def __init__(self, buddy):
         self._buddy = buddy
-        self._shell = shell
 
         Palette.__init__(self, buddy.get_nick())
         self._active_activity_changed_hid = None
@@ -36,15 +38,12 @@ class BuddyMenu(Palette):
         self._buddy.connect('icon-changed', self._buddy_icon_changed_cb)
         self._buddy.connect('nick-changed', self._buddy_nick_changed_cb)
 
-        owner = self._get_shell_model().get_owner()
+        owner = shellmodel.get_instance().get_owner()
         if not buddy.is_owner():
             self._add_items()
 
-    def _get_shell_model(self):
-        return self._shell.get_model()
-
     def _get_home_model(self):
-        return self._get_shell_model().get_home()
+        return shellmodel.get_instance().get_home()
 
     def __destroy_cb(self, menu):
         if self._active_activity_changed_hid is not None:
@@ -54,7 +53,7 @@ class BuddyMenu(Palette):
     def _add_items(self):
         pservice = presenceservice.get_instance()
 
-        friends = self._get_shell_model().get_friends()
+        friends = shellmodel.get_instance().get_friends()
         if friends.has_buddy(self._buddy):
             menu_item = MenuItem(_('Remove friend'), 'list-remove')
             menu_item.connect('activate', self._remove_friend_cb)
@@ -108,14 +107,14 @@ class BuddyMenu(Palette):
         self.set_primary_text(nick)
 
     def _make_friend_cb(self, menuitem):
-        friends = self._get_shell_model().get_friends()
+        friends = shellmodel.get_instance().get_friends()
         friends.make_friend(self._buddy)    
 
     def _remove_friend_cb(self, menuitem):
-        friends = self._get_shell_model().get_friends()
+        friends = shellmodel.get_instance().get_friends()
         friends.remove(self._buddy)
 
     def _invite_friend_cb(self, menuitem):
-        activity = self._shell.get_current_activity()
+        activity = view.Shell.get_instance().get_current_activity()
         activity.invite(self._buddy)
 
diff --git a/src/view/Shell.py b/src/view/Shell.py
index 5c4c75c..de178c5 100644
--- a/src/view/Shell.py
+++ b/src/view/Shell.py
@@ -35,10 +35,10 @@ from sugar import profile
 from sugar import env
 
 from view.ActivityHost import ActivityHost
-from view.frame.frame import Frame
+from view.frame import frame
 from view.keyhandler import KeyHandler
 from view.home.HomeWindow import HomeWindow
-from model.shellmodel import ShellModel
+from model import shellmodel
 
 # #3903 - this constant can be removed and assumed to be 1 when dbus-python
 # 0.82.3 is the only version used
@@ -48,22 +48,22 @@ else:
     DBUS_PYTHON_TIMEOUT_UNITS_PER_SECOND = 1000
 
 class Shell(gobject.GObject):
-    def __init__(self, model):
+    def __init__(self):
         gobject.GObject.__init__(self)
 
         self._activities_starting = Set()
-        self._model = model
+        self._model = shellmodel.get_instance()
         self._hosts = {}
         self._screen = wnck.screen_get_default()
         self._current_host = None
         self._pending_host = None
         self._screen_rotation = 0
 
-        self._key_handler = KeyHandler(self)
+        self._key_handler = KeyHandler()
 
-        self._frame = Frame(self)
+        self._frame = frame.get_instance()
 
-        self._home_window = HomeWindow(self)
+        self._home_window = HomeWindow()
         self._home_window.show()
 
         home_model = self._model.get_home()
@@ -152,7 +152,7 @@ class Shell(gobject.GObject):
 
     def notify_launch(self, bundle_id, activity_id):
         # Zoom to Home for launch feedback
-        self.set_zoom_level(ShellModel.ZOOM_HOME)
+        self.set_zoom_level(shellmodel.ShellModel.ZOOM_HOME)
 
         home_model = self._model.get_home()
         home_model.notify_activity_launch(activity_id, bundle_id)
@@ -170,7 +170,7 @@ class Shell(gobject.GObject):
         activityfactory.create(activity_type)
 
     def take_activity_screenshot(self):
-        if self._model.get_zoom_level() != ShellModel.ZOOM_ACTIVITY:
+        if self._model.get_zoom_level() != shellmodel.ShellModel.ZOOM_ACTIVITY:
             return
         if self.get_frame().visible:
             return
@@ -191,7 +191,7 @@ class Shell(gobject.GObject):
 
         self.take_activity_screenshot()
 
-        if level == ShellModel.ZOOM_ACTIVITY:
+        if level == shellmodel.ShellModel.ZOOM_ACTIVITY:
             if self._pending_host is not None:
                 self._pending_host.present()
             self._screen.toggle_showing_desktop(False)
@@ -219,7 +219,7 @@ class Shell(gobject.GObject):
             activity.get_window().activate(1)
 
     def close_current_activity(self):
-        if self._model.get_zoom_level() != ShellModel.ZOOM_ACTIVITY:
+        if self._model.get_zoom_level() != shellmodel.ShellModel.ZOOM_ACTIVITY:
             return
 
         home_model = self._model.get_home()
@@ -282,3 +282,16 @@ class Shell(gobject.GObject):
         finally:
             os.remove(file_path)
 
+_instance = None
+
+def get_instance():
+    global _instance
+    if not _instance:
+        _instance = Shell()
+    return _instance
+
+def initialize():
+    """Create the shell view. This will initialize the whole GUI.
+    """
+    get_instance()
+
diff --git a/src/view/frame/activitiestray.py b/src/view/frame/activitiestray.py
index 03d1e81..8fb746b 100644
--- a/src/view/frame/activitiestray.py
+++ b/src/view/frame/activitiestray.py
@@ -24,6 +24,7 @@ from sugar.graphics.tray import HTray
 from sugar.graphics.xocolor import XoColor
 from sugar.graphics.radiotoolbutton import RadioToolButton
 
+from model import shellmodel
 from view.palettes import JournalPalette, CurrentActivityPalette
 from view.pulsingicon import PulsingIcon
 from view.frame.frameinvoker import FrameWidgetInvoker
@@ -66,12 +67,11 @@ class ActivityButton(RadioToolButton):
         home_activity.disconnect(self._notify_launching_hid)
 
 class ActivitiesTray(HTray):
-    def __init__(self, shell):
+    def __init__(self):
         HTray.__init__(self)
 
         self._buttons = {}
-        self._shell = shell
-        self._home_model = shell.get_model().get_home()
+        self._home_model = shellmodel.get_instance().get_home()
         self._home_model.connect('activity-added', self.__activity_added_cb)
         self._home_model.connect('activity-removed', self.__activity_removed_cb)
         self._home_model.connect('pending-activity-changed', self.__activity_changed_cb)
diff --git a/src/view/frame/devicestray.py b/src/view/frame/devicestray.py
index 67da331..8a59709 100644
--- a/src/view/frame/devicestray.py
+++ b/src/view/frame/devicestray.py
@@ -26,13 +26,14 @@ from sugar.graphics.menuitem import MenuItem
 
 from view.frame.frameinvoker import FrameWidgetInvoker
 from view.devices import deviceview
+from model import shellmodel
 
 class DevicesTray(HTray):
-    def __init__(self, shell):
+    def __init__(self):
         HTray.__init__(self)
         self._device_icons = {}
 
-        devices_model = shell.get_model().get_devices()
+        devices_model = shellmodel.get_instance().get_devices()
 
         for device in devices_model:
             self._add_device(device)
diff --git a/src/view/frame/frame.py b/src/view/frame/frame.py
index 5d06674..0cafeff 100644
--- a/src/view/frame/frame.py
+++ b/src/view/frame/frame.py
@@ -25,6 +25,7 @@ from sugar.graphics import style
 from sugar.graphics import palettegroup
 from sugar.clipboard import clipboardservice
 
+import view.Shell
 from view.frame.eventarea import EventArea
 from view.frame.activitiestray import ActivitiesTray
 from view.frame.zoomtoolbar import ZoomToolbar
@@ -88,7 +89,7 @@ class Frame(object):
     MODE_KEYBOARD = 1
     MODE_NON_INTERACTIVE = 2
 
-    def __init__(self, shell):
+    def __init__(self):
         self.mode = None
 
         self._palette_group = palettegroup.get_group('frame')
@@ -99,7 +100,6 @@ class Frame(object):
         self._top_panel = None
         self._bottom_panel = None
 
-        self._shell = shell
         self.current_position = 0.0
         self._animator = None
 
@@ -142,7 +142,7 @@ class Frame(object):
         if self._animator:
             self._animator.stop()
 
-        self._shell.take_activity_screenshot()
+        view.Shell.get_instance().take_activity_screenshot()
 
         self.mode = mode
 
@@ -168,12 +168,12 @@ class Frame(object):
         # TODO: setting box_width and hippo.PACK_EXPAND looks like a hack to me.
         # Why hippo isn't respecting the request size of these controls?
 
-        zoom_toolbar = ZoomToolbar(self._shell)
+        zoom_toolbar = ZoomToolbar()
         panel.append(hippo.CanvasWidget(widget=zoom_toolbar,
                 box_width=4*style.GRID_CELL_SIZE))
         zoom_toolbar.show()
 
-        activities_tray = ActivitiesTray(self._shell)
+        activities_tray = ActivitiesTray()
         panel.append(hippo.CanvasWidget(widget=activities_tray),
                 hippo.PACK_EXPAND)
         activities_tray.show()
@@ -184,7 +184,7 @@ class Frame(object):
         panel = self._create_panel(gtk.POS_BOTTOM)
 
         # TODO: same issue as in _create_top_panel()
-        devices_tray = DevicesTray(self._shell)
+        devices_tray = DevicesTray()
         panel.append(hippo.CanvasWidget(widget=devices_tray), hippo.PACK_EXPAND)
         devices_tray.show()
 
@@ -193,7 +193,7 @@ class Frame(object):
     def _create_right_panel(self):
         panel = self._create_panel(gtk.POS_RIGHT)
 
-        tray = FriendsTray(self._shell)
+        tray = FriendsTray()
         panel.append(hippo.CanvasWidget(widget=tray), hippo.PACK_EXPAND)
         tray.show()
 
@@ -280,3 +280,12 @@ class Frame(object):
         self._key_listener.key_press()
 
     visible = property(is_visible, None)
+
+_instance = None
+
+def get_instance():
+    global _instance
+    if not _instance:
+        _instance = Frame()
+    return _instance
+
diff --git a/src/view/frame/friendstray.py b/src/view/frame/friendstray.py
index 3e94fdb..d45bfb2 100644
--- a/src/view/frame/friendstray.py
+++ b/src/view/frame/friendstray.py
@@ -19,25 +19,26 @@ import hippo
 from sugar.presence import presenceservice
 from sugar.graphics.tray import VTray, TrayIcon
 
+import view.Shell
 from view.BuddyMenu import BuddyMenu
 from view.frame.frameinvoker import FrameWidgetInvoker
+from model import shellmodel
 from model.BuddyModel import BuddyModel
 
 class FriendIcon(TrayIcon):
-    def __init__(self, shell, buddy):
+    def __init__(self, buddy):
         TrayIcon.__init__(self, icon_name='computer-xo',
                           xo_color=buddy.get_color())
 
-        palette = BuddyMenu(shell, buddy)
+        palette = BuddyMenu(buddy)
         self.set_palette(palette)
         palette.set_group_id('frame')
         palette.props.invoker = FrameWidgetInvoker(self)
 
 class FriendsTray(VTray):
-    def __init__(self, shell):
+    def __init__(self):
         VTray.__init__(self)
 
-        self._shell = shell
         self._activity_ps = None
         self._joined_hid = -1
         self._left_hid = -1
@@ -52,7 +53,7 @@ class FriendsTray(VTray):
         # Add initial activities the PS knows about
         self._pservice.get_activities_async(reply_handler=self._get_activities_cb)
 
-        home_model = shell.get_model().get_home()
+        home_model = shellmodel.get_instance().get_home()
         home_model.connect('pending-activity-changed',
                            self._pending_activity_changed_cb)
 
@@ -66,7 +67,7 @@ class FriendsTray(VTray):
 
         model = BuddyModel(buddy=buddy)
  
-        icon = FriendIcon(self._shell, model)
+        icon = FriendIcon(model)
         self.add_item(icon)
         icon.show()
 
@@ -85,7 +86,7 @@ class FriendsTray(VTray):
         self._buddies = {}
 
     def __activity_appeared_cb(self, pservice, activity_ps):
-        activity = self._shell.get_current_activity()
+        activity = view.Shell.get_instance().get_current_activity()
         if activity and activity_ps.props.id == activity.get_id():
             self._set_activity_ps(activity_ps, True)
 
diff --git a/src/view/frame/zoomtoolbar.py b/src/view/frame/zoomtoolbar.py
index e194354..946feac 100644
--- a/src/view/frame/zoomtoolbar.py
+++ b/src/view/frame/zoomtoolbar.py
@@ -22,25 +22,24 @@ import gtk
 from sugar.graphics.palette import Palette
 from sugar.graphics.radiotoolbutton import RadioToolButton
 
+import view.Shell
 from view.frame.frameinvoker import FrameWidgetInvoker
-from model.shellmodel import ShellModel
+from model import shellmodel
 
 class ZoomToolbar(gtk.Toolbar):
-    def __init__(self, shell):
+    def __init__(self):
         gtk.Toolbar.__init__(self)
 
-        self._shell = shell
-
         self._mesh_button = self._add_button('zoom-neighborhood',
-                _('Neighborhood'), ShellModel.ZOOM_MESH)
+                _('Neighborhood'), shellmodel.ShellModel.ZOOM_MESH)
         self._groups_button = self._add_button('zoom-groups',
-                _('Group'), ShellModel.ZOOM_FRIENDS)
+                _('Group'), shellmodel.ShellModel.ZOOM_FRIENDS)
         self._home_button = self._add_button('zoom-home',
-                _('Home'), ShellModel.ZOOM_HOME)
+                _('Home'), shellmodel.ShellModel.ZOOM_HOME)
         self._activity_button = self._add_button('zoom-activity',
-                _('Activity'), ShellModel.ZOOM_ACTIVITY)
+                _('Activity'), shellmodel.ShellModel.ZOOM_ACTIVITY)
 
-        shell_model = shell.get_model()
+        shell_model = shellmodel.get_instance()
         self._set_zoom_level(shell_model.props.zoom_level)
         shell_model.connect('notify::zoom-level', self.__notify_zoom_level_cb)
 
@@ -65,21 +64,21 @@ class ZoomToolbar(gtk.Toolbar):
     def __level_clicked_cb(self, button, level):
         if not button.get_active():
             return
-        if self._shell.get_model().props.zoom_level != level:
-            self._shell.set_zoom_level(level)
+        if shellmodel.get_instance().props.zoom_level != level:
+            view.Shell.get_instance().set_zoom_level(level)
 
     def __notify_zoom_level_cb(self, model, pspec):
         self._set_zoom_level(model.props.zoom_level)
 
     def _set_zoom_level(self, new_level):
         logging.debug('new zoom level: %r' % new_level)
-        if new_level == ShellModel.ZOOM_MESH:
+        if new_level == shellmodel.ShellModel.ZOOM_MESH:
             self._mesh_button.props.active = True
-        elif new_level == ShellModel.ZOOM_FRIENDS:
+        elif new_level == shellmodel.ShellModel.ZOOM_FRIENDS:
             self._groups_button.props.active = True
-        elif new_level == ShellModel.ZOOM_HOME:
+        elif new_level == shellmodel.ShellModel.ZOOM_HOME:
             self._home_button.props.active = True
-        elif new_level == ShellModel.ZOOM_ACTIVITY:
+        elif new_level == shellmodel.ShellModel.ZOOM_ACTIVITY:
             self._activity_button.props.active = True
         else:
             raise ValueError('Invalid zoom level: %r' % (new_level))
diff --git a/src/view/home/FriendView.py b/src/view/home/FriendView.py
index 786589f..86b46c4 100644
--- a/src/view/home/FriendView.py
+++ b/src/view/home/FriendView.py
@@ -25,13 +25,13 @@ from sugar import activity
 from view.BuddyIcon import BuddyIcon
 
 class FriendView(hippo.CanvasBox):
-    def __init__(self, shell, buddy, **kwargs):
+    def __init__(self, buddy, **kwargs):
         hippo.CanvasBox.__init__(self, **kwargs)
 
         self._pservice = presenceservice.get_instance()
 
         self._buddy = buddy
-        self._buddy_icon = BuddyIcon(shell, buddy)
+        self._buddy_icon = BuddyIcon(buddy)
         self._buddy_icon.props.size = style.LARGE_ICON_SIZE
         self.append(self._buddy_icon)
 
diff --git a/src/view/home/FriendsBox.py b/src/view/home/FriendsBox.py
index 349b808..3b266be 100644
--- a/src/view/home/FriendsBox.py
+++ b/src/view/home/FriendsBox.py
@@ -24,15 +24,15 @@ from sugar.graphics import style
 from sugar.graphics.icon import CanvasIcon
 from sugar.graphics.palette import Palette
 
+from model import shellmodel
 from view.home.FriendView import FriendView
 from view.home.spreadlayout import SpreadLayout
 
 class FriendsBox(hippo.CanvasBox):
     __gtype_name__ = 'SugarFriendsBox'
-    def __init__(self, shell):
+    def __init__(self):
         hippo.CanvasBox.__init__(self, background_color=style.COLOR_WHITE.get_int())
 
-        self._shell = shell
         self._friends = {}
 
         self._layout = SpreadLayout()
@@ -45,7 +45,7 @@ class FriendsBox(hippo.CanvasBox):
         self._owner_icon.set_palette(palette)
         self._layout.add_center(self._owner_icon)
 
-        friends = self._shell.get_model().get_friends()
+        friends = shellmodel.get_instance().get_friends()
 
         for friend in friends:
             self.add_friend(friend)
@@ -54,7 +54,7 @@ class FriendsBox(hippo.CanvasBox):
         friends.connect('friend-removed', self._friend_removed_cb)
 
     def add_friend(self, buddy_info):
-        icon = FriendView(self._shell, buddy_info)
+        icon = FriendView(buddy_info)
         self._layout.add(icon)
 
         self._friends[buddy_info.get_key()] = icon
diff --git a/src/view/home/HomeBox.py b/src/view/home/HomeBox.py
index 713197d..425c1da 100644
--- a/src/view/home/HomeBox.py
+++ b/src/view/home/HomeBox.py
@@ -33,10 +33,9 @@ _LIST_VIEW = 1
 class HomeBox(hippo.CanvasBox, hippo.CanvasItem):
     __gtype_name__ = 'SugarHomeBox'
 
-    def __init__(self, shell):
+    def __init__(self):
         hippo.CanvasBox.__init__(self)
 
-        self._shell = shell
         self._ring_view = None
         self._list_view = None
         self._enable_xo_palette = False
@@ -57,7 +56,7 @@ class HomeBox(hippo.CanvasBox, hippo.CanvasItem):
                 self.remove(self._list_view)
 
             if self._ring_view is None:
-                self._ring_view = ActivitiesRing(self._shell)
+                self._ring_view = ActivitiesRing()
                 if self._enable_xo_palette:
                     self._ring_view.enable_xo_palette()
 
@@ -68,7 +67,7 @@ class HomeBox(hippo.CanvasBox, hippo.CanvasItem):
                 self.remove(self._ring_view)
 
             if self._list_view is None:
-                self._list_view = ActivitiesList(self._shell)
+                self._list_view = ActivitiesList()
 
             self.append(self._list_view, hippo.PACK_EXPAND)
         else:
diff --git a/src/view/home/HomeWindow.py b/src/view/home/HomeWindow.py
index 127b08b..607272e 100644
--- a/src/view/home/HomeWindow.py
+++ b/src/view/home/HomeWindow.py
@@ -33,12 +33,11 @@ _MESH_PAGE       = 2
 _TRANSITION_PAGE = 3
 
 class HomeWindow(gtk.Window):
-    def __init__(self, shell):
+    def __init__(self):
         gtk.Window.__init__(self)
 
         self.add_accel_group(gtk.AccelGroup())
 
-        self._shell = shell
         self._active = False
         self._level = ShellModel.ZOOM_HOME
 
@@ -60,9 +59,9 @@ class HomeWindow(gtk.Window):
         self._motion_sid = self.connect('motion-notify-event',
                                         self._motion_notify_event_cb)
 
-        self._home_box = HomeBox(shell)
-        self._friends_box = FriendsBox(shell)
-        self._mesh_box = MeshBox(shell)
+        self._home_box = HomeBox()
+        self._friends_box = FriendsBox()
+        self._mesh_box = MeshBox()
         self._transition_box = TransitionBox()
 
         self._activate_view()
diff --git a/src/view/home/MeshBox.py b/src/view/home/MeshBox.py
index 40e39c6..cd0eee9 100644
--- a/src/view/home/MeshBox.py
+++ b/src/view/home/MeshBox.py
@@ -35,12 +35,14 @@ from sugar import profile
 from model import accesspointmodel
 from model.devices.network import mesh
 from model.devices.network import wireless
+from model import shellmodel
 from hardware import hardwaremanager
 from hardware import nmclient
 from view.BuddyIcon import BuddyIcon
 from view.pulsingicon import CanvasPulsingIcon
 from view.home.snowflakelayout import SnowflakeLayout
 from view.home.spreadlayout import SpreadLayout
+import view.Shell
 
 from hardware.nmclient import NM_802_11_CAP_PROTO_WEP, NM_802_11_CAP_PROTO_WPA, NM_802_11_CAP_PROTO_WPA2
 
@@ -230,10 +232,9 @@ class MeshDeviceView(CanvasPulsingIcon):
         self._update_state()
 
 class ActivityView(hippo.CanvasBox):
-    def __init__(self, shell, model):
+    def __init__(self, model):
         hippo.CanvasBox.__init__(self)
 
-        self._shell = shell
         self._model = model
         self._icons = {}
 
@@ -296,7 +297,7 @@ class ActivityView(hippo.CanvasBox):
 
     def _clicked_cb(self, item):
         bundle_id = self._model.get_bundle_id()
-        self._shell.join_activity(bundle_id, self._model.get_id())
+        view.Shell.get_instance().join_activity(bundle_id, self._model.get_id())
 
     def set_filter(self, query):
         text_to_check = self._model.activity.props.name.lower() + \
@@ -395,11 +396,10 @@ class MeshToolbar(gtk.Toolbar):
         return False
 
 class MeshBox(hippo.CanvasBox):
-    def __init__(self, shell):
+    def __init__(self):
         hippo.CanvasBox.__init__(self)
 
-        self._shell = shell
-        self._model = shell.get_model().get_mesh()
+        self._model = shellmodel.get_instance().get_mesh()
         self._buddies = {}
         self._activities = {}
         self._access_points = {}
@@ -496,7 +496,7 @@ class MeshBox(hippo.CanvasBox):
         del self._mesh[channel]
 
     def _add_alone_buddy(self, buddy_model):
-        icon = BuddyIcon(self._shell, buddy_model)
+        icon = BuddyIcon(buddy_model)
         if buddy_model.is_owner():
             vertical_offset = - style.GRID_CELL_SIZE
             self._layout.add_center(icon, vertical_offset)
@@ -533,15 +533,14 @@ class MeshBox(hippo.CanvasBox):
         elif activity_model.get_id() in self._activities:
             activity = self._activities[activity_model.get_id()]
 
-            icon = BuddyIcon(self._shell, buddy_model,
-                             style.STANDARD_ICON_SIZE)
+            icon = BuddyIcon(buddy_model, style.STANDARD_ICON_SIZE)
             activity.add_buddy_icon(buddy_model.get_key(), icon)
 
             if hasattr(icon, 'set_filter'):
                 icon.set_filter(self._query)
 
     def _add_activity(self, activity_model):
-        icon = ActivityView(self._shell, activity_model)
+        icon = ActivityView(activity_model)
         self._layout.add(icon)
 
         if hasattr(icon, 'set_filter'):
diff --git a/src/view/home/activitieslist.py b/src/view/home/activitieslist.py
index 2fa404d..afca51d 100644
--- a/src/view/home/activitieslist.py
+++ b/src/view/home/activitieslist.py
@@ -24,14 +24,15 @@ from sugar import activity
 from sugar.graphics import style
 from sugar.graphics.icon import CanvasIcon
 
+import view.Shell
+
 class ActivitiesList(hippo.CanvasScrollbars):
     __gtype_name__ = 'SugarActivitiesList'
 
-    def __init__(self, shell):
+    def __init__(self):
         hippo.CanvasScrollbars.__init__(self)
         self.set_policy(hippo.ORIENTATION_HORIZONTAL, hippo.SCROLLBAR_NEVER)
         
-        self._shell = shell
         self._box = hippo.CanvasBox(background_color=style.COLOR_WHITE.get_int())
         self.set_root(self._box)
 
@@ -55,7 +56,7 @@ class ActivitiesList(hippo.CanvasScrollbars):
                 return
 
     def _add_activity(self, activity_info):
-        self._box.append(ActivityEntry(self._shell, activity_info))
+        self._box.append(ActivityEntry(activity_info))
 
 class ActivityEntry(hippo.CanvasBox, hippo.CanvasItem):
     __gtype_name__ = 'SugarActivityEntry'
@@ -64,7 +65,7 @@ class ActivityEntry(hippo.CanvasBox, hippo.CanvasItem):
     _VERSION_COL_WIDTH = style.GRID_CELL_SIZE * 1
     _DATE_COL_WIDTH    = style.GRID_CELL_SIZE * 5
 
-    def __init__(self, shell, activity_info):
+    def __init__(self, activity_info):
         hippo.CanvasBox.__init__(self, spacing=style.DEFAULT_SPACING,
                                  padding_top=style.DEFAULT_PADDING,
                                  padding_bottom=style.DEFAULT_PADDING,
@@ -73,7 +74,6 @@ class ActivityEntry(hippo.CanvasBox, hippo.CanvasItem):
                                  box_height=style.GRID_CELL_SIZE,
                                  orientation=hippo.ORIENTATION_HORIZONTAL)
 
-        self._shell = shell
         self._activity_info = activity_info
 
         favorite_icon = FavoriteIcon(self._activity_info.favorite)
@@ -125,7 +125,7 @@ class ActivityEntry(hippo.CanvasBox, hippo.CanvasItem):
             self.icon.props.fill_color = style.COLOR_TRANSPARENT.get_svg()
 
     def __icon_button_release_event_cb(self, icon, event):
-        self._shell.start_activity(self._activity_info.bundle_id)
+        view.Shell.get_instance().start_activity(self._activity_info.bundle_id)
 
     def get_bundle_id(self):
         return self._activity_info.bundle_id
diff --git a/src/view/home/activitiesring.py b/src/view/home/activitiesring.py
index 4566823..9d84e30 100644
--- a/src/view/home/activitiesring.py
+++ b/src/view/home/activitiesring.py
@@ -37,8 +37,10 @@ from sugar.profile import get_profile
 from sugar import env
 from sugar import activity
 
+import view.Shell
 from view.palettes import JournalPalette, CurrentActivityPalette
 from view.home.MyIcon import MyIcon
+from model import shellmodel
 from model.shellmodel import ShellModel
 from hardware import schoolserver
 
@@ -47,16 +49,16 @@ _logger = logging.getLogger('ActivitiesRing')
 class ActivitiesRing(hippo.CanvasBox, hippo.CanvasItem):
     __gtype_name__ = 'SugarActivitiesRing'
 
-    def __init__(self, shell):
+    def __init__(self):
         hippo.CanvasBox.__init__(self, background_color=style.COLOR_WHITE.get_int())
 
-        self._shell = shell
-        shell.get_model().connect('notify::state', self._shell_state_changed_cb)
+        shell_model = shellmodel.get_instance()
+        shell_model.connect('notify::state', self._shell_state_changed_cb)
 
-        self._my_icon = _MyIcon(shell, style.XLARGE_ICON_SIZE)
+        self._my_icon = _MyIcon(style.XLARGE_ICON_SIZE)
         self.append(self._my_icon, hippo.PACK_FIXED)
 
-        self._current_activity = CurrentActivityIcon(shell)
+        self._current_activity = CurrentActivityIcon()
         self.append(self._current_activity, hippo.PACK_FIXED)
 
         self.set_layout(RingLayout())
@@ -70,12 +72,12 @@ class ActivitiesRing(hippo.CanvasBox, hippo.CanvasItem):
     def _get_activities_cb(self, activity_list):
         for info in activity_list:
             if info.favorite and info.bundle_id != "org.laptop.JournalActivity":
-                self.append(ActivityIcon(self._shell, info))
+                self.append(ActivityIcon(info))
 
     def __activity_added_cb(self, activity_registry, activity_info):
         if activity_info.favorite and \
                 activity_info.bundle_id != "org.laptop.JournalActivity":
-            self.append(ActivityIcon(self._shell, activity_info))
+            self.append(ActivityIcon(activity_info))
 
     def _find_activity_icon(self, bundle_id, version):
         for icon in self.get_children():
@@ -98,7 +100,7 @@ class ActivitiesRing(hippo.CanvasBox, hippo.CanvasItem):
         if icon is not None and not activity_info.favorite:
             self.remove(icon)
         elif icon is None and activity_info.favorite:
-            self.append(ActivityIcon(self._shell, activity_info))
+            self.append(ActivityIcon(activity_info))
 
     def _shell_state_changed_cb(self, model, pspec):
         # FIXME implement this
@@ -122,11 +124,10 @@ class ActivitiesRing(hippo.CanvasBox, hippo.CanvasItem):
         self._my_icon.enable_palette()
 
 class ActivityIcon(CanvasIcon):
-    def __init__(self, shell, activity_info):
+    def __init__(self, activity_info):
         CanvasIcon.__init__(self, cache=True, file_name=activity_info.icon)
-        self._shell = shell
         self._activity_info = activity_info
-        self.set_palette(ActivityPalette(shell, activity_info))
+        self.set_palette(ActivityPalette(activity_info))
         self.connect('hovering-changed', self.__hovering_changed_event_cb)
         self.connect('button-release-event', self.__button_release_event_cb)
 
@@ -141,7 +142,7 @@ class ActivityIcon(CanvasIcon):
             self.props.fill_color = style.COLOR_TRANSPARENT.get_svg()
 
     def __button_release_event_cb(self, icon, event):
-        self._shell.start_activity(self._activity_info.bundle_id)
+        view.Shell.get_instance().start_activity(self._activity_info.bundle_id)
 
     def get_bundle_id(self):
         return self._activity_info.bundle_id
@@ -152,7 +153,7 @@ class ActivityIcon(CanvasIcon):
     version = property(get_version, None)
 
 class ActivityPalette(Palette):
-    def __init__(self, shell, activity_info):
+    def __init__(self, activity_info):
         activity_icon = Icon(file=activity_info.icon,
                              xo_color=get_profile().color,
                              icon_size=gtk.ICON_SIZE_LARGE_TOOLBAR)
@@ -160,7 +161,6 @@ class ActivityPalette(Palette):
         Palette.__init__(self, None, None, primary_text=activity_info.name,
                          icon=activity_icon)
 
-        self._shell = shell
         self._activity_info = activity_info
 
         menu_item = MenuItem(_('Start'), 'activity-start')
@@ -168,19 +168,21 @@ class ActivityPalette(Palette):
         self.menu.append(menu_item)
         menu_item.show()
 
+        """
         menu_item = MenuItem(_('Start with'), 'activity-start')
         menu_item.props.sensitive = False
         #menu_item.connect('activate', self.__start_with_activate_cb)
         self.menu.append(menu_item)
         menu_item.show()
+        """
 
     def __start_activate_cb(self, menu_item):
-        self._shell.start_activity(self._activity_info.bundle_id)
+        view.Shell.get_instance().start_activity(self._activity_info.bundle_id)
 
 class CurrentActivityIcon(CanvasIcon, hippo.CanvasItem):
-    def __init__(self, shell):
+    def __init__(self):
         CanvasIcon.__init__(self, cache=True)
-        self._home_model = shell.get_model().get_home()
+        self._home_model = shellmodel.get_instance().get_home()
 
         if self._home_model.get_pending_activity() is not None:
             self._update(self._home_model.get_pending_activity())
@@ -297,11 +299,10 @@ class RingLayout(gobject.GObject, hippo.CanvasLayout):
                            origin_changed)
 
 class _MyIcon(MyIcon):
-    def __init__(self, shell, scale):
+    def __init__(self, scale):
         MyIcon.__init__(self, scale)
 
         self._power_manager = None
-        self._shell = shell
         self._profile = get_profile()
 
     def enable_palette(self):
@@ -342,7 +343,7 @@ class _MyIcon(MyIcon):
         self.set_palette(palette)
 
     def _reboot_activate_cb(self, menuitem):
-        model = self._shell.get_model()
+        model = shellmodel.get_instance()
         model.props.state = ShellModel.STATE_SHUTDOWN
 
         pm = self._get_power_manager()
@@ -356,7 +357,7 @@ class _MyIcon(MyIcon):
             pm.Reboot()
 
     def _shutdown_activate_cb(self, menuitem):
-        model = self._shell.get_model()
+        model = shellmodel.get_instance()
         model.props.state = ShellModel.STATE_SHUTDOWN
 
         pm = self._get_power_manager()
diff --git a/src/view/keyhandler.py b/src/view/keyhandler.py
index b07f46c..82b6b1c 100644
--- a/src/view/keyhandler.py
+++ b/src/view/keyhandler.py
@@ -22,9 +22,11 @@ import subprocess
 import dbus
 import gtk
 
+from sugar._sugarext import KeyGrabber
+
 from hardware import hardwaremanager
+import view.Shell
 from model.shellmodel import ShellModel
-from sugar._sugarext import KeyGrabber
 
 _BRIGHTNESS_STEP = 2
 _VOLUME_STEP = 10
@@ -72,8 +74,7 @@ SPEECH_DBUS_PATH = '/org/laptop/Speech'
 SPEECH_DBUS_INTERFACE = 'org.laptop.Speech'
 
 class KeyHandler(object):
-    def __init__(self, shell):
-        self._shell = shell
+    def __init__(self):
         self._screen_rotation = 0
         self._key_pressed = None
         self._keycode_pressed = 0
@@ -137,25 +138,25 @@ class KeyHandler(object):
         clipboard.request_text(self._primary_selection_cb)
 
     def handle_previous_window(self):
-        self._shell.activate_previous_activity()
+        view.Shell.get_instance().activate_previous_activity()
 
     def handle_next_window(self):
-        self._shell.activate_next_activity()
+        view.Shell.get_instance().activate_next_activity()
 
     def handle_close_window(self):
-        self._shell.close_current_activity()
+        view.Shell.get_instance().close_current_activity()
 
     def handle_zoom_mesh(self):
-        self._shell.set_zoom_level(ShellModel.ZOOM_MESH)
+        view.Shell.get_instance().set_zoom_level(ShellModel.ZOOM_MESH)
 
     def handle_zoom_friends(self):
-        self._shell.set_zoom_level(ShellModel.ZOOM_FRIENDS)
+        view.Shell.get_instance().set_zoom_level(ShellModel.ZOOM_FRIENDS)
 
     def handle_zoom_home(self):
-        self._shell.set_zoom_level(ShellModel.ZOOM_HOME)
+        view.Shell.get_instance().set_zoom_level(ShellModel.ZOOM_HOME)
 
     def handle_zoom_activity(self):
-        self._shell.set_zoom_level(ShellModel.ZOOM_ACTIVITY)
+        view.Shell.get_instance().set_zoom_level(ShellModel.ZOOM_ACTIVITY)
 
     def handle_brightness_max(self):
         self._change_brightness(value=_BRIGHTNESS_MAX)
@@ -182,13 +183,13 @@ class KeyHandler(object):
         self._change_volume(step=-_VOLUME_STEP)
 
     def handle_screenshot(self):
-        self._shell.take_screenshot()
+        view.Shell.get_instance().take_screenshot()
 
     def handle_frame(self):
-        self._shell.get_frame().notify_key_press()
+        view.Shell.get_instance().get_frame().notify_key_press()
 
     def handle_overlay(self):
-        self._shell.toggle_chat_visibility()
+        view.Shell.get_instance().toggle_chat_visibility()
 
     def handle_rotate(self):
         states = [ 'normal', 'left', 'inverted', 'right']
-- 
1.5.2.5

_______________________________________________
Sugar mailing list
[email protected]
http://lists.laptop.org/listinfo/sugar

Reply via email to