Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWalter Bender <walter@walter-laptop.(none)>2010-01-30 18:51:34 (GMT)
committer Walter Bender <walter@walter-laptop.(none)>2010-01-30 18:51:34 (GMT)
commit4744cb84201c2c04d37a7abb392fa5136f7a20ef (patch)
tree3d0db1d78ff7478e8a871540a7dbe0321614de88
parent190c0561dd9112ada5505b6b2daf48dc276f57db (diff)
lots of cleaning up of multimedia code
-rw-r--r--constants.py21
-rw-r--r--tagplay.py29
-rw-r--r--talogo.py96
-rw-r--r--taproject.py36
-rw-r--r--tawindow.py40
5 files changed, 125 insertions, 97 deletions
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: