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-02-28 18:05:27 (GMT)
committer Tomeu Vizoso <tomeu@tomeuvizoso.net>2008-02-28 18:05:27 (GMT)
commit8def8c1057b750a356a1bdac3896d6929a6bc5a2 (patch)
tree193a51db29a5fd341de50a91c30697f5ee6c1acf /src
parent326f71e7e4373b9f0211bb6b8308a83e274d8cb5 (diff)
Reverted shell redesign work, will continue in other trees until it is merged back here.
Diffstat (limited to 'src')
-rw-r--r--src/view/devices/battery.py28
-rw-r--r--src/view/devices/deviceview.py3
-rw-r--r--src/view/devices/network/mesh.py40
-rw-r--r--src/view/devices/network/wireless.py32
-rw-r--r--src/view/frame/Makefile.am6
-rw-r--r--src/view/frame/activitiestray.py251
-rw-r--r--src/view/frame/activitiestray2.py153
-rw-r--r--src/view/frame/clipboardbox.py (renamed from src/view/frame/clipboardtray.py)15
-rw-r--r--src/view/frame/clipboardpanelwindow.py15
-rw-r--r--src/view/frame/devicestray.py60
-rw-r--r--src/view/frame/frame.py24
-rw-r--r--src/view/frame/zoomtoolbar.py84
-rw-r--r--src/view/frame/zoomtray.py89
-rw-r--r--src/view/home/HomeBox.py35
14 files changed, 320 insertions, 515 deletions
diff --git a/src/view/devices/battery.py b/src/view/devices/battery.py
index 98ce778..09c69df 100644
--- a/src/view/devices/battery.py
+++ b/src/view/devices/battery.py
@@ -19,26 +19,24 @@ from gettext import gettext as _
import gtk
from sugar import profile
+from sugar.graphics.icon import CanvasIcon
from sugar.graphics.icon import get_icon_state
-from sugar.graphics.tray import TrayIcon
+from sugar.graphics import style
from sugar.graphics.palette import Palette
-from view.frame.frameinvoker import FrameWidgetInvoker
-
_ICON_NAME = 'battery'
_STATUS_CHARGING = 0
_STATUS_DISCHARGING = 1
_STATUS_FULLY_CHARGED = 2
-class DeviceView(TrayIcon):
+class DeviceView(CanvasIcon):
def __init__(self, model):
- TrayIcon.__init__(self, icon_name=_ICON_NAME, xo_color=profile.get_color())
-
+ CanvasIcon.__init__(self, size=style.MEDIUM_ICON_SIZE,
+ xo_color=profile.get_color())
self._model = model
- self.palette = BatteryPalette(_('My Battery life'))
- self.palette.props.invoker = FrameWidgetInvoker(self)
- self.palette.set_group_id('frame')
+ self._palette = BatteryPalette(_('My Battery life'))
+ self.set_palette(self._palette)
model.connect('notify::level', self._battery_status_changed_cb)
model.connect('notify::charging', self._battery_status_changed_cb)
@@ -47,21 +45,21 @@ class DeviceView(TrayIcon):
def _update_info(self):
name = get_icon_state(_ICON_NAME, self._model.props.level)
- self.get_icon().props.icon_name = name
+ self.props.icon_name = name
# Update palette
if self._model.props.charging:
status = _STATUS_CHARGING
- self.get_icon().props.badge_name = 'emblem-charging'
+ self.props.badge_name = 'emblem-charging'
elif self._model.props.discharging:
status = _STATUS_DISCHARGING
- self.get_icon().props.badge_name = None
+ self.props.badge_name = None
else:
status = _STATUS_FULLY_CHARGED
- self.get_icon().props.badge_name = None
+ self.props.badge_name = None
- self.palette.set_level(self._model.props.level)
- self.palette.set_status(status)
+ self._palette.set_level(self._model.props.level)
+ self._palette.set_status(status)
def _battery_status_changed_cb(self, pspec, param):
self._update_info()
diff --git a/src/view/devices/deviceview.py b/src/view/devices/deviceview.py
index 90ebbf5..f58da02 100644
--- a/src/view/devices/deviceview.py
+++ b/src/view/devices/deviceview.py
@@ -14,6 +14,8 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+from sugar.graphics.icon import CanvasIcon
+
def create(model):
name = 'view.devices.' + model.get_type()
@@ -23,4 +25,3 @@ def create(model):
mod = getattr(mod, comp)
return mod.DeviceView(model)
-
diff --git a/src/view/devices/network/mesh.py b/src/view/devices/network/mesh.py
index e700554..2543957 100644
--- a/src/view/devices/network/mesh.py
+++ b/src/view/devices/network/mesh.py
@@ -1,5 +1,5 @@
+#
# Copyright (C) 2006-2007 Red Hat, Inc.
-# Copyright (C) 2008 One Laptop Per Child
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -20,24 +20,22 @@ from gettext import gettext as _
import gtk
from sugar import profile
-from sugar.graphics.tray import TrayIcon
+from sugar.graphics.icon import CanvasIcon
from sugar.graphics import style
-from sugar.graphics.palette import Palette
-
from model.devices import device
+
+from sugar.graphics.palette import Palette
from model.devices.network import wireless
+
from hardware import hardwaremanager
-from view.frame.frameinvoker import FrameWidgetInvoker
-class DeviceView(TrayIcon):
+class DeviceView(CanvasIcon):
def __init__(self, model):
- TrayIcon.__init__(self, icon_name='network-mesh')
-
+ CanvasIcon.__init__(self, size=style.MEDIUM_ICON_SIZE,
+ icon_name='network-mesh')
self._model = model
-
- self.palette = MeshPalette(_("Mesh Network"), model)
- self.palette.props.invoker = FrameWidgetInvoker(self)
- self.palette.set_group_id('frame')
+ self._palette = MeshPalette(_("Mesh Network"), model)
+ self.set_palette(self._palette)
model.connect('notify::state', self._state_changed_cb)
model.connect('notify::activation-stage', self._state_changed_cb)
@@ -49,24 +47,24 @@ class DeviceView(TrayIcon):
def _update_state(self):
# FIXME Change icon colors once we have real icons
state = self._model.props.state
- self.palette.update_state(state)
+ self._palette.update_state(state)
if state == device.STATE_ACTIVATING:
- self.get_icon().props.fill_color = style.COLOR_INACTIVE_FILL.get_svg()
- self.get_icon().props.stroke_color = style.COLOR_INACTIVE_STROKE.get_svg()
+ self.props.fill_color = style.COLOR_INACTIVE_FILL.get_svg()
+ self.props.stroke_color = style.COLOR_INACTIVE_STROKE.get_svg()
elif state == device.STATE_ACTIVATED:
- self.get_icon().props.xo_color = profile.get_color()
+ self.props.xo_color = profile.get_color()
elif state == device.STATE_INACTIVE:
- self.get_icon().props.fill_color = style.COLOR_INACTIVE_FILL.get_svg()
- self.get_icon().props.stroke_color = style.COLOR_INACTIVE_STROKE.get_svg()
+ self.props.fill_color = style.COLOR_INACTIVE_FILL.get_svg()
+ self.props.stroke_color = style.COLOR_INACTIVE_STROKE.get_svg()
if state == device.STATE_INACTIVE:
- self.palette.set_primary_text(_("Mesh Network"))
+ self._palette.set_primary_text(_("Mesh Network"))
else:
chan = wireless.freq_to_channel(self._model.props.frequency)
if chan > 0:
- self.palette.set_primary_text(_("Mesh Network") + " %d" % chan)
- self.palette.set_mesh_step(self._model.props.mesh_step, state)
+ self._palette.set_primary_text(_("Mesh Network") + " %d" % chan)
+ self._palette.set_mesh_step(self._model.props.mesh_step, state)
class MeshPalette(Palette):
def __init__(self, primary_text, model):
diff --git a/src/view/devices/network/wireless.py b/src/view/devices/network/wireless.py
index ad9f5c8..f4f8869 100644
--- a/src/view/devices/network/wireless.py
+++ b/src/view/devices/network/wireless.py
@@ -20,21 +20,21 @@ from gettext import gettext as _
import gtk
from sugar.graphics.icon import get_icon_state
-from sugar.graphics.tray import TrayIcon
+from sugar.graphics.icon import CanvasIcon
from sugar.graphics import style
from sugar.graphics.palette import Palette
from model.devices.network import wireless
from model.devices import device
+
from hardware import hardwaremanager
from hardware import nmclient
-from view.frame.frameinvoker import FrameWidgetInvoker
_ICON_NAME = 'network-wireless'
-class DeviceView(TrayIcon):
+class DeviceView(CanvasIcon):
def __init__(self, model):
- TrayIcon.__init__(self)
+ CanvasIcon.__init__(self, size=style.MEDIUM_ICON_SIZE)
self._model = model
meshdev = None
@@ -44,11 +44,10 @@ class DeviceView(TrayIcon):
meshdev = device
break
+ self._palette = WirelessPalette(self._get_palette_primary_text(), meshdev)
+ self.set_palette(self._palette)
self._counter = 0
- self.palette = WirelessPalette(self._get_palette_primary_text(), meshdev)
- self.palette.props.invoker = FrameWidgetInvoker(self)
- self.palette.set_group_id('frame')
- self.palette.set_frequency(self._model.props.frequency)
+ self._palette.set_frequency(self._model.props.frequency)
model.connect('notify::name', self._name_changed_cb)
model.connect('notify::strength', self._strength_changed_cb)
@@ -66,7 +65,7 @@ class DeviceView(TrayIcon):
self._update_icon()
# Only update frequency periodically
if self._counter % 4 == 0:
- self.palette.set_frequency(self._model.props.frequency)
+ self._palette.set_frequency(self._model.props.frequency)
self._counter += 1
def _name_changed_cb(self, model, pspec):
@@ -82,22 +81,21 @@ class DeviceView(TrayIcon):
strength = 0
icon_name = get_icon_state(_ICON_NAME, strength)
if icon_name:
- self.get_icon().props.icon_name = icon_name
+ self.props.icon_name = icon_name
def _update_state(self):
# FIXME Change icon colors once we have real icons
state = self._model.props.state
- icon = self.get_icon()
if state == device.STATE_ACTIVATING:
- icon.props.fill_color = style.COLOR_INACTIVE_FILL.get_svg()
- icon.props.stroke_color = style.COLOR_INACTIVE_STROKE.get_svg()
+ self.props.fill_color = style.COLOR_INACTIVE_FILL.get_svg()
+ self.props.stroke_color = style.COLOR_INACTIVE_STROKE.get_svg()
elif state == device.STATE_ACTIVATED:
(stroke, fill) = self._model.get_active_network_colors()
- icon.props.stroke_color = stroke
- icon.props.fill_color = fill
+ self.props.stroke_color = stroke
+ self.props.fill_color = fill
elif state == device.STATE_INACTIVE:
- icon.props.fill_color = style.COLOR_INACTIVE_FILL.get_svg()
- icon.props.stroke_color = style.COLOR_INACTIVE_STROKE.get_svg()
+ self.props.fill_color = style.COLOR_INACTIVE_FILL.get_svg()
+ self.props.stroke_color = style.COLOR_INACTIVE_STROKE.get_svg()
class WirelessPalette(Palette):
def __init__(self, primary_text, meshdev):
diff --git a/src/view/frame/Makefile.am b/src/view/frame/Makefile.am
index 979a351..02951b9 100644
--- a/src/view/frame/Makefile.am
+++ b/src/view/frame/Makefile.am
@@ -2,15 +2,13 @@ sugardir = $(pkgdatadir)/shell/view/frame
sugar_PYTHON = \
__init__.py \
activitiestray.py \
- activitiestray2.py \
activitybutton.py \
+ clipboardbox.py \
clipboardpanelwindow.py \
- clipboardtray.py \
- devicestray.py \
frameinvoker.py \
friendstray.py \
eventarea.py \
frame.py \
overlaybox.py \
framewindow.py \
- zoomtray.py
+ zoomtoolbar.py
diff --git a/src/view/frame/activitiestray.py b/src/view/frame/activitiestray.py
index deb906b..11e812c 100644
--- a/src/view/frame/activitiestray.py
+++ b/src/view/frame/activitiestray.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2008 One Laptop Per Child
+# Copyright (C) 2006-2007 Red Hat, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -14,143 +14,146 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+import os
import logging
-from gettext import gettext as _
-import gtk
+import hippo
+from sugar.graphics.tray import TrayButton
from sugar.graphics.tray import HTray
-from sugar.graphics.radiotoolbutton import RadioToolButton
from sugar.graphics.icon import Icon
-from sugar.graphics.palette import Palette
-from sugar.graphics.menuitem import MenuItem
+from sugar.graphics import style
+from sugar import profile
+from sugar import activity
+from sugar import env
-from view.frame.frameinvoker import FrameWidgetInvoker
+from activitybutton import ActivityButton
+import config
-class ActivityPalette(Palette):
- def __init__(self, home_activity):
- Palette.__init__(self, home_activity.get_title())
- self.props.invoker = FrameWidgetInvoker(self)
- self.set_group_id('frame')
+class InviteButton(TrayButton):
+ def __init__(self, activity_model, invite):
+ TrayButton.__init__(self)
- self._home_activity = home_activity
-
- menu_item = MenuItem(_('Resume'), 'activity-start')
- menu_item.connect('activate', self.__resume_activate_cb)
- self.menu.append(menu_item)
- menu_item.show()
-
- menu_item = MenuItem(_('Share with'), 'zoom-neighborhood')
- #menu_item.connect('activate', self.__share_activate_cb)
- self.menu.append(menu_item)
- menu_item.show()
-
- menu_item = MenuItem(_('Stop'), 'activity-stop')
- menu_item.connect('activate', self.__stop_activate_cb)
- self.menu.append(menu_item)
- menu_item.show()
-
- def __resume_activate_cb(self, menu_item):
- self._home_activity.get_window().activate(1)
-
- def __stop_activate_cb(self, menu_item):
- self._home_activity.get_window().close(1)
-
-class JournalPalette(Palette):
- def __init__(self, home_activity):
- Palette.__init__(self, home_activity.get_title())
- self.props.invoker = FrameWidgetInvoker(self)
- self.set_group_id('frame')
-
- self._home_activity = home_activity
-
- menu_item = MenuItem(_('Open Journal'))
-
- icon = Icon(file=home_activity.get_icon_path(),
- icon_size=gtk.ICON_SIZE_MENU,
- xo_color=home_activity.get_icon_color())
- menu_item.set_image(icon)
+ icon = Icon(file=activity_model.get_icon_name(),
+ xo_color=activity_model.get_color())
+ self.set_icon_widget(icon)
icon.show()
- menu_item.connect('activate', self.__open_activate_cb)
- self.menu.append(menu_item)
- menu_item.show()
+ self._invite = invite
- def __open_activate_cb(self, menu_item):
- self._home_activity.get_window().activate(1)
+ def get_activity_id(self):
+ return self._invite.get_activity_id()
-class ActivityButton(RadioToolButton):
- def __init__(self, home_activity, group):
- RadioToolButton.__init__(self, group=group)
+ def get_bundle_id(self):
+ return self._invite.get_bundle_id()
- self._home_activity = home_activity
+ def get_invite(self):
+ return self._invite
- icon = Icon(xo_color=home_activity.get_icon_color())
- if home_activity.get_icon_path():
- icon.props.file = home_activity.get_icon_path()
- else:
- icon.props.icon_name = 'image-missing'
- self.set_icon_widget(icon)
- icon.show()
-
- if home_activity.props.launching:
- palette = Palette(_('Starting...'))
- palette.props.invoker = FrameWidgetInvoker(self)
- palette.set_group_id('frame')
- self.set_palette(palette)
-
- #self._start_pulsing()
- home_activity.connect('notify::launching', self._launching_changed_cb)
- else:
- self._setup_palette()
-
- def _launching_changed_cb(self, home_activity, pspec):
- if not home_activity.props.launching:
- #self._stop_pulsing()
- self._setup_palette()
-
- def _setup_palette(self):
- if self._home_activity.get_type() == "org.laptop.JournalActivity":
- palette = JournalPalette(self._home_activity)
- else:
- palette = ActivityPalette(self._home_activity)
- self.set_palette(palette)
-
-class ActivitiesTray(HTray):
+class ActivitiesTray(hippo.CanvasBox):
def __init__(self, shell):
- HTray.__init__(self)
+ hippo.CanvasBox.__init__(self, orientation=hippo.ORIENTATION_HORIZONTAL)
- self._buttons = {}
self._shell = shell
- self._home_model = shell.get_model().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)
-
- def __activity_added_cb(self, home_model, home_activity):
- logging.debug('__activity_added_cb: %r' % home_activity)
- if self.get_children():
- group = self.get_children()[0]
- else:
- group = None
-
- button = ActivityButton(home_activity, group)
- self.add_item(button)
- self._buttons[home_activity.get_activity_id()] = button
- button.connect('toggled', self.__activity_toggled_cb, home_activity)
- button.show()
-
- def __activity_removed_cb(self, home_model, home_activity):
- logging.debug('__activity_removed_cb: %r' % home_activity)
- button = self._buttons[home_activity.get_activity_id()]
- self.remove_item(button)
- del self._buttons[home_activity.get_activity_id()]
-
- def __activity_changed_cb(self, home_model, home_activity):
- logging.debug('__activity_changed_cb: %r' % home_activity)
- button = self._buttons[home_activity.get_activity_id()]
- button.props.active = True
-
- def __activity_toggled_cb(self, button, home_activity):
- home_activity.get_window().activate(1)
-
+ self._shell_model = self._shell.get_model()
+ self._invite_to_item = {}
+ self._invites = self._shell_model.get_invites()
+ self._config = self._load_config()
+
+ self._tray = HTray()
+ self.append(hippo.CanvasWidget(widget=self._tray), hippo.PACK_EXPAND)
+ self._tray.show()
+
+ registry = activity.get_registry()
+ registry.get_activities_async(reply_handler=self._get_activities_cb)
+
+ registry.connect('activity-added', self._activity_added_cb)
+ registry.connect('activity-removed', self._activity_removed_cb)
+
+ for invite in self._invites:
+ self.add_invite(invite)
+ self._invites.connect('invite-added', self._invite_added_cb)
+ self._invites.connect('invite-removed', self._invite_removed_cb)
+
+ def _load_config(self):
+ cfg = []
+
+ f = open(os.path.join(config.data_path, 'activities.defaults'), 'r')
+ for line in f.readlines():
+ line = line.strip()
+ if line and not line.startswith('#'):
+ cfg.append(line)
+ f.close()
+
+ return cfg
+
+ def _get_activities_cb(self, activity_list):
+ known_activities = []
+ unknown_activities = []
+ name_to_activity = {}
+
+ while activity_list:
+ info = activity_list.pop()
+ name_to_activity[info.bundle_id] = info
+
+ if info.bundle_id in self._config:
+ known_activities.append(info)
+ else:
+ unknown_activities.append(info)
+
+ sorted_activities = []
+ for name in self._config:
+ if name in name_to_activity:
+ sorted_activities.append(name_to_activity[name])
+
+ for info in sorted_activities + unknown_activities:
+ if info.show_launcher:
+ self.add_activity(info)
+
+ def _activity_clicked_cb(self, icon):
+ self._shell.start_activity(icon.get_bundle_id())
+
+ def _invite_clicked_cb(self, icon):
+ self._invites.remove_invite(icon.get_invite())
+ self._shell.join_activity(icon.get_bundle_id(),
+ icon.get_activity_id())
+
+ def _invite_added_cb(self, invites, invite):
+ self.add_invite(invite)
+
+ def _invite_removed_cb(self, invites, invite):
+ self.remove_invite(invite)
+
+ def _remove_activity_cb(self, item):
+ self._tray.remove_item(item)
+
+ def _activity_added_cb(self, activity_registry, activity_info):
+ self.add_activity(activity_info)
+
+ def _activity_removed_cb(self, activity_registry, activity_info):
+ for item in self._tray.get_children():
+ if item.get_bundle_id() == activity_info.bundle_id:
+ self._tray.remove_item(item)
+ return
+
+ def add_activity(self, activity_info):
+ item = ActivityButton(activity_info)
+ item.connect('clicked', self._activity_clicked_cb)
+ item.connect('remove_activity', self._remove_activity_cb)
+ self._tray.add_item(item, -1)
+ item.show()
+
+ def add_invite(self, invite):
+ mesh = self._shell_model.get_mesh()
+ activity_model = mesh.get_activity(invite.get_activity_id())
+ if activity:
+ item = InviteButton(activity_model, invite)
+ item.connect('clicked', self._invite_clicked_cb)
+ self._tray.add_item(item, 0)
+ item.show()
+
+ self._invite_to_item[invite] = item
+
+ def remove_invite(self, invite):
+ self._tray.remove_item(self._invite_to_item[invite])
+ del self._invite_to_item[invite]
diff --git a/src/view/frame/activitiestray2.py b/src/view/frame/activitiestray2.py
deleted file mode 100644
index a49a549..0000000
--- a/src/view/frame/activitiestray2.py
+++ /dev/null
@@ -1,153 +0,0 @@
-# Copyright (C) 2006-2007 Red Hat, Inc.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-import os
-import logging
-
-from sugar.graphics.tray import TrayButton
-from sugar.graphics.tray import HTray
-from sugar.graphics.icon import Icon
-from sugar.graphics import style
-from sugar import profile
-from sugar import activity
-from sugar import env
-
-from activitybutton import ActivityButton
-import config
-
-class InviteButton(TrayButton):
- def __init__(self, activity_model, invite):
- TrayButton.__init__(self)
-
- icon = Icon(file=activity_model.get_icon_name(),
- xo_color=activity_model.get_color())
- self.set_icon_widget(icon)
- icon.show()
-
- self._invite = invite
-
- def get_activity_id(self):
- return self._invite.get_activity_id()
-
- def get_bundle_id(self):
- return self._invite.get_bundle_id()
-
- def get_invite(self):
- return self._invite
-
-class ActivitiesTray(HTray):
- def __init__(self, shell):
- HTray.__init__(self)
-
- self._shell = shell
- self._shell_model = self._shell.get_model()
- self._invite_to_item = {}
- self._invites = self._shell_model.get_invites()
- self._config = self._load_config()
-
- registry = activity.get_registry()
- registry.get_activities_async(reply_handler=self._get_activities_cb)
-
- registry.connect('activity-added', self._activity_added_cb)
- registry.connect('activity-removed', self._activity_removed_cb)
-
- for invite in self._invites:
- self.add_invite(invite)
- self._invites.connect('invite-added', self._invite_added_cb)
- self._invites.connect('invite-removed', self._invite_removed_cb)
-
- def _load_config(self):
- cfg = []
-
- f = open(os.path.join(config.data_path, 'activities.defaults'), 'r')
- for line in f.readlines():
- line = line.strip()
- if line and not line.startswith('#'):
- cfg.append(line)
- f.close()
-
- return cfg
-
- def _get_activities_cb(self, activity_list):
- known_activities = []
- unknown_activities = []
- name_to_activity = {}
-
- while activity_list:
- info = activity_list.pop()
- name_to_activity[info.bundle_id] = info
-
- if info.bundle_id in self._config:
- known_activities.append(info)
- else:
- unknown_activities.append(info)
-
- sorted_activities = []
- for name in self._config:
- if name in name_to_activity:
- sorted_activities.append(name_to_activity[name])
-
- for info in sorted_activities + unknown_activities:
- if info.show_launcher:
- self.add_activity(info)
-
- def _activity_clicked_cb(self, icon):
- self._shell.start_activity(icon.get_bundle_id())
-
- def _invite_clicked_cb(self, icon):
- self._invites.remove_invite(icon.get_invite())
- self._shell.join_activity(icon.get_bundle_id(),
- icon.get_activity_id())
-
- def _invite_added_cb(self, invites, invite):
- self.add_invite(invite)
-
- def _invite_removed_cb(self, invites, invite):
- self.remove_invite(invite)
-
- def _remove_activity_cb(self, item):
- self.remove_item(item)
-
- def _activity_added_cb(self, activity_registry, activity_info):
- self.add_activity(activity_info)
-
- def _activity_removed_cb(self, activity_registry, activity_info):
- for item in self.get_children():
- if item.get_bundle_id() == activity_info.bundle_id:
- self.remove_item(item)
- return
-
- def add_activity(self, activity_info):
- item = ActivityButton(activity_info)
- item.connect('clicked', self._activity_clicked_cb)
- item.connect('remove_activity', self._remove_activity_cb)
- self.add_item(item, -1)
- item.show()
-
- def add_invite(self, invite):
- mesh = self._shell_model.get_mesh()
- activity_model = mesh.get_activity(invite.get_activity_id())
- if activity:
- item = InviteButton(activity_model, invite)
- item.connect('clicked', self._invite_clicked_cb)
- self.add_item(item, 0)
- item.show()
-
- self._invite_to_item[invite] = item
-
- def remove_invite(self, invite):
- self.remove_item(self._invite_to_item[invite])
- del self._invite_to_item[invite]
diff --git a/src/view/frame/clipboardtray.py b/src/view/frame/clipboardbox.py
index 0002614..7702759 100644
--- a/src/view/frame/clipboardtray.py
+++ b/src/view/frame/clipboardbox.py
@@ -18,6 +18,7 @@ import os
import logging
import tempfile
+import hippo
import gtk
from sugar import util
@@ -56,15 +57,19 @@ class _ContextMap:
def has_context(self, context):
return context in self._context_map
-class ClipboardTray(VTray):
+class ClipboardBox(hippo.CanvasBox):
MAX_ITEMS = gtk.gdk.screen_height() / style.GRID_CELL_SIZE - 2
def __init__(self):
- VTray.__init__(self)
+ hippo.CanvasBox.__init__(self)
self._icons = {}
self._context_map = _ContextMap()
+ self._tray = VTray()
+ self.append(hippo.CanvasWidget(widget=self._tray), hippo.PACK_EXPAND)
+ self._tray.show()
+
cb_service = clipboardservice.get_instance()
cb_service.connect('object-added', self._object_added_cb)
cb_service.connect('object-deleted', self._object_deleted_cb)
@@ -104,11 +109,11 @@ class ClipboardTray(VTray):
group = None
icon = ClipboardIcon(object_id, name, group)
- self.pack_end(icon, expand=False, fill=False, padding=0)
+ self._tray.add_item(icon, 0)
icon.show()
self._icons[object_id] = icon
- objects_to_delete = self.get_children()[ClipboardBox.MAX_ITEMS:]
+ objects_to_delete = self._tray.get_children()[ClipboardBox.MAX_ITEMS:]
for icon in objects_to_delete:
logging.debug('ClipboardBox: deleting surplus object')
cb_service = clipboardservice.get_instance()
@@ -118,7 +123,7 @@ class ClipboardTray(VTray):
def _object_deleted_cb(self, cb_service, object_id):
icon = self._icons[object_id]
- self.remove_item(icon)
+ self._tray.remove_item(icon)
del self._icons[object_id]
logging.debug('ClipboardBox: ' + object_id + ' was deleted.')
diff --git a/src/view/frame/clipboardpanelwindow.py b/src/view/frame/clipboardpanelwindow.py
index 04e7408..e579b8c 100644
--- a/src/view/frame/clipboardpanelwindow.py
+++ b/src/view/frame/clipboardpanelwindow.py
@@ -21,7 +21,7 @@ import gtk
import hippo
from view.frame.framewindow import FrameWindow
-from view.frame.clipboardtray import ClipboardTray
+from view.frame.clipboardbox import ClipboardBox
from sugar.clipboard import clipboardservice
from sugar import util
@@ -37,21 +37,20 @@ class ClipboardPanelWindow(FrameWindow):
self._clipboard = gtk.Clipboard()
self._clipboard.connect("owner-change", self._owner_change_cb)
- self._clipboard_tray = ClipboardTray()
- canvas_widget = hippo.CanvasWidget(widget=self._clipboard_tray)
- self.append(canvas_widget, hippo.PACK_EXPAND)
+ self._clipboard_box = ClipboardBox()
+ self.append(self._clipboard_box, hippo.PACK_EXPAND)
# Receiving dnd drops
self.drag_dest_set(0, [], 0)
- self.connect("drag_motion", self._clipboard_tray.drag_motion_cb)
- self.connect("drag_drop", self._clipboard_tray.drag_drop_cb)
+ self.connect("drag_motion", self._clipboard_box.drag_motion_cb)
+ self.connect("drag_drop", self._clipboard_box.drag_drop_cb)
self.connect("drag_data_received",
- self._clipboard_tray.drag_data_received_cb)
+ self._clipboard_box.drag_data_received_cb)
def _owner_change_cb(self, clipboard, event):
logging.debug("owner_change_cb")
- if self._clipboard_tray.owns_clipboard():
+ if self._clipboard_box.owns_clipboard():
return
cb_service = clipboardservice.get_instance()
diff --git a/src/view/frame/devicestray.py b/src/view/frame/devicestray.py
deleted file mode 100644
index e788bbf..0000000
--- a/src/view/frame/devicestray.py
+++ /dev/null
@@ -1,60 +0,0 @@
-# Copyright (C) 2008 One Laptop Per Child
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-import logging
-from gettext import gettext as _
-
-import gtk
-
-from sugar.graphics.tray import HTray
-from sugar.graphics.icon import Icon
-from sugar.graphics.palette import Palette
-from sugar.graphics.menuitem import MenuItem
-
-from view.frame.frameinvoker import FrameWidgetInvoker
-from view.devices import deviceview
-
-class DevicesTray(HTray):
- def __init__(self, shell):
- HTray.__init__(self)
- self._device_icons = {}
-
- devices_model = shell.get_model().get_devices()
-
- for device in devices_model:
- self._add_device(device)
-
- devices_model.connect('device-appeared',
- self.__device_appeared_cb)
- devices_model.connect('device-disappeared',
- self.__device_disappeared_cb)
-
- def _add_device(self, device):
- view = deviceview.create(device)
- self.pack_end(view, expand=False, fill=False, padding=0)
- view.show()
- self._device_icons[device.get_id()] = view
-
- def _remove_device(self, device):
- self.remove_item(self._device_icons[device.get_id()])
- del self._device_icons[device.get_id()]
-
- def __device_appeared_cb(self, model, device):
- self._add_device(device)
-
- def __device_disappeared_cb(self, model, device):
- self._remove_device(device)
-
diff --git a/src/view/frame/frame.py b/src/view/frame/frame.py
index ce9bc15..e8f8fa4 100644
--- a/src/view/frame/frame.py
+++ b/src/view/frame/frame.py
@@ -27,10 +27,8 @@ from sugar.clipboard import clipboardservice
from view.frame.eventarea import EventArea
from view.frame.activitiestray import ActivitiesTray
-from view.frame import activitiestray2
-from view.frame.zoomtray import ZoomTray
+from view.frame.zoomtoolbar import ZoomToolbar
from view.frame.friendstray import FriendsTray
-from view.frame.devicestray import DevicesTray
from view.frame.framewindow import FrameWindow
from view.frame.clipboardpanelwindow import ClipboardPanelWindow
from model.shellmodel import ShellModel
@@ -168,27 +166,17 @@ class Frame(object):
def _create_top_panel(self):
panel = self._create_panel(gtk.POS_TOP)
- zoom_tray = ZoomTray(self._shell)
- panel.append(hippo.CanvasWidget(widget=zoom_tray))
- zoom_tray.show()
-
- activities_tray = ActivitiesTray(self._shell)
- panel.append(hippo.CanvasWidget(widget=activities_tray), hippo.PACK_EXPAND)
- activities_tray.show()
+ toolbar = ZoomToolbar(self._shell)
+ panel.append(hippo.CanvasWidget(widget=toolbar))
+ toolbar.show()
return panel
def _create_bottom_panel(self):
panel = self._create_panel(gtk.POS_BOTTOM)
- """
- activities_tray = activitiestray2.ActivitiesTray(self._shell)
- panel.append(hippo.CanvasWidget(widget=activities_tray), hippo.PACK_EXPAND)
- """
-
- devices_tray = DevicesTray(self._shell)
- panel.append(hippo.CanvasWidget(widget=devices_tray), hippo.PACK_EXPAND)
- devices_tray.show()
+ box = ActivitiesTray(self._shell)
+ panel.append(box, hippo.PACK_EXPAND)
return panel
diff --git a/src/view/frame/zoomtoolbar.py b/src/view/frame/zoomtoolbar.py
new file mode 100644
index 0000000..48e63de
--- /dev/null
+++ b/src/view/frame/zoomtoolbar.py
@@ -0,0 +1,84 @@
+# Copyright (C) 2006-2007 Red Hat, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+from gettext import gettext as _
+
+import gtk
+
+from sugar.graphics.palette import Palette
+from sugar.graphics.toolbutton import ToolButton
+
+from view.frame.frameinvoker import FrameWidgetInvoker
+from model.shellmodel import ShellModel
+
+class ZoomToolbar(gtk.Toolbar):
+ def __init__(self, shell):
+ gtk.Toolbar.__init__(self)
+
+ self._shell = shell
+
+ self.set_show_arrow(False)
+
+ button = ToolButton(icon_name='zoom-neighborhood')
+ button.connect('clicked',
+ self._level_clicked_cb,
+ ShellModel.ZOOM_MESH)
+ self.insert(button, -1)
+ button.show()
+
+ palette = Palette(_('Neighborhood'))
+ palette.props.invoker = FrameWidgetInvoker(button)
+ palette.set_group_id('frame')
+ button.set_palette(palette)
+
+ button = ToolButton(icon_name='zoom-groups')
+ button.connect('clicked',
+ self._level_clicked_cb,
+ ShellModel.ZOOM_FRIENDS)
+ self.insert(button, -1)
+ button.show()
+
+ palette = Palette(_('Group'))
+ palette.props.invoker = FrameWidgetInvoker(button)
+ palette.set_group_id('frame')
+ button.set_palette(palette)
+
+ button = ToolButton(icon_name='zoom-home')
+ button.connect('clicked',
+ self._level_clicked_cb,
+ ShellModel.ZOOM_HOME)
+ self.insert(button, -1)
+ button.show()
+
+ palette = Palette(_('Home'))
+ palette.props.invoker = FrameWidgetInvoker(button)
+ palette.set_group_id('frame')
+ button.set_palette(palette)
+
+ button = ToolButton(icon_name='zoom-activity')
+ button.connect('clicked',
+ self._level_clicked_cb,
+ ShellModel.ZOOM_ACTIVITY)
+ self.insert(button, -1)
+ button.show()
+
+ palette = Palette(_('Activity'))
+ palette.props.invoker = FrameWidgetInvoker(button)
+ palette.set_group_id('frame')
+ button.set_palette(palette)
+
+ def _level_clicked_cb(self, button, level):
+ self._shell.set_zoom_level(level)
diff --git a/src/view/frame/zoomtray.py b/src/view/frame/zoomtray.py
deleted file mode 100644
index 2bab3ab..0000000
--- a/src/view/frame/zoomtray.py
+++ /dev/null
@@ -1,89 +0,0 @@
-# Copyright (C) 2006-2007 Red Hat, Inc.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-from gettext import gettext as _
-import logging
-
-import gtk
-
-from sugar.graphics.palette import Palette
-from sugar.graphics.radiotoolbutton import RadioToolButton
-
-from view.frame.frameinvoker import FrameWidgetInvoker
-from model.shellmodel import ShellModel
-
-class ZoomTray(gtk.HBox):
- def __init__(self, shell):
- gtk.HBox.__init__(self)
-
- self._shell = shell
-
- self._mesh_button = self._add_button('zoom-neighborhood',
- _('Neighborhood'), ShellModel.ZOOM_MESH)
- self._groups_button = self._add_button('zoom-groups',
- _('Group'), ShellModel.ZOOM_FRIENDS)
- self._home_button = self._add_button('zoom-home',
- _('Home'), ShellModel.ZOOM_HOME)
- self._activity_button = self._add_button('zoom-activity',
- _('Activity'), ShellModel.ZOOM_ACTIVITY)
-
- shell_model = shell.get_model()
- self._set_zoom_level(shell_model.props.zoom_level)
- shell_model.connect('notify::zoom-level', self.__notify_zoom_level_cb)
-
- def _add_button(self, icon_name, label, zoom_level):
- logging.debug('ZoomTray._add_button: %r %r %r' % (icon_name, label, zoom_level))
- if self.get_children():
- group = self.get_children()[0]
- else:
- group = None
-
- button = RadioToolButton(named_icon=icon_name, group=group)
- button.connect('toggled', self.__level_toggled_cb, zoom_level)
- self.pack_start(button)
- button.show()
-
- palette = Palette(label)
- palette.props.invoker = FrameWidgetInvoker(button)
- palette.set_group_id('frame')
- button.set_palette(palette)
-
- return button
-
- def __level_toggled_cb(self, button, zoom_level):
- if not button.get_active():
- return
- logging.debug('ZoomTray.__level_clicked_cb: %r' % zoom_level)
- if self._shell.get_model().props.zoom_level != zoom_level:
- self._shell.set_zoom_level(zoom_level)
-
- def __notify_zoom_level_cb(self, model, pspec):
- logging.debug('ZoomTray.__notify_zoom_level_cb: %r' % model.props.zoom_level)
- 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:
- self._mesh_button.props.active = True
- elif new_level == ShellModel.ZOOM_FRIENDS:
- self._groups_button.props.active = True
- elif new_level == ShellModel.ZOOM_HOME:
- self._home_button.props.active = True
- elif new_level == ShellModel.ZOOM_ACTIVITY:
- self._activity_button.props.active = True
- else:
- raise ValueError('Invalid zoom level: %r' % (new_level))
-
diff --git a/src/view/home/HomeBox.py b/src/view/home/HomeBox.py
index d2105fe..8764887 100644
--- a/src/view/home/HomeBox.py
+++ b/src/view/home/HomeBox.py
@@ -32,6 +32,7 @@ from sugar.profile import get_profile
from sugar import env
from view.home.activitiesdonut import ActivitiesDonut
+from view.devices import deviceview
from view.home.MyIcon import MyIcon
from model.shellmodel import ShellModel
from hardware import schoolserver
@@ -63,6 +64,9 @@ class HomeBox(hippo.CanvasBox, hippo.CanvasItem):
self._my_icon = _MyIcon(shell, style.XLARGE_ICON_SIZE)
self.append(self._my_icon, hippo.PACK_FIXED)
+ self._devices_box = _DevicesBox(shell_model.get_devices())
+ bottom_box.append(self._devices_box)
+
shell_model.connect('notify::state',
self._shell_state_changed_cb)
@@ -110,6 +114,37 @@ class HomeBox(hippo.CanvasBox, hippo.CanvasItem):
def release(self):
pass
+class _DevicesBox(hippo.CanvasBox):
+ def __init__(self, devices_model):
+ gobject.GObject.__init__(self,
+ orientation=hippo.ORIENTATION_HORIZONTAL,
+ xalign=hippo.ALIGNMENT_CENTER)
+
+ self._device_icons = {}
+
+ for device in devices_model:
+ self._add_device(device)
+
+ devices_model.connect('device-appeared',
+ self._device_appeared_cb)
+ devices_model.connect('device-disappeared',
+ self._device_disappeared_cb)
+
+ def _add_device(self, device):
+ view = deviceview.create(device)
+ self.append(view)
+ self._device_icons[device.get_id()] = view
+
+ def _remove_device(self, device):
+ self.remove(self._device_icons[device.get_id()])
+ del self._device_icons[device.get_id()]
+
+ def _device_appeared_cb(self, model, device):
+ self._add_device(device)
+
+ def _device_disappeared_cb(self, model, device):
+ self._remove_device(device)
+
class _MyIcon(MyIcon):
def __init__(self, shell, scale):
MyIcon.__init__(self, scale)