Script - writeConfig with QVariant
El boulangero
elboulangero at gmail.com
Thu Mar 14 21:31:50 UTC 2013
Hi Matěj,
thanks for your reply.
I dug a little bit into the direction you pointed, but I'm not gonna
continue. Too difficult, sorry.
What I did is that I added a dummy argument to the function:
> - void writeConfig( String name, QVariant content )
which became:
> - void writeConfig( String name, QVariant content, int dummy )
With this I'm sure to pass into the right function. Then, I call it
from my javascript:
> var conf = { "test": "testing" };
> Amarok.Script.writeConfig("heho", conf, 0);
Then, in the amarok conf file, I have the "heho" variable, but the
value is empty !
After that, I tried to hack in the writeConfig function, create a new
QVariant with a simple string, and feed it to the
KConfigGroup::writeEntry( QString, QVariant ) function.
But then I got the following error from Amarok:
> KConfigGroup::writeEntry: KConfigGroup::writeEntry - unhandled type QVariantMap in group "Good Morning"
At this point I decided to stop, because I feel like I'm just trying
random things.
Thanks anyway for your reply,
Regards,
Arnaud
2013/3/14 Matěj Laitl <matej at laitl.cz>:
> On 13. 3. 2013 El boulangero wrote:
>> Hello everyone,
>
> Hi!
>
>> I writing a scritp for Amarok at the moment, and I have a question
>> regarding the Amarok.Script API.
>>
>> I understand perfectly the config function with string argument, ie:
>> - String readConfig( String name, String defaultValue )
>> - void writeConfig( String name, String content )
>>
>> But I'm curious about the two other ones, with QVariant argument:
>> - QVariant readConfig( String name, QVariant defaultValue )
>> - void writeConfig( String name, QVariant content )
>>
>> At first, I thought that with these functions, I could put my script config
>> in a JSON object, and save it in one call.
>>
>> For example:
>> > var defconfig = {
>> > "time": {
>> > "monday": {
>> > "enabled": "true",
>> > "value": "08:00:00"
>> > }
>> > }
>> > };
>> >
>> > Amarok.Script.writeConfig("", defconfig);
>>
>> But if I try that, I get the following error:
>> > Script error reported by: Good Morning TypeError: ambiguous call of
>> > overloaded function writeConfig(); candidates were
>> > writeConfig(QString,QVariant) writeConfig(QString,QString)
>>
>> Is there something else I should do in order to use these functions? Or
>> maybe I'm completely wrong, these functions are not suppose to be used with
>> JSON objects?
>
> First, bad news: QtScript bindings of Amarok are in rather unmaintained state.
> :-(
>
> Good news: you can fix them! :-)
>
> To answer your question: Your code is much probably right, but the Amarok part
> may have never worked, you've just first to shout loudly. To quote from [1]:
>> Like other C++ methods, meta-methods can be overloaded, and they can have
>> default arguments. The QtScript binding tries to ensure that the intended
>> overload is called. First, if there is an overload that expects precisely
>> as many arguments as were passed, that overload is selected. Second, if
>> there's more than one such overload, the decision is based on a heuristic
>> of how well the source (JS) argument types match with the target (C++)
>> argument types. If the heuristic doesn't help either, a TypeError is
>> thrown.
>
> The error you have seems to happen in the Javascript wrapper of
> AmarokScriptConfig class. What I suggest is that you rename QVariant variant of
> the writeConfig in src/scriptengine/AmarokScriptConfig.{h,cpp} method and see if
> it fixes your problem.
>
> You might encounter another problem that KConfigGroup::writeEntry( QString,
> QVariant ) doesn't support complex QVariants (those with containers in them),
> please consult its documentation and implementation.
>
> [1] http://trac.webkit.org/wiki/QtScript (probably best C++ <-> QtScript
> interaction documentation, better than official Qt doc)
>
> Regards,
> Matěj
More information about the Amarok
mailing list