Difference between revisions of "Development/Tutorials/Plasma4/JavaScript/DataEngine"

Jump to: navigation, search
(Add a data engine tutorial)
m (moved Development/Tutorials/Plasma/QtScript/DataEngine to Development/Tutorials/Plasma/JavaScript/DataEngine: Use the term "JavaScript" rather than "QtScript", because that's the term users know)
(No difference)

Revision as of 16:48, 7 July 2009


Now that you've seen how to create a QtScript plasmoid, we're going to move on to getting data into it.

Plasma has a data abstraction mechanism called data engines. You can ask for a data engine (by name), request a source from it (again, by name) and you get data back from it, usually either at fixed intervals or whenever it is updated. The data is a map (which is the same as an object in QtScript).

In this example, we'll get the local time from the time engine.


Create a directory for your plasmoid, and create a metadata.desktop file with the following contents (replacing the author and email information):

[Desktop Entry] Name=Yet Another Clock Comment=An example QtScript widget Icon=chronometer

Type=Service X-KDE-ServiceTypes=Plasma/Applet

X-Plasma-API=javascript X-Plasma-MainScript=code/main.js X-Plasma-DefaultSize=200,100

X-KDE-PluginInfo-Author=<Your name here> X-KDE-PluginInfo-Email=<Your email here> X-KDE-PluginInfo-Name=yet-another-clock X-KDE-PluginInfo-Version=1.0 X-KDE-PluginInfo-Website=http://plasma.kde.org/ X-KDE-PluginInfo-Category=Examples X-KDE-PluginInfo-Depends= X-KDE-PluginInfo-License=GPL X-KDE-PluginInfo-EnabledByDefault=true

For an explanation of these lines, see the getting started tutorial.

Main script

Create a contents/code/main.js file with the following contents:

layout = new LinearLayout(plasmoid);

label = new Label(); layout.addItem(label);

plasmoid.dataUpdate = function(name, data) { label.text = data.Time; }

plasmoid.dataEngine("time").connectSource("Local", plasmoid, 500);

There are two new things in this plasmoid. We've implemented plasmoid.dataUpdate, and connected a data engine source to it.

If you connect a data engine source to object, when there is an update for that source the method object.dataUpdate is called with two arguments: the name of the source and a map containing the data provided by the source.

In this case, plasmoid.dataUpdate gets called with "Local" as the first argument and the following object as the second argument (on my machine right now): {

   Timezone_Continent: 'Europe',
   Offset: 3600,
   Timezone: 'Europe/London',
   Time: new Date('Sun May 17 20:06:20 2009 GMT+0100'),
   Timezone_City: 'Guernsey'


The last line of the script does the actual connection. We select the "time" data engine and request the "Local" source from it, which provide the local time. We tell it to connect to the plasmoid object and force an update every 500ms (every half a second).

If we left off the last parameter to connectSource (ie: didn't provide an update interval), then the source would be updated when there was new data available. This doesn't make much sense for a clock, where the time is continually changing, so would actually get no updates at all if you did this. However, there are other data engines (such as the "soliddevice" engine) where you only want to be notified when something changed, and in this case you would leave off the update interval.

Pro tip: plasmaengineexplorer

To find out what engines are available and what sources they provide, run plasmaengineexplorer

You can choose from any of the installed data engines and request a source, including setting an update interval. Just remember that when you are reading the data in QtScript, spaces in the keys provided by the sources are replaced by underscores. So each source in the time engine provides a "Timezone Continent" key, but in QtScript you would access that as data.Timezone_Continent or data["Timezone_Continent"].

Testing it

If you have KDE 4.3 or later, you can now test your plasmoid without installing it by running plasmoidviewer /path/to/plasmoid

Note that with KDE 4.2, you will have to install the plasmoid first with: plasmapkg -i /path/to/plasmoid After that, you can run plasmoidviewer with the name of the plasmoid given by X-KDE-PluginInfo-Name in metadata.desktop. In this case: plasmoidviewer yet-another-clock


Run the following command from the directory that contains metadata.desktop: plasmapkg -i .

Now you can add it to your desktop. For packaging instructions, see the getting started tutorial.