diff options
author | Tomeu Vizoso <tomeu@tomeuvizoso.net> | 2008-02-28 18:05:27 (GMT) |
---|---|---|
committer | Tomeu Vizoso <tomeu@tomeuvizoso.net> | 2008-02-28 18:05:27 (GMT) |
commit | 8def8c1057b750a356a1bdac3896d6929a6bc5a2 (patch) | |
tree | 193a51db29a5fd341de50a91c30697f5ee6c1acf /src | |
parent | 326f71e7e4373b9f0211bb6b8308a83e274d8cb5 (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.py | 28 | ||||
-rw-r--r-- | src/view/devices/deviceview.py | 3 | ||||
-rw-r--r-- | src/view/devices/network/mesh.py | 40 | ||||
-rw-r--r-- | src/view/devices/network/wireless.py | 32 | ||||
-rw-r--r-- | src/view/frame/Makefile.am | 6 | ||||
-rw-r--r-- | src/view/frame/activitiestray.py | 251 | ||||
-rw-r--r-- | src/view/frame/activitiestray2.py | 153 | ||||
-rw-r--r-- | src/view/frame/clipboardbox.py (renamed from src/view/frame/clipboardtray.py) | 15 | ||||
-rw-r--r-- | src/view/frame/clipboardpanelwindow.py | 15 | ||||
-rw-r--r-- | src/view/frame/devicestray.py | 60 | ||||
-rw-r--r-- | src/view/frame/frame.py | 24 | ||||
-rw-r--r-- | src/view/frame/zoomtoolbar.py | 84 | ||||
-rw-r--r-- | src/view/frame/zoomtray.py | 89 | ||||
-rw-r--r-- | src/view/home/HomeBox.py | 35 |
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) |