Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWalter 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)
commit56a591d9fb6b7c16c656ff22b1b1105c52ca0aef (patch)
treeb6e73afc304127b3c9f4acee95fd4a18ebefc023
parent01a7aa50fc515040a0dfcb7243840b4ff9aaa099 (diff)
cairo version; new help menu
-rwxr-xr-xturtleconfusion.py210
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()