Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTomeu Vizoso <tomeu@tomeuvizoso.net>2008-04-02 12:53:52 (GMT)
committer Tomeu Vizoso <tomeu@tomeuvizoso.net>2008-04-02 12:53:52 (GMT)
commit14f1ca9b8491dee343305066facf8e7ae24e381f (patch)
tree2a387daf635cf21c2843cd18b29bc6f72d781d87 /src
parentb8dd3afcb84f86a94c41b1e29a851515e0009690 (diff)
Make Frame, Shell and ShellModel singletons and remove all those references dragged around constructors.
Diffstat (limited to 'src')
-rw-r--r--src/main.py9
-rw-r--r--src/model/shellmodel.py9
-rw-r--r--src/shellservice.py9
-rw-r--r--src/view/BuddyIcon.py5
-rw-r--r--src/view/BuddyMenu.py21
-rw-r--r--src/view/Shell.py30
-rw-r--r--src/view/frame/activitiestray.py6
-rw-r--r--src/view/frame/devicestray.py5
-rw-r--r--src/view/frame/frame.py23
-rw-r--r--src/view/frame/friendstray.py15
-rw-r--r--src/view/frame/zoomtoolbar.py29
-rw-r--r--src/view/home/FriendView.py4
-rw-r--r--src/view/home/FriendsBox.py8
-rw-r--r--src/view/home/HomeBox.py7
-rw-r--r--src/view/home/HomeWindow.py9
-rw-r--r--src/view/home/MeshBox.py19
-rw-r--r--src/view/home/activitieslist.py12
-rw-r--r--src/view/home/activitiesring.py43
-rw-r--r--src/view/keyhandler.py27
19 files changed, 158 insertions, 132 deletions
diff --git a/src/main.py b/src/main.py
index e785707..940be8f 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,9 @@ def main():
print "Got Ctrl+C, continuing..."
break
- model = ShellModel()
- shell = Shell(model)
- service = ShellService(shell)
+ # TODO: move initializations from the Shell constructor to a start() method
+ shell = view.Shell.get_instance()
+ 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..cafbf60 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,11 @@ class Shell(gobject.GObject):
finally:
os.remove(file_path)
+_instance = None
+
+def get_instance():
+ global _instance
+ if not _instance:
+ _instance = Shell()
+ return _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 2ab5c04..a25415e 100644
--- a/src/view/home/FriendsBox.py
+++ b/src/view/home/FriendsBox.py
@@ -24,16 +24,16 @@ 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()
@@ -46,7 +46,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)
@@ -55,7 +55,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 76fc9b1..39c24a4 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']