Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/implodeactivity.py
diff options
context:
space:
mode:
Diffstat (limited to 'implodeactivity.py')
-rw-r--r--implodeactivity.py173
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)
+
+