From 4744cb84201c2c04d37a7abb392fa5136f7a20ef Mon Sep 17 00:00:00 2001 From: Walter Bender Date: Sat, 30 Jan 2010 18:51:34 +0000 Subject: lots of cleaning up of multimedia code --- diff --git a/constants.py b/constants.py index 321389a..938a32a 100644 --- a/constants.py +++ b/constants.py @@ -206,15 +206,6 @@ BLOCK_NAMES = { 'yellow':[_('yellow')]} # -# Legacy names -# -OLD_NAMES = {'product':'product2', 'storeinbox':'storein', - 'division':'division2', 'plus':'plus2', - 'remainder':'remainder2', 'identity':'identity2', - 'division':'division2', 'if else':'if', 'audiooff':'audio', - 'descriptionoff':'description'} - -# # Logo primitives # @@ -279,7 +270,7 @@ PRIMITIVES = { 'setcolor':'setcolor', 'seth':'seth', 'setpensize':'setpensize', - 'set scale':'setscale', + 'setscale':'setscale', 'setshade':'setshade', 'settextsize':'settextsize', 'setxy':'setxy', @@ -313,6 +304,7 @@ DEFAULTS = { 'audio':[None], 'back':[100], 'box':[_('my box')], + 'description':[None], 'fillscreen':[60,80], 'forward':[100], 'hat':[_('action')], @@ -357,6 +349,15 @@ STATUS_SHAPES = ['status', 'info', 'nostack', 'noinput', 'emptyheap', 'syntaxerror'] # +# Legacy names +# +OLD_NAMES = {'product':'product2', 'storeinbox':'storein', + 'division':'division2', 'plus':'plus2', + 'remainder':'remainder2', 'identity':'identity2', + 'division':'division2', 'if else':'if', 'audiooff':'audio', + 'descriptionoff':'description'} + +# # 'dead key' Unicode dictionaries # diff --git a/tagplay.py b/tagplay.py index daffde0..b58a123 100644 --- a/tagplay.py +++ b/tagplay.py @@ -136,21 +136,14 @@ class PlayVideoWindow(gtk.Window): del self.imagesink self.imagesink = sink - self.imagesink.set_xwindow_id(self.window.xid) + if self.window is not None: + self.imagesink.set_xwindow_id(self.window.xid) -def play_audio(lc, audio): - print "loading audio id: " + str(audio) - if audio == "" or audio[6:] == "": - raise logoerror("#nomedia") - elif audio[6:] != "None": - try: - dsobject = datastore.get(audio[6:]) - print dsobject.file_path - except: - print "Couldn't open id: " + str(audio[6:]) - if lc.gplay == None: - lc.gplay = Gplay() - lc.gplay.setFile("file:///" + dsobject.file_path) +def play_audio(lc, filepath): + print "loading audio id: " + filepath + if lc.gplay == None: + lc.gplay = Gplay() + lc.gplay.setFile("file:///" + filepath) def play_video(lc, media, x, y, w, h): print "loading media id: " + str(media) @@ -164,20 +157,20 @@ def play_video(lc, media, x, y, w, h): print "Couldn't open id: " + str(media[6:]) play_dsobject(lc, dsobject, x, y, w, h) -def play_dsobject(lc, dsobject, x, y, w, h): +def play_movie_from_file(lc, filepath, x, y, w, h): if lc.gplay == None: lc.gplay = Gplay() # wait for current movie to stop playing if lc.gplay.is_playing: print "already playing..." -# yield True - lc.gplay.setFile("file:///" + dsobject.file_path) + lc.gplay.setFile("file:///" + filepath) if lc.gplay.window == None: gplayWin = PlayVideoWindow() lc.gplay.window = gplayWin gplayWin.set_type_hint( gtk.gdk.WINDOW_TYPE_HINT_DIALOG ) gplayWin.set_decorated( False ) - gplayWin.set_transient_for( lc.tw.activity ) + if lc.tw.running_sugar(): + gplayWin.set_transient_for( lc.tw.activity ) # y position is too high for some reason (toolbox?) adding offset gplayWin.move( x, y+108 ) gplayWin.resize( w, h ) diff --git a/talogo.py b/talogo.py index 454a577..d0d41fe 100644 --- a/talogo.py +++ b/talogo.py @@ -49,6 +49,17 @@ from gettext import gettext as _ procstop = False +def movie_media_type(suffix): + if suffix.replace('.','') in ['ogv','vob','mp4','wmv','mov', 'mpeg']: + return True + return False + +def audio_media_type(suffix): + if suffix.replace('.','') in ['ogg', 'oga', 'm4a']: + return True + return False + + class symbol: def __init__(self, name): self.name = name @@ -113,12 +124,12 @@ def blocks_to_code(lc, blk): code.append('#smedia_'+str(blk.values[0])) else: code.append('#smedia_None') - elif blk.name=='descriptionoff' or blk.name=='descriptionon': + elif blk.name=='description': if blk.values[0] is not None: code.append('#sdescr_'+str(blk.values[0])) else: code.append('#sdescr_None') - elif blk.name=='audiooff' or blk.name=='audio': + elif blk.name=='audio': if blk.values[0] is not None: code.append('#saudio_'+str(blk.values[0])) else: @@ -259,26 +270,24 @@ def infixnext(lc): def debug_trace(lc, token): if lc.trace: - if token.name in ['forward', 'right', 'back', 'left', 'seth', 'setxy', \ + if token.name in ['forward', 'right', 'back', 'left', 'seth', 'setxy', 'arc', 'heading', 'xcor', 'ycor']: - my_string = token.name +\ - "\nxcor= " + str(int(lc.tw.canvas.xcor)) +\ - "\nycor= " + str(int(lc.tw.canvas.ycor)) +\ - "\nheading= " + str(int(lc.tw.canvas.heading)) +\ - "\nscale= " + str(lc.scale) - elif token.name in ['penup', 'pendown', 'setcolor', 'setshade', \ - 'settextcolor', 'settextsize', 'shade', 'color', \ + my_string = "%s\nxcor=%d\nycor=%d\nheading=%d\nscale=%d" %\ + (token.name,int(lc.tw.canvas.xcor), + int(lc.tw.canvas.ycor),int(lc.tw.canvas.heading), + int(lc.scale)) + elif token.name in ['penup', 'pendown', 'setcolor', 'setshade', + 'settextcolor', 'settextsize', 'shade', 'color', 'fillscreen', 'pensize']: if lc.tw.canvas.pendown: - penstatus = "\npen down" + penstatus = "pen down" else: - penstatus = "\npen up" - my_string = token.name + penstatus +\ - "\ncolor= " + str(int(lc.tw.canvas.color)) +\ - "\nshade= " + str(lc.tw.canvas.shade) +\ - "\npen size= " + str(lc.tw.canvas.pensize) + penstatus = "pen up" + my_string = "%s\n%s\ncolor=%d\nshade=%d\npensize=%.1f" %\ + (token.name, penstatus, int(lc.tw.canvas.color), + int(lc.tw.canvas.shade), lc.tw.canvas.pensize) else: - my_string = token.name + "\nblocks status:\n" + my_string = "%s\nblocks status:\n" % (token.name) for k,v in lc.boxes.iteritems(): tmp = k +":" + str(v) + "\n" my_string += tmp @@ -674,24 +683,25 @@ def show_picture(lc, media, x, y, w, h): if media == "" or media[6:] == "": pass elif media[6:] is not "None": + pixbuf = None if lc.tw.running_sugar(): try: dsobject = datastore.get(media[6:]) except: raise logoerror("#nomedia") - # Check to see if it is a movie - 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': - play_dsobject(lc, dsobject, int(x), int(y), int(w), int(h)) + if movie_media_type(dsobject.file_path[-4:]): + play_movie_from_file(lc, dsobject.file_path, int(x), int(y), + int(w), int(h)) else: pixbuf = get_pixbuf_from_journal(dsobject, int(w), int(h)) dsobject.destroy() else: - pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(media[6:], - int(w), int(h)) + if movie_media_type(media[-4:]): + play_movie_from_file(lc, media[6:], int(x), int(y), + int(w), int(h)) + else: + pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(media[6:], + int(w), int(h)) if pixbuf is not None: lc.tw.canvas.draw_pixbuf(pixbuf, 0, 0, int(x), int(y), int(w), int(h)) @@ -702,7 +712,6 @@ def get_pixbuf_from_journal(dsobject,w,h): int(w),int(h)) except: try: - # print "Trying preview..." pixbufloader = \ gtk.gdk.pixbuf_loader_new_with_mime_type('image/png') pixbufloader.set_size(min(300,int(w)),min(225,int(h))) @@ -710,22 +719,25 @@ def get_pixbuf_from_journal(dsobject,w,h): pixbufloader.close() pixbuf = pixbufloader.get_pixbuf() except: - # print "No preview" pixbuf = None return pixbuf def show_description(lc, media, x, y, w, h): if media == "" or media[6:] == "": - # raise logoerror("#nomedia") pass elif media[6:] is not "None": - try: - dsobject = datastore.get(media[6:]) - lc.tw.canvas.draw_text(dsobject.metadata['description'], - int(x),int(y), lc.body_height, int(w)) - dsobject.destroy() - except: - print "no description?" + if lc.tw.running_sugar(): + try: + dsobject = datastore.get(media[6:]) + text = dsobject.metadata['description'] + dsobject.destroy() + except: + print "no description?" + else: + f = open(media[6:], 'r') + text = f.read() + f.close() + lc.tw.canvas.draw_text(text, int(x), int(y), lc.body_height, int(w)) def draw_title(lc,title,x,y): lc.tw.canvas.draw_text(title,int(x),int(y),lc.title_height, @@ -977,7 +989,17 @@ def show(lc, string, center=False): lc.tw.canvas.draw_text(string,x,y,lc.tw.textsize,lc.tw.canvas.width-x) def play_sound(lc, audio): - play_audio(lc, audio) + if audio == "" or audio[6:] == "": + raise logoerror("#nomedia") + if lc.tw.running_sugar(): + if audio[6:] != "None": + try: + dsobject = datastore.get(audio[6:]) + play_audio(lc, dsobject.file_path) + except: + print "Couldn't open id: " + str(audio[6:]) + else: + play_audio(lc, audio[6:]) def clear(lc): stop_media(lc) diff --git a/taproject.py b/taproject.py index f8f4575..b5c1e12 100644 --- a/taproject.py +++ b/taproject.py @@ -41,8 +41,7 @@ from StringIO import StringIO import os.path from tacanvas import * -from talogo import stop_logo -from talogo import get_pixbuf_from_journal +from talogo import stop_logo, get_pixbuf_from_journal, movie_media_type try: from sugar.datastore import datastore except: @@ -184,29 +183,40 @@ def load_block(tw, b): blk = block.Block(tw.block_list, tw.sprite_list, btype, b[2]+tw.canvas.cx, b[3]+tw.canvas.cy, 'block', values) - - if btype in BOX_STYLE_MEDIA and blk.values[0] is not None: - if tw.running_sugar(): + # Some blocks get a skin. + if btype == 'nop': + if tw.nop == 'pythonloaded': + blk.spr.set_image(tw.media_shapes['pythonon'], 1, 17, 8) + else: + blk.spr.set_image(tw.media_shapes['pythonoff'], 1, 17, 8) + blk.spr.set_label(' ') + elif btype in BOX_STYLE_MEDIA and blk.values[0] is not None: + if btype == 'audio' or btype == 'description': + blk.spr.set_image(tw.media_shapes[btype+'on'], 1, 37, 6) + elif tw.running_sugar(): try: dsobject = datastore.get(blk.values[0]) - blk.spr.set_image(tw.media_shapes[shape_dict[btype+'on']], - 1, 17, 2) - if blk.name == 'journal': + if not movie_media_type(dsobject.file_path[-4:]): pixbuf = get_pixbuf_from_journal(dsobject, 80, 60) if pixbuf is not None: blk.spr.set_image(pixbuf, 1, 17, 2) dsobject.destroy() except: + blk.spr.set_image(tw.media_shapes['journalon'], 1, 37, 6) print "couldn't open dsobject (%s)" % (blk.values[0]) else: - pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(blk.values[0], 80, 60) - if pixbuf is not None: - blk.spr.set_image(pixbuf, 1, 17, 2) + if not movie_media_type(blk.values[0][-4:]): + pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(blk.values[0], + 80, 60) + if pixbuf is not None: + blk.spr.set_image(pixbuf, 1, 37, 6) else: - blk.spr.set_image(self.media_shapes['journalon'], 1, 17, 2) - print "couldn't open media object (%s)" % (blk.values[0]) + blk.spr.set_image(tw.media_shapes['journalon'], 1, 37, 6) blk.spr.set_label(' ') blk.resize() + elif btype in BOX_STYLE_MEDIA: + blk.spr.set_label(' ') + blk.spr.set_image(tw.media_shapes[btype+'off'], 1, 37, 6) blk.spr.set_layer(BLOCK_LAYER) return blk diff --git a/tawindow.py b/tawindow.py index 1a0b43d..44285ed 100644 --- a/tawindow.py +++ b/tawindow.py @@ -49,7 +49,9 @@ from gettext import gettext as _ from tahoverhelp import * from taproject import * from sprite_factory import SVG, svg_str_to_pixbuf -from talogo import lcNew, run_blocks, stop_logo, clear, doevalstep, showlabel +from talogo import lcNew, run_blocks, stop_logo, clear, doevalstep, showlabel,\ + display_coordinates, movie_media_type, audio_media_type,\ + get_pixbuf_from_journal from tacanvas import TurtleGraphics from sprites import Sprites, Sprite from block import Blocks, Block @@ -60,13 +62,9 @@ TurtleArt Window class abstraction """ class TurtleArtWindow(): - # Import from Journal for these blocks - importblocks = ['audiooff', 'descriptionoff','journal'] - # Time out for triggering help timeout_tag = [0] - def __init__(self, win, path, lang, parent=None): self._setup_initial_values(win, path, lang, parent) # TODO: most of this goes away @@ -290,8 +288,12 @@ class TurtleArtWindow(): def _setup_misc(self): # media blocks get positioned into other blocks for name in MEDIA_SHAPES: + if name[0:7] == 'journal' and self.running_sugar() is False: + filename = 'file'+name[7:] + else: + filename = name self.media_shapes[name] = \ - self._load_sprite_from_file("%s/%s.svg" % (self.path, name)) + self._load_sprite_from_file("%s/%s.svg" % (self.path, filename)) for i, name in enumerate(STATUS_SHAPES): self.status_shapes[name] = self._load_sprite_from_file( @@ -1030,25 +1032,30 @@ class TurtleArtWindow(): self._load_image(dsobject, blk) elif blk.name == 'audio': blk.spr.set_image(self.media_shapes['audioon'], - 1, 17, 2) + 1, 37, 6) else: blk.spr.set_image(self.media_shapes['decsriptionon'], - 1, 17, 2) + 1, 37, 6) blk.values[0] = dsobject.object_id dsobject.destroy() finally: chooser.destroy() del chooser else: - from taproject import _get_load_name fname = _get_load_name(self, '.*') if fname is None: return - pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(fname, 80, 60) - if pixbuf is not None: - blk.spr.set_image(pixbuf, 1, 17, 2) + if movie_media_type(fname[-4:]): + blk.spr.set_image(self.media_shapes['journalon'], 1, 37, 6) + elif blk.name == 'audio' or audio_media_type(fname[-4:]): + blk.spr.set_image(self.media_shapes['audioon'], 1, 37, 6) + blk.name = 'audio' + elif blk.name == 'description': + blk.spr.set_image(self.media_shapes['descriptionon'], 1, 37, 6) else: - blk.spr.set_image(self.media_shapes['journalon'], 1, 17, 2) + pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(fname, 80, 60) + if pixbuf is not None: + blk.spr.set_image(pixbuf, 1, 37, 6) blk.values[0] = fname blk.spr.set_label(' ') @@ -1056,12 +1063,11 @@ class TurtleArtWindow(): Replace Journal block graphic with preview image """ def _load_image(self, picture, blk): - from talogo import get_pixbuf_from_journal pixbuf = get_pixbuf_from_journal(picture, 80, 60) if pixbuf is not None: blk.spr.set_image(pixbuf, 1, 17, 2) else: - blk.spr.set_image(self.media_shapes['descon'], 1, 17, 2) + blk.spr.set_image(self.media_shapes['descriptionon'], 1, 37, 6) """ Run stack @@ -1231,10 +1237,6 @@ class TurtleArtWindow(): 'storeinbox2'): if d2type in CONTENT_BLOCKS: pass - # some blocks can take media, audio, movies, of descriptions - elif block1.name in ('containter'): - if d1type == 'audiooff' or d1type == 'journal': - pass else: return (100,100) if d1dir == d2dir: -- cgit v0.9.1