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-01-23 05:26:22 (GMT)
committer Walter Bender <walter@walter-laptop.(none)>2010-01-23 05:26:22 (GMT)
commit1d2ae134e6b30483b45d21a2452f9348861fd616 (patch)
treeb24c90ca45ac44bc8fa3b53917c4dbd9b5dd193a
parente97b50e05bfe1523091f004bee804b16308fff6f (diff)
more functionality moved to block
-rw-r--r--block.py52
-rw-r--r--constants.py54
-rw-r--r--talogo.py4
-rw-r--r--taproject.py11
-rw-r--r--tasetup.py4
-rw-r--r--tawindow.py324
6 files changed, 246 insertions, 203 deletions
diff --git a/block.py b/block.py
index 8ea851f..0255659 100644
--- a/block.py
+++ b/block.py
@@ -73,6 +73,9 @@ class Block:
self.name = proto_name
self.docks = None
self.connections = None
+ self.defaults = []
+ self.content = None
+ self.primitive = None
self._new_block_from_prototype(sprite_list, proto_name, labels, colors,
scale, x, y)
block_list.append_to_list(self)
@@ -124,6 +127,7 @@ class Block:
self.docks = (('start',True,0,2),('flow',False,0,self.height-yoff))
elif name in BASIC_STYLE_HEAD_1ARG:
svg.expand(40,0)
+ svg.set_innie([True])
svg.set_slot(False)
self._make_basic_block(sprite_list, svg, x, y)
self.docks = (('start',True,0,0), ('string',False,self.width,12),
@@ -137,19 +141,21 @@ class Block:
svg.expand(25,0)
svg.set_innie([True])
self._make_basic_block(sprite_list, svg, x, y)
- self.docks = (('flow',True,0,2), ('num',False,self.width-xoff,12),
+ self.docks = (('flow',True,0,2),
+ ('number',False,self.width-xoff,12),
('flow',False,0,self.height-yoff))
elif name in BASIC_STYLE_2ARG:
svg.expand(25,0)
svg.set_innie([True,True])
self._make_basic_block(sprite_list, svg, x, y)
- self.docks = (('flow',True,0,2), ('num',False,self.width-xoff,12),
- ('num',False,self.width-xoff,54),
+ self.docks = (('flow',True,0,2),
+ ('number',False,self.width-xoff,12),
+ ('number',False,self.width-xoff,54),
('flow',False,0,self.height-yoff))
elif name in BOX_STYLE:
svg.expand(60,0)
self._make_basic_box(sprite_list, svg, x, y)
- self.docks = (('num',True,0,12),('unavailable',False,0,12))
+ self.docks = (('number',True,0,12),('unavailable',False,0,12))
elif name in NUMBER_STYLE:
svg.expand(25,0)
svg.set_innie([True,True])
@@ -157,8 +163,9 @@ class Block:
svg.set_tab(False)
svg.set_slot(False)
self._make_basic_block(sprite_list, svg, x, y)
- self.docks = (('num',True,0,12), ('num',False,self.width-xoff,12),
- ('num',False,self.width-xoff,54))
+ self.docks = (('number',True,0,12),
+ ('number',False,self.width-xoff,12),
+ ('number',False,self.width-xoff,54))
elif name in NUMBER_STYLE_1ARG:
svg.expand(25,0)
svg.set_innie([True])
@@ -166,7 +173,8 @@ class Block:
svg.set_tab(False)
svg.set_slot(False)
self._make_basic_block(sprite_list, svg, x, y)
- self.docks = (('num',True,0,12),('num',False,self.width-xoff,12))
+ self.docks = (('number',True,0,12),
+ ('number',False,self.width-xoff,12))
elif name in NUMBER_STYLE_PORCH:
svg.expand(25,0)
svg.set_innie([True,True])
@@ -176,18 +184,22 @@ class Block:
svg.set_porch(True)
self._make_basic_block(sprite_list, svg, x, y)
xoff += svg._porch
- self.docks = (('num',True,0,12), ('num',False,self.width-xoff,12),
- ('num',False,self.width-xoff,54))
+ self.docks = (('number',True,0,12),
+ ('number',False,self.width-xoff-xoff,12),
+ ('number',False,self.width-xoff,64))
elif name in COMPARE_STYLE:
self._make_boolean_compare(sprite_list, svg, x, y)
self.docks = (('bool',True,0,self.height-12),
- ('num',False,self.width-xoff,12),
- ('num',False,self.width-xoff,54))
+ ('number',False,self.width-xoff,12),
+ ('number',False,self.width-xoff,54))
elif name in BOOLEAN_STYLE:
+ svg.expand(15,0)
self._make_boolean_and_or(sprite_list, svg, x, y)
- self.docks = (('bool',False,0,self.height-12),
- ('bool',False,self.width-xoff,12))
+ self.docks = (('bool',True,0,self.height-12),
+ ('bool',False,self.width-xoff,12),
+ ('bool',False,self.width-xoff,54))
elif name in NOT_STYLE:
+ svg.expand(15,0)
self._make_boolean_not(sprite_list, svg, x, y)
self.docks = (('bool',True,0,self.height-12),
('bool',False,self.width-xoff,12))
@@ -204,8 +216,8 @@ class Block:
svg.set_innie([True])
self._make_basic_flow(sprite_list, svg, x, y)
self.docks = (('flow',True,0,2),
- ('num',False,self.width-xoff,12),
- ('flow',False, 0, self.height-yoff)
+ ('number',False,self.width-xoff,12),
+ ('flow',False, 0, self.height-yoff),
('flow',False,self.width/2, self.height-yoff))
elif name in FLOW_STYLE_BOOLEAN:
svg.expand(25,0)
@@ -223,6 +235,7 @@ class Block:
self.docks = (('flow',True,0,2),('flow',False,0,self.height-yoff))
print "don't know how to create a block for %s" % (name)
+ # NEED TO PROCESS DEFAULTS
if len(labels) > 0:
if BLOCK_NAMES.has_key(name):
self.spr.set_label(BLOCK_NAMES[name])
@@ -231,10 +244,15 @@ class Block:
self.spr.set_label(label, labels[i])
self.type = 'block'
+
if DEFAULTS.has_key(name):
self.defaults = DEFAULTS[name]
- else:
- self.defaults = []
+
+ if name in CONTENT_BLOCKS:
+ self.content = name
+
+ if PRIMITIVES.has_key(name):
+ self.primitive = PRIMITIVES[name]
def _make_basic_block(self, sprite_list, svg, x, y):
self.shape = svg_str_to_pixbuf(svg.basic_block())
diff --git a/constants.py b/constants.py
index e8b3897..f6c62c8 100644
--- a/constants.py
+++ b/constants.py
@@ -49,7 +49,7 @@ BASIC_STYLE_1ARG = ['forward', 'back', 'left', 'right', 'seth', 'show',
'store in box 2', 'wait', 'action']
BASIC_STYLE_2ARG = ['arc', 'set xy', 'fill screen', 'store in']
BOX_STYLE = ['number', 'xcor', 'ycor', 'heading', 'pen size', 'color', 'shade',
- 'text color', 'text size', 'box 1', 'box 2', 'string', 'left pos',
+ 'text color', 'text size', 'box 1', 'box 2', 'string', 'left pos', 'scale',
'top pos', 'right pos', 'bottom pos', 'width', 'height']
NUMBER_STYLE = ['plus', 'multiply', 'random']
NUMBER_STYLE_PORCH = ['minus', 'divide', 'mod']
@@ -61,7 +61,7 @@ FLOW_STYLE = ['forever', 'hspace']
FLOW_STYLE_1ARG = ['repeat']
FLOW_STYLE_BOOLEAN = ['if else']
TURTLE_PALETTE = ['clean', 'forward', 'back', 'left', 'right', 'seth', 'show',
- 'set_scale', 'xcor', 'ycor', 'heading']
+ 'set scale', 'arc', 'scale', 'xcor', 'ycor', 'heading']
PEN_PALETTE = ['pen up','pen down', 'set pen size', 'set text size',
'set color', 'set shade', 'fill screen', 'pen size', 'text size', 'color',
'shade'] # shade?
@@ -69,12 +69,12 @@ NUMBER_PALETTE = ['number', 'plus', 'minus', 'multiply',
'divide', 'mod', 'square root', 'random', 'greater than', 'less than',
'equal to', 'and', 'or', 'not', 'print']
FLOW_PALETTE = ['wait', 'forever', 'repeat', 'if then', 'stop action', 'hspace'
- 'vspace'] # stop stack
+ 'vspace']
BLOCKS_PALETTE = ['start', 'def action 1', 'action 1', 'def action 2',
'action 2', 'def action', 'action', 'store in box 1', 'box 1',
- 'store in box 2', 'box 2', 'store in', 'box', 'string'] # hat, stack...
+ 'store in box 2', 'box 2', 'store in', 'box', 'string']
MISC_PALETTE = ['left pos', 'top pos', 'right pos', 'bottom pos', 'width',
- 'height'] # hres, vres
+ 'height']
PORTFOLIO_PALETTE = ['hide blocks']
TURTLE_COLORS = ["#00FF00","#00A000"]
@@ -89,14 +89,19 @@ SELECTED_COLOR = "#0000FF"
SELECTED_STROKE_WIDTH = 2.0
#
+# blocks that contain media
+#
+CONTENT_BLOCKS = ['number', 'string', 'media', 'audio', 'journal']
+
+#
# block name dictionary
#
BLOCK_NAMES = {'clean':_('clean'), 'forward':_('forward'), 'back':_('back'),
'left':_('left'), 'right':_('right'), 'set heading':_('set heading'),
- 'show':_('show'), 'set_scale':_('set_scale'), 'xcor':_('xcor'),
+ 'show':_('show'), 'set scale':_('set scale'), 'xcor':_('xcor'),
'ycor':_('ycor'), 'heading':_('heading'), 'pen up':_('pen up'),
- 'pen down':_('pen down'), 'set pen size':_('set pen size'),
+ 'pen down':_('pen down'), 'set pen size':_('set pen size'), 'arc':_('arc'),
'set text size':_('set text size'), 'set color':_('set color'),
'set shade':_('set shade'), 'fill screen':_('fill screen'),
'pen size':_('pen size'), 'text size':_('text size'), 'color':_('color'),
@@ -105,16 +110,45 @@ BLOCK_NAMES = {'clean':_('clean'), 'forward':_('forward'), 'back':_('back'),
'greater than':'&gt;', 'equal to':'=', 'and':_('and'), 'or':_('or'),
'not':_('not'), 'print':_('print'), 'wait':_('wait'),
'forever':_('forever'), 'repeat':_('repeat'), 'if then':_('if then'),
- 'stop action':_('stop action'), 'hspace':_(''), 'vspace':_(''),
+ 'stop action':_('stop action'), 'hspace':_(' '), 'vspace':_(' '),
'start':_('start'), 'def action 1':_('action 1'), 'action 1':_('action 1'),
'def action 2':_('action 2'), 'action 2':_('action 2'),
- 'def action':_('action'), 'action':_('action'),
+ 'def action':_('action'), 'action':_('action'), 'number':'100',
'store in box 1':_('store in box 1'), 'box 1':_('box 1'),
'store in box 2':_('store in box 2'), 'box 2':_('box 2'),
'store in':_('store in'), 'box':_('box'), 'string':_('string'),
'left pos':_('left'), 'top pos':_('top'), 'right pos':_('right'),
'bottom pos':_('bottom'), 'width':_('width'), 'height':_('height'),
- 'hide blocks':_('hide blocks')}
+ 'hide blocks':_('hide blocks'), 'set xy':_('set xy'), 'scale':_('scale')}
+
+#
+# Logo primitives
+#
+
+PRIMITIVES = {'clean':'clean', 'forward':'forward', 'back':'back',
+ 'left':'left', 'right':'right', 'set heading':'seth', 'scale':'scale',
+ 'show':'show', 'set scale':'setscale', 'xcor':'xcor', 'set xy':'setxy',
+ 'ycor':'ycor', 'heading':'heading', 'pen up':'penup',
+ 'pen down':'pendown', 'set pen size':'setpensize',
+ 'set text size':'settextsize', 'set color':'setcolor',
+ 'set shade':'setshade', 'fill screen':'fillscreen',
+ 'pen size':'pensize', 'text size':'textsize', 'color':'color',
+ 'plus':'plus', 'minus':'minus', 'multiply':'product',
+ 'divide':'division', 'mod':'mod',
+ 'random':'random', 'square root':'sqrt', 'less than':'less?',
+ 'greater than':'greater?', 'equal to':'equal?', 'and':'and', 'or':'or',
+ 'not':'not', 'print':'print', 'wait':'wait',
+ 'forever':'forever', 'repeat':'repeat', 'if then':'if', 'if else':'ifelse',
+ 'stop action':'stopstack', 'hspace':'nop', 'vspace':'nop',
+ 'start':'start', 'def action 1':'nop1', 'action 1':'stack1',
+ 'def action 2':'nop2', 'action 2':'stack2',
+ 'def action':'nop3', 'action':'stack',
+ 'store in box 1':'storeinbox1', 'box 1':'box1',
+ 'store in box 2':'storeinbox2', 'box 2':'box2',
+ 'store in':'storeinbox', 'box':'box',
+ 'left pos':'leftpos', 'top pos':'toppos', 'right pos':'rightpos',
+ 'bottom pos':'bottompos', 'width':'hres', 'height':'vres',
+ 'hide blocks':'hideblocks'}
#
# block default values
diff --git a/talogo.py b/talogo.py
index 8c56e48..59076ac 100644
--- a/talogo.py
+++ b/talogo.py
@@ -95,8 +95,8 @@ def blocks_to_code(lc, blk):
code = []
dock = blk.docks[0]
if len(dock)>4: code.append(dock[4])
- if hasattr(blk, 'primname') and blk.primname is not '':
- code.append(blk.primname)
+ if blk.primitive is not None:
+ code.append(blk.primitive)
else:
if blk.name=='number':
try:
diff --git a/taproject.py b/taproject.py
index c00c07b..0bf21b3 100644
--- a/taproject.py
+++ b/taproject.py
@@ -295,6 +295,7 @@ def serialize_stack(tw):
# find the stack under the cursor and serialize it
# TODO: rebase on assemble data to save
+# This code is broken
def assemble_stack_to_clone(tw):
if tw.spr is None or tw.spr.type is not "block":
(x,y) = tw.window.get_pointer()
@@ -305,8 +306,9 @@ def assemble_stack_to_clone(tw):
print "already selected block of type " + tw.spr.type
spr = tw.spr
data = []
- if spr is not None and spr.type == 'block':
- bs = findgroup(find_top_block(spr, tw.block_list), tw.block_list)
+ blk = tw.block_list.spr_to_block(spr)
+ if blk is not None:
+ bs = findgroup(find_top_block(blk, tw.block_list), tw.block_list)
for i in range(len(bs)): bs[i].id=i
for b in bs:
name = b.proto.name
@@ -362,11 +364,10 @@ def findgroup(spr, block_list):
group.extend(findgroup(spr2, block_list))
return group
-def find_top_block(spr, block_list):
- blk = block_list.spr_to_block(spr)
+def find_top_block(blk, block_list):
while blk.connections[0]!=None:
blk = block_list.spr_to_block(blk.connections[0])
- return blk.spr
+ return blk
# start a new project with a start brick
def load_start(tw):
diff --git a/tasetup.py b/tasetup.py
index 2b15c94..611bdc0 100644
--- a/tasetup.py
+++ b/tasetup.py
@@ -88,6 +88,8 @@ selectors = (
('divide','division','newari2'),
('mod','mod','newari2'),
('square root','sqrt','sqrt',100),
+ ('mod','mod','newari2'),
+ ('mod','mod','newari2'),
('random','random','random',0,100),
('greater than','greater?','comp'),
('less than','less?','comp'),
@@ -100,7 +102,7 @@ selectors = (
(('wait','wait','onearg',1),
('forever','forever','forever'),
('repeat','repeat','repeat',4),
- ('if','if','if'),
+ ('if then','if','if'),
('stop action','stopstack','stop'),
('if else','ifelse','ifelse'),
('hspace','nop','hspace'),
diff --git a/tawindow.py b/tawindow.py
index b3dc5d5..66ab27e 100644
--- a/tawindow.py
+++ b/tawindow.py
@@ -119,7 +119,8 @@ class TurtleArtWindow():
self.fgcolor = self.cm.alloc_color('red')
self.textcolor = self.cm.alloc_color('blue')
self.textsize = 32
- self.selected_spr = None
+ 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
@@ -145,7 +146,6 @@ class TurtleArtWindow():
self.dy = 0
self.cartesian = False
self.polar = False
- self.spr = None # "currently selected spr"
"""
DEPRECATED
@@ -181,37 +181,36 @@ class TurtleArtWindow():
"""
def hideshow_button(self):
if self.hide is False:
- for b in self.block_list.list:
- b.spr.set_layer(HIDE_LAYER)
+ for blk in self.block_list.list:
+ blk.spr.set_layer(HIDE_LAYER)
self._hide_palette()
self.hide = True
else:
- for b in self.block_list.list:
- b.spr.set_layer(BLOCK_LAYER)
+ for blk in self.block_list.list:
+ blk.spr.set_layer(BLOCK_LAYER)
self.show_palette()
self.hide = False
self.turtle.canvas.inval()
-
"""
run turtle!
"""
def run_button(self, time):
print "you better run, turtle, run!!"
# look for the start block
- for b in self.block_list.list:
- if self._find_start_stack(b.spr):
+ 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._run_stack(b.spr)
+ self._run_stack(blk)
return
# no start block, so run a stack that isn't a hat
- for b in self.blocks_list.list:
- if self._find_block_to_run(b.spr):
- print "running " + b.name
+ for blk in self.blocks_list.list:
+ if self._find_block_to_run(blk):
+ print "running " + blk.name
self.step_time = time
- self._run_stack(b.spr)
+ self._run_stack(blk)
return
"""
@@ -221,19 +220,24 @@ class TurtleArtWindow():
if verbose:
print "processing remote button press: " + str(x) + " " + str(y)
self.block_operation = 'click'
- if self.selected_spr is not None:
+ if self.selected_blk is not None:
self._unselect()
- else:
+ else: # always hide the status block on button press
self.status_spr.set_layer(HIDE_LAYER)
spr = self.sprite_list.find_sprite((x,y))
- blk = self.block_list.spr_to_block(spr)
- print "found %s at (%d,%d)" % (str(spr),x,y)
- self.x, self.y = x,y
+ self.x, self.y = x, y
self.dx = 0
self.dy = 0
if spr is None:
return True
- if hasattr(spr, 'type'):
+ # 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)
+ 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)
if spr.type == "canvas":
spr.set_layer(CANVAS_LAYER)
@@ -244,8 +248,6 @@ class TurtleArtWindow():
self._block_selector_pressed(x,y)
elif spr.type == 'turtle':
self._turtle_pressed(x,y)
- elif blk is not None:
- self._block_pressed(mask,x,y,spr)
self.spr = spr
"""
@@ -277,29 +279,26 @@ class TurtleArtWindow():
return map(int, event.get_coords())
"""
- unselect
+ unselect block
"""
def _unselect(self):
- if self.selected_spr.labels[0] in ['-', '.', '-.']:
- self.selected_spr.set_label('0')
-
- # put an upper and lower bound on numbers to prevent OverflowError
- if self.block_list.spr_to_block(self.selected_spr).name == 'number'\
- and self.selected_spr.labels[0] is not None:
- try:
- i = float(self.selected_spr.labels[0])
- if i > 1000000:
- self.selected_spr.set_label('1')
- showlabel(self.lc,"#overflowerror")
- elif i < -1000000:
- self.selected_spr.set_label('-1')
- showlabel(self.lc,"#overflowerror")
- except ValueError:
- pass
-
- self.selected_spr.set_shape(
- self.block_list.spr_to_block(self.selected_spr).shape)
- self.selected_spr = None
+ # put upper and lower bounds on numbers to prevent OverflowError
+ if self.selected_blk.name == 'number':
+ if self.selected_blk.spr.labels[0] in ['-', '.', '-.']:
+ self.selected_blk.spr.set_label('0')
+ if self.selected_blk.spr.labels[0] is not None:
+ try:
+ i = float(self.selected_blk.spr.labels[0])
+ if i > 1000000:
+ self.selected_blk.spr.set_label('1')
+ showlabel(self.lc, "#overflowerror")
+ elif i < -1000000:
+ self.selected_blk.spr.set_label('-1')
+ showlabel(self.lc, "#overflowerror")
+ except ValueError:
+ pass
+ self.selected_blk.spr.set_shape(self.selected_blk.shape)
+ self.selected_blk = None
"""
select category
@@ -341,36 +340,45 @@ class TurtleArtWindow():
os.path.exists('/sys/power/olpc-pm')
"""
- find a stack to run (any stack without a hat)
+ find a stack to run (any stack without a 'def action')
"""
- def _find_block_to_run(self, spr):
- top = self._find_top_block(spr)
- if spr == top and self.block_list.spr_to_block(spr).name[0:3] != 'hat':
+ def _find_block_to_run(self, blk):
+ top = self._find_top_block(blk)
+ if blk == top and blk.name[0:3] != 'def':
return True
else:
return False
"""
- find top block
+ find top block in stack
"""
- def _find_top_block(self, spr):
- blk = self.block_list.spr_to_block(spr)
- b = blk.spr
+ def _find_top_block(self, blk):
while blk.connections[0]!=None:
- b=blk.connections[0]
- return b
+ blk=self.block_list.spr_to_block(blk.connections[0])
+ return blk
"""
- find start stack
+ find stack with start block
"""
- def _find_start_stack(self, spr):
- top = self._find_top_block(spr)
- if self.block_list.spr_to_block(top).name == 'start':
+ def _find_start_stack(self, blk):
+ top = self._find_top_block(blk)
+ if top.name == 'start':
return True
else:
return False
"""
+ 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)))
+ return group
+
+ """
tube available?
"""
def _sharing(self):
@@ -391,6 +399,7 @@ class TurtleArtWindow():
def _mouse_move(self, x, y, verbose=False, mdx=0, mdy=0):
if verbose:
print "processing remote mouse move: " + str(x) + " " + str(y)
+ # on hover, show popup help
if self.draggroup is None:
self._show_popup(x, y)
return
@@ -409,13 +418,7 @@ class TurtleArtWindow():
# skip if there was a move of 0,0
if dx == 0 and dy == 0:
return
- # drag entire stack if moving lock block
-
- if blk.name == 'lock':
- self.draggroup = findgroup(self._find_top_block(spr),
- self.block_list)
- else:
- self.draggroup = findgroup(spr, self.block_list)
+ 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()
@@ -478,7 +481,7 @@ class TurtleArtWindow():
self.timeout_tag[0] = 0
except:
self.timeout_tag[0] = 0
- elif spr and spr.type == 'category':
+ elif spr and hasattr(spr,'type') and spr.type == 'category':
proto = self._get_proto_from_category(x, y)
if proto and proto!='hide':
if self.timeout_tag[0] == 0:
@@ -492,7 +495,7 @@ class TurtleArtWindow():
self.timeout_tag[0] = 0
except:
self.timeout_tag[0] = 0
- elif spr and spr.type == 'selbutton':
+ elif spr and hasattr(spr,'type') and spr.type == 'selbutton':
if self.timeout_tag[0] == 0:
self.timeout_tag[0] = self._do_show_popup(spr.name)
self.spr = spr
@@ -591,42 +594,42 @@ class TurtleArtWindow():
if keyname == 'KP_End':
self.run_button(0)
elif self.spr is not None:
- if self.spr.type == 'turtle': # jog turtle with arrow keys
- if keyname == 'KP_Up' or keyname == 'j' \
- or keyname == 'Up':
- self._jog_turtle(0,10)
- elif keyname == 'KP_Down' or keyname == 'k' or \
- keyname == 'Down':
- self._jog_turtle(0,-10)
- elif keyname == 'KP_Left' or keyname == 'h' or \
- keyname == 'Left':
- self._jog_turtle(-10,0)
- elif keyname == 'KP_Right' or keyname == 'l' or \
- keyname == 'Right':
- self._jog_turtle(10,0)
- elif keyname == 'KP_Home':
- self._jog_turtle(-1,-1)
- elif self.spr.type == 'block':
+ blk = self.block_list.spr_to_block(self.spr)
+ if blk is not None:
if keyname == 'Return' or keyname == 'KP_Page_Up':
self._click_block()
elif keyname == 'KP_Up' or keyname == 'j' or \
keyname == 'Up':
- self._jog_block(0,10)
+ self._jog_block(blk, 0, 10)
elif keyname == 'KP_Down' or keyname == 'k' or \
keyname == 'Down':
- self._jog_block(0,-10)
+ self._jog_block(blk, 0, -10)
elif keyname == 'KP_Left' or keyname == 'h' or \
keyname == 'Left':
- self._jog_block(-10,0)
+ self._jog_block(blk, -10, 0)
elif keyname == 'KP_Right' or keyname == 'l' or \
keyname == 'Right':
- self._jog_block(10,0)
+ self._jog_block(blk, 10, 0)
elif keyname == 'KP_Page_Down':
if self.draggroup == None:
- self.draggroup = findgroup(self.spr,
- self.block_list)
+ self.draggroup = self._findgroup(blk)
for b in self.draggroup: b.hide()
self.draggroup = None
+ elif self.spr.type == 'turtle': # jog turtle with arrow keys
+ if keyname == 'KP_Up' or keyname == 'j' \
+ or keyname == 'Up':
+ self._jog_turtle(0,10)
+ elif keyname == 'KP_Down' or keyname == 'k' or \
+ keyname == 'Down':
+ self._jog_turtle(0,-10)
+ elif keyname == 'KP_Left' or keyname == 'h' or \
+ keyname == 'Left':
+ self._jog_turtle(-10,0)
+ elif keyname == 'KP_Right' or keyname == 'l' or \
+ keyname == 'Right':
+ self._jog_turtle(10,0)
+ elif keyname == 'KP_Home':
+ self._jog_turtle(-1,-1)
elif self.spr.type == 'selbutton':
if keyname == 'Return' or keyname == 'KP_Page_Up':
self._select_category(self.spr)
@@ -736,14 +739,16 @@ class TurtleArtWindow():
self.selected_blk = blk
self.selected_spr.set_shape(blk.selected_shape)
self.firstkey = True
- elif blk is not None and self.defdict.has_key(blk.name):
+ elif blk is not None and blk.name=='string':
self.selected_spr = spr
self.selected_blk = blk
- if blk.name=='string':
- self.selected_spr.set_shape(blk.selected_shape)
- self.firstkey = True
+ self.selected_spr.set_shape(blk.selected_shape)
+ self.firstkey = True
+ '''
+ # need new strategy for media blocks
elif blk.name in self.importblocks:
self._import_from_journal(spr)
+ '''
elif blk is not None and blk.name=='nop' and self.myblock==None:
self.activity.import_py()
else:
@@ -753,7 +758,7 @@ class TurtleArtWindow():
if blk is not None:
self.selected_spr.set_shape(blk.selected_shape)
spr.set_selected(True)
- self._run_stack(spr)
+ self._run_stack(blk)
"""
click block
@@ -764,16 +769,18 @@ class TurtleArtWindow():
self.selected_spr = self.spr
self.selected_blk = blk
self.firstkey = True
- elif blk is not None and self.defdict.has_key(blk.name):
+ elif blk is not None and blk.name=='string':
self.selected_spr = self.spr
self.selected_blk = blk
- if blk.name=='string':
- self.firstkey = True
+ self.firstkey = True
+ '''
elif blk.name in self.importblocks:
self._import_from_journal(self.spr)
+ '''
elif blk is not None and blk.name=='nop' and self.myblock==None:
self.activity.import_py()
- else: self._run_stack(self.spr)
+ else:
+ self._run_stack(blk)
"""
Repaint
@@ -805,7 +812,7 @@ class TurtleArtWindow():
def _snap_to_dock(self):
spr = self.draggroup[0]
my_block = self.block_list.spr_to_block(spr)
- self.block_list.print_list()
+ # self.block_list.print_list()
d = 200
for my_dockn in range(len(my_block.docks)):
for i, your_block in enumerate(self.block_list.list):
@@ -818,20 +825,19 @@ class TurtleArtWindow():
my_block, my_dockn)
if self._magnitude(this_xy) > d:
continue
- your_block.spr.set_shape(your_block.selected_shape)
d = self._magnitude(this_xy)
best_xy = this_xy
best_you = your_block
best_your_dockn = your_dockn
best_my_dockn = my_dockn
if d<200:
- for b in self.draggroup:
- (bx, by) = b.get_xy()
- b.move((bx+best_xy[0],by+best_xy[1]))
- block_in_dock = best_you.connections[best_your_dockn]
- if block_in_dock is not None:
- for b in findgroup(block_in_dock, self.block_list):
- b.hide()
+ 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
if my_block.connections is not None:
my_block.connections[best_my_dockn] = best_you.spr
@@ -866,10 +872,10 @@ class TurtleArtWindow():
"""
run stack
"""
- def _run_stack(self, spr):
+ def _run_stack(self, blk):
self.lc.ag = None
- top = self._find_top_block(spr)
- run_blocks(self.lc, top, self.block_list.list, True)
+ top = self._find_top_block(blk)
+ run_blocks(self.lc, top.spr, self.block_list.list, True)
gobject.idle_add(doevalstep, self.lc)
"""
@@ -897,11 +903,6 @@ class TurtleArtWindow():
def _new_block_from_category(self, proto, x, y):
if proto is None:
return True
-
- #
- # Create new instance of a block
- #
-
# load alternative image of nop block if python code is loaded
if proto.name == 'nop' and self.nop == 'pythonloaded':
pass
@@ -911,52 +912,44 @@ class TurtleArtWindow():
newblk = block.Block(self.block_list, self.sprite_list, proto.name,
x-20, y-20, [proto.name])
newspr = newblk.spr
-
newspr.set_layer(TOP_LAYER)
- self.dragpos = 20,20
- newblk.primname = proto.primname
- if self.defdict.has_key(newblk.name):
- newspr.labels[0]=self.defdict[newblk.name]
+ self.dragpos = 20, 20
newblk.connections = [None]*len(newblk.docks)
- print "%s: %s" % (newblk.name, newblk.connections)
+ print "new block %s" % (newblk.name)
for i in range(len(newblk.defaults)):
- dock = newblk.docks[i+1]
- argproto = self.protodict[self.valdict[dock[0]]]
- argdock = argproto.docks[0]
+ dock = newblk.docks[i+1] # the first dock position is a connector
+ argname = dock[0]
+ argvalue = newblk.defaults[i]
+ if (type(argvalue) is str or type(argvalue) is unicode) and\
+ argname == 'number':
+ argname = 'string'
(sx, sy) = newspr.get_xy()
- nx, ny = sx+dock[2]-argdock[2], sy+dock[3]-argdock[3]
argblk = block.Block(self.block_list, self.sprite_list,
- argproto.name, nx, ny)
- argspr = argblk.spr
- argspr.set_label(str(newblk.defaults[i]))
- argspr.set_layer(TOP_LAYER)
- argblk.connections = [newspr,None]
- newblk.connections[i+1] = argspr
- print "%s: %s" % (argblk.name, argblk.connections)
- self.draggroup = findgroup(newspr, self.block_list)
+ argname, 0, 0)
+ argdock = argblk.docks[0]
+ nx, ny = sx+dock[2]-argdock[2], sy+dock[3]-argdock[3]
+ 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)
+ self.draggroup = self._findgroup(newblk)
self.block_operation = 'new'
"""
block pressed
TODO: mark block as selected
"""
- def _block_pressed(self, mask, x, y, spr):
- if spr is not None:
- blk = self.block_list.spr_to_block(spr)
- if blk is not None:
- print "in block_pressed: creating draggroup with %s" % (
- blk.name)
- self.draggroup = findgroup(spr, self.block_list)
- for b in self.draggroup: b.set_layer(TOP_LAYER)
- if self.block_list.spr_to_block(spr).connections[0] is not None and\
- self.block_list.spr_to_block(spr).name == 'lock':
- b = self._find_top_block(spr)
- (bx, by) = b.get_xy()
- self.dragpos = x-bx,y-by
- else:
- (sx, sy) = spr.get_xy()
- self.dragpos = x-sx,y-sy
- self._disconnect(spr)
+ def _block_pressed(self, mask, x, y, blk):
+ 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()
+ self.dragpos = x-sx, y-sy
+ self._disconnect(spr)
"""
disconnect block
@@ -1001,7 +994,7 @@ class TurtleArtWindow():
dock2 = block2.docks[dock2n]
d1type, d1dir, d1x, d1y = dock1[0:4]
d2type, d2dir, d2x, d2y = dock2[0:4]
- if (d2type is not 'num') or (dock2n is not 0):
+ if (d2type is not 'number') or (dock2n is not 0):
if block1.connections is not None and dock1n < block1.connections\
and block1.connections[dock1n] is not None:
return (100,100)
@@ -1012,20 +1005,20 @@ class TurtleArtWindow():
return (100,100)
if d1type != d2type:
# some blocks can take strings or nums
- if block1.name in ('write', 'plus2', 'equal', 'less', 'greater',
+ if block1.name in ('write', 'plus', 'equal', 'less', 'greater',
'template1', 'template2', 'template3',
'template4', 'template6', 'template7', 'nop',
'print', 'stack'):
if block1.name == 'write' and d1type == 'string':
- if d2type == 'num' or d2type == 'string':
+ if d2type == 'number' or d2type == 'string':
pass
else:
- if d2type == 'num' or d2type == 'string':
+ if d2type == 'number' or d2type == 'string':
pass
# some blocks can take strings, nums, or Journal
elif block1.name in ('show', 'push', 'storein', 'storeinbox1',
'storeinbox2'):
- if d2type == 'num' or d2type == 'string' or d2type == 'journal':
+ if d2type == 'number' or d2type == 'string' or d2type == 'journal':
pass
# some blocks can take media, audio, movies, of descriptions
elif block1.name in ('containter'):
@@ -1063,26 +1056,21 @@ class TurtleArtWindow():
"""
jog block
"""
- def _jog_block(self,dx,dy):
+ def _jog_block(self, blk, dx, dy):
# drag entire stack if moving lock block
- if self.block_list.spr_to_block(spr).name == 'lock':
- self.draggroup = findgroup(self._find_top_block(self.spr),
- self.block_list)
- else:
- self.draggroup = findgroup(self.spr, self.block_list)
+ 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()
- if bx+dx < 0:
- dx += -(bx+dx)
+ for spr in self.draggroup:
+ (sx, sy) = spr.get_xy()
+ if sx+dx < 0:
+ dx += -(sx+dx)
# move the stack
- for b in self.draggroup:
- (bx, by) = b.get_xy()
- b.move((bx+dx, by-dy))
+ for spr in self.draggroup:
+ (sx, sy) = spr.get_xy()
+ spr.move((sx+dx, sy-dy))
self._snap_to_dock()
self.draggroup = None
-
#
# utilities used for checking variable validity
#