Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/tawindow.py
diff options
context:
space:
mode:
Diffstat (limited to 'tawindow.py')
-rw-r--r--tawindow.py158
1 files changed, 120 insertions, 38 deletions
diff --git a/tawindow.py b/tawindow.py
index 9f1a0ae..ab184ab 100644
--- a/tawindow.py
+++ b/tawindow.py
@@ -328,6 +328,8 @@ class TurtleArtWindow():
HIDE_LAYER)
self.selected_palette = None
self.toolbar_spr.set_layer(HIDE_LAYER)
+ self.palette_button[self.palette_orientation].set_layer(HIDE_LAYER)
+ self.palette_button[1-self.palette_orientation].set_layer(HIDE_LAYER)
def show_toolbar_palette(self, n, init_only=False):
if self.selectors == []:
@@ -375,6 +377,8 @@ class TurtleArtWindow():
self.palette_sprs[n][1-self.palette_orientation].set_layer(
HIDE_LAYER)
+ self.palette_button[self.palette_orientation].set_layer(TAB_LAYER)
+
for i in range(len(PALETTES)):
self.selectors[i].set_layer(TAB_LAYER)
@@ -417,6 +421,7 @@ class TurtleArtWindow():
def _layout_palette(self, n):
+ if n is not None:
_x, _y, _max = 5, ICON_SIZE+5, 0
if self.palette_orientation == 0:
for i in range(len(PALETTES[n])):
@@ -1402,6 +1407,21 @@ class TurtleArtWindow():
self.selected_blk.spr.set_label(s)
self.selected_blk.values[0] = s
+ """
+ Load Python code from a file
+ """
+ def load_python_code(self):
+ fname, self.load_save_folder = get_load_name('.py',
+ self.load_save_folder)
+ if fname==None:
+ return
+ f = open(fname, 'r')
+ self.myblock = f.read()
+ f.close()
+
+ """
+ Start a new project
+ """
def new_project(self):
stop_logo(self)
for b in self._just_blocks():
@@ -1409,6 +1429,14 @@ class TurtleArtWindow():
self.canvas.clearscreen()
self.save_file_name = None
+ """
+ Load a project from a file
+ """
+ def load_files(self, ta_file, create_new_project=True):
+ if create_new_project is True:
+ self.new_project()
+ self.process_data(data_from_file(ta_file))
+
def load_file(self, create_new_project=True):
fname, self.load_save_folder = get_load_name('.ta',
self.load_save_folder)
@@ -1420,20 +1448,9 @@ class TurtleArtWindow():
if create_new_project is True:
self.save_file_name = os.path.basename(fname)
- def load_python_code(self):
- fname, self.load_save_folder = get_load_name('.py',
- self.load_save_folder)
- if fname==None:
- return
- f = open(fname, 'r')
- self.myblock = f.read()
- f.close()
-
- def load_files(self, ta_file, create_new_project=True):
- if create_new_project is True:
- self.new_project()
- self.process_data(data_from_file(ta_file))
-
+ """
+ Process data (from a file or clipboard) into blocks
+ """
def process_data(self, data):
# Create the blocks.
blocks = []
@@ -1448,12 +1465,46 @@ class TurtleArtWindow():
# Make the connections.
for i in range(len(blocks)):
cons=[]
- for c in data[i][4]:
- if c is None:
- cons.append(None)
- else:
- cons.append(blocks[c])
- blocks[i].connections = cons
+ # Ugly corner case of old-style booleans
+ if blocks[i].connections == 'check':
+ print "WARNING: ugly corner case for %s" % (blocks[i].name)
+ print "adding an extra connection"
+ cons.append(None) # 'and' or 'or' not be connected to 'if'
+ for c in data[i][4]:
+ if c is None:
+ cons.append(None)
+ else:
+ cons.append(blocks[c])
+ if data[i][4][0] is not None:
+ print "WARNING: patching %s connection" %\
+ (blocks[i].name)
+ c = data[i][4][0]
+ cons[0] = blocks[data[c][4][0]]
+ c0 = data[c][4][0]
+ print "WARNING: patching %s connection" %\
+ (blocks[c0].name)
+ for j, cj in enumerate(data[c0][4]):
+ if cj == c:
+ print "found a match in dock position %d" % (j)
+ blocks[c0].connections[j] = blocks[i]
+ if c<i:
+ print "WARNING: patching %s connections" %\
+ (blocks[c].name)
+ blocks[c].connections[0] = blocks[i]
+ blocks[c].connections[3] = None
+ else:
+ print "WARNING: could not look into the future"
+ print cons
+ print "%s: %d docks and %d connections" % (blocks[i].name,
+ len(blocks[i].docks), len(cons))
+ # Normally, it is simply a matter of copying the connections
+ else:
+ for c in data[i][4]:
+ if c is None:
+ cons.append(None)
+ else:
+ cons.append(blocks[c])
+ blocks[i].connections = cons[:]
# Adjust the x,y positions, as block sizes may have changed.
for b in blocks:
(sx, sy) = b.spr.get_xy()
@@ -1468,7 +1519,10 @@ class TurtleArtWindow():
cdock = c.docks[j]
nx, ny = sx+bdock[2]-cdock[2], sy+bdock[3]-cdock[3]
c.spr.move((nx, ny))
-
+
+ #
+ # Restore individual blocks from saved state
+ #
def load_block(self, b):
# A block is saved as: (i, (btype, value), x, y, (c0,... cn))
# The x,y position is saved/loaded for backward compatibility
@@ -1486,48 +1540,61 @@ class TurtleArtWindow():
else:
values = []
+ if btype in OLD_DOCK:
+ check_dock = True
+ print "WARNING: will need to preform dock check"
+ else:
+ check_dock = False
if OLD_NAMES.has_key(btype):
print "%s -> %s" % (btype, OLD_NAMES[btype])
btype = OLD_NAMES[btype]
-
+ else:
+ print "%s" % (btype)
blk = Block(self.block_list, self.sprite_list,
btype, b[2]+self.canvas.cx,
b[3]+self.canvas.cy, 'block', values)
- # Some blocks get a skin.
+ # Some blocks get transformed.
if btype == 'nop':
if self.nop == 'pythonloaded':
- blk.spr.set_image(self.media_shapes['pythonon'], 1, PYTHON_X, PYTHON_Y)
+ blk.spr.set_image(self.media_shapes['pythonon'], 1,
+ PYTHON_X, PYTHON_Y)
else:
- blk.spr.set_image(self.media_shapes['pythonoff'], 1, PYTHON_X, PYTHON_Y)
+ blk.spr.set_image(self.media_shapes['pythonoff'], 1,
+ PYTHON_X, PYTHON_Y)
blk.spr.set_label(' ')
elif btype in EXPANDABLE:
if btype == 'vspace':
- blk.expand_in_y(value)
+ if value is not None:
+ blk.expand_in_y(value)
elif btype == 'hspace':
- blk.expand_in_x(value)
+ if value is not None:
+ blk.expand_in_x(value)
elif btype == 'list':
for i in range(len(b[4])-4):
dy = blk.add_arg()
elif btype in BOX_STYLE_MEDIA and len(blk.values)>0:
if blk.values[0] == 'None':
- blk.spr.set_image(self.media_shapes[btype+'off'], 1, MEDIA_X, MEDIA_Y)
+ blk.spr.set_image(self.media_shapes[btype+'off'], 1,
+ MEDIA_X, MEDIA_Y)
elif btype == 'audio' or btype == 'description':
- blk.spr.set_image(self.media_shapes[btype+'on'], 1, MEDIA_X, MEDIA_Y)
+ blk.spr.set_image(self.media_shapes[btype+'on'], 1,
+ MEDIA_X, MEDIA_Y)
elif self.running_sugar:
try:
dsobject = datastore.get(blk.values[0])
if not movie_media_type(dsobject.file_path[-4:]):
- pixbuf = get_pixbuf_from_journal(dsobject, THUMB_W, THUMB_H)
+ pixbuf = get_pixbuf_from_journal(dsobject,
+ THUMB_W, THUMB_H)
if pixbuf is not None:
blk.spr.set_image(pixbuf, 1, PIXBUF_X, PIXBUF_Y)
else:
- blk.spr.set_image(
- self.media_shapes['journalon'], 1, MEDIA_X, MEDIA_Y)
+ blk.spr.set_image(self.media_shapes['journalon'], 1,
+ MEDIA_X, MEDIA_Y)
dsobject.destroy()
except:
print "couldn't open dsobject (%s)" % (blk.values[0])
- blk.spr.set_image(self.media_shapes['journaloff'],
- 1, MEDIA_X, MEDIA_Y)
+ blk.spr.set_image(self.media_shapes['journaloff'], 1,
+ MEDIA_X, MEDIA_Y)
else:
if not movie_media_type(blk.values[0][-4:]):
try:
@@ -1538,16 +1605,23 @@ class TurtleArtWindow():
blk.spr.set_image(self.media_shapes['journaloff'],
1, MEDIA_X, MEDIA_Y)
else:
- blk.spr.set_image(self.media_shapes['journalon'], 1, MEDIA_X, MEDIA_Y)
+ blk.spr.set_image(self.media_shapes['journalon'], 1,
+ MEDIA_X, MEDIA_Y)
blk.spr.set_label(' ')
blk.resize()
elif btype in BOX_STYLE_MEDIA:
blk.spr.set_label(' ')
- blk.spr.set_image(self.media_shapes[btype+'off'], 1, MEDIA_X, MEDIA_Y)
+ blk.spr.set_image(self.media_shapes[btype+'off'], 1,
+ MEDIA_X, MEDIA_Y)
blk.spr.set_layer(BLOCK_LAYER)
+ if check_dock is True:
+ blk.connections = 'check'
return blk
-
+
+ #
+ # Restore a turtle from its saved state
+ #
def load_turtle(self, b):
id, name, xcor, ycor, heading, color, shade, pensize = b
self.canvas.setxy(xcor, ycor)
@@ -1556,11 +1630,16 @@ class TurtleArtWindow():
self.canvas.setshade(shade)
self.canvas.setpensize(pensize)
- # start a new project with a start brick
+ #
+ # Start a new project with a 'start' brick
+ #
def load_start(self):
self.clone_stack("%s%s%s" % ("[[0,[\"start\",\"", _("start"),
"\"],250,250,[null,null]]]"))
+ #
+ # Start a project to a file
+ #
def save_file(self):
if self.save_folder is not None:
self.load_save_folder = self.save_folder
@@ -1575,6 +1654,9 @@ class TurtleArtWindow():
data_to_file(data, fname+'.ta')
self.save_file_name = os.path.basename(fname)
+ #
+ # Pack the project (or stack) into a data stream to be serialized
+ #
def assemble_data_to_save(self, save_turtle=True, save_project=True):
# TODO: if save_project is False: just the current stack
data = []