From 93d8d0137c32baeeffb3bfaf20d622d9143b3541 Mon Sep 17 00:00:00 2001 From: Walter Bender Date: Thu, 04 Feb 2010 17:01:55 +0000 Subject: multiturtle refactoring --- 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) -- cgit v0.9.1