diff options
-rw-r--r-- | TurtleArtActivity.py | 6 | ||||
-rw-r--r-- | block.py | 20 | ||||
-rw-r--r-- | constants.py | 11 | ||||
-rwxr-xr-x | sprite_factory.py | 59 | ||||
-rw-r--r-- | sprites.py | 5 | ||||
-rw-r--r-- | talogo.py | 21 | ||||
-rw-r--r-- | taproject.py | 3 | ||||
-rw-r--r-- | tasetup.py | 13 | ||||
-rw-r--r-- | taturtle.py | 12 | ||||
-rw-r--r-- | tawindow.py | 30 |
10 files changed, 143 insertions, 37 deletions
diff --git a/TurtleArtActivity.py b/TurtleArtActivity.py index 15bd409..d5b5ed2 100644 --- a/TurtleArtActivity.py +++ b/TurtleArtActivity.py @@ -63,6 +63,8 @@ from taexporthtml import * from taexportlogo import * import re +from constants import * + SERVICE = 'org.laptop.TurtleArtActivity' IFACE = SERVICE PATH = '/org/laptop/TurtleArtActivity' @@ -419,7 +421,7 @@ class TurtleArtActivity(activity.Activity): self.tw.cartesian_coordinates_spr.hide() self.tw.cartesian = False else: - self.tw.cartesian_coordinates_spr.set_layer(610) + self.tw.cartesian_coordinates_spr.set_layer(OVERLAY_LAYER) self.tw.cartesian = True def _do_polar_cb(self, button): @@ -427,7 +429,7 @@ class TurtleArtActivity(activity.Activity): self.tw.polar_coordinates_spr.hide() self.tw.polar = False else: - self.tw.polar_coordinates_spr.set_layer(610) + self.tw.polar_coordinates_spr.set_layer(OVERLAY_LAYER) self.tw.polar = True """ @@ -93,7 +93,7 @@ class Block: else: print "%s %s (%d %d)" % (name, labels[0], x, y) - svg = block_factory.SVG() + svg = sprite_factory.SVG() if name in TURTLE_PALETTE: svg.set_colors(TURTLE_COLORS) elif name in PEN_PALETTE: @@ -167,6 +167,24 @@ class Block: for label in labels: self.spr.set_label(label, labels.index(label)) + self.type = 'block' + +class Turtle: + def __init__(self, blocks, orientation=0, scale=1.0): + self.blocks = blocks + self.spr = None + self._new_turtle_from_prototype(orientation, scale) + self.blocks.append_to_list(self) + self.orientation = orientation + + def _new_turtle_from_prototype(self, orientation, scale): + svg = sprite_factory.SVG() + svg.set_scale(scale) + svg.set_orientation(orientation) + self.spr = sprites.Sprite(self.blocks.sprites, 0, 0, + svg_str_to_pixbuf(svg.turtle())) + self.type = 'turtle' + # # Load pixbuf from SVG string # diff --git a/constants.py b/constants.py index 47d6b86..41e11dd 100644 --- a/constants.py +++ b/constants.py @@ -13,6 +13,17 @@ from gettext import gettext as _ +# sprite layers +CANVAS_LAYER = 600 +TURTLE_LAYER = 630 +HIDE_LAYER = 100 +OVERLAY_LAYER = 615 +STATUS_LAYER = 710 +TOP_LAYER = 2000 +BLOCK_LAYER = 650 +CATEGORY_LAYER = 660 +TAB_LAYER = 670 + # block to proto tables BASIC_STYLE_HEAD = ['start', 'action 1', 'action 2'] BASIC_STYLE_TAIL = ['stop action'] diff --git a/sprite_factory.py b/sprite_factory.py index 061d624..e56ff09 100755 --- a/sprite_factory.py +++ b/sprite_factory.py @@ -34,6 +34,7 @@ class SVG: self._width = 0 self._height = 0 self._scale = 1 + self._orientation = 0 self._radius = 8 self._stroke_width = 1 self._innie = [False] @@ -197,6 +198,43 @@ class SVG: svg += self._end_boolean() return self._header() + svg + def turtle(self): + self._fill, self._stroke = "#D0D000", "none" + svg = self._rect(21, 21, 19.5, 18) + self._fill = "#808000" + svg += self._rect(3, 3, 30, 24) + svg += self._rect(3, 3, 24, 24) + svg += self._rect(3, 3, 30, 30) + svg += self._rect(3, 3, 24, 30) + svg += self._rect(3, 3, 27, 27) + svg += self._rect(3, 3, 21, 27) + svg += self._rect(3, 3, 33, 27) + svg += self._rect(3, 3, 27, 21) + svg += self._rect(3, 3, 21, 21) + svg += self._rect(3, 3, 33, 21) + svg += self._rect(3, 3, 27, 33) + svg += self._rect(3, 3, 21, 33) + svg += self._rect(3, 3, 33, 33) + svg += self._rect(3, 3, 30, 36) + svg += self._rect(3, 3, 24, 36) + svg += self._rect(3, 3, 30, 18) + svg += self._rect(3, 3, 24, 18) + svg += self._rect(3, 3, 36, 24) + svg += self._rect(3, 3, 36, 30) + svg += self._rect(3, 3, 36, 18) + svg += self._rect(3, 3, 36, 36) + self._fill, self._stroke = "#008000", "#008000" + svg += self._turtle_body() + self._fill, self._stroke = "#00a000", "#00a000" + svg += self._turtle_shell() + self._fill, self._stroke = "#000000", "#000000" + svg += self._circle(1.25,32.5,8) + svg += self._circle(1.25,27.5,8) + svg += self._footer() + self._width, self._height = 60, 60 + # TODO: Add orientation + return self._header() + svg + # # Utility methods # @@ -204,6 +242,9 @@ class SVG: def set_scale(self, scale=1): self._scale = scale + def set_orientation(self, orientation=0): + self._orientation = orientation + def expand(self, w=0, h=0): self._expand_x = w self._expand_y = h @@ -319,6 +360,24 @@ class SVG: "stroke-linecap:square;", "stroke-opacity:1;\" />\n") + def _circle(self, r, cx, cy): + return "%s%s%s%s%s%f%s%f%s%f%s" % ("<circle style=\"fill:", + self._fill, ";stroke:", self._stroke, ";\" r=\"", r, "\" cx=\"", + cx, "\" cy=\"", cy, "\" />") + + def _rect(self, w, h, x, y): + return "%s%s%s%s%s%f%s%f%s%f%s%f%s" % ("<rect style=\"fill:", + self._fill, ";stroke:", self._stroke, ";\" width=\"", w, + "\" height=\"", h,"\" x=\"", x, "\" y=\"", y, "\" />") + + def _turtle_body(self): + return "%s%s%s%s%s" % ("<path style=\"", self._fill, ";stroke:", + self._stroke, "\" d=\"M 20,42 C 21,41 23,40 24,40 C 24,39 24,40 26,41 C 28,43 31,43 34,41 C 35,40 35,39 36,40 C 36,40 38,41 39,42 C 41,42 45,43 46,43 C 47,43 46,41 43,39 L 39,36 L 42,34 C 44,30 45,28 43,25 L 41,22 L 46,18 C 48,16 47.5,13.5 47,13 C 46.5,12.5 46,13 45,13 C 44,13 43.5,14 42.5,15 C 39.5,17 40,18 37,17 C 32,16 31.5,15 34.5,12 C 36.5,10 36,7 34,6 C 32,3 28,4 26,6 C 24,8 23,10 25,12 C 28,15 27,16 22,17 C 18,18 19,17 17,15 C 16,14 16,13 15,13 C 14,13 13,13 13,13 C 12,13 11,16 14,18 L 19,22 L 17,25 C 15,28 16,30 18,34 L 20,36 L 16,39 C 13,41 12,43 13,43 C 14,43 18,42 20,42 z M 30,18 C 32,18 36,19 38,20 C 40,22 39.5,25 39.5,28 C 39.5,30 40,32.5 38.5,35 C 37,36.5 36.5,37.5 35,38 C 33.5,38.5 31,39 30,39 C 28,39 26,39 25,38 C 23,37 22.5,37 21.5,35 C 20.5,33 20.5,30 20.5,28 C 20.5,25 20,22 22,20 C 24,19 27,18 30,18 z\" />") + + def _turtle_shell(self): + return "%s%s%s%s%s" % ("<path style=\"", self._fill, ";stroke:", + self._stroke, "\" d=\"M 33,10 C 33,11 31.5,12 30,12 C 28,12 27,11 27,10 C 27,9 28,8 30,8 C 31.5,8 33,9 33,10 z\" />") + def _check_min_max(self): if self._x < self._min_x: self._min_x = self._x @@ -67,7 +67,7 @@ class Sprites: self.list.remove(spr) def find_sprite(self, pos): - list = self.list + list = self.list[:] list.reverse() for spr in list: if spr.hit(pos): return spr @@ -171,10 +171,12 @@ class Sprite: self.sprites.remove_from_list(self) def inval(self): + # print "inval (%f,%f) (%f,%f)" % (self.x,self.y,self.width,self.height) self.sprites.area.invalidate_rect( gtk.gdk.Rectangle(self.x,self.y,self.width,self.height), False) def draw(self): + # print "draw (%f,%f)" % (self.x,self.y) if isinstance(self.image, gtk.gdk.Pixbuf): self.sprites.area.draw_pixbuf( self.sprites.gc, self.image, 0, 0, self.x, self.y) @@ -183,7 +185,6 @@ class Sprite: self.sprites.gc, self.image, 0, 0, self.x, self.y, -1, -1) if len(self.labels) > 0: self.draw_label() - # self.inval() def hit(self, pos): x, y = pos @@ -44,6 +44,9 @@ from tajail import * from gettext import gettext as _ +from constants import * + + procstop = False class symbol: @@ -158,7 +161,7 @@ def readline(lc, line): return res def setup_cmd(lc, str): - lc.tw.turtle.spr.set_layer(100) + lc.tw.turtle.spr.set_layer(HIDE_LAYER) lc.procstop=False list = readline(lc, str) lc.step = start_eval(lc, list) @@ -176,11 +179,11 @@ def evline(lc, list): lc.arglist = None while lc.iline: if lc.tw.step_time > 0: - lc.tw.turtle.spr.set_layer(630) + lc.tw.turtle.spr.set_layer(TURTLE_LAYER) endtime = millis()+an_int(lc,lc.tw.step_time)*100 while millis()<endtime: yield True - lc.tw.turtle.spr.set_layer(100) + lc.tw.turtle.spr.set_layer(HIDE_LAYER) token = lc.iline[0] if token==lc.symopar: token=lc.iline[1] icall(lc, eval); yield True @@ -274,7 +277,7 @@ def debug_trace(lc, token): shp = 'info' lc.tw.status_spr.set_shape(lc.tw.status_shapes[shp]) lc.tw.status_spr.set_label(_(my_string)) - lc.tw.status_spr.set_layer(710) + lc.tw.status_spr.set_layer(STATUS_LAYER) return def undefined_check(lc, token): @@ -286,11 +289,11 @@ def no_args_check(lc): raise logoerror("#noinput") def prim_wait(lc,time): - lc.tw.turtle.spr.set_layer(630) + lc.tw.turtle.spr.set_layer(TURTLE_LAYER) endtime = millis()+an_int(lc,time*1000) while millis()<endtime: yield True - lc.tw.turtle.spr.set_layer(100) + lc.tw.turtle.spr.set_layer(HIDE_LAYER) ireturn(lc); yield True def prim_repeat(lc, num, list): @@ -989,11 +992,11 @@ def doevalstep(lc): try: lc.step.next() except StopIteration: - lc.tw.turtle.spr.set_layer(630) + lc.tw.turtle.spr.set_layer(TURTLE_LAYER) return False except logoerror, e: showlabel(lc, str(e)[1:-1]) - lc.tw.turtle.spr.set_layer(630) + lc.tw.turtle.spr.set_layer(TURTLE_LAYER) return False return True @@ -1069,7 +1072,7 @@ def showlabel(lc,label): shp = 'status' lc.tw.status_spr.set_shape(lc.tw.status_shapes[shp]) lc.tw.status_spr.set_label(label) - lc.tw.status_spr.set_layer(710) + lc.tw.status_spr.set_layer(STATUS_LAYER) def stop_logo(tw): tw.step_time = 0 diff --git a/taproject.py b/taproject.py index f550dd6..2b1db79 100644 --- a/taproject.py +++ b/taproject.py @@ -52,6 +52,7 @@ except: pass import block import sprites +from constants import * nolabel = ['audiooff', 'descriptionoff', 'journal'] shape_dict = {'journal':'texton', \ @@ -192,7 +193,7 @@ def load_spr(tw,b): except: if hasattr(spr,"ds_id"): print "couldn't open dsobject (" + str(spr.ds_id) + ")" - spr.set_layer(650) + spr.set_layer(BLOCK_LAYER) return spr def load_turtle(tw,b): @@ -33,6 +33,7 @@ from gettext import gettext as _ import block import sprites +from constants import * def numcheck(new, old): if new is '': return "0" @@ -268,16 +269,18 @@ def setup_misc(tw): # tw.category_spr = Sprite(tw, 0, 0, tw.selbuttons[0].group) tw.category_spr = sprites.Sprite(tw.sprites, 0, 0, tw.selbuttons[0].group) tw.category_spr.type = 'category' - tw.category_spr.set_layer(660) + tw.category_spr.set_layer(CATEGORY_LAYER) # masks get positioned on top of other blocks # tw.select_mask = Sprite(tw,100,100,\ tw.select_mask = sprites.Sprite(tw.sprites, 100, 100,\ load_image(tw, tw.path, '', 'masknumber')) tw.select_mask.type = 'selectmask' + tw.select_mask.hide() # tw.select_mask_string = Sprite(tw,100,100,\ tw.select_mask_string = sprites.Sprite(tw.sprites, 100, 100,\ load_image(tw, tw.path, '', 'maskstring')) tw.select_mask_string.type = 'selectmask' + tw.select_mask_string.hide() # used to hide the palette tw.hidden_palette_icon = load_image(tw, tw.path, '','blocks-') # media blocks get positioned into other blocks @@ -294,13 +297,13 @@ def setup_misc(tw): tw.cartesian_coordinates_spr = sprites.Sprite(tw.sprites, tw.width/2-600, tw.height/2-450, \ load_image(tw, tw.path, '', "Cartesian")) tw.cartesian_coordinates_spr.type = 'coordinates' - tw.cartesian_coordinates_spr.set_layer(610) + tw.cartesian_coordinates_spr.set_layer(OVERLAY_LAYER) tw.cartesian_coordinates_spr.hide() # tw.polar_coordinates_spr = Sprite(tw, tw.width/2-600, tw.height/2-450, \ tw.polar_coordinates_spr = sprites.Sprite(tw.sprites, tw.width/2-600, tw.height/2-450, \ load_image(tw, tw.path, '', "polar")) tw.polar_coordinates_spr.type = 'coordinates' - tw.polar_coordinates_spr.set_layer(610) + tw.polar_coordinates_spr.set_layer(OVERLAY_LAYER) tw.polar_coordinates_spr.hide() # status shapes get positioned at the bottom of the screen tw.status_shapes = {} @@ -321,7 +324,7 @@ def setup_misc(tw): tw.status_spr.set_label("test") # tw.status_spr.set_label_attributes(1.0, True, "left") tw.status_spr.type = 'status' - tw.status_spr.set_layer(900) + tw.status_spr.set_layer(HIDE_LAYER) tw.status_spr.hide() # everything should be loaded at this point # print tw.status_shapes @@ -333,7 +336,7 @@ def setup_selector(tw,name,y,blockdescriptions): onshape = load_image(tw, tw.path, 'palette', name+'on') # spr = Sprite(tw,143,y,offshape) spr = sprites.Sprite(tw.sprites, 143, y, offshape) - spr.set_layer(800) + spr.set_layer(TAB_LAYER) spr.offshape = offshape spr.onshape = onshape # print 'setting up selector ' + name diff --git a/taturtle.py b/taturtle.py index f11b579..823e8f8 100644 --- a/taturtle.py +++ b/taturtle.py @@ -26,8 +26,11 @@ class taTurtle: pass # from tasprites import * from tasetup import load_image import sprites +import block import pango +from constants import * + colors = {} DEGTOR = 2*pi/360 @@ -59,13 +62,15 @@ def tNew(tw,w,h): # t.canvas = Sprite(tw,0,0,gtk.gdk.Pixmap(tw.area,w,h,-1)) t.canvas = sprites.Sprite(tw.sprites, 0, 0, gtk.gdk.Pixmap(tw.area,w,h,-1)) t.canvas.type = 'canvas' - t.canvas.set_layer(600) + t.canvas.set_layer(CANVAS_LAYER) t.shapelist = \ [load_image(tw, tw.path, 'shapes','t'+str(i)) for i in range(36)] # t.spr = Sprite(tw,100,100,t.shapelist[0]) - t.spr = sprites.Sprite(tw.sprites, 100, 100, t.shapelist[0]) + # t.spr = sprites.Sprite(tw.sprites, 100, 100, t.shapelist[0]) + t.blk = block.Turtle(tw.blocks) + t.spr = t.blk.spr t.spr.type = 'turtle' - t.spr.set_layer(630) + t.spr.set_layer(TURTLE_LAYER) t.gc = t.canvas.image.new_gc() t.shade = 0 clearscreen(t) @@ -85,6 +90,7 @@ def clearscreen(t): t.pendown = True move_turtle(t) turn_turtle(t) + # t.tw.sprites.redraw_sprites() return None def forward(t, n): diff --git a/tawindow.py b/tawindow.py index 5da2cf8..53aa435 100644 --- a/tawindow.py +++ b/tawindow.py @@ -166,8 +166,7 @@ class TurtleArtWindow(): change the icon for user-defined blocks after Python code is loaded """ def set_userdefined(self): - list = self.sprites.list[:] - for spr in list: + for spr in self.sprites.list: if hasattr(spr,'proto') and spr.proto.name == 'nop': setimage(spr,self.media_shapes['pythonloaded']) self.nop = 'pythonloaded' @@ -177,13 +176,13 @@ class TurtleArtWindow(): """ def hideshow_button(self): if self.hide is False: - for b in self._blocks(): b.set_layer(100) + for b in self._blocks(): b.set_layer(HIDE_LAYER) self._hide_palette() self.select_mask.hide() self.select_mask_string.hide() self.hide = True else: - for b in self._blocks(): b.set_layer(650) + for b in self._blocks(): b.set_layer(BLOCK_LAYER) self.show_palette() self.hide = False self.turtle.canvas.inval() @@ -220,13 +219,16 @@ class TurtleArtWindow(): if self.selected_block != None: self._unselect() else: - self.status_spr.set_layer(400) + self.status_spr.set_layer(HIDE_LAYER) spr = self.sprites.find_sprite((x,y)) + print "found %s at (%d,%d)" % (str(spr),x,y) self.x, self.y = x,y self.dx = 0 self.dy = 0 if spr is None: return True + if hasattr(spr, 'type'): + print "type: %s" % (spr.type) if spr.type == "canvas": return True elif spr.type == 'selbutton': @@ -260,7 +262,7 @@ class TurtleArtWindow(): show palette """ def show_palette(self): - for i in self.selbuttons: i.set_layer(800) + for i in self.selbuttons: i.set_layer(TAB_LAYER) self._select_category(self.selbuttons[0]) self.palette = True @@ -705,19 +707,19 @@ class TurtleArtWindow(): for b in self.draggroup: b.move((b.x+200, b.y)) self._snap_to_dock() - for b in self.draggroup: b.set_layer(650) + for b in self.draggroup: b.set_layer(BLOCK_LAYER) self.draggroup = None if self.block_operation=='click': if self.spr.proto.name=='number': self.selected_block = spr self.select_mask.move((spr.x-5,spr.y-5)) - self.select_mask.set_layer(660) + self.select_mask.set_layer(MASK_LAYER) self.firstkey = True elif self.defdict.has_key(spr.proto.name): self.selected_block = spr if self.spr.proto.name=='string': self.select_mask_string.move((spr.x-5,spr.y-5)) - self.select_mask_string.set_layer(660) + self.select_mask_string.set_layer(MASK_LAYER) self.firstkey = True elif self.spr.proto.name in self.importblocks: self._import_from_journal(spr) @@ -735,13 +737,13 @@ class TurtleArtWindow(): if self.spr.proto.name=='number': self.selected_block = self.spr self.select_mask.move((self.spr.x-5,self.spr.y-5)) - self.select_mask.set_layer(660) + self.select_mask.set_layer(MASK_LAYER) self.firstkey = True elif self.defdict.has_key(self.spr.proto.name): self.selected_block = self.spr if self.spr.proto.name=='string': self.select_mask_string.move((self.spr.x-5,self.spr.y-5)) - self.select_mask_string.set_layer(660) + self.select_mask_string.set_layer(MASK_LAYER) self.firstkey = True elif self.spr.proto.name in self.importblocks: self._import_from_journal(self.spr) @@ -877,7 +879,7 @@ class TurtleArtWindow(): newblk = block.Block(self.blocks,proto.name,x-20,y-20,[proto.name]) newspr = newblk.spr - newspr.set_layer(2000) + newspr.set_layer(TOP_LAYER) self.dragpos = 20,20 newspr.type = 'block' newspr.proto = proto @@ -895,7 +897,7 @@ class TurtleArtWindow(): argspr.type = 'block' argspr.proto = argproto argspr.set_label(str(proto.defaults[i])) - argspr.set_layer(2000) + argspr.set_layer(TOP_LAYER) argspr.connections = [newspr,None] newspr.connections[i+1] = argspr self.draggroup = findgroup(newspr) @@ -909,7 +911,7 @@ class TurtleArtWindow(): def _block_pressed(self, mask, x, y, spr): if spr is not None: self.draggroup = findgroup(spr) - for b in self.draggroup: b.set_layer(2000) + for b in self.draggroup: b.set_layer(TOP_LAYER) if spr.connections[0] != None and spr.proto.name == 'lock': b = self._find_top_block(spr) self.dragpos = x-b.x,y-b.y |