From 1d2ae134e6b30483b45d21a2452f9348861fd616 Mon Sep 17 00:00:00 2001 From: Walter Bender Date: Sat, 23 Jan 2010 05:26:22 +0000 Subject: more functionality moved to block --- 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':'>', '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 # -- cgit v0.9.1