diff options
-rw-r--r-- | TurtleArtActivity.py | 6 | ||||
-rw-r--r-- | talogo.py | 27 | ||||
-rw-r--r-- | taproject.py | 29 | ||||
-rw-r--r-- | tasetup.py | 2 | ||||
-rw-r--r-- | tawindow.py | 67 | ||||
-rwxr-xr-x | turtleart.py | 4 |
6 files changed, 73 insertions, 62 deletions
diff --git a/TurtleArtActivity.py b/TurtleArtActivity.py index f7b030b..129d17d 100644 --- a/TurtleArtActivity.py +++ b/TurtleArtActivity.py @@ -375,6 +375,8 @@ class TurtleArtActivity(activity.Activity): if self._jobject and self._jobject.file_path: self.read_file(self._jobject.file_path) + else: # if new, load a start brick onto the canvas + tawindow.load_start(self.tw) """ A simplistic sharing model: the sharer is the master; @@ -487,7 +489,7 @@ class TurtleArtActivity(activity.Activity): def _do_load_python_cb(self, button): self.load_python.set_icon("pippy-openon") - self._import_py() + self.import_py() gobject.timeout_add(250,self.load_python.set_icon, "pippy-openoff") return @@ -511,7 +513,7 @@ class TurtleArtActivity(activity.Activity): return # Import Python code from the Journal to load into "myblock" - def _import_py(self): + def import_py(self): from sugar.graphics.objectchooser import ObjectChooser chooser = ObjectChooser('Python code', None, gtk.DIALOG_MODAL | \ gtk.DIALOG_DESTROY_WITH_PARENT) @@ -618,23 +618,23 @@ def callmyfunc(lc, f, x): def show_picture(lc, media, x, y, w, h): if media == "" or media[6:] == "": -# raise logoerror("#nomedia") - print "no media" + # raise logoerror("#nomedia") + pass elif media[6:] != "None": try: dsobject = datastore.get(media[6:]) except: raise logoerror("#nomedia") # check to see if it is a movie - print dsobject.file_path - print "object has file suffix of: " + dsobject.file_path[-4:] + # print dsobject.file_path + # print "object has file suffix of: " + dsobject.file_path[-4:] if dsobject.file_path[-4:] == '.ogv' or \ dsobject.file_path[-4:] == '.vob' or \ dsobject.file_path[-4:] == '.mp4' or \ dsobject.file_path[-4:] == '.wmv' or \ dsobject.file_path[-4:] == '.mov': - print "playing movie x:" + str(x) + " y:" + str(y) + " w:" \ - + str(w) + " h:" + str(h) + # print "playing movie x:" + str(x) + " y:" + str(y) + " w:" + \ + # str(w) + " h:" + str(h) play_dsobject(lc, dsobject, int(x), int(y), int(w), int(h)) else: pixbuf = get_pixbuf_from_journal(dsobject, int(w), int(h)) @@ -650,12 +650,11 @@ def get_pixbuf_from_journal(dsobject,w,h): except: try: # print "Trying preview..." - pixbufloader = gtk.gdk.pixbuf_loader_new_with_mime_type \ - ('image/png') + pixbufloader = \ + gtk.gdk.pixbuf_loader_new_with_mime_type('image/png') pixbufloader.set_size(min(300,int(w)),min(225,int(h))) pixbufloader.write(dsobject.metadata['preview']) pixbufloader.close() -# gtk.gdk_pixbuf_loader_close(pixbufloader) pixbuf = pixbufloader.get_pixbuf() except: # print "No preview" @@ -664,8 +663,8 @@ def get_pixbuf_from_journal(dsobject,w,h): def show_description(lc, media, x, y, w, h): if media == "" or media[6:] == "": -# raise logoerror("#nomedia") - print "no media" + # raise logoerror("#nomedia") + pass elif media[6:] != "None": try: dsobject = datastore.get(media[6:]) @@ -678,7 +677,7 @@ def show_description(lc, media, x, y, w, h): def draw_title(lc,title,x,y): draw_text(lc.tw.turtle,title,int(x),int(y),lc.title_height, \ - lc.tw.turtle.width-x) + lc.tw.turtle.width-x) def calc_position(lc,t): w,h,x,y,dx,dy = lc.templates[t] @@ -1007,8 +1006,8 @@ def kbinput(lc): else: try: lc.keyboard = {'Escape': 27, 'space': 32, ' ': 32, 'Return': 13, \ - 'KP_Up': 2, 'KP_Down': 4, 'KP_Left': 1, 'KP_Right': 3,} \ - [lc.tw.keypress] + 'KP_Up': 2, 'KP_Down': 4, 'KP_Left': 1, \ + 'KP_Right': 3,}[lc.tw.keypress] except: lc.keyboard = 0 lc.tw.keypress = "" diff --git a/taproject.py b/taproject.py index 37b0964..05c2a87 100644 --- a/taproject.py +++ b/taproject.py @@ -45,12 +45,13 @@ import os.path from tasprites import * from taturtle import * from talogo import stop_logo +from talogo import get_pixbuf_from_journal try: from sugar.datastore import datastore except: pass -nolabel = ['audiooff', 'descriptionoff','journal'] +nolabel = ['audiooff', 'descriptionoff', 'journal'] shape_dict = {'journal':'texton', \ 'descriptionoff':'decson', \ 'audiooff':'audioon'} @@ -157,7 +158,7 @@ def load_spr(tw,b): btype, label = btype if btype == 'title': # for backward compatibility btype = 'string' - if btype == 'journal' or btype == 'audiooff': + if btype == 'journal' or btype == 'audiooff' or btype == 'descriptionoff': media = label label = None proto = tw.protodict[btype] @@ -173,7 +174,6 @@ def load_spr(tw,b): spr.ds_id = dsobject.object_id setimage(spr, tw.media_shapes[shape_dict[spr.proto.name]]) if spr.proto.name == 'journal': - from talogo import get_pixbuf_from_journal pixbuf = get_pixbuf_from_journal \ (dsobject,spr.width,spr.height) if pixbuf is not None: @@ -233,8 +233,8 @@ def save_data(tw,fname): f.close() # Used to send data across a shared session -def save_string(tw): - data = assemble_data_to_save(tw) +def save_string(tw,save_turtle=True): + data = assemble_data_to_save(tw,save_turtle) if _old_Sugar_system is True: text = json.write(data) else: @@ -243,7 +243,7 @@ def save_string(tw): text = io.getvalue() return text -def assemble_data_to_save(tw): +def assemble_data_to_save(tw,save_turtle=True): bs = blocks(tw) data = [] for i in range(len(bs)): bs[i].id=i @@ -260,9 +260,10 @@ def assemble_data_to_save(tw): 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)) + if save_turtle is True: + data.append((-1,'turtle', + tw.turtle.xcor,tw.turtle.ycor,tw.turtle.heading, + tw.turtle.color,tw.turtle.shade,tw.turtle.pensize)) return data # serialize a stack to save to the clipboard @@ -279,7 +280,6 @@ def serialize_stack(tw): # 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)) @@ -336,7 +336,12 @@ def findgroup(b): def find_top_block(spr): b = spr - while b.connections[0]!=None: - b=b.connections[0] + if hasattr(b,"connections"): + while b.connections[0]!=None: + b=b.connections[0] return b +# start a new project with a start brick +def load_start(tw): + clone_stack(tw,str("[[0,\"start\",250,30,[null,null]]]")) + @@ -315,7 +315,7 @@ def setup_selector(tw,name,y,blockdescriptions): proto.name = bname proto.image = image proto.primname=primname - if primname=='': + if primname=='': # handle definable blocks differently tw.valdict[docktype]=bname tw.defdict[bname]=b[3] proto.eval=b[4] diff --git a/tawindow.py b/tawindow.py index 3fe3f8e..0578909 100644 --- a/tawindow.py +++ b/tawindow.py @@ -103,7 +103,6 @@ def twNew(win, path, lang, parent=None): tw.dead_key = "" tw.area = win.window tw.gc = tw.area.new_gc() - # tw.window.textentry = gtk.Entry() # on an OLPC-XO-1, there is a scaling factor if os.path.exists('/sys/power/olpc-pm'): tw.lead = 1.6 @@ -425,33 +424,39 @@ def button_release(tw, x, y, verbose=False): elif tw.defdict.has_key(spr.proto.name): tw.selected_block = spr if spr.proto.name=='string': - # entry = gtk.Entry() move(tw.select_mask_string, (spr.x-5,spr.y-5)) setlayer(tw.select_mask_string, 660) tw.firstkey = True elif spr.proto.name in importblocks: import_from_journal(tw, spr) + # if Python block is clicked before any code has been loaded + # initiate the chooser dialog + elif spr.proto.name=='nop' and tw.myblock==None: + tw.activity.import_py() else: run_stack(tw, spr) def import_from_journal(tw, spr): - chooser = ObjectChooser('Choose image', None, gtk.DIALOG_MODAL | \ - gtk.DIALOG_DESTROY_WITH_PARENT) - try: - result = chooser.run() - if result == gtk.RESPONSE_ACCEPT: - dsobject = chooser.get_selected_object() - # change block graphic to indicate that object is "loaded" - if spr.proto.name == 'journal': - load_image(tw, dsobject, spr) - elif spr.proto.name == 'audiooff': - setimage(spr,tw.media_shapes['audioon']) - else: - setimage(spr, tw.media_shapes['decson']) - spr.ds_id = dsobject.object_id - dsobject.destroy() - finally: - chooser.destroy() - del chooser + if hasattr(tw,"activity"): + chooser = ObjectChooser('Choose image', None,\ + gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT) + try: + result = chooser.run() + if result == gtk.RESPONSE_ACCEPT: + dsobject = chooser.get_selected_object() + # change block graphic to indicate that object is "loaded" + if spr.proto.name == 'journal': + load_image(tw, dsobject, spr) + elif spr.proto.name == 'audiooff': + setimage(spr,tw.media_shapes['audioon']) + else: + setimage(spr, tw.media_shapes['decson']) + spr.ds_id = dsobject.object_id + dsobject.destroy() + finally: + chooser.destroy() + del chooser + else: + print "Journal Object Chooser unavailable from outside of Sugar" # Replace Journal block graphic with preview image def load_image(tw, picture, spr): @@ -770,17 +775,17 @@ def xy(event): return map(int, event.get_coords()) def showPopup(block_name,tw): - if hasattr(tw,"activity"): - if block_name in blocks_dict: - block_name_s = _(blocks_dict[block_name]) - else: - block_name_s = _(block_name) - - try: - label = block_name_s + ": " + hover_dict[block_name] - except: - label = block_name_s - # Use new toolbar + if blocks_dict.has_key(block_name): + block_name_s = _(blocks_dict[block_name]) + else: + block_name_s = _(block_name) + if hover_dict.has_key(block_name): + label = block_name_s + ": " + hover_dict[block_name] + else: + label = block_name_s + if hasattr(tw, "activity"): tw.activity.hover_help_label.set_text(label) tw.activity.hover_help_label.show() + elif hasattr(tw, "win"): + tw.win.set_title(_("Turtle Art") + " — " + label) return 0 diff --git a/turtleart.py b/turtleart.py index df871fa..f9b9ce1 100755 --- a/turtleart.py +++ b/turtleart.py @@ -67,7 +67,7 @@ class TurtleMain(): if not lang: lang = 'en' lang = lang[0:2] - + win = gtk.Window(gtk.WINDOW_TOPLEVEL) win.maximize() win.set_title(_("Turtle Art")) @@ -136,7 +136,7 @@ class TurtleMain(): win.show_all() self.tw = twNew(canvas, os.path.abspath('.'), lang) - self.tw.win = canvas + self.tw.win = win def _do_open_cb(self, widget): load_file(self.tw, True) |