Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--block.py83
-rw-r--r--constants.py18
-rwxr-xr-xsprite_factory.py45
-rw-r--r--talogo.py41
-rw-r--r--tawindow.py33
5 files changed, 166 insertions, 54 deletions
diff --git a/block.py b/block.py
index 0a4e55b..bb340a4 100644
--- a/block.py
+++ b/block.py
@@ -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)
diff --git a/talogo.py b/talogo.py
index 19003c0..729a7b6 100644
--- a/talogo.py
+++ b/talogo.py
@@ -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: