diff options
author | Tomeu Vizoso <tomeu@tomeuvizoso.net> | 2008-02-19 14:10:32 (GMT) |
---|---|---|
committer | Tomeu Vizoso <tomeu@tomeuvizoso.net> | 2008-02-19 14:10:32 (GMT) |
commit | f0689cc5bde7235ce73be14414a2648070215959 (patch) | |
tree | f73af68595ab387f5cc966cef2b2f2f6631a89d2 /src | |
parent | d61258768b33d8bb646c6bdf159ad46bc9059f19 (diff) |
Add the running activities to the top frame.
Diffstat (limited to 'src')
-rw-r--r-- | src/view/frame/Makefile.am | 1 | ||||
-rw-r--r-- | src/view/frame/activitiestray.py | 176 | ||||
-rw-r--r-- | src/view/frame/activitiestray2.py | 153 | ||||
-rw-r--r-- | src/view/frame/frame.py | 11 | ||||
-rw-r--r-- | src/view/frame/zoomtray.py | 9 |
5 files changed, 213 insertions, 137 deletions
diff --git a/src/view/frame/Makefile.am b/src/view/frame/Makefile.am index 83c8bf9..1091b6a 100644 --- a/src/view/frame/Makefile.am +++ b/src/view/frame/Makefile.am @@ -2,6 +2,7 @@ sugardir = $(pkgdatadir)/shell/view/frame sugar_PYTHON = \ __init__.py \ activitiestray.py \ + activitiestray2.py \ activitybutton.py \ clipboardpanelwindow.py \ clipboardtray.py \ diff --git a/src/view/frame/activitiestray.py b/src/view/frame/activitiestray.py index 11e812c..d285fa4 100644 --- a/src/view/frame/activitiestray.py +++ b/src/view/frame/activitiestray.py @@ -14,146 +14,62 @@ # 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 -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 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) +class ActivityButton(RadioToolButton): + def __init__(self, home_activity, group): + RadioToolButton.__init__(self, group=group) - icon = Icon(file=activity_model.get_icon_name(), - xo_color=activity_model.get_color()) + 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() - 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(hippo.CanvasBox): +class ActivitiesTray(HTray): def __init__(self, shell): - hippo.CanvasBox.__init__(self, orientation=hippo.ORIENTATION_HORIZONTAL) + HTray.__init__(self) + self._buttons = {} 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() - - 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 + 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.get_activity_id()) + 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, activity_id): + activity_host = self._shell.get_activity(activity_id) + if activity_host: + activity_host.present() - 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 new file mode 100644 index 0000000..a49a549 --- /dev/null +++ b/src/view/frame/activitiestray2.py @@ -0,0 +1,153 @@ +# 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/frame.py b/src/view/frame/frame.py index 0b95db8..ac72127 100644 --- a/src/view/frame/frame.py +++ b/src/view/frame/frame.py @@ -27,6 +27,7 @@ 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.friendstray import FriendsTray from view.frame.framewindow import FrameWindow @@ -167,16 +168,20 @@ class Frame(object): panel = self._create_panel(gtk.POS_TOP) zoom_tray = ZoomTray(self._shell) - panel.append(hippo.CanvasWidget(widget=zoom_tray), hippo.PACK_EXPAND) + 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() + return panel def _create_bottom_panel(self): panel = self._create_panel(gtk.POS_BOTTOM) - box = ActivitiesTray(self._shell) - panel.append(box, hippo.PACK_EXPAND) + activities_tray = activitiestray2.ActivitiesTray(self._shell) + panel.append(hippo.CanvasWidget(widget=activities_tray), hippo.PACK_EXPAND) return panel diff --git a/src/view/frame/zoomtray.py b/src/view/frame/zoomtray.py index 6353222..2bab3ab 100644 --- a/src/view/frame/zoomtray.py +++ b/src/view/frame/zoomtray.py @@ -17,16 +17,17 @@ from gettext import gettext as _ import logging +import gtk + from sugar.graphics.palette import Palette from sugar.graphics.radiotoolbutton import RadioToolButton -from sugar.graphics.tray import HTray from view.frame.frameinvoker import FrameWidgetInvoker from model.shellmodel import ShellModel -class ZoomTray(HTray): +class ZoomTray(gtk.HBox): def __init__(self, shell): - HTray.__init__(self) + gtk.HBox.__init__(self) self._shell = shell @@ -52,7 +53,7 @@ class ZoomTray(HTray): button = RadioToolButton(named_icon=icon_name, group=group) button.connect('toggled', self.__level_toggled_cb, zoom_level) - self.add_item(button) + self.pack_start(button) button.show() palette = Palette(label) |