# Copyright (C) 2009, Tutorius.org # Copyright (C) 2009, Simon Poirier # # # 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 """ This modules regroups the UI elements that drives the tutorial and tutorial creator from the Sugar frame. """ import gtk from gettext import gettext as _ import gconf import dbus import logging from sugar.graphics.tray import TrayIcon from sugar.graphics.palette import Palette from sugar.graphics.xocolor import XoColor from sugar.graphics.combobox import ComboBox from jarabe.frame.frameinvoker import FrameWidgetInvoker from jarabe.model.shell import get_model from sugar.tutorius.creator import default_creator from sugar.tutorius.vault import Vault _ICON_NAME = 'tutortool' LOGGER = logging.getLogger('remote') class TutoriusRemote(TrayIcon): def __init__(self): client = gconf.client_get_default() self._color = XoColor(client.get_string('/desktop/sugar/user/color')) super(TutoriusRemote, self).__init__(icon_name=_ICON_NAME, xo_color=self._color) self.set_palette_invoker(FrameWidgetInvoker(self)) self.palette = TPalette(_('Tutorius')) self.palette.set_group_id('frame') class TPalette(Palette): def __init__(self, primary_text): super(TPalette, self).__init__(primary_text) self._creator_item = gtk.MenuItem(_('Create a tutorial')) self._creator_item.connect('activate', self._toggle_creator) self._creator_item.show() self._tut_list_item = gtk.MenuItem(_('Show tutorials')) self._tut_list_item.connect('activate', self._list_tutorials) self._tut_list_item.show() self.menu.append(self._creator_item) self.menu.append(self._tut_list_item) self.set_content(None) def _toggle_creator(self, widget): creator = default_creator() if creator.is_authoring == False: # Replace the start creator label by stop creator self._creator_item.props.label = _("Stop authoring") creator.start_authoring(tutorial=None) else: # Attempt to close the creator - this will popup a confirmation # dialog if the user has unsaved changes creator.cleanup_cb() # If the creator was not actually closed - (in case cancel # is implemented one day) if creator.is_authoring == True: return # Switch back to start creator entry self._creator_item.props.label = _("Create a tutorial") def _list_tutorials(self, widget): dlg = gtk.Dialog('Run a tutorial', None, gtk.DIALOG_MODAL, (gtk.STOCK_OK, gtk.RESPONSE_ACCEPT, gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT)) dlg.vbox.pack_start(gtk.Label(_('Which tutorial do you want to run?\n'))) activity = get_model().get_active_activity() act_name = activity.get_type() tutorial_dict = Vault.list_available_tutorials(act_name) # Build the combo box combo = ComboBox() for (tuto_name, tuto_guid) in tutorial_dict.items(): combo.append_item(tuto_name, tuto_guid) dlg.vbox.pack_end(combo) dlg.show_all() result = dlg.run() dlg.destroy() if result == gtk.RESPONSE_ACCEPT: row = combo.get_active_item() if row: guid = row[0] name = row[1] LOGGER.debug("TPalette :: Got message to launch tutorial %s with guid %s"%(str(name), str(guid))) from sugar.tutorius.service import ServiceProxy service = ServiceProxy() service.launch(guid) def setup(tray): tray.add_device(TutoriusRemote())