From 29759bd6a1c3147eeea16e13b04f04283238f4b8 Mon Sep 17 00:00:00 2001 From: Walter Bender Date: Sat, 20 Jul 2013 14:59:09 +0000 Subject: use icon view instead of combo box --- (limited to 'turtleflags.py') 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() -- cgit v0.9.1