Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--constants.py10
-rwxr-xr-xsprite_factory.py8
-rw-r--r--tacanvas.py534
-rw-r--r--talogo.py287
-rw-r--r--taturtle.py59
-rw-r--r--tawindow.py39
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()
diff --git a/talogo.py b/talogo.py
index 56f1996..ec34570 100644
--- a/talogo.py
+++ b/talogo.py
@@ -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