diff options
author | Walter Bender <walter.bender@gmail.com> | 2012-03-24 01:57:34 (GMT) |
---|---|---|
committer | Walter Bender <walter.bender@gmail.com> | 2012-03-24 01:57:34 (GMT) |
commit | 56a591d9fb6b7c16c656ff22b1b1105c52ca0aef (patch) | |
tree | b6e73afc304127b3c9f4acee95fd4a18ebefc023 | |
parent | 01a7aa50fc515040a0dfcb7243840b4ff9aaa099 (diff) |
cairo version; new help menu
-rwxr-xr-x | turtleconfusion.py | 210 |
1 files changed, 113 insertions, 97 deletions
diff --git a/turtleconfusion.py b/turtleconfusion.py index d244872..0cff962 100755 --- a/turtleconfusion.py +++ b/turtleconfusion.py @@ -24,6 +24,7 @@ import pygtk pygtk.require('2.0') import gtk +import cairo import getopt import sys @@ -66,11 +67,13 @@ class TurtleMain(): ''' Launch Turtle Art from outside of Sugar. ''' _HELP_MSG = 'turtleart.py: ' + _('usage is') + ''' - \tturtleconfusion.py - \tturtleconfusion.py project.ta''' - _INSTALL_PATH = '/usr/share/sugar/activities/TurtleConfusion.activity' + \tturtleart.py + \tturtleart.py project.ta + \tturtleart.py --output_png project.ta + \tturtleart.py -o project''' + _INSTALL_PATH = '/usr/share/sugar/activities/TurtleArt.activity' _ALTERNATIVE_INSTALL_PATH = \ - '/usr/local/share/sugar/activities/TurtleConfusion.activity' + '/usr/local/share/sugar/activities/TurtleArt.activity' _ICON_SUBPATH = 'images/turtle.png' _GNOME_PLUGIN_SUBPATH = 'gnome_plugins' @@ -81,11 +84,13 @@ class TurtleMain(): self._plugins = [] if self.output_png: + # Fix me: We need to create a cairo surface to work with pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, gtk.gdk.screen_width(), gtk.gdk.screen_height()) - self.canvas, mask = pixbuf.render_pixmap_and_mask() - self._build_window() + # self.canvas, mask = pixbuf.render_pixmap_and_mask() + self.canvas = pixbuf + self._build_window(interactive=False) self._draw_and_quit() else: self._read_initial_pos() @@ -126,8 +131,8 @@ class TurtleMain(): try: exec f in globals(), plugin self._plugins.append(plugin.values()[0](self)) - except ImportError: - print 'failed to import %s' % (P) + except ImportError, e: + print 'failed to import %s: %s' % (P, str(e)) def _run_plugins(self): ''' Tell the plugin about the TurtleWindow instance. ''' @@ -138,7 +143,7 @@ class TurtleMain(): '''Create a directory in a fashion similar to `mkdir -p`.''' try: os.makedirs(path) - except OSError as exc: + except OSError, exc: if exc.errno == errno.EEXIST: pass else: @@ -159,8 +164,6 @@ class TurtleMain(): self.tw.parent = self.win if self.ta_file is None: self.tw.load_start() - self._level = 0 - self._load_level(0) else: print self.ta_file self.tw.load_start(self.ta_file) @@ -174,11 +177,24 @@ class TurtleMain(): self.tw.load_start(self.ta_file) self.tw.lc.trace = 0 self.tw.run_button(0) - self.tw.save_as_image(self.ta_file, self.canvas) + self.tw.save_as_image(self.ta_file) - def _build_window(self): + def _build_window(self, interactive=True): ''' Initialize the TurtleWindow instance. ''' - self.tw = TurtleArtWindow(self.canvas, self._dirname) + if interactive: + win = self.canvas.get_window() + cr = win.cairo_create() + surface = cr.get_target() + else: + img_surface = cairo.ImageSurface(cairo.FORMAT_RGB24, + 1024, 768) + cr = cairo.Context(img_surface) + surface = cr.get_target() + self.turtle_canvas = surface.create_similar( + cairo.CONTENT_COLOR, gtk.gdk.screen_width() * 2, + gtk.gdk.screen_height() * 2) + self.tw = TurtleArtWindow(self.canvas, self._dirname, + turtle_canvas=self.turtle_canvas) self.tw.save_folder = os.path.expanduser('~') def _init_vars(self): @@ -226,7 +242,7 @@ class TurtleMain(): def _ensure_sugar_paths(self): ''' Make sure Sugar paths are present. ''' tapath = os.path.join(os.environ['HOME'], '.sugar', 'default', - 'org.laptop.TurtleConfusionActivity') + 'org.laptop.TurtleArtActivity') map(self._makepath, (os.path.join(tapath, 'data/'), os.path.join(tapath, 'instance/'))) @@ -264,12 +280,12 @@ class TurtleMain(): self.height = 550 def _setup_gtk(self): - ''' Set up a scrolled window in which to run Turtle Confusion. ''' + ''' Set up a scrolled window in which to run Turtle Blocks. ''' win = gtk.Window(gtk.WINDOW_TOPLEVEL) win.set_default_size(self.width, self.height) win.move(self.x, self.y) win.maximize() - win.set_title(_('Turtle Confusion')) + win.set_title(_('Turtle Art')) if os.path.exists(os.path.join(self._dirname, self._ICON_SUBPATH)): win.set_icon_from_file(os.path.join(self._dirname, self._ICON_SUBPATH)) @@ -319,12 +335,18 @@ class TurtleMain(): self._do_cartesian_cb) MenuBuilder.make_menu_item(menu, _('Polar coordinates'), self._do_polar_cb) + MenuBuilder.make_menu_item(menu, _('Rescale coordinates'), + self._do_rescale_cb) MenuBuilder.make_menu_item(menu, _('Grow blocks'), self._do_resize_cb, 1.5) MenuBuilder.make_menu_item(menu, _('Shrink blocks'), self._do_resize_cb, 0.667) MenuBuilder.make_menu_item(menu, _('Reset block size'), self._do_resize_cb, -1) + MenuBuilder.make_menu_item(menu, _('Turn off hover help'), + self._do_hover_help_off_cb) + MenuBuilder.make_menu_item(menu, _('Turn on hover help'), + self._do_hover_help_on_cb) view_menu = MenuBuilder.make_sub_menu(menu, _('View')) menu = gtk.Menu() @@ -349,6 +371,7 @@ class TurtleMain(): MenuBuilder.make_menu_item(menu, _('Stop'), self._do_stop_cb) turtle_menu = MenuBuilder.make_sub_menu(menu, _('Turtle')) + menu = gtk.Menu() self._level = 0 self._levels = self._get_levels() @@ -467,28 +490,11 @@ class TurtleMain(): def _do_cartesian_cb(self, button): ''' Callback to display/hide Cartesian coordinate overlay. ''' - if self.tw.cartesian is True: - if self.tw.coord_scale == 1: - self.tw.overlay_shapes['Cartesian_labeled'].hide() - else: - self.tw.overlay_shapes['Cartesian'].hide() - self.tw.cartesian = False - else: - if self.tw.coord_scale == 1: - self.tw.overlay_shapes['Cartesian_labeled'].set_layer( - OVERLAY_LAYER) - else: - self.tw.overlay_shapes['Cartesian'].set_layer(OVERLAY_LAYER) - self.tw.cartesian = True + self.tw.set_cartesian(True) def _do_polar_cb(self, button): ''' Callback to display/hide Polar coordinate overlay. ''' - if self.tw.polar is True: - self.tw.overlay_shapes['polar'].hide() - self.tw.polar = False - else: - self.tw.overlay_shapes['polar'].set_layer(OVERLAY_LAYER) - self.tw.polar = True + self.tw.set_polar(True) def _do_rescale_cb(self, button): ''' Callback to rescale coordinate space. ''' @@ -506,6 +512,16 @@ class TurtleMain(): self.tw.overlay_shapes['Cartesian_labeled'].set_layer( OVERLAY_LAYER) + def _do_hover_help_on_cb(self, button): + ''' Turn hover help on ''' + self.tw.no_help = False + + def _do_hover_help_off_cb(self, button): + ''' Turn hover help off ''' + self.tw.no_help = True + self.tw.last_label = None + self.tw.status_spr.hide() + def _do_palette_cb(self, widget): ''' Callback to show/hide palette of blocks. ''' self.tw.show_palette(self.i) @@ -524,7 +540,6 @@ class TurtleMain(): def _do_eraser_cb(self, widget): ''' Callback for eraser button. ''' self.tw.eraser_button() - self._load_level(self._level) return def _do_run_cb(self, widget): @@ -551,6 +566,67 @@ class TurtleMain(): self.tw.stop_button() return + 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 _load_level(self, custom=False): + self.tw.canvas.clearscreen() + if custom: + self.tw.canvas.setxy(0, 0, pendown=False) + self.tw.lc.insert_image(center=True, + filepath=self._custom_filepath, + resize=True, offset=False) + else: + self.tw.canvas.setxy(int(-gtk.gdk.screen_width() / 2), 0, + pendown=False) + self.tw.lc.insert_image(center=False, resize=False, + filepath=os.path.join( + self._get_execution_dir(), 'images', + 'turtle-a.png')) + # Slight offset to account for stroke width + if self._level + 1 in self.offsets: + xoffset = self.offsets[self._level + 1][0] + yoffset = self.offsets[self._level + 1][1] + else: + xoffset = 0 + yoffset = 0 + self.tw.canvas.setxy(-2.5 + xoffset, -2.5 + yoffset, pendown=False) + self.tw.lc.insert_image(center=False, + filepath=os.path.join( + self._get_execution_dir(), 'challenges', + self._levels[self._level] + '.svg'), resize=False, + offset=True) + self.tw.canvas.setxy(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. ''' + level_files = [] + + for i in range(40): + level_files.append('confusion-%d' % (i+1)) + + self.offsets = {} + offset_fd = open(os.path.join(self._get_execution_dir(), 'challenges', + 'offsets')) + for line in offset_fd: + try: + idx, offsets = line.strip('\n').split(':') + xoffset, yoffset = offsets.split(',') + self.offsets[int(idx)] = (int(xoffset), int(yoffset)) + except ValueError: + pass + offset_fd.close() + return level_files + def _do_copy_cb(self, button): ''' Callback for copy button. ''' clipBoard = gtk.Clipboard() @@ -617,66 +693,6 @@ class TurtleMain(): else: return os.path.abspath(dirname) - 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 _load_level(self, custom=False): - self.tw.canvas.clearscreen() - if custom: - self.tw.canvas.setxy(0, 0, pendown=False) - self.tw.lc.insert_image(center=True, - filepath=self._custom_filepath, - resize=True, offset=False) - else: - self.tw.canvas.setxy(int(-gtk.gdk.screen_width() / 2), 0, - pendown=False) - self.tw.lc.insert_image(center=False, resize=False, - filepath=os.path.join( - self._get_execution_dir(), 'images', - 'turtle-a.png')) - # Slight offset to account for stroke width - if self._level + 1 in self.offsets: - xoffset = self.offsets[self._level + 1][0] - yoffset = self.offsets[self._level + 1][1] - else: - xoffset = 0 - yoffset = 0 - self.tw.canvas.setxy(-2.5 + xoffset, -2.5 + yoffset, pendown=False) - self.tw.lc.insert_image(center=False, - filepath=os.path.join( - self._get_execution_dir(), 'challenges', - self._levels[self._level] + '.svg'), resize=False, - offset=True) - self.tw.canvas.setxy(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. ''' - level_files = [] - - for i in range(40): - level_files.append('confusion-%d' % (i+1)) - - self.offsets = {} - offset_fd = open(os.path.join(self._get_execution_dir(), 'challenges', - 'offsets')) - for line in offset_fd: - try: - idx, offsets = line.strip('\n').split(':') - xoffset, yoffset = offsets.split(',') - self.offsets[int(idx)] = (int(xoffset), int(yoffset)) - except ValueError: - pass - offset_fd.close() - return level_files if __name__ == '__main__': TurtleMain() |