GSoC Application Review

Matěj Laitl matej at laitl.cz
Thu May 2 01:29:19 UTC 2013


On 2. 5. 2013 Anmol Ahuja wrote:
> Short description: My
> proposal aims at revamping the Amarok scripting interface, and adding an
> intuitive Script Creator graphical application allowing easy script
> creation by non-coders and coders alike. (...)

Please update the short description to match the proposal as it develops.


> Project Goals:
> 
>    Part I : Setting up Automating Documentation
>
>    Setup Doxygen for automatically generating the Scripting API
>    Documentation wiki content from in-source documentation.

I don't think that wiki will keep to be the hosting for the generated 
documentation. Much rather http://api.kde.org/extragear-api/multimedia-apidocs/amarok/html/ will be the target.

>             Bug 245647 <https://bugs.kde.org/show_bug.cgi?id=245647> -
>             Programmatic access to data objects in QtScript

Oh nice, this is actually the same idea I had with QueryMaker (simplified) 
interface.

> Implementation Details
> **
> QObjects can easily be accessed in QtScript, an ECMAScript based language,
> thanks to the Qt meta-object system. This can be achieved by passing them
> to QScriptEngine::newQObject(), resulting in a QtScript accessible
> QScriptValue with all of the QObject's public slots and signals, functions
> with the Q_INVOKABLE macro, named child objects, and Q_PROPERTY parameters
> (with SCRIPTABLE true) accessible in the script environment.
> **
> In Amarok script, only selected methods are exposed to the QtScript
> environment by creating QObject( and for prototypes, QScriptable ) -
> derived wrappers for the classes to be accessed via Amarok script, to avoid
> cluttering the scripting API and customizing behavior of Amarok classes to
> be script friendly. This gives complete control over functionality made
> available via the scripting API. These wrappers simply call the functions
> of the actual class they link to, which do the real work. So, instead of
> having to design Javascript equivalents of every class, only the wrapper
> QObjects must be made and exported.
> **
> I will be using the following QtScript classes in this GSoC project:
> **
>    -
>    QScriptable - For exposing Amarok classes like Collection,
>    CollectionLocation to the scripting environment. They will be exposed
> using QScriptable and QObject derived classes registered as protoypes via
> QScriptEngine::setDefaultPrototype(). The QScriptable derivation allows
> accessing the scriptable environment's context from within the C++ code,
> allowing access to the calling object and more.
>    -
>    QScriptEngine - Provides the environment for QtScript evaluation. Used
>    for setting custom protoypes of objects, setting global objects in the
>    scripting environment, etc.
> ***
>    -
>    Other basic classes, like:
>    -
>       QScriptContext for Javascript to C++ interaction, like accessing
>       function arguments, accessing the this pointer, etc.
>    -
>       QScriptValue : for translating objects back and forth between
>       QtScript and Qt/ C++.
> **
> Qt Script uses garbage collection to reclaim memory used by script objects
> when they are no longer needed, with this need being determined on the
> basis of the ownership parameter passed as the second argument to
> QScriptEngine::newQObject():
> 
> 1. Qt Ownership (default) - QObject owned by the C++ code, not the script
> engine. That is, it managed according to Qt's object ownership.
> 
> 2. Script ownership - Script engine fully owns the QObject, deleting it
> when there are no references to it in the script code.
> 
> 3. Auto-Ownership - Behaves like Script ownership when no parent, Qt
> Ownership otherwise.

Very, very nice (the whole section above). Although I'm not a QtScript expert, 
this clearly shows that you have a very good understanding of how it works.

> Here are class diagrams for some of the classes I plan on implementing, as
> detailed in the project goals:
> 
> 1. Collection Management and Manipulation
> (...)
> **
> The QueryMaker will be exposed in a simplified form via the QueryFilter
> class, which will use Collections::addTextualFilter and addDateFilter to
> allow the CollectionBrowser search widget like queries. For example:
> 
> title:"carry" AND artist:"Fun."

Well, I think you'll need the code to "decode" the query and I think you can 
just reuse the same exact code used in Collection Browser. (perhaps moving it 
to some shared place)

Otherwise nice.

> 2. AmarokScript::EngineController

I'd prefix the new methods relating to track with "current", e.g. 
currentTrackLength() so that it is clearer.

In summary a very good proposal, Anmol! It is clearly visible that you've put 
a lot of work into it and I think it pays off. :-)

	Matěj


More information about the Amarok-devel mailing list