From c4ff1832b2eb280971bc1cdfa920758087f97bcb Mon Sep 17 00:00:00 2001 From: Walter Bender Date: Thu, 03 Jun 2010 20:50:41 +0000 Subject: non-interactive mode --- 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: -- cgit v0.9.1