Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/TurtleArtActivity.py
diff options
context:
space:
mode:
Diffstat (limited to 'TurtleArtActivity.py')
-rw-r--r--TurtleArtActivity.py119
1 files changed, 118 insertions, 1 deletions
diff --git a/TurtleArtActivity.py b/TurtleArtActivity.py
index c8f9755..9add9bd 100644
--- a/TurtleArtActivity.py
+++ b/TurtleArtActivity.py
@@ -28,6 +28,7 @@ import gtk
import cairo
import gobject
import dbus
+import glob
import logging
_logger = logging.getLogger('turtleart-activity')
@@ -43,6 +44,10 @@ from sugar.graphics.toolbutton import ToolButton
from sugar.graphics.radiotoolbutton import RadioToolButton
from sugar.graphics.alert import (ConfirmationAlert, NotifyAlert)
from sugar.graphics import style
+from sugar.graphics.combobox import ComboBox
+from sugar.graphics.toolcombobox import ToolComboBox
+from sugar.graphics.objectchooser import ObjectChooser
+from sugar import mime
from sugar.datastore import datastore
from sugar import profile
@@ -87,6 +92,7 @@ class TurtleArtActivity(activity.Activity):
self.tw = None
self.init_complete = False
+ self._stop_help = False
self.palette_buttons = []
self._palette_names = []
@@ -95,6 +101,9 @@ class TurtleArtActivity(activity.Activity):
self._check_ver_change(get_path(activity, 'data'))
self.connect("notify::active", self._notify_active_cb)
+ self._level = 0
+ self._custom_filepath = None
+
self.has_toolbarbox = HAS_TOOLBARBOX
_logger.debug('_setup_toolbar')
self._setup_toolbar()
@@ -132,6 +141,8 @@ class TurtleArtActivity(activity.Activity):
self._do_hover_help_toggle(None)
self.init_complete = True
+ self._load_level()
+
def check_buttons_for_fit(self):
''' Check to see which set of buttons to display '''
if not self.has_toolbarbox:
@@ -300,8 +311,10 @@ class TurtleArtActivity(activity.Activity):
return
if not self.has_toolbarbox:
self.palette_buttons[i].set_icon(palette_names[i] + 'on')
+ '''
else:
self._help_button.set_current_palette(palette_names[i])
+ '''
self.tw.show_palette(n=i)
self.do_showpalette()
@@ -348,8 +361,16 @@ class TurtleArtActivity(activity.Activity):
self.eraser_button.set_icon('eraseroff')
self.recenter()
self.tw.eraser_button()
+ self.restore_challenge()
gobject.timeout_add(250, self.eraser_button.set_icon, 'eraseron')
+ def restore_challenge(self):
+ ''' Restore the current challange after a clear screen '''
+ if self._custom_filepath is None:
+ self._load_level()
+ else:
+ self._load_level(custom=True)
+
def do_run_cb(self, button):
''' Callback for run button (rabbit) '''
self.run_button.set_icon('run-faston')
@@ -371,6 +392,13 @@ class TurtleArtActivity(activity.Activity):
def do_stop_cb(self, button):
''' Callback for stop button. '''
+ if not self._stop_help:
+ self._stop_help = True
+ self.tw.showblocks()
+ self.stop_turtle_button.set_icon('hideshowoff')
+ self.stop_turtle_button.set_tooltip(_('Hide blocks'))
+ return
+
# Auto show blocks after stop
if not self.tw.hide and not self.tw.running_blocks:
self.tw.hideblocks()
@@ -509,6 +537,14 @@ class TurtleArtActivity(activity.Activity):
# Given the change in how overlays are handled (v123), there is no way
# to erase and then redraw the overlays.
+ def _do_help_cb(self, button):
+ if os.path.exists(os.path.join(
+ activity.get_bundle_path(), 'challenges',
+ 'help-' + str(self._level + 1) + '.ta')):
+ self.read_file(os.path.join(
+ activity.get_bundle_path(), 'challenges',
+ 'help-' + str(self._level + 1) + '.ta'))
+
def get_document_path(self, async_cb, async_err_cb):
''' View TA code as part of view source. '''
ta_code_path = self._dump_ta_code()
@@ -606,7 +642,11 @@ class TurtleArtActivity(activity.Activity):
self.palette_toolbar_button = ToolbarButton(
page=self._palette_toolbar, icon_name='palette')
- self._help_button = HelpButton(self)
+ self._help_button = self._add_button('help-toolbar',
+ _('Help'),
+ self._do_help_cb,
+ None)
+ # self._help_button = HelpButton(self)
self._make_load_save_buttons(self.activity_toolbar_button)
@@ -876,6 +916,8 @@ class TurtleArtActivity(activity.Activity):
if self.tw.hw in [XO1, XO15, XO175, XO4]:
self._make_palette_buttons(self._palette_toolbar)
'''
+ self._make_confusion_combo(self._palette_toolbar)
+
self._palette_toolbar.show()
self._overflow_box.show_all()
self._overflow_palette.set_content(self._overflow_sw)
@@ -889,6 +931,9 @@ class TurtleArtActivity(activity.Activity):
self._overflow_box.remove(button)
if self._overflow_palette_button in self._palette_toolbar:
self._palette_toolbar.remove(self._overflow_palette_button)
+ if hasattr(self, '_levels_combo') and \
+ self._levels_tool in self._palette_toolbar:
+ self._palette_toolbar.remove(self._levels_tool)
def _generate_palette_buttons(self, add_buttons=False):
''' Create a radio button and a normal button for each palette '''
@@ -1016,6 +1061,20 @@ class TurtleArtActivity(activity.Activity):
self._palette.popdown(immediate=True)
return
+ def _make_confusion_combo(self, toolbar):
+ if hasattr(self, '_levels_tools'):
+ toolbar.insert(self._levels_tools, -1)
+ else:
+ self._levels = self._get_levels(activity.get_bundle_path())
+ level_names = []
+ for level in self._levels:
+ level_names.append(_(os.path.basename(level)))
+ self._levels_combo, self._levels_tool = \
+ self._combo_factory(level_names,
+ _('Select a challenge'),
+ toolbar,
+ self._levels_cb)
+
def _make_palette_buttons(self, toolbar, palette_button=False):
''' Creates the palette and block buttons for both toolbar types'''
if palette_button: # old-style toolbars need this button
@@ -1534,6 +1593,64 @@ in order to use the plugin.'))
help_strings[name] = tooltip
return button
+ def _combo_factory(self, options, tooltip, toolbar, callback, default=0):
+ ''' Combo box factory '''
+ combo = ComboBox()
+ if hasattr(combo, 'set_tooltip_text'):
+ combo.set_tooltip_text(tooltip)
+ combo.connect('changed', callback)
+ for i, option in enumerate(options):
+ combo.append_item(i, option.replace('-', ' '), None)
+ combo.set_active(default)
+ combo.show()
+ tool = ToolComboBox(combo)
+ tool.show()
+ if hasattr(toolbar, 'insert'):
+ toolbar.insert(tool, -1)
+ else:
+ toolbar.props.page.insert(tool, -1)
+ return combo, tool
+
+ def _get_levels(self, path):
+ ''' Look for level files in lessons directory. '''
+ levels = glob.glob(os.path.join(activity.get_bundle_path(),
+ 'flags', '*.png'))
+
+ level_files = []
+ for level in levels:
+ level_files.append(level[:-4])
+
+ return level_files
+
+ def _levels_cb(self, combobox=None):
+ ''' The combo box has changed. '''
+ if hasattr(self, '_levels_combo'):
+ i = self._levels_combo.get_active()
+ if i != -1: # and i != self._level:
+ self._level = i
+ self._load_level()
+ self._custom_filepath = None
+
+ def _load_level(self, custom=False):
+ self.tw.canvas.clearscreen()
+ if custom:
+ self.tw.turtles.get_active_turtle().set_xy((0, 0), pendown=False)
+ self.tw.lc.insert_image(center=True,
+ filepath=self._custom_filepath,
+ resize=True, offset=False)
+ else:
+ xoffset = 0
+ yoffset = 0
+ self.tw.turtles.get_active_turtle().set_xy((0, 0), pendown=False)
+ self.tw.lc.insert_image(center=False,
+ filepath=os.path.join
+ (activity.get_bundle_path(),
+ 'flags',
+ self._levels[self._level] + '.png'),
+ resize=True,
+ offset=True)
+ self.tw.turtles.get_active_turtle().set_xy((0, 0), pendown=False)
+
def _radio_button_factory(self, button_name, toolbar, cb, arg, tooltip,
group, position=-1):
''' Add a radio button to a toolbar '''