Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/tawindow.py
diff options
context:
space:
mode:
authorWalter Bender <walter@walter-laptop.(none)>2010-01-23 15:11:29 (GMT)
committer Walter Bender <walter@walter-laptop.(none)>2010-01-23 15:11:29 (GMT)
commitc48caf275d45dd42d6de02db9dd1db499f681964 (patch)
tree518add3ba576c72813b8b7a72d6d92ab594dd3c8 /tawindow.py
parent1d2ae134e6b30483b45d21a2452f9348861fd616 (diff)
moved connections to blk
Diffstat (limited to 'tawindow.py')
-rw-r--r--tawindow.py218
1 files changed, 121 insertions, 97 deletions
diff --git a/tawindow.py b/tawindow.py
index 66ab27e..eadcb58 100644
--- a/tawindow.py
+++ b/tawindow.py
@@ -119,11 +119,11 @@ class TurtleArtWindow():
self.fgcolor = self.cm.alloc_color('red')
self.textcolor = self.cm.alloc_color('blue')
self.textsize = 32
- self.selected_spr = None # do we need all three of these?
self.spr = None # "currently selected spr"
self.selected_blk = None
# self.selected_turtle = None # in anticipation of multiple turtles
self.draggroup = None
+ self.dragturtle = False
self.myblock = None
self.nop = 'nop'
self.loaded = 0
@@ -200,16 +200,17 @@ class TurtleArtWindow():
# look for the start block
for blk in self.block_list.list:
if self._find_start_stack(blk):
- self.step_time = time
if hasattr(self, 'activity'):
self.activity.recenter()
+ self.step_time = time
+ print "running " + blk.name
self._run_stack(blk)
return
# no start block, so run a stack that isn't a hat
for blk in self.blocks_list.list:
if self._find_block_to_run(blk):
- print "running " + blk.name
self.step_time = time
+ print "running " + blk.name
self._run_stack(blk)
return
@@ -224,6 +225,7 @@ class TurtleArtWindow():
self._unselect()
else: # always hide the status block on button press
self.status_spr.set_layer(HIDE_LAYER)
+ self.dragturtle = False
spr = self.sprite_list.find_sprite((x,y))
self.x, self.y = x, y
self.dx = 0
@@ -233,12 +235,12 @@ class TurtleArtWindow():
# from the sprite at x, y, find the corresponding block
blk = self.block_list.spr_to_block(spr)
if blk is not None:
- print "found %s at (%d,%d)" % (blk.name, x, y)
+ print "button press: found %s at (%d,%d)" % (blk.name, x, y)
self.blk = blk # do we need to remember this?
self._block_pressed(mask, x, y, blk)
elif hasattr(spr, 'type'):
# TODO: eliminate remaining dependencies on spr.type
- print "type: %s" % (spr.type)
+ print "button press on spr type: %s" % (spr.type)
if spr.type == "canvas":
spr.set_layer(CANVAS_LAYER)
return True
@@ -354,7 +356,7 @@ class TurtleArtWindow():
"""
def _find_top_block(self, blk):
while blk.connections[0]!=None:
- blk=self.block_list.spr_to_block(blk.connections[0])
+ blk=blk.connections[0]
return blk
"""
@@ -371,11 +373,10 @@ class TurtleArtWindow():
find connected group of block in stack
"""
def _findgroup(self, blk):
- group=[blk.spr]
- for spr2 in blk.connections[1:]:
- if spr2 is not None:
- group.extend(self._findgroup(
- self.block_list.spr_to_block(spr2)))
+ group=[blk]
+ for blk2 in blk.connections[1:]:
+ if blk2 is not None:
+ group.extend(self._findgroup(blk2))
return group
"""
@@ -405,15 +406,29 @@ class TurtleArtWindow():
return
self.block_operation = 'move'
- spr = self.draggroup[0]
- blk = self.block_list.spr_to_block(spr)
- if blk is not None:
- self.spr = spr
+ if self.dragturtle is True:
+ type,dragx,dragy = self.dragpos
+ (sx,sy) = spr.get_xy()
+ if type == 'move':
+ if mdx != 0 or mdy != 0:
+ dx,dy = mdx,mdy
+ else:
+ dx,dy = x-dragx-sx,y-dragy-sy
+ spr.move((sx+dx, sy+dy))
+ else:
+ if mdx != 0 or mdy != 0:
+ 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)
+ elif self.draggroup[0] is not None:
+ blk = self.draggroup[0]
+ self.spr = blk.spr
dragx, dragy = self.dragpos
if mdx != 0 or mdy != 0:
dx,dy = mdx,mdy
else:
- (sx,sy) = spr.get_xy()
+ (sx,sy) = blk.spr.get_xy()
dx,dy = x-dragx-sx,y-dragy-sy
# skip if there was a move of 0,0
if dx == 0 and dy == 0:
@@ -421,28 +436,13 @@ class TurtleArtWindow():
self.draggroup = self._findgroup(blk)
# check to see if any block ends up with a negative x
for b in self.draggroup:
- (bx, by) = b.get_xy()
+ (bx, by) = b.spr.get_xy()
if bx+dx < 0:
dx += -(bx+dx)
# move the stack
for b in self.draggroup:
- (bx, by) = b.get_xy()
- b.move((bx+dx, by+dy))
- if self.turtle_list.spr_to_turtle(spr) is not None:
- type,dragx,dragy = self.dragpos
- (sx,sy) = spr.get_xy()
- if type == 'move':
- if mdx != 0 or mdy != 0:
- dx,dy = mdx,mdy
- else:
- dx,dy = x-dragx-sx,y-dragy-sy
- spr.move((sx+dx, sy+dy))
- else:
- if mdx != 0 or mdy != 0:
- 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)
+ (bx, by) = b.spr.get_xy()
+ b.spr.move((bx+dx, by+dy))
if mdx != 0 or mdy != 0:
dx,dy = 0,0
else:
@@ -558,7 +558,7 @@ class TurtleArtWindow():
if verbose:
print "processing remote key press: " + keyname
self.keypress = keyname
- if alt_mask is True and self.selected_spr==None:
+ if alt_mask is True and self.selected_blk==None:
if keyname=="i" and hasattr(self, 'activity'):
self.activity.waiting_for_blocks = True
self.activity._send_event("i") # request sync for sharing
@@ -571,13 +571,13 @@ class TurtleArtWindow():
self.selected_blk.name == 'number':
if keyname in ['minus', 'period']:
keyname = {'minus': '-', 'period': '.'}[keyname]
- oldnum = self.selected_spr.labels[0]
+ oldnum = self.selected_blk.spr.labels[0]
if keyname == 'BackSpace':
if len(oldnum) > 1:
newnum = oldnum[:len(oldnum)-1]
else:
newnum = ''
- self.selected_spr.set_label(numcheck(newnum,oldnum))
+ self.selected_blk.spr.set_label(numcheck(newnum,oldnum))
if len(newnum) > 0:
self.firstkey = False
else:
@@ -613,7 +613,7 @@ class TurtleArtWindow():
elif keyname == 'KP_Page_Down':
if self.draggroup == None:
self.draggroup = self._findgroup(blk)
- for b in self.draggroup: b.hide()
+ for b in self.draggroup: b.spr.hide()
self.draggroup = None
elif self.spr.type == 'turtle': # jog turtle with arrow keys
if keyname == 'KP_Up' or keyname == 'j' \
@@ -638,11 +638,11 @@ class TurtleArtWindow():
(x,y) = self.window.get_pointer()
self._block_selector_pressed(x, y)
for b in self.draggroup:
- (bx, by) = b.get_xy()
- b.move((bx+200, by))
+ (bx, by) = b.spr.get_xy()
+ b.spr.move((bx+200, by))
self.draggroup = None
return True
- if self.selected_spr is None:
+ if self.selected_blk is None:
return False
if keyname in ['Shift_L', 'Shift_R', 'Control_L', 'Caps_Lock', \
'Alt_L', 'Alt_R', 'KP_Enter', 'ISO_Level3_Shift']:
@@ -655,13 +655,13 @@ class TurtleArtWindow():
keyunicode = 0
if keyname in WHITE_SPACE:
keyunicode = 32
- oldnum = self.selected_spr.labels[0]
+ oldnum = self.selected_blk.spr.labels[0]
if keyname == 'BackSpace':
if len(oldnum) > 1:
newnum = oldnum[:len(oldnum)-1]
else:
newnum = ''
- self.selected_spr.set_label(strcheck(newnum,oldnum))
+ self.selected_blk.spr.set_label(strcheck(newnum,oldnum))
if len(newnum) > 0:
self.firstkey = False
else:
@@ -680,7 +680,7 @@ class TurtleArtWindow():
newnum = oldnum
else:
newnum = ""
- self.selected_spr.set_label(strcheck(newnum,oldnum))
+ self.selected_blk.spr.set_label(strcheck(newnum,oldnum))
self.firstkey = False
return True
@@ -706,10 +706,7 @@ class TurtleArtWindow():
if verbose:
print "processing remote button release: " + str(x) + " " + str(y)
- if self.draggroup == None:
- return
- spr = self.draggroup[0]
- if self.turtle_list.spr_to_turtle(spr) is not None:
+ if self.dragturtle is True:
print "clicked on a turtle"
(tx, ty) = self.turtle.spr.get_xy()
self.turtle.xcor = tx-self.turtle.cx- \
@@ -720,29 +717,31 @@ class TurtleArtWindow():
display_coordinates(self)
self.draggroup = None
return
+ if self.draggroup == None:
+ return
+ blk = self.draggroup[0]
# remove block by dragging them onto the category palette
if self.block_operation=='move' and self.category_spr.hit((x,y)):
- for b in self.draggroup: b.hide()
+ for b in self.draggroup: b.spr.hide()
self.draggroup = None
return
if self.block_operation=='new':
for b in self.draggroup:
- (bx, by) = b.get_xy()
- b.move((bx+200, by))
+ (bx, by) = b.spr.get_xy()
+ b.spr.move((bx+200, by))
self._snap_to_dock()
- for b in self.draggroup: b.set_layer(BLOCK_LAYER)
+ for b in self.draggroup:
+ b.spr.set_layer(BLOCK_LAYER)
self.draggroup = None
if self.block_operation=='click':
blk = self.block_list.spr_to_block(self.spr)
if blk is not None and blk.name=='number':
- self.selected_spr = spr
+ blk.spr.set_shape(blk.selected_shape)
self.selected_blk = blk
- self.selected_spr.set_shape(blk.selected_shape)
self.firstkey = True
elif blk is not None and blk.name=='string':
- self.selected_spr = spr
self.selected_blk = blk
- self.selected_spr.set_shape(blk.selected_shape)
+ blk.spr.set_shape(blk.selected_shape)
self.firstkey = True
'''
# need new strategy for media blocks
@@ -752,12 +751,9 @@ class TurtleArtWindow():
elif blk is not None and blk.name=='nop' and self.myblock==None:
self.activity.import_py()
else:
- # mark block as selected
- self.selected_spr = spr
- self.selected_blk = blk
if blk is not None:
- self.selected_spr.set_shape(blk.selected_shape)
- spr.set_selected(True)
+ blk.spr.set_shape(blk.selected_shape)
+ self.selected_blk = blk
self._run_stack(blk)
"""
@@ -766,11 +762,9 @@ class TurtleArtWindow():
def _click_block(self):
blk = self.block_list.spr_to_block(self.spr)
if blk is not None and blk.name=='number':
- self.selected_spr = self.spr
self.selected_blk = blk
self.firstkey = True
elif blk is not None and blk.name=='string':
- self.selected_spr = self.spr
self.selected_blk = blk
self.firstkey = True
'''
@@ -810,14 +804,12 @@ class TurtleArtWindow():
snap_to_dock
"""
def _snap_to_dock(self):
- spr = self.draggroup[0]
- my_block = self.block_list.spr_to_block(spr)
- # self.block_list.print_list()
+ my_block = self.draggroup[0]
d = 200
for my_dockn in range(len(my_block.docks)):
for i, your_block in enumerate(self.block_list.list):
# don't link to a block to which you're already connected
- if your_block.spr in self.draggroup:
+ if your_block in self.draggroup:
continue
# check each dock of your_block for a possible connection
for your_dockn in range(len(your_block.docks)):
@@ -831,16 +823,21 @@ class TurtleArtWindow():
best_your_dockn = your_dockn
best_my_dockn = my_dockn
if d<200:
- for spr in self.draggroup:
- (sx, sy) = spr.get_xy()
- spr.move((sx+best_xy[0], sy+best_xy[1]))
- spr_in_dock = best_you.connections[best_your_dockn]
- if spr_in_dock is not None:
- for spr in self._findgroup(spr_in_dock):
- spr.hide()
- best_you.connections[best_your_dockn] = my_block.spr
+ for blk in self.draggroup:
+ (sx, sy) = blk.spr.get_xy()
+ blk.spr.move((sx+best_xy[0], sy+best_xy[1]))
+ blk_in_dock = best_you.connections[best_your_dockn]
+ if blk_in_dock is not None:
+ for blk in self._findgroup(blk_in_dock):
+ print "hiding blk %s" % (blk.name)
+ blk.spr.hide()
+ print "connecting %s to %s, position %d" %\
+ (my_block.name, best_you.name, best_your_dockn)
+ best_you.connections[best_your_dockn] = my_block
if my_block.connections is not None:
- my_block.connections[best_my_dockn] = best_you.spr
+ print "connecting %s to %s, position %d" %\
+ (best_you.name, my_block.name, best_my_dockn)
+ my_block.connections[best_my_dockn] = best_you
"""
import from Journal
@@ -875,7 +872,7 @@ class TurtleArtWindow():
def _run_stack(self, blk):
self.lc.ag = None
top = self._find_top_block(blk)
- run_blocks(self.lc, top.spr, self.block_list.list, True)
+ run_blocks(self.lc, top, self.block_list.list, True)
gobject.idle_add(doevalstep, self.lc)
"""
@@ -919,6 +916,8 @@ class TurtleArtWindow():
for i in range(len(newblk.defaults)):
dock = newblk.docks[i+1] # the first dock position is a connector
argname = dock[0]
+ if argname == 'unavailable':
+ continue
argvalue = newblk.defaults[i]
if (type(argvalue) is str or type(argvalue) is unicode) and\
argname == 'number':
@@ -931,9 +930,10 @@ class TurtleArtWindow():
argblk.spr.move((nx, ny))
argblk.spr.set_label(str(argvalue))
argblk.spr.set_layer(TOP_LAYER)
- argblk.connections = [newspr, None]
- newblk.connections[i+1] = argblk.spr
- print "%s connections are: %s" % (newblk.name, newblk.connections)
+ argblk.connections = [newblk, None]
+ newblk.connections[i+1] = argblk
+ print "%s connections are: %s" % (newblk.name,
+ self._print_blk_list(newblk.connections))
self.draggroup = self._findgroup(newblk)
self.block_operation = 'new'
@@ -945,22 +945,46 @@ class TurtleArtWindow():
if blk is not None:
print "in block_pressed: creating draggroup with %s" % (blk.name)
self.draggroup = self._findgroup(blk)
- for spr in self.draggroup:
- spr.set_layer(TOP_LAYER)
- (sx, sy) = spr.get_xy()
+ print "draggroup: %s" % (self._print_blk_list(self.draggroup))
+ for blk in self.draggroup:
+ blk.spr.set_layer(TOP_LAYER)
+ (sx, sy) = blk.spr.get_xy()
self.dragpos = x-sx, y-sy
- self._disconnect(spr)
+ # self._disconnect(blk)
+
+ """
+ debugging tools
+ """
+ def _print_spr_list(self, spr_list):
+ s = ""
+ for spr in spr_list:
+ if spr == None:
+ s+="None"
+ else:
+ s+=self.block_list.spr_to_block(spr).name
+ s += " "
+ return s
+
+ def _print_blk_list(self, blk_list):
+ s = ""
+ for blk in blk_list:
+ if blk == None:
+ s+="None"
+ else:
+ s+=blk.name
+ s += " "
+ return s
"""
disconnect block
"""
- def _disconnect(self, b):
- blk = self.block_list.spr_to_block(b)
+ def _disconnect(self, blk):
if blk.connections[0]==None:
return
- b2=blk.connections[0]
- blk2 = self.block_list.spr_to_block(b2)
- blk2.connections[blk2.connections.index(b)] = None
+ print "disconnecting %s" % (blk.name)
+ blk2=blk.connections[0]
+ print "from %s" % (blk2.name)
+ blk2.connections[blk2.connections.index(blk)] = None
blk.connections[0] = None
"""
@@ -973,7 +997,7 @@ class TurtleArtWindow():
self.dragpos = ('turn', self.turtle.heading-atan2(dy,dx)/DEGTOR, 0)
else:
self.dragpos = ('move', x-tx, y-ty)
- self.draggroup = [self.turtle.spr]
+ self.dragturtle = True
"""
Replace Journal block graphic with preview image
@@ -1018,7 +1042,7 @@ class TurtleArtWindow():
# some blocks can take strings, nums, or Journal
elif block1.name in ('show', 'push', 'storein', 'storeinbox1',
'storeinbox2'):
- if d2type == 'number' or d2type == 'string' or d2type == 'journal':
+ if d2type in CONTENT_BLOCKS:
pass
# some blocks can take media, audio, movies, of descriptions
elif block1.name in ('containter'):
@@ -1051,7 +1075,7 @@ class TurtleArtWindow():
self.turtle.ycor += dy
move_turtle(self.turtle)
display_coordinates(self)
- self.draggroup = None
+ self.dragturtle = False
"""
jog block
@@ -1060,14 +1084,14 @@ class TurtleArtWindow():
# drag entire stack if moving lock block
self.draggroup = self._findgroup(blk)
# check to see if any block ends up with a negative x
- for spr in self.draggroup:
- (sx, sy) = spr.get_xy()
+ for blk in self.draggroup:
+ (sx, sy) = blk.spr.get_xy()
if sx+dx < 0:
dx += -(sx+dx)
# move the stack
- for spr in self.draggroup:
- (sx, sy) = spr.get_xy()
- spr.move((sx+dx, sy-dy))
+ for blk in self.draggroup:
+ (sx, sy) = blk.spr.get_xy()
+ blk.spr.move((sx+dx, sy-dy))
self._snap_to_dock()
self.draggroup = None