Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--block.py330
-rw-r--r--constants.py17
-rwxr-xr-xsprite_factory.py6
-rw-r--r--talogo.py42
-rw-r--r--tawindow.py36
5 files changed, 224 insertions, 207 deletions
diff --git a/block.py b/block.py
index e37d745..168b56a 100644
--- a/block.py
+++ b/block.py
@@ -87,6 +87,7 @@ class Block:
self.primitive = None
self.type = type
self._dx = 0
+ self._ei = 0
self._ex = 0
self._ey = 0
self._font_size = [6.0, 4.5]
@@ -134,6 +135,15 @@ class Block:
self._make_block(self.svg)
self.spr.set_shape(self.shapes[0])
+ # We may want to add "innies"
+ def add_arg(self):
+ h = self.svg.get_height()
+ self._ei += 1
+ self.svg.set_show(True)
+ self._make_block(self.svg)
+ self.spr.set_shape(self.shapes[0])
+ return self.svg.get_height()-h
+
# We may want to grow a block vertically.
def expand_in_y(self, dy):
self._ey += dy
@@ -142,7 +152,7 @@ class Block:
self._make_block(self.svg)
self.spr.set_shape(self.shapes[0])
- # We may want to grow a block vertically.
+ # We may want to grow a block horizontally.
def expand_in_x(self, dx):
self._ex += dx
self.svg.set_hide(True)
@@ -150,7 +160,6 @@ class Block:
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
@@ -169,6 +178,9 @@ class Block:
self.spr.set_shape(self.shapes[0])
return dy
+ def get_expand_x_y(self):
+ return (self._ex, self._ey)
+
def _new_block_from_factory(self, sprite_list, x, y):
self.svg = SVG()
self.svg.set_scale(self.scale)
@@ -227,7 +239,7 @@ class Block:
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)
+ self._make_basic_style_var_arg(svg)
elif self.name in BOX_STYLE:
self._make_box_style(svg)
elif self.name in BOX_STYLE_MEDIA:
@@ -276,8 +288,8 @@ class Block:
def _make_basic_style(self, svg):
self.svg.expand(self._dx+self._ex, self._ey)
self._make_basic_block(svg)
- self.docks = (('flow',True,self.svg.docks[0][0],self.svg.docks[0][1]),
- ('flow',False,self.svg.docks[1][0],self.svg.docks[1][1]))
+ self.docks = [['flow',True,self.svg.docks[0][0],self.svg.docks[0][1]],
+ ['flow',False,self.svg.docks[1][0],self.svg.docks[1][1]]]
self._left, self._right = 2, 2
def _make_basic_style_head(self, svg):
@@ -285,9 +297,9 @@ class Block:
self.svg.set_slot(False)
self.svg.set_cap(True)
self._make_basic_block(svg)
- self.docks = (('start', True, 0, 0),
- ('flow', False, self.svg.docks[0][0],
- self.svg.docks[0][1]))
+ self.docks = [['start', True, 0, 0],
+ ['flow', False, self.svg.docks[0][0],
+ self.svg.docks[0][1]]]
self._left, self._right = 2, 2
def _make_basic_style_head_1arg(self, svg):
@@ -296,87 +308,81 @@ class Block:
self.svg.set_slot(False)
self.svg.set_cap(True)
self._make_basic_block(svg)
- self.docks = (('start', True, 0, 0),
- ('string', False, self.svg.docks[0][0],
- self.svg.docks[0][1]),
- ('flow', False, self.svg.docks[1][0],
- self.svg.docks[1][1]))
+ self.docks = [['start', True, 0, 0],
+ ['string', False, self.svg.docks[0][0],
+ self.svg.docks[0][1]],
+ ['flow', False, self.svg.docks[1][0],
+ self.svg.docks[1][1]]]
self._left, self._right = 2, self.svg.get_innie_width()*1.5
def _make_basic_style_tail(self, svg):
self.svg.expand(10+self._dx+self._ex, self._ey)
self.svg.set_tab(False)
self._make_basic_block(svg)
- self.docks = (('flow', True, self.svg.docks[0][0],
- self.svg.docks[0][1]),
- ('unavailable', False, 0, 0))
+ self.docks = [['flow', True, self.svg.docks[0][0],
+ self.svg.docks[0][1]],
+ ['unavailable', False, 0, 0]]
def _make_basic_style_1arg(self, svg):
self.svg.expand(10+self._dx+self._ex, self._ey)
self.svg.set_innie([True])
self._make_basic_block(svg)
- self.docks = (('flow', True, self.svg.docks[0][0],
- self.svg.docks[0][1]),
- ('number', False, self.svg.docks[1][0],
- self.svg.docks[1][1]),
- ('flow', False, self.svg.docks[2][0],
- self.svg.docks[2][1]))
+ self.docks = [['flow', True, self.svg.docks[0][0],
+ self.svg.docks[0][1]],
+ ['number', 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_innie_width()*1.5
def _make_basic_style_2arg(self, svg):
self.svg.expand(10+self._dx+self._ex, self._ey)
self.svg.set_innie([True,True])
self._make_basic_block(svg)
- self.docks = (('flow', True, self.svg.docks[0][0],
- self.svg.docks[0][1]),
- ('number', False, self.svg.docks[1][0],
- self.svg.docks[1][1]),
- ('number', False, self.svg.docks[2][0],
- self.svg.docks[2][1]),
- ('flow', False, self.svg.docks[3][0],
- self.svg.docks[3][1]))
+ self.docks = [['flow', True, self.svg.docks[0][0],
+ self.svg.docks[0][1]],
+ ['number', False, self.svg.docks[1][0],
+ self.svg.docks[1][1]],
+ ['number', 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_innie_width()*1.5
- def _make_basic_style_8arg(self, svg):
+ def _make_basic_style_var_arg(self, svg):
self.svg.expand(10+self._dx+self._ex, self._ey)
- self.svg.set_innie([True,True,True,True,True,True,True,True])
+ innie = [True, True]
+ for i in range(self._ei):
+ innie.append(True)
+ self.svg.set_innie(innie)
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.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], '[']]
+ for i in range(self._ei):
+ self.docks.append(['string', False, self.svg.docks[i+3][0],
+ self.svg.docks[i+3][1]])
+ self.docks.append(['flow', False, self.svg.docks[self._ei+3][0],
+ self.svg.docks[self._ei+3][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)
- self.docks = (('number', True, self.svg.docks[0][0],
- self.svg.docks[0][1]),
- ('unavailable', False, 0, 0))
+ self.docks = [['number', True, self.svg.docks[0][0],
+ self.svg.docks[0][1]],
+ ['unavailable', False, 0, 0]]
self._left, self._right = self.svg.docks[1][0], 1
def _make_media_style(self, svg):
self.svg.expand(40+self._dx+self._ex, 10+self._ey)
self._make_basic_box(svg)
- self.docks = (('number', True, self.svg.docks[0][0],
- self.svg.docks[0][1]),
- ('unavailable', False, 0, 0))
+ self.docks = [['number', True, self.svg.docks[0][0],
+ self.svg.docks[0][1]],
+ ['unavailable', False, 0, 0]]
self._left, self._right = self.svg.docks[1][0], 1
def _make_number_style(self, svg):
@@ -390,12 +396,12 @@ class Block:
NOTE: The "outie" is added last, so the dock order in the NUMBER_STYLE
needs to be modified.
"""
- self.docks = (('number', True, self.svg.docks[2][0],
- self.svg.docks[2][1]),
- ('number', False, self.svg.docks[0][0],
- self.svg.docks[0][1]),
- ('number', False, self.svg.docks[1][0],
- self.svg.docks[1][1]))
+ self.docks = [['number', True, self.svg.docks[2][0],
+ self.svg.docks[2][1]],
+ ['number', False, self.svg.docks[0][0],
+ self.svg.docks[0][1]],
+ ['number', False, self.svg.docks[1][0],
+ self.svg.docks[1][1]]]
self._left = self.svg.docks[2][0]
self._right = self.svg.get_innie_width()*1.5
@@ -406,13 +412,13 @@ class Block:
self.svg.set_tab(False)
self.svg.set_slot(False)
self._make_basic_block(svg)
- self.docks = (('number', True, self.svg.docks[2][0],
- self.svg.docks[2][1], '('),
- ('number', False, self.svg.docks[0][0],
- self.svg.docks[0][1]),
- ('number', False, self.svg.docks[1][0],
- self.svg.docks[1][1]),
- ('unavailable', False, 0, 0, ')'))
+ self.docks = [['number', True, self.svg.docks[2][0],
+ self.svg.docks[2][1], '('],
+ ['number', False, self.svg.docks[0][0],
+ self.svg.docks[0][1]],
+ ['number', False, self.svg.docks[1][0],
+ self.svg.docks[1][1]],
+ ['unavailable', False, 0, 0, ')']]
self._left = self.svg.docks[2][0]
self._right = self.svg.get_innie_width()*1.5
@@ -423,10 +429,10 @@ class Block:
self.svg.set_tab(False)
self.svg.set_slot(False)
self._make_basic_block(svg)
- self.docks = (('number', True, self.svg.docks[1][0],
- self.svg.docks[1][1]),
- ('number', False, self.svg.docks[0][0],
- self.svg.docks[0][1]))
+ self.docks = [['number', True, self.svg.docks[1][0],
+ self.svg.docks[1][1]],
+ ['number', False, self.svg.docks[0][0],
+ self.svg.docks[0][1]]]
self._left, self._right = self.svg.docks[1][0], self.svg.docks[1][0]
def _make_number_style_1strarg(self, svg):
@@ -436,11 +442,11 @@ class Block:
self.svg.set_tab(False)
self.svg.set_slot(False)
self._make_basic_block(svg)
- self.docks = (('number', True, self.svg.docks[1][0],
- self.svg.docks[1][1]),
- ('string', False, self.svg.docks[0][0],
- self.svg.docks[0][1]),
- ('unavailable', False, 0, 0))
+ self.docks = [['number', True, self.svg.docks[1][0],
+ self.svg.docks[1][1]],
+ ['string', False, self.svg.docks[0][0],
+ self.svg.docks[0][1]],
+ ['unavailable', False, 0, 0]]
self._left, self._right = self.svg.docks[1][0], self.svg.docks[1][0]
def _make_number_style_porch(self, svg):
@@ -451,45 +457,45 @@ class Block:
self.svg.set_slot(False)
self.svg.set_porch(True)
self._make_basic_block(svg)
- self.docks = (('number', True, self.svg.docks[2][0],
- self.svg.docks[2][1]),
- ('number', False, self.svg.docks[0][0],
- self.svg.docks[0][1]),
- ('number', False, self.svg.docks[1][0],
- self.svg.docks[1][1]))
+ self.docks = [['number', True, self.svg.docks[2][0],
+ self.svg.docks[2][1]],
+ ['number', False, self.svg.docks[0][0],
+ self.svg.docks[0][1]],
+ ['number', False, self.svg.docks[1][0],
+ self.svg.docks[1][1]]]
self._left = self.svg.docks[2][0]
self._right = self.svg.get_width()-self.svg.docks[0][0]
def _make_compare_style(self, svg):
self.svg.expand(10+self._dx+self._ex, self._ey)
self._make_boolean_compare(svg)
- self.docks = (('bool', True, self.svg.docks[0][0],
- self.svg.docks[0][1], '('),
- ('number', False, self.svg.docks[1][0],
- self.svg.docks[1][1]),
- ('number', False, self.svg.docks[2][0],
- self.svg.docks[2][1]),
- ('unavailable', False, 0, 0, ')'))
+ self.docks = [['bool', True, self.svg.docks[0][0],
+ self.svg.docks[0][1], '('],
+ ['number', False, self.svg.docks[1][0],
+ self.svg.docks[1][1]],
+ ['number', False, self.svg.docks[2][0],
+ self.svg.docks[2][1]],
+ ['unavailable', False, 0, 0, ')']]
self._left, self._right = self.svg.get_width()-self.svg.docks[2][0], 0
def _make_boolean_style(self, svg):
self.svg.expand(10+self._dx+self._ex, self._ey)
self._make_boolean_and_or(svg)
- self.docks = (('bool', True, self.svg.docks[0][0],
- self.svg.docks[0][1]),
- ('bool', False, self.svg.docks[1][0],
- self.svg.docks[1][1]),
- ('bool', False, self.svg.docks[2][0],
- self.svg.docks[2][1]))
+ self.docks = [['bool', True, self.svg.docks[0][0],
+ self.svg.docks[0][1]],
+ ['bool', False, self.svg.docks[1][0],
+ self.svg.docks[1][1]],
+ ['bool', False, self.svg.docks[2][0],
+ self.svg.docks[2][1]]]
self._left, self._right = self.svg.get_width()-self.svg.docks[1][0], 0
def _make_not_style(self, svg):
self.svg.expand(15+self._dx+self._ex, self._ey)
self._make_boolean_not(svg)
- self.docks = (('bool', True, self.svg.docks[0][0],
- self.svg.docks[0][1]),
- ('bool', False, self.svg.docks[1][0],
- self.svg.docks[1][1]))
+ self.docks = [['bool', True, self.svg.docks[0][0],
+ self.svg.docks[0][1]],
+ ['bool', False, self.svg.docks[1][0],
+ self.svg.docks[1][1]]]
self._right = self.svg.get_width()-self.svg.docks[1][0]
self._left = self._right
@@ -500,16 +506,16 @@ class Block:
self._make_basic_flow(svg)
# This is an ugly hack.
if self.name == 'forever':
- self.docks = (('flow', True, self.svg.docks[0][0],
- self.svg.docks[0][1]),
- ('flow', False, self.svg.docks[1][0],
- self.svg.docks[1][1], '['),
- ('unavailable', False, 0, 0, ']'))
+ self.docks = [['flow', True, self.svg.docks[0][0],
+ self.svg.docks[0][1]],
+ ['flow', False, self.svg.docks[1][0],
+ self.svg.docks[1][1], '['],
+ ['unavailable', False, 0, 0, ']']]
else:
- self.docks = (('flow', True, self.svg.docks[0][0],
- self.svg.docks[0][1]),
- ('flow', False, self.svg.docks[1][0],
- self.svg.docks[1][1]))
+ self.docks = [['flow', True, self.svg.docks[0][0],
+ self.svg.docks[0][1]],
+ ['flow', False, self.svg.docks[1][0],
+ self.svg.docks[1][1]]]
self._left, self._right = 0, self.svg.get_width()-self.svg.docks[1][0]
def _make_flow_style_1arg(self, svg):
@@ -518,14 +524,14 @@ class Block:
self.svg.set_tab(True)
self.svg.set_innie([True])
self._make_basic_flow(svg)
- self.docks = (('flow', True, self.svg.docks[0][0],
- self.svg.docks[0][1]),
- ('number', False, self.svg.docks[1][0],
- self.svg.docks[1][1]),
- ('flow', False, self.svg.docks[2][0],
- self.svg.docks[2][1], '['),
- ('flow', False, self.svg.docks[3][0],
- self.svg.docks[3][1], ']'))
+ self.docks = [['flow', True, self.svg.docks[0][0],
+ self.svg.docks[0][1]],
+ ['number', False, self.svg.docks[1][0],
+ self.svg.docks[1][1]],
+ ['flow', 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 = 2
self._right = self.svg.get_width()-self.svg.docks[1][0]+ \
self.svg.get_innie_width()*1.5
@@ -536,14 +542,14 @@ class Block:
self.svg.set_tab(True)
self.svg.set_boolean(True)
self._make_basic_flow(svg)
- self.docks = (('flow', True, self.svg.docks[0][0],
- self.svg.docks[0][1]),
- ('bool', False, self.svg.docks[1][0],
- self.svg.docks[1][1]),
- ('flow', False, self.svg.docks[2][0],
- self.svg.docks[2][1], '['),
- ('flow', False, self.svg.docks[3][0],
- self.svg.docks[3][1], ']'))
+ self.docks = [['flow', True, self.svg.docks[0][0],
+ self.svg.docks[0][1]],
+ ['bool', False, self.svg.docks[1][0],
+ self.svg.docks[1][1]],
+ ['flow', 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_flow_style_else(self, svg):
@@ -553,16 +559,16 @@ class Block:
self.svg.set_else(True)
self.svg.set_boolean(True)
self._make_basic_flow(svg)
- self.docks = (('flow', True, self.svg.docks[0][0],
- self.svg.docks[0][1]),
- ('bool', False, self.svg.docks[1][0],
- self.svg.docks[1][1]),
- ('flow', False, self.svg.docks[3][0],
- self.svg.docks[3][1], '['),
- ('flow', False, self.svg.docks[2][0],
- self.svg.docks[2][1], ']['),
- ('flow', False, self.svg.docks[4][0],
- self.svg.docks[4][1], ']'))
+ self.docks = [['flow', True, self.svg.docks[0][0],
+ self.svg.docks[0][1]],
+ ['bool', False, self.svg.docks[1][0],
+ self.svg.docks[1][1]],
+ ['flow', False, self.svg.docks[3][0],
+ self.svg.docks[3][1], '['],
+ ['flow', False, self.svg.docks[2][0],
+ self.svg.docks[2][1], ']['],
+ ['flow', False, self.svg.docks[4][0],
+ self.svg.docks[4][1], ']']]
self._left, self._right = 2, self.svg.get_width()-self.svg.docks[1][0]
def _make_portfolio_style(self, svg):
@@ -571,20 +577,20 @@ class Block:
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[6][0],
- self.svg.docks[6][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.docks = [['flow', True, self.svg.docks[0][0],
+ self.svg.docks[0][1]],
+ ['string', False, self.svg.docks[6][0],
+ self.svg.docks[6][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):
@@ -593,16 +599,16 @@ class Block:
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]),
- ('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.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]],
+ ['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 e4f17c5..47ae511 100644
--- a/constants.py
+++ b/constants.py
@@ -53,7 +53,7 @@ PALETTES = [['forward', 'back', 'clean', 'left', 'right', 'show',
'myfunc', 'nop', 'leftpos', 'toppos', 'width', 'rightpos',
'bottompos', 'height', 'turtle', 'print'],
['journal', 'audio', 'description', 'hideblocks', 'template7',
- 'template2', 'template3'],
+ 'template2', 'list'],
['restore']]
#
@@ -76,6 +76,9 @@ SELECTED_COLOR = "#0000FF"
SELECTED_STROKE_WIDTH = 1.5
STANDARD_STROKE_WIDTH = 1.0
+PALETTE_SCALE = {'template7':1.0}
+
+
#
# block style definitions
#
@@ -107,14 +110,14 @@ FLOW_STYLE_1ARG = ['repeat']
FLOW_STYLE_BOOLEAN = ['if']
FLOW_STYLE_ELSE = ['ifelse']
PORTFOLIO_STYLE = ['template7']
-BULLET_STYLE = ['template3']
+BULLET_STYLE = ['list']
PORTFOLIO_STYLE_1PIX = ['template1']
PORTFOLIO_STYLE_2PIX = ['template2', 'template6']
#
# blocks that are expandable
#
-EXPANDABLE = ['vspace', 'hspace']
+EXPANDABLE = ['vspace', 'hspace', 'list']
#
# blocks that contain media
@@ -124,7 +127,6 @@ CONTENT_BLOCKS = ['number', 'string', 'description', 'audio', 'journal']
#
# block name dictionary
#
-
BLOCK_NAMES = {
'and':[_('and')],
'arc':[_('arc'),_('angle'),_('radius')],
@@ -161,6 +163,7 @@ BLOCK_NAMES = {
'left':[_('left')],
'leftpos':[_('left')],
'less':['<'],'greater':[">"],
+ 'list':[_('list')],
'minus2':['–'],
'myfunc':[_('Python'),_('code'),_('value')],
'nop':[_(' ')],
@@ -259,6 +262,7 @@ PRIMITIVES = {
'left':'left',
'leftpos':'leftpos',
'less':'less?',
+ 'list':'bullet',
'minus2':'minus',
'myfunc':'myfunc',
'nop':'userdefined',
@@ -302,7 +306,6 @@ PRIMITIVES = {
'storeinbox2':'storeinbox2',
'template1':'tp1',
'template2':'tp2',
- 'template3':'tp3',
'template6':'tp6',
'template7':'tp7',
'textsize':'textsize',
@@ -330,6 +333,7 @@ DEFAULTS = {
'hat':[_('action')],
'journal':[None],
'left':[90],
+ 'list':[_('Title'), '∙ '],
'media':[None],
'myfunc':[_('x'),100],
'nop':[100],
@@ -352,7 +356,6 @@ DEFAULTS = {
'string':[_('text')],
'template1':[_('Title'), 'None'],
'template2':[_('Title'), 'None', 'None'],
- 'template3':[_('Title'), '∙ ', '∙ ', '∙ ', '∙ ', '∙ ', '∙ ', '∙ '],
'template6':[_('Title'), 'None', 'None'],
'template7':[_('Title'), 'None', 'None', 'None', 'None'],
'turtle':[1],
@@ -380,7 +383,7 @@ OLD_NAMES = {'product':'product2', 'storeinbox':'storein',
'division':'division2', 'plus':'plus2',
'remainder':'remainder2', 'identity':'identity2',
'division':'division2', 'if else':'if', 'audiooff':'audio',
- 'descriptionoff':'description'}
+ 'descriptionoff':'description','template3':'list'}
#
# 'dead key' Unicode dictionaries
diff --git a/sprite_factory.py b/sprite_factory.py
index 3cd595b..ad40194 100755
--- a/sprite_factory.py
+++ b/sprite_factory.py
@@ -744,13 +744,14 @@ def generator(datapath):
svg_str = svgt.turtle()
f.write(svg_str)
close_file(f)
+ """
svg0 = SVG()
f = open_file(datapath, "portfolio-test.svg")
svg0.set_scale(1)
- svg0.expand(40,0)
+ svg0.expand(25,10)
svg0.set_slot(True)
- svg0.set_innie([True, True, False, False, True])
+ svg0.set_innie([True, True, False, True])
svg0.set_tab(True)
svg0.set_gradiant(True)
svg_str = svg0.portfolio()
@@ -770,7 +771,6 @@ def generator(datapath):
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 729a7b6..b7633b0 100644
--- a/talogo.py
+++ b/talogo.py
@@ -59,7 +59,6 @@ def audio_media_type(suffix):
return True
return False
-
class symbol:
def __init__(self, name):
self.name = name
@@ -101,6 +100,9 @@ def blocks_to_code(lc, blk):
if blk is None:
return ['%nothing%']
code = []
+ print blk.name
+ print blk.docks
+ print blk.connections
dock = blk.docks[0]
if len(dock)>4:
code.append(dock[4])
@@ -113,6 +115,7 @@ def blocks_to_code(lc, blk):
except ValueError:
code.append(float(ord(blk.values[0][0])))
elif blk.name=='string' or blk.name=='title':
+ print "%s %s" % (blk.name, blk.values[0])
if type(blk.values[0]) == float or type(blk.values[0]) == int:
if int(blk.values[0]) == blk.values[0]:
blk.values[0] = int(blk.values[0])
@@ -145,7 +148,6 @@ def blocks_to_code(lc, blk):
if b is not None:
code.extend(blocks_to_code(lc, b))
elif blk.docks[i][0] not in ['flow', 'unavailable']:
- print "appending nothing"
code.append('%nothing%')
return code
@@ -320,6 +322,10 @@ def prim_repeat(lc, num, list):
if lc.procstop: break
ireturn(lc); yield True
+def prim_bullet(lc, title, list):
+ show_bullets(lc, title, list)
+ ireturn(lc); yield True
+
def prim_forever(lc, list):
while True:
icall(lc,evline, list[:]); yield True
@@ -588,8 +594,7 @@ def lcNew(tw):
defprim(lc,'tp1', 2, lambda lc,x,y: show_template1(lc, x, y))
defprim(lc,'tp8', 2, lambda lc,x,y: show_template8(lc, x, y))
defprim(lc,'tp6', 3, lambda lc,x,y,z: show_template6(lc, x, y, z))
- defprim(lc,'tp3', 8, lambda lc,x,y,z,a,b,c,d,e: \
- show_template3(lc, x, y, z, a, b, c, d, e))
+ defprim(lc,'bullet', 2, prim_bullet, True)
defprim(lc,'sound', 1, lambda lc,x: play_sound(lc, x))
defprim(lc,'video', 1, lambda lc,x: play_movie(lc, x))
defprim(lc,'tp2', 3, lambda lc,x,y,z: \
@@ -814,8 +819,8 @@ def show_template2(lc, title, media1, media2):
# restore text size
lc.tw.canvas.settextsize(save_text_size)
-# title and seven bullets
-def show_template3(lc, title, s1, s2, s3, s4, s5, s6, s7):
+# title and varible number of bullets
+def show_bullets(lc, title, sarray):
w,h,xo,yo,dx,dy = calc_position(lc,'tp3')
x = -(lc.tw.canvas.width/2)+xo
y = lc.tw.canvas.height/2
@@ -828,26 +833,11 @@ def show_template3(lc, title, s1, s2, s3, s4, s5, s6, s7):
# set body text size
lc.tw.canvas.settextsize(lc.bullet_height)
y -= int(lc.title_height*2*lc.tw.lead) # leave some space below the title
- lc.tw.canvas.setxy(x, y)
- show(lc, s1)
- y -= int(lc.bullet_height*2*lc.tw.lead)
- lc.tw.canvas.setxy(x, y)
- show(lc, s2)
- y -= int(lc.bullet_height*2*lc.tw.lead)
- lc.tw.canvas.setxy(x, y)
- show(lc, s3)
- y -= int(lc.bullet_height*2*lc.tw.lead)
- lc.tw.canvas.setxy(x, y)
- show(lc, s4)
- y -= int(lc.bullet_height*2*lc.tw.lead)
- lc.tw.canvas.setxy(x, y)
- show(lc, s5)
- y -= int(lc.bullet_height*2*lc.tw.lead)
- lc.tw.canvas.setxy(x, y)
- show(lc, s6)
- y -= int(lc.bullet_height*2*lc.tw.lead)
- lc.tw.canvas.setxy(x, y)
- show(lc, s7)
+ for s in sarray:
+ print "bullet: %s" % (s)
+ lc.tw.canvas.setxy(x, y)
+ show(lc, s)
+ y -= int(lc.bullet_height*2*lc.tw.lead)
# restore text size
lc.tw.canvas.settextsize(save_text_size)
diff --git a/tawindow.py b/tawindow.py
index caecda9..df1fb55 100644
--- a/tawindow.py
+++ b/tawindow.py
@@ -380,10 +380,9 @@ 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 or name in PORTFOLIO_STYLE_2PIX:
- scale = 1.0
- elif name in BULLET_STYLE:
- scale = 0.67
+ # Some blocks are too big to fit the palette.
+ if PALETTE_SCALE.has_key(name):
+ scale = PALETTE_SCALE[name]
else:
scale = 1.5
self.palettes[n].append(Block(self.block_list,
@@ -391,14 +390,13 @@ class TurtleArtWindow():
0, 0, 'proto', [], scale))
self.palettes[n][i].spr.set_layer(TAB_LAYER)
self.palettes[n][i].spr.set_shape(self.palettes[n][i].shapes[0])
- # Add a skin to some blocks
+ # Some blocks get a skin.
if name in BOX_STYLE_MEDIA:
self.palettes[n][i].spr.set_image(self.media_shapes[
name+'small'], 1, 28, 7)
elif name == 'nop':
self.palettes[n][i].spr.set_image(self.media_shapes[
'pythonsmall'], 1, 10, 7)
- # simple packing algorithm
_x, _y, _max_width = 5, ICON_SIZE+5, 0
for i in range(len(PALETTES[n])):
_w, _h = self.palettes[n][i].spr.get_dimensions()
@@ -991,6 +989,26 @@ class TurtleArtWindow():
blk.expand_in_x(dx)
for b in group:
b.spr.move_relative((dx*blk.scale, 0))
+ elif blk.name=='list':
+ n = len(blk.connections)
+ group = self._find_group(blk.connections[n-1])
+ r,g,b,a = blk.spr.get_pixel((x, y))
+ dy = blk.add_arg()
+ for b in group:
+ b.spr.move_relative((0, dy))
+ blk.connections.append(blk.connections[n-1])
+ argname = blk.docks[n-1][0]
+ argvalue = DEFAULTS[blk.name][len(DEFAULTS[blk.name])-1]
+ argblk = Block(self.block_list, self.sprite_list, argname,
+ 0, 0, 'block', [argvalue])
+ argdock = argblk.docks[0]
+ (bx, by) = blk.spr.get_xy()
+ nx = bx+blk.docks[n-1][2]-argdock[2]
+ ny = by+blk.docks[n-1][3]-argdock[3]
+ argblk.spr.move((nx, ny))
+ argblk.spr.set_layer(TOP_LAYER)
+ argblk.connections = [blk, None]
+ blk.connections[n-1] = argblk
elif blk.name=='nop' and self.myblock==None:
self._import_py()
else:
@@ -1228,6 +1246,8 @@ class TurtleArtWindow():
dock2 = block2.docks[dock2n]
d1type, d1dir, d1x, d1y = dock1[0:4]
d2type, d2dir, d2x, d2y = dock2[0:4]
+ if block1 == block2:
+ return (100,100)
if (d2type is not 'number') or (dock2n is not 0):
if block1.connections is not None and \
dock1n < len(block1.connections) and \
@@ -1237,13 +1257,11 @@ class TurtleArtWindow():
dock2n < len(block2.connections) and \
block2.connections[dock2n] is not None:
return (100,100)
- if block1 == block2:
- return (100,100)
if d1type != d2type:
# some blocks can take strings or nums
if block1.name in ('write', 'plus', 'equal', 'less', 'greater',
'template1', 'template2', 'template3',
- 'template4', 'template6', 'template7', 'nop',
+ 'template4', 'template6', 'list', 'nop',
'print', 'stack', 'hat'):
if block1.name == 'write' and d1type == 'string':
if d2type == 'number' or d2type == 'string':