Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/taproject.py
diff options
context:
space:
mode:
Diffstat (limited to 'taproject.py')
-rw-r--r--taproject.py129
1 files changed, 105 insertions, 24 deletions
diff --git a/taproject.py b/taproject.py
index 2078e6b..abebdfa 100644
--- a/taproject.py
+++ b/taproject.py
@@ -1,4 +1,4 @@
-#Copyright (c) 2007-8, Playful Invention Company.
+#Copyright (c) 2007-9, Playful Invention Company.
#Permission is hereby granted, free of charge, to any person obtaining a copy
#of this software and associated documentation files (the "Software"), to deal
@@ -22,17 +22,19 @@ import pygtk
pygtk.require('2.0')
import gtk
import pickle
+import json
import os.path
+# import base64
from tasprites import *
from taturtle import *
from talogo import stop_logo
+from sugar.datastore import datastore
def new_project(tw):
stop_logo(tw)
for b in blocks(tw): hide(b)
setlayer(tw.turtle.canvas, 600)
- setshape(tw.toolsprs['hideshow'], tw.toolsprs['hideshow'].offshape)
clearscreen(tw.turtle)
tw.save_file_name = None
@@ -45,28 +47,51 @@ def load_file(tw):
def load_files(tw,ta_file, png_file=''):
f = open(ta_file, "r")
- data = pickle.load(f)
+ try:
+ data = pickle.load(f) # old-style data format
+ except:
+ # print "reading saved json data"
+ text = f.read(-1)
+ listdata = json.read(text)
+ data = tuplify(listdata) # json converts tuples to lists
f.close()
new_project(tw)
read_data(tw,data)
- try:
- load_pict(tw,png_file)
- except:
- print "load_files: picture didn't load"
- pass
- inval(tw.turtle.canvas)
+ # don't load the png_file -- we run the program instead
+ # if png_file != '':
+ # try:
+ # load_pict(tw,png_file)
+ # except:
+ # pass
+ # inval(tw.turtle.canvas)
def get_load_name(tw):
- dialog = gtk.FileChooserDialog("Load...", None,
- gtk.FILE_CHOOSER_ACTION_OPEN,
- (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN, gtk.RESPONSE_OK))
+ dialog = gtk.FileChooserDialog("Load...", None, \
+ gtk.FILE_CHOOSER_ACTION_OPEN, \
+ (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN, gtk.RESPONSE_OK))
dialog.set_default_response(gtk.RESPONSE_OK)
return do_dialog(tw,dialog)
+# unpack serialized data sent across a share
+# def load_string(tw,btext):
+def load_string(tw,text):
+ # text = base64.b64decode(btext) # no need for base64 encoding with json
+ listdata = json.read(text)
+ data = tuplify(listdata) # json converts tuples to lists
+ # data = pickle.loads(text)
+ new_project(tw)
+ read_data(tw,data)
+
+def tuplify(t):
+ if type(t) is not list:
+ return t
+ return tuple(map(tuplify, t))
+
def read_data(tw,data):
blocks = []
for b in data:
- if b[1]=='turtle': load_turtle(tw,b)
+ if b[1]=='turtle':
+ load_turtle(tw,b)
else: spr = load_spr(tw,b); blocks.append(spr)
for i in range(len(blocks)):
cons=[]
@@ -76,13 +101,40 @@ def read_data(tw,data):
blocks[i].connections = cons
def load_spr(tw,b):
+ media = None
btype, label = b[1],None
- if type(btype)==type((1,2)): btype, label = btype
+# print btype
+ if type(btype)==type((1,2)):
+ btype, label = btype
+# print "found a label: " + label
+ if btype == 'title': # for backward compatibility
+ btype = 'string'
+ if btype == 'journal' or btype == 'audiooff':
+ media = label
+ label = None
proto = tw.protodict[btype]
- spr = sprNew(tw,b[2]+tw.turtle.canvas.x,b[3]+tw.turtle.canvas.y, proto.image)
+ spr = sprNew(tw,b[2]+tw.turtle.canvas.x,b[3]+tw.turtle.canvas.y, \
+ proto.image)
spr.type = 'block'
spr.proto = proto
if label!=None: spr.label=label
+ if media!=None and media!="media_None" and media!="audio_None":
+ try:
+ dsobject = datastore.get(media)
+ spr.ds_id = dsobject.object_id
+ if spr.proto.name == 'journal':
+ from talogo import get_pixbuf_from_journal
+ pixbuf = get_pixbuf_from_journal \
+ (dsobject,spr.width,spr.height)
+ if pixbuf != None:
+ setimage(spr, pixbuf)
+ else:
+ setimage(spr, tw.media_shapes['texton'])
+ elif spr.proto.name == 'audiooff':
+ setimage(spr, tw.media_shapes['audioon'])
+ dsobject.destroy()
+ except:
+ print "couldn't open dsobject (" + str(spr.ds_id) + ")"
setlayer(spr,650)
return spr
@@ -110,31 +162,60 @@ def save_file(tw):
def get_save_name(tw):
dialog = gtk.FileChooserDialog("Save..", None,
gtk.FILE_CHOOSER_ACTION_SAVE,
- (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,gtk.STOCK_SAVE, gtk.RESPONSE_OK))
+ (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,gtk.STOCK_SAVE, \
+ gtk.RESPONSE_OK))
dialog.set_default_response(gtk.RESPONSE_OK)
- if tw.save_file_name!=None: dialog.set_current_name(tw.save_file_name+'.ta')
+ if tw.save_file_name!=None: dialog.set_current_name( \
+ tw.save_file_name+'.ta')
return do_dialog(tw,dialog)
def save_data(tw,fname):
f = file(fname, "w")
+ data = assemble_data_to_save(tw)
+ # pickle.dump(data,f)
+ text = json.write([data]) # for some reason, we need to add the extra []
+ f.write(text)
+ f.close()
+
+# used to send data across a shared session
+def save_string(tw):
+ data = assemble_data_to_save(tw)
+ # encode it for sending across the network
+ # text = pickle.dumps(data)
+ text = json.write(data)
+ # btext = base64.b64encode(text)
+ # return btext
+ return text # no need for base64 with json encoding
+
+def assemble_data_to_save(tw):
bs = blocks(tw)
data = []
for i in range(len(bs)): bs[i].id=i
for b in bs:
name = b.proto.name
- if name=='number': name=(name,b.label)
- connections = [get_id(x) for x in b.connections]
- data.append((b.id,name,b.x-tw.turtle.canvas.x,b.y-tw.turtle.canvas.y,connections))
+ if tw.defdict.has_key(name) or name == 'journal' or \
+ name == 'audiooff':
+ if b.ds_id != None:
+ name=(name,str(b.ds_id))
+ else:
+ name=(name,b.label)
+ if hasattr(b,'connections'):
+ connections = [get_id(x) for x in b.connections]
+ else:
+ connections = None
+ data.append((b.id,name,b.x-tw.turtle.canvas.x, \
+ b.y-tw.turtle.canvas.y,connections))
data.append((-1,'turtle',
tw.turtle.xcor,tw.turtle.ycor,tw.turtle.heading,
tw.turtle.color,tw.turtle.shade,tw.turtle.pensize))
- pickle.dump(data,f)
- f.close()
+ return data
def save_pict(tw,fname):
tc = tw.turtle.canvas
- pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, tc.width, tc.height)
- pixbuf.get_from_drawable(tc.image, tc.image.get_colormap(), 0, 0, 0, 0, tc.width, tc.height)
+ pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, tc.width, \
+ tc.height)
+ pixbuf.get_from_drawable(tc.image, tc.image.get_colormap(), 0, 0, 0, 0, \
+ tc.width, tc.height)
pixbuf.save(fname, 'png')
def get_id(x):