diff options
-rw-r--r--[-rwxr-xr-x] | activity/activity-smile.svg | 115 | ||||
-rwxr-xr-x | smile.py | 183 |
2 files changed, 183 insertions, 115 deletions
diff --git a/activity/activity-smile.svg b/activity/activity-smile.svg index 494ebfb..0049daa 100755..100644 --- a/activity/activity-smile.svg +++ b/activity/activity-smile.svg @@ -1,84 +1,33 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://web.resource.org/cc/" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="50" - height="50" - id="svg2" - sodipodi:version="0.32" - inkscape:version="0.45.1" - sodipodi:docname="activity-gui.svg" - sodipodi:docbase="/home/tony/Documents/Activities/GUIActivity.activity/activity" - inkscape:output_extension="org.inkscape.output.svg.inkscape"> - <metadata - id="metadata9"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <defs - id="defs7" /> - <sodipodi:namedview - inkscape:window-height="627" - inkscape:window-width="910" - inkscape:pageshadow="2" - inkscape:pageopacity="0.0" - guidetolerance="10.0" - gridtolerance="10.0" - objecttolerance="10.0" - borderopacity="1.0" - bordercolor="#666666" - pagecolor="#ffffff" - id="base" - inkscape:zoom="8.14" - inkscape:cx="25" - inkscape:cy="25" - inkscape:window-x="0" - inkscape:window-y="25" - inkscape:current-layer="svg2" /> - <rect - x="0.26289925" - y="2.3513515" - width="48" - height="48" - style="fill:#ffffff;stroke:#000000;stroke-width:2" - id="rect4" /> - <text - xml:space="preserve" - style="font-size:8px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" - x="8.7223587" - y="12.776413" - id="text2161"><tspan - sodipodi:role="line" - id="tspan2163" - x="8.7223587" - y="12.776413" /></text> - <text - xml:space="preserve" - style="font-size:14px;font-style:normal;font-weight:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" - x="10.687961" - y="3.6855037" - id="text2165"><tspan - sodipodi:role="line" - x="10.687961" - y="3.6855037" - id="tspan2169"></tspan><tspan - sodipodi:role="line" - x="10.687961" - y="21.185504" - id="tspan2162">Smi </tspan><tspan - sodipodi:role="line" - x="10.687961" - y="38.685504" - id="tspan2327">le </tspan></text> +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg> +<svg version="1.1" baseProfile="full" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid meet" zoomAndPan="magnify" + id="Test File" + viewBox="-21 -21 42 42" + width="800" + height="800"> + +<defs> +<radialGradient id="shine" + cx=".2" cy=".2" r=".5" fx=".2" fy=".2"> + <stop offset="0" stop-color="white" stop-opacity=".7"/> + <stop offset="1" stop-color="white" stop-opacity="0"/> +</radialGradient> +<radialGradient id="grad" + cx=".5" cy=".5" r=".5" > + <stop offset="0" stop-color="yellow"/> + <stop offset=".75" stop-color="yellow"/> + <stop offset=".95" stop-color="#ee0"/> + <stop offset="1" stop-color="#e8e800"/> +</radialGradient> + +</defs> + +<circle r="20" stroke="black" stroke-width=".15" fill="url(#grad)"/> +<circle r="20" fill="url(#shine)"/> +<g id="right"> + <ellipse rx="2.5" ry="4" cx="-6" cy="-7" fill="black"/> + <path fill="none" stroke="black" stroke-width=".5" stroke-linecap="round" d="M 10.6,2.7 a 4,4,0 0,0 4,3"/> +</g> +<use xlink:href="#right" transform="scale(-1,1)"/> +<path fill="none" stroke="black" stroke-width=".75" d="M -12,5 A 13.5,13.5,0 0,0 12,5 A 13,13,0 0,1 -12,5"/> </svg> @@ -3,6 +3,9 @@ # test ambulantglue import os, sys, time +import subprocess +from datetime import datetime +from time import strftime import pygtk pygtk.require('2.0') @@ -11,10 +14,11 @@ import gtk from sugar.activity import activity from sugar.datastore import datastore from sugar.graphics.toolbutton import ToolButton + import ambulantglue + from path import path import zipfile -import subprocess BASE = path("/media/0BF7-0F5D") / 'sandbox' DATASTORE = '/home/olpc/.sugar/default/datastore/store' @@ -22,6 +26,7 @@ DATAPATH = path(activity.get_activity_root()) / "data" ACTIVITYPATH = path(activity.get_bundle_path()) SMILPATH = ACTIVITYPATH / 'smils' BUNDLEPATH = DATAPATH / 'bundle' +DATEFORMAT = "%Y-%m-%d %H:%M:%S" SELECTTOOLBAR = 1 class SmileActivity(activity.Activity): @@ -29,7 +34,7 @@ class SmileActivity(activity.Activity): def __init__ (self, handle): activity.Activity.__init__(self, handle) self.set_title("Smile") - self.connect("destroy", self.destroy) + self.connect("destroy", self.set_exit) self.exit = False #setup chooser screen box = gtk.VBox(homogeneous=False) @@ -42,9 +47,9 @@ class SmileActivity(activity.Activity): self.chooserscreen = box # Create the standard activity toolbox; add our toolbar self.entry = gtk.Entry() - self.entry.connect("activate", self.set_smil) + self.entry.connect("activate", self.activate_cb) self.entry.show() - selectTB = SelectToolBar(self.chooser, self.play_cb, self.entry, self.choosebundle, self.destroy) + selectTB = SelectToolBar(self) self.toolbox = activity.ActivityToolbox(self) self.toolbox.add_toolbar("Select", selectTB) # Open with slideshow toolbar @@ -66,7 +71,7 @@ class SmileActivity(activity.Activity): while gtk.events_pending(): gtk.main_iteration() - def destroy(self): + def set_exit(self): self.exit = True def start(self): @@ -77,6 +82,16 @@ class SmileActivity(activity.Activity): self.player.play() self.destroy() + def pause_cb(self, widget): + self.player.pause() + + def stop_cb(self, widget): + self.player.stop() + + def activate_cb(self, widget): + #ignore + pass + def choosebundle(self, widget, source, pth): treeview = self.chooser.get_treeView() treeview.set_model(self.chooser.set_store(source, pth)) @@ -85,12 +100,6 @@ class SmileActivity(activity.Activity): self.chooserscreen.show_all() print 'choosebundle done' - def set_smil(self, widget): - print self.entry.get_text() - pth = BASE / self.entry.get_text() - print 'pth=', pth - self.start_smil(pth) - def read_file(self, file_path): print 'read_file:', file_path filepath = path(file_path) @@ -150,6 +159,94 @@ class SmileActivity(activity.Activity): src = filepath dst = BUNDLEPATH / 'image.bmp' path.copy(src, dst) + elif filepath.ext == '.ogg' or filepath.ext == '.oga': + self.doc = 'audioogg.smil' + src = SMILPATH / self.doc + dst = BUNDLEPATH + path.copy(src, dst) + src = filepath + dst = BUNDLEPATH / 'audio.ogg' + path.copy(src, dst) + elif filepath.ext == '.m4a': + self.doc = 'audiom4a.smil' + src = SMILPATH / self.doc + dst = BUNDLEPATH + path.copy(src, dst) + src = filepath + dst = BUNDLEPATH / 'audio.m4a' + path.copy(src, dst) + elif filepath.ext == '.mp3': + self.doc = 'audiomp3.smil' + src = SMILPATH / self.doc + dst = BUNDLEPATH + path.copy(src, dst) + src = filepath + dst = BUNDLEPATH / 'audio.mp3' + path.copy(src, dst) + elif filepath.ext == '.wav': + self.doc = 'audiowav.smil' + src = SMILPATH / self.doc + dst = BUNDLEPATH + path.copy(src, dst) + src = filepath + dst = BUNDLEPATH / 'audio.wav' + path.copy(src, dst) + elif filepath.ext == '.wma': + self.doc = 'audiowma.smil' + src = SMILPATH / self.doc + dst = BUNDLEPATH + path.copy(src, dst) + src = filepath + dst = BUNDLEPATH / 'audio.wma' + path.copy(src, dst) + elif filepath.ext == '.mpg': + self.doc = 'videompg.smil' + src = SMILPATH / self.doc + dst = BUNDLEPATH + path.copy(src, dst) + src = filepath + dst = BUNDLEPATH / 'video.mpg' + path.copy(src, dst) + elif filepath.ext == '.mov': + self.doc = 'videomov.smil' + src = SMILPATH / self.doc + dst = BUNDLEPATH + path.copy(src, dst) + src = filepath + dst = BUNDLEPATH / 'video.mov' + path.copy(src, dst) + elif filepath.ext == '.wmv': + self.doc = 'videowmv.smil' + src = SMILPATH / self.doc + dst = BUNDLEPATH + path.copy(src, dst) + src = filepath + dst = BUNDLEPATH / 'video.wmv' + path.copy(src, dst) + elif filepath.ext == '.avi': + self.doc = 'videoavi.smil' + src = SMILPATH / self.doc + dst = BUNDLEPATH + path.copy(src, dst) + src = filepath + dst = BUNDLEPATH / 'video.avi' + path.copy(src, dst) + elif filepath.ext == '.ogg': + self.doc = 'videoogg.smil' + src = SMILPATH / self.doc + dst = BUNDLEPATH + path.copy(src, dst) + src = filepath + dst = BUNDLEPATH / 'video.ogg' + path.copy(src, dst) + elif filepath.ext == '.mp4': + self.doc = 'videomp4.smil' + src = SMILPATH / self.doc + dst = BUNDLEPATH + path.copy(src, dst) + src = filepath + dst = BUNDLEPATH / 'video.mp4' + path.copy(src, dst) elif filepath.ext == '.smxo': z = zipfile.ZipFile(file_path, "r") for i in z.infolist(): @@ -173,7 +270,9 @@ class SmileActivity(activity.Activity): else: print 'unknown extension', filepath.ext, filepath #play smil document + self.entry.set_text(self.doc) self.start_smil(BUNDLEPATH / self.doc) + self.play_cb(self.doc) def start_smil(self, pth): self.set_canvas(self.playerscreen) @@ -184,10 +283,12 @@ class SmileActivity(activity.Activity): def on_activated(self, widget, row, col): print 'smxo on_activated' model = widget.get_model() - print 'row', model[row][0], model[row][1], model[row][2] + print 'row', model[row] title = model[row][1] - timestamp = model[row][2] + mime_type = model[row][2] + timestamp = model[row][3] object = datastore.get(model[row][0]) + object.destroy() fn = object.file_path print 'object filename', path(fn).exists(), fn #open slideshow, set Navigation toolbar current @@ -195,15 +296,18 @@ class SmileActivity(activity.Activity): class SelectToolBar(gtk.Toolbar): - def __init__(self, chooser, play_cb, entry, choosebundle, destroy): + def __init__(self, activity): gtk.Toolbar.__init__(self) - self.chooser = chooser + self.chooser = activity.chooser + entry = activity.entry + choosebundle = activity.choosebundle + set_exit = activity.set_exit #get mount points ds_mounts = datastore.mounts() pendrive = -1 for i in range(0, len(ds_mounts), 1): - print 'mount', i, ds_mounts[i]['uri'], ds_mounts[i]['title'], ds_mounts[i]['id'] + print 'mount', i, ds_mounts[i] if ds_mounts[i]['uri'].find('datastore') > 0: journal = i else: @@ -225,21 +329,26 @@ class SelectToolBar(gtk.Toolbar): self.show() self.playbutton = ToolButton('gtk-media-play') - self.playbutton.connect('clicked', play_cb) + self.playbutton.connect('clicked', activity.play_cb) self.playbutton.show() self.insert(self.playbutton, -1) + self.pausebutton = ToolButton('gtk-media-pause') + self.pausebutton.connect('clicked', activity.pause_cb) + self.pausebutton.show() + self.insert(self.pausebutton, -1) + + self.stopbutton = ToolButton('gtk-media-stop') + self.playbutton.connect('clicked', activity.stop_cb) + self.stopbutton.show() + self.insert(self.stopbutton, -1) + self.toolitem = gtk.ToolItem() self.toolitem.set_expand(True) self.toolitem.show() self.toolitem.add(entry) self.insert(self.toolitem, -1) - self.quitbutton = ToolButton('ooops') - self.quitbutton.connect('clicked', destroy) - self.quitbutton.show() - self.insert(self.quitbutton, -1) - def choosebundle(self, widget, source, pth): treeview = self.chooser.get_treeView() treeview.set_model(self.chooser.set_store(source, pth)) @@ -270,17 +379,21 @@ class Smxoview(gtk.VBox): column.set_sort_column_id(1) treeView.append_column(column) rendererText = gtk.CellRendererText() - column = gtk.TreeViewColumn("Date", rendererText, text=2) - column.set_sort_order(gtk.SORT_DESCENDING) + column = gtk.TreeViewColumn("Media", rendererText, text=2) column.set_sort_column_id(2) treeView.append_column(column) + rendererText = gtk.CellRendererText() + column = gtk.TreeViewColumn("Date", rendererText, text=3) + column.set_sort_order(gtk.SORT_DESCENDING) + column.set_sort_column_id(3) + treeView.append_column(column) def get_treeView(self): return self.treeView def set_store(self, mountpoint, pth): print 'set_store', mountpoint, pth - store = gtk.ListStore(str, str, str) + store = gtk.ListStore(str, str, str, str) #get objects from the local datastore media_list = [] media_list.append('application/x-smile') @@ -290,17 +403,23 @@ class Smxoview(gtk.VBox): media_list.append('image/bmp') media_list.append('image/gif') media_list.append('image/tiff') + media_list.append('audio/mp4') + media_list.append('application/ogg') + media_list.append('audio/mpeg') + media_list.append('audio/x-wav') + media_list.append('audio/x-ms-wma') + media_list.append('video/mpeg') + media_list.append('video/quicktime') + media_list.append('video/x-ms-wmv') + media_list.append('video/x-msvideo') + media_list.append('video/mp4') ds_objects, num_objects = datastore.find({'mountpoints':[mountpoint], 'mime_type': media_list}) for f in ds_objects: object = f.object_id title = f.metadata['title'] - try: - t = f.metadata['timestamp'] - except: - t = 0 - #timestamp = datetime.fromtimestamp(t) - timestamp = t - store.append([object, title, timestamp]) + mime_type = f.metadata['mime_type'] + date = f.metadata['mtime'].replace('T',' ') + store.append([object, title, mime_type, date]) f.destroy() print 'return smxo store', len(store) return store |