Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/TurtleArt/taconstants.py
diff options
context:
space:
mode:
authorWalter Bender <walter@sugarlabs.org>2010-08-12 17:57:55 (GMT)
committer Walter Bender <walter@sugarlabs.org>2010-08-12 17:57:55 (GMT)
commitc2937d9fdd30b1b896caf66851d6677924d07488 (patch)
treec242386fa59755d4adea7fb414b72466181a2a2e /TurtleArt/taconstants.py
parent98caa09b7eadbd14776b73f01095bc59cb39cc18 (diff)
reorg of module heirarchy
Diffstat (limited to 'TurtleArt/taconstants.py')
-rw-r--r--TurtleArt/taconstants.py1065
1 files changed, 1065 insertions, 0 deletions
diff --git a/TurtleArt/taconstants.py b/TurtleArt/taconstants.py
new file mode 100644
index 0000000..2998885
--- /dev/null
+++ b/TurtleArt/taconstants.py
@@ -0,0 +1,1065 @@
+# -*- coding: utf-8 -*-
+#Copyright (c) 2010, 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
+#in the Software without restriction, including without limitation the rights
+#to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+#copies of the Software, and to permit persons to whom the Software is
+#furnished to do so, subject to the following conditions:
+
+#The above copyright notice and this permission notice shall be included in
+#all copies or substantial portions of the Software.
+
+#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+#IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+#FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+#AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+#LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+#OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+#THE SOFTWARE.
+
+"""
+This file contains the constants that by-in-large determine the
+behavior of Turtle Art. Notably, the block palettes are defined
+below. If you want to add a new block to Turtle Art, it is generally a
+matter of modifying some tables below and then adding the primitive to
+talogo.py. For example, if we want to add a new turtle command,
+'uturn', we'd make the following changes:
+
+(1) We'd add 'uturn' to the PALETTES list of lists:
+
+PALETTES = [['forward', 'back', 'clean', 'left', 'right', 'uturn', 'show',
+ 'seth', 'setxy', 'heading', 'xcor', 'ycor', 'setscale',
+ 'arc', 'scale'],
+ ['penup','pendown', 'setpensize', 'fillscreen', 'pensize',...
+
+(2) Then we'd add it to one of the block-style definitions. Since it takes
+no arguments, we'd add it here:
+
+BASIC_STYLE = ['clean', 'penup', 'pendown', 'stack1', 'stack2', 'vspace',
+ 'hideblocks', 'showblocks', 'clearheap', 'printheap', 'kbinput', 'uturn']
+
+(3) Then we give it a name (Note the syntax _('string to be
+translated') used by the language-internationalization system; also
+note that the name is an array, as some blocks contain multiple
+strings.):
+
+BLOCK_NAMES = {
+...
+ 'uturn':[_('u-turn')],
+...
+ }
+
+(4) and a help-menu entry:
+
+HELP_STRINGS = {
+...
+ 'uturn':_('change the heading of the turtle 180 degrees'),
+...
+ }
+
+(5) Next, we need to define it as a primitive for the Logo command
+parser (generally just the same name):
+
+PRIMITIVES = {
+...
+ 'uturn':'uturn',
+...
+ }
+
+(6) Since there are no default arguments, we don't need to do anything
+else here. But we do need to define the actual function in talogo.py
+
+DEFPRIM = {
+...
+ 'uturn':[0, lambda self: self.tw.canvas.seth(self.tw.canvas.heading+180)],
+...
+ }
+
+That's it. When you next run Turtle Art, you will have a 'uturn' block
+on the Turtle Palette.
+
+Adding a new palette is simply a matter of: (1) adding an additional
+entry to PALETTE_NAMES; (2) new list of blocks to PALETTES; and (3) an
+additional entry in COLORS. However you will have to: (4) create icons
+for the palette-selector buttons. These are kept in the icons
+subdirectory. You need two icons: yourpalettenameoff.svg and
+yourpalettenameon.svg, where yourpalettename is the same string as the
+entry you added to the PALETTE_NAMES list. Note that the icons should
+be the same size (55x55) as the others. This is the default icon size
+for Sugar toolbars.
+
+"""
+
+from gettext import gettext as _
+
+#
+# Sprite layers
+#
+
+HIDE_LAYER = 100
+CANVAS_LAYER = 500
+OVERLAY_LAYER = 525
+TURTLE_LAYER = 550
+BLOCK_LAYER = 600
+CATEGORY_LAYER = 700
+TAB_LAYER = 710
+STATUS_LAYER = 900
+TOP_LAYER = 1000
+
+#
+# Block-palette categories
+#
+
+PALETTE_NAMES = ['turtle', 'pen', 'colors', 'numbers', 'flow', 'blocks',
+ 'extras', 'portfolio', 'trash']
+
+PALETTES = [['clean', 'forward', 'back', 'show', 'left', 'right',
+ 'seth', 'setxy', 'heading', 'xcor', 'ycor', 'setscale',
+ 'arc', 'scale', 'leftpos', 'toppos', 'rightpos',
+ 'bottompos'],
+ ['penup','pendown', 'setpensize', 'fillscreen', 'pensize',
+ 'setcolor', 'setshade', 'setgray', 'color', 'shade',
+ 'gray', 'startfill', 'stopfill' ],
+ [ 'red', 'orange', 'yellow', 'green', 'cyan', 'blue', 'purple',
+ 'white', 'black'],
+ ['plus2', 'minus2', 'product2',
+ 'division2', 'identity2', 'remainder2', 'sqrt', 'random',
+ 'number', 'greater2', 'less2', 'equal2', 'not', 'and2', 'or2'],
+ ['wait', 'forever', 'repeat', 'if', 'ifelse', 'while', 'until',
+ 'hspace', 'vspace', 'stopstack'],
+ ['hat1', 'stack1', 'hat', 'hat2', 'stack2', 'stack',
+ 'storeinbox1', 'storeinbox2', 'string', 'box1', 'box2', 'box',
+ 'storein', 'start'],
+ ['kbinput', 'push', 'printheap', 'keyboard', 'pop', 'clearheap',
+ 'myfunc1arg', 'userdefined', 'addturtle', 'comment', 'print',
+ 'cartesian', 'width', 'height', 'polar', 'sandwichtop',
+ 'sandwichbottom'],
+ ['journal', 'audio', 'description', 'hideblocks', 'showblocks',
+ 'fullscreen', 'savepix', 'savesvg', 'picturelist',
+ 'picture1x1a', 'picture1x1', 'picture2x2', 'picture2x1',
+ 'picture1x2'],
+ ['empty', 'restoreall']]
+
+#
+# Block-style attributes
+#
+
+COLORS = [["#00FF00","#00A000"], ["#00FFFF","#00A0A0"], ["#00FFFF","#00A0A0"],
+ ["#FF00FF","#A000A0"], ["#FFC000","#A08000"], ["#FFFF00","#A0A000"],
+ ["#FF0000","#A00000"], ["#0000FF","#0000A0"], ["#FFFF00","#A0A000"]]
+
+BOX_COLORS = {'red':["#FF0000","#A00000"],'orange':["#FFD000","#AA8000"],
+ 'yellow':["#FFFF00","#A0A000"],'green':["#00FF00","#008000"],
+ 'cyan':["#00FFFF","#00A0A0"],'blue':["#0000FF","#000080"],
+ 'purple':["#FF00FF","#A000A0"], 'white':["#FFFFFF", "#A0A0A0"],
+ 'black':["#000000", "#000000"]}
+
+#
+# Misc. parameters
+#
+PALETTE_HEIGHT = 120
+PALETTE_WIDTH = 175
+SELECTOR_WIDTH = 55
+ICON_SIZE = 55
+SELECTED_COLOR = "#0000FF"
+SELECTED_STROKE_WIDTH = 1.0
+STANDARD_STROKE_WIDTH = 1.0
+BLOCK_SCALE = 2.0
+PALETTE_SCALE = 1.5
+DEFAULT_TURTLE = 1
+HORIZONTAL_PALETTE = 0
+VERTICAL_PALETTE = 1
+BLACK = -9999
+WHITE = -9998
+
+#
+# Block-style definitions
+#
+BASIC_STYLE_HEAD = ['start', 'hat1', 'hat2', 'restore', 'restoreall']
+BASIC_STYLE_HEAD_1ARG = ['hat']
+BASIC_STYLE_TAIL = ['stopstack', 'empty']
+BASIC_STYLE = ['clean', 'penup', 'pendown', 'stack1', 'stack2', 'vspace',
+ 'hideblocks', 'showblocks', 'clearheap', 'printheap', 'kbinput',
+ 'fullscreen', 'sandwichcollapsed', 'cartesian', 'polar', 'startfill',
+ 'stopfill']
+BASIC_STYLE_EXTENDED = ['picturelist', 'picture1x1', 'picture2x2',
+ 'picture2x1', 'picture1x2', 'picture1x1a']
+BASIC_STYLE_1ARG = ['forward', 'back', 'left', 'right', 'seth', 'show', 'image',
+ 'setscale', 'setpensize', 'setcolor', 'setshade', 'print', 'showaligned',
+ 'settextsize', 'settextcolor', 'print', 'wait', 'storeinbox1', 'savepix',
+ 'storeinbox2', 'wait', 'stack', 'push', 'nop', 'addturtle', 'comment',
+ 'savesvg', 'setgray']
+BASIC_STYLE_VAR_ARG = ['userdefined', 'userdefined2args', 'userdefined3args']
+BULLET_STYLE = ['templatelist', 'list']
+BASIC_STYLE_2ARG = ['arc', 'setxy', 'fillscreen', 'storein', 'write']
+BOX_STYLE = ['number', 'xcor', 'ycor', 'heading', 'pensize', 'color', 'shade',
+ 'textcolor', 'textsize', 'box1', 'box2', 'string', 'leftpos', 'scale',
+ 'toppos', 'rightpos', 'bottompos', 'width', 'height', 'pop', 'keyboard',
+ 'red', 'orange', 'yellow', 'green', 'cyan', 'blue', 'purple', 'white',
+ 'black', 'titlex', 'titley', 'leftx', 'topy', 'rightx', 'bottomy',
+ 'volume', 'pitch', 'voltage', 'resistance', 'gray']
+BOX_STYLE_MEDIA = ['description', 'audio', 'journal']
+NUMBER_STYLE = ['plus2', 'product2', 'myfunc']
+NUMBER_STYLE_VAR_ARG = ['myfunc1arg', 'myfunc2arg', 'myfunc3arg']
+NUMBER_STYLE_BLOCK = ['random']
+NUMBER_STYLE_PORCH = ['minus2', 'division2', 'remainder2']
+NUMBER_STYLE_1ARG = ['sqrt', 'identity2']
+NUMBER_STYLE_1STRARG = ['box']
+COMPARE_STYLE = ['greater2', 'less2', 'equal2']
+BOOLEAN_STYLE = ['and2', 'or2']
+NOT_STYLE = ['not']
+FLOW_STYLE = ['forever']
+FLOW_STYLE_TAIL = ['hspace']
+FLOW_STYLE_1ARG = ['repeat']
+FLOW_STYLE_BOOLEAN = ['if', 'while', 'until']
+FLOW_STYLE_WHILE = ['while2']
+FLOW_STYLE_ELSE = ['ifelse']
+COLLAPSIBLE_TOP = ['sandwichtop']
+COLLAPSIBLE_TOP_NO_ARM = ['sandwichtop2']
+COLLAPSIBLE_BOTTOM = ['sandwichbottom']
+
+# Depreciated block styles
+PORTFOLIO_STYLE_2x2 = ['template2x2']
+PORTFOLIO_STYLE_1x1 = ['template1x1', 'template1x1a']
+PORTFOLIO_STYLE_2x1 = ['template2x1']
+PORTFOLIO_STYLE_1x2 = ['template1x2']
+
+#
+# Blocks that are expandable
+#
+EXPANDABLE = ['vspace', 'hspace', 'templatelist', 'list', 'identity2',
+ 'myfunc1arg', 'myfunc2arg', 'myfunc3arg', 'userdefined',
+ 'userdefined2args', 'userdefined3args']
+
+#
+# Blocks that are 'collapsible'
+#
+COLLAPSIBLE = ['sandwichbottom', 'sandwichcollapsed']
+
+#
+# Depreciated block styles that need dock adjustments
+#
+OLD_DOCK = ['and', 'or', 'plus', 'minus', 'division', 'product', 'remainder']
+
+#
+# Blocks that contain media
+#
+CONTENT_BLOCKS = ['number', 'string', 'description', 'audio', 'journal']
+
+#
+# These blocks get a special skin
+#
+BLOCKS_WITH_SKIN = ['journal', 'audio', 'description', 'nop', 'userdefined',
+ 'userdefined2args', 'userdefined3args']
+
+PYTHON_SKIN = ['nop', 'userdefined', 'userdefined2args', 'userdefined3args']
+
+#
+# Block-name dictionary used for labels
+#
+BLOCK_NAMES = {
+ 'addturtle':[_('turtle')],
+ 'and2':[_('and')],
+ 'arc':[_('arc'), _('angle'), _('radius')],
+ 'audio':[' '],
+ 'back':[_('back')],
+ 'black':[_('black')],
+ 'blue':[_('blue')+' = 70'],
+ 'bottompos':[_('bottom')],
+ 'bottomy':[_('picture bottom')],
+ 'box':[_('box')],
+ 'box1':[_('box 1')],
+ 'box2':[_('box 2')],
+ 'cartesian':[_('Cartesian')],
+ 'clean':[_(' clean ')],
+ 'clearheap':[_('empty heap')],
+ 'color':[_('color')],
+ 'comment':[_('comment')],
+ 'cyan':[_('cyan')+' = 50'],
+ 'decription':[' '],
+ 'division2':['/'],
+ 'empty':[_('empty trash')],
+ 'equal2':['='],
+ 'fillscreen':[_('fill screen'), _('color'), _('shade')],
+ 'forever':[_('forever')],
+ 'forward':[_('forward')],
+ 'fullscreen':[_('full screen')],
+ 'gray':[_('gray')],
+ 'greater2':[">"],
+ 'green':[_('green')+' = 30'],
+ 'hat':[_('action')],
+ 'hat1':[_('action 1')],
+ 'hat2':[_('action 2')],
+ 'heading':[_('heading')],
+ 'height':[_('height')],
+ 'hideblocks':[_('hide blocks')],
+ 'hspace':[' '],
+ 'identity2':['←'],
+ 'if':[' ', _('if'), _('then')],
+ 'ifelse':[' ', _('if'), _('then else')],
+ 'image':[_('show')],
+ 'journal':[' '],
+ 'kbinput':[_('query keyboard')],
+ 'keyboard':[_('keyboard')],
+ 'left':[_('left')],
+ 'leftpos':[_('left')],
+ 'leftx':[_('picture left')],
+ 'less2':['<'],
+ 'list':['list'],
+ 'minus2':['–'],
+ 'myfunc':[_('Python'), 'f(x)', 'x'],
+ 'myfunc1arg':[_('Python'), 'f(x)', 'x'],
+ 'myfunc2arg':[_('Python'), 'f(x,y)', ' '],
+ 'myfunc3arg':[_('Python'), 'f(x,y,z)', ' '],
+ 'nop':[_(' ')],
+ 'not':[_('not')],
+ 'number':['100'],
+ 'orange':[_('orange')+' = 10'],
+ 'or2':[_('or')],
+ 'pendown':[_('pen down')],
+ 'pensize':[_('pen size')],
+ 'penup':[_('pen up')],
+ 'picturelist':[' '],
+ 'picture1x1':[' '],
+ 'picture1x1a':[' '],
+ 'picture2x2':[' '],
+ 'picture2x1':[' '],
+ 'picture1x2':[' '],
+ 'pitch':[_('pitch')],
+ 'plus2':['+'],
+ 'polar':[_('polar')],
+ 'pop':[_('pop')],
+ 'printheap':[_('show heap')],
+ 'print':[_('print')],
+ 'product2':['×'],
+ 'purple':[_('purple')+' = 90'],
+ 'push':[_('push')],
+ 'random':[_('random'), _('min'), _('max')],
+ 'red':[_('red')+' = 0'],
+ 'remainder2':[_('mod')],
+ 'repeat':[' ',_('repeat')],
+ 'resistance':[_('resistance')],
+ 'restore':[_('restore last')],
+ 'restoreall':[_('restore all')],
+ 'right':[_('right')],
+ 'rightpos':[_('right')],
+ 'rightx':[_('picture right')],
+ 'savepix':[_('save picture')],
+ 'savesvg':[_('save SVG')],
+ 'sandwichbottom':[' '],
+ 'sandwichcollapsed':[_('click to open')],
+ 'sandwichtop':[_('top of stack')],
+ 'sandwichtop2':[_('top of stack')],
+ 'scale':[_('scale')],
+ 'setcolor':[_('set color')],
+ 'setgray':[_('set gray')],
+ 'seth':[_('set heading')],
+ 'setpensize':[_('set pen size')],
+ 'setscale':[_('set scale')],
+ 'setshade':[_('set shade')],
+ 'settextcolor':[_('set text color')],
+ 'settextsize':[_('set text size')],
+ 'setxy':[_('set xy'), _('x'), _('y')],
+ 'shade':[_('shade')],
+ 'show':[_('show')],
+ 'showblocks':[_('show blocks')],
+ 'showaligned':[_('show aligned')],
+ 'sqrt':['√'],
+ 'stack':[_('action')],
+ 'stack1':[_('action 1')],
+ 'stack2':[_('action 2')],
+ 'start':[_('start')],
+ 'startfill':[_('start fill')],
+ 'stopfill':[_('end fill')],
+ 'stopstack':[_('stop action')],
+ 'storein':[_('store in'), _('box'), _('value')],
+ 'storeinbox1':[_('store in box 1')],
+ 'storeinbox2':[_('store in box 2')],
+ 'string':[_('text')],
+ 'template1x1':[' '],
+ 'template1x1a':[' '],
+ 'template1x2':[' '],
+ 'template2x1':[' '],
+ 'template2x2':[' '],
+ 'templatelist':[' '],
+ 'textsize':[_('text size')],
+ 'titlex':[_('title x')],
+ 'titley':[_('title y')],
+ 'toppos':[_('top')],
+ 'topy':[_('picture top')],
+ 'turtle':[_('turtle')],
+ 'until':[_('until')],
+ 'userdefined':[_(' ')],
+ 'userdefined2args':[_(' ')],
+ 'userdefined3args':[_(' ')],
+ 'voltage':[_('voltage')],
+ 'volume':[_('volume')],
+ 'vspace':[' '],
+ 'wait':[_('wait')],
+ 'while':[_('while')],
+ 'while2':[_('while')],
+ 'white':[_('white')],
+ 'width':[_('width')],
+ 'write':[_('write')],
+ 'xcor':[_('xcor')],
+ 'ycor':[_('ycor')],
+ 'yellow':[_('yellow')+' = 20']}
+
+#
+# Logo primitives
+#
+
+PRIMITIVES = {
+ 'addturtle':'turtle',
+ 'and2':'and',
+ 'arc':'arc',
+ 'back':'back',
+ 'black':'black',
+ 'blue':'blue',
+ 'bottompos':'bpos',
+ 'bottomy':'boty',
+ 'box1':'box1',
+ 'box2':'box2',
+ 'box':'box',
+ 'cartesian':'cartesian',
+ 'clean':'clean',
+ 'clearheap':'clearheap',
+ 'color':'color',
+ 'comment':'comment',
+ 'cyan':'cyan',
+ 'division2':'division',
+ 'equal2':'equal?',
+ 'fillscreen':'fillscreen',
+ 'forever':'forever',
+ 'forward':'forward',
+ 'fullscreen':'fullscreen',
+ 'gray':'gray',
+ 'greater2':'greater?',
+ 'green':'green',
+ 'hat':'nop3',
+ 'hat1':'nop1',
+ 'hat2':'nop2',
+ 'heading':'heading',
+ 'height':'vres',
+ 'hideblocks':'hideblocks',
+ 'hspace':'nop',
+ 'identity2':'id',
+ 'if':'if',
+ 'ifelse':'ifelse',
+ 'image':'show',
+ 'kbinput':'kbinput',
+ 'keyboard':'keyboard',
+ 'left':'left',
+ 'leftpos':'lpos',
+ 'leftx':'leftx',
+ 'less2':'less?',
+ 'list':'bulletlist',
+ 'minus2':'minus',
+ 'myfunc':'myfunction',
+ 'myfunc1arg':'myfunction',
+ 'myfunc2arg':'myfunction2',
+ 'myfunc3arg':'myfunction3',
+ 'nop':'userdefined',
+ 'not':'not',
+ 'orange':'orange',
+ 'or2':'or',
+ 'pendown':'pendown',
+ 'pensize':'pensize',
+ 'penup':'penup',
+ 'pitch':'pitch',
+ 'plus2':'plus',
+ 'polar':'polar',
+ 'pop':'pop',
+ 'printheap':'printheap',
+ 'print':'print',
+ 'product2':'product',
+ 'purple':'purple',
+ 'push':'push',
+ 'random':'random',
+ 'red':'red',
+ 'remainder2':'mod',
+ 'repeat':'repeat',
+ 'resistance':'resistance',
+ 'right':'right',
+ 'rightpos':'rpos',
+ 'rightx':'rightx',
+ 'sandwichtop':'comment',
+ 'sandwichtop2':'comment',
+ 'sandwichbottom':'nop',
+ 'sandwichcollapsed':'nop',
+ 'savepix':'savepix',
+ 'savesvg':'savesvg',
+ 'scale':'scale',
+ 'setcolor':'setcolor',
+ 'setgray':'setgray',
+ 'seth':'seth',
+ 'setpensize':'setpensize',
+ 'setscale':'setscale',
+ 'setshade':'setshade',
+ 'settextsize':'settextsize',
+ 'settextcolor':'settextcolor',
+ 'setxy':'setxy',
+ 'shade':'shade',
+ 'show':'show',
+ 'showblocks':'showblocks',
+ 'showaligned':'showaligned',
+ 'sqrt':'sqrt',
+ 'stack':'stack',
+ 'stack1':'stack1',
+ 'stack2':'stack2',
+ 'start':'start',
+ 'startfill':'startfill',
+ 'stopfill':'stopfill',
+ 'stopstack':'stopstack',
+ 'storein':'storeinbox',
+ 'storeinbox1':'storeinbox1',
+ 'storeinbox2':'storeinbox2',
+ 'template1x1':'t1x1',
+ 'template1x1a':'t1x1a',
+ 'template1x2':'t1x2',
+ 'template2x1':'t2x1',
+ 'template2x2':'t2x2',
+ 'templatelist':'bullet',
+ 'textsize':'textsize',
+ 'titlex':'titlex',
+ 'titley':'titley',
+ 'toppos':'tpos',
+ 'topy':'topy',
+ 'userdefined':'userdefined',
+ 'userdefined2args':'userdefined2',
+ 'userdefined3args':'userdefined3',
+ 'voltage':'voltage',
+ 'volume':'volume',
+ 'vspace':'nop',
+ 'wait':'wait',
+ 'while2':'while',
+ 'white':'white',
+ 'width':'hres',
+ 'write':'write',
+ 'xcor':'xcor',
+ 'ycor':'ycor',
+ 'yellow':'yellow'}
+
+#
+# block default values
+#
+
+DEFAULTS = {
+ 'addturtle':[1],
+ 'arc':[90, 100],
+ 'audio':[None],
+ 'back':[100],
+ 'box':[_('my box')],
+ 'comment':[_('comment')],
+ 'description':[None],
+ 'fillscreen':[60, 80],
+ 'forever':[None, 'vspace'],
+ 'forward':[100],
+ 'hat':[_('action')],
+ 'if':[None, None, 'vspace'],
+ 'ifelse':[None, 'vspace', None, 'vspace'],
+ 'journal':[None],
+ 'left':[90],
+ 'list':['∙ ', '∙ '],
+ 'media':[None],
+ 'myfunc':['x', 100],
+ 'myfunc1arg':['x', 100],
+ 'myfunc2arg':['x+y', 100, 100],
+ 'myfunc3arg':['x+y+z', 100, 100, 100],
+ 'nop':[100],
+ 'number':[100],
+ 'random':[0, 100],
+ 'repeat':[4, None, 'vspace'],
+ 'right':[90],
+ 'sandwichtop':[_('label')],
+ 'sandwichtop2':[_('label')],
+ 'savepix':[_('picture name')],
+ 'savesvg':[_('picture name')],
+ 'setcolor':[0],
+ 'setgray':[100],
+ 'seth':[0],
+ 'setpensize':[5],
+ 'setscale':[33],
+ 'setshade':[50],
+ 'settextsize':[48],
+ 'settextcolor':[0],
+ 'setxy':[0, 0],
+ 'show':[_('text')],
+ 'showaligned':[_('text')],
+ 'stack':[_('action')],
+ 'storeinbox1':[100],
+ 'storeinbox2':[100],
+ 'storein':[_('my box'), 100],
+ 'string':[_('text')],
+ 'template1x1':[_('Title'), 'None'],
+ 'template1x1a':[_('Title'), 'None'],
+ 'template1x2':[_('Title'), 'None', 'None'],
+ 'template2x1':[_('Title'), 'None', 'None'],
+ 'template2x2':[_('Title'), 'None', 'None', 'None', 'None'],
+ 'templatelist':[_('Title'), '∙ '],
+ 'userdefined':[100],
+ 'userdefined2args':[100,100],
+ 'userdefined3args':[100,100,100],
+ 'wait':[1],
+ 'write':[_('text'), 32]}
+
+#
+# Blocks that can interchange strings and numbers for their arguments
+#
+STRING_OR_NUMBER_ARGS = ['plus2', 'equal2', 'less2', 'greater2', 'box',
+ 'template1x1', 'template1x2', 'template2x1', 'list',
+ 'template2x2', 'template1x1a', 'templatelist', 'nop',
+ 'print', 'stack', 'hat', 'addturtle', 'myfunc',
+ 'myfunc1arg', 'myfunc2arg', 'myfunc3arg', 'comment',
+ 'sandwichtop', 'sandwichtop2', 'userdefined',
+ 'userdefined2args', 'userdefined3args', 'storein']
+
+CONTENT_ARGS = ['show', 'showaligned', 'push', 'storein', 'storeinbox1',
+ 'storeinbox2']
+
+#
+# Status blocks
+#
+
+MEDIA_SHAPES = ['audiooff', 'audioon', 'audiosmall',
+ 'journaloff', 'journalon', 'journalsmall',
+ 'descriptionoff', 'descriptionon', 'descriptionsmall',
+ 'pythonoff', 'pythonon', 'pythonsmall',
+ 'list', '1x1', '1x1a', '2x1', '1x2', '2x2']
+
+OVERLAY_SHAPES = ['Cartesian', 'Cartesian_labeled', 'polar']
+
+STATUS_SHAPES = ['status', 'info', 'nostack', 'noinput', 'emptyheap',
+ 'emptybox', 'nomedia', 'nocode', 'overflowerror', 'negroot',
+ 'syntaxerror', 'nofile', 'nojournal', 'zerodivide']
+
+#
+# Emulate Sugar toolbar when running from outside of Sugar
+#
+TOOLBAR_SHAPES = ['hideshowoff', 'eraseron', 'run-fastoff',
+ 'run-slowoff', 'debugoff', 'stopiton']
+
+#
+# Legacy names
+#
+OLD_NAMES = {'product':'product2', 'storeinbox':'storein', 'minus':'minus2',
+ 'division':'division2', 'plus':'plus2', 'and':'and2', 'or':'or2',
+ 'less':'less2', 'greater':'greater2', 'equal':'equal2',
+ 'remainder':'remainder2', 'identity':'identity2',
+ 'division':'division2', 'audiooff':'audio', 'endfill':'stopfill',
+ 'descriptionoff':'description','template3':'templatelist',
+ 'template1':'template1x1', 'template2':'template2x1',
+ 'template6':'template1x2', 'template7':'template2x2',
+ 'template4':'template1x1a', 'hres':'width', 'vres':'height' }
+
+#
+# Define the relative size and postion of media objects
+# (w, h, x, y, dx, dy)
+#
+TITLEXY = (0.9375, 0.875)
+
+#
+# Relative placement of portfolio objects (used by depreciated blocks)
+#
+TEMPLATES = {'t1x1': (0.5, 0.5, 0.0625, 0.125, 1.05, 0),
+ 't2z1': (0.5, 0.5, 0.0625, 0.125, 1.05, 1.05),
+ 't1x2': (0.45, 0.45, 0.0625, 0.125, 1.05, 1.05),
+ 't2x2': (0.45, 0.45, 0.0625, 0.125, 1.05, 1.05),
+ 't1x1a': (0.9, 0.9, 0.0625, 0.125, 0, 0),
+ 'bullet': (1, 1, 0.0625, 0.125, 0, 0.1),
+ 'insertimage': (0.333, 0.333)}
+
+#
+# Names for blocks without names for popup help
+#
+SPECIAL_NAMES = {
+ 'audio':_('audio'),
+ 'division2':_('divide'),
+ 'equal2':_('equal'),
+ 'greater2':_('greater than'),
+ 'hspace':_('horizontal space'),
+ 'identity2':_('identity'),
+ 'if':_('if then'),
+ 'ifelse':_('if then else'),
+ 'journal':_('journal'),
+ 'less2':_('less than'),
+ 'minus2':_('minus'),
+ 'nop':_('Python code'),
+ 'number':_('number'),
+ 'plus2':_('plus'),
+ 'product2':_('multiply'),
+ 'sqrt':_('square root'),
+ 'template1x1':_('presentation 1x1'),
+ 'template1x1a':_('presentation 1x1'),
+ 'template1x2':_('presentation 1x2'),
+ 'template2x1':_('presentation 2x1'),
+ 'template2x2':_('presentation 2x2'),
+ 'templatelist':_('presentation bulleted list'),
+ 'textsize':_('text size'),
+ 'vspace':_('vertical space')}
+
+#
+# Help messages
+#
+HELP_STRINGS = {
+ 'addturtle':_("chooses which turtle to command"),
+ 'and2':_("logical AND operator"),
+ 'arc':_("moves turtle along an arc"),
+ 'audio':_("Sugar Journal audio object"),
+ 'back':_("moves turtle backward"),
+ 'blocks':_("Palette of variable blocks"),
+ 'bottompos':_("ycor of bottom of screen"),
+ 'box1':_("Variable 1 (numeric value)"),
+ 'box2':_("Variable 2 (numeric value)"),
+ 'box':_("named variable (numeric value)"),
+ 'cartesian':_("displays Cartesian coordinates"),
+ 'clean':_("clears the screen and reset the turtle"),
+ 'clearheap':_("emptys FILO (first-in-last-out heap)"),
+ 'color':_("holds current pen color (can be used in place of a number block)"),
+ 'colors':_("Palette of pen colors"),
+ 'comment':_("places a comment in your code"),
+ 'debugoff':_("Debug"),
+ 'description':_("Sugar Journal description field"),
+ 'division2':_("divides top numeric input (numerator) by bottom numeric input (denominator)"),
+ 'empty':_("permanently deletes items in trash"),
+ 'eraseron':_("Clean"),
+ 'equal2':_("logical equal-to operator"),
+ 'extras':_("Palette of extra options"),
+ 'fillscreen':_("fills the background with (color, shade)"),
+ 'flow':_("Palette of flow operators"),
+ 'forever':_("loops forever"),
+ 'forward':_("moves turtle forward"),
+ 'fullscreen':_("hides the Sugar toolbars"),
+ 'gray':_("holds current gray level (can be used in place of a number block)"),
+ 'greater2':_("logical greater-than operator"),
+ 'hat1':_("top of Action 1 stack"),
+ 'hat2':_("top of Action 2 stack"),
+ 'hat':_("top of nameable action stack"),
+ 'heading':_("holds current heading value of the turtle (can be used in place of a number block)"),
+ 'height':_("the canvas height"),
+ 'hideblocks':_("declutters canvas by hiding blocks"),
+ 'hideshowoff':_("Hide blocks"),
+ 'hspace':_("jogs stack right"),
+ 'identity2':_("identity operator used for extending blocks"),
+ 'ifelse':_("if-then-else operator that uses boolean operators from Numbers palette"),
+ 'if':_("if-then operator that uses boolean operators from Numbers palette"),
+ 'journal':_("Sugar Journal media object"),
+ 'kbinput':_("query for keyboard input (results stored in keyboard block)"),
+ 'keyboard':_("holds results of query-keyboard block"),
+ 'leftpos':_("xcor of left of screen"),
+ 'left':_("turns turtle counterclockwise (angle in degrees)"),
+ 'less2':_("logical less-than operator"),
+ 'minus2':_("subtracts bottom numeric input from top numeric input"),
+ 'myfunc':_("a programmable block: used to add advanced math equations, e.g., sin(x)"),
+ 'myfunc1arg':_("a programmable block: used to add advanced single-variable math equations, e.g., sin(x)"),
+ 'myfunc2arg':_("a programmable block: used to add advanced multi-variable math equations, e.g., sqrt(x*x+y*y)"),
+ 'myfunc3arg':_("a programmable block: used to add advanced multi-variable math equations, e.g., sin(x+y+z)"),
+ 'next':_('displays next palette'),
+ 'nop':_("runs code found in the tamyblock.py module found in the Journal"),
+ 'not':_("logical NOT operator"),
+ 'numbers':_("Palette of numeric operators"),
+ 'number':_("used as numeric input in mathematic operators"),
+ 'or':_("logical OR operator"),
+ 'orientation':_("changes the orientation of the palette of blocks"),
+ 'pendown':_("Turtle will draw when moved."),
+ 'pen':_("Palette of pen commands"),
+ 'pensize':_("holds current pen size (can be used in place of a number block)"),
+ 'penup':_("Turtle will not draw when moved."),
+ 'picture1x1':_("presentation template: select Journal object (with description)"),
+ 'picture1x1a':_("presentation template: select Journal object (no description)"),
+ 'picture1x2':_("presentation template: select two Journal objects"),
+ 'picture2x1':_("presentation template: select two Journal objects"),
+ 'picture2x2':_("presentation template: select four Journal objects"),
+ 'picturelist':_("presentation template: list of bullets"),
+ 'pitch':_('microphone input pitch'),
+ 'plus2':_("adds two alphanumeric inputs"),
+ 'polar':_("displays polar coordinates"),
+ 'pop':_("pops value off FILO (first-in last-out heap)"),
+ 'portfolio':_("Palette of presentation templates"),
+ 'print':_("prints value in status block at bottom of the screen"),
+ 'printheap':_("shows values in FILO (first-in last-out heap)"),
+ 'product2':_("multiplies two numeric inputs"),
+ 'push':_("pushes value onto FILO (first-in last-out heap)"),
+ 'random':_("returns random number between minimum (top) and maximum (bottom) values"),
+ 'remainder2':_("modular (remainder) operator"),
+ 'repeat':_("loops specified number of times"),
+ 'resistance':_("sensor input resistance"),
+ 'restore':_("restores most recent blocks from trash"),
+ 'restoreall':_("restore all blocks from trash"),
+ 'rightpos':_("xcor of right of screen"),
+ 'right':_("turns turtle clockwise (angle in degrees)"),
+ 'run-fastoff':_("Run"),
+ 'run-slowoff':_("Step"),
+ 'sandwichbottom':_("bottom block in a collapsibe stack: click to collapse"),
+ 'sandwichcollapsed':_("bottom block in a collapsed stack: click to open"),
+ 'sandwichtop':_("top of a collapsible stack"),
+ 'sandwichtop2':_("top of a collapsed stack"),
+ 'savepix':_("saves a picture to the Sugar Journal"),
+ 'savesvg':_("saves turtle graphics as an SVG file in the Sugar Journal"),
+ 'scale':_("holds current scale value"),
+ 'setcolor':_("sets color of the line drawn by the turtle"),
+ 'setgray':_("sets gray level of the line drawn by the turtle"),
+ 'seth':_("sets the heading of the turtle (0 is towards the top of the screen.)"),
+ 'setpensize':_("sets size of the line drawn by the turtle"),
+ 'setscale':_("sets the scale of media"),
+ 'setshade':_("sets shade of the line drawn by the turtle"),
+ 'settextcolor':_("sets color of text drawn by the turtle"),
+ 'settextsize':_("sets size of text drawn by turtle"),
+ 'setxy':_("moves turtle to position xcor, ycor; (0, 0) is in the center of the screen."),
+ 'shade':_("holds current pen shade"),
+ 'show':_("draws text or show media from the Journal"),
+ 'showblocks':_("restores hidden blocks"),
+ 'sqrt':_("calculates square root"),
+ 'stack1':_("invokes Action 1 stack"),
+ 'stack2':_("invokes Action 2 stack"),
+ 'stack':_("invokes named action stack"),
+ 'start':_("connects action to toolbar run buttons"),
+ 'startfill':_("starts filled polygon (used with end fill block)"),
+ 'stopfill':_("completes filled polygon (used with start fill block)"),
+ 'stopiton':_("Stop turtle"),
+ 'stopstack':_("stops current action"),
+ 'storeinbox1':_("stores numeric value in Variable 1"),
+ 'storeinbox2':_("stores numeric value in Variable 2"),
+ 'storein':_("stores numeric value in named variable"),
+ 'string':_("string value"),
+ 'template1x1':_("presentation template: select Journal object (with description)"),
+ 'template1x1a':_("presentation template: select Journal object (no description)"),
+ 'template1x2':_("presentation template: select two Journal objects"),
+ 'template2x1':_("presentation template: select two Journal objects"),
+ 'template2x2':_("presentation template: select four Journal objects"),
+ 'templatelist':_("presentation template: list of bullets"),
+ 'textcolor':_("holds current text color (can be used in place of a number block)"),
+ 'textsize':_("holds current text size (can be used in place of a number block)"),
+ 'toppos':_("ycor of top of screen"),
+ 'trash':_("Trashcan"),
+ 'turtle':_("Palette of turtle commands"),
+ 'until':_("do-until-True operator that uses boolean operators from Numbers palette"),
+ 'userdefined':_("runs code found in the tamyblock.py module found in the Journal"),
+ 'userdefined2args':_("runs code found in the tamyblock.py module found in the Journal"),
+ 'userdefined3args':_("runs code found in the tamyblock.py module found in the Journal"),
+ 'voltage':_("sensor voltage"),
+ 'volume':_("microphone input volume"),
+ 'vspace':_("jogs stack down"),
+ 'wait':_("pauses program execution a specified number of seconds"),
+ 'while':_("do-while-True operator that uses boolean operators from Numbers palette"),
+ 'width':_("the canvas width"),
+ 'xcor':_("holds current x-coordinate value of the turtle (can be used in place of a number block)"),
+ 'ycor':_("holds current y-coordinate value of the turtle (can be used in place of a number block)")}
+
+#
+# 'dead key' Unicode dictionaries
+#
+
+DEAD_KEYS = ['grave','acute','circumflex','tilde','diaeresis','abovering']
+DEAD_DICTS = [{'A':192,'E':200,'I':204,'O':210,'U':217,'a':224,'e':232,'i':236,
+ 'o':242,'u':249},
+ {'A':193,'E':201,'I':205,'O':211,'U':218,'a':225,'e':233,'i':237,
+ 'o':243,'u':250},
+ {'A':194,'E':202,'I':206,'O':212,'U':219,'a':226,'e':234,
+ 'i':238,'o':244,'u':251},
+ {'A':195,'O':211,'N':209,'U':360,'a':227,'o':245,'n':241,'u':361},
+ {'A':196,'E':203,'I':207,'O':211,'U':218,'a':228,'e':235,
+ 'i':239,'o':245,'u':252},
+ {'A':197,'a':229}]
+NOISE_KEYS = ['Shift_L', 'Shift_R', 'Control_L', 'Caps_Lock', 'Pause',
+ 'Alt_L', 'Alt_R', 'KP_Enter', 'ISO_Level3_Shift', 'KP_Divide',
+ 'Escape', 'Return', 'KP_Page_Up', 'Up', 'Down', 'Menu',
+ 'Left', 'Right', 'KP_Home', 'KP_End', 'KP_Up', 'Super_L',
+ 'KP_Down', 'KP_Left', 'KP_Right', 'KP_Page_Down', 'Scroll_Lock',
+ 'Page_Down', 'Page_Up']
+WHITE_SPACE = ['space','Tab']
+
+CURSOR = '█'
+RETURN = '⏎'
+
+
+#
+# Macros (groups of blocks)
+#
+MACROS = {
+ 'until':
+ [[0, 'forever', 0, 0, [None, 2, 1]],
+ [1, 'vspace', 0, 0, [0, None]],
+ [2, 'ifelse', 0, 0, [0, None, 3, None, None]],
+ [3, 'vspace', 0, 0, [2, 4]],
+ [4, 'stopstack', 0, 0, [3, None]]],
+ 'while':
+ [[0, 'forever', 0, 0, [None, 2, 1]],
+ [1, 'vspace', 0, 0, [0, None]],
+ [2, 'ifelse', 0, 0, [0, None, 3, 4, None]],
+ [3, 'vspace', 0, 0, [2, None]],
+ [4, 'stopstack', 0, 0, [2, None]]],
+ 'kbinput':
+ [[0, 'forever', 0, 0, [None, 1, None]],
+ [1, 'kbinput', 0, 0, [0, 2]],
+ [2, 'vspace', 0, 0, [1, 3]],
+ [3, 'if', 0, 0, [2, 4, 7, 8]],
+ [4, 'greater2', 0, 0, [3, 5, 6, None]],
+ [5, 'keyboard', 0, 0, [4, None]],
+ [6, ['number', '0'], 0, 0, [4, None]],
+ [7, 'stopstack', 0, 0, [3, None]],
+ [8, 'vspace', 0, 0, [3, 9]],
+ [9, 'wait', 0, 0, [8, 10, None]],
+ [10, ['number', '1'], 0, 0, [9, None]]],
+ 'picturelist':
+ [[0, 'sandwichtop', 0, 0, [None, 1, 2]],
+ [1, ['string', _('bulleted list')], 0, 0, [0, None]],
+ [2, 'setxy', 0, 0, [0, 3, 4, 5]],
+ [3, 'titlex', 0, 0, [2, None]],
+ [4, 'titley', 0, 0, [2, None]],
+ [5, 'setscale', 0, 0, [2, 6, 7]],
+ [6, ['number', '100'], 0, 0, [5, None]],
+ [7, 'show', 0, 0, [5, 8, 9]],
+ [8, ['string',_('Title')], 0, 0, [7, None]],
+ [9, 'setxy', 0, 0, [7, 10, 11, 12]],
+ [10, 'leftx', 0, 0, [9, None]],
+ [11, 'topy', 0, 0, [9, None]],
+ [12, 'setscale', 0, 0, [9, 13, 14]],
+ [13, ['number', '67'], 0, 0, [12, None]],
+ [14, 'list', 0, 0, [12, 15, 16, 17]],
+ [15, ['string','∙ '], 0, 0, [14, None]],
+ [16, ['string','∙ '], 0, 0, [14, None]],
+ [17, 'sandwichbottom', 0, 0, [14, None]]],
+ 'picture1x1a':
+ [[0, 'sandwichtop', 0, 0, [None, 1, 2]],
+ [1, ['string', _('picture')], 0, 0, [0, None]],
+ [2, 'setxy', 0, 0, [0, 3, 4, 5]],
+ [3, 'titlex', 0, 0, [2, None]],
+ [4, 'titley', 0, 0, [2, None]],
+ [5, 'setscale', 0, 0, [2, 6, 7]],
+ [6, ['number', '100'], 0, 0, [5, None]],
+ [7, 'show', 0, 0, [5, 8, 9]],
+ [8, ['string',_('Title')], 0, 0, [7, None]],
+ [9, 'setscale', 0, 0, [7, 10, 11]],
+ [10, ['number', '90'], 0, 0, [9, None]],
+ [11, 'setxy', 0, 0, [9, 12, 13, 14]],
+ [12, 'leftx', 0, 0, [11, None]],
+ [13, 'topy', 0, 0, [11, None]],
+ [14, 'showaligned', 0, 0, [11, 15, 16]],
+ [15, 'journal', 0, 0, [14, None]],
+ [16, 'sandwichbottom', 0, 0, [14, None]]],
+ 'picture2x2':
+ [[0, 'sandwichtop', 0, 0, [None, 1, 2]],
+ [1, ['string', _('2×2 pictures')], 0, 0, [0, None]],
+ [2, 'setxy', 0, 0, [0, 3, 4, 5]],
+ [3, 'titlex', 0, 0, [2, None]],
+ [4, 'titley', 0, 0, [2, None]],
+ [5, 'setscale', 0, 0, [2, 6, 7]],
+ [6, ['number', '100'], 0, 0, [5, None]],
+ [7, 'show', 0, 0, [5, 8, 9]],
+ [8, ['string',_('Title')], 0, 0, [7, None]],
+ [9, 'setscale', 0, 0, [7, 10, 11]],
+ [10, ['number', '35'], 0, 0, [9, None]],
+ [11, 'setxy', 0, 0, [9, 12, 13, 14]],
+ [12, 'leftx', 0, 0, [11, None]],
+ [13, 'topy', 0, 0, [11, None]],
+ [14, 'showaligned', 0, 0, [11, 15, 16]],
+ [15, 'journal', 0, 0, [14, None]],
+ [16, 'setxy', 0, 0, [14, 17, 18, 19]],
+ [17, 'rightx', 0, 0, [16, None]],
+ [18, 'topy', 0, 0, [16, None]],
+ [19, 'showaligned', 0, 0, [16, 20, 21]],
+ [20, 'journal', 0, 0, [19, None]],
+ [21, 'setxy', 0, 0, [19, 22, 23, 24]],
+ [22, 'leftx', 0, 0, [21, None]],
+ [23, 'bottomy', 0, 0, [21, None]],
+ [24, 'showaligned', 0, 0, [21, 25, 26]],
+ [25, 'journal', 0, 0, [24, None]],
+ [26, 'setxy', 0, 0, [24, 27, 28, 29]],
+ [27, 'rightx', 0, 0, [26, None]],
+ [28, 'bottomy', 0, 0, [26, None]],
+ [29, 'showaligned', 0, 0, [26, 30, 31]],
+ [30, 'journal', 0, 0, [29, None]],
+ [31, 'sandwichbottom', 0, 0, [29, None]]],
+ 'picture2x1':
+ [[0, 'sandwichtop', 0, 0, [None, 1, 2]],
+ [1, ['string', _('2×1 pictures')], 0, 0, [0, None]],
+ [2, 'setxy', 0, 0, [0, 3, 4, 5]],
+ [3, 'titlex', 0, 0, [2, None]],
+ [4, 'titley', 0, 0, [2, None]],
+ [5, 'setscale', 0, 0, [2, 6, 7]],
+ [6, ['number', '100'], 0, 0, [5, None]],
+ [7, 'show', 0, 0, [5, 8, 9]],
+ [8, ['string',_('Title')], 0, 0, [7, None]],
+ [9, 'setscale', 0, 0, [7, 10, 11]],
+ [10, ['number', '35'], 0, 0, [9, None]],
+ [11, 'setxy', 0, 0, [9, 12, 13, 14]],
+ [12, 'leftx', 0, 0, [11, None]],
+ [13, 'topy', 0, 0, [11, None]],
+ [14, 'showaligned', 0, 0, [11, 15, 16]],
+ [15, 'journal', 0, 0, [14, None]],
+ [16, 'setxy', 0, 0, [14, 17, 18, 19]],
+ [17, 'leftx', 0, 0, [16, None]],
+ [18, 'bottomy', 0, 0, [16, None]],
+ [19, 'showaligned', 0, 0, [16, 20, 21]],
+ [20, 'description', 0, 0, [19, None]],
+ [21, 'setxy', 0, 0, [19, 22, 23, 24]],
+ [22, 'rightx', 0, 0, [21, None]],
+ [23, 'topy', 0, 0, [21, None]],
+ [24, 'showaligned', 0, 0, [21, 25, 26]],
+ [25, 'journal', 0, 0, [24, None]],
+ [26, 'setxy', 0, 0, [24, 27, 28, 29]],
+ [27, 'rightx', 0, 0, [26, None]],
+ [28, 'bottomy', 0, 0, [26, None]],
+ [29, 'showaligned', 0, 0, [26, 30, 31]],
+ [30, 'description', 0, 0, [29, None]],
+ [31, 'sandwichbottom', 0, 0, [29, None]]],
+ 'picture1x2':
+ [[0, 'sandwichtop', 0, 0, [None, 1, 2]],
+ [1, ['string', _('1×2 pictures')], 0, 0, [0, None]],
+ [2, 'setxy', 0, 0, [0, 3, 4, 5]],
+ [3, 'titlex', 0, 0, [2, None]],
+ [4, 'titley', 0, 0, [2, None]],
+ [5, 'setscale', 0, 0, [2, 6, 7]],
+ [6, ['number', '100'], 0, 0, [5, None]],
+ [7, 'show', 0, 0, [5, 8, 9]],
+ [8, ['string',_('Title')], 0, 0, [7, None]],
+ [9, 'setscale', 0, 0, [7, 10, 11]],
+ [10, ['number', '35'], 0, 0, [9, None]],
+ [11, 'setxy', 0, 0, [9, 12, 13, 14]],
+ [12, 'leftx', 0, 0, [11, None]],
+ [13, 'topy', 0, 0, [11, None]],
+ [14, 'showaligned', 0, 0, [11, 15, 16]],
+ [15, 'journal', 0, 0, [14, None]],
+ [16, 'setxy', 0, 0, [14, 17, 18, 19]],
+ [17, 'rightx', 0, 0, [16, None]],
+ [18, 'topy', 0, 0, [16, None]],
+ [19, 'showaligned', 0, 0, [16, 20, 21]],
+ [20, 'description', 0, 0, [19, None]],
+ [21, 'setxy', 0, 0, [19, 22, 23, 24]],
+ [22, 'leftx', 0, 0, [21, None]],
+ [23, 'bottomy', 0, 0, [21, None]],
+ [24, 'showaligned', 0, 0, [21, 25, 26]],
+ [25, 'journal', 0, 0, [24, None]],
+ [26, 'setxy', 0, 0, [24, 27, 28, 29]],
+ [27, 'rightx', 0, 0, [26, None]],
+ [28, 'bottomy', 0, 0, [26, None]],
+ [29, 'showaligned', 0, 0, [26, 30, 31]],
+ [30, 'description', 0, 0, [29, None]],
+ [31, 'sandwichbottom', 0, 0, [29, None]]],
+ 'picture1x1':
+ [[0, 'sandwichtop', 0, 0, [None, 1, 2]],
+ [1, ['string', _('1×1 pictures')], 0, 0, [0, None]],
+ [2, 'setxy', 0, 0, [0, 3, 4, 5]],
+ [3, 'titlex', 0, 0, [2, None]],
+ [4, 'titley', 0, 0, [2, None]],
+ [5, 'setscale', 0, 0, [2, 6, 7]],
+ [6, ['number', '100'], 0, 0, [5, None]],
+ [7, 'show', 0, 0, [5, 8, 9]],
+ [8, ['string',_('Title')], 0, 0, [7, None]],
+ [9, 'setscale', 0, 0, [7, 10, 11]],
+ [10, ['number', '35'], 0, 0, [9, None]],
+ [11, 'setxy', 0, 0, [9, 12, 13, 14]],
+ [12, 'leftx', 0, 0, [11, None]],
+ [13, 'topy', 0, 0, [11, None]],
+ [14, 'showaligned', 0, 0, [11, 15, 16]],
+ [15, 'journal', 0, 0, [14, None]],
+ [16, 'setxy', 0, 0, [14, 17, 18, 19]],
+ [17, 'rightx', 0, 0, [16, None]],
+ [18, 'topy', 0, 0, [16, None]],
+ [19, 'showaligned', 0, 0, [16, 20, 21]],
+ [20, 'description', 0, 0, [19, None]],
+ [21, 'sandwichbottom', 0, 0, [19, None]]],
+ }