diff options
Diffstat (limited to 'implodeactivity.py')
-rw-r--r-- | implodeactivity.py | 173 |
1 files changed, 169 insertions, 4 deletions
diff --git a/implodeactivity.py b/implodeactivity.py index 41e7aeb..5a19867 100644 --- a/implodeactivity.py +++ b/implodeactivity.py @@ -21,13 +21,17 @@ _logger = logging.getLogger('implode-activity') from gettext import gettext as _ -from sugar.activity.activity import Activity, ActivityToolbox -from sugar.graphics.toolbutton import ToolButton +from sugar.activity.activity import Activity, ActivityToolbox, get_bundle_path +from sugar.graphics import style +from sugar.graphics.icon import Icon from sugar.graphics.radiotoolbutton import RadioToolButton +from sugar.graphics.toolbutton import ToolButton -import implodegame +from implodegame import ImplodeGame +from helpwidget import HelpWidget import os + try: import json json.dumps @@ -50,7 +54,7 @@ class ImplodeActivity(Activity): _logger.debug('Starting implode activity...') - self._game = implodegame.ImplodeGame() + self._game = ImplodeGame() toolbox = _Toolbox(self) self.set_toolbox(toolbox) @@ -71,6 +75,8 @@ class ImplodeActivity(Activity): self._game.set_level(level) toolbox.connect(signal, callback) + toolbox.connect('help-clicked', self._help_clicked_cb) + self.set_canvas(self._game) self.show_all() self._game.grab_focus() @@ -109,6 +115,13 @@ class ImplodeActivity(Activity): f.write(content) f.close() + def _help_clicked_cb(self, source): + help_window = _HelpWindow() + help_window.set_transient_for(self.get_toplevel()) + help_window.show_all() + self.present() + + class _Toolbox(ActivityToolbox): __gsignals__ = { 'new-game-clicked' : (gobject.SIGNAL_RUN_LAST, None, ()), @@ -118,6 +131,7 @@ class _Toolbox(ActivityToolbox): 'easy-clicked' : (gobject.SIGNAL_RUN_LAST, None, ()), 'medium-clicked' : (gobject.SIGNAL_RUN_LAST, None, ()), 'hard-clicked' : (gobject.SIGNAL_RUN_LAST, None, ()), + 'help-clicked' : (gobject.SIGNAL_RUN_LAST, None, ()), } def __init__(self, activity): @@ -162,5 +176,156 @@ class _Toolbox(ActivityToolbox): add_level_button('medium-level', _("Medium"), 'medium-clicked') add_level_button('hard-level' , _("Hard") , 'hard-clicked') + separator = gtk.SeparatorToolItem() + separator.set_expand(True) + separator.set_draw(False) + toolbar.add(separator) + + # NOTE: Naming the icon "help" instead of "help-icon" seems to use a + # GTK stock icon instead of our custom help; the stock icon may be more + # desireable in the future. It doesn't seem to be themed for Sugar + # right now, however. + add_button('help-icon', _("Help"), 'help-clicked') + self.add_toolbar(_("Game"), toolbar) self.set_current_toolbar(1) + + +class _HelpWindow(gtk.Window): + def __init__(self): + super(_HelpWindow, self).__init__() + + self.set_border_width(style.LINE_WIDTH) + offset = style.GRID_CELL_SIZE + width = gtk.gdk.screen_width() - offset * 2 + height = gtk.gdk.screen_height() - offset * 2 + self.set_size_request(width, height) + self.set_position(gtk.WIN_POS_CENTER_ALWAYS) + self.set_decorated(False) + self.set_resizable(False) + self.set_modal(True) + + vbox = gtk.VBox() + self.add(vbox) + + toolbar = _HelpToolbar() + toolbar.connect('stop-clicked', self._stop_clicked_cb) + + vbox.pack_start(toolbar, False) + + self._help_widget = HelpWidget(self._icon_file) + vbox.pack_start(self._help_widget) + + self._help_nav_bar = _HelpNavBar() + vbox.pack_end(self._help_nav_bar, + expand=False, + padding=style.DEFAULT_SPACING) + + for (signal_name, callback) in [ + ('forward-clicked', self._forward_clicked_cb), + ('reload-clicked', self._reload_clicked_cb), + ('back-clicked', self._back_clicked_cb)]: + self._help_nav_bar.connect(signal_name, callback) + + self._update_prev_next() + + def _stop_clicked_cb(self, source): + self.destroy() + + def _forward_clicked_cb(self, source): + self._help_widget.next_stage() + self._update_prev_next() + + def _back_clicked_cb(self, source): + self._help_widget.prev_stage() + self._update_prev_next() + + def _reload_clicked_cb(self, source): + self._help_widget.replay_stage() + + def _icon_file(self, icon_name): + activity_path = get_bundle_path() + file_path = os.path.join(activity_path, 'icons', icon_name + '.svg') + return file_path + + def _update_prev_next(self): + hw = self._help_widget + self._help_nav_bar.set_can_prev_stage(hw.can_prev_stage()) + self._help_nav_bar.set_can_next_stage(hw.can_next_stage()) + + +class _HelpToolbar(gtk.Toolbar): + __gsignals__ = { + 'stop-clicked' : (gobject.SIGNAL_RUN_LAST, None, ()), + } + def __init__(self): + super(_HelpToolbar, self).__init__() + + icon = Icon() + icon.set_from_icon_name('help-icon', gtk.ICON_SIZE_LARGE_TOOLBAR) + self._add_widget(icon) + + self._add_separator() + + label = gtk.Label(_("Help")) + self._add_widget(label) + + self._add_separator(expand=True) + + stop = ToolButton(icon_name='dialog-cancel') + stop.set_tooltip(_('Done')) + stop.connect('clicked', self._stop_clicked_cb) + self.add(stop) + + def _add_separator(self, expand=False): + separator = gtk.SeparatorToolItem() + separator.set_expand(expand) + separator.set_draw(False) + self.add(separator) + + def _add_widget(self, widget): + tool_item = gtk.ToolItem() + tool_item.add(widget) + self.add(tool_item) + + def _stop_clicked_cb(self, button): + self.emit('stop-clicked') + + +class _HelpNavBar(gtk.HButtonBox): + __gsignals__ = { + 'forward-clicked' : (gobject.SIGNAL_RUN_LAST, None, ()), + 'back-clicked' : (gobject.SIGNAL_RUN_LAST, None, ()), + 'reload-clicked' : (gobject.SIGNAL_RUN_LAST, None, ()), + } + + def __init__(self): + super(_HelpNavBar, self).__init__() + + self.set_layout(gtk.BUTTONBOX_SPREAD) + + def add_button(icon_name, tooltip, signal_name): + icon = Icon() + icon.set_from_icon_name(icon_name, gtk.ICON_SIZE_LARGE_TOOLBAR) + button = gtk.Button() + button.set_image(icon) + button.set_tooltip_text(tooltip) + self.add(button) + + def callback(source): + self.emit(signal_name) + button.connect('clicked', callback) + + return button + + self._back_button = add_button('back', _("Previous"), 'back-clicked') + add_button('reload', _("Again"), 'reload-clicked') + self._forward_button = add_button('forward', _("Next"), 'forward-clicked') + + def set_can_prev_stage(self, can_prev_stage): + self._back_button.set_sensitive(can_prev_stage) + + def set_can_next_stage(self, can_next_stage): + self._forward_button.set_sensitive(can_next_stage) + + |