diff options
-rw-r--r-- | TurtleArtActivity.py | 41 | ||||
-rw-r--r-- | taproject.py | 62 | ||||
-rw-r--r-- | tawindow.py | 6 |
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 |