Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/turtleflags.py
diff options
context:
space:
mode:
Diffstat (limited to 'turtleflags.py')
-rwxr-xr-xturtleflags.py117
1 files changed, 89 insertions, 28 deletions
diff --git a/turtleflags.py b/turtleflags.py
index f1f7f33..2eb274b 100755
--- a/turtleflags.py
+++ b/turtleflags.py
@@ -99,6 +99,8 @@ class TurtleMain():
self._parse_command_line()
self._ensure_sugar_paths()
self._gnome_plugins = []
+ self._selected_challenge = None
+ self._challenge_window = None
if self._output_png:
# Outputing to file, so no need for a canvas
@@ -426,15 +428,12 @@ return %s(self)" % (p, P, P)
turtle_menu = MenuBuilder.make_sub_menu(menu, _('Turtle'))
menu = gtk.Menu()
- self._level = 0
- self._levels = self._get_levels()
self._custom_filepath = None
- for i, level in enumerate(self._levels):
- MenuBuilder.make_menu_item(
- menu,
- _(os.path.basename(level).replace('_', ' ')),
- self._do_level_cb, i)
- turtle_menu = MenuBuilder.make_sub_menu(menu, _('Challenges'))
+ MenuBuilder.make_menu_item(menu, _('Show challenges'),
+ self._create_store)
+ MenuBuilder.make_menu_item(menu, _('Hide challenges'),
+ self._hide_store)
+ challenges_menu = MenuBuilder.make_sub_menu(menu, _('Challenges'))
menu = gtk.Menu()
MenuBuilder.make_menu_item(menu, _('About...'), self._do_about_cb)
@@ -446,6 +445,7 @@ return %s(self)" % (p, P, P)
menu_bar.append(view_menu)
menu_bar.append(tool_menu)
menu_bar.append(turtle_menu)
+ menu_bar.append(challenges_menu)
# Add menus for plugins
for p in self._gnome_plugins:
@@ -612,6 +612,7 @@ Would you like to save before quitting?'))
def _do_eraser_cb(self, widget):
''' Callback for eraser button. '''
self.tw.eraser_button()
+ self.restore_challenge()
return
def _do_run_cb(self, widget=None):
@@ -666,7 +667,6 @@ Would you like to save before quitting?'))
self.win.get_window().set_cursor(gtk.gdk.Cursor(gtk.gdk.HAND1))
self.tw.deleting_blocks = True
-
def restore_challenge(self):
''' Restore the current challange after a clear screen '''
if self._custom_filepath is None:
@@ -684,28 +684,16 @@ Would you like to save before quitting?'))
else:
self.tw.turtles.get_active_turtle().set_xy((0, 0), pendown=False)
self.tw.lc.insert_image(center=False,
- filepath=os.path.join(
- self._get_execution_dir(), 'flags',
- self._levels[self._level] + '.png'), resize=True,
+ filepath=self._selected_challenge,
+ resize=True,
offset=True)
+ pos = self.tw.turtles.turtle_to_screen_coordinates((0, -50))
+ self.tw.turtles.get_active_turtle().draw_text(
+ os.path.basename(self._selected_challenge)[:-4].replace(
+ '_', ' '),
+ pos[0], pos[1], 24, gtk.gdk.screen_width() / 2)
self.tw.turtles.get_active_turtle().set_xy((0, 0), pendown=False)
- def _do_level_cb(self, widget, level):
- ''' Callback to resize blocks. '''
- self._level = level
- self._load_level()
-
- def _get_levels(self):
- ''' Look for level files in lessons directory. '''
- levels = glob.glob(os.path.join(self._get_execution_dir(),
- 'flags', '*.png'))
-
- level_files = []
- for level in levels:
- level_files.append(level[:-4])
-
- return level_files
-
def _do_copy_cb(self, button):
''' Callback for copy button. '''
self.tw.saving_blocks = False
@@ -788,6 +776,79 @@ Would you like to save before quitting?'))
else:
return os.path.abspath(dirname)
+ def _hide_store(self, widget=None):
+ if self._challenge_window is not None:
+ self._challenge_window.hide()
+
+ def _create_store(self, widget=None):
+ if self._challenge_window is None:
+ self._challenge_window = gtk.ScrolledWindow()
+ self._challenge_window.set_shadow_type(gtk.SHADOW_ETCHED_IN)
+ self._challenge_window.set_policy(gtk.POLICY_NEVER,
+ gtk.POLICY_AUTOMATIC)
+ width = gtk.gdk.screen_width() / 2
+ height = gtk.gdk.screen_height() / 2
+ self._challenge_window.set_size_request(width, height)
+ self._challenge_window.show()
+
+ store = gtk.ListStore(gtk.gdk.Pixbuf, str)
+
+ icon_view = gtk.IconView()
+ icon_view.set_model(store)
+ icon_view.set_selection_mode(gtk.SELECTION_SINGLE)
+ icon_view.connect('selection-changed', self._challenge_selected,
+ store)
+ icon_view.set_pixbuf_column(0)
+ icon_view.grab_focus()
+ self._challenge_window.add_with_viewport(icon_view)
+ icon_view.show()
+ self._fill_challenges_list(store)
+
+ width = gtk.gdk.screen_width() / 4
+ height = gtk.gdk.screen_height() / 4
+ self.fixed.put(self._challenge_window, width, height)
+
+ self._challenge_window.show()
+
+ def _get_selected_path(self, widget, store):
+ try:
+ iter_ = store.get_iter(widget.get_selected_items()[0])
+ image_path = store.get(iter_, 1)[0]
+
+ return image_path, iter_
+ except:
+ return None
+
+ def _challenge_selected(self, widget, store):
+ selected = self._get_selected_path(widget, store)
+
+ if selected is None:
+ self._selected_challenge = None
+ self._challenge_window.hide()
+ return
+
+ image_path, _iter = selected
+ iter_ = store.get_iter(widget.get_selected_items()[0])
+ image_path = store.get(iter_, 1)[0]
+
+ self._selected_challenge = image_path
+ self._challenge_window.hide()
+ self._load_level()
+
+ def _fill_challenges_list(self, store):
+ '''
+ Append images from the artwork_paths to the store.
+ '''
+ for filepath in self._scan_for_challenges():
+ pixbuf = None
+ pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(
+ filepath, 100, 100)
+ store.append([pixbuf, filepath])
+
+ def _scan_for_challenges(self):
+ return glob.glob(os.path.join(self._get_execution_dir(),
+ 'flags', '*.png'))
+
if __name__ == '__main__':
TurtleMain()