diff options
author | Walter Bender <walter@walter-laptop.(none)> | 2010-01-28 02:33:42 (GMT) |
---|---|---|
committer | Walter Bender <walter@walter-laptop.(none)> | 2010-01-28 02:33:42 (GMT) |
commit | b3dc9eee00bf73681b24b0652c795dae13339a11 (patch) | |
tree | 3301a73dc342b1ecdc111cc67fd6f608e035cae3 | |
parent | da1a213d4a5333729123f0f864bf72bbe5d280fd (diff) |
fixed most of the selection bugs
-rw-r--r-- | tacanvas.py | 31 | ||||
-rw-r--r-- | talogo.py | 14 | ||||
-rw-r--r-- | taturtle.py | 6 | ||||
-rw-r--r-- | tawindow.py | 50 |
4 files changed, 55 insertions, 46 deletions
diff --git a/tacanvas.py b/tacanvas.py index b10dc8c..3d03b6f 100644 --- a/tacanvas.py +++ b/tacanvas.py @@ -77,7 +77,7 @@ class TurtleGraphics: self.canvas.type = 'canvas' self.canvas.set_layer(CANVAS_LAYER) self.gc = self.canvas.image.new_gc() - self.tw.turtle.show() + self.tw.active_turtle.show() self.shade = 0 self.clearscreen() @@ -102,6 +102,7 @@ class TurtleGraphics: self.move_turtle() self.turn_turtle() self.tw.turtle_list.show_all() + self.set_turtle(0) def forward(self, n): n *= self.tw.coord_scale @@ -197,7 +198,7 @@ class TurtleGraphics: self.pensize = ps except: pass - self.tw.turtle.set_pen_size(ps) + self.tw.active_turtle.set_pen_size(ps) self.gc.set_line_attributes(int(self.pensize*self.tw.coord_scale), gtk.gdk.LINE_SOLID, gtk.gdk.CAP_ROUND, gtk.gdk.JOIN_MITER) @@ -207,7 +208,7 @@ class TurtleGraphics: self.tcolor = c except: pass - self.tw.turtle.set_color(c) + self.tw.active_turtle.set_color(c) self.set_fgcolor() self.set_textcolor() @@ -229,7 +230,7 @@ class TurtleGraphics: self.shade = s except: pass - self.tw.turtle.set_shade(s) + self.tw.active_turtle.set_shade(s) self.set_fgcolor() self.set_textcolor() @@ -305,11 +306,11 @@ class TurtleGraphics: h+self.pensize*self.tw.coord_scale+6) def turn_turtle(self): - self.tw.turtle.set_heading(self.heading) + self.tw.active_turtle.set_heading(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.tw.active_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): @@ -320,21 +321,21 @@ class TurtleGraphics: # TODO: reskin active turtle if i > self.tw.turtle_list.turtle_count()-1: # if it is a new turtle, start it in the center of the screen - self.tw.turtle = self.tw.turtle_list.get_turtle(i, True) + self.tw.active_turtle = self.tw.turtle_list.get_turtle(i, True) self.xcor = 0 self.ycor = 0 self.heading = 0 self.move_turtle() self.turn_turtle() - self.tw.turtle.set_pen_state(True) - self.tw.turtle = self.tw.turtle_list.get_turtle(i, True) - tx, ty = self.tw.turtle.get_xy() + self.tw.active_turtle.set_pen_state(True) + self.tw.active_turtle = self.tw.turtle_list.get_turtle(i, True) + tx, ty = self.tw.active_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.setcolor(self.tw.turtle.get_color()) - self.setshade(self.tw.turtle.get_shade()) - self.setpensize(self.tw.turtle.get_pen_size()) - self.pendown = self.tw.turtle.get_pen_state() + self.heading = self.tw.active_turtle.get_heading() + self.setcolor(self.tw.active_turtle.get_color()) + self.setshade(self.tw.active_turtle.get_shade()) + self.setpensize(self.tw.active_turtle.get_pen_size()) + self.pendown = self.tw.active_turtle.get_pen_state() self.tw.turtle_list.show_all() @@ -162,7 +162,7 @@ def readline(lc, line): return res def setup_cmd(lc, str): - lc.tw.turtle.hide() + lc.tw.active_turtle.hide() lc.procstop=False list = readline(lc, str) lc.step = start_eval(lc, list) @@ -179,11 +179,11 @@ def evline(lc, list): lc.arglist = None while lc.iline: if lc.tw.step_time > 0: - lc.tw.turtle.show() + lc.tw.active_turtle.show() endtime = millis()+an_int(lc,lc.tw.step_time)*100 while millis()<endtime: yield True - lc.tw.turtle.hide() + lc.tw.active_turtle.hide() token = lc.iline[0] if token == lc.symopar: token = lc.iline[1] @@ -295,11 +295,11 @@ def no_args_check(lc): raise logoerror("#noinput") def prim_wait(lc,time): - lc.tw.turtle.show() + lc.tw.active_turtle.show() endtime = millis()+an_int(lc,time*1000) while millis()<endtime: yield True - lc.tw.turtle.hide() + lc.tw.active_turtle.hide() ireturn(lc); yield True def prim_repeat(lc, num, list): @@ -996,11 +996,11 @@ def doevalstep(lc): try: lc.step.next() except StopIteration: - lc.tw.turtle.show() + lc.tw.active_turtle.show() return False except logoerror, e: showlabel(lc, str(e)[1:-1]) - lc.tw.turtle.show() + lc.tw.active_turtle.show() return False return True diff --git a/taturtle.py b/taturtle.py index f673d58..b171709 100644 --- a/taturtle.py +++ b/taturtle.py @@ -65,9 +65,9 @@ class Turtles: # sprite utilities # def spr_to_turtle(self, spr): - for b in self.list: - if spr == b.spr: - return b + for turtle in self.list: + if spr == turtle.spr: + return turtle return None # diff --git a/tawindow.py b/tawindow.py index 511a3e0..d68147e 100644 --- a/tawindow.py +++ b/tawindow.py @@ -138,10 +138,12 @@ class TurtleArtWindow(): self.selected_blk = None self.selected_spr = None self.drag_group = None + self.drag_turtle = 'move', 0, 0 + 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.turtle = Turtle(self.turtle_list) + self.active_turtle = Turtle(self.turtle_list) self.selected_turtle = None self.canvas = TurtleGraphics(self, self.width, self.height) @@ -293,7 +295,7 @@ class TurtleArtWindow(): for i, name in enumerate(STATUS_SHAPES): self.status_shapes[name] = self._load_sprite_from_file( "%s/%s.svg" % (self.path, name)) - self.status_spr = Sprite(self.sprite_list, self.height-75, 0, + self.status_spr = Sprite(self.sprite_list, 0, self.height-150, self.status_shapes['status']) self.status_spr.set_layer(HIDE_LAYER) self.status_spr.type = 'status' @@ -317,6 +319,8 @@ class TurtleArtWindow(): for i in range(len(PALETTES[self.selected_palette])): self.palettes[self.selected_palette][i].spr.set_layer( HIDE_LAYER) + self.selectors[self.selected_palette].set_shape( + self.selector_shapes[self.selected_palette][0]) for i in range(len(PALETTES)): self.selectors[i].set_layer(HIDE_LAYER) if self.palette_sprs[i] is not None: @@ -467,14 +471,14 @@ class TurtleArtWindow(): self.block_operation = 'move' # First, check to see if we are dragging or rotating a turtle. if self.selected_turtle is not None: - type, dragx, dragy = self.dragpos - (sx, sy) = self.selected_turtle.spr.get_xy() - if type == 'move': + dtype, dragx, dragy = self.drag_turtle + (sx, sy) = self.selected_turtle.get_xy() + if dtype == 'move': if mdx != 0 or mdy != 0: dx, dy = mdx, mdy else: dx, dy = x-dragx-sx, y-dragy-sy - self.selected_turtle.spr.move((sx+dx, sy+dy)) + self.selected_turtle.move((sx+dx, sy+dy)) else: if mdx != 0 or mdy != 0: dx, dy = mdx, mdy @@ -489,7 +493,7 @@ class TurtleArtWindow(): elif self.drag_group[0] is not None: blk = self.drag_group[0] self.selected_spr = blk.spr - dragx, dragy = self.dragpos + dragx, dragy = self.drag_pos if mdx != 0 or mdy != 0: dx, dy = mdx, mdy else: @@ -746,10 +750,12 @@ class TurtleArtWindow(): if spr is None: return True self.selected_spr = spr - + if hasattr(spr,'type'): + print "clicked on %s" % (spr.type) # From the sprite at x, y, look for a corresponding block blk = self.block_list.spr_to_block(spr) if blk is not None: + print "clicked on %s (type %s)" % (blk.name, blk.type) if blk.type == 'block': self.selected_blk = blk self._block_pressed(mask, x, y, blk) @@ -763,9 +769,10 @@ class TurtleArtWindow(): return True # Next, look for a turtle - tur = self.turtle_list.spr_to_turtle(spr) - if tur is not None: - self.selected_turtle = tur + t = self.turtle_list.spr_to_turtle(spr) + if t is not None: + print "clicked on turtle %d" % (self.turtle_list.list.index(t)) + self.selected_turtle = t self._turtle_pressed(x, y) return True @@ -786,7 +793,7 @@ class TurtleArtWindow(): self._disconnect(blk) self.drag_group = self._find_group(blk) (sx, sy) = blk.spr.get_xy() - self.dragpos = x-sx, y-sy + self.drag_pos = x-sx, y-sy for blk in self.drag_group: blk.spr.set_layer(TOP_LAYER) @@ -835,13 +842,13 @@ class TurtleArtWindow(): self.dy = 0 if verbose: 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.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 + (tx, ty) = self.selected_turtle.get_xy() + (cx, cy) = self.canvas.canvas.get_xy() + self.canvas.xcor = tx-self.canvas.canvas._width/2+30-cx + self.canvas.ycor = self.canvas.canvas._height/2-ty-30+cy self.canvas.move_turtle() if self.running_sugar(): display_coordinates(self) @@ -1013,7 +1020,7 @@ class TurtleArtWindow(): x-20, y-20, 'block', []) newspr = newblk.spr newspr.set_layer(TOP_LAYER) - self.dragpos = 20, 20 + self.drag_pos = 20, 20 newblk.connections = [None]*len(newblk.docks) for i, argvalue in enumerate(newblk.defaults): # skip the first dock position--it is always a connector @@ -1074,12 +1081,13 @@ class TurtleArtWindow(): Turtle pressed """ def _turtle_pressed(self, x, y): - (tx, ty) = self.canvas.spr.get_xy() + (tx, ty) = self.selected_turtle.get_xy() dx, dy = x-tx-30, y-ty-30 if dx*dx+dy*dy > 200: - self.dragpos = ('turn', self.canvas.heading-atan2(dy,dx)/DEGTOR, 0) + self.drag_turtle = ('turn', + self.canvas.heading-atan2(dy,dx)/DEGTOR, 0) else: - self.dragpos = ('move', x-tx, y-ty) + self.drag_turtle = ('move', x-tx, y-ty) """ Replace Journal block graphic with preview image |