Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWalter Bender <walter@walter-laptop.(none)>2010-02-04 17:01:55 (GMT)
committer Walter Bender <walter@walter-laptop.(none)>2010-02-04 17:01:55 (GMT)
commit93d8d0137c32baeeffb3bfaf20d622d9143b3541 (patch)
tree0d8a598c18de95630b0a5a3f9085c49e6b25e65f
parent0e8294575bddcde8e77f347f13033407142ef8f6 (diff)
multiturtle refactoring
-rw-r--r--tacanvas.py22
-rw-r--r--taconstants.py2
-rw-r--r--talogo.py8
-rw-r--r--taturtle.py101
-rw-r--r--tawindow.py17
-rwxr-xr-xturtleart.py2
6 files changed, 80 insertions, 72 deletions
diff --git a/tacanvas.py b/tacanvas.py
index 23c512b..dc9072b 100644
--- a/tacanvas.py
+++ b/tacanvas.py
@@ -90,16 +90,16 @@ class TurtleGraphics:
self.settextsize(32)
self.setshade(50)
self.pendown = True
- for i, t in enumerate(self.tw.turtle_list.list):
- self.set_turtle(i)
- t.set_color(0)
- t.set_shade(50)
- t.set_pen_size(5)
- t.set_pen_state(True)
+ for turtle_key in iter(self.tw.turtles.dict):
+ self.set_turtle(turtle_key)
+ self.tw.active_turtle.set_color(0)
+ self.tw.active_turtle.set_shade(50)
+ self.tw.active_turtle.set_pen_size(5)
+ self.tw.active_turtle.set_pen_state(True)
self.xcor, self.ycor, self.heading = 0, 0, 0
self.move_turtle()
self.turn_turtle()
- self.set_turtle(0)
+ self.set_turtle('1') # default turtle has key '1'
def forward(self, n):
n *= self.tw.coord_scale
@@ -312,17 +312,17 @@ class TurtleGraphics:
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):
- if i > self.tw.turtle_list.turtle_count()-1:
+ def set_turtle(self, k):
+ if not self.tw.turtles.dict.has_key(k):
# if it is a new turtle, start it in the center of the screen
- self.tw.active_turtle = self.tw.turtle_list.get_turtle(i, True)
+ self.tw.active_turtle = self.tw.turtles.get_turtle(k, True)
self.xcor = 0
self.ycor = 0
self.heading = 0
self.move_turtle()
self.turn_turtle()
self.tw.active_turtle.set_pen_state(True)
- self.tw.active_turtle = self.tw.turtle_list.get_turtle(i, True)
+ self.tw.active_turtle = self.tw.turtles.get_turtle(k, False)
tx, ty = self.tw.active_turtle.get_xy()
self.xcor = tx+30-self.width/2
self.ycor = self.height/2-ty-30
diff --git a/taconstants.py b/taconstants.py
index a1805bc..9bef59e 100644
--- a/taconstants.py
+++ b/taconstants.py
@@ -436,7 +436,7 @@ PRIMITIVES = {
#
DEFAULTS = {
- 'addturtle':[1],
+ 'addturtle':['1'],
'arc':[90,100],
'audio':[None],
'back':[100],
diff --git a/talogo.py b/talogo.py
index 9349ef4..9bf3923 100644
--- a/talogo.py
+++ b/talogo.py
@@ -158,7 +158,7 @@ def calc_position(tw, t):
def stop_logo(tw):
tw.step_time = 0
tw.lc.step = just_stop()
- tw.turtle_list.show_all()
+ tw.turtles.show_all()
def just_stop():
yield False
@@ -271,7 +271,7 @@ class LogoCode:
'textcolor':[0, lambda self: self.tw.canvas.textcolor],
'textsize':[0, lambda self: self.tw.textsize],
'tpos':[0, lambda self: self.tw.canvas.height/(self.tw.coord_scale*2)],
- 'turtle':[1, lambda self, x: self.tw.canvas.set_turtle(int(x-1))],
+ 'turtle':[1, lambda self, x: self.tw.canvas.set_turtle(x)],
'userdefined':[1, lambda self,x: self.loadmyblock(x)],
'video':[1, lambda self,x: self.play_movie(x)],
'vres':[0, lambda self: self.tw.canvas.height/self.tw.coord_scale],
@@ -573,11 +573,11 @@ class LogoCode:
print "step is None"
return False
except StopIteration:
- self.tw.turtle_list.show_all()
+ self.tw.turtles.show_all()
return False
except logoerror, e:
self.showlabel(str(e)[1:-1])
- self.tw.turtle_list.show_all()
+ self.tw.turtles.show_all()
return False
return True
diff --git a/taturtle.py b/taturtle.py
index 0933c0c..889374f 100644
--- a/taturtle.py
+++ b/taturtle.py
@@ -21,66 +21,77 @@
from taconstants import *
from sprite_factory import SVG, svg_str_to_pixbuf
-import sprites
+from sprites import Sprite
from gettext import gettext as _
+def generate_turtle_pixbufs(colors):
+ shapes = []
+ svg = SVG()
+ svg.set_scale(1.0)
+ for i in range(36):
+ svg.set_orientation(i*10)
+ shapes.append(svg_str_to_pixbuf(svg.turtle(colors)))
+ return shapes
+
#
# A class for the list of blocks and everything they share in common
#
class Turtles:
def __init__(self, sprite_list):
- self.list = []
+ self.dict = dict()
self.sprite_list = sprite_list
+ self.default_pixbufs = []
- def get_turtle(self, i, append=False):
- 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:
- for t in range(i-len(self.list)+1):
- Turtle(self)
- return(self.list[i])
+ def get_turtle(self, k, append=False):
+ if self.dict.has_key(k):
+ return self.dict[k]
+ elif append is False:
+ return None
else:
- return(self.list[i])
+ Turtle(self, k)
+ return self.dict[k]
- def get_turtle_index(self, turtle):
- return(self.list.index(turtle))
+ def get_turtle_key(self, turtle):
+ for k in iter(self.dict):
+ if self.dict[k] == turtle:
+ return k
+ return None
def turtle_count(self):
- return(len(self.list))
+ return(len(self.dict))
- def append_to_list(self, turtle):
- self.list.append(turtle)
+ def add_to_dict(self, k, turtle):
+ self.dict[k] = turtle
- def remove_from_list(self, turtle):
- if turtle in self.list:
- self.list.remove(turtle)
+ def remove_from_dict(self, k):
+ if self.dict.has_key(k):
+ del(self.dict[k])
def show_all(self):
- for turtle in self.list:
- turtle.show()
+ for k in iter(self.dict):
+ self.dict[k].show()
#
# sprite utilities
#
def spr_to_turtle(self, spr):
- for turtle in self.list:
- if spr == turtle.spr:
- return turtle
+ for k in iter(self.dict):
+ if spr == self.dict[k].spr:
+ return self.dict[k]
return None
+ def get_pixbufs(self):
+ if self.default_pixbufs == []:
+ self.default_pixbufs = generate_turtle_pixbufs(
+ ["#008000", "#00A000", "#D0D000", "#808000"])
+ return(self.default_pixbufs)
+
#
# A class for the individual turtles
#
class Turtle:
# The turtle is not a block, just a sprite with an orientation
- def __init__(self, turtle_list,
- colors=["#008000", "#00A000", "#D0D000", "#808000"],
- scale=1.0):
+ def __init__(self, turtles, key, colors=None):
self.x = 0
self.y = 0
self.hidden = False
@@ -92,23 +103,19 @@ class Turtle:
self.pen_size = 5
self.pen_state = True
- if len(colors) == 2:
- _colors = colors[:]
- _colors.append(colors[0])
- _colors.append(colors[1])
- elif len(colors) == 4:
- _colors=colors[:]
+ if colors is None:
+ self.shapes = turtles.get_pixbufs()
else:
- _colors=["#008000", "#00A000", "#D0D000", "#808000"]
-
- _svg = SVG()
- _svg.set_scale(scale)
- 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)))
+ if len(colors) == 2:
+ self.colors = colors[:]
+ self.colors.append(colors[0])
+ self.colors.append(colors[1])
+ elif len(colors) == 4:
+ self.colors=colors[:]
+ self.shapes = generate_turtle_pixbufs(self.colors)
+
+ self.spr = Sprite(turtles.sprite_list, 0, 0, self.shapes[0])
+ turtles.add_to_dict(key, self)
def set_heading(self, heading):
self.heading = heading
diff --git a/tawindow.py b/tawindow.py
index a9f0cc8..35d50ea 100644
--- a/tawindow.py
+++ b/tawindow.py
@@ -147,11 +147,12 @@ class TurtleArtWindow():
self.drag_pos = 0, 0
self.block_list = Blocks(self.scale)
self.sprite_list = Sprites(self.window, self.area, self.gc)
- self.turtle_list = Turtles(self.sprite_list)
+ self.turtles = Turtles(self.sprite_list)
if mycolors == None:
- self.active_turtle = Turtle(self.turtle_list)
+ Turtle(self.turtles, '1')
else:
- self.active_turtle = Turtle(self.turtle_list, mycolors.split(','))
+ Turtle(self.turtles, '1', mycolors.split(','))
+ self.active_turtle = self.turtles.get_turtle('1')
self.selected_turtle = None
self.canvas = TurtleGraphics(self, self.width, self.height)
@@ -865,7 +866,7 @@ class TurtleArtWindow():
self.run_button(0)
elif self.selected_spr is not None:
blk = self.block_list.spr_to_block(self.selected_spr)
- tur = self.turtle_list.spr_to_turtle(self.selected_spr)
+ tur = self.turtles.spr_to_turtle(self.selected_spr)
if blk is not None:
if keyname == 'Return' or keyname == 'KP_Page_Up':
(x, y) = blk.spr.get_xy()
@@ -924,10 +925,10 @@ class TurtleArtWindow():
return True
# Next, look for a turtle
- t = self.turtle_list.spr_to_turtle(spr)
+ t = self.turtles.spr_to_turtle(spr)
if t is not None:
self.selected_turtle = t
- self.canvas.set_turtle(self.turtle_list.get_turtle_index(t))
+ self.canvas.set_turtle(self.turtles.get_turtle_key(t))
self._turtle_pressed(x, y)
return True
@@ -1750,8 +1751,8 @@ class TurtleArtWindow():
data.append((b.id, name, sx-self.canvas.cx, sy-self.canvas.cy,
connections))
if save_turtle is True:
- for t in range(self.turtle_list.turtle_count()):
- self.canvas.set_turtle(t)
+ for k in iter(self.turtles.dict):
+ self.canvas.set_turtle(k)
data.append((-1,'turtle',
self.canvas.xcor, self.canvas.ycor,
self.canvas.heading,
diff --git a/turtleart.py b/turtleart.py
index 9d45818..0acc7d7 100755
--- a/turtleart.py
+++ b/turtleart.py
@@ -163,7 +163,7 @@ class TurtleMain():
self.scale = 2.0
else:
self.scale *= factor
- self.tw.resize(self.scale)
+ self.tw.resize_blocks(self.scale)
def _do_palette_cb(self, widget):
self.tw.show_toolbar_palette(self.i)