Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/TurtleArt/tablock.py
diff options
context:
space:
mode:
Diffstat (limited to 'TurtleArt/tablock.py')
-rw-r--r--TurtleArt/tablock.py275
1 files changed, 181 insertions, 94 deletions
diff --git a/TurtleArt/tablock.py b/TurtleArt/tablock.py
index f835994..7e48d43 100644
--- a/TurtleArt/tablock.py
+++ b/TurtleArt/tablock.py
@@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
-#Copyright (c) 2010,11 Walter Bender
+#Copyright (c) 2010-2012 Walter Bender
#Permission is hereby granted, free of charge, to any person obtaining a copy
#of this software and associated documentation files (the "Software"), to deal
@@ -23,7 +23,8 @@ import gtk
from gettext import gettext as _
from taconstants import EXPANDABLE, EXPANDABLE_ARGS, OLD_NAMES, CONSTANTS, \
- STANDARD_STROKE_WIDTH, BLOCK_SCALE, BOX_COLORS, GRADIENT_COLOR
+ STANDARD_STROKE_WIDTH, BLOCK_SCALE, BOX_COLORS, GRADIENT_COLOR, \
+ EXPANDABLE_FLOW
from tapalette import palette_blocks, block_colors, expandable_blocks, \
content_blocks, block_names, block_primitives, block_styles, \
special_block_colors
@@ -139,6 +140,7 @@ class Block:
self.dx = 0
self.ex = 0
self.ey = 0
+ self.ey2 = 0
self._ei = 0
self._font_size = [6.0, 4.5]
self._image = None
@@ -156,7 +158,6 @@ class Block:
'basic-style-2arg': self._make_basic_style_2arg,
'basic-style-3arg': self._make_basic_style_3arg,
'basic-style-var-arg': self._make_basic_style_var_arg,
- 'invisible': self._make_invisible_style,
'bullet-style': self._make_bullet_style,
'box-style': self._make_box_style,
'box-style-media': self._make_media_style,
@@ -170,19 +171,13 @@ class Block:
'compare-porch-style': self._make_compare_porch_style,
'boolean-style': self._make_boolean_style,
'not-style': self._make_not_style,
- 'flow-style': self._make_flow_style,
+ 'clamp-style': self._make_clamp_style,
+ 'clamp-style-collapsible': self._make_clamp_style_collapsible,
+ 'clamp-style-collapsed': self._make_clamp_style_collapsed,
+ 'clamp-style-1arg': self._make_clamp_style_1arg,
+ 'clamp-style-boolean': self._make_clamp_style_boolean,
+ 'clamp-style-else': self._make_clamp_style_else,
'flow-style-tail': self._make_flow_style_tail,
- 'flow-style-1arg': self._make_flow_style_1arg,
- 'flow-style-boolean': self._make_flow_style_boolean,
- 'flow-style-else': self._make_flow_style_else,
- 'collapsible-top': [self._make_collapsible_style_top, True, True],
- 'collapsible-top-no-arm': [self._make_collapsible_style_top,
- False, True],
- 'collapsible-top-no-label': [self._make_collapsible_style_top,
- True, False],
- 'collapsible-top-no-arm-no-label': [
- self._make_collapsible_style_top, False, False],
- 'collapsible-bottom': self._make_collapsible_style_bottom,
'portfolio-style-2x2': self._make_portfolio_style_2x2,
'portfolio-style-1x1': self._make_portfolio_style_1x1,
'portfolio-style-2x1': self._make_portfolio_style_2x1,
@@ -232,6 +227,8 @@ class Block:
return True
if self.name in EXPANDABLE_ARGS:
return True
+ if self.name in EXPANDABLE_FLOW:
+ return True
return False
def cloneable(self):
@@ -246,12 +243,12 @@ class Block:
def highlight(self):
""" We may want to highlight a block... """
- if self.spr is not None:
+ if self.spr is not None and self.status is not 'collapsed':
self.spr.set_shape(self.shapes[1])
def unhighlight(self):
""" Or unhighlight it. """
- if self.spr is not None:
+ if self.spr is not None and self.status is not 'collapsed':
self.spr.set_shape(self.shapes[0])
def resize(self):
@@ -290,7 +287,6 @@ class Block:
self.scale = scale
for i in range(len(self._font_size)):
self._font_size[i] *= self.scale
- self._set_label_attributes()
self.svg.set_scale(self.scale)
self.refresh()
self.spr.inval()
@@ -305,6 +301,7 @@ class Block:
return
self._make_block(self.svg)
self._set_margins()
+ self._set_label_attributes()
self.spr.set_shape(self.shapes[0])
def add_arg(self, keep_expanding=True):
@@ -336,6 +333,22 @@ class Block:
self.svg.set_show(False)
self.refresh()
+ def expand_in_y2(self, dy):
+ """ We may want to grow a block vertically. """
+ if self.spr is None:
+ return
+ self.ey2 += dy
+ if self.type == 'block':
+ if self.ey2 > 0:
+ self.svg.set_hide(True)
+ else:
+ self.svg.set_hide(False)
+ self.svg.set_show(True)
+ else:
+ self.svg.set_hide(False)
+ self.svg.set_show(False)
+ self.refresh()
+
def expand_in_x(self, dx):
""" We may want to grow a block horizontally. """
if self.spr is None:
@@ -349,6 +362,42 @@ class Block:
self.svg.set_show(False)
self.refresh()
+ def contract_in_y(self, dy):
+ """ We may want to shrink a block veritcally. """
+ if self.spr is None:
+ return
+ self.ey -= dy
+ if self.ey < 0:
+ self.ey = 0
+ if self.type == 'block':
+ if self.ey > 0:
+ self.svg.set_hide(True)
+ else:
+ self.svg.set_hide(False)
+ self.svg.set_show(True)
+ else:
+ self.svg.set_hide(False)
+ self.svg.set_show(False)
+ self.refresh()
+
+ def contract_in_x(self, dx):
+ """ We may want to shrink a block horizontally. """
+ if self.spr is None:
+ return
+ self.ex -= dx
+ if self.ex < 0:
+ self.ex = 0
+ if self.type == 'block':
+ if self.ex > 0:
+ self.svg.set_hide(True)
+ else:
+ self.svg.set_hide(False)
+ self.svg.set_show(True)
+ else:
+ self.svg.set_hide(False)
+ self.svg.set_show(False)
+ self.refresh()
+
def reset_x(self):
if self.spr is None:
return 0
@@ -375,10 +424,23 @@ class Block:
self.refresh()
return dy
+ def reset_y2(self):
+ if self.spr is None:
+ return 0
+ dy = -self.ey2
+ self.ey2 = 0
+ self.svg.set_hide(False)
+ if self.type == 'block':
+ self.svg.set_show(True)
+ else: # 'proto'
+ self.svg.set_show(False)
+ self.refresh()
+ return dy
+
def get_expand_x_y(self):
if self.spr is None:
return(0, 0)
- return (self.ex, self.ey)
+ return (self.ex, self.ey, self.ey2)
def _new_block_from_factory(self, sprite_list, x, y, copy_block=None):
self.svg = SVG()
@@ -459,28 +521,51 @@ class Block:
for i in range(n):
if self.name in block_styles['compare-porch-style']:
self.spr.set_label_attributes(int(self._font_size[0] + 0.5),
- True, 'center', 'bottom', i)
+ True, 'center', 'bottom', i=i)
elif self.name in block_styles['number-style-porch']:
self.spr.set_label_attributes(int(self._font_size[0] + 0.5),
- True, 'right', 'bottom', i)
-
- elif self.name in block_styles['flow-style-boolean'] or \
- self.name in block_styles['flow-style-else']:
- self.spr.set_label_attributes(int(self._font_size[0] + 0.5),
- True, 'left', 'middle', 0)
- self.spr.set_label_attributes(int(self._font_size[1] + 0.5),
- True, 'right', 'top', 1)
- self.spr.set_label_attributes(int(self._font_size[1] + 0.5),
- True, 'right', 'bottom', 2)
+ True, 'right', 'bottom', i=i)
+ elif self.name in EXPANDABLE_FLOW:
+ self._calc_moving_labels(i)
elif i == 1: # top
self.spr.set_label_attributes(int(self._font_size[1] + 0.5),
- True, 'right', 'top', i)
+ True, 'right', 'top', i=i)
elif i == 2: # bottom
self.spr.set_label_attributes(int(self._font_size[1] + 0.5),
- True, 'right', 'bottom', i)
+ True, 'right', 'bottom', i=i)
else:
self.spr.set_label_attributes(int(self._font_size[0] + 0.5),
- True, 'center', 'middle', i)
+ True, 'center', 'middle', i=i)
+
+ def _calc_moving_labels(self, i):
+ ''' Some labels move as blocks change shape/size '''
+ if self.name in block_styles['clamp-style'] or \
+ self.name in block_styles['clamp-style-collapsible']:
+ y = int((self.docks[0][3] + self.docks[1][3]) / 3)
+ self.spr.set_label_attributes(int(self._font_size[0] + 0.5),
+ True, 'right', y_pos=y, i=0)
+ elif self.name in block_styles['clamp-style-1arg']:
+ y = self.docks[1][3] - int(int(self._font_size[0] * 1.3))
+ self.spr.set_label_attributes(int(self._font_size[0] + 0.5),
+ True, 'right', y_pos=y, i=0)
+ elif self.name in block_styles['clamp-style-boolean']:
+ y = self.docks[1][3] - int(int(self._font_size[0] * 1.3))
+ self.spr.set_label_attributes(int(self._font_size[0] + 0.5),
+ True, 'right', y_pos=y, i=0)
+ y = self.docks[2][3] - int(int(self._font_size[0] * 1.3))
+ self.spr.set_label_attributes(int(self._font_size[1] + 0.5),
+ True, 'right', y_pos=y, i=1)
+ elif self.name in block_styles['clamp-style-else']:
+ y = self.docks[1][3] - int(int(self._font_size[0] * 1.3))
+ self.spr.set_label_attributes(int(self._font_size[0] + 0.5),
+ True, 'right', y_pos=y, i=0)
+ y = self.docks[2][3] - int(int(self._font_size[0] * 1.3))
+ self.spr.set_label_attributes(int(self._font_size[1] + 0.5),
+ True, 'right', y_pos=y, i=1)
+ y = self.docks[3][3] - int(int(self._font_size[0] * 1.3))
+ self.spr.set_label_attributes(int(self._font_size[1] + 0.5),
+ True, 'right', y_pos=y, i=2)
+
def _set_labels(self, i, label):
if self.spr is None:
@@ -502,8 +587,8 @@ class Block:
else:
self.block_methods[k](svg)
return
- error_output('block type not found %s' % (self.name))
- self.block_methods['basic-style'](svg)
+ error_output('ERROR: block type not found %s' % (self.name))
+ self.block_methods['blank-style'](svg)
def _set_colors(self, svg):
if self._custom_colors:
@@ -778,107 +863,109 @@ class Block:
['bool', False, self.svg.docks[1][0],
self.svg.docks[1][1]]]
- def _make_flow_style(self, svg):
- self.svg.expand(10 + self.dx + self.ex, self.ey)
+ def _make_clamp_style(self, svg, extend_x=0, extend_y=4):
+ self.svg.expand(self.dx + self.ex + extend_x, self.ey + extend_y)
self.svg.set_slot(True)
self.svg.set_tab(True)
- self._make_block_graphics(svg, self.svg.basic_flow)
+ self.svg.second_clamp(False)
+ self._make_block_graphics(svg, self.svg.clamp)
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], '['],
- ['flow', False, self.svg.docks[2][0],
- self.svg.docks[2][1], ']']]
+ # Skip bottom of clamp
+ ['flow', False, self.svg.docks[3][0],
+ self.svg.docks[3][1], ']']]
- def _make_flow_style_tail(self, svg):
- self.svg.expand(10 + self.dx + self.ex, self.ey)
+ def _make_clamp_style_collapsible(self, svg, extend_x=0, extend_y=4):
+ self.svg.expand(self.dx + self.ex + extend_x, self.ey + extend_y)
self.svg.set_slot(True)
- self.svg.set_tab(False)
- self._make_block_graphics(svg, self.svg.basic_flow)
+ self.svg.set_tab(True)
+ self.svg.set_collapsible(True)
+ self.svg.second_clamp(False)
+ self._make_block_graphics(svg, self.svg.clamp)
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.svg.docks[1][1], '['],
+ # Skip bottom of clamp
+ ['flow', False, self.svg.docks[3][0],
+ self.svg.docks[3][1], ']']]
- def _make_flow_style_1arg(self, svg):
- self.svg.expand(self.dx + self.ex, self.ey)
+ def _make_clamp_style_collapsed(self, svg, extend_x=0, extend_y=4):
+ self.svg.expand(self.dx + self.ex + extend_x, self.ey + extend_y)
+ self.svg.set_show(True)
+ self._make_block_graphics(svg, self.svg.basic_block)
+ self.docks = [['flow', True, self.svg.docks[0][0],
+ self.svg.docks[0][1]],
+ ['unavailable', True, 0, self.svg.docks[0][1] + 10, '['],
+ ['flow', False, self.svg.docks[1][0],
+ self.svg.docks[1][1], ']']]
+
+ def _make_clamp_style_1arg(self, svg, extend_x=0, extend_y=4):
+ self.svg.expand(self.dx + self.ex + extend_x, self.ey + extend_y)
self.svg.set_slot(True)
self.svg.set_tab(True)
self.svg.set_innie([True])
- self._make_block_graphics(svg, self.svg.basic_flow)
+ self.svg.second_clamp(False)
+ self._make_block_graphics(svg, self.svg.clamp)
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], ']']]
+ # Skip bottom of clamp
+ ['flow', False, self.svg.docks[4][0],
+ self.svg.docks[4][1], ']']]
- def _make_flow_style_boolean(self, svg):
- self.svg.expand(self.dx + self.ex, self.ey)
+ def _make_clamp_style_boolean(self, svg, extend_x=0, extend_y=4):
+ self.svg.expand(self.dx + self.ex + extend_x, self.ey + extend_y)
self.svg.set_slot(True)
self.svg.set_tab(True)
self.svg.set_boolean(True)
- self._make_block_graphics(svg, self.svg.basic_flow)
+ self.svg.second_clamp(False)
+ self._make_block_graphics(svg, self.svg.clamp)
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]],
+ 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], ']']]
+ # Skip bottom of clamp
+ ['flow', False, self.svg.docks[4][0],
+ self.svg.docks[4][1], ']']]
- def _make_flow_style_else(self, svg):
- self.svg.expand(self.dx + self.ex, self.ey)
+ def _make_clamp_style_else(self, svg, extend_x=0, extend_y=4):
+ self.svg.expand(self.dx + self.ex + extend_x, self.ey + extend_y,
+ self.dx + self.ex + extend_x, self.ey2 + extend_y)
self.svg.set_slot(True)
self.svg.set_tab(True)
- self.svg.set_else(True)
self.svg.set_boolean(True)
- self._make_block_graphics(svg, self.svg.basic_flow)
+ self.svg.second_clamp(True)
+ self._make_block_graphics(svg, self.svg.clamp)
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], ']['],
+ self.svg.docks[2][1], '['],
+ # Skip bottom of clamp
['flow', False, self.svg.docks[4][0],
- self.svg.docks[4][1], ']']]
+ self.svg.docks[4][1], ']['],
+ # Skip bottom of clamp
+ ['flow', False, self.svg.docks[6][0],
+ self.svg.docks[6][1], ']']]
- def _make_collapsible_style_top(self, svg, arm=True, label=True):
- self.svg.expand(self.dx + self.ex, self.ey)
- self.svg.set_arm(arm)
- self.svg.set_show(not arm)
- self._make_block_graphics(svg, self.svg.sandwich_top, label)
- if label:
- 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]]]
- 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]]]
-
- def _make_collapsible_style_bottom(self, svg):
- self.svg.expand(self.dx + self.ex, self.ey)
- self._make_block_graphics(svg, self.svg.sandwich_bottom)
- 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]]]
-
- def _make_invisible_style(self, svg):
- self._make_block_graphics(svg, self.svg.invisible)
- # force dock positions to be the same
+ def _make_flow_style_tail(self, svg):
+ self.svg.expand(10 + self.dx + self.ex, self.ey)
+ self.svg.set_slot(True)
+ self.svg.set_tab(False)
+ self._make_block_graphics(svg, self.svg.basic_flow)
self.docks = [['flow', True, self.svg.docks[0][0],
- self.svg.docks[0][1]], ['flow', False,
- self.svg.docks[0][0], self.svg.docks[0][1]]]
+ self.svg.docks[0][1]],
+ ['flow', False, self.svg.docks[1][0],
+ self.svg.docks[1][1]]]
# Depreciated block styles