Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--TurtleArtActivity.py41
-rw-r--r--taproject.py62
-rw-r--r--tawindow.py6
3 files changed, 108 insertions, 1 deletions
diff --git a/TurtleArtActivity.py b/TurtleArtActivity.py
index 6a6e200..e16d2fe 100644
--- a/TurtleArtActivity.py
+++ b/TurtleArtActivity.py
@@ -81,6 +81,8 @@ class TurtleArtActivity(activity.Activity):
# Add additional panels
self.projectToolbar = ProjectToolbar(self)
self.toolbox.add_toolbar( _('Project'), self.projectToolbar )
+ self.editToolbar = EditToolbar(self)
+ self.toolbox.add_toolbar(_('Edit'), self.editToolbar)
self.saveasToolbar = SaveAsToolbar(self)
self.toolbox.add_toolbar( _('Save as'), self.saveasToolbar )
self.toolbox.show()
@@ -439,6 +441,45 @@ class ChatTube(ExportedGObject):
self.stack = text
"""
+Edit toolbar: copy and paste text and stacks
+"""
+class EditToolbar(gtk.Toolbar):
+ def __init__(self, pc):
+ gtk.Toolbar.__init__(self)
+ self.activity = pc
+
+ # Copy button
+ self.copy = ToolButton( "edit-copy" )
+ self.copy.set_tooltip(_('copy'))
+ self.copy.props.sensitive = True
+ self.copy.connect('clicked', self._copy_cb)
+ self.copy.props.accelerator = '<Ctrl>C'
+ self.insert(self.copy, -1)
+ self.copy.show()
+
+ # Paste button
+ self.paste = ToolButton( "edit-paste" )
+ self.paste.set_tooltip(_('paste'))
+ self.paste.props.sensitive = True
+ self.paste.connect('clicked', self._paste_cb)
+ self.paste.props.accelerator = '<Ctrl>V'
+ self.insert(self.paste, -1)
+ self.paste.show()
+
+ def _copy_cb(self, button):
+ clipBoard = gtk.Clipboard()
+ _logger.debug("serialize the project and copy to clipboard")
+ text = tawindow.serialize_stack(self.activity.tw)
+ clipBoard.set_text(text)
+
+ def _paste_cb(self, button):
+ clipBoard = gtk.Clipboard()
+ _logger.debug("paste to the project")
+ text = clipBoard.wait_for_text()
+ if text is not None:
+ tawindow.clone_stack(self.activity.tw,text)
+
+"""
SaveAs toolbar: save as HTML, save as LOGO, and import Python code
"""
class SaveAsToolbar(gtk.Toolbar):
diff --git a/taproject.py b/taproject.py
index 71550cb..0a14c9b 100644
--- a/taproject.py
+++ b/taproject.py
@@ -86,6 +86,24 @@ def load_string(tw,text):
new_project(tw)
read_data(tw,data)
+# unpack sserialized data from the clipboard
+def clone_stack(tw,text):
+ listdata = json.decode(text)
+ data = tuplify(listdata) # json converts tuples to lists
+ read_stack(tw,data)
+
+# paste stack from the clipboard
+def read_stack(tw,data):
+ clone = []
+ for b in data:
+ spr = load_spr(tw,b); clone.append(spr)
+ for i in range(len(clone)):
+ cons=[]
+ for c in data[i][4]:
+ if c==None: cons.append(None)
+ else: cons.append(clone[c])
+ clone[i].connections = cons
+
def tuplify(t):
if type(t) is not list:
return t
@@ -207,6 +225,37 @@ def assemble_data_to_save(tw):
tw.turtle.color,tw.turtle.shade,tw.turtle.pensize))
return data
+# serialize a stack to save to the clipboard
+def serialize_stack(tw):
+ data = assemble_stack_to_clone(tw)
+ text = json.encode(data)
+ return text
+
+# find the stack under the cursor and serialize it
+def assemble_stack_to_clone(tw):
+ (x,y) = tw.window.get_pointer()
+ # print x,y
+ spr = findsprite(tw,(x,y))
+ bs = findgroup(find_top_block(spr))
+
+ data = []
+ for i in range(len(bs)): bs[i].id=i
+ for b in bs:
+ name = b.proto.name
+ 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+20, \
+ b.y-tw.turtle.canvas.y+20,connections))
+ return data
+
def save_pict(tw,fname):
tc = tw.turtle.canvas
pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, tc.width, \
@@ -234,3 +283,16 @@ def do_dialog(tw,dialog):
return result
def blocks(tw): return [spr for spr in tw.sprites if spr.type == 'block']
+
+def findgroup(b):
+ group=[b]
+ for b2 in b.connections[1:]:
+ if b2!=None: group.extend(findgroup(b2))
+ return group
+
+def find_top_block(spr):
+ b = spr
+ while b.connections[0]!=None:
+ b=b.connections[0]
+ return b
+
diff --git a/tawindow.py b/tawindow.py
index 80240ba..1f91bb2 100644
--- a/tawindow.py
+++ b/tawindow.py
@@ -229,9 +229,12 @@ def new_block_from_category(tw,proto,x,y):
def block_pressed(tw,mask,x,y,spr):
if spr is not None:
if mask is True:
+ """
newspr = clone_stack(tw,x-spr.x-20,y-spr.y-20, spr)
tw.dragpos = x-newspr.x,y-newspr.y
tw.draggroup = findgroup(newspr)
+ """
+ pass
else:
tw.draggroup = findgroup(spr)
for b in tw.draggroup: setlayer(b,2000)
@@ -241,7 +244,7 @@ def block_pressed(tw,mask,x,y,spr):
else:
tw.dragpos = x-spr.x,y-spr.y
disconnect(spr)
-
+"""
def clone_stack(tw,dx,dy,spr):
newspr = sprNew(tw,spr.x+dx,spr.y+dy,spr.proto.image)
newspr.type = spr.type
@@ -255,6 +258,7 @@ def clone_stack(tw,dx,dy,spr):
clonearg.connections[0]=newspr
setlayer(newspr,2000)
return newspr
+"""
def turtle_pressed(tw,x,y):
dx,dy = x-tw.turtle.spr.x-30,y-tw.turtle.spr.y-30