diff options
author | Walter Bender <walter@walter-laptop.(none)> | 2010-01-27 21:28:29 (GMT) |
---|---|---|
committer | Walter Bender <walter@walter-laptop.(none)> | 2010-01-27 21:28:29 (GMT) |
commit | 8ee1d89d6fa222fbd0f7ed0ab75b2a65103a350c (patch) | |
tree | 3d83e41f7874a588041499f1b769e4de0a782638 | |
parent | f0330df08bec4aa9eb7d9bca6e4ef927ee5b1f36 (diff) |
multi-turtle support
-rw-r--r-- | constants.py | 10 | ||||
-rwxr-xr-x | sprite_factory.py | 8 | ||||
-rw-r--r-- | tacanvas.py | 534 | ||||
-rw-r--r-- | talogo.py | 287 | ||||
-rw-r--r-- | taturtle.py | 59 | ||||
-rw-r--r-- | tawindow.py | 39 |
6 files changed, 494 insertions, 443 deletions
diff --git a/constants.py b/constants.py index 49d36d0..2ccb98d 100644 --- a/constants.py +++ b/constants.py @@ -59,7 +59,7 @@ PALETTES = [['forward', 'back', 'clean', 'left', 'right', 'show', 'storeinbox', 'start'], ['kbinput', 'push', 'printheap', 'keyboard', 'pop', 'clearheap', 'myfunc', 'nop', 'leftpos', 'toppos', 'width', 'rightpos', - 'bottompos', 'height', 'print'], + 'bottompos', 'height', 'turtle', 'print'], ['hideblocks'], ['restore']] @@ -90,7 +90,7 @@ BASIC_STYLE = ['clean', 'penup', 'pendown', 'stack1', 'stack2', 'vspace', BASIC_STYLE_1ARG = ['forward', 'back', 'left', 'right', 'setheading', 'show', 'setscale', 'setpensize', 'setcolor', 'setshade', 'print', 'settextsize', 'settextcolor', 'print', 'wait', 'storeinbox1', - 'storeinbox2', 'wait', 'stack', 'push', 'nop'] + 'storeinbox2', 'wait', 'stack', 'push', 'nop', 'turtle'] BASIC_STYLE_2ARG = ['arc', 'setxy', 'fillscreen', 'storeinbox', 'myfunc'] BOX_STYLE = ['number', 'xcor', 'ycor', 'heading', 'pensize', 'color', 'shade', 'textcolor', 'textsize', 'box1', 'box2', 'string', 'leftpos', 'scale', @@ -148,7 +148,7 @@ BLOCK_NAMES = {'clean':[_('clean')], 'forward':[_('forward')], 'scale':[_('scale')], 'keyboard':[_('keyboard')], 'push':[_('push')], 'pop':[_('pop')], 'kbinput':[_('query keyboard')], 'myfunc':[_('python'), _('code'), _('value')], 'nop':[' '], - 'printheap':[_('show heap')], + 'printheap':[_('show heap')], 'turtle':[_('turtle')], 'clearheap':[_('empty heap')], 'restore':[_('restore')]} # @@ -180,7 +180,7 @@ PRIMITIVES = {'clean':'clean', 'forward':'forward', 'back':'back', 'arc':'arc', 'stopstack':'stopstack', 'hspace':'nop', 'vspace':'nop', 'start':'start', 'hat1':'nop1', 'stack1':'stack1', 'hat2':'nop2', 'stack2':'stack2', - 'hat':'nop3', 'action':'stack', + 'hat':'nop3', 'action':'stack', 'turtle':'turtle', 'storeinbox1':'storeinbox1', 'box1':'box1', 'storeinbox2':'storeinbox2', 'box2':'box2', 'storeinbox':'storeinbox', 'box':'box', @@ -196,7 +196,7 @@ PRIMITIVES = {'clean':'clean', 'forward':'forward', 'back':'back', 'arc':'arc', DEFAULTS = {'forward':[100], 'back':[100], 'left':[90], 'right':[90], 'arc':[90,100], 'setheading':[0], 'setscale':[33], 'show':[_('text')], - 'setpensize':[5], 'settextsize':[32], 'setcolor':[0], + 'setpensize':[5], 'settextsize':[32], 'setcolor':[0], 'turtle':[1], 'setshade':[50], 'fillscreen':[60,80], 'number':[100], 'random':[0,100], 'wait':[1], 'repeat':[4], 'setxy':[0,0], 'storeinbox':[_('my box'),100], 'box':[_('my box')], diff --git a/sprite_factory.py b/sprite_factory.py index 20ce42f..b4d0b36 100755 --- a/sprite_factory.py +++ b/sprite_factory.py @@ -245,12 +245,12 @@ class SVG: self._width, self._height = 60, 60 return self._header() + svg - def palette(self, width, height): - self._width, self._height = width, height + def palette(self, width1, width2, height): + self._width, self._height = width2, height self._fill, self._stroke = "#282828", "none" - svg = self._rect(width, 55, 0, 0) + svg = self._rect(width2, 55, 0, 0) self._fill, self._stroke = "#FFD000", "none" - svg += self._rect(width, height-55, 0, 55) + svg += self._rect(width1, height-55, 0, 55) svg += self._footer() return self._header() + svg diff --git a/tacanvas.py b/tacanvas.py index 3f680d9..bf81876 100644 --- a/tacanvas.py +++ b/tacanvas.py @@ -21,8 +21,6 @@ import gtk from math import sin,cos,pi -class taTurtle: pass - from tasetup import load_image import sprites import taturtle @@ -30,6 +28,16 @@ import pango from constants import * +def wrap100(n): + n = int(n) + n %= 200 + if n>99: n=199-n + return n + +def calc_shade(c,s): + if s<0: return int(c*(1+s*.8)) + return int(c+(65536-c)*s*.9) + colors = {} DEGTOR = 2*pi/360 @@ -55,262 +63,266 @@ color_table = ( 0xFF00FF,0xFF00E6,0xFF00CC,0xFF00B3,0xFF0099, 0xFF0080,0xFF0066,0xFF004D,0xFF0033,0xFF001A) -def tNew(tw,w,h): - t = taTurtle() - t.tw, t.width, t.height = tw, w, h - t.canvas = sprites.Sprite(tw.sprite_list, 0, 0, - gtk.gdk.Pixmap(tw.area,w,h,-1)) - (t.cx,t.cy) = t.canvas.get_xy() - t.canvas.type = 'canvas' - t.canvas.set_layer(CANVAS_LAYER) - # t.shapelist = [] - t.t = taturtle.Turtle(tw.turtle_list, tw.sprite_list, - ["#800000", "#A00000", "#D00000", "#800000"]) - t.spr = t.t.spr - t.spr.type = 'turtle' - t.spr.set_layer(TURTLE_LAYER) - t.gc = t.canvas.image.new_gc() - t.shade = 0 - clearscreen(t) - return t - -def clearscreen(t): - t.xcor, t.ycor, t.heading = 0,0,0 - rect = gtk.gdk.Rectangle(0,0,t.width,t.height) - t.gc.set_foreground(t.tw.bgcolor) - t.canvas.image.draw_rectangle(t.gc, True, *rect) - invalt(t,0,0,t.width,t.height) - setpensize(t,5) - setcolor(t,0) - settextcolor(t,70) - settextsize(t,32) - setshade(t,50) - t.pendown = True - move_turtle(t) - turn_turtle(t) - return None - -def forward(t, n): - n *= t.tw.coord_scale - t.gc.set_foreground(t.tw.fgcolor) - oldx, oldy = t.xcor, t.ycor - try: - t.xcor += n*sin(t.heading*DEGTOR) - t.ycor += n*cos(t.heading*DEGTOR) - except: - pass - if t.pendown: - draw_line(t,oldx,oldy,t.xcor,t.ycor) - move_turtle(t) - return None - -def seth(t,n): - try: - t.heading=n - except: - pass - t.heading%=360 - turn_turtle(t) - return None - -def right(t,n): - try: - t.heading+=n - except: - pass - t.heading%=360 - turn_turtle(t) - return None - -def arc(t,a,r): - t.gc.set_foreground(t.tw.fgcolor) - r *= t.tw.coord_scale - try: - if a<0: larc(t,-a,r) - else: rarc(t,a,r) - except: - pass - move_turtle(t) - turn_turtle(t) - -def rarc(t,a,r): - if r<0: r=-r; a=-a - cx = t.xcor+r*cos(t.heading*DEGTOR) - cy = t.ycor-r*sin(t.heading*DEGTOR) - x,y,w,h=t.width/2+int(cx-r),t.height/2-int(cy+r),int(2*r),int(2*r) - if t.pendown: - t.canvas.image.draw_arc(t.gc,False,x,y,w,h, \ - int(180-t.heading-a)*64,int(a)*64) - invalt(t,x-t.pensize*t.tw.coord_scale/2-3,y-t.pensize*t.tw.coord_scale/2-3,\ - w+t.pensize*t.tw.coord_scale+6,h+t.pensize*t.tw.coord_scale+6) - right(t,a) - t.xcor=cx-r*cos(t.heading*DEGTOR) - t.ycor=cy+r*sin(t.heading*DEGTOR) - -def larc(t,a,r): - if r<0: r=-r; a=-a - cx = t.xcor-r*cos(t.heading*DEGTOR) - cy = t.ycor+r*sin(t.heading*DEGTOR) - x,y,w,h=t.width/2+int(cx-r),t.height/2-int(cy+r),int(2*r),int(2*r) - if t.pendown: - t.canvas.image.draw_arc(t.gc,False,x,y,w,h,int(360-t.heading)*64, \ - int(a)*64) - invalt(t,x-t.pensize*t.tw.coord_scale/2-3,y-t.pensize*t.tw.coord_scale/2-3,\ - w+t.pensize*t.tw.coord_scale+6,h+t.pensize*t.tw.coord_scale+6) - right(t,-a) - t.xcor=cx+r*cos(t.heading*DEGTOR) - t.ycor=cy-r*sin(t.heading*DEGTOR) - -def setxy(t,x,y): - x *= t.tw.coord_scale - y *= t.tw.coord_scale - try: - t.xcor,t.ycor = x,y - except: - pass - move_turtle(t) - -def setpensize(t,ps): - try: - if ps<0: - ps=0; - t.pensize = ps - except: - pass - t.gc.set_line_attributes(int(t.pensize*t.tw.coord_scale), \ - gtk.gdk.LINE_SOLID, \ - gtk.gdk.CAP_ROUND, gtk.gdk.JOIN_MITER) - return None - -def setcolor(t,c): - try: - t.color = c - t.tcolor = c - except: - pass - set_fgcolor(t) - set_textcolor(t) - return None - -def settextcolor(t,c): - try: - t.tcolor = c - except: - pass - set_textcolor(t) - return None - -def settextsize(t,c): - try: - t.tw.textsize = c - except: - pass - return None - -def setshade(t,s): - try: - t.shade = s - except: - pass - set_fgcolor(t) - set_textcolor(t) - return None - -def fillscreen(t,c,s): - oldc, olds = t.color,t.shade - try: - setcolor(t,c); setshade(t,s) - rect = gtk.gdk.Rectangle(0,0,t.width,t.height) - t.gc.set_foreground(t.tw.fgcolor) - t.canvas.image.draw_rectangle(t.gc, True, *rect) - invalt(t,0,0,t.width,t.height) - setcolor(t,oldc); setshade(t,olds) - except: - pass - return None - -def set_fgcolor(t): - sh = (wrap100(t.shade)-50)/50.0 - rgb = color_table[wrap100(t.color)] - r,g,b = (rgb>>8)&0xff00,rgb&0xff00,(rgb<<8)&0xff00 - r,g,b = calc_shade(r,sh),calc_shade(g,sh),calc_shade(b,sh) - t.tw.rgb = [r>>8,g>>8,b>>8] - t.tw.fgcolor = t.tw.cm.alloc_color(r,g,b) - -def set_textcolor(t): - sh = (wrap100(t.shade)-50)/50.0 - rgb = color_table[wrap100(t.tcolor)] - r,g,b = (rgb>>8)&0xff00,rgb&0xff00,(rgb<<8)&0xff00 - r,g,b = calc_shade(r,sh),calc_shade(g,sh),calc_shade(b,sh) - t.tw.textcolor = t.tw.cm.alloc_color(r,g,b) - -def wrap100(n): - n = int(n) - n %= 200 - if n>99: n=199-n - return n - -def calc_shade(c,s): - if s<0: return int(c*(1+s*.8)) - return int(c+(65536-c)*s*.9) - -def setpen(t,bool): - t.pendown = bool - -def draw_pixbuf(t,pixbuf,a,b,x,y,w,h): - w *= t.tw.coord_scale - h *= t.tw.coord_scale - t.canvas.image.draw_pixbuf(t.gc, pixbuf, a, b, x, y) - invalt(t,x,y,w,h) - -def draw_text(t, label, x, y, size, w): - w *= t.tw.coord_scale - t.gc.set_foreground(t.tw.textcolor) - fd = pango.FontDescription('Sans') - try: - fd.set_size(int(size*t.tw.coord_scale)*pango.SCALE) - except: - pass - if type(label) == str or type(label) == unicode: - pl = t.tw.window.create_pango_layout(label.replace("\0"," ")) - elif type(label) == float or type(label) == int: - pl = t.tw.window.create_pango_layout(str(label)) - else: - print "draw text: Type Error: %s" % (type(label)) - pl = t.tw.window.create_pango_layout(str(label)) - pl.set_font_description(fd) - pl.set_width(int(w)*pango.SCALE) - t.canvas.image.draw_layout(t.gc,int(x),int(y),pl) - w,h = pl.get_pixel_size() - invalt(t,x,y,w,h) - -def draw_line(t,x1,y1,x2,y2): - x1,y1 = t.width/2+int(x1), t.height/2-int(y1) - x2,y2 = t.width/2+int(x2), t.height/2-int(y2) - if x1<x2: minx,maxx=x1,x2 - else: minx,maxx=x2,x1 - if y1<y2: miny,maxy=y1,y2 - else: miny,maxy=y2,y1 - w,h=maxx-minx,maxy-miny - t.canvas.image.draw_line(t.gc,x1,y1,x2,y2) - invalt(t,minx-t.pensize*t.tw.coord_scale/2-3, - miny-t.pensize*t.tw.coord_scale/2-3, - w+t.pensize*t.tw.coord_scale+6, - h+t.pensize*t.tw.coord_scale+6) - -def turn_turtle(t): - # t.spr.set_shape(t.shapelist[(int(t.heading+5)%360)/10]) - print "turning turtle to position %d" % ((int(t.heading+5)%360)/10) - t.t.rotate((int(t.heading+5)%360)/10) - -def move_turtle(t): - x,y = t.width/2+int(t.xcor), t.height/2-int(t.ycor) - t.spr.move((t.cx+x-30, t.cy+y-30)) - invalt(t, x-30, y-30, 60, 60) - -def invalt(t,x,y,w,h): - rect = gtk.gdk.Rectangle(int(x+t.cx), int(y+t.cy), int(w),int(h)) - t.tw.area.invalidate_rect(rect, False) - - - +# +# A class for the Turtle graphics canvas +# +class TurtleGraphics: + def __init__(self, tw, width, height): + self.tw = tw + self.width = width + self.height = height + self.canvas = sprites.Sprite(tw.sprite_list, 0, 0, + gtk.gdk.Pixmap(self.tw.area, self.width, self.height, -1)) + (self.cx, self.cy) = self.canvas.get_xy() + self.canvas.type = 'canvas' + self.canvas.set_layer(CANVAS_LAYER) + self.gc = self.canvas.image.new_gc() + self.tw.turtle.show() + self.shade = 0 + self.clearscreen() + + def clearscreen(self): + rect = gtk.gdk.Rectangle(0, 0, self.width, self.height) + self.gc.set_foreground(self.tw.bgcolor) + self.canvas.image.draw_rectangle(self.gc, True, *rect) + self.invalt(0, 0, self.width, self.height) + self.setpensize(5) + self.setcolor(0) + self.settextcolor(70) + self.settextsize(32) + self.setshade(50) + self.pendown = True + for t in range(self.tw.turtle_list.turtle_count()): + self.set_turtle(t) + self.xcor, self.ycor, self.heading = 0, 0, 0 + self.move_turtle() + self.turn_turtle() + + def forward(self, n): + n *= self.tw.coord_scale + self.gc.set_foreground(self.tw.fgcolor) + oldx, oldy = self.xcor, self.ycor + try: + self.xcor += n*sin(self.heading*DEGTOR) + self.ycor += n*cos(self.heading*DEGTOR) + except: + pass + if self.pendown: + self.draw_line(oldx, oldy, self.xcor, self.ycor) + self.move_turtle() + + def seth(self, n): + try: + self.heading = n + except: + pass + self.heading%=360 + self.turn_turtle() + + def right(self, n): + try: + self.heading += n + except: + pass + self.heading%=360 + self.turn_turtle() + + def arc(self,a,r): + self.gc.set_foreground(self.tw.fgcolor) + r *= self.tw.coord_scale + try: + if a<0: + self.larc(-a, r) + else: + self.rarc(a, r) + except: + pass + self.move_turtle() + self.turn_turtle() + + def rarc(self, a, r): + if r<0: + r=-r; a=-a + cx = self.xcor+r*cos(self.heading*DEGTOR) + cy = self.ycor-r*sin(self.heading*DEGTOR) + x,y = self.width/2+int(cx-r), self.height/2-int(cy+r) + w,h = int(2*r), int(2*r) + if self.pendown: + self.canvas.image.draw_arc(self.gc, False, x, y, w, h, + int(180-self.heading-a)*64, int(a)*64) + self.invalt(x-self.pensize*self.tw.coord_scale/2-3, + y-self.pensize*self.tw.coord_scale/2-3, + w+self.pensize*self.tw.coord_scale+6, + h+self.pensize*self.tw.coord_scale+6) + self.right(a) + self.xcor=cx-r*cos(self.heading*DEGTOR) + self.ycor=cy+r*sin(self.heading*DEGTOR) + + def larc(self, a, r): + if r<0: + r=-r; a=-a + cx = self.xcor-r*cos(self.heading*DEGTOR) + cy = self.ycor+r*sin(self.heading*DEGTOR) + x,y = self.width/2+int(cx-r), self.height/2-int(cy+r) + w,h = int(2*r), int(2*r) + if self.pendown: + self.canvas.image.draw_arc(self.gc,False, x, y, w, h, + int(360-self.heading)*64, int(a)*64) + self.invalt(x-self.pensize*self.tw.coord_scale/2-3, + y-self.pensize*self.tw.coord_scale/2-3, + w+self.pensize*self.tw.coord_scale+6, + h+self.pensize*self.tw.coord_scale+6) + self.right(-a) + self.xcor=cx+r*cos(self.heading*DEGTOR) + self.ycor=cy-r*sin(self.heading*DEGTOR) + + def setxy(self, x, y): + x *= self.tw.coord_scale + y *= self.tw.coord_scale + try: + self.xcor,self.ycor = x,y + except: + pass + self.move_turtle() + + def setpensize(self,ps): + try: + if ps<0: + ps=0; + self.pensize = ps + except: + pass + self.gc.set_line_attributes(int(self.pensize*self.tw.coord_scale), + gtk.gdk.LINE_SOLID, gtk.gdk.CAP_ROUND, gtk.gdk.JOIN_MITER) + + def setcolor(self,c): + try: + self.color = c + self.tcolor = c + except: + pass + self.set_fgcolor() + self.set_textcolor() + + def settextcolor(self,c): + try: + self.tcolor = c + except: + pass + self.set_textcolor() + + def settextsize(self,c): + try: + self.tw.textsize = c + except: + pass + + def setshade(self,s): + try: + self.shade = s + except: + pass + self.set_fgcolor() + self.set_textcolor() + + def fillscreen(self,c,s): + oldc, olds = self.color,self.shade + try: + setcolor(self,c); setshade(self,s) + rect = gtk.gdk.Rectangle(0,0,self.width,self.height) + self.gc.set_foreground(self.tw.fgcolor) + self.canvas.image.draw_rectangle(self.gc, True, *rect) + self.invalt(0,0,self.width,self.height) + self.setcolor(oldc); self.setshade(olds) + except: + pass + + def set_fgcolor(self): + sh = (wrap100(self.shade)-50)/50.0 + rgb = color_table[wrap100(self.color)] + r,g,b = (rgb>>8)&0xff00,rgb&0xff00,(rgb<<8)&0xff00 + r,g,b = calc_shade(r,sh),calc_shade(g,sh),calc_shade(b,sh) + self.tw.rgb = [r>>8,g>>8,b>>8] + self.tw.fgcolor = self.tw.cm.alloc_color(r,g,b) + + def set_textcolor(self): + sh = (wrap100(self.shade)-50)/50.0 + rgb = color_table[wrap100(self.tcolor)] + r,g,b = (rgb>>8)&0xff00,rgb&0xff00,(rgb<<8)&0xff00 + r,g,b = calc_shade(r,sh),calc_shade(g,sh),calc_shade(b,sh) + self.tw.textcolor = self.tw.cm.alloc_color(r,g,b) + + def setpen(self,bool): + self.pendown = bool + + def draw_pixbuf(self,pixbuf,a,b,x,y,w,h): + w *= self.tw.coord_scale + h *= self.tw.coord_scale + self.canvas.image.draw_pixbuf(self.gc, pixbuf, a, b, x, y) + self.invalt(x,y,w,h) + + def draw_text(self, label, x, y, size, w): + w *= self.tw.coord_scale + self.gc.set_foreground(self.tw.textcolor) + fd = pango.FontDescription('Sans') + try: + 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: + print "draw text: Type Error: %s" % (type(label)) + pl = self.tw.window.create_pango_layout(str(label)) + pl.set_font_description(fd) + pl.set_width(int(w)*pango.SCALE) + self.canvas.image.draw_layout(self.gc,int(x),int(y),pl) + w,h = pl.get_pixel_size() + self.invalt(x,y,w,h) + + def draw_line(self,x1,y1,x2,y2): + x1,y1 = self.width/2+int(x1), self.height/2-int(y1) + x2,y2 = self.width/2+int(x2), self.height/2-int(y2) + if x1<x2: minx,maxx=x1,x2 + else: minx,maxx=x2,x1 + if y1<y2: miny,maxy=y1,y2 + else: miny,maxy=y2,y1 + w,h=maxx-minx,maxy-miny + self.canvas.image.draw_line(self.gc,x1,y1,x2,y2) + self.invalt(minx-self.pensize*self.tw.coord_scale/2-3, + miny-self.pensize*self.tw.coord_scale/2-3, + w+self.pensize*self.tw.coord_scale+6, + h+self.pensize*self.tw.coord_scale+6) + + def turn_turtle(self): + self.tw.turtle.rotate(self.heading) + + def move_turtle(self): + x, y = self.width/2+int(self.xcor), self.height/2-int(self.ycor) + self.tw.turtle.move((self.cx+x-30, self.cy+y-30)) + self.invalt(x-30,y-30,60,60) + + 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) + + def set_turtle(self, i): + # TODO: associate pen state with individual turtles + # TODO: reskin active turtle + print "switching to Turtle %d" % (i) + if i > self.tw.turtle_list.turtle_count()-1: + # if it is a new turtle, put it in the center of the screen + self.tw.turtle = self.tw.turtle_list.get_turtle(i, True) + self.xcor = 0 + self.ycor = 0 + self.heading = 0 + self.tw.turtle.move_turtle() + self.tw.turtle.rotate(self.heading) + self.tw.turtle = self.tw.turtle_list.get_turtle(i, True) + tx, ty = self.tw.turtle.get_xy() + self.xcor = tx+30-self.width/2 + self.ycor = self.height/2-ty-30 + self.heading = self.tw.turtle.get_heading() + self.tw.turtle_list.show_all() @@ -170,7 +170,7 @@ def readline(lc, line): return res def setup_cmd(lc, str): - lc.tw.turtle.spr.set_layer(HIDE_LAYER) + lc.tw.turtle.hide() lc.procstop=False list = readline(lc, str) lc.step = start_eval(lc, list) @@ -188,11 +188,11 @@ def evline(lc, list): lc.arglist = None while lc.iline: if lc.tw.step_time > 0: - lc.tw.turtle.spr.set_layer(TURTLE_LAYER) + lc.tw.turtle.show() endtime = millis()+an_int(lc,lc.tw.step_time)*100 while millis()<endtime: yield True - lc.tw.turtle.spr.set_layer(HIDE_LAYER) + lc.tw.turtle.hide() token = lc.iline[0] if token == lc.symopar: token = lc.iline[1] @@ -269,21 +269,21 @@ def debug_trace(lc, token): if token.name in ['forward', 'right', 'back', 'left', 'seth', 'setxy', \ 'arc', 'heading', 'xcor', 'ycor']: my_string = token.name +\ - "\nxcor= " + str(int(lc.tw.turtle.xcor)) +\ - "\nycor= " + str(int(lc.tw.turtle.ycor)) +\ - "\nheading= " + str(int(lc.tw.turtle.heading)) +\ + "\nxcor= " + str(int(lc.tw.canvas.xcor)) +\ + "\nycor= " + str(int(lc.tw.canvas.ycor)) +\ + "\nheading= " + str(int(lc.tw.canvas.heading)) +\ "\nscale= " + str(lc.scale) elif token.name in ['penup', 'pendown', 'setcolor', 'setshade', \ 'settextcolor', 'settextsize', 'shade', 'color', \ 'fillscreen', 'pensize']: - if lc.tw.turtle.pendown: + if lc.tw.canvas.pendown: penstatus = "\npen down" else: penstatus = "\npen up" my_string = token.name + penstatus +\ - "\ncolor= " + str(int(lc.tw.turtle.color)) +\ - "\nshade= " + str(lc.tw.turtle.shade) +\ - "\npen size= " + str(lc.tw.turtle.pensize) + "\ncolor= " + str(int(lc.tw.canvas.color)) +\ + "\nshade= " + str(lc.tw.canvas.shade) +\ + "\npen size= " + str(lc.tw.canvas.pensize) else: my_string = token.name + "\nblocks status:\n" for k,v in lc.boxes.iteritems(): @@ -304,11 +304,11 @@ def no_args_check(lc): raise logoerror("#noinput") def prim_wait(lc,time): - lc.tw.turtle.spr.set_layer(TURTLE_LAYER) + lc.tw.turtle.show() endtime = millis()+an_int(lc,time*1000) while millis()<endtime: yield True - lc.tw.turtle.spr.set_layer(HIDE_LAYER) + lc.tw.turtle.hide() ireturn(lc); yield True def prim_repeat(lc, num, list): @@ -491,50 +491,50 @@ def lcNew(tw): defprim(lc,'keyboard', 0, lambda lc: lc.keyboard) defprim(lc,'userdefined', 1, lambda lc,x: loadmyblock(lc,x)) defprim(lc,'myfunc', 2, lambda lc,f,x: callmyfunc(lc, f, x)) - defprim(lc,'hres', 0, lambda lc: lc.tw.turtle.width/lc.tw.coord_scale) - defprim(lc,'vres', 0, lambda lc: lc.tw.turtle.height/lc.tw.coord_scale) + defprim(lc,'hres', 0, lambda lc: lc.tw.canvas.width/lc.tw.coord_scale) + defprim(lc,'vres', 0, lambda lc: lc.tw.canvas.height/lc.tw.coord_scale) defprim(lc,'leftpos', 0, lambda lc: \ - -(lc.tw.turtle.width/(lc.tw.coord_scale*2))) + -(lc.tw.canvas.width/(lc.tw.coord_scale*2))) defprim(lc,'toppos', 0, lambda lc: \ - lc.tw.turtle.height/(lc.tw.coord_scale*2)) + lc.tw.canvas.height/(lc.tw.coord_scale*2)) defprim(lc,'rightpos', 0, lambda lc: \ - lc.tw.turtle.width/(lc.tw.coord_scale*2)) + lc.tw.canvas.width/(lc.tw.coord_scale*2)) defprim(lc,'bottompos', 0, lambda lc: \ - -(lc.tw.turtle.height/(lc.tw.coord_scale*2))) + -(lc.tw.canvas.height/(lc.tw.coord_scale*2))) # turtle primitives defprim(lc,'clean', 0, lambda lc: clear(lc)) - defprim(lc,'forward', 1, lambda lc, x: forward(lc.tw.turtle, x)) - defprim(lc,'back', 1, lambda lc,x: forward(lc.tw.turtle,-x)) - defprim(lc,'seth', 1, lambda lc, x: seth(lc.tw.turtle, x)) - defprim(lc,'right', 1, lambda lc, x: right(lc.tw.turtle, x)) - defprim(lc,'left', 1, lambda lc,x: right(lc.tw.turtle,-x)) - defprim(lc,'heading', 0, lambda lc: lc.tw.turtle.heading) - defprim(lc,'setxy', 2, lambda lc, x, y: setxy(lc.tw.turtle, x, y)) + defprim(lc,'forward', 1, lambda lc, x: lc.tw.canvas.forward(x)) + defprim(lc,'back', 1, lambda lc,x: lc.tw.canvas.forward(-x)) + defprim(lc,'seth', 1, lambda lc, x: lc.tw.canvas.seth(x)) + defprim(lc,'right', 1, lambda lc, x: lc.tw.canvas.right(x)) + defprim(lc,'left', 1, lambda lc,x: lc.tw.canvas.right(-x)) + defprim(lc,'heading', 0, lambda lc: lc.tw.canvas.heading) + defprim(lc,'setxy', 2, lambda lc, x, y: lc.tw.canvas.setxy(x, y)) defprim(lc,'show',1,lambda lc, x: show(lc, x, True)) defprim(lc,'setscale', 1, lambda lc,x: set_scale(lc, x)) defprim(lc,'scale', 0, lambda lc: lc.scale) defprim(lc,'write',2,lambda lc, x,y: write(lc, x,y)) defprim(lc,'insertimage', 1, lambda lc,x: insert_image(lc, x, False)) - defprim(lc,'arc', 2, lambda lc, x, y: arc(lc.tw.turtle, x, y)) - defprim(lc,'xcor', 0, lambda lc: lc.tw.turtle.xcor/lc.tw.coord_scale) - defprim(lc,'ycor', 0, lambda lc: lc.tw.turtle.ycor/lc.tw.coord_scale) + defprim(lc,'arc', 2, lambda lc, x, y: arc(lc.tw.canvas, x, y)) + defprim(lc,'xcor', 0, lambda lc: lc.tw.canvas.xcor/lc.tw.coord_scale) + defprim(lc,'ycor', 0, lambda lc: lc.tw.canvas.ycor/lc.tw.coord_scale) + defprim(lc,'turtle', 1, lambda lc, x: lc.tw.canvas.set_turtle(int(x-1))) # pen primitives - defprim(lc,'pendown', 0, lambda lc: setpen(lc.tw.turtle, True)) - defprim(lc,'penup', 0, lambda lc: setpen(lc.tw.turtle, False)) + defprim(lc,'pendown', 0, lambda lc: lc.tw.canvas.setpen(True)) + defprim(lc,'penup', 0, lambda lc: lc.tw.canvas.setpen(False)) defprim(lc,'(', 1, lambda lc, x: prim_opar(lc,x)) - defprim(lc,'setcolor', 1, lambda lc, x: setcolor(lc.tw.turtle, x)) - defprim(lc,'settextcolor', 1, lambda lc, x: settextcolor(lc.tw.turtle, x)) - defprim(lc,'settextsize', 1, lambda lc, x: settextsize(lc.tw.turtle, x)) - defprim(lc,'setshade', 1, lambda lc, x: setshade(lc.tw.turtle, x)) - defprim(lc,'setpensize', 1, lambda lc, x: setpensize(lc.tw.turtle, x)) - defprim(lc,'fillscreen', 2, lambda lc, x, y: \ - fillscreen(lc.tw.turtle, x, y)) - defprim(lc,'color', 0, lambda lc: lc.tw.turtle.color) - defprim(lc,'shade', 0, lambda lc: lc.tw.turtle.shade) - defprim(lc,'pensize', 0, lambda lc: lc.tw.turtle.pensize) - defprim(lc,'textcolor', 0, lambda lc: lc.tw.turtle.textcolor) + defprim(lc,'setcolor', 1, lambda lc, x: lc.tw.canvas.setcolor(x)) + defprim(lc,'settextcolor', 1, lambda lc, x: lc.tw.canvas.settextcolor(x)) + defprim(lc,'settextsize', 1, lambda lc, x: lc.tw.canvas.settextsize(x)) + defprim(lc,'setshade', 1, lambda lc, x: lc.tw.canvas.setshade(x)) + defprim(lc,'setpensize', 1, lambda lc, x: lc.tw.canvas.setpensize(x)) + defprim(lc,'fillscreen', 2, lambda lc, x, y: lc.tw.canvas.fillscreen(x, y)) + defprim(lc,'color', 0, lambda lc: lc.tw.canvas.color) + defprim(lc,'shade', 0, lambda lc: lc.tw.canvas.shade) + defprim(lc,'pensize', 0, lambda lc: lc.tw.canvas.pensize) + defprim(lc,'textcolor', 0, lambda lc: lc.tw.canvas.textcolor) defprim(lc,'textsize', 0, lambda lc: lc.tw.textsize) defprim(lc,'red', 0, lambda lc: 0) defprim(lc,'orange', 0, lambda lc: 10) @@ -604,9 +604,9 @@ def lcNew(tw): lc.gplay = None lc.ag = None lc.nobox = "" - lc.title_height = int((lc.tw.turtle.height/30)*lc.tw.scale) - lc.body_height = int((lc.tw.turtle.height/60)*lc.tw.scale) - lc.bullet_height = int((lc.tw.turtle.height/45)*lc.tw.scale) + lc.title_height = int((lc.tw.canvas.height/30)*lc.tw.scale) + lc.body_height = int((lc.tw.canvas.height/60)*lc.tw.scale) + lc.bullet_height = int((lc.tw.canvas.height/45)*lc.tw.scale) # this dictionary is used to define the relative size and postion of # template elements (w, h, x, y, dx, dy, dx1, dy1...) @@ -697,13 +697,13 @@ def show_picture(lc, media, x, y, w, h): else: pixbuf = get_pixbuf_from_journal(dsobject, int(w), int(h)) if pixbuf is not None: - draw_pixbuf(lc.tw.turtle, pixbuf, 0, 0, int(x), int(y), \ - int(w), int(h)) + lc.tw.canvas.draw_pixbuf(pixbuf, 0, 0, int(x), int(y), + int(w), int(h)) dsobject.destroy() def get_pixbuf_from_journal(dsobject,w,h): try: - pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(dsobject.file_path, \ + pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(dsobject.file_path, int(w),int(h)) except: try: @@ -726,23 +726,22 @@ def show_description(lc, media, x, y, w, h): elif media[6:] is not "None": try: dsobject = datastore.get(media[6:]) - draw_text(lc.tw.turtle, \ - dsobject.metadata['description'],int(x),int(y), \ - lc.body_height, int(w)) + lc.tw.canvas.draw_text(dsobject.metadata['description'], + int(x),int(y), lc.body_height, int(w)) dsobject.destroy() except: print "no description?" def draw_title(lc,title,x,y): - draw_text(lc.tw.turtle,title,int(x),int(y),lc.title_height, \ - lc.tw.turtle.width-x) + lc.tw.canvas.draw_text(title,int(x),int(y),lc.title_height, + lc.tw.canvas.width-x) def calc_position(lc,t): w,h,x,y,dx,dy = lc.templates[t] - x *= lc.tw.turtle.width - y *= lc.tw.turtle.height - w *= (lc.tw.turtle.width-x) - h *= (lc.tw.turtle.height-y) + x *= lc.tw.canvas.width + y *= lc.tw.canvas.height + w *= (lc.tw.canvas.width-x) + h *= (lc.tw.canvas.height-y) dx *= w dy *= h return(w,h,x,y,dx,dy) @@ -750,194 +749,194 @@ def calc_position(lc,t): # title, one image, and description def show_template1(lc, title, media): w,h,xo,yo,dx,dy = calc_position(lc,'tp1') - x = -(lc.tw.turtle.width/2)+xo - y = lc.tw.turtle.height/2 - setxy(lc.tw.turtle, x, y) + x = -(lc.tw.canvas.width/2)+xo + y = lc.tw.canvas.height/2 + setxy(lc.tw.canvas, x, y) # save the text size so we can restore it later save_text_size = lc.tw.textsize # set title text - settextsize(lc.tw.turtle, lc.title_height) + settextsize(lc.tw.canvas, lc.title_height) show(lc,title) # calculate and set scale for media blocks - myscale = 45 * (lc.tw.turtle.height - lc.title_height*2) \ - / lc.tw.turtle.height + myscale = 45 * (lc.tw.canvas.height - lc.title_height*2) \ + / lc.tw.canvas.height set_scale(lc,myscale) # set body text size - settextsize(lc.tw.turtle, lc.body_height) + settextsize(lc.tw.canvas, lc.body_height) # render media object y -= int(lc.title_height*2*lc.tw.lead) # leave some space below the title - setxy(lc.tw.turtle, x, y) + lc.tw.canvas.setxy(x, y) show(lc, media) x = 0 - setxy(lc.tw.turtle, x, y) + lc.tw.canvas.setxy(x, y) show(lc, media.replace("media_","descr_")) # restore text size - settextsize(lc.tw.turtle, save_text_size) + lc.tw.canvas.settextsize(save_text_size) # title, two images (horizontal), two descriptions def show_template2(lc, title, media1, media2): w,h,xo,yo,dx,dy = calc_position(lc,'tp2') - x = -(lc.tw.turtle.width/2)+xo - y = lc.tw.turtle.height/2 - setxy(lc.tw.turtle, x, y) + x = -(lc.tw.canvas.width/2)+xo + y = lc.tw.canvas.height/2 + lc.tw.canvas.setxy(x, y) # save the text size so we can restore it later save_text_size = lc.tw.textsize # set title text - settextsize(lc.tw.turtle, lc.title_height) + lc.tw.canvas.settextsize(lc.title_height) show(lc,title) # calculate and set scale for media blocks - myscale = 45 * (lc.tw.turtle.height - lc.title_height*2)/lc.tw.turtle.height - set_scale(lc,myscale) + myscale = 45 * (lc.tw.canvas.height - lc.title_height*2)/lc.tw.canvas.height + set_scale(lc, myscale) # set body text size - settextsize(lc.tw.turtle, lc.body_height) + lc.tw.canvas.settextsize(lc.body_height) # render four quadrents y -= int(lc.title_height*2*lc.tw.lead) # leave some space below the title - setxy(lc.tw.turtle, x, y) + lc.tw.canvas.setxy(x, y) show(lc, media1) x = 0 - setxy(lc.tw.turtle, x, y) + lc.tw.canvas.setxy(x, y) show(lc, media2) y = -lc.title_height - setxy(lc.tw.turtle, x, y) + lc.tw.canvas.setxy(x, y) show(lc, media2.replace("media_","descr_")) - x = -(lc.tw.turtle.width/2)+xo - setxy(lc.tw.turtle, x, y) + x = -(lc.tw.canvas.width/2)+xo + lc.tw.canvas.setxy(x, y) show(lc, media1.replace("media_","descr_")) # restore text size - settextsize(lc.tw.turtle, save_text_size) + lc.tw.canvas.settextsize(save_text_size) # title and seven bullets def show_template3(lc, title, s1, s2, s3, s4, s5, s6, s7): w,h,xo,yo,dx,dy = calc_position(lc,'tp3') - x = -(lc.tw.turtle.width/2)+xo - y = lc.tw.turtle.height/2 - setxy(lc.tw.turtle, x, y) + x = -(lc.tw.canvas.width/2)+xo + y = lc.tw.canvas.height/2 + setxy(lc.tw.canvas, x, y) # save the text size so we can restore it later save_text_size = lc.tw.textsize # set title text - settextsize(lc.tw.turtle, lc.title_height) + lc.tw.canvas.settextsize(lc.title_height) show(lc,title) # set body text size - settextsize(lc.tw.turtle, lc.bullet_height) + lc.tw.canvas.settextsize(lc.bullet_height) y -= int(lc.title_height*2*lc.tw.lead) # leave some space below the title - setxy(lc.tw.turtle, x, y) + lc.tw.canvas.setxy(x, y) show(lc, s1) y -= int(lc.bullet_height*2*lc.tw.lead) - setxy(lc.tw.turtle, x, y) + lc.tw.canvas.setxy(x, y) show(lc, s2) y -= int(lc.bullet_height*2*lc.tw.lead) - setxy(lc.tw.turtle, x, y) + lc.tw.canvas.setxy(x, y) show(lc, s3) y -= int(lc.bullet_height*2*lc.tw.lead) - setxy(lc.tw.turtle, x, y) + lc.tw.canvas.setxy(x, y) show(lc, s4) y -= int(lc.bullet_height*2*lc.tw.lead) - setxy(lc.tw.turtle, x, y) + lc.tw.canvas.setxy(x, y) show(lc, s5) y -= int(lc.bullet_height*2*lc.tw.lead) - setxy(lc.tw.turtle, x, y) + lc.tw.canvas.setxy(x, y) show(lc, s6) y -= int(lc.bullet_height*2*lc.tw.lead) - setxy(lc.tw.turtle, x, y) + lc.tw.canvas.setxy(x, y) show(lc, s7) # restore text size - settextsize(lc.tw.turtle, save_text_size) + settextsize(lc.tw.canvas, save_text_size) # title, two images (vertical), two desciptions def show_template6(lc, title, media1, media2): w,h,xo,yo,dx,dy = calc_position(lc,'tp6') - x = -(lc.tw.turtle.width/2)+xo - y = lc.tw.turtle.height/2 - setxy(lc.tw.turtle, x, y) + x = -(lc.tw.canvas.width/2)+xo + y = lc.tw.canvas.height/2 + lc.tw.canvas.setxy(x, y) # save the text size so we can restore it later save_text_size = lc.tw.textsize # set title text - settextsize(lc.tw.turtle, lc.title_height) + lc.tw.canvas.settextsize(lc.title_height) show(lc,title) # calculate and set scale for media blocks - myscale = 45 * (lc.tw.turtle.height - lc.title_height*2)/lc.tw.turtle.height + myscale = 45 * (lc.tw.canvas.height - lc.title_height*2)/lc.tw.canvas.height set_scale(lc,myscale) # set body text size - settextsize(lc.tw.turtle, lc.body_height) + lc.tw.canvas.settextsize(lc.body_height) # render four quadrents y -= int(lc.title_height*2*lc.tw.lead) # leave some space below the title - setxy(lc.tw.turtle, x, y) + lc.tw.canvas.setxy(x, y) show(lc, media1) x = 0 - setxy(lc.tw.turtle, x, y) + lc.tw.canvas.setxy(x, y) show(lc, media1.replace("media_","descr_")) y = -lc.title_height - setxy(lc.tw.turtle, x, y) + lc.tw.canvas.setxy(x, y) show(lc, media2.replace("media_","descr_")) - x = -(lc.tw.turtle.width/2)+xo - setxy(lc.tw.turtle, x, y) + x = -(lc.tw.canvas.width/2)+xo + lc.tw.canvas.setxy(x, y) show(lc, media2) # restore text size - settextsize(lc.tw.turtle, save_text_size) + lc.tw.canvas.settextsize(save_text_size) # title and four images def show_template7(lc, title, media1, media2, media3, media4): w,h,xo,yo,dx,dy = calc_position(lc,'tp7') - x = -(lc.tw.turtle.width/2)+xo - y = lc.tw.turtle.height/2 - setxy(lc.tw.turtle, x, y) + x = -(lc.tw.canvas.width/2)+xo + y = lc.tw.canvas.height/2 + lc.tw.canvas.setxy(x, y) # save the text size so we can restore it later save_text_size = lc.tw.textsize # set title text - settextsize(lc.tw.turtle, lc.title_height) + lc.tw.canvas.settextsize(lc.title_height) show(lc,title) # calculate and set scale for media blocks - myscale = 45 * (lc.tw.turtle.height - lc.title_height*2)/lc.tw.turtle.height + myscale = 45 * (lc.tw.canvas.height - lc.title_height*2)/lc.tw.canvas.height set_scale(lc,myscale) # set body text size - settextsize(lc.tw.turtle, lc.body_height) + lc.tw.canvas.settextsize(lc.body_height) # render four quadrents y -= int(lc.title_height*2*lc.tw.lead) # leave some space below the title - setxy(lc.tw.turtle, x, y) + lc.tw.canvas.setxy(x, y) show(lc, media1) x = 0 - setxy(lc.tw.turtle, x, y) + lc.tw.canvas.setxy(x, y) show(lc, media2) y = -lc.title_height - setxy(lc.tw.turtle, x, y) + lc.tw.canvas.setxy(x, y) show(lc, media4) - x = -(lc.tw.turtle.width/2)+xo - setxy(lc.tw.turtle, x, y) + x = -(lc.tw.canvas.width/2)+xo + lc.tw.canvas.setxy(x, y) show(lc, media3) # restore text size - settextsize(lc.tw.turtle, save_text_size) + settextsize(lc.tw.canvas, save_text_size) # title, one media object def show_template8(lc, title, media1): w,h,xo,yo,dx,dy = calc_position(lc,'tp7') - x = -(lc.tw.turtle.width/2)+xo - y = lc.tw.turtle.height/2 - setxy(lc.tw.turtle, x, y) + x = -(lc.tw.canvas.width/2)+xo + y = lc.tw.canvas.height/2 + lc.tw.canvas.setxy(x, y) # save the text size so we can restore it later save_text_size = lc.tw.textsize # set title text - settextsize(lc.tw.turtle, lc.title_height) + lc.tw.canvas.settextsize(lc.title_height) show(lc,title) # calculate and set scale for media blocks - myscale = 90 * (lc.tw.turtle.height - lc.title_height*2) \ - / lc.tw.turtle.height + myscale = 90 * (lc.tw.canvas.height - lc.title_height*2) \ + / lc.tw.canvas.height set_scale(lc,myscale) # set body text size - settextsize(lc.tw.turtle, lc.body_height) + lc.tw.canvas.settextsize(lc.body_height) # render media object y -= int(lc.title_height*2*lc.tw.lead) # leave some space below the title - setxy(lc.tw.turtle, x, y) + lc.tw.canvas.setxy(x, y) show(lc, media1) # restore text size - settextsize(lc.tw.turtle, save_text_size) + lc.tw.canvas.settextsize(save_text_size) # image only (at current x,y) def insert_image(lc, media, center): - w = (lc.tw.turtle.width * lc.scale)/100 - h = (lc.tw.turtle.height * lc.scale)/100 + w = (lc.tw.canvas.width * lc.scale)/100 + h = (lc.tw.canvas.height * lc.scale)/100 # convert from Turtle coordinates to screen coordinates - x = lc.tw.turtle.width/2+int(lc.tw.turtle.xcor) - y = lc.tw.turtle.height/2-int(lc.tw.turtle.ycor) + x = lc.tw.canvas.width/2+int(lc.tw.canvas.xcor) + y = lc.tw.canvas.height/2-int(lc.tw.canvas.ycor) if center is True: x -= w/2 y -= h/2 @@ -946,11 +945,11 @@ def insert_image(lc, media, center): # description text only (at current x,y) def insert_desc(lc, media): - w = (lc.tw.turtle.width * lc.scale)/100 - h = (lc.tw.turtle.height * lc.scale)/100 + w = (lc.tw.canvas.width * lc.scale)/100 + h = (lc.tw.canvas.height * lc.scale)/100 # convert from Turtle coordinates to screen coordinates - x = lc.tw.turtle.width/2+int(lc.tw.turtle.xcor) - y = lc.tw.turtle.height/2-int(lc.tw.turtle.ycor) + x = lc.tw.canvas.width/2+int(lc.tw.canvas.xcor) + y = lc.tw.canvas.height/2-int(lc.tw.canvas.ycor) if media[0:5] == 'descr': show_description(lc, media, x, y, w, h) @@ -960,8 +959,8 @@ def set_scale(lc, x): # need to fix export logo to map show to write def show(lc, string, center=False): # convert from Turtle coordinates to screen coordinates - x = lc.tw.turtle.width/2+int(lc.tw.turtle.xcor) - y = lc.tw.turtle.height/2-int(lc.tw.turtle.ycor) + x = lc.tw.canvas.width/2+int(lc.tw.canvas.xcor) + y = lc.tw.canvas.height/2-int(lc.tw.canvas.ycor) if type(string) == str or type(string) == unicode: if string == "media_None": pass @@ -974,13 +973,13 @@ def show(lc, string, center=False): else: if center is True: y -= lc.tw.textsize - draw_text(lc.tw.turtle,string,x,y,lc.tw.textsize, - lc.tw.turtle.width-x) + lc.tw.canvas.draw_text(string,x,y,lc.tw.textsize, + lc.tw.canvas.width-x) elif type(string) == float or type(string) == int: string = round_int(string) if center is True: y -= lc.tw.textsize - draw_text(lc.tw.turtle,string,x,y,lc.tw.textsize,lc.tw.turtle.width-x) + lc.tw.canvas.draw_text(string,x,y,lc.tw.textsize,lc.tw.canvas.width-x) # audio only def play_sound(lc, audio): @@ -988,13 +987,13 @@ def play_sound(lc, audio): def clear(lc): stop_media(lc) - clearscreen(lc.tw.turtle) + lc.tw.canvas.clearscreen() def write(lc, string, fsize): # convert from Turtle coordinates to screen coordinates - x = lc.tw.turtle.width/2+int(lc.tw.turtle.xcor) - y = lc.tw.turtle.height/2-int(lc.tw.turtle.ycor) - draw_text(lc.tw.turtle,string,x,y-15,int(fsize),lc.tw.turtle.width) + x = lc.tw.canvas.width/2+int(lc.tw.canvas.xcor) + y = lc.tw.canvas.height/2-int(lc.tw.canvas.ycor) + lc.tw.canvas.draw_text(string,x,y-15,int(fsize),lc.tw.canvas.width) def hideblocks(lc): lc.tw.hide = False # force hide @@ -1012,11 +1011,11 @@ def doevalstep(lc): try: lc.step.next() except StopIteration: - lc.tw.turtle.spr.set_layer(TURTLE_LAYER) + lc.tw.turtle.show() return False except logoerror, e: showlabel(lc, str(e)[1:-1]) - lc.tw.turtle.spr.set_layer(TURTLE_LAYER) + lc.tw.turtle.show() return False return True diff --git a/taturtle.py b/taturtle.py index 63ea7f0..7dd63c1 100644 --- a/taturtle.py +++ b/taturtle.py @@ -28,25 +28,41 @@ from gettext import gettext as _ # A class for the list of blocks and everything they share in common # class Turtles: - def __init__(self): + def __init__(self, sprite_list): self.list = [] + self.sprite_list = sprite_list - def get_turtle(self, i): - if i < 0 or i > len(self.list)-1: - return(None) + def get_turtle(self, i, append=False): + print "get turtle %d (%d)" % (i, len(self.list)) + if i < 0: + print "IndexError: Turtles %d" % (i) + return self.list[0] + elif i > len(self.list)-1: + if append is False: + print "IndexError: Turtles %d" % (i) + return self.list[0] + else: + print "Adding %d turtles" % (i-len(self.list)+1) + for t in range(i-len(self.list)+1): + Turtle(self) + return(self.list[i]) else: return(self.list[i]) - def length_of_list(self): + def turtle_count(self): return(len(self.list)) def append_to_list(self, turtle): self.list.append(turtle) def remove_from_list(self, turtle): - if block in self.list: + if turtle in self.list: self.list.remove(turtle) + def show_all(self): + for turtle in self.list: + turtle.show() + # # sprite utilities # @@ -61,23 +77,44 @@ class Turtles: # class Turtle: # The turtle is not a block, just a sprite with an orientation - def __init__(self, turtle_list, sprite_list, + def __init__(self, turtle_list, colors=["#008000", "#00A000", "#D0D000", "#808000"], scale=1.0): + self.x = 0 + self.y = 0 self.shapes = [] self.type = 'turtle' + self.heading = 0 _svg = SVG() _svg.set_scale(scale) - self.spr = sprites.Sprite(sprite_list, 0, 0, + self.spr = sprites.Sprite(turtle_list.sprite_list, self.x, self.y, svg_str_to_pixbuf(_svg.turtle(colors))) turtle_list.append_to_list(self) for i in range(36): _svg.set_orientation(i*10) self.shapes.append(svg_str_to_pixbuf(_svg.turtle(colors))) - def rotate(self, orientation): + def rotate(self, heading): + self.heading = heading + i = (int(self.heading+5)%360)/10 try: - self.spr.set_shape(self.shapes[orientation]) + self.spr.set_shape(self.shapes[i]) except IndexError: self.spr.set_shape(self.shapes[0]) - print "Turtle shape IndexError %d" % orientation + print "Turtle shape IndexError %f -> %d" % (heading, i) + + def hide(self): + self.spr.set_layer(HIDE_LAYER) + + def show(self): + self.spr.set_layer(TURTLE_LAYER) + + def move(self, pos): + self.x, self.y = pos[0], pos[1] + self.spr.move(pos) + + def get_xy(self): + return(self.x, self.y) + + def get_heading(self): + return(self.heading) diff --git a/tawindow.py b/tawindow.py index aff0a83..0abe047 100644 --- a/tawindow.py +++ b/tawindow.py @@ -143,9 +143,11 @@ class TurtleArtWindow(): self.drag_group = None self.block_list = block.Blocks() self.sprite_list = sprites.Sprites(self.window, self.area, self.gc) - self.turtle_list = taturtle.Turtles() + self.turtle_list = taturtle.Turtles(self.sprite_list) + self.turtle = taturtle.Turtle(self.turtle_list) self.selected_turtle = None - self.turtle = tNew(self,self.width,self.height) + self.canvas = TurtleGraphics(self, self.width, self.height) + self.lc = lcNew(self) """ @@ -222,7 +224,7 @@ class TurtleArtWindow(): blk.spr.set_layer(BLOCK_LAYER) self.show_palette() self.hide = False - self.turtle.canvas.inval() + self.canvas.canvas.inval() """ hideshow_palette @@ -480,7 +482,7 @@ class TurtleArtWindow(): dx, dy = mdx, mdy else: dx, dy = x-sx-30, y-sy-30 - seth(self.turtle, int(dragx+atan2(dy,dx)/DEGTOR+5)/10*10) + self.canvas.seth(int(dragx+atan2(dy,dx)/DEGTOR+5)/10*10) # If we are hoving, show popup help. elif self.drag_group is None: self._show_popup(x, y) @@ -837,12 +839,12 @@ class TurtleArtWindow(): print "processing remote button release: %d, %d" % (x, y) # We may have been moving the turtle if self.selected_turtle is not None: - (tx, ty) = self.turtle.spr.get_xy() - self.turtle.xcor = tx-self.turtle.cx- \ - self.turtle.canvas._width/2+30 - self.turtle.ycor = self.turtle.canvas._height/2-ty+ \ - self.turtle.cy-30 - move_turtle(self.turtle) + (tx, ty) = self.canvas.spr.get_xy() + self.canvas.xcor = tx-self.canvas.cx- \ + self.canvas.canvas._width/2+30 + self.canvas.ycor = self.canvas.canvas._height/2-ty+ \ + self.canvas.cy-30 + self.canvas.move_turtle() display_coordinates(self) self.selected_turtle = None return @@ -983,7 +985,8 @@ class TurtleArtWindow(): Is x,y over the trash can? """ def _in_the_trash(self, x, y): - if self.selected_palette == TRASH and self.palette_spr.hit((x,y)): + if self.selected_palette == TRASH and \ + self.palette_sprs[TRASH].hit((x,y)): return True return False @@ -1072,10 +1075,10 @@ class TurtleArtWindow(): Turtle pressed """ def _turtle_pressed(self, x, y): - (tx, ty) = self.turtle.spr.get_xy() + (tx, ty) = self.canvas.spr.get_xy() dx, dy = x-tx-30, y-ty-30 if dx*dx+dy*dy > 200: - self.dragpos = ('turn', self.turtle.heading-atan2(dy,dx)/DEGTOR, 0) + self.dragpos = ('turn', self.canvas.heading-atan2(dy,dx)/DEGTOR, 0) else: self.dragpos = ('move', x-tx, y-ty) @@ -1149,12 +1152,12 @@ class TurtleArtWindow(): """ def _jog_turtle(self, dx, dy): if dx == -1 and dy == -1: - self.turtle.xcor = 0 - self.turtle.ycor = 0 + self.canvas.xcor = 0 + self.canvas.ycor = 0 else: - self.turtle.xcor += dx - self.turtle.ycor += dy - move_turtle(self.turtle) + self.canvas.xcor += dx + self.canvas.ycor += dy + self.canvas.move_turtle() display_coordinates(self) self.selected_turtle = None |