Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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.py110
6 files changed, 176 insertions, 76 deletions
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 36fe689..d0ac67f 100644
--- a/tawindow.py
+++ b/tawindow.py
@@ -66,40 +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
@@ -148,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)
@@ -168,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):
@@ -357,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:
@@ -364,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:
@@ -1036,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:
@@ -1203,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):
@@ -1384,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. """
@@ -1867,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':
@@ -1889,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)
@@ -1933,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 """
@@ -2018,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:]
@@ -2054,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: