[Sugar-devel] Object Chooser (selecting user-created audio objects from the Journal)
Art Hunkins
abhunkin at uncg.edu
Thu Dec 23 20:56:15 EST 2010
Aleksey: Thanks so much for your suggestions/corrections. And Walter: thanks
equally for posting these ideas to the wiki.
Aleksey: Please take a look at this further refinement of the Chooser
method:
def choose(self, widget):
chooser = ObjectChooser(parent=self, what_filter=mime.GENERIC_TYPE_AUDIO)
result = chooser.run()
if result == gtk.RESPONSE_ACCEPT:
self.jobject = chooser.get_selected_object()
self.path = str(self.jobject.get_file_path())
else:
self.jobject = None
self.path = "0"
It is essential that if the Journal is closed without a selection, that the
default values (for self.jobject and self.path) be reset.
Also, the user needs to be able to change his mind - to make a second
selection, as well as to revert to the default.
Is the above code a fairly good way of achieving this?
Also, I'd like to find a way to limit the selected Journal object to an
*audio* file, one included in mime.GENERIC_TYPE_AUDIO - and (likewise) to
revert to default values if such a selection is not made.
Do you see a fairly simple way of making such a "filter"? I'd rather not get
into specifying all specific file types (except, if feasible, to rule out
ogg speex).
Once again, thanks for your insights.
Art Hunkins
----- Original Message -----
From: "Aleksey Lim" <alsroot at member.fsf.org>
To: "Art Hunkins" <abhunkin at uncg.edu>
Cc: <Sugar-devel at lists.sugarlabs.org>
Sent: Wednesday, December 22, 2010 1:22 AM
Subject: Re: [Sugar-devel] Object Chooser (selecting user-created audio
objects from the Journal)
> On Tue, Dec 21, 2010 at 09:54:24PM -0500, Art Hunkins wrote:
>> I'd like to thank all those who helped me get Object Chooser in the
>> Journal
>> up and running in my FileMix activity. I'd also like to share my results,
>> in
>> case the code could be helpful to others.
>>
>> Excerpts follow:
>>
>> from sugar.graphics.objectchooser import ObjectChooser
>> from sugar import mime
>>
>> self.jname1 = "0"
>> self.jobject1 = 0
>>
>> if os.path.exists("/etc/fedora-release"):
>> release = open("/etc/fedora-release").read()
>> if release.find("OLPC release 9 ") == -1:
>> # Insert here code relevent to Sugar 0.84 and higher
>> # I use this to only display Object Chooser callback buttons only for >=
>> 0.84
>> # Clicking one of the displayed buttons calls the choose1 method
>>
>> def choose1(self, widget):
>> chooser = ObjectChooser(parent=self,
>> what_filter=mime.GENERIC_TYPE_AUDIO)
>> result = chooser.run()
>> if result == gtk.RESPONSE_ACCEPT:
>> jobject = chooser.get_selected_object()
>> if jobject and jobject.file_path:
>> self.jobject1 = jobject
>> self.jname1 = str(jobject.get_file_path())
>> else:
>> self.jname1 = "0"
>>
>>
>> Random observations:
>>
>> 1) I exclude Sugar 0.82 for two reasons (which means, unfortunately, "no
>> user soundfiles for 0.82"):
>
> Another useful way to check sugar version is:
>
> try:
> from jarabe import config
> version = [int(i) for i in config.version.split('.')][:2]
> except ImportError:
> version = [0, 82]
>
> if version >= [0, 84]:
> ...
>
>> a) its version of Object Chooser does not allow filtering for the audio
>> mime type;
>> b) Sugar 0.82's Csound (5.08) - or more specifically its version of
>> libsndfile - does not handle ogg vorbis soundfiles, the type that the
>> Record
>> activity creates. Record is the most likely/accessible means that
>> children
>> would use to create their own soundfiles. (The whole idea behind using
>> Object Chooser here is to select user files that have been placed in the
>> Journal [as Record does by default] for performance in FileMix.)
>> c) In addition, earlier versions of Record (<v64 or so) create ogg SPEEX
>> soundfiles; even the recent versions of Csound (actually, libsndfile) do
>> not
>> handle this (lo-fi) format.
>>
>> I found that a search for "OLPC release 9 " in /etc/fedora-release
>> identifies all current 0.82 incarnations of Sugar of which I'm aware.
>>
>> 2) jname1 stores the soundfile name (complete path); jobject1 stores the
>> object itself. This is key to being able (in Csound) to locate and load
>> the
>> selected soundfile. jname1 is then a channel opened to send the named
>> soundfile to Csound.
>
> You can make code more elegant by using only jobject1
> (and None initializer):
>
> self.jobject1 = None
> ...
> if result == gtk.RESPONSE_ACCEPT:
> ...
> self.jobject1 = jobject
> ...
>
> if self.jobject1 is not None:
> path = str(self.jobject1.get_file_path())
> ...
>
>> 3) If the user closes the Object Chooser box instead of clicking on a
>> sound
>> object, the result is not accepted, and jname1 reverts to "0" - which is
>> a
>> flag (in Csound) to revert to the default soundfile included in FileMix.
>>
>> 4) The str() cast for self.jname1 converts the filename to the usual path
>> format readable by Csound (this too is required).
>
> Yeah, I guess it is dbus string object... maybe we need to this type
> cast in sugar-toolkit code (though in most cases this casting should
> happen implicitly).
>
>>
>> Art Hunkins
>>
>> _______________________________________________
>> Sugar-devel mailing list
>> Sugar-devel at lists.sugarlabs.org
>> http://lists.sugarlabs.org/listinfo/sugar-devel
>>
>
> --
> Aleksey
More information about the Sugar-devel
mailing list