diff options
-rw-r--r-- | block.py | 83 | ||||
-rw-r--r-- | constants.py | 18 | ||||
-rwxr-xr-x | sprite_factory.py | 45 | ||||
-rw-r--r-- | talogo.py | 41 | ||||
-rw-r--r-- | tawindow.py | 33 |
5 files changed, 166 insertions, 54 deletions
@@ -137,15 +137,34 @@ class Block: # We may want to grow a block vertically. def expand_in_y(self, dy): self._ey += dy + self.svg.set_hide(True) self._make_block(self.svg) self.spr.set_shape(self.shapes[0]) # We may want to grow a block vertically. def expand_in_x(self, dx): self._ex += dx + self.svg.set_hide(True) self._make_block(self.svg) self.spr.set_shape(self.shapes[0]) + # We may want to reset to the original size + def reset_x(self): + dx = -self._ex + self._ex = 0 + self.svg.set_hide(False) + self._make_block(self.svg) + self.spr.set_shape(self.shapes[0]) + return dx + + def reset_y(self): + dy = -self._ey + self._ey = 0 + self.svg.set_hide(False) + self._make_block(self.svg) + self.spr.set_shape(self.shapes[0]) + return dy + def _new_block_from_factory(self, sprite_list, x, y): self.svg = SVG() self.svg.set_scale(self.scale) @@ -200,6 +219,8 @@ class Block: self._make_basic_style_1arg(svg) elif self.name in BASIC_STYLE_2ARG: self._make_basic_style_2arg(svg) + elif self.name in BULLET_STYLE: + self._make_basic_style_8arg(svg) elif self.name in BOX_STYLE: self._make_box_style(svg) elif self.name in BOX_STYLE_MEDIA: @@ -230,6 +251,8 @@ class Block: self._make_flow_style_else(svg) elif self.name in PORTFOLIO_STYLE: self._make_portfolio_style(svg) + elif self.name in PORTFOLIO_STYLE_2PIX: + self._make_portfolio_style_2pix(svg) else: self._make_basic_style(svg) print ">>>>> I don't know how to create a %s block" % (self.name) @@ -307,6 +330,32 @@ class Block: self.svg.docks[3][1])) self._left, self._right = 2, self.svg.get_innie_width()*1.5 + def _make_basic_style_8arg(self, svg): + self.svg.expand(10+self._dx+self._ex, self._ey) + self.svg.set_innie([True,True,True,True,True,True,True,True]) + self._make_basic_block(svg) + self.docks = (('flow', True, self.svg.docks[0][0], + self.svg.docks[0][1]), + ('string', False, self.svg.docks[1][0], + self.svg.docks[1][1]), + ('string', False, self.svg.docks[2][0], + self.svg.docks[2][1]), + ('string', False, self.svg.docks[3][0], + self.svg.docks[3][1]), + ('string', False, self.svg.docks[4][0], + self.svg.docks[4][1]), + ('string', False, self.svg.docks[5][0], + self.svg.docks[5][1]), + ('string', False, self.svg.docks[6][0], + self.svg.docks[6][1]), + ('string', False, self.svg.docks[7][0], + self.svg.docks[7][1]), + ('string', False, self.svg.docks[8][0], + self.svg.docks[8][1]), + ('flow', False, self.svg.docks[9][0], + self.svg.docks[9][1])) + self._left, self._right = 2, self.svg.get_innie_width()*1.5 + def _make_box_style(self, svg): self.svg.expand(60+self._dx+self._ex, self._ey) self._make_basic_box(svg) @@ -510,25 +559,43 @@ class Block: self._left, self._right = 2, self.svg.get_width()-self.svg.docks[1][0] def _make_portfolio_style(self, svg): - self.svg.expand(25+self._dx+self._ex, self._ey) + self.svg.expand(25+self._dx+self._ex, 10+self._ey) self.svg.set_slot(True) self.svg.set_tab(True) self.svg.set_innie([True, True, False, True]) self._make_portfolio(svg) self.docks = (('flow', True, self.svg.docks[0][0], self.svg.docks[0][1]), - ('string', False, self.svg.docks[1][0], - self.svg.docks[1][1]), - ('media', False, self.svg.docks[6][0], + ('string', False, self.svg.docks[6][0], self.svg.docks[6][1]), - ('media', False, self.svg.docks[2][0], - self.svg.docks[2][1]), ('media', False, self.svg.docks[5][0], self.svg.docks[5][1]), + ('media', False, self.svg.docks[1][0], + self.svg.docks[1][1]), + ('media', False, self.svg.docks[4][0], + self.svg.docks[4][1]), + ('media', False, self.svg.docks[2][0], + self.svg.docks[2][1]), + ('flow', False, self.svg.docks[3][0], + self.svg.docks[3][1])) + self._left, self._right = 2, self.svg.get_width()-self.svg.docks[1][0] + + def _make_portfolio_style_2pix(self, svg): + self.svg.expand(25+self._dx+self._ex, 10+self._ey) + self.svg.set_slot(True) + self.svg.set_tab(True) + self.svg.set_innie([True, True]) + self._make_portfolio(svg) + self.docks = (('flow', True, self.svg.docks[0][0], + self.svg.docks[0][1]), + ('string', False, self.svg.docks[4][0], + self.svg.docks[4][1]), ('media', False, self.svg.docks[3][0], self.svg.docks[3][1]), - ('flow', False, self.svg.docks[4][0], - self.svg.docks[4][1])) + ('media', False, self.svg.docks[1][0], + self.svg.docks[1][1]), + ('flow', False, self.svg.docks[2][0], + self.svg.docks[2][1])) self._left, self._right = 2, self.svg.get_width()-self.svg.docks[1][0] def _make_basic_block(self, svg): diff --git a/constants.py b/constants.py index 116392b..7a2182a 100644 --- a/constants.py +++ b/constants.py @@ -52,7 +52,8 @@ PALETTES = [['forward', 'back', 'clean', 'left', 'right', 'show', ['kbinput', 'push', 'printheap', 'keyboard', 'pop', 'clearheap', 'myfunc', 'nop', 'leftpos', 'toppos', 'width', 'rightpos', 'bottompos', 'height', 'turtle', 'print'], - ['journal', 'audio', 'description', 'hideblocks', 'template7'], + ['journal', 'audio', 'description', 'hideblocks', 'template7', + 'template2', 'template3'], ['restore']] # @@ -106,6 +107,9 @@ FLOW_STYLE_1ARG = ['repeat'] FLOW_STYLE_BOOLEAN = ['if'] FLOW_STYLE_ELSE = ['ifelse'] PORTFOLIO_STYLE = ['template7'] +BULLET_STYLE = ['template3'] +PORTFOLIO_STYLE_1PIX = ['template1'] +PORTFOLIO_STYLE_2PIX = ['template2', 'template6'] # # blocks that contain media @@ -196,6 +200,10 @@ BLOCK_NAMES = { 'storeinbox1':[_('store in box 1')], 'storeinbox2':[_('store in box 2')], 'string':[_('text')], + 'template1':[' '], + 'template2':[' '], + 'template3':[' '], + 'template6':[' '], 'template7':[' '], 'textsize':[_('text size')], 'toppos':[_('top')], @@ -287,6 +295,10 @@ PRIMITIVES = { 'storein':'storeinbox', 'storeinbox1':'storeinbox1', 'storeinbox2':'storeinbox2', + 'template1':'tp1', + 'template2':'tp2', + 'template3':'tp3', + 'template6':'tp6', 'template7':'tp7', 'textsize':'textsize', 'toppos':'toppos', @@ -333,6 +345,10 @@ DEFAULTS = { 'storeinbox2':[100], 'storein':[_('my box'),100], 'string':[_('text')], + 'template1':[_('Title'), 'None'], + 'template2':[_('Title'), 'None', 'None'], + 'template3':[_('Title'), '∙ ', '∙ ', '∙ ', '∙ ', '∙ ', '∙ ', '∙ '], + 'template6':[_('Title'), 'None', 'None'], 'template7':[_('Title'), 'None', 'None', 'None', 'None'], 'turtle':[1], 'wait':[1]} diff --git a/sprite_factory.py b/sprite_factory.py index 6f6f272..140a3cd 100755 --- a/sprite_factory.py +++ b/sprite_factory.py @@ -60,6 +60,7 @@ class SVG: self._expand_x = 0 self._expand_y = 0 self._else = False + self._hide = False self._fill = "#00FF00" self._stroke = "#00A000" self._gradiant = False @@ -93,9 +94,11 @@ class SVG: svg += self._line_to(x, self._radius+self._innie_y2+\ self._stroke_width/2.0) svg += self._do_outie() - svg += self._close_path() self._calculate_w_h() + svg += self._close_path() svg += self._style() + if self._hide is True: + svg += self._hide_dot(self._width-12, self._height-12-self._slot_y) svg += self._footer() return self._header() + svg @@ -119,6 +122,7 @@ class SVG: svg += self._rline_to(self._radius*3+self._slot_x*2, 0) else: svg += self._rline_to(self._radius+self._slot_x, 0) + hh = self._x svg += self._rarc_to(1,1) svg += self._rline_to(-self._radius,0) if self._else: @@ -142,6 +146,9 @@ class SVG: svg += self._close_path() self._calculate_w_h() svg += self._style() + if self._hide is True: + svg += self._hide_dot(hh, + self._height-12-self._innie_y2-self._slot_y) svg += self._footer() return self._header() + svg @@ -154,19 +161,18 @@ class SVG: xx = self._x svg += self._rline_to(self._expand_x, 0) svg += self._rarc_to(1, 1) + svg += self._rline_to(0, self._expand_y) for i in range(len(self._innie)): - if self._innie[i] is True: + if self._innie[i] is True and i > 0: svg += self._do_innie() svg += self._rline_to(0, 2*self._innie_y2+self._innie_spacer) else: svg += self._rline_to(0, 2*self._innie_y2+self._innie_spacer) - svg += self._rline_to(0, self._expand_y) svg += self._rarc_to(-1, 1) svg += self._line_to(xx, self._y) svg += self._do_tab() svg += self._rarc_to(-1, -1) - svg += self._rline_to(0, -self._expand_y) - for i in range(len(self._innie)-1): # skip one for title + for i in range(len(self._innie)): if self._innie[len(self._innie)-i-1] is True: svg += self._rline_to(0, -2*self._innie_y2-self._innie_spacer) svg += self._do_reverse_innie() @@ -295,10 +301,7 @@ class SVG: self._width, self._height = width, height self._fill, self._stroke = "#FFD000", "none" svg = self._rect(width, height, 0, 0) - self._fill, self._stroke = "#FF0000", "#FF0000" - svg += self._circle(8, width-12, height-12) - self._fill, self._stroke = "#FFFFFF", "#FFFFFF" - svg += self._rect(10, 2, width-17, height-13) + svg += self._hide_dot(width-12, height-12) svg += self._footer() return self._header() + svg @@ -318,6 +321,9 @@ class SVG: # # Utility methods # + def set_hide(self, flag=False): + self._hide = flag + def get_width(self): return self._width @@ -568,6 +574,16 @@ class SVG: def _close_path(self): return "z\"\n" + def _hide_dot(self, x, y): + _saved_fill, _saved_stroke = self._fill, self._stroke + self._fill, self._stroke = "#FF0000", "#FF0000" + svg = "</g>/n<g>/n" + svg += self._circle(8, x, y) + self._fill, self._stroke = "#FFFFFF", "#FFFFFF" + svg += self._rect(10, 2, x-5, y-1) + self._fill, self._stroke = _saved_fill, _saved_stroke + return svg + def _do_slot(self): if self._slot is True: self.docks.append((int(self._x*self._scale), @@ -705,7 +721,6 @@ def generator(datapath): svg_str = svgt.turtle() f.write(svg_str) close_file(f) - """ svg0 = SVG() f = open_file(datapath, "portfolio-test.svg") @@ -722,15 +737,17 @@ def generator(datapath): """ svg1 = SVG() f = open_file(datapath, "blob-test.svg") - svg1.set_scale(1) - svg1.expand(20,0) - svg1.set_innie([True,True]) - svg1.set_tab(False) + svg1.set_scale(2) + svg1.expand(0,20) + svg1.set_tab(True) + svg1.set_slot(True) svg1.set_gradiant(True) + svg1.set_hide(True) svg_str = svg1.basic_block() f.write(svg_str) close_file(f) + """ svg2 = SVG() f = open_file(datapath, "box-test.svg") svg2.set_scale(1) @@ -758,7 +758,7 @@ def show_template1(lc, title, media): w,h,xo,yo,dx,dy = calc_position(lc,'tp1') x = -(lc.tw.canvas.width/2)+xo y = lc.tw.canvas.height/2 - setxy(lc.tw.canvas, x, y) + lc.tw.canvas.setxy(x, y) # save the text size so we can restore it later save_text_size = lc.tw.textsize # set title text @@ -774,9 +774,10 @@ def show_template1(lc, title, media): y -= int(lc.title_height*2*lc.tw.lead) # leave some space below the title lc.tw.canvas.setxy(x, y) show(lc, media) - x = 0 - lc.tw.canvas.setxy(x, y) - show(lc, media.replace("media_","descr_")) + if lc.tw.running_sugar(): + x = 0 + lc.tw.canvas.setxy(x, y) + show(lc, media.replace("media_","descr_")) # restore text size lc.tw.canvas.settextsize(save_text_size) @@ -804,11 +805,12 @@ def show_template2(lc, title, media1, media2): lc.tw.canvas.setxy(x, y) show(lc, media2) y = -lc.title_height - lc.tw.canvas.setxy(x, y) - show(lc, media2.replace("media_","descr_")) - x = -(lc.tw.canvas.width/2)+xo - lc.tw.canvas.setxy(x, y) - show(lc, media1.replace("media_","descr_")) + if lc.tw.running_sugar(): + lc.tw.canvas.setxy(x, y) + show(lc, media2.replace("media_","descr_")) + x = -(lc.tw.canvas.width/2)+xo + lc.tw.canvas.setxy(x, y) + show(lc, media1.replace("media_","descr_")) # restore text size lc.tw.canvas.settextsize(save_text_size) @@ -817,7 +819,7 @@ def show_template3(lc, title, s1, s2, s3, s4, s5, s6, s7): w,h,xo,yo,dx,dy = calc_position(lc,'tp3') x = -(lc.tw.canvas.width/2)+xo y = lc.tw.canvas.height/2 - setxy(lc.tw.canvas, x, y) + lc.tw.canvas.setxy(x, y) # save the text size so we can restore it later save_text_size = lc.tw.textsize # set title text @@ -869,15 +871,16 @@ def show_template6(lc, title, media1, media2): y -= int(lc.title_height*2*lc.tw.lead) # leave some space below the title lc.tw.canvas.setxy(x, y) show(lc, media1) - x = 0 - lc.tw.canvas.setxy(x, y) - show(lc, media1.replace("media_","descr_")) - y = -lc.title_height - lc.tw.canvas.setxy(x, y) - show(lc, media2.replace("media_","descr_")) - x = -(lc.tw.canvas.width/2)+xo - lc.tw.canvas.setxy(x, y) - show(lc, media2) + if lc.tw.running_sugar(): + x = 0 + lc.tw.canvas.setxy(x, y) + show(lc, media1.replace("media_","descr_")) + y = -lc.title_height + lc.tw.canvas.setxy(x, y) + show(lc, media2.replace("media_","descr_")) + x = -(lc.tw.canvas.width/2)+xo + lc.tw.canvas.setxy(x, y) + show(lc, media2) # restore text size lc.tw.canvas.settextsize(save_text_size) diff --git a/tawindow.py b/tawindow.py index 87df608..caecda9 100644 --- a/tawindow.py +++ b/tawindow.py @@ -380,8 +380,10 @@ class TurtleArtWindow(): if self.palettes[n] == []: _min_width = (len(PALETTES)+1)*(SELECTOR_WIDTH) for i, name in enumerate(PALETTES[n]): - if name in PORTFOLIO_STYLE: + if name in PORTFOLIO_STYLE or name in PORTFOLIO_STYLE_2PIX: scale = 1.0 + elif name in BULLET_STYLE: + scale = 0.67 else: scale = 1.5 self.palettes[n].append(Block(self.block_list, @@ -465,6 +467,8 @@ class TurtleArtWindow(): Find the connected group of block in a stack. """ def _find_group(self, blk): + if blk is None: + return [] group=[blk] for blk2 in blk.connections[1:]: if blk2 is not None: @@ -788,11 +792,6 @@ class TurtleArtWindow(): mov_dict[keyname][1]) elif tur is not None: self._jog_turtle(mov_dict[keyname][0], mov_dict[keyname][1]) - """ - elif self.selected_spr.type == 'selector': - if keyname == 'Return' or keyname == 'KP_Page_Up': - self._select_category(self.selected_spr) - """ return True """ @@ -956,12 +955,12 @@ class TurtleArtWindow(): # Find the block we clicked on and process it. if self.block_operation=='click': - self._click_block() + self._click_block(x, y) """ click block """ - def _click_block(self): + def _click_block(self, x, y): blk = self.block_list.spr_to_block(self.selected_spr) if blk is None: return @@ -973,15 +972,25 @@ class TurtleArtWindow(): self._import_from_journal(self.selected_blk) elif blk.name=='vspace': group = self._find_group(blk) + r,g,b,a = blk.spr.get_pixel((x, y)) + if (r == 255 and g == 0) or g == 255: + dy = blk.reset_y() + else: + dy = 20 + blk.expand_in_y(dy) for b in group: if b != blk: - b.spr.move_relative((0, 20*blk.scale)) - blk.expand_in_y(20) + b.spr.move_relative((0, dy*blk.scale)) elif blk.name=='hspace': group = self._find_group(blk.connections[1]) + r,g,b,a = blk.spr.get_pixel((x, y)) + if (r == 255 and g == 0) or g == 255: + dx = blk.reset_x() + else: + dx = 20 + blk.expand_in_x(dx) for b in group: - b.spr.move_relative((20*blk.scale, 0)) - blk.expand_in_x(20) + b.spr.move_relative((dx*blk.scale, 0)) elif blk.name=='nop' and self.myblock==None: self._import_py() else: |