Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--NEWS4
-rw-r--r--TurtleArtActivity.py8
-rw-r--r--activity/activity-turtleart.svg16
-rw-r--r--activity/activity.info2
-rw-r--r--sprites.py12
-rw-r--r--tablock.py61
-rw-r--r--tacanvas.py48
-rw-r--r--talogo.py4
-rw-r--r--taturtle.py17
-rw-r--r--tawindow.py115
10 files changed, 196 insertions, 91 deletions
diff --git a/NEWS b/NEWS
index d05a37b..f0a7004 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,7 @@
+88
+
+* alsroot fixed ObjectChooser bug (#2002)
+
87
* added fill block
diff --git a/TurtleArtActivity.py b/TurtleArtActivity.py
index e70bceb..82b605e 100644
--- a/TurtleArtActivity.py
+++ b/TurtleArtActivity.py
@@ -191,8 +191,8 @@ class TurtleArtActivity(activity.Activity):
def do_load_ta_project_cb(self, button):
""" Load a project from the Journal """
from sugar.graphics.objectchooser import ObjectChooser
- chooser = ObjectChooser(_("Project"), None, gtk.DIALOG_MODAL | \
- gtk.DIALOG_DESTROY_WITH_PARENT)
+ chooser = ObjectChooser(_("Project"), self,
+ gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT)
try:
result = chooser.run()
if result == gtk.RESPONSE_ACCEPT:
@@ -218,8 +218,8 @@ class TurtleArtActivity(activity.Activity):
def import_py(self):
""" Import Python code from the Journal to load into 'myblock'. """
from sugar.graphics.objectchooser import ObjectChooser
- chooser = ObjectChooser('Python code', None, gtk.DIALOG_MODAL | \
- gtk.DIALOG_DESTROY_WITH_PARENT)
+ chooser = ObjectChooser('Python code', self,
+ gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT)
try:
result = chooser.run()
if result == gtk.RESPONSE_ACCEPT:
diff --git a/activity/activity-turtleart.svg b/activity/activity-turtleart.svg
index 557bb45..7045cba 100644
--- a/activity/activity-turtleart.svg
+++ b/activity/activity-turtleart.svg
@@ -3,16 +3,16 @@
<!ENTITY fill_color "#eee">
]><svg height="55px" viewBox="0 0 55 55" width="55px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" stroke-linecap="round" stroke-linejoin="round" stroke-width="3.5" stroke="&stroke_color;" fill="&fill_color;">
<g>
- <path d="M 27.497 48.279 C 26.944 48.279 26.398 48.244 25.86 48.179 L 27.248 50.528 L 28.616 48.215 C 28.245 48.245 27.875 48.279 27.497 48.279 Z " />
+ <path d="M 27.497 48.279 C 26.944 48.279 26.398 48.244 25.86 48.179 L 27.248 50.528 L 28.616 48.215 C 28.245 48.245 27.875 48.279 27.497 48.279 Z " stroke="&stroke_color;" fill="&fill_color;" />
<g>
- <path d="M 40.16 11.726 C 37.996 11.726 36.202 13.281 35.817 15.333 C 37.676 16.678 39.274 18.448 40.492 20.541 C 42.777 20.369 44.586 18.48 44.586 16.151 C 44.586 13.707 42.604 11.726 40.16 11.726 Z " />
- <path d="M 40.713 39.887 C 39.489 42.119 37.853 44.018 35.916 45.443 C 36.437 47.307 38.129 48.682 40.16 48.682 C 42.603 48.682 44.586 46.702 44.586 44.258 C 44.586 42.003 42.893 40.162 40.713 39.887 Z " />
- <path d="M 14.273 39.871 C 12.02 40.077 10.249 41.95 10.249 44.258 C 10.249 46.701 12.229 48.682 14.673 48.682 C 16.737 48.682 18.457 47.262 18.945 45.35 C 17.062 43.934 15.47 42.061 14.273 39.871 Z " />
- <path d="M 19.026 15.437 C 18.683 13.334 16.872 11.726 14.673 11.726 C 12.229 11.726 10.249 13.707 10.249 16.15 C 10.249 18.532 12.135 20.46 14.494 20.556 C 15.68 18.513 17.226 16.772 19.026 15.437 Z " />
+ <path d="M 40.16 11.726 C 37.996 11.726 36.202 13.281 35.817 15.333 C 37.676 16.678 39.274 18.448 40.492 20.541 C 42.777 20.369 44.586 18.48 44.586 16.151 C 44.586 13.707 42.604 11.726 40.16 11.726 Z " stroke="&stroke_color;" fill="&fill_color;" />
+ <path d="M 40.713 39.887 C 39.489 42.119 37.853 44.018 35.916 45.443 C 36.437 47.307 38.129 48.682 40.16 48.682 C 42.603 48.682 44.586 46.702 44.586 44.258 C 44.586 42.003 42.893 40.162 40.713 39.887 Z " stroke="&stroke_color;" fill="&fill_color;" />
+ <path d="M 14.273 39.871 C 12.02 40.077 10.249 41.95 10.249 44.258 C 10.249 46.701 12.229 48.682 14.673 48.682 C 16.737 48.682 18.457 47.262 18.945 45.35 C 17.062 43.934 15.47 42.061 14.273 39.871 Z " stroke="&stroke_color;" fill="&fill_color;" />
+ <path d="M 19.026 15.437 C 18.683 13.334 16.872 11.726 14.673 11.726 C 12.229 11.726 10.249 13.707 10.249 16.15 C 10.249 18.532 12.135 20.46 14.494 20.556 C 15.68 18.513 17.226 16.772 19.026 15.437 Z " stroke="&stroke_color;" fill="&fill_color;" />
</g>
- <path d="M 27.497 12.563 C 29.405 12.563 31.225 12.974 32.915 13.691 C 33.656 12.615 34.093 11.314 34.093 9.908 C 34.093 6.221 31.104 3.231 27.416 3.231 C 23.729 3.231 20.74 6.221 20.74 9.908 C 20.74 11.336 21.192 12.657 21.956 13.742 C 23.68 12.993 25.543 12.563 27.497 12.563 Z " />
+ <path d="M 27.497 12.563 C 29.405 12.563 31.225 12.974 32.915 13.691 C 33.656 12.615 34.093 11.314 34.093 9.908 C 34.093 6.221 31.104 3.231 27.416 3.231 C 23.729 3.231 20.74 6.221 20.74 9.908 C 20.74 11.336 21.192 12.657 21.956 13.742 C 23.68 12.993 25.543 12.563 27.497 12.563 Z " stroke="&stroke_color;" fill="&fill_color;" />
<g>
- <path d="M 43.102 30.421 C 43.102 35.1554 41.4568 39.7008 38.5314 43.0485 C 35.606 46.3963 31.6341 48.279 27.497 48.279 C 23.3599 48.279 19.388 46.3963 16.4626 43.0485 C 13.5372 39.7008 11.892 35.1554 11.892 30.421 C 11.892 20.6244 18.9364 12.563 27.497 12.563 C 36.0576 12.563 43.102 20.6244 43.102 30.421 Z " />
+ <path d="M 43.102 30.421 C 43.102 35.1554 41.4568 39.7008 38.5314 43.0485 C 35.606 46.3963 31.6341 48.279 27.497 48.279 C 23.3599 48.279 19.388 46.3963 16.4626 43.0485 C 13.5372 39.7008 11.892 35.1554 11.892 30.421 C 11.892 20.6244 18.9364 12.563 27.497 12.563 C 36.0576 12.563 43.102 20.6244 43.102 30.421 Z " stroke="&stroke_color;" fill="&fill_color;" />
</g>
<g>
<path d="M 25.875 33.75 L 24.333 29.125 L 27.497 26.538 L 31.112 29.164 L 29.625 33.833 Z " fill="&stroke_color;" stroke="none" />
@@ -23,4 +23,4 @@
<path d="M 31.292 34.042 L 32.605 29.578 L 36.792 28.042 C 36.792 28.042 37.469 30.705 36.75 33.709 C 36.21 35.965 34.666 38.07 34.666 38.07 L 31.292 34.042 Z " fill="&stroke_color;" stroke="none" />
</g>
</g>
-</svg> \ No newline at end of file
+</svg>
diff --git a/activity/activity.info b/activity/activity.info
index f31ecc6..bb6ad9f 100644
--- a/activity/activity.info
+++ b/activity/activity.info
@@ -1,6 +1,6 @@
[Activity]
name = Turtle Art
-activity_version = 86
+activity_version = 88
license = MIT
bundle_id = org.laptop.TurtleArtActivity
exec = sugar-activity TurtleArtActivity.TurtleArtActivity
diff --git a/sprites.py b/sprites.py
index 045ab98..5c64b09 100644
--- a/sprites.py
+++ b/sprites.py
@@ -85,7 +85,7 @@ import pango
class Sprites:
def __init__(self, canvas, area=None, gc=None):
self.canvas = canvas
- if area == None:
+ if gc == None:
self.area = self.canvas.window
self.gc = self.area.new_gc()
else:
@@ -154,7 +154,8 @@ class Sprite:
self._dx = [] # image offsets
self._dy = []
self.set_image(image)
- self._sprites.append_to_list(self)
+ if self._sprites is not None:
+ self._sprites.append_to_list(self)
def set_image(self, image, i=0, dx=0, dy=0):
while len(self.images) < i+1:
@@ -204,6 +205,8 @@ class Sprite:
self.inval()
def set_layer(self, layer):
+ if self._sprites is None:
+ return
self._sprites.remove_from_list(self)
self.layer = layer
for i in range(self._sprites.length_of_list()):
@@ -257,8 +260,9 @@ class Sprite:
self._sprites.remove_from_list(self)
def inval(self):
- self._sprites.area.invalidate_rect(
- gtk.gdk.Rectangle(self._x,self._y,self._width,self._height), False)
+ if self._sprites.area is not None:
+ self._sprites.area.invalidate_rect(gtk.gdk.Rectangle(self._x,
+ self._y, self._width, self._height), False)
def draw(self):
for i,img in enumerate(self.images):
diff --git a/tablock.py b/tablock.py
index ea67ed0..4923ecb 100644
--- a/tablock.py
+++ b/tablock.py
@@ -111,14 +111,18 @@ class Block:
# We may want to highlight a block...
def highlight(self):
- self.spr.set_shape(self.shapes[1])
+ if self.spr is not None:
+ self.spr.set_shape(self.shapes[1])
# Or unhighlight it.
def unhighlight(self):
- self.spr.set_shape(self.shapes[0])
+ if self.spr is not None:
+ self.spr.set_shape(self.shapes[0])
# We need to resize some blocks on the fly so that the labels fit.
def resize(self):
+ if not self.spr is not None:
+ return
dx = (self.spr.label_width()-self.spr.label_safe_width())/self.scale
if dx !=0:
self.dx += dx
@@ -128,12 +132,16 @@ class Block:
# Some blocks get a skin.
def set_image(self, image, x, y):
+ if not self.spr is not None:
+ return
self._image = image
self.spr.set_image(image, 1, x, y)
# The skin might need scaling.
# Keep the original here, the scaled version stays with the sprite.
def scale_image(self, x, y, w, h):
+ if not self.spr is not None:
+ return
if self._image is not None:
tmp = self._image.scale_simple(w, h,
gtk.gdk.INTERP_NEAREST)
@@ -141,6 +149,8 @@ class Block:
# We may want to rescale blocks as well.
def rescale(self, scale):
+ if not self.spr is not None:
+ return
for i in range(len(self._font_size)):
self._font_size[i] /= self.scale
self.dx /= self.scale
@@ -158,12 +168,16 @@ class Block:
self.spr.draw()
def refresh(self):
+ if not self.spr is not None:
+ return
self._make_block(self.svg)
self._set_margins()
self.spr.set_shape(self.shapes[0])
# We may want to add additional slots for arguments ("innies").
def add_arg(self, keep_expanding=True):
+ if not self.spr is not None:
+ return
h = self.svg.get_height()
self._ei += 1
if self.type == 'block' and keep_expanding:
@@ -175,6 +189,8 @@ class Block:
# We may want to grow a block vertically.
def expand_in_y(self, dy):
+ if not self.spr is not None:
+ return
self.ey += dy
if self.type == 'block':
self.svg.set_hide(True)
@@ -186,6 +202,8 @@ class Block:
# We may want to grow a block horizontally.
def expand_in_x(self, dx):
+ if not self.spr is not None:
+ return
self.ex += dx
if self.type == 'block':
self.svg.set_hide(True)
@@ -196,6 +214,8 @@ class Block:
self.refresh()
def reset_x(self):
+ if not self.spr is not None:
+ return 0
dx = -self.ex
self.ex = 0
self.svg.set_hide(False)
@@ -207,6 +227,8 @@ class Block:
return dx
def reset_y(self):
+ if not self.spr is not None:
+ return 0
dy = -self.ey
self.ey = 0
self.svg.set_hide(False)
@@ -218,6 +240,8 @@ class Block:
return dy
def get_expand_x_y(self):
+ if not self.spr is not None:
+ return(0, 0)
return (self.ex, self.ey)
def _new_block_from_factory(self, sprite_list, x, y):
@@ -233,22 +257,23 @@ class Block:
self.svg.set_show(True)
self._make_block(self.svg)
- self.spr = sprites.Sprite(sprite_list, x, y, self.shapes[0])
- self._set_margins()
- self._set_label_attributes()
-
- if (self.name == 'number' or self.name == 'string') and\
- len(self.values) > 0:
- for i, v in enumerate(self.values):
- if v is not None:
- self._set_labels(i, str(v))
- elif BLOCK_NAMES.has_key(self.name):
- for i, n in enumerate(BLOCK_NAMES[self.name]):
- self._set_labels(i, n)
-
- # Make sure the labels fit.
- if self.spr.label_width() > self.spr.label_safe_width():
- self.resize()
+ if sprite_list is not None:
+ self.spr = sprites.Sprite(sprite_list, x, y, self.shapes[0])
+ self._set_margins()
+ self._set_label_attributes()
+
+ if (self.name == 'number' or self.name == 'string') and\
+ len(self.values) > 0:
+ for i, v in enumerate(self.values):
+ if v is not None:
+ self._set_labels(i, str(v))
+ elif BLOCK_NAMES.has_key(self.name):
+ for i, n in enumerate(BLOCK_NAMES[self.name]):
+ self._set_labels(i, n)
+
+ # Make sure the labels fit.
+ if self.spr.label_width() > self.spr.label_safe_width():
+ self.resize()
def _set_margins(self):
self.spr.set_margins(self.svg.margins[0], self.svg.margins[1],
diff --git a/tacanvas.py b/tacanvas.py
index 28656aa..bf256a8 100644
--- a/tacanvas.py
+++ b/tacanvas.py
@@ -25,6 +25,7 @@ from sprites import Sprite
from tasprite_factory import SVG
from tautils import image_to_base64, data_to_string, round_int
import pango
+import cairo
from taconstants import CANVAS_LAYER, DEFAULT_TURTLE
import logging
_logger = logging.getLogger('turtleart-activity')
@@ -79,11 +80,14 @@ class TurtleGraphics:
self.tw = tw
self.width = width
self.height = height
- self.canvas = Sprite(tw.sprite_list, 0, 0,
- gtk.gdk.Pixmap(self.tw.area, self.width, self.height, -1))
+ if self.tw.interactive_mode:
+ self.canvas = Sprite(tw.sprite_list, 0, 0,
+ gtk.gdk.Pixmap(self.tw.area, self.width, self.height, -1))
+ else:
+ self.canvas = Sprite(None, 0, 0, self.tw.window)
+ self.canvas.set_layer(CANVAS_LAYER)
(self.cx, self.cy) = self.canvas.get_xy()
self.canvas.type = 'canvas'
- self.canvas.set_layer(CANVAS_LAYER)
self.gc = self.canvas.images[0].new_gc()
self.cm = self.gc.get_colormap()
self.fgrgb = [255, 0, 0]
@@ -434,17 +438,27 @@ class TurtleGraphics:
fd.set_size(int(size*self.tw.coord_scale)*pango.SCALE)
except:
pass
- if type(label) == str or type(label) == unicode:
- pl = self.tw.window.create_pango_layout(label.replace("\0"," "))
- elif type(label) == float or type(label) == int:
- pl = self.tw.window.create_pango_layout(str(label))
- else:
- pl = self.tw.window.create_pango_layout(str(label))
- pl.set_font_description(fd)
- pl.set_width(int(w) * pango.SCALE)
- self.canvas.images[0].draw_layout(self.gc, int(x), int(y), pl)
- w, h = pl.get_pixel_size()
- self.invalt(x, y, w, h)
+ if self.tw.interactive_mode:
+ if type(label) == str or type(label) == unicode:
+ pl = self.tw.window.create_pango_layout(label.replace("\0"," "))
+ elif type(label) == float or type(label) == int:
+ pl = self.tw.window.create_pango_layout(str(label))
+ else:
+ pl = self.tw.window.create_pango_layout(str(label))
+ pl.set_font_description(fd)
+ pl.set_width(int(w) * pango.SCALE)
+ self.canvas.images[0].draw_layout(self.gc, int(x), int(y), pl)
+ w, h = pl.get_pixel_size()
+ self.invalt(x, y, w, h)
+ else: # pixmap doesn't support pango
+ message = str(label).replace("\0"," ")
+ context = self.canvas.images[0].cairo_create()
+ context.set_font_size(size)
+ q, k, w, h = context.text_extents(message)[:4]
+ context.set_source_rgb(0, 0, 0)
+ context.move_to(x, y+h)
+ context.show_text(message)
+
if self.tw.saving_svg and self.pendown:
self.tw.svg_string += self.svg.text(x - self.width/2,
y + size,
@@ -480,9 +494,9 @@ class TurtleGraphics:
self.tw.active_turtle.move((self.cx + x - 28, self.cy + y - 30))
def invalt(self, x, y, w, h):
- rect = gtk.gdk.Rectangle(int(x+self.cx), int(y+self.cy), int(w),
- int(h))
- self.tw.area.invalidate_rect(rect, False)
+ if self.tw.interactive_mode:
+ self.tw.area.invalidate_rect(gtk.gdk.Rectangle(int(x+self.cx),
+ int(y+self.cy), int(w), int(h)), False)
def set_turtle(self, k, colors=None):
if not self.tw.turtles.dict.has_key(k):
diff --git a/talogo.py b/talogo.py
index 13d4c69..e2ebe43 100644
--- a/talogo.py
+++ b/talogo.py
@@ -556,14 +556,14 @@ class LogoCode:
""" Step through the list. """
if self.tw.running_sugar:
self.tw.activity.stop_button.set_icon("stopiton")
- else:
+ elif self.tw.interactive_mode:
self.tw.toolbar_shapes['stopiton'].set_layer(TAB_LAYER)
self.running = True
self.icall(self.evline, blklist)
yield True
if self.tw.running_sugar:
self.tw.activity.stop_button.set_icon("stopitoff")
- else:
+ elif self.tw.interactive_mode:
self.tw.toolbar_shapes['stopiton'].hide()
yield False
self.running = False
diff --git a/taturtle.py b/taturtle.py
index 4eaa72f..23344e2 100644
--- a/taturtle.py
+++ b/taturtle.py
@@ -122,14 +122,17 @@ class Turtle:
self.colors = colors[:]
self.shapes = generate_turtle_pixbufs(self.colors)
- self.spr = Sprite(turtles.sprite_list, 0, 0, self.shapes[0])
+ if turtles.sprite_list is not None:
+ self.spr = Sprite(turtles.sprite_list, 0, 0, self.shapes[0])
+ else:
+ self.spr = None
turtles.add_to_dict(key, self)
def set_heading(self, heading):
""" Set the turtle heading (and shape: one per 10 degrees) """
self.heading = heading
i = (int(self.heading+5)%360)/10
- if self.hidden is False:
+ if self.hidden is False and self.spr is not None:
try:
self.spr.set_shape(self.shapes[i])
except IndexError:
@@ -158,20 +161,22 @@ class Turtle:
def hide(self):
""" Hide the turtle. """
- self.spr.hide()
+ if self.spr is not None:
+ self.spr.hide()
self.hidden = True
def show(self):
""" Show the turtle. """
- self.spr.set_layer(TURTLE_LAYER)
- self.hidden = False
+ if self.spr is not None:
+ self.spr.set_layer(TURTLE_LAYER)
+ self.hidden = False
self.move((self.x, self.y))
self.set_heading(self.heading)
def move(self, pos):
""" Move the turtle. """
self.x, self.y = pos[0], pos[1]
- if self.hidden is False:
+ if self.hidden is False and self.spr is not None:
self.spr.move(pos)
return(self.x, self.y)
diff --git a/tawindow.py b/tawindow.py
index aa0bd4a..d0ac67f 100644
--- a/tawindow.py
+++ b/tawindow.py
@@ -66,39 +66,58 @@ from tautils import magnitude, get_load_name, get_save_name, data_from_file, \
from tasprite_factory import SVG, svg_str_to_pixbuf, svg_from_file
from sprites import Sprites, Sprite
+import logging
+_logger = logging.getLogger('turtleart-activity')
+
class TurtleArtWindow():
""" TurtleArt Window class abstraction """
timeout_tag = [0]
def __init__(self, win, path, parent=None, mycolors=None):
self.win = None
- self.window = win
+ self.parent = parent
+ if type(win) == gtk.DrawingArea:
+ self.interactive_mode = True
+ self.window = win
+ self.window.set_flags(gtk.CAN_FOCUS)
+ if self.parent is not None:
+ self.parent.show_all()
+ self.running_sugar = True
+ else:
+ self.window.show_all()
+ self.running_sugar = False
+ self.area = self.window.window
+ self.gc = self.area.new_gc()
+ self._setup_events()
+ elif type(win) == gtk.gdk.Pixmap:
+ self.interactive_mode = False
+ self.window = win
+ self.running_sugar = False
+ self.gc = self.window.new_gc()
+ else:
+ _logger.debug("bad win type %s" % (type(win)))
+
+ if self.running_sugar:
+ self.activity = parent
+ self.nick = profile.get_nick_name()
+ else:
+ self.activity = None
+ self.nick = None
+
self.path = path
self.load_save_folder = os.path.join(path, 'samples')
self.save_folder = None
self.save_file_name = None
- self.window.set_flags(gtk.CAN_FOCUS)
self.width = gtk.gdk.screen_width()
self.height = gtk.gdk.screen_height()
- if parent is not None:
- parent.show_all()
- self.running_sugar = True
- self.activity = parent
- self.nick = profile.get_nick_name()
- else:
- self.window.show_all()
- self.running_sugar = False
- self.activity = None
- self.nick = None
- self._setup_events()
+
self.keypress = ""
self.keyvalue = 0
self.dead_key = ""
self.mouse_flag = 0
self.mouse_x = 0
self.mouse_y = 0
- self.area = self.window.window
- self.gc = self.area.new_gc()
+
self.orientation = HORIZONTAL_PALETTE
if olpc_xo_1():
self.lead = 1.0
@@ -147,7 +166,10 @@ class TurtleArtWindow():
self.drag_turtle = 'move', 0, 0
self.drag_pos = 0, 0
self.block_list = Blocks(self.scale)
- self.sprite_list = Sprites(self.window, self.area, self.gc)
+ if self.interactive_mode:
+ self.sprite_list = Sprites(self.window, self.area, self.gc)
+ else:
+ self.sprite_list = None # Sprites(self.window, None, self.gc)
self.turtles = Turtles(self.sprite_list)
if mycolors == None:
Turtle(self.turtles, 1)
@@ -167,8 +189,9 @@ class TurtleArtWindow():
self.lc = LogoCode(self)
self.saved_pictures = []
- self._setup_misc()
- self._show_toolbar_palette(0, False)
+ if self.interactive_mode:
+ self._setup_misc()
+ self._show_toolbar_palette(0, False)
self.block_operation = ''
def _setup_events(self):
@@ -356,6 +379,8 @@ class TurtleArtWindow():
def hideblocks(self):
""" Callback from 'hide blocks' block """
+ if not self.interactive_mode:
+ return
self.hide = False
self.hideshow_button()
if self.running_sugar:
@@ -363,6 +388,8 @@ class TurtleArtWindow():
def showblocks(self):
""" Callback from 'show blocks' block """
+ if not self.interactive_mode:
+ return
self.hide = True
self.hideshow_button()
if self.running_sugar:
@@ -1035,6 +1062,8 @@ class TurtleArtWindow():
def _adjust_dock_positions(self, blk):
""" Adjust the dock x, y positions """
+ if not self.interactive_mode:
+ return
(sx, sy) = blk.spr.get_xy()
for i, c in enumerate(blk.connections):
if i > 0 and c is not None:
@@ -1202,7 +1231,8 @@ class TurtleArtWindow():
self.activity.hover_help_label.set_text(label)
self.activity.hover_help_label.show()
else:
- self.win.set_title(_("Turtle Art") + " — " + label)
+ if self.interactive_mode:
+ self.win.set_title(_("Turtle Art") + " — " + label)
return 0
def _buttonrelease_cb(self, win, event):
@@ -1383,7 +1413,11 @@ class TurtleArtWindow():
self.lc.ag = None
top = find_top_block(blk)
self.lc.run_blocks(top, self.just_blocks(), True)
- gobject.idle_add(self.lc.doevalstep)
+ if self.interactive_mode:
+ gobject.idle_add(self.lc.doevalstep)
+ else:
+ while self.lc.doevalstep():
+ pass
def _snap_to_dock(self):
""" Snap a block to the dock of another block. """
@@ -1426,8 +1460,8 @@ class TurtleArtWindow():
def _import_from_journal(self, blk):
""" Import a file from the Sugar Journal """
if self.running_sugar:
- chooser = ObjectChooser('Choose image', None,
- gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT)
+ chooser = ObjectChooser('Choose image', self.parent,
+ gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT)
try:
result = chooser.run()
if result == gtk.RESPONSE_ACCEPT:
@@ -1866,7 +1900,7 @@ class TurtleArtWindow():
btype, b[2] + self.canvas.cx, b[3] + self.canvas.cy,
'block', values, self.block_scale)
# Some blocks get transformed.
- if btype == 'string':
+ if btype == 'string' and blk.spr is not None:
blk.spr.set_label(blk.values[0].replace('\n', RETURN))
elif btype in EXPANDABLE or btype == 'nop':
if btype == 'vspace':
@@ -1888,7 +1922,7 @@ class TurtleArtWindow():
self._block_skin('pythonon', blk)
else:
self._block_skin('pythonoff', blk)
- elif btype in BOX_STYLE_MEDIA:
+ elif btype in BOX_STYLE_MEDIA and blk.spr is not None:
if len(blk.values) == 0 or blk.values[0] == 'None' or\
blk.values[0] == None:
self._block_skin(btype+'off', blk)
@@ -1932,16 +1966,20 @@ class TurtleArtWindow():
blk.spr.set_label(' ')
blk.resize()
- blk.spr.set_layer(BLOCK_LAYER)
+ if self.interactive_mode:
+ blk.spr.set_layer(BLOCK_LAYER)
if check_dock:
blk.connections = 'check'
return blk
- def load_start(self):
+ def load_start(self, ta_file=""):
""" Start a new project with a 'start' brick """
- self.process_data([[0, "start", PALETTE_WIDTH + 20,
- self.toolbar_offset+PALETTE_HEIGHT + 20,
- [None, None]]])
+ if self.interactive_mode:
+ self.process_data([[0, "start", PALETTE_WIDTH + 20,
+ self.toolbar_offset+PALETTE_HEIGHT + 20,
+ [None, None]]])
+ else:
+ self.process_data(data_from_file(ta_file))
def save_file(self):
""" Start a project to a file """
@@ -2017,12 +2055,15 @@ class TurtleArtWindow():
self.activity.coordinates_label.set_text("%s: %d %s: %d %s: %d" % (
_("xcor"), x, _("ycor"), y, _("heading"), h))
self.activity.coordinates_label.show()
- else:
+ elif self.interactive_mode:
self.win.set_title("%s — %s: %d %s: %d %s: %d" % (_("Turtle Art"),
_("xcor"), x, _("ycor"), y, _("heading"), h))
def showlabel(self, shp, label = ''):
""" Display a message on a status block """
+ if not self.interactive_mode:
+ print label
+ return
if shp == 'syntaxerror' and str(label) != '':
if self.status_shapes.has_key(str(label)[1:]):
shp = str(label)[1:]
@@ -2053,9 +2094,21 @@ class TurtleArtWindow():
dy *= h
return(w, h, x, y, dx, dy)
- def save_as_image(self, name="", svg=False):
+ def save_as_image(self, name="", svg=False, pixbuf=None):
""" Grab the current canvas and save it. """
+ if not self.interactive_mode:
+ print name
+ save_picture(self.canvas, name[:-3] + ".png")
+ return
+ """
+ self.color_map = self.window.get_colormap()
+ new_pix = pixbuf.get_from_drawable(self.window, self.color_map,
+ 0, 0, 0, 0,
+ self.width, self.height)
+ new_pix.save(name[:-3] + ".png", "png")
+ """
+
if self.running_sugar:
if svg:
if len(name) == 0: