<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://techbase.kde.org/skins/common/feed.css?0.2"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://techbase.kde.org/api.php?action=feedcontributions&amp;user=Sreich&amp;feedformat=atom</id>
		<title>KDE TechBase - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://techbase.kde.org/api.php?action=feedcontributions&amp;user=Sreich&amp;feedformat=atom"/>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Special:Contributions/Sreich"/>
		<updated>2013-06-20T01:45:13Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.20.2</generator>

	<entry>
		<id>http://techbase.kde.org/Thread:Talk:Policies/Licensing_Policy/license_comparison_online_website</id>
		<title>Thread:Talk:Policies/Licensing Policy/license comparison online website</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Thread:Talk:Policies/Licensing_Policy/license_comparison_online_website"/>
				<updated>2012-12-02T23:12:37Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: New thread: license comparison online website&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I'm linking this here, though i'd prefer to see it on the main page, because i think it gives a good breakdown of what can and can't be done with licenses, etc.&lt;br /&gt;
&lt;br /&gt;
http://www.tldrlegal.com/&lt;br /&gt;
&lt;br /&gt;
and i also don't want to lose this website link ;)&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma</id>
		<title>Development/Tutorials/Plasma</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma"/>
				<updated>2012-05-05T03:49:33Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* QML */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Plasma}}&lt;br /&gt;
&lt;br /&gt;
== QML ==&lt;br /&gt;
Plasmoids that use the QML (aka QtQuick) declarative language to describe their user interface while having the logic of the applet, in JavaScript (QML is essentially a forge between CSS and JavaScript). &lt;br /&gt;
&lt;br /&gt;
This is now the '''recommended''' method of creating plasmoids, where possible. The plasmoid, or applet serves as the visualization for the data which a Plasma::DataEngine contains.&lt;br /&gt;
&lt;br /&gt;
It allows easily the declaring of an interface and to easily create things like ListViews with native Plasma theming. It is what Plasma is leaning the most towards, especially in the Mobile, MediaCenter shells.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/QML/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in QML''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/QML/Basic_ListView|Basic List Plasmoid]]&lt;br /&gt;
:''Make a QML ListView which displays basic text objects as items. Utilizes native Plasma theming and animations.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/QML/API|API Reference]]&lt;br /&gt;
:''The QML Plasmoid API. Useful for referencing what is available in the runtime, what are the differences with the pure JavaScript ScriptEngine, the differences between pure Qt QML and Plasma, and as a study aid for the tutorials above.''&lt;br /&gt;
&lt;br /&gt;
== C++ ==&lt;br /&gt;
&lt;br /&gt;
=== Plasmoids ===&lt;br /&gt;
;[[Development/Tutorials/Plasma/GettingStarted|Getting Started With Plasmoids]]&lt;br /&gt;
:''Creating your first plasmoid in C++ with SVG background, icon and text''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/GettingStarted..Some_More|Getting Started With Plasmoids..Some more]] :''A few more starter's tips.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/UsingExtenders|How to use extenders in your Plasmoid]]&lt;br /&gt;
:''A simple example that shows how to use extenders in a Plasmoid.''&lt;br /&gt;
&lt;br /&gt;
;[http://www.linux-magazine.com/w3/issue/114/036-040_plasma.pdf Creating Plasmoids]&lt;br /&gt;
:''May 2010 article from Linux Magazine''&lt;br /&gt;
&lt;br /&gt;
;[http://www.ibm.com/developerworks/linux/library/l-kde-plasmoids/index.html Create Plasmoids using KDevelop]&lt;br /&gt;
:''Article explaining the structure of Plasma and how to create a Plasmoid''&lt;br /&gt;
&lt;br /&gt;
;[http://community.kde.org/User:Mxttie#Adding_configuration Adding configuration to your plasmoid]&lt;br /&gt;
:''Article explaining how to add a configuration dialog to your plasmoid.''&lt;br /&gt;
&lt;br /&gt;
=== DataEngines ===&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/DataEngines|Writing a DataEngine]]&lt;br /&gt;
:''DataEngines provide a standardized interface to various (read only) data sources for visualizations to use. Learn what a DataEngine is and how to write one of your own.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Services|Writing a Service]]&lt;br /&gt;
:''Services provide a standardized interface for visualizations to perform &amp;quot;write operations&amp;quot;. This can be for example, uploading pasted test to a pastebin service..''&lt;br /&gt;
&lt;br /&gt;
=== PackageStructures ===&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PackageStructure|Writing a PackageStructure Plugin]]&lt;br /&gt;
:''PackageStructure plugins allow custom Packages to be defined, installed, removed and listed as well as provide access their contents at runtime. Packages may contain any kind of data addons, including scripts.''&lt;br /&gt;
&lt;br /&gt;
=== Runners ===&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/AbstractRunner|Creating Runners]]&lt;br /&gt;
:''Runners are plugins that provide action-based search functionality in the Plasma workspace &amp;quot;run command&amp;quot; dialog. These plugins can be used by any application that links again libplasma.''&lt;br /&gt;
&lt;br /&gt;
=== Wallpapers ===&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/WallpaperHelloWorld|Wallpaper Tutorial 1]]&lt;br /&gt;
:''This tutorial shows you how to make a simple Hello World plasma wallpaper plugin.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/WallpaperConfiguration|Wallpaper Tutorial 2]]&lt;br /&gt;
:''This tutorial covers how to add configuration options to the wallpaper.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/WallpaperDoubleBuffer|Wallpaper Tutorial 3]]&lt;br /&gt;
:''This tutorial improves the wallpaper by using the so-called 'double buffer' technique.''&lt;br /&gt;
&lt;br /&gt;
=== Plasma Shells ===&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ShellDesign|Creating a Plasma Shell]]&lt;br /&gt;
:''This tutorial covers the essentials of writing a new Plasma shell from scratch. A must-read for anyone creating a new or modifying an existing Plasma Shell. Existing Plasma shells include Plasma Desktop, Plasma Netbook, Plasma Mobile, Plasma Media Center, Plasma Screensaver, Plasma KPart and Plasma KDM, and all follow the patterns documented here.''&lt;br /&gt;
&lt;br /&gt;
==  JavaScript ==&lt;br /&gt;
&lt;br /&gt;
Plasma has built-in JavaScript (also known as ECMAScript, and often referred to as QtScript in the context of Qt) scripting support without requiring any external dependencies.&lt;br /&gt;
&lt;br /&gt;
=== Plasmoids ===&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in JavaScript''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/DataEngine|Getting Data]]&lt;br /&gt;
:''How to retreive data from a data engine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/NowPlaying|Now Playing]]&lt;br /&gt;
:''Slightly more advanced data engine usage: displaying what's currently playing''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/SystemMonitor|System Monitor]]&lt;br /&gt;
:''How to access systemmonitor data engine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/CheatSheet|Cheat Sheet]]&lt;br /&gt;
:''A cheat sheet, rather than a tutorial, of things to remember and watch out for when developing JavaScript plasmoids''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/API|API Reference]]&lt;br /&gt;
:''The Simplified JavaScript Plasmoid API. Useful for referencing what is available in the runtime and as a study aid for the tutorials above.''&lt;br /&gt;
&lt;br /&gt;
=== Other Applications Of Javascript ===&lt;br /&gt;
;[[KDE_System_Administration/PlasmaDestkopScripting|Scripting Plasma Shells]]&lt;br /&gt;
:The KDE Plasma Desktop and Netbook provide means to manage the desktop shell (desktop, panels, widget) via scripts written in JavaScript. This article describes how to take advantage of this feature set as well as documents the full API. This is primarily a system administration tool, but may also be of interest to power users.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/Animations|Javascript Animations]]&lt;br /&gt;
:''How to write Animations using Javascript for use in Plasma applications''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ComicPlugin|Creating Comic Plugins]]&lt;br /&gt;
:''This guide shows you how to create a comic plugin for the comic plasmoid.''&lt;br /&gt;
&lt;br /&gt;
== Python ==&lt;br /&gt;
&lt;br /&gt;
=== Plasmoids ===&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Python''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Using DataEngines|Using DataEngines]]&lt;br /&gt;
:''How to use DataEngines from a plasmoid''&lt;br /&gt;
&lt;br /&gt;
=== DataEngines ===&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Writing DataEngines|Writing DataEngines]]&lt;br /&gt;
:''How to write your own Plasma DataEngine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonPlasmoid|Writing a Plasmoid in Python]]&lt;br /&gt;
:''Writing a simple battery graph in python''&lt;br /&gt;
&lt;br /&gt;
=== Runners ===&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonRunner|Writing a KRunner plugin in Python]]&lt;br /&gt;
:''Writing a simple krunner plugin in python''&lt;br /&gt;
&lt;br /&gt;
== Ruby ==&lt;br /&gt;
&lt;br /&gt;
=== Plasmoids ===&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Ruby''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/SimplePasteApplet|Writing a simple paste applet]]&lt;br /&gt;
:''A tutorial explaining how to set up a plasmoid, create a simple paste applet using widgets and add Plasma features seen elsewhere. Complete with tips for those who have never programmed before.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Blinker|Use SVG artwork in the simplest way possible]]&lt;br /&gt;
:''Follow a fellow student as he asks around about SVG usage and explains why the code examples work. This is a wiki so feel free to add your own insights until this tutorial can be considered complete.''&lt;br /&gt;
&lt;br /&gt;
=== DataEngines ===&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Writing DataEngines|Writing DataEngines]]&lt;br /&gt;
:''How to write your own Plasma DataEngine using Ruby''&lt;br /&gt;
&lt;br /&gt;
== Web Technologies (HTML/JS/CSS) ==&lt;br /&gt;
;[[Development/Tutorials/Plasma/Web/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in HTML''&lt;br /&gt;
&lt;br /&gt;
== Plasma integration for applications ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Solid_Device_Actions|Creating a Device Notifier action]]&lt;br /&gt;
:''When your application is interested in removable hardware''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ApplicationShell|Integrate Plasma in Applications]]&lt;br /&gt;
:''This tutorial shows you how to make an application dashboard based on Plasma technologies.''&lt;br /&gt;
&lt;br /&gt;
== Packages ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PackageOverview|Plasma Packages]]&lt;br /&gt;
:''An overview of what makes up a Plasma Package and what they are and can be used for.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PackageStructure|Writing a PackageStructure Pluginin C++]]&lt;br /&gt;
:''PackageStructure plugins allow custom Packages to be defined, installed, removed and listed as well as provide access their contents at runtime. Packages may contain any kind of data addons, including scripts.''&lt;br /&gt;
&lt;br /&gt;
== Themes ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Theme|Creating a Plasma Theme Quickstart]]&lt;br /&gt;
:''A quick guide to creating your first Plasma theme''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ThemeDetails|The Plasma Theme Structure In Detail]]&lt;br /&gt;
:''A comprehensive guide to the contents of a Plasma SVG theme, including configuration options, wallpapers, on-disk layout, names of all standard SVG files and every element in them.''&lt;br /&gt;
&lt;br /&gt;
== Activity Templates ==&lt;br /&gt;
&lt;br /&gt;
;[[KDE_System_Administration/PlasmaDesktopScripting#Activity_templates|Creating a Plasma Activity Template Quickstart]]&lt;br /&gt;
:''A quick guide to creating your first Plasma Activity Template''&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
* [[Projects/Plasma|Projects: Plasma]]&lt;br /&gt;
* [http://api.kde.org/4.x-api/kdelibs-apidocs/plasma/html/index.html Plasma api documentation]&lt;br /&gt;
* [http://techbase.kde.org/Projects/Plasma/Eclipse_Integration Plasma Eclipse Integration]&lt;br /&gt;
* The [https://mail.kde.org/mailman/listinfo/plasma-devel plasma-devel mailing list] and #plasma on IRC (irc.freenode.org).&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API-PlasmoidObject</id>
		<title>Development/Tutorials/Plasma/JavaScript/API-PlasmoidObject</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API-PlasmoidObject"/>
				<updated>2012-01-15T00:26:52Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* Properties */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= The Global plasmoid Object =&lt;br /&gt;
There is a global object available to the Plasmoid called, appropriately, &amp;quot;plasmoid&amp;quot;. It has a number of useful properties (some of which are read only, but many of which are read/write), functions, constant values and callbacks. Each are enumerated below.&lt;br /&gt;
All of those are valid for both JavaScript and QML bindings.&lt;br /&gt;
&lt;br /&gt;
= Callbacks  =&lt;br /&gt;
&lt;br /&gt;
See the section on Events above.&lt;br /&gt;
&lt;br /&gt;
There are some events that are generated by Plasma for the Plasmoid. These can often be caught by providing a function assigned to a specific name in the plasmoid object. For instance, to get notified of form factor changes, one would provide a formFactorChanged method as follows: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
plasmoid.formFactorChanged = function() { &lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;the form factor has changed to: &amp;quot; + plasmoid.formFactor())&lt;br /&gt;
&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following callbacks are used to notify the Plasmoid of changes in its running environment:&lt;br /&gt;
&lt;br /&gt;
* '''configChanged()'''&lt;br /&gt;
* '''currentActivityChanged()'''&lt;br /&gt;
* '''formFactorChanged()'''&lt;br /&gt;
* '''immutabilityChanged()'''&lt;br /&gt;
* '''locationChanged()'''&lt;br /&gt;
* '''sizeChanged()'''&lt;br /&gt;
&lt;br /&gt;
Other callbacks include:&lt;br /&gt;
* '''dataUpdated(String source, Map[String, Any] data)''': used to pass in DataEngine updates&lt;br /&gt;
* '''activate()''': called when the widget is activated by the user, e.g. by a keyboard shortcut. Useful for setting the focus on a specific input widget, for instance. (API v2)&lt;br /&gt;
* '''initExtenderItem(Extender extender)''': Called when an Extender should be set up. (API v2)&lt;br /&gt;
* '''popupEvent(boolean shown)''': called on PopupApplets when the popup is shown or hidden. (API v2)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In API v2, all of these callbacks can also be used as events. So, for instance, instead of implementing plasmoid.popupEvent, one could also write:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
plasmoid.addEventListener('popupEvent', function(shown) { print('shown? ' + shown) } )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
This would also suppress any calls to plasmoid.popupEvent.&lt;br /&gt;
&lt;br /&gt;
Further documentation on these callbacks can be found in the relevant sections below.&lt;br /&gt;
&lt;br /&gt;
= Environment  =&lt;br /&gt;
&lt;br /&gt;
A set of read-only properties (and in most cases notification functions) that tell the Plasmoid about its current environment: &lt;br /&gt;
&lt;br /&gt;
* '''apiVersion''': the integer version of the Simplified JavaScript API in the current execution environment; can be used to change behaviour or usage of functions depending on the version number.&lt;br /&gt;
&lt;br /&gt;
* '''formFactor''': one of Planar (e.g. on a desktop or in an application main view), Horizontal, Vertical or MediaCenter. When the form factor changes, the plasmoid.formFactorChanged function, if defined in the Plasmoid, is called.&lt;br /&gt;
&lt;br /&gt;
* '''size''': the size of the Plasmoid, expressed in QSizeF (explained below). when it changes, plasmoid.sizeChanged() will be called.&lt;br /&gt;
&lt;br /&gt;
* '''location''': one of Floating (no specific location), Desktop (on the application's main view are), FullScreen, LeftEdge, RightEdge, TopEdge or ButtomEdge. When the location changes, the plasmoid.locationChanged function, if defined in the Plasmoid, is called.&lt;br /&gt;
&lt;br /&gt;
* '''immutable''': this property is set to true when the Plasmoid is set to not be movable or otherwise changeable, and false otherwise. Configuration is still usually allowed in this state. When the immutability changes, the plasmoid.immutabilityChanged function, if defined in the Plasmoid, is called.&lt;br /&gt;
&lt;br /&gt;
* '''currentActivity''': the current contextual activity name. When the current activity changes, the plasmoid.currentActivityChanged function, if defined in the Plasmoid, is called.&lt;br /&gt;
&lt;br /&gt;
* '''shouldConserveResources''': true if the plasmoid should not be doing anything that would create too much draw on power, e.g. when on a device with low battery power it may be a good idea not to run a computationally expensive but optional animation&lt;br /&gt;
&lt;br /&gt;
* '''userConfiguring''': true if the user configuration interface is currently being displayed.&lt;br /&gt;
&lt;br /&gt;
= Properties  =&lt;br /&gt;
A set of read/write properties that allow the Plasmoid to set various visual or functional properties: &lt;br /&gt;
&lt;br /&gt;
* ''AspectRatioMode'' '''aspectRatioMode''': defines how to treat the aspect ratio of a Plasmoid when resizing it. See the [[http://lxr.kde.org/source/kde/kde-runtime/plasma/scriptengines/javascript/plasmoid/appletinterface.h#120|AspectRatioMode]] documentation for values and their meaning. &lt;br /&gt;
&lt;br /&gt;
* ''BackgroundHints'' '''backgroundHints''': defines how the background of the widget is rendered. See the [[#BackgroundHints|BackgroundHints]] documentation for values and their meaning. &lt;br /&gt;
&lt;br /&gt;
* ''boolean'' '''busy''': set to true when the Plasmoid is currently processing or waiting for data and the user interface should be blocked while doing so; will generally show a full-Plasmoid animated overlay to denote business&lt;br /&gt;
&lt;br /&gt;
= Geometry  =&lt;br /&gt;
&lt;br /&gt;
Read Only Properties: &lt;br /&gt;
&lt;br /&gt;
* ''QRectF'' '''rect''': the current rect of the Plasmoid; note that the top left may be not be the origin point (0,0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Functions: &lt;br /&gt;
&lt;br /&gt;
* '''resize(width, height)'''&lt;br /&gt;
* '''setMinimumSize(width, height)'''&lt;br /&gt;
* '''setPreferredSize(width, height)'''&lt;br /&gt;
* '''setBackgroundHints(background)''' - use '''NoBackground''' as value if you want to remove the default plasmoid background box.&lt;br /&gt;
* '''popupIcon(QIcon(&amp;quot;some icon&amp;quot;))''' - set icon to show when the plasmoid is added to the taskbar. NOTE if the plasmoid is made in QML, you MUST specify a default size for the main Item. This size will be used for the plasmoid when added to the taskbar&lt;br /&gt;
&lt;br /&gt;
= Painting and Layout  =&lt;br /&gt;
&lt;br /&gt;
To paint directly on to the canvas, a widget may implement the paintInterface function in the plasmoid object: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    plasmoid.paintInterface = function(painter) { /* painting code goes here*/ }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
See the Painting section below for information about helpful classes and functions that can be used when implementing a paintInterface function. &lt;br /&gt;
&lt;br /&gt;
Read/Write Properties: &lt;br /&gt;
&lt;br /&gt;
* ''Layout'' '''layout''': the QGraphicsLayout associated with the Plasmoid for laying out top level items; this property is read-write, though the property is not usually set as one can simply do &amp;quot;new LinearLayout&amp;quot; (or one of the other layout classes provided) and it will be automatically associated with the Plasmoid.&lt;br /&gt;
&lt;br /&gt;
Functions: &lt;br /&gt;
&lt;br /&gt;
* '''update()''': triggers a full repaint of the Plasmoid.&lt;br /&gt;
* '''update(QRectF rect)''' triggers a repaint of the rect area of the Plasmoid.&lt;br /&gt;
* '''failedToLaunch(bool failed[, string reason])''' sets the launch status of the Plasmoid; if set to true, the script will stop executing and the reason message, if any, will be displayed to the user.&lt;br /&gt;
&lt;br /&gt;
= Access To Packaged Files  =&lt;br /&gt;
&lt;br /&gt;
Functions: &lt;br /&gt;
&lt;br /&gt;
* ''string'' '''file(string type[, string fileName])''': returns the path to a file in the Plasmoid package of the given type, optionally with a file name to match, e.g. &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;var path = plasmoid.file(&amp;quot;mainscript&amp;quot;)&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
or &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;var pm = new QPixmap(plasmoid.file(&amp;quot;images&amp;quot;, &amp;quot;mypixmap.png&amp;quot;))&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* ''bool'' '''include(string filename)''': attempts to include the script defined from the package's code directory&lt;br /&gt;
&lt;br /&gt;
= Configuration Data  =&lt;br /&gt;
Configuration values can be defined using [[Development/Tutorials/Using_KConfig_XT|KConfig XT]] XML files in the {{path|contents/config/}} directory of the Plasmoid's package. The default file that is looked for and used is {{path|contents/config/main.xml}}.&lt;br /&gt;
&lt;br /&gt;
== Accessing Configuration Data  ==&lt;br /&gt;
Read-write properties:&lt;br /&gt;
* ''String'' '''activeConfig''': The current active configuration description. For instance, setting it to &amp;quot;foo&amp;quot; would cause the Plasmoid to try and reference the {{path|contents/config/foo.xml}} KConfigXT file. Setting this to an empty string will switch to the main.xml file.&lt;br /&gt;
&lt;br /&gt;
Functions:&lt;br /&gt;
* ''any'' '''readConfig(String key)''': reads the value from the configuration data for the given key as defined by the currently active configuration.&lt;br /&gt;
&lt;br /&gt;
* '''writeConfig(String key, any value) ''': writes a value to the configuration store under the given key&lt;br /&gt;
&lt;br /&gt;
== User Customization  ==&lt;br /&gt;
&lt;br /&gt;
User customization can be offered by providing a Qt Designer file called {{path|contents/ui/config.ui}} in the Plasmoid's package.&lt;br /&gt;
&lt;br /&gt;
Callbacks:&lt;br /&gt;
* '''configChanged()''': callback function called when the configuration is changed external to the Plasmoid, e.g. when the user changes settings in a configuration dialog.&lt;br /&gt;
&lt;br /&gt;
= Context menu =&lt;br /&gt;
&lt;br /&gt;
It's possible to add some items to the popup menu of the Plasmoid.&lt;br /&gt;
&lt;br /&gt;
Functions:&lt;br /&gt;
* '''setAction(String name, String text, String icon, String shortcut)''': adds an item to the context menu with the given text and icon; you need to define '''plasmoid.action_&amp;lt;name&amp;gt;''' function, where &amp;lt;name&amp;gt; is the first argument for setAction call, and this function will be called each time user clicks the item&lt;br /&gt;
* '''setActionSeparator(String name)''': (API v5) adds a separator item to the context menu&lt;br /&gt;
* '''removeAction(String name)''': removes the item with &amp;lt;name&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User:Sreich</id>
		<title>User:Sreich</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User:Sreich"/>
				<updated>2012-01-09T20:52:56Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: Created page with &amp;quot;{{FeatureInProgress|Plasma|Create hard disk activity plasmoid (to monitor I/O a la cpu, net)|shaun.reich@kdemail.net|Shaun Reich}}  {{FeatureTodo|Kate|Port sessions plasma applet...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FeatureInProgress|Plasma|Create hard disk activity plasmoid (to monitor I/O a la cpu, net)|shaun.reich@kdemail.net|Shaun Reich}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo|Kate|Port sessions plasma applet to QML|shaun.reich@kdemail.net|Shaun Reich}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{FeatureDone|Konqueror Sessions Applet|Port to QML|shaun.reich@kdemail.net|Shaun Reich}}&lt;br /&gt;
{{FeatureDone|Konsole Sessions Applet|Port to QML|shaun.reich@kdemail.net|Shaun Reich}}&lt;br /&gt;
{{FeatureTodo|KDevelop Sessions Applet|Create/Port to QML|shaun.reich@kdemail.net|Shaun Reich}}&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Schedules/KDE4/4.8_Feature_Plan</id>
		<title>Schedules/KDE4/4.8 Feature Plan</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Schedules/KDE4/4.8_Feature_Plan"/>
				<updated>2012-01-09T20:51:14Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: oops..added stuff to this 4.8 schedule, yet they're items only planned for 4.8/master, since 4.8 is frozen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a list of planned features for the SC 4.8 release. &lt;br /&gt;
&lt;br /&gt;
See also: &lt;br /&gt;
&lt;br /&gt;
*[[Schedules/KDE4/4.8 Release Schedule]] &lt;br /&gt;
*[[Schedules/KDE4/4.8 Release Goals]] &lt;br /&gt;
*[[Schedules/KDE4/4.7 Feature Plan]] (previous major release)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; Legend: &lt;br /&gt;
&lt;br /&gt;
*todo =&amp;amp;gt; not started yet &lt;br /&gt;
*in-progress =&amp;amp;gt; started, but not completed yet &lt;br /&gt;
*done =&amp;amp;gt; completed&lt;br /&gt;
&lt;br /&gt;
__TOC__ &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdelibs =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureDone|Kate Part|Line modification system|dhaumann@kde.org|Dominik Haumann}}&lt;br /&gt;
{{FeatureDone|Kate Part|Modeline Editor|dhaumann@kde.org|Dominik Haumann}}&lt;br /&gt;
{{FeatureDone|Kate Part|Reliable code folding|adrian.lungu89@gmail.com|Adrian Lungu}}&lt;br /&gt;
{{FeatureDone|Kate Part|Improved vi input mode|svatoslav1@gmail.com|Svyatoslav Kuzmich}}&lt;br /&gt;
{{FeatureInProgress|KIO|PreviewJob supports URLs|sebas@kde.org|Sebastian Kügler}}&lt;br /&gt;
{{FeatureInProgress|kdeui|KSecretsService API addition|kde@rusu.info|Valentin Rusu}}&lt;br /&gt;
{{FeatureInProgress|kdeui/util|Connect KWallet class to KSecretsService client API|kde@rusu.info|Valentin Rusu}}&lt;br /&gt;
{{FeatureInProgress|kcookiejar|New domain specific cookie policy based on patch provided in bug#54300|adawit@kde.org|Dawit A.}} &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kde-runtime =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|ksecretsserviced|KSecretsService daemon implementing the freedesktop.org secrets API. KDE applications will want to use the related kdelibs API (see below)|kde@rusu.info|Valentin Rusu}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|DrKonqi|Better duplicate detection|mat69@gmx.net|Matthias Fuchs}}&lt;br /&gt;
{{FeatureInProgress|KIO Thumbnails|webthumbnails plugin|sebas@kde.org|Sebastian Kügler}}&lt;br /&gt;
{{FeatureInProgress|DrKonqi|Scripting support|mat69@gmx.net|Matthias Fuchs}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Plasma QML QtComponents|mart@kde.org|Marco Martin}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kde-workspace =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureTodo|KWin|Activity switcher|wstephenson@kde.org|Will Stephenson}}&lt;br /&gt;
{{FeatureTodo|Plasma|Activity UI improvements|wstephenson@kde.org|Will Stephenson}}&lt;br /&gt;
{{FeatureInProgress|KWin|Take over screensaver/locking management from KRunner|alex.merry@kdemail.net|Alex Merry}}&lt;br /&gt;
{{FeatureDone|KCM|make mouse cursor size configurable (http://git.reviewboard.kde.org/r/101701/)|SommerLuk@gmail.com|Lukas Sommer}}&lt;br /&gt;
{{FeatureDone|powerdevil|Remove Desktop Effects Management|drf@kde.org|Dario Freddi}}&lt;br /&gt;
{{FeatureDone|powerdevil|Allow static profiles only|drf@kde.org|Dario Freddi}}&lt;br /&gt;
{{FeatureDone|powerdevil|Allow activity interaction|drf@kde.org|Dario Freddi}}&lt;br /&gt;
{{FeatureDone|Plasma|Add MPRIS2 support to nowplaying|alex.merry@kdemail.net|Alex Merry}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Allow task grouping on the taskbar to work together with kwin window tabbing|akreuzkamp@web.de|Anton Kreuzkamp}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Merge the QML version of the device notifier|mart@kde.org|Marco Martin}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Merge the QML version of the battery applet|mart@kde.org|Marco Martin}}&lt;br /&gt;
{{FeatureDone|KWin|QML based Window switcher (Tabbox)|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureInProgress|KWin|Texture Rectangle ARB support in Shaders|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureInProgress|KWin|No Compositor restart on screen change|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureInProgress|KWin|Initial Wayland support|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureDone|KWin|Support for thumbnails in QML|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureDone|KWin|Add AnimationEffect class|thomas.luebking@gmail.com|Thomas Lübking}}&lt;br /&gt;
{{FeatureInProgress|KWin|Option to prefer the mouse position over the focus chain|thomas.luebking@gmail.com|Thomas Lübking}}&lt;br /&gt;
{{FeatureDone|KWin|More cleanup in the window rules kcm|thomas.luebking@gmail.com|Thomas Lübking}}&lt;br /&gt;
{{FeatureInProgress|KWin|Trade 1 frame lag for deterministic framerate|thomas.luebking@gmail.com|Thomas Lübking}}&lt;br /&gt;
{{FeatureInProgress|KWin|Improved resizing of windows with thin or no borders|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
{{FeatureInProgress|KWin|Move Workspace's compositing functionality to own class Compositor|a.arlt@stud.uni-heidelberg.de|Arthur Arlt}}&lt;br /&gt;
{{FeatureInProgress|KWin|Introduce class DecorationPaintRedirector for decoration handling when Compositing is active|a.arlt@stud.uni-heidelberg.de|Arthur Arlt}}&lt;br /&gt;
{{FeatureInProgress|Screenlocker|New Screenlocker and daemon|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureDone|Plasma|Merge IconTask's taskmanager changes|craig@kde.org|Craig Drummond}}&lt;br /&gt;
{{FeatureDone|KCM|Allow flag and label in keyboard layout indicator|arysin@gmail.com|Andriy Rysin}}&lt;br /&gt;
{{FeatureInProgress|KSplash|QML based ksplash|mart@kde.org|Marco Martin/Ivan Čukić}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kde-baseapps =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|Dolphin|Implement new view-engine for Dolphin 2.0 (see http://ppenz.blogspot.com/2011/08/introducing-dolphin-20.html)|peter.penz19@gmail.com|Peter Penz}}&lt;br /&gt;
{{FeatureTodo|Dolphin|Implement support for back/forward mouse buttons|sebasti@n-doerner.de|Sebastian Dörner}}&lt;br /&gt;
{{FeatureDone|Kate|Search &amp;amp; Replace in files plugin|kare.sars@iki.fi|Kåre Särs}}&lt;br /&gt;
{{FeatureInProgress|Kate|Make GDB target selection behave like the build plugin |kare.sars@iki.fi|Kåre Särs}}&lt;br /&gt;
{{FeatureInProgress|Kate|Add convenience options for remote debugging|kare.sars@iki.fi|Kåre Särs}}&lt;br /&gt;
{{FeatureDone|Settings|Improve proxy configuration dialog|adawit@kde.org|Dawit Alemayehu}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeedu  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|KTouch|New organisation of keyboard and lecture files according to languages|peter.ruethemann@gmail.com|Rüthemann Peter}}&lt;br /&gt;
{{FeatureInProgress|KTouch|New organisation of menu system: Training, Statistic, Settings|peter.ruethemann@gmail.com|Rüthemann Peter}}&lt;br /&gt;
{{FeatureTodo|KTouch|End of lecture statistics|peter.ruethemann@gmail.com|Rüthemann Peter}}&lt;br /&gt;
{{FeatureDone|Rocs|Alignment Actions to minimize crossing graph edges|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureTodo|Rocs|Project Files to combine graphs and algorithms|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureDone|Rocs|Context menu for graph scene|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureDone|Rocs|Resurrect import-/export-features|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureDone|Rocs|User Interface Cleanup|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureDone|Cantor|Add Qalculate backend|matteo@agostinelli.me|Matteo Agostinelli}}&lt;br /&gt;
{{FeatureInProgress|Cantor|Add Scilab backend|filip.saraiva@gmail.com|Filipe Saraiva}}&lt;br /&gt;
{{FeatureDone|Marble|Marble Runner plugins for Parsing files|tgridel@freedotfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureDone|Marble|(GSoC) OSM file rendering|oblaukhov.konstantin@gmail.com|Konstantin Oblaukhov}}&lt;br /&gt;
{{FeatureDone|Marble|Marble Graphics Scene (Performance of Vector Drawing)|oblaukhov.konstantin@gmail.com|Konstantin Oblaukhov}}&lt;br /&gt;
{{FeatureDone|Marble|Gps Info Plugin|tgridel@freedotfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureDone|Marble|Improve LatLonEdit to allow input as Radian and DM|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureInProgress|Marble|Marble Touch (GSoC, Marble on MeeGo/N9)|earthwings@gentoo.org|Daniel Marth, Dennis Nienhüser}}&lt;br /&gt;
{{FeatureDone|Marble|Routing API|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureInProgress|Marble|Adjustable Map Orientation (Rotation in Screen Plane)|bbeschow@cs.tu-berlin.de|Bernhard Beschow}}&lt;br /&gt;
{{FeatureDone|Marble|Speedometer Plugin|bbeschow@cs.tu-berlin.de|Bernhard Beschow}}&lt;br /&gt;
{{FeatureDone|Marble|Plasma Runner for geo coords and Marble bookmarks|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureDone|Marble|Make bookmark editor support editing the lonlat coordinates|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureDone|Marble|Fix GeoDataCoordinates parsing from a QString|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureDone|Marble|OsmNominatim improved display|tgridel@freedorfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureTodo|Marble|Create New Marble About Dialog|rahn@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureTodo|Marble|Add Float Item Management|rahn@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureTodo|Marble|New Search|rahn@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureInProgress|Marble|Make API more QML-friendly|bbeschow@cs.tu-berlin.de|Bernhard Beschow}}&lt;br /&gt;
{{FeatureTodo|KTurtle|Add modulo command|nielsslot@gmaildotcom|Niels Slot}}&lt;br /&gt;
{{FeatureDone|KGeography|Merge stuff from the cherry_field branch|aacid@kde.org|Albert Astals Cid}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdegames=&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|Libkdegames|Improve graphics performance in all games by standardizing on the use of Qt Raster Graphics.|stefan.majewsky@googlemail.com|Stefan Majewsky}}&lt;br /&gt;
{{FeatureDone|KSudoku|Add a new generator and solver to KSudoku, based on published algorithms. This will provide a full range of puzzle difficulties, rather than mainly easy puzzles, and will address bug 217925 and its duplicates 228614 and 237262 (now nearly two years old).|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KSudoku|Re-implement the puzzle-symmetry feature.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KSudoku|Re-order the puzzle types on the welcome screen.  Use KDE Games Difficulty combo-box instead of a slider. Save user's choices of puzzle between sessions.  Do minor tidy-ups of the user interface.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KGoldrunner|Add the championship level &amp;quot;Gold Rush&amp;quot; game, with Traditional rules, contributed by Gabriel Miltschitzky.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KGoldrunner|Add the championship level &amp;quot;Jail Break&amp;quot; game, with KGoldrunner rules, contributed by Gabriel Miltschitzky.|iandw.au@gmail.com|Ian Wadham}}|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdegraphics=&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureInProgress|Okular|Reset Form Action support|aacid@kde.org|Albert Astals Cid}}&lt;br /&gt;
{{FeatureDone|Okular|Viewer Mode &amp;amp; Interface.|michel.ludwig@kdemail.net|Michel Ludwig}}&lt;br /&gt;
{{FeatureDone|Okular|Table selection tool improvements|aacid@kde.org|Albert Astals Cid}}&lt;br /&gt;
{{FeatureInProgress|Gwenview|Animated image transitions|agateau@kde.org|Aurélien Gâteau}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdemultimedia =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo|JuK|MPRIS2 support|alex.merry@kdemail.net|Alex Merry}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdenetwork=&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureInProgress|KGet|Better interaction for torrents if they are seeding and other downloads stopped because of that|mat69@gmx.net|Matthias Fuchs}}&lt;br /&gt;
{{FeatureInProgress|KGet|Class that handles deleting files|mat69@gmx.net|Matthias Fuchs}}&lt;br /&gt;
{{FeatureInProgress|Kopete|Akonadi History Plugin |roideuniverse@gmail.com|Kaushik Saurabh}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdepim  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo&lt;br /&gt;
|attachment:/ kio-slave&lt;br /&gt;
|Implement kio-slave to access (email) attachments in Akonadi&lt;br /&gt;
|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|KAlarm|Port to Akonadi|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo&lt;br /&gt;
|sieve: implement wizard&lt;br /&gt;
|Implement wizard to help user to create sieve script&lt;br /&gt;
|montel@kde.org|Montel Laurent}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureDone&lt;br /&gt;
|HTML Replies&lt;br /&gt;
|Give messagecomposer (especially for KMail) the ability to compose replies in HTML&lt;br /&gt;
|nyblom@kde.org|Torgny Nyblom}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|KMail import|KMail1 setup import instead of migration|krammer@kde.org|Kevin Krammer}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|Agent control workspace integration|Monitoring and control of Akonadi agents through Plasma workspace facilitites|krammer@kde.org|Kevin Krammer}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeplasma-addons =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|Kimpanel|Port kimpanel to DataEngine based one|wengxt@gmail.com|Xuetian Weng}}&lt;br /&gt;
{{FeatureDone|IconTasks|Import IconTasks|craig@kde.org|Craig Drummond}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdesdk  =&lt;br /&gt;
&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureTodo|Okteta|Add a general KPart adapter to Kasten, than finish port of Okteta KPart to Okteta Kasten|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add global toggle option for the offset display, hex or decimal|kossebau@kde.org|Friedrich W. H. Kossebau}} &lt;br /&gt;
{{FeatureTodo|Okteta|Add Kate-like combined dialogs to query for actions on files|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add Kate-like search tool|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add Okular like embedded notifications|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for import by drop, both url and data|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for memory mapping of files and 64-bit addressing|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for jobs like io, printing, string search or filter|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add view profiles, incl. editor/manager|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|copy again puts also a value or char variant of the data to clipboard|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Improve the titels of the changes to the bytearray to be more descriptive, best using ids to avoid text string|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Make all user interaction in the KastenCore managers plugin-based|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Merge row and column widgets into one|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Store bookmarks|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Store bookmarks and other view settings for next load|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add custom datatypes to structures tool|alex.richardson@gmx.de|Alex Richardson}}&lt;br /&gt;
{{FeatureDone|Okteta|Add Flags Datatype to structures tool|alex.richardson@gmx.de|Alex Richardson}}&lt;br /&gt;
{{FeatureInProgress|dolphin-plugins|Mercurial plugin for Dolphin|vishesh3y@gmail.com|Vishesh Yadav}}&lt;br /&gt;
{{FeatureDone|KCachegrind|Upgrade interface to Callgrind (use callgrind_control instead of writing a command file, for &amp;gt; VG 3.7.x)|Josef.Weidendorfer@gmx.de|Josef Weidendorfer}} &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeutils=&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|ark|Allow Ark to be used as a KPart again|rakuco@FreeBSD.org|Raphael Kubo da Costa}}&lt;br /&gt;
{{FeatureInProgress|ksecrets|A suite of tools related to the KSecretsService infrastructure|kde@rusu.info|Valentin Rusu}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Schedules/KDE4/4.8_Feature_Plan</id>
		<title>Schedules/KDE4/4.8 Feature Plan</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Schedules/KDE4/4.8_Feature_Plan"/>
				<updated>2012-01-09T20:47:13Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* kde-baseapps */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a list of planned features for the SC 4.8 release. &lt;br /&gt;
&lt;br /&gt;
See also: &lt;br /&gt;
&lt;br /&gt;
*[[Schedules/KDE4/4.8 Release Schedule]] &lt;br /&gt;
*[[Schedules/KDE4/4.8 Release Goals]] &lt;br /&gt;
*[[Schedules/KDE4/4.7 Feature Plan]] (previous major release)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; Legend: &lt;br /&gt;
&lt;br /&gt;
*todo =&amp;amp;gt; not started yet &lt;br /&gt;
*in-progress =&amp;amp;gt; started, but not completed yet &lt;br /&gt;
*done =&amp;amp;gt; completed&lt;br /&gt;
&lt;br /&gt;
__TOC__ &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdelibs =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureDone|Kate Part|Line modification system|dhaumann@kde.org|Dominik Haumann}}&lt;br /&gt;
{{FeatureDone|Kate Part|Modeline Editor|dhaumann@kde.org|Dominik Haumann}}&lt;br /&gt;
{{FeatureDone|Kate Part|Reliable code folding|adrian.lungu89@gmail.com|Adrian Lungu}}&lt;br /&gt;
{{FeatureDone|Kate Part|Improved vi input mode|svatoslav1@gmail.com|Svyatoslav Kuzmich}}&lt;br /&gt;
{{FeatureInProgress|KIO|PreviewJob supports URLs|sebas@kde.org|Sebastian Kügler}}&lt;br /&gt;
{{FeatureInProgress|kdeui|KSecretsService API addition|kde@rusu.info|Valentin Rusu}}&lt;br /&gt;
{{FeatureInProgress|kdeui/util|Connect KWallet class to KSecretsService client API|kde@rusu.info|Valentin Rusu}}&lt;br /&gt;
{{FeatureInProgress|kcookiejar|New domain specific cookie policy based on patch provided in bug#54300|adawit@kde.org|Dawit A.}} &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kde-runtime =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|ksecretsserviced|KSecretsService daemon implementing the freedesktop.org secrets API. KDE applications will want to use the related kdelibs API (see below)|kde@rusu.info|Valentin Rusu}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|DrKonqi|Better duplicate detection|mat69@gmx.net|Matthias Fuchs}}&lt;br /&gt;
{{FeatureInProgress|KIO Thumbnails|webthumbnails plugin|sebas@kde.org|Sebastian Kügler}}&lt;br /&gt;
{{FeatureInProgress|DrKonqi|Scripting support|mat69@gmx.net|Matthias Fuchs}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Plasma QML QtComponents|mart@kde.org|Marco Martin}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kde-workspace =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureTodo|KWin|Activity switcher|wstephenson@kde.org|Will Stephenson}}&lt;br /&gt;
{{FeatureTodo|Plasma|Activity UI improvements|wstephenson@kde.org|Will Stephenson}}&lt;br /&gt;
{{FeatureInProgress|KWin|Take over screensaver/locking management from KRunner|alex.merry@kdemail.net|Alex Merry}}&lt;br /&gt;
{{FeatureDone|KCM|make mouse cursor size configurable (http://git.reviewboard.kde.org/r/101701/)|SommerLuk@gmail.com|Lukas Sommer}}&lt;br /&gt;
{{FeatureDone|powerdevil|Remove Desktop Effects Management|drf@kde.org|Dario Freddi}}&lt;br /&gt;
{{FeatureDone|powerdevil|Allow static profiles only|drf@kde.org|Dario Freddi}}&lt;br /&gt;
{{FeatureDone|powerdevil|Allow activity interaction|drf@kde.org|Dario Freddi}}&lt;br /&gt;
{{FeatureDone|Plasma|Add MPRIS2 support to nowplaying|alex.merry@kdemail.net|Alex Merry}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Allow task grouping on the taskbar to work together with kwin window tabbing|akreuzkamp@web.de|Anton Kreuzkamp}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Merge the QML version of the device notifier|mart@kde.org|Marco Martin}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Merge the QML version of the battery applet|mart@kde.org|Marco Martin}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Create hard disk activity plasmoid (to monitor I/O a la cpu, net)|shaun.reich@kdemail.net|Shaun Reich}}&lt;br /&gt;
{{FeatureDone|KWin|QML based Window switcher (Tabbox)|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureInProgress|KWin|Texture Rectangle ARB support in Shaders|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureInProgress|KWin|No Compositor restart on screen change|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureInProgress|KWin|Initial Wayland support|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureDone|KWin|Support for thumbnails in QML|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureDone|KWin|Add AnimationEffect class|thomas.luebking@gmail.com|Thomas Lübking}}&lt;br /&gt;
{{FeatureInProgress|KWin|Option to prefer the mouse position over the focus chain|thomas.luebking@gmail.com|Thomas Lübking}}&lt;br /&gt;
{{FeatureDone|KWin|More cleanup in the window rules kcm|thomas.luebking@gmail.com|Thomas Lübking}}&lt;br /&gt;
{{FeatureInProgress|KWin|Trade 1 frame lag for deterministic framerate|thomas.luebking@gmail.com|Thomas Lübking}}&lt;br /&gt;
{{FeatureInProgress|KWin|Improved resizing of windows with thin or no borders|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
{{FeatureInProgress|KWin|Move Workspace's compositing functionality to own class Compositor|a.arlt@stud.uni-heidelberg.de|Arthur Arlt}}&lt;br /&gt;
{{FeatureInProgress|KWin|Introduce class DecorationPaintRedirector for decoration handling when Compositing is active|a.arlt@stud.uni-heidelberg.de|Arthur Arlt}}&lt;br /&gt;
{{FeatureInProgress|Screenlocker|New Screenlocker and daemon|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureDone|Plasma|Merge IconTask's taskmanager changes|craig@kde.org|Craig Drummond}}&lt;br /&gt;
{{FeatureDone|KCM|Allow flag and label in keyboard layout indicator|arysin@gmail.com|Andriy Rysin}}&lt;br /&gt;
{{FeatureInProgress|KSplash|QML based ksplash|mart@kde.org|Marco Martin/Ivan Čukić}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kde-baseapps =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|Dolphin|Implement new view-engine for Dolphin 2.0 (see http://ppenz.blogspot.com/2011/08/introducing-dolphin-20.html)|peter.penz19@gmail.com|Peter Penz}}&lt;br /&gt;
{{FeatureTodo|Dolphin|Implement support for back/forward mouse buttons|sebasti@n-doerner.de|Sebastian Dörner}}&lt;br /&gt;
{{FeatureDone|Kate|Search &amp;amp; Replace in files plugin|kare.sars@iki.fi|Kåre Särs}}&lt;br /&gt;
{{FeatureInProgress|Kate|Make GDB target selection behave like the build plugin |kare.sars@iki.fi|Kåre Särs}}&lt;br /&gt;
{{FeatureInProgress|Kate|Add convenience options for remote debugging|kare.sars@iki.fi|Kåre Särs}}&lt;br /&gt;
{{FeatureDone|Settings|Improve proxy configuration dialog|adawit@kde.org|Dawit Alemayehu}}&lt;br /&gt;
{{FeatureTodo|Kate|Port sessions plasma applet to QML|shaun.reich@kdemail.net|Shaun Reich}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeedu  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|KTouch|New organisation of keyboard and lecture files according to languages|peter.ruethemann@gmail.com|Rüthemann Peter}}&lt;br /&gt;
{{FeatureInProgress|KTouch|New organisation of menu system: Training, Statistic, Settings|peter.ruethemann@gmail.com|Rüthemann Peter}}&lt;br /&gt;
{{FeatureTodo|KTouch|End of lecture statistics|peter.ruethemann@gmail.com|Rüthemann Peter}}&lt;br /&gt;
{{FeatureDone|Rocs|Alignment Actions to minimize crossing graph edges|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureTodo|Rocs|Project Files to combine graphs and algorithms|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureDone|Rocs|Context menu for graph scene|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureDone|Rocs|Resurrect import-/export-features|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureDone|Rocs|User Interface Cleanup|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureDone|Cantor|Add Qalculate backend|matteo@agostinelli.me|Matteo Agostinelli}}&lt;br /&gt;
{{FeatureInProgress|Cantor|Add Scilab backend|filip.saraiva@gmail.com|Filipe Saraiva}}&lt;br /&gt;
{{FeatureDone|Marble|Marble Runner plugins for Parsing files|tgridel@freedotfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureDone|Marble|(GSoC) OSM file rendering|oblaukhov.konstantin@gmail.com|Konstantin Oblaukhov}}&lt;br /&gt;
{{FeatureDone|Marble|Marble Graphics Scene (Performance of Vector Drawing)|oblaukhov.konstantin@gmail.com|Konstantin Oblaukhov}}&lt;br /&gt;
{{FeatureDone|Marble|Gps Info Plugin|tgridel@freedotfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureDone|Marble|Improve LatLonEdit to allow input as Radian and DM|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureInProgress|Marble|Marble Touch (GSoC, Marble on MeeGo/N9)|earthwings@gentoo.org|Daniel Marth, Dennis Nienhüser}}&lt;br /&gt;
{{FeatureDone|Marble|Routing API|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureInProgress|Marble|Adjustable Map Orientation (Rotation in Screen Plane)|bbeschow@cs.tu-berlin.de|Bernhard Beschow}}&lt;br /&gt;
{{FeatureDone|Marble|Speedometer Plugin|bbeschow@cs.tu-berlin.de|Bernhard Beschow}}&lt;br /&gt;
{{FeatureDone|Marble|Plasma Runner for geo coords and Marble bookmarks|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureDone|Marble|Make bookmark editor support editing the lonlat coordinates|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureDone|Marble|Fix GeoDataCoordinates parsing from a QString|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureDone|Marble|OsmNominatim improved display|tgridel@freedorfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureTodo|Marble|Create New Marble About Dialog|rahn@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureTodo|Marble|Add Float Item Management|rahn@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureTodo|Marble|New Search|rahn@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureInProgress|Marble|Make API more QML-friendly|bbeschow@cs.tu-berlin.de|Bernhard Beschow}}&lt;br /&gt;
{{FeatureTodo|KTurtle|Add modulo command|nielsslot@gmaildotcom|Niels Slot}}&lt;br /&gt;
{{FeatureDone|KGeography|Merge stuff from the cherry_field branch|aacid@kde.org|Albert Astals Cid}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdegames=&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|Libkdegames|Improve graphics performance in all games by standardizing on the use of Qt Raster Graphics.|stefan.majewsky@googlemail.com|Stefan Majewsky}}&lt;br /&gt;
{{FeatureDone|KSudoku|Add a new generator and solver to KSudoku, based on published algorithms. This will provide a full range of puzzle difficulties, rather than mainly easy puzzles, and will address bug 217925 and its duplicates 228614 and 237262 (now nearly two years old).|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KSudoku|Re-implement the puzzle-symmetry feature.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KSudoku|Re-order the puzzle types on the welcome screen.  Use KDE Games Difficulty combo-box instead of a slider. Save user's choices of puzzle between sessions.  Do minor tidy-ups of the user interface.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KGoldrunner|Add the championship level &amp;quot;Gold Rush&amp;quot; game, with Traditional rules, contributed by Gabriel Miltschitzky.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KGoldrunner|Add the championship level &amp;quot;Jail Break&amp;quot; game, with KGoldrunner rules, contributed by Gabriel Miltschitzky.|iandw.au@gmail.com|Ian Wadham}}|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdegraphics=&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureInProgress|Okular|Reset Form Action support|aacid@kde.org|Albert Astals Cid}}&lt;br /&gt;
{{FeatureDone|Okular|Viewer Mode &amp;amp; Interface.|michel.ludwig@kdemail.net|Michel Ludwig}}&lt;br /&gt;
{{FeatureDone|Okular|Table selection tool improvements|aacid@kde.org|Albert Astals Cid}}&lt;br /&gt;
{{FeatureInProgress|Gwenview|Animated image transitions|agateau@kde.org|Aurélien Gâteau}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdemultimedia =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo|JuK|MPRIS2 support|alex.merry@kdemail.net|Alex Merry}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdenetwork=&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureInProgress|KGet|Better interaction for torrents if they are seeding and other downloads stopped because of that|mat69@gmx.net|Matthias Fuchs}}&lt;br /&gt;
{{FeatureInProgress|KGet|Class that handles deleting files|mat69@gmx.net|Matthias Fuchs}}&lt;br /&gt;
{{FeatureInProgress|Kopete|Akonadi History Plugin |roideuniverse@gmail.com|Kaushik Saurabh}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdepim  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo&lt;br /&gt;
|attachment:/ kio-slave&lt;br /&gt;
|Implement kio-slave to access (email) attachments in Akonadi&lt;br /&gt;
|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|KAlarm|Port to Akonadi|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo&lt;br /&gt;
|sieve: implement wizard&lt;br /&gt;
|Implement wizard to help user to create sieve script&lt;br /&gt;
|montel@kde.org|Montel Laurent}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureDone&lt;br /&gt;
|HTML Replies&lt;br /&gt;
|Give messagecomposer (especially for KMail) the ability to compose replies in HTML&lt;br /&gt;
|nyblom@kde.org|Torgny Nyblom}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|KMail import|KMail1 setup import instead of migration|krammer@kde.org|Kevin Krammer}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|Agent control workspace integration|Monitoring and control of Akonadi agents through Plasma workspace facilitites|krammer@kde.org|Kevin Krammer}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeplasma-addons =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|Kimpanel|Port kimpanel to DataEngine based one|wengxt@gmail.com|Xuetian Weng}}&lt;br /&gt;
{{FeatureDone|IconTasks|Import IconTasks|craig@kde.org|Craig Drummond}}&lt;br /&gt;
{{FeatureDone|Konqueror Sessions Applet|Port to QML|shaun.reich@kdemail.net|Shaun Reich}}&lt;br /&gt;
{{FeatureDone|Konsole Sessions Applet|Port to QML|shaun.reich@kdemail.net|Shaun Reich}}&lt;br /&gt;
{{FeatureTodo|KDevelop Sessions Applet|Create/Port to QML|shaun.reich@kdemail.net|Shaun Reich}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdesdk  =&lt;br /&gt;
&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureTodo|Okteta|Add a general KPart adapter to Kasten, than finish port of Okteta KPart to Okteta Kasten|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add global toggle option for the offset display, hex or decimal|kossebau@kde.org|Friedrich W. H. Kossebau}} &lt;br /&gt;
{{FeatureTodo|Okteta|Add Kate-like combined dialogs to query for actions on files|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add Kate-like search tool|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add Okular like embedded notifications|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for import by drop, both url and data|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for memory mapping of files and 64-bit addressing|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for jobs like io, printing, string search or filter|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add view profiles, incl. editor/manager|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|copy again puts also a value or char variant of the data to clipboard|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Improve the titels of the changes to the bytearray to be more descriptive, best using ids to avoid text string|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Make all user interaction in the KastenCore managers plugin-based|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Merge row and column widgets into one|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Store bookmarks|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Store bookmarks and other view settings for next load|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add custom datatypes to structures tool|alex.richardson@gmx.de|Alex Richardson}}&lt;br /&gt;
{{FeatureDone|Okteta|Add Flags Datatype to structures tool|alex.richardson@gmx.de|Alex Richardson}}&lt;br /&gt;
{{FeatureInProgress|dolphin-plugins|Mercurial plugin for Dolphin|vishesh3y@gmail.com|Vishesh Yadav}}&lt;br /&gt;
{{FeatureDone|KCachegrind|Upgrade interface to Callgrind (use callgrind_control instead of writing a command file, for &amp;gt; VG 3.7.x)|Josef.Weidendorfer@gmx.de|Josef Weidendorfer}} &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeutils=&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|ark|Allow Ark to be used as a KPart again|rakuco@FreeBSD.org|Raphael Kubo da Costa}}&lt;br /&gt;
{{FeatureInProgress|ksecrets|A suite of tools related to the KSecretsService infrastructure|kde@rusu.info|Valentin Rusu}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Schedules/KDE4/4.8_Feature_Plan</id>
		<title>Schedules/KDE4/4.8 Feature Plan</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Schedules/KDE4/4.8_Feature_Plan"/>
				<updated>2012-01-09T20:47:02Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* kdeplasma-addons */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a list of planned features for the SC 4.8 release. &lt;br /&gt;
&lt;br /&gt;
See also: &lt;br /&gt;
&lt;br /&gt;
*[[Schedules/KDE4/4.8 Release Schedule]] &lt;br /&gt;
*[[Schedules/KDE4/4.8 Release Goals]] &lt;br /&gt;
*[[Schedules/KDE4/4.7 Feature Plan]] (previous major release)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; Legend: &lt;br /&gt;
&lt;br /&gt;
*todo =&amp;amp;gt; not started yet &lt;br /&gt;
*in-progress =&amp;amp;gt; started, but not completed yet &lt;br /&gt;
*done =&amp;amp;gt; completed&lt;br /&gt;
&lt;br /&gt;
__TOC__ &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdelibs =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureDone|Kate Part|Line modification system|dhaumann@kde.org|Dominik Haumann}}&lt;br /&gt;
{{FeatureDone|Kate Part|Modeline Editor|dhaumann@kde.org|Dominik Haumann}}&lt;br /&gt;
{{FeatureDone|Kate Part|Reliable code folding|adrian.lungu89@gmail.com|Adrian Lungu}}&lt;br /&gt;
{{FeatureDone|Kate Part|Improved vi input mode|svatoslav1@gmail.com|Svyatoslav Kuzmich}}&lt;br /&gt;
{{FeatureInProgress|KIO|PreviewJob supports URLs|sebas@kde.org|Sebastian Kügler}}&lt;br /&gt;
{{FeatureInProgress|kdeui|KSecretsService API addition|kde@rusu.info|Valentin Rusu}}&lt;br /&gt;
{{FeatureInProgress|kdeui/util|Connect KWallet class to KSecretsService client API|kde@rusu.info|Valentin Rusu}}&lt;br /&gt;
{{FeatureInProgress|kcookiejar|New domain specific cookie policy based on patch provided in bug#54300|adawit@kde.org|Dawit A.}} &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kde-runtime =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|ksecretsserviced|KSecretsService daemon implementing the freedesktop.org secrets API. KDE applications will want to use the related kdelibs API (see below)|kde@rusu.info|Valentin Rusu}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|DrKonqi|Better duplicate detection|mat69@gmx.net|Matthias Fuchs}}&lt;br /&gt;
{{FeatureInProgress|KIO Thumbnails|webthumbnails plugin|sebas@kde.org|Sebastian Kügler}}&lt;br /&gt;
{{FeatureInProgress|DrKonqi|Scripting support|mat69@gmx.net|Matthias Fuchs}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Plasma QML QtComponents|mart@kde.org|Marco Martin}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kde-workspace =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureTodo|KWin|Activity switcher|wstephenson@kde.org|Will Stephenson}}&lt;br /&gt;
{{FeatureTodo|Plasma|Activity UI improvements|wstephenson@kde.org|Will Stephenson}}&lt;br /&gt;
{{FeatureInProgress|KWin|Take over screensaver/locking management from KRunner|alex.merry@kdemail.net|Alex Merry}}&lt;br /&gt;
{{FeatureDone|KCM|make mouse cursor size configurable (http://git.reviewboard.kde.org/r/101701/)|SommerLuk@gmail.com|Lukas Sommer}}&lt;br /&gt;
{{FeatureDone|powerdevil|Remove Desktop Effects Management|drf@kde.org|Dario Freddi}}&lt;br /&gt;
{{FeatureDone|powerdevil|Allow static profiles only|drf@kde.org|Dario Freddi}}&lt;br /&gt;
{{FeatureDone|powerdevil|Allow activity interaction|drf@kde.org|Dario Freddi}}&lt;br /&gt;
{{FeatureDone|Plasma|Add MPRIS2 support to nowplaying|alex.merry@kdemail.net|Alex Merry}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Allow task grouping on the taskbar to work together with kwin window tabbing|akreuzkamp@web.de|Anton Kreuzkamp}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Merge the QML version of the device notifier|mart@kde.org|Marco Martin}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Merge the QML version of the battery applet|mart@kde.org|Marco Martin}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Create hard disk activity plasmoid (to monitor I/O a la cpu, net)|shaun.reich@kdemail.net|Shaun Reich}}&lt;br /&gt;
{{FeatureDone|KWin|QML based Window switcher (Tabbox)|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureInProgress|KWin|Texture Rectangle ARB support in Shaders|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureInProgress|KWin|No Compositor restart on screen change|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureInProgress|KWin|Initial Wayland support|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureDone|KWin|Support for thumbnails in QML|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureDone|KWin|Add AnimationEffect class|thomas.luebking@gmail.com|Thomas Lübking}}&lt;br /&gt;
{{FeatureInProgress|KWin|Option to prefer the mouse position over the focus chain|thomas.luebking@gmail.com|Thomas Lübking}}&lt;br /&gt;
{{FeatureDone|KWin|More cleanup in the window rules kcm|thomas.luebking@gmail.com|Thomas Lübking}}&lt;br /&gt;
{{FeatureInProgress|KWin|Trade 1 frame lag for deterministic framerate|thomas.luebking@gmail.com|Thomas Lübking}}&lt;br /&gt;
{{FeatureInProgress|KWin|Improved resizing of windows with thin or no borders|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
{{FeatureInProgress|KWin|Move Workspace's compositing functionality to own class Compositor|a.arlt@stud.uni-heidelberg.de|Arthur Arlt}}&lt;br /&gt;
{{FeatureInProgress|KWin|Introduce class DecorationPaintRedirector for decoration handling when Compositing is active|a.arlt@stud.uni-heidelberg.de|Arthur Arlt}}&lt;br /&gt;
{{FeatureInProgress|Screenlocker|New Screenlocker and daemon|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureDone|Plasma|Merge IconTask's taskmanager changes|craig@kde.org|Craig Drummond}}&lt;br /&gt;
{{FeatureDone|KCM|Allow flag and label in keyboard layout indicator|arysin@gmail.com|Andriy Rysin}}&lt;br /&gt;
{{FeatureInProgress|KSplash|QML based ksplash|mart@kde.org|Marco Martin/Ivan Čukić}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kde-baseapps =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|Dolphin|Implement new view-engine for Dolphin 2.0 (see http://ppenz.blogspot.com/2011/08/introducing-dolphin-20.html)|peter.penz19@gmail.com|Peter Penz}}&lt;br /&gt;
{{FeatureTodo|Dolphin|Implement support for back/forward mouse buttons|sebasti@n-doerner.de|Sebastian Dörner}}&lt;br /&gt;
{{FeatureDone|Kate|Search &amp;amp; Replace in files plugin|kare.sars@iki.fi|Kåre Särs}}&lt;br /&gt;
{{FeatureInProgress|Kate|Make GDB target selection behave like the build plugin |kare.sars@iki.fi|Kåre Särs}}&lt;br /&gt;
{{FeatureInProgress|Kate|Add convenience options for remote debugging|kare.sars@iki.fi|Kåre Särs}}&lt;br /&gt;
{{FeatureDone|Settings|Improve proxy configuration dialog|adawit@kde.org|Dawit Alemayehu}}&lt;br /&gt;
{{FeatureToDo|Kate|Port sessions plasma applet to QML|shaun.reich@kdemail.net|Shaun Reich}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeedu  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|KTouch|New organisation of keyboard and lecture files according to languages|peter.ruethemann@gmail.com|Rüthemann Peter}}&lt;br /&gt;
{{FeatureInProgress|KTouch|New organisation of menu system: Training, Statistic, Settings|peter.ruethemann@gmail.com|Rüthemann Peter}}&lt;br /&gt;
{{FeatureTodo|KTouch|End of lecture statistics|peter.ruethemann@gmail.com|Rüthemann Peter}}&lt;br /&gt;
{{FeatureDone|Rocs|Alignment Actions to minimize crossing graph edges|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureTodo|Rocs|Project Files to combine graphs and algorithms|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureDone|Rocs|Context menu for graph scene|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureDone|Rocs|Resurrect import-/export-features|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureDone|Rocs|User Interface Cleanup|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureDone|Cantor|Add Qalculate backend|matteo@agostinelli.me|Matteo Agostinelli}}&lt;br /&gt;
{{FeatureInProgress|Cantor|Add Scilab backend|filip.saraiva@gmail.com|Filipe Saraiva}}&lt;br /&gt;
{{FeatureDone|Marble|Marble Runner plugins for Parsing files|tgridel@freedotfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureDone|Marble|(GSoC) OSM file rendering|oblaukhov.konstantin@gmail.com|Konstantin Oblaukhov}}&lt;br /&gt;
{{FeatureDone|Marble|Marble Graphics Scene (Performance of Vector Drawing)|oblaukhov.konstantin@gmail.com|Konstantin Oblaukhov}}&lt;br /&gt;
{{FeatureDone|Marble|Gps Info Plugin|tgridel@freedotfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureDone|Marble|Improve LatLonEdit to allow input as Radian and DM|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureInProgress|Marble|Marble Touch (GSoC, Marble on MeeGo/N9)|earthwings@gentoo.org|Daniel Marth, Dennis Nienhüser}}&lt;br /&gt;
{{FeatureDone|Marble|Routing API|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureInProgress|Marble|Adjustable Map Orientation (Rotation in Screen Plane)|bbeschow@cs.tu-berlin.de|Bernhard Beschow}}&lt;br /&gt;
{{FeatureDone|Marble|Speedometer Plugin|bbeschow@cs.tu-berlin.de|Bernhard Beschow}}&lt;br /&gt;
{{FeatureDone|Marble|Plasma Runner for geo coords and Marble bookmarks|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureDone|Marble|Make bookmark editor support editing the lonlat coordinates|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureDone|Marble|Fix GeoDataCoordinates parsing from a QString|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureDone|Marble|OsmNominatim improved display|tgridel@freedorfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureTodo|Marble|Create New Marble About Dialog|rahn@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureTodo|Marble|Add Float Item Management|rahn@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureTodo|Marble|New Search|rahn@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureInProgress|Marble|Make API more QML-friendly|bbeschow@cs.tu-berlin.de|Bernhard Beschow}}&lt;br /&gt;
{{FeatureTodo|KTurtle|Add modulo command|nielsslot@gmaildotcom|Niels Slot}}&lt;br /&gt;
{{FeatureDone|KGeography|Merge stuff from the cherry_field branch|aacid@kde.org|Albert Astals Cid}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdegames=&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|Libkdegames|Improve graphics performance in all games by standardizing on the use of Qt Raster Graphics.|stefan.majewsky@googlemail.com|Stefan Majewsky}}&lt;br /&gt;
{{FeatureDone|KSudoku|Add a new generator and solver to KSudoku, based on published algorithms. This will provide a full range of puzzle difficulties, rather than mainly easy puzzles, and will address bug 217925 and its duplicates 228614 and 237262 (now nearly two years old).|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KSudoku|Re-implement the puzzle-symmetry feature.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KSudoku|Re-order the puzzle types on the welcome screen.  Use KDE Games Difficulty combo-box instead of a slider. Save user's choices of puzzle between sessions.  Do minor tidy-ups of the user interface.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KGoldrunner|Add the championship level &amp;quot;Gold Rush&amp;quot; game, with Traditional rules, contributed by Gabriel Miltschitzky.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KGoldrunner|Add the championship level &amp;quot;Jail Break&amp;quot; game, with KGoldrunner rules, contributed by Gabriel Miltschitzky.|iandw.au@gmail.com|Ian Wadham}}|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdegraphics=&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureInProgress|Okular|Reset Form Action support|aacid@kde.org|Albert Astals Cid}}&lt;br /&gt;
{{FeatureDone|Okular|Viewer Mode &amp;amp; Interface.|michel.ludwig@kdemail.net|Michel Ludwig}}&lt;br /&gt;
{{FeatureDone|Okular|Table selection tool improvements|aacid@kde.org|Albert Astals Cid}}&lt;br /&gt;
{{FeatureInProgress|Gwenview|Animated image transitions|agateau@kde.org|Aurélien Gâteau}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdemultimedia =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo|JuK|MPRIS2 support|alex.merry@kdemail.net|Alex Merry}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdenetwork=&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureInProgress|KGet|Better interaction for torrents if they are seeding and other downloads stopped because of that|mat69@gmx.net|Matthias Fuchs}}&lt;br /&gt;
{{FeatureInProgress|KGet|Class that handles deleting files|mat69@gmx.net|Matthias Fuchs}}&lt;br /&gt;
{{FeatureInProgress|Kopete|Akonadi History Plugin |roideuniverse@gmail.com|Kaushik Saurabh}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdepim  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo&lt;br /&gt;
|attachment:/ kio-slave&lt;br /&gt;
|Implement kio-slave to access (email) attachments in Akonadi&lt;br /&gt;
|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|KAlarm|Port to Akonadi|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo&lt;br /&gt;
|sieve: implement wizard&lt;br /&gt;
|Implement wizard to help user to create sieve script&lt;br /&gt;
|montel@kde.org|Montel Laurent}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureDone&lt;br /&gt;
|HTML Replies&lt;br /&gt;
|Give messagecomposer (especially for KMail) the ability to compose replies in HTML&lt;br /&gt;
|nyblom@kde.org|Torgny Nyblom}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|KMail import|KMail1 setup import instead of migration|krammer@kde.org|Kevin Krammer}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|Agent control workspace integration|Monitoring and control of Akonadi agents through Plasma workspace facilitites|krammer@kde.org|Kevin Krammer}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeplasma-addons =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|Kimpanel|Port kimpanel to DataEngine based one|wengxt@gmail.com|Xuetian Weng}}&lt;br /&gt;
{{FeatureDone|IconTasks|Import IconTasks|craig@kde.org|Craig Drummond}}&lt;br /&gt;
{{FeatureDone|Konqueror Sessions Applet|Port to QML|shaun.reich@kdemail.net|Shaun Reich}}&lt;br /&gt;
{{FeatureDone|Konsole Sessions Applet|Port to QML|shaun.reich@kdemail.net|Shaun Reich}}&lt;br /&gt;
{{FeatureTodo|KDevelop Sessions Applet|Create/Port to QML|shaun.reich@kdemail.net|Shaun Reich}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdesdk  =&lt;br /&gt;
&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureTodo|Okteta|Add a general KPart adapter to Kasten, than finish port of Okteta KPart to Okteta Kasten|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add global toggle option for the offset display, hex or decimal|kossebau@kde.org|Friedrich W. H. Kossebau}} &lt;br /&gt;
{{FeatureTodo|Okteta|Add Kate-like combined dialogs to query for actions on files|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add Kate-like search tool|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add Okular like embedded notifications|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for import by drop, both url and data|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for memory mapping of files and 64-bit addressing|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for jobs like io, printing, string search or filter|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add view profiles, incl. editor/manager|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|copy again puts also a value or char variant of the data to clipboard|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Improve the titels of the changes to the bytearray to be more descriptive, best using ids to avoid text string|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Make all user interaction in the KastenCore managers plugin-based|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Merge row and column widgets into one|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Store bookmarks|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Store bookmarks and other view settings for next load|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add custom datatypes to structures tool|alex.richardson@gmx.de|Alex Richardson}}&lt;br /&gt;
{{FeatureDone|Okteta|Add Flags Datatype to structures tool|alex.richardson@gmx.de|Alex Richardson}}&lt;br /&gt;
{{FeatureInProgress|dolphin-plugins|Mercurial plugin for Dolphin|vishesh3y@gmail.com|Vishesh Yadav}}&lt;br /&gt;
{{FeatureDone|KCachegrind|Upgrade interface to Callgrind (use callgrind_control instead of writing a command file, for &amp;gt; VG 3.7.x)|Josef.Weidendorfer@gmx.de|Josef Weidendorfer}} &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeutils=&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|ark|Allow Ark to be used as a KPart again|rakuco@FreeBSD.org|Raphael Kubo da Costa}}&lt;br /&gt;
{{FeatureInProgress|ksecrets|A suite of tools related to the KSecretsService infrastructure|kde@rusu.info|Valentin Rusu}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Schedules/KDE4/4.8_Feature_Plan</id>
		<title>Schedules/KDE4/4.8 Feature Plan</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Schedules/KDE4/4.8_Feature_Plan"/>
				<updated>2012-01-09T20:45:12Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* kdeplasma-addons */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a list of planned features for the SC 4.8 release. &lt;br /&gt;
&lt;br /&gt;
See also: &lt;br /&gt;
&lt;br /&gt;
*[[Schedules/KDE4/4.8 Release Schedule]] &lt;br /&gt;
*[[Schedules/KDE4/4.8 Release Goals]] &lt;br /&gt;
*[[Schedules/KDE4/4.7 Feature Plan]] (previous major release)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; Legend: &lt;br /&gt;
&lt;br /&gt;
*todo =&amp;amp;gt; not started yet &lt;br /&gt;
*in-progress =&amp;amp;gt; started, but not completed yet &lt;br /&gt;
*done =&amp;amp;gt; completed&lt;br /&gt;
&lt;br /&gt;
__TOC__ &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdelibs =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureDone|Kate Part|Line modification system|dhaumann@kde.org|Dominik Haumann}}&lt;br /&gt;
{{FeatureDone|Kate Part|Modeline Editor|dhaumann@kde.org|Dominik Haumann}}&lt;br /&gt;
{{FeatureDone|Kate Part|Reliable code folding|adrian.lungu89@gmail.com|Adrian Lungu}}&lt;br /&gt;
{{FeatureDone|Kate Part|Improved vi input mode|svatoslav1@gmail.com|Svyatoslav Kuzmich}}&lt;br /&gt;
{{FeatureInProgress|KIO|PreviewJob supports URLs|sebas@kde.org|Sebastian Kügler}}&lt;br /&gt;
{{FeatureInProgress|kdeui|KSecretsService API addition|kde@rusu.info|Valentin Rusu}}&lt;br /&gt;
{{FeatureInProgress|kdeui/util|Connect KWallet class to KSecretsService client API|kde@rusu.info|Valentin Rusu}}&lt;br /&gt;
{{FeatureInProgress|kcookiejar|New domain specific cookie policy based on patch provided in bug#54300|adawit@kde.org|Dawit A.}} &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kde-runtime =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|ksecretsserviced|KSecretsService daemon implementing the freedesktop.org secrets API. KDE applications will want to use the related kdelibs API (see below)|kde@rusu.info|Valentin Rusu}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|DrKonqi|Better duplicate detection|mat69@gmx.net|Matthias Fuchs}}&lt;br /&gt;
{{FeatureInProgress|KIO Thumbnails|webthumbnails plugin|sebas@kde.org|Sebastian Kügler}}&lt;br /&gt;
{{FeatureInProgress|DrKonqi|Scripting support|mat69@gmx.net|Matthias Fuchs}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Plasma QML QtComponents|mart@kde.org|Marco Martin}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kde-workspace =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureTodo|KWin|Activity switcher|wstephenson@kde.org|Will Stephenson}}&lt;br /&gt;
{{FeatureTodo|Plasma|Activity UI improvements|wstephenson@kde.org|Will Stephenson}}&lt;br /&gt;
{{FeatureInProgress|KWin|Take over screensaver/locking management from KRunner|alex.merry@kdemail.net|Alex Merry}}&lt;br /&gt;
{{FeatureDone|KCM|make mouse cursor size configurable (http://git.reviewboard.kde.org/r/101701/)|SommerLuk@gmail.com|Lukas Sommer}}&lt;br /&gt;
{{FeatureDone|powerdevil|Remove Desktop Effects Management|drf@kde.org|Dario Freddi}}&lt;br /&gt;
{{FeatureDone|powerdevil|Allow static profiles only|drf@kde.org|Dario Freddi}}&lt;br /&gt;
{{FeatureDone|powerdevil|Allow activity interaction|drf@kde.org|Dario Freddi}}&lt;br /&gt;
{{FeatureDone|Plasma|Add MPRIS2 support to nowplaying|alex.merry@kdemail.net|Alex Merry}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Allow task grouping on the taskbar to work together with kwin window tabbing|akreuzkamp@web.de|Anton Kreuzkamp}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Merge the QML version of the device notifier|mart@kde.org|Marco Martin}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Merge the QML version of the battery applet|mart@kde.org|Marco Martin}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Create hard disk activity plasmoid (to monitor I/O a la cpu, net)|shaun.reich@kdemail.net|Shaun Reich}}&lt;br /&gt;
{{FeatureDone|KWin|QML based Window switcher (Tabbox)|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureInProgress|KWin|Texture Rectangle ARB support in Shaders|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureInProgress|KWin|No Compositor restart on screen change|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureInProgress|KWin|Initial Wayland support|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureDone|KWin|Support for thumbnails in QML|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureDone|KWin|Add AnimationEffect class|thomas.luebking@gmail.com|Thomas Lübking}}&lt;br /&gt;
{{FeatureInProgress|KWin|Option to prefer the mouse position over the focus chain|thomas.luebking@gmail.com|Thomas Lübking}}&lt;br /&gt;
{{FeatureDone|KWin|More cleanup in the window rules kcm|thomas.luebking@gmail.com|Thomas Lübking}}&lt;br /&gt;
{{FeatureInProgress|KWin|Trade 1 frame lag for deterministic framerate|thomas.luebking@gmail.com|Thomas Lübking}}&lt;br /&gt;
{{FeatureInProgress|KWin|Improved resizing of windows with thin or no borders|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
{{FeatureInProgress|KWin|Move Workspace's compositing functionality to own class Compositor|a.arlt@stud.uni-heidelberg.de|Arthur Arlt}}&lt;br /&gt;
{{FeatureInProgress|KWin|Introduce class DecorationPaintRedirector for decoration handling when Compositing is active|a.arlt@stud.uni-heidelberg.de|Arthur Arlt}}&lt;br /&gt;
{{FeatureInProgress|Screenlocker|New Screenlocker and daemon|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureDone|Plasma|Merge IconTask's taskmanager changes|craig@kde.org|Craig Drummond}}&lt;br /&gt;
{{FeatureDone|KCM|Allow flag and label in keyboard layout indicator|arysin@gmail.com|Andriy Rysin}}&lt;br /&gt;
{{FeatureInProgress|KSplash|QML based ksplash|mart@kde.org|Marco Martin/Ivan Čukić}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kde-baseapps =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|Dolphin|Implement new view-engine for Dolphin 2.0 (see http://ppenz.blogspot.com/2011/08/introducing-dolphin-20.html)|peter.penz19@gmail.com|Peter Penz}}&lt;br /&gt;
{{FeatureTodo|Dolphin|Implement support for back/forward mouse buttons|sebasti@n-doerner.de|Sebastian Dörner}}&lt;br /&gt;
{{FeatureDone|Kate|Search &amp;amp; Replace in files plugin|kare.sars@iki.fi|Kåre Särs}}&lt;br /&gt;
{{FeatureInProgress|Kate|Make GDB target selection behave like the build plugin |kare.sars@iki.fi|Kåre Särs}}&lt;br /&gt;
{{FeatureInProgress|Kate|Add convenience options for remote debugging|kare.sars@iki.fi|Kåre Särs}}&lt;br /&gt;
{{FeatureDone|Settings|Improve proxy configuration dialog|adawit@kde.org|Dawit Alemayehu}}&lt;br /&gt;
{{FeatureToDo|Kate|Port sessions plasma applet to QML|shaun.reich@kdemail.net|Shaun Reich}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeedu  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|KTouch|New organisation of keyboard and lecture files according to languages|peter.ruethemann@gmail.com|Rüthemann Peter}}&lt;br /&gt;
{{FeatureInProgress|KTouch|New organisation of menu system: Training, Statistic, Settings|peter.ruethemann@gmail.com|Rüthemann Peter}}&lt;br /&gt;
{{FeatureTodo|KTouch|End of lecture statistics|peter.ruethemann@gmail.com|Rüthemann Peter}}&lt;br /&gt;
{{FeatureDone|Rocs|Alignment Actions to minimize crossing graph edges|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureTodo|Rocs|Project Files to combine graphs and algorithms|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureDone|Rocs|Context menu for graph scene|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureDone|Rocs|Resurrect import-/export-features|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureDone|Rocs|User Interface Cleanup|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureDone|Cantor|Add Qalculate backend|matteo@agostinelli.me|Matteo Agostinelli}}&lt;br /&gt;
{{FeatureInProgress|Cantor|Add Scilab backend|filip.saraiva@gmail.com|Filipe Saraiva}}&lt;br /&gt;
{{FeatureDone|Marble|Marble Runner plugins for Parsing files|tgridel@freedotfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureDone|Marble|(GSoC) OSM file rendering|oblaukhov.konstantin@gmail.com|Konstantin Oblaukhov}}&lt;br /&gt;
{{FeatureDone|Marble|Marble Graphics Scene (Performance of Vector Drawing)|oblaukhov.konstantin@gmail.com|Konstantin Oblaukhov}}&lt;br /&gt;
{{FeatureDone|Marble|Gps Info Plugin|tgridel@freedotfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureDone|Marble|Improve LatLonEdit to allow input as Radian and DM|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureInProgress|Marble|Marble Touch (GSoC, Marble on MeeGo/N9)|earthwings@gentoo.org|Daniel Marth, Dennis Nienhüser}}&lt;br /&gt;
{{FeatureDone|Marble|Routing API|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureInProgress|Marble|Adjustable Map Orientation (Rotation in Screen Plane)|bbeschow@cs.tu-berlin.de|Bernhard Beschow}}&lt;br /&gt;
{{FeatureDone|Marble|Speedometer Plugin|bbeschow@cs.tu-berlin.de|Bernhard Beschow}}&lt;br /&gt;
{{FeatureDone|Marble|Plasma Runner for geo coords and Marble bookmarks|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureDone|Marble|Make bookmark editor support editing the lonlat coordinates|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureDone|Marble|Fix GeoDataCoordinates parsing from a QString|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureDone|Marble|OsmNominatim improved display|tgridel@freedorfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureTodo|Marble|Create New Marble About Dialog|rahn@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureTodo|Marble|Add Float Item Management|rahn@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureTodo|Marble|New Search|rahn@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureInProgress|Marble|Make API more QML-friendly|bbeschow@cs.tu-berlin.de|Bernhard Beschow}}&lt;br /&gt;
{{FeatureTodo|KTurtle|Add modulo command|nielsslot@gmaildotcom|Niels Slot}}&lt;br /&gt;
{{FeatureDone|KGeography|Merge stuff from the cherry_field branch|aacid@kde.org|Albert Astals Cid}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdegames=&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|Libkdegames|Improve graphics performance in all games by standardizing on the use of Qt Raster Graphics.|stefan.majewsky@googlemail.com|Stefan Majewsky}}&lt;br /&gt;
{{FeatureDone|KSudoku|Add a new generator and solver to KSudoku, based on published algorithms. This will provide a full range of puzzle difficulties, rather than mainly easy puzzles, and will address bug 217925 and its duplicates 228614 and 237262 (now nearly two years old).|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KSudoku|Re-implement the puzzle-symmetry feature.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KSudoku|Re-order the puzzle types on the welcome screen.  Use KDE Games Difficulty combo-box instead of a slider. Save user's choices of puzzle between sessions.  Do minor tidy-ups of the user interface.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KGoldrunner|Add the championship level &amp;quot;Gold Rush&amp;quot; game, with Traditional rules, contributed by Gabriel Miltschitzky.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KGoldrunner|Add the championship level &amp;quot;Jail Break&amp;quot; game, with KGoldrunner rules, contributed by Gabriel Miltschitzky.|iandw.au@gmail.com|Ian Wadham}}|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdegraphics=&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureInProgress|Okular|Reset Form Action support|aacid@kde.org|Albert Astals Cid}}&lt;br /&gt;
{{FeatureDone|Okular|Viewer Mode &amp;amp; Interface.|michel.ludwig@kdemail.net|Michel Ludwig}}&lt;br /&gt;
{{FeatureDone|Okular|Table selection tool improvements|aacid@kde.org|Albert Astals Cid}}&lt;br /&gt;
{{FeatureInProgress|Gwenview|Animated image transitions|agateau@kde.org|Aurélien Gâteau}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdemultimedia =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo|JuK|MPRIS2 support|alex.merry@kdemail.net|Alex Merry}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdenetwork=&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureInProgress|KGet|Better interaction for torrents if they are seeding and other downloads stopped because of that|mat69@gmx.net|Matthias Fuchs}}&lt;br /&gt;
{{FeatureInProgress|KGet|Class that handles deleting files|mat69@gmx.net|Matthias Fuchs}}&lt;br /&gt;
{{FeatureInProgress|Kopete|Akonadi History Plugin |roideuniverse@gmail.com|Kaushik Saurabh}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdepim  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo&lt;br /&gt;
|attachment:/ kio-slave&lt;br /&gt;
|Implement kio-slave to access (email) attachments in Akonadi&lt;br /&gt;
|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|KAlarm|Port to Akonadi|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo&lt;br /&gt;
|sieve: implement wizard&lt;br /&gt;
|Implement wizard to help user to create sieve script&lt;br /&gt;
|montel@kde.org|Montel Laurent}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureDone&lt;br /&gt;
|HTML Replies&lt;br /&gt;
|Give messagecomposer (especially for KMail) the ability to compose replies in HTML&lt;br /&gt;
|nyblom@kde.org|Torgny Nyblom}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|KMail import|KMail1 setup import instead of migration|krammer@kde.org|Kevin Krammer}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|Agent control workspace integration|Monitoring and control of Akonadi agents through Plasma workspace facilitites|krammer@kde.org|Kevin Krammer}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeplasma-addons =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|Kimpanel|Port kimpanel to DataEngine based one|wengxt@gmail.com|Xuetian Weng}}&lt;br /&gt;
{{FeatureDone|IconTasks|Import IconTasks|craig@kde.org|Craig Drummond}}&lt;br /&gt;
{{FeatureDone|Konqueror Sessions Applet|Port to QML|shaun.reich@kdemail.net|Shaun Reich}}&lt;br /&gt;
{{FeatureDone|Konsole Sessions Applet|Port to QML|shaun.reich@kdemail.net|Shaun Reich}}&lt;br /&gt;
{{FeatureToDo|KDevelop Sessions Applet|Create/Port to QML|shaun.reich@kdemail.net|Shaun Reich}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdesdk  =&lt;br /&gt;
&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureTodo|Okteta|Add a general KPart adapter to Kasten, than finish port of Okteta KPart to Okteta Kasten|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add global toggle option for the offset display, hex or decimal|kossebau@kde.org|Friedrich W. H. Kossebau}} &lt;br /&gt;
{{FeatureTodo|Okteta|Add Kate-like combined dialogs to query for actions on files|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add Kate-like search tool|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add Okular like embedded notifications|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for import by drop, both url and data|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for memory mapping of files and 64-bit addressing|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for jobs like io, printing, string search or filter|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add view profiles, incl. editor/manager|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|copy again puts also a value or char variant of the data to clipboard|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Improve the titels of the changes to the bytearray to be more descriptive, best using ids to avoid text string|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Make all user interaction in the KastenCore managers plugin-based|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Merge row and column widgets into one|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Store bookmarks|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Store bookmarks and other view settings for next load|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add custom datatypes to structures tool|alex.richardson@gmx.de|Alex Richardson}}&lt;br /&gt;
{{FeatureDone|Okteta|Add Flags Datatype to structures tool|alex.richardson@gmx.de|Alex Richardson}}&lt;br /&gt;
{{FeatureInProgress|dolphin-plugins|Mercurial plugin for Dolphin|vishesh3y@gmail.com|Vishesh Yadav}}&lt;br /&gt;
{{FeatureDone|KCachegrind|Upgrade interface to Callgrind (use callgrind_control instead of writing a command file, for &amp;gt; VG 3.7.x)|Josef.Weidendorfer@gmx.de|Josef Weidendorfer}} &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeutils=&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|ark|Allow Ark to be used as a KPart again|rakuco@FreeBSD.org|Raphael Kubo da Costa}}&lt;br /&gt;
{{FeatureInProgress|ksecrets|A suite of tools related to the KSecretsService infrastructure|kde@rusu.info|Valentin Rusu}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Schedules/KDE4/4.8_Feature_Plan</id>
		<title>Schedules/KDE4/4.8 Feature Plan</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Schedules/KDE4/4.8_Feature_Plan"/>
				<updated>2012-01-09T20:44:35Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* kde-baseapps */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a list of planned features for the SC 4.8 release. &lt;br /&gt;
&lt;br /&gt;
See also: &lt;br /&gt;
&lt;br /&gt;
*[[Schedules/KDE4/4.8 Release Schedule]] &lt;br /&gt;
*[[Schedules/KDE4/4.8 Release Goals]] &lt;br /&gt;
*[[Schedules/KDE4/4.7 Feature Plan]] (previous major release)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; Legend: &lt;br /&gt;
&lt;br /&gt;
*todo =&amp;amp;gt; not started yet &lt;br /&gt;
*in-progress =&amp;amp;gt; started, but not completed yet &lt;br /&gt;
*done =&amp;amp;gt; completed&lt;br /&gt;
&lt;br /&gt;
__TOC__ &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdelibs =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureDone|Kate Part|Line modification system|dhaumann@kde.org|Dominik Haumann}}&lt;br /&gt;
{{FeatureDone|Kate Part|Modeline Editor|dhaumann@kde.org|Dominik Haumann}}&lt;br /&gt;
{{FeatureDone|Kate Part|Reliable code folding|adrian.lungu89@gmail.com|Adrian Lungu}}&lt;br /&gt;
{{FeatureDone|Kate Part|Improved vi input mode|svatoslav1@gmail.com|Svyatoslav Kuzmich}}&lt;br /&gt;
{{FeatureInProgress|KIO|PreviewJob supports URLs|sebas@kde.org|Sebastian Kügler}}&lt;br /&gt;
{{FeatureInProgress|kdeui|KSecretsService API addition|kde@rusu.info|Valentin Rusu}}&lt;br /&gt;
{{FeatureInProgress|kdeui/util|Connect KWallet class to KSecretsService client API|kde@rusu.info|Valentin Rusu}}&lt;br /&gt;
{{FeatureInProgress|kcookiejar|New domain specific cookie policy based on patch provided in bug#54300|adawit@kde.org|Dawit A.}} &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kde-runtime =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|ksecretsserviced|KSecretsService daemon implementing the freedesktop.org secrets API. KDE applications will want to use the related kdelibs API (see below)|kde@rusu.info|Valentin Rusu}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|DrKonqi|Better duplicate detection|mat69@gmx.net|Matthias Fuchs}}&lt;br /&gt;
{{FeatureInProgress|KIO Thumbnails|webthumbnails plugin|sebas@kde.org|Sebastian Kügler}}&lt;br /&gt;
{{FeatureInProgress|DrKonqi|Scripting support|mat69@gmx.net|Matthias Fuchs}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Plasma QML QtComponents|mart@kde.org|Marco Martin}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kde-workspace =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureTodo|KWin|Activity switcher|wstephenson@kde.org|Will Stephenson}}&lt;br /&gt;
{{FeatureTodo|Plasma|Activity UI improvements|wstephenson@kde.org|Will Stephenson}}&lt;br /&gt;
{{FeatureInProgress|KWin|Take over screensaver/locking management from KRunner|alex.merry@kdemail.net|Alex Merry}}&lt;br /&gt;
{{FeatureDone|KCM|make mouse cursor size configurable (http://git.reviewboard.kde.org/r/101701/)|SommerLuk@gmail.com|Lukas Sommer}}&lt;br /&gt;
{{FeatureDone|powerdevil|Remove Desktop Effects Management|drf@kde.org|Dario Freddi}}&lt;br /&gt;
{{FeatureDone|powerdevil|Allow static profiles only|drf@kde.org|Dario Freddi}}&lt;br /&gt;
{{FeatureDone|powerdevil|Allow activity interaction|drf@kde.org|Dario Freddi}}&lt;br /&gt;
{{FeatureDone|Plasma|Add MPRIS2 support to nowplaying|alex.merry@kdemail.net|Alex Merry}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Allow task grouping on the taskbar to work together with kwin window tabbing|akreuzkamp@web.de|Anton Kreuzkamp}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Merge the QML version of the device notifier|mart@kde.org|Marco Martin}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Merge the QML version of the battery applet|mart@kde.org|Marco Martin}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Create hard disk activity plasmoid (to monitor I/O a la cpu, net)|shaun.reich@kdemail.net|Shaun Reich}}&lt;br /&gt;
{{FeatureDone|KWin|QML based Window switcher (Tabbox)|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureInProgress|KWin|Texture Rectangle ARB support in Shaders|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureInProgress|KWin|No Compositor restart on screen change|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureInProgress|KWin|Initial Wayland support|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureDone|KWin|Support for thumbnails in QML|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureDone|KWin|Add AnimationEffect class|thomas.luebking@gmail.com|Thomas Lübking}}&lt;br /&gt;
{{FeatureInProgress|KWin|Option to prefer the mouse position over the focus chain|thomas.luebking@gmail.com|Thomas Lübking}}&lt;br /&gt;
{{FeatureDone|KWin|More cleanup in the window rules kcm|thomas.luebking@gmail.com|Thomas Lübking}}&lt;br /&gt;
{{FeatureInProgress|KWin|Trade 1 frame lag for deterministic framerate|thomas.luebking@gmail.com|Thomas Lübking}}&lt;br /&gt;
{{FeatureInProgress|KWin|Improved resizing of windows with thin or no borders|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
{{FeatureInProgress|KWin|Move Workspace's compositing functionality to own class Compositor|a.arlt@stud.uni-heidelberg.de|Arthur Arlt}}&lt;br /&gt;
{{FeatureInProgress|KWin|Introduce class DecorationPaintRedirector for decoration handling when Compositing is active|a.arlt@stud.uni-heidelberg.de|Arthur Arlt}}&lt;br /&gt;
{{FeatureInProgress|Screenlocker|New Screenlocker and daemon|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureDone|Plasma|Merge IconTask's taskmanager changes|craig@kde.org|Craig Drummond}}&lt;br /&gt;
{{FeatureDone|KCM|Allow flag and label in keyboard layout indicator|arysin@gmail.com|Andriy Rysin}}&lt;br /&gt;
{{FeatureInProgress|KSplash|QML based ksplash|mart@kde.org|Marco Martin/Ivan Čukić}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kde-baseapps =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|Dolphin|Implement new view-engine for Dolphin 2.0 (see http://ppenz.blogspot.com/2011/08/introducing-dolphin-20.html)|peter.penz19@gmail.com|Peter Penz}}&lt;br /&gt;
{{FeatureTodo|Dolphin|Implement support for back/forward mouse buttons|sebasti@n-doerner.de|Sebastian Dörner}}&lt;br /&gt;
{{FeatureDone|Kate|Search &amp;amp; Replace in files plugin|kare.sars@iki.fi|Kåre Särs}}&lt;br /&gt;
{{FeatureInProgress|Kate|Make GDB target selection behave like the build plugin |kare.sars@iki.fi|Kåre Särs}}&lt;br /&gt;
{{FeatureInProgress|Kate|Add convenience options for remote debugging|kare.sars@iki.fi|Kåre Särs}}&lt;br /&gt;
{{FeatureDone|Settings|Improve proxy configuration dialog|adawit@kde.org|Dawit Alemayehu}}&lt;br /&gt;
{{FeatureToDo|Kate|Port sessions plasma applet to QML|shaun.reich@kdemail.net|Shaun Reich}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeedu  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|KTouch|New organisation of keyboard and lecture files according to languages|peter.ruethemann@gmail.com|Rüthemann Peter}}&lt;br /&gt;
{{FeatureInProgress|KTouch|New organisation of menu system: Training, Statistic, Settings|peter.ruethemann@gmail.com|Rüthemann Peter}}&lt;br /&gt;
{{FeatureTodo|KTouch|End of lecture statistics|peter.ruethemann@gmail.com|Rüthemann Peter}}&lt;br /&gt;
{{FeatureDone|Rocs|Alignment Actions to minimize crossing graph edges|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureTodo|Rocs|Project Files to combine graphs and algorithms|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureDone|Rocs|Context menu for graph scene|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureDone|Rocs|Resurrect import-/export-features|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureDone|Rocs|User Interface Cleanup|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureDone|Cantor|Add Qalculate backend|matteo@agostinelli.me|Matteo Agostinelli}}&lt;br /&gt;
{{FeatureInProgress|Cantor|Add Scilab backend|filip.saraiva@gmail.com|Filipe Saraiva}}&lt;br /&gt;
{{FeatureDone|Marble|Marble Runner plugins for Parsing files|tgridel@freedotfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureDone|Marble|(GSoC) OSM file rendering|oblaukhov.konstantin@gmail.com|Konstantin Oblaukhov}}&lt;br /&gt;
{{FeatureDone|Marble|Marble Graphics Scene (Performance of Vector Drawing)|oblaukhov.konstantin@gmail.com|Konstantin Oblaukhov}}&lt;br /&gt;
{{FeatureDone|Marble|Gps Info Plugin|tgridel@freedotfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureDone|Marble|Improve LatLonEdit to allow input as Radian and DM|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureInProgress|Marble|Marble Touch (GSoC, Marble on MeeGo/N9)|earthwings@gentoo.org|Daniel Marth, Dennis Nienhüser}}&lt;br /&gt;
{{FeatureDone|Marble|Routing API|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureInProgress|Marble|Adjustable Map Orientation (Rotation in Screen Plane)|bbeschow@cs.tu-berlin.de|Bernhard Beschow}}&lt;br /&gt;
{{FeatureDone|Marble|Speedometer Plugin|bbeschow@cs.tu-berlin.de|Bernhard Beschow}}&lt;br /&gt;
{{FeatureDone|Marble|Plasma Runner for geo coords and Marble bookmarks|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureDone|Marble|Make bookmark editor support editing the lonlat coordinates|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureDone|Marble|Fix GeoDataCoordinates parsing from a QString|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureDone|Marble|OsmNominatim improved display|tgridel@freedorfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureTodo|Marble|Create New Marble About Dialog|rahn@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureTodo|Marble|Add Float Item Management|rahn@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureTodo|Marble|New Search|rahn@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureInProgress|Marble|Make API more QML-friendly|bbeschow@cs.tu-berlin.de|Bernhard Beschow}}&lt;br /&gt;
{{FeatureTodo|KTurtle|Add modulo command|nielsslot@gmaildotcom|Niels Slot}}&lt;br /&gt;
{{FeatureDone|KGeography|Merge stuff from the cherry_field branch|aacid@kde.org|Albert Astals Cid}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdegames=&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|Libkdegames|Improve graphics performance in all games by standardizing on the use of Qt Raster Graphics.|stefan.majewsky@googlemail.com|Stefan Majewsky}}&lt;br /&gt;
{{FeatureDone|KSudoku|Add a new generator and solver to KSudoku, based on published algorithms. This will provide a full range of puzzle difficulties, rather than mainly easy puzzles, and will address bug 217925 and its duplicates 228614 and 237262 (now nearly two years old).|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KSudoku|Re-implement the puzzle-symmetry feature.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KSudoku|Re-order the puzzle types on the welcome screen.  Use KDE Games Difficulty combo-box instead of a slider. Save user's choices of puzzle between sessions.  Do minor tidy-ups of the user interface.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KGoldrunner|Add the championship level &amp;quot;Gold Rush&amp;quot; game, with Traditional rules, contributed by Gabriel Miltschitzky.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KGoldrunner|Add the championship level &amp;quot;Jail Break&amp;quot; game, with KGoldrunner rules, contributed by Gabriel Miltschitzky.|iandw.au@gmail.com|Ian Wadham}}|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdegraphics=&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureInProgress|Okular|Reset Form Action support|aacid@kde.org|Albert Astals Cid}}&lt;br /&gt;
{{FeatureDone|Okular|Viewer Mode &amp;amp; Interface.|michel.ludwig@kdemail.net|Michel Ludwig}}&lt;br /&gt;
{{FeatureDone|Okular|Table selection tool improvements|aacid@kde.org|Albert Astals Cid}}&lt;br /&gt;
{{FeatureInProgress|Gwenview|Animated image transitions|agateau@kde.org|Aurélien Gâteau}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdemultimedia =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo|JuK|MPRIS2 support|alex.merry@kdemail.net|Alex Merry}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdenetwork=&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureInProgress|KGet|Better interaction for torrents if they are seeding and other downloads stopped because of that|mat69@gmx.net|Matthias Fuchs}}&lt;br /&gt;
{{FeatureInProgress|KGet|Class that handles deleting files|mat69@gmx.net|Matthias Fuchs}}&lt;br /&gt;
{{FeatureInProgress|Kopete|Akonadi History Plugin |roideuniverse@gmail.com|Kaushik Saurabh}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdepim  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo&lt;br /&gt;
|attachment:/ kio-slave&lt;br /&gt;
|Implement kio-slave to access (email) attachments in Akonadi&lt;br /&gt;
|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|KAlarm|Port to Akonadi|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo&lt;br /&gt;
|sieve: implement wizard&lt;br /&gt;
|Implement wizard to help user to create sieve script&lt;br /&gt;
|montel@kde.org|Montel Laurent}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureDone&lt;br /&gt;
|HTML Replies&lt;br /&gt;
|Give messagecomposer (especially for KMail) the ability to compose replies in HTML&lt;br /&gt;
|nyblom@kde.org|Torgny Nyblom}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|KMail import|KMail1 setup import instead of migration|krammer@kde.org|Kevin Krammer}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|Agent control workspace integration|Monitoring and control of Akonadi agents through Plasma workspace facilitites|krammer@kde.org|Kevin Krammer}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeplasma-addons =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|Kimpanel|Port kimpanel to DataEngine based one|wengxt@gmail.com|Xuetian Weng}}&lt;br /&gt;
{{FeatureDone|IconTasks|Import IconTasks|craig@kde.org|Craig Drummond}}&lt;br /&gt;
{{FeatureDone|Konqueror Sessions Applet|Port to QML|shaun.reich@kdemail.net|Shaun Reich}}&lt;br /&gt;
{{FeatureDone|Konsole Sessions Applet|Port to QML|shaun.reich@kdemail.net|Shaun Reich}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdesdk  =&lt;br /&gt;
&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureTodo|Okteta|Add a general KPart adapter to Kasten, than finish port of Okteta KPart to Okteta Kasten|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add global toggle option for the offset display, hex or decimal|kossebau@kde.org|Friedrich W. H. Kossebau}} &lt;br /&gt;
{{FeatureTodo|Okteta|Add Kate-like combined dialogs to query for actions on files|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add Kate-like search tool|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add Okular like embedded notifications|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for import by drop, both url and data|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for memory mapping of files and 64-bit addressing|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for jobs like io, printing, string search or filter|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add view profiles, incl. editor/manager|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|copy again puts also a value or char variant of the data to clipboard|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Improve the titels of the changes to the bytearray to be more descriptive, best using ids to avoid text string|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Make all user interaction in the KastenCore managers plugin-based|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Merge row and column widgets into one|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Store bookmarks|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Store bookmarks and other view settings for next load|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add custom datatypes to structures tool|alex.richardson@gmx.de|Alex Richardson}}&lt;br /&gt;
{{FeatureDone|Okteta|Add Flags Datatype to structures tool|alex.richardson@gmx.de|Alex Richardson}}&lt;br /&gt;
{{FeatureInProgress|dolphin-plugins|Mercurial plugin for Dolphin|vishesh3y@gmail.com|Vishesh Yadav}}&lt;br /&gt;
{{FeatureDone|KCachegrind|Upgrade interface to Callgrind (use callgrind_control instead of writing a command file, for &amp;gt; VG 3.7.x)|Josef.Weidendorfer@gmx.de|Josef Weidendorfer}} &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeutils=&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|ark|Allow Ark to be used as a KPart again|rakuco@FreeBSD.org|Raphael Kubo da Costa}}&lt;br /&gt;
{{FeatureInProgress|ksecrets|A suite of tools related to the KSecretsService infrastructure|kde@rusu.info|Valentin Rusu}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Schedules/KDE4/4.8_Feature_Plan</id>
		<title>Schedules/KDE4/4.8 Feature Plan</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Schedules/KDE4/4.8_Feature_Plan"/>
				<updated>2012-01-09T20:41:05Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* kdeplasma-addons */ add konsole, konq profiles qml&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a list of planned features for the SC 4.8 release. &lt;br /&gt;
&lt;br /&gt;
See also: &lt;br /&gt;
&lt;br /&gt;
*[[Schedules/KDE4/4.8 Release Schedule]] &lt;br /&gt;
*[[Schedules/KDE4/4.8 Release Goals]] &lt;br /&gt;
*[[Schedules/KDE4/4.7 Feature Plan]] (previous major release)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; Legend: &lt;br /&gt;
&lt;br /&gt;
*todo =&amp;amp;gt; not started yet &lt;br /&gt;
*in-progress =&amp;amp;gt; started, but not completed yet &lt;br /&gt;
*done =&amp;amp;gt; completed&lt;br /&gt;
&lt;br /&gt;
__TOC__ &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdelibs =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureDone|Kate Part|Line modification system|dhaumann@kde.org|Dominik Haumann}}&lt;br /&gt;
{{FeatureDone|Kate Part|Modeline Editor|dhaumann@kde.org|Dominik Haumann}}&lt;br /&gt;
{{FeatureDone|Kate Part|Reliable code folding|adrian.lungu89@gmail.com|Adrian Lungu}}&lt;br /&gt;
{{FeatureDone|Kate Part|Improved vi input mode|svatoslav1@gmail.com|Svyatoslav Kuzmich}}&lt;br /&gt;
{{FeatureInProgress|KIO|PreviewJob supports URLs|sebas@kde.org|Sebastian Kügler}}&lt;br /&gt;
{{FeatureInProgress|kdeui|KSecretsService API addition|kde@rusu.info|Valentin Rusu}}&lt;br /&gt;
{{FeatureInProgress|kdeui/util|Connect KWallet class to KSecretsService client API|kde@rusu.info|Valentin Rusu}}&lt;br /&gt;
{{FeatureInProgress|kcookiejar|New domain specific cookie policy based on patch provided in bug#54300|adawit@kde.org|Dawit A.}} &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kde-runtime =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|ksecretsserviced|KSecretsService daemon implementing the freedesktop.org secrets API. KDE applications will want to use the related kdelibs API (see below)|kde@rusu.info|Valentin Rusu}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|DrKonqi|Better duplicate detection|mat69@gmx.net|Matthias Fuchs}}&lt;br /&gt;
{{FeatureInProgress|KIO Thumbnails|webthumbnails plugin|sebas@kde.org|Sebastian Kügler}}&lt;br /&gt;
{{FeatureInProgress|DrKonqi|Scripting support|mat69@gmx.net|Matthias Fuchs}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Plasma QML QtComponents|mart@kde.org|Marco Martin}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kde-workspace =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureTodo|KWin|Activity switcher|wstephenson@kde.org|Will Stephenson}}&lt;br /&gt;
{{FeatureTodo|Plasma|Activity UI improvements|wstephenson@kde.org|Will Stephenson}}&lt;br /&gt;
{{FeatureInProgress|KWin|Take over screensaver/locking management from KRunner|alex.merry@kdemail.net|Alex Merry}}&lt;br /&gt;
{{FeatureDone|KCM|make mouse cursor size configurable (http://git.reviewboard.kde.org/r/101701/)|SommerLuk@gmail.com|Lukas Sommer}}&lt;br /&gt;
{{FeatureDone|powerdevil|Remove Desktop Effects Management|drf@kde.org|Dario Freddi}}&lt;br /&gt;
{{FeatureDone|powerdevil|Allow static profiles only|drf@kde.org|Dario Freddi}}&lt;br /&gt;
{{FeatureDone|powerdevil|Allow activity interaction|drf@kde.org|Dario Freddi}}&lt;br /&gt;
{{FeatureDone|Plasma|Add MPRIS2 support to nowplaying|alex.merry@kdemail.net|Alex Merry}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Allow task grouping on the taskbar to work together with kwin window tabbing|akreuzkamp@web.de|Anton Kreuzkamp}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Merge the QML version of the device notifier|mart@kde.org|Marco Martin}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Merge the QML version of the battery applet|mart@kde.org|Marco Martin}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Create hard disk activity plasmoid (to monitor I/O a la cpu, net)|shaun.reich@kdemail.net|Shaun Reich}}&lt;br /&gt;
{{FeatureDone|KWin|QML based Window switcher (Tabbox)|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureInProgress|KWin|Texture Rectangle ARB support in Shaders|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureInProgress|KWin|No Compositor restart on screen change|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureInProgress|KWin|Initial Wayland support|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureDone|KWin|Support for thumbnails in QML|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureDone|KWin|Add AnimationEffect class|thomas.luebking@gmail.com|Thomas Lübking}}&lt;br /&gt;
{{FeatureInProgress|KWin|Option to prefer the mouse position over the focus chain|thomas.luebking@gmail.com|Thomas Lübking}}&lt;br /&gt;
{{FeatureDone|KWin|More cleanup in the window rules kcm|thomas.luebking@gmail.com|Thomas Lübking}}&lt;br /&gt;
{{FeatureInProgress|KWin|Trade 1 frame lag for deterministic framerate|thomas.luebking@gmail.com|Thomas Lübking}}&lt;br /&gt;
{{FeatureInProgress|KWin|Improved resizing of windows with thin or no borders|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
{{FeatureInProgress|KWin|Move Workspace's compositing functionality to own class Compositor|a.arlt@stud.uni-heidelberg.de|Arthur Arlt}}&lt;br /&gt;
{{FeatureInProgress|KWin|Introduce class DecorationPaintRedirector for decoration handling when Compositing is active|a.arlt@stud.uni-heidelberg.de|Arthur Arlt}}&lt;br /&gt;
{{FeatureInProgress|Screenlocker|New Screenlocker and daemon|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureDone|Plasma|Merge IconTask's taskmanager changes|craig@kde.org|Craig Drummond}}&lt;br /&gt;
{{FeatureDone|KCM|Allow flag and label in keyboard layout indicator|arysin@gmail.com|Andriy Rysin}}&lt;br /&gt;
{{FeatureInProgress|KSplash|QML based ksplash|mart@kde.org|Marco Martin/Ivan Čukić}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kde-baseapps =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|Dolphin|Implement new view-engine for Dolphin 2.0 (see http://ppenz.blogspot.com/2011/08/introducing-dolphin-20.html)|peter.penz19@gmail.com|Peter Penz}}&lt;br /&gt;
{{FeatureTodo|Dolphin|Implement support for back/forward mouse buttons|sebasti@n-doerner.de|Sebastian Dörner}}&lt;br /&gt;
{{FeatureDone|Kate|Search &amp;amp; Replace in files plugin|kare.sars@iki.fi|Kåre Särs}}&lt;br /&gt;
{{FeatureInProgress|Kate|Make GDB target selection behave like the build plugin |kare.sars@iki.fi|Kåre Särs}}&lt;br /&gt;
{{FeatureInProgress|Kate|Add convenience options for remote debugging|kare.sars@iki.fi|Kåre Särs}}&lt;br /&gt;
{{FeatureDone|Settings|Improve proxy configuration dialog|adawit@kde.org|Dawit Alemayehu}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeedu  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|KTouch|New organisation of keyboard and lecture files according to languages|peter.ruethemann@gmail.com|Rüthemann Peter}}&lt;br /&gt;
{{FeatureInProgress|KTouch|New organisation of menu system: Training, Statistic, Settings|peter.ruethemann@gmail.com|Rüthemann Peter}}&lt;br /&gt;
{{FeatureTodo|KTouch|End of lecture statistics|peter.ruethemann@gmail.com|Rüthemann Peter}}&lt;br /&gt;
{{FeatureDone|Rocs|Alignment Actions to minimize crossing graph edges|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureTodo|Rocs|Project Files to combine graphs and algorithms|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureDone|Rocs|Context menu for graph scene|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureDone|Rocs|Resurrect import-/export-features|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureDone|Rocs|User Interface Cleanup|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureDone|Cantor|Add Qalculate backend|matteo@agostinelli.me|Matteo Agostinelli}}&lt;br /&gt;
{{FeatureInProgress|Cantor|Add Scilab backend|filip.saraiva@gmail.com|Filipe Saraiva}}&lt;br /&gt;
{{FeatureDone|Marble|Marble Runner plugins for Parsing files|tgridel@freedotfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureDone|Marble|(GSoC) OSM file rendering|oblaukhov.konstantin@gmail.com|Konstantin Oblaukhov}}&lt;br /&gt;
{{FeatureDone|Marble|Marble Graphics Scene (Performance of Vector Drawing)|oblaukhov.konstantin@gmail.com|Konstantin Oblaukhov}}&lt;br /&gt;
{{FeatureDone|Marble|Gps Info Plugin|tgridel@freedotfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureDone|Marble|Improve LatLonEdit to allow input as Radian and DM|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureInProgress|Marble|Marble Touch (GSoC, Marble on MeeGo/N9)|earthwings@gentoo.org|Daniel Marth, Dennis Nienhüser}}&lt;br /&gt;
{{FeatureDone|Marble|Routing API|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureInProgress|Marble|Adjustable Map Orientation (Rotation in Screen Plane)|bbeschow@cs.tu-berlin.de|Bernhard Beschow}}&lt;br /&gt;
{{FeatureDone|Marble|Speedometer Plugin|bbeschow@cs.tu-berlin.de|Bernhard Beschow}}&lt;br /&gt;
{{FeatureDone|Marble|Plasma Runner for geo coords and Marble bookmarks|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureDone|Marble|Make bookmark editor support editing the lonlat coordinates|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureDone|Marble|Fix GeoDataCoordinates parsing from a QString|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureDone|Marble|OsmNominatim improved display|tgridel@freedorfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureTodo|Marble|Create New Marble About Dialog|rahn@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureTodo|Marble|Add Float Item Management|rahn@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureTodo|Marble|New Search|rahn@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureInProgress|Marble|Make API more QML-friendly|bbeschow@cs.tu-berlin.de|Bernhard Beschow}}&lt;br /&gt;
{{FeatureTodo|KTurtle|Add modulo command|nielsslot@gmaildotcom|Niels Slot}}&lt;br /&gt;
{{FeatureDone|KGeography|Merge stuff from the cherry_field branch|aacid@kde.org|Albert Astals Cid}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdegames=&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|Libkdegames|Improve graphics performance in all games by standardizing on the use of Qt Raster Graphics.|stefan.majewsky@googlemail.com|Stefan Majewsky}}&lt;br /&gt;
{{FeatureDone|KSudoku|Add a new generator and solver to KSudoku, based on published algorithms. This will provide a full range of puzzle difficulties, rather than mainly easy puzzles, and will address bug 217925 and its duplicates 228614 and 237262 (now nearly two years old).|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KSudoku|Re-implement the puzzle-symmetry feature.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KSudoku|Re-order the puzzle types on the welcome screen.  Use KDE Games Difficulty combo-box instead of a slider. Save user's choices of puzzle between sessions.  Do minor tidy-ups of the user interface.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KGoldrunner|Add the championship level &amp;quot;Gold Rush&amp;quot; game, with Traditional rules, contributed by Gabriel Miltschitzky.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KGoldrunner|Add the championship level &amp;quot;Jail Break&amp;quot; game, with KGoldrunner rules, contributed by Gabriel Miltschitzky.|iandw.au@gmail.com|Ian Wadham}}|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdegraphics=&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureInProgress|Okular|Reset Form Action support|aacid@kde.org|Albert Astals Cid}}&lt;br /&gt;
{{FeatureDone|Okular|Viewer Mode &amp;amp; Interface.|michel.ludwig@kdemail.net|Michel Ludwig}}&lt;br /&gt;
{{FeatureDone|Okular|Table selection tool improvements|aacid@kde.org|Albert Astals Cid}}&lt;br /&gt;
{{FeatureInProgress|Gwenview|Animated image transitions|agateau@kde.org|Aurélien Gâteau}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdemultimedia =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo|JuK|MPRIS2 support|alex.merry@kdemail.net|Alex Merry}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdenetwork=&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureInProgress|KGet|Better interaction for torrents if they are seeding and other downloads stopped because of that|mat69@gmx.net|Matthias Fuchs}}&lt;br /&gt;
{{FeatureInProgress|KGet|Class that handles deleting files|mat69@gmx.net|Matthias Fuchs}}&lt;br /&gt;
{{FeatureInProgress|Kopete|Akonadi History Plugin |roideuniverse@gmail.com|Kaushik Saurabh}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdepim  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo&lt;br /&gt;
|attachment:/ kio-slave&lt;br /&gt;
|Implement kio-slave to access (email) attachments in Akonadi&lt;br /&gt;
|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|KAlarm|Port to Akonadi|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo&lt;br /&gt;
|sieve: implement wizard&lt;br /&gt;
|Implement wizard to help user to create sieve script&lt;br /&gt;
|montel@kde.org|Montel Laurent}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureDone&lt;br /&gt;
|HTML Replies&lt;br /&gt;
|Give messagecomposer (especially for KMail) the ability to compose replies in HTML&lt;br /&gt;
|nyblom@kde.org|Torgny Nyblom}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|KMail import|KMail1 setup import instead of migration|krammer@kde.org|Kevin Krammer}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|Agent control workspace integration|Monitoring and control of Akonadi agents through Plasma workspace facilitites|krammer@kde.org|Kevin Krammer}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeplasma-addons =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|Kimpanel|Port kimpanel to DataEngine based one|wengxt@gmail.com|Xuetian Weng}}&lt;br /&gt;
{{FeatureDone|IconTasks|Import IconTasks|craig@kde.org|Craig Drummond}}&lt;br /&gt;
{{FeatureDone|Konqueror Sessions Applet|Port to QML|shaun.reich@kdemail.net|Shaun Reich}}&lt;br /&gt;
{{FeatureDone|Konsole Sessions Applet|Port to QML|shaun.reich@kdemail.net|Shaun Reich}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdesdk  =&lt;br /&gt;
&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureTodo|Okteta|Add a general KPart adapter to Kasten, than finish port of Okteta KPart to Okteta Kasten|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add global toggle option for the offset display, hex or decimal|kossebau@kde.org|Friedrich W. H. Kossebau}} &lt;br /&gt;
{{FeatureTodo|Okteta|Add Kate-like combined dialogs to query for actions on files|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add Kate-like search tool|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add Okular like embedded notifications|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for import by drop, both url and data|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for memory mapping of files and 64-bit addressing|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for jobs like io, printing, string search or filter|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add view profiles, incl. editor/manager|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|copy again puts also a value or char variant of the data to clipboard|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Improve the titels of the changes to the bytearray to be more descriptive, best using ids to avoid text string|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Make all user interaction in the KastenCore managers plugin-based|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Merge row and column widgets into one|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Store bookmarks|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Store bookmarks and other view settings for next load|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add custom datatypes to structures tool|alex.richardson@gmx.de|Alex Richardson}}&lt;br /&gt;
{{FeatureDone|Okteta|Add Flags Datatype to structures tool|alex.richardson@gmx.de|Alex Richardson}}&lt;br /&gt;
{{FeatureInProgress|dolphin-plugins|Mercurial plugin for Dolphin|vishesh3y@gmail.com|Vishesh Yadav}}&lt;br /&gt;
{{FeatureDone|KCachegrind|Upgrade interface to Callgrind (use callgrind_control instead of writing a command file, for &amp;gt; VG 3.7.x)|Josef.Weidendorfer@gmx.de|Josef Weidendorfer}} &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeutils=&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|ark|Allow Ark to be used as a KPart again|rakuco@FreeBSD.org|Raphael Kubo da Costa}}&lt;br /&gt;
{{FeatureInProgress|ksecrets|A suite of tools related to the KSecretsService infrastructure|kde@rusu.info|Valentin Rusu}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Schedules/KDE4/4.8_Feature_Plan</id>
		<title>Schedules/KDE4/4.8 Feature Plan</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Schedules/KDE4/4.8_Feature_Plan"/>
				<updated>2012-01-09T20:38:17Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* kde-workspace */ add my hdd activity monitor&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a list of planned features for the SC 4.8 release. &lt;br /&gt;
&lt;br /&gt;
See also: &lt;br /&gt;
&lt;br /&gt;
*[[Schedules/KDE4/4.8 Release Schedule]] &lt;br /&gt;
*[[Schedules/KDE4/4.8 Release Goals]] &lt;br /&gt;
*[[Schedules/KDE4/4.7 Feature Plan]] (previous major release)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; Legend: &lt;br /&gt;
&lt;br /&gt;
*todo =&amp;amp;gt; not started yet &lt;br /&gt;
*in-progress =&amp;amp;gt; started, but not completed yet &lt;br /&gt;
*done =&amp;amp;gt; completed&lt;br /&gt;
&lt;br /&gt;
__TOC__ &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdelibs =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureDone|Kate Part|Line modification system|dhaumann@kde.org|Dominik Haumann}}&lt;br /&gt;
{{FeatureDone|Kate Part|Modeline Editor|dhaumann@kde.org|Dominik Haumann}}&lt;br /&gt;
{{FeatureDone|Kate Part|Reliable code folding|adrian.lungu89@gmail.com|Adrian Lungu}}&lt;br /&gt;
{{FeatureDone|Kate Part|Improved vi input mode|svatoslav1@gmail.com|Svyatoslav Kuzmich}}&lt;br /&gt;
{{FeatureInProgress|KIO|PreviewJob supports URLs|sebas@kde.org|Sebastian Kügler}}&lt;br /&gt;
{{FeatureInProgress|kdeui|KSecretsService API addition|kde@rusu.info|Valentin Rusu}}&lt;br /&gt;
{{FeatureInProgress|kdeui/util|Connect KWallet class to KSecretsService client API|kde@rusu.info|Valentin Rusu}}&lt;br /&gt;
{{FeatureInProgress|kcookiejar|New domain specific cookie policy based on patch provided in bug#54300|adawit@kde.org|Dawit A.}} &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kde-runtime =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|ksecretsserviced|KSecretsService daemon implementing the freedesktop.org secrets API. KDE applications will want to use the related kdelibs API (see below)|kde@rusu.info|Valentin Rusu}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|DrKonqi|Better duplicate detection|mat69@gmx.net|Matthias Fuchs}}&lt;br /&gt;
{{FeatureInProgress|KIO Thumbnails|webthumbnails plugin|sebas@kde.org|Sebastian Kügler}}&lt;br /&gt;
{{FeatureInProgress|DrKonqi|Scripting support|mat69@gmx.net|Matthias Fuchs}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Plasma QML QtComponents|mart@kde.org|Marco Martin}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kde-workspace =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureTodo|KWin|Activity switcher|wstephenson@kde.org|Will Stephenson}}&lt;br /&gt;
{{FeatureTodo|Plasma|Activity UI improvements|wstephenson@kde.org|Will Stephenson}}&lt;br /&gt;
{{FeatureInProgress|KWin|Take over screensaver/locking management from KRunner|alex.merry@kdemail.net|Alex Merry}}&lt;br /&gt;
{{FeatureDone|KCM|make mouse cursor size configurable (http://git.reviewboard.kde.org/r/101701/)|SommerLuk@gmail.com|Lukas Sommer}}&lt;br /&gt;
{{FeatureDone|powerdevil|Remove Desktop Effects Management|drf@kde.org|Dario Freddi}}&lt;br /&gt;
{{FeatureDone|powerdevil|Allow static profiles only|drf@kde.org|Dario Freddi}}&lt;br /&gt;
{{FeatureDone|powerdevil|Allow activity interaction|drf@kde.org|Dario Freddi}}&lt;br /&gt;
{{FeatureDone|Plasma|Add MPRIS2 support to nowplaying|alex.merry@kdemail.net|Alex Merry}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Allow task grouping on the taskbar to work together with kwin window tabbing|akreuzkamp@web.de|Anton Kreuzkamp}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Merge the QML version of the device notifier|mart@kde.org|Marco Martin}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Merge the QML version of the battery applet|mart@kde.org|Marco Martin}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Create hard disk activity plasmoid (to monitor I/O a la cpu, net)|shaun.reich@kdemail.net|Shaun Reich}}&lt;br /&gt;
{{FeatureDone|KWin|QML based Window switcher (Tabbox)|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureInProgress|KWin|Texture Rectangle ARB support in Shaders|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureInProgress|KWin|No Compositor restart on screen change|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureInProgress|KWin|Initial Wayland support|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureDone|KWin|Support for thumbnails in QML|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureDone|KWin|Add AnimationEffect class|thomas.luebking@gmail.com|Thomas Lübking}}&lt;br /&gt;
{{FeatureInProgress|KWin|Option to prefer the mouse position over the focus chain|thomas.luebking@gmail.com|Thomas Lübking}}&lt;br /&gt;
{{FeatureDone|KWin|More cleanup in the window rules kcm|thomas.luebking@gmail.com|Thomas Lübking}}&lt;br /&gt;
{{FeatureInProgress|KWin|Trade 1 frame lag for deterministic framerate|thomas.luebking@gmail.com|Thomas Lübking}}&lt;br /&gt;
{{FeatureInProgress|KWin|Improved resizing of windows with thin or no borders|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
{{FeatureInProgress|KWin|Move Workspace's compositing functionality to own class Compositor|a.arlt@stud.uni-heidelberg.de|Arthur Arlt}}&lt;br /&gt;
{{FeatureInProgress|KWin|Introduce class DecorationPaintRedirector for decoration handling when Compositing is active|a.arlt@stud.uni-heidelberg.de|Arthur Arlt}}&lt;br /&gt;
{{FeatureInProgress|Screenlocker|New Screenlocker and daemon|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureDone|Plasma|Merge IconTask's taskmanager changes|craig@kde.org|Craig Drummond}}&lt;br /&gt;
{{FeatureDone|KCM|Allow flag and label in keyboard layout indicator|arysin@gmail.com|Andriy Rysin}}&lt;br /&gt;
{{FeatureInProgress|KSplash|QML based ksplash|mart@kde.org|Marco Martin/Ivan Čukić}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kde-baseapps =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|Dolphin|Implement new view-engine for Dolphin 2.0 (see http://ppenz.blogspot.com/2011/08/introducing-dolphin-20.html)|peter.penz19@gmail.com|Peter Penz}}&lt;br /&gt;
{{FeatureTodo|Dolphin|Implement support for back/forward mouse buttons|sebasti@n-doerner.de|Sebastian Dörner}}&lt;br /&gt;
{{FeatureDone|Kate|Search &amp;amp; Replace in files plugin|kare.sars@iki.fi|Kåre Särs}}&lt;br /&gt;
{{FeatureInProgress|Kate|Make GDB target selection behave like the build plugin |kare.sars@iki.fi|Kåre Särs}}&lt;br /&gt;
{{FeatureInProgress|Kate|Add convenience options for remote debugging|kare.sars@iki.fi|Kåre Särs}}&lt;br /&gt;
{{FeatureDone|Settings|Improve proxy configuration dialog|adawit@kde.org|Dawit Alemayehu}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeedu  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|KTouch|New organisation of keyboard and lecture files according to languages|peter.ruethemann@gmail.com|Rüthemann Peter}}&lt;br /&gt;
{{FeatureInProgress|KTouch|New organisation of menu system: Training, Statistic, Settings|peter.ruethemann@gmail.com|Rüthemann Peter}}&lt;br /&gt;
{{FeatureTodo|KTouch|End of lecture statistics|peter.ruethemann@gmail.com|Rüthemann Peter}}&lt;br /&gt;
{{FeatureDone|Rocs|Alignment Actions to minimize crossing graph edges|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureTodo|Rocs|Project Files to combine graphs and algorithms|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureDone|Rocs|Context menu for graph scene|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureDone|Rocs|Resurrect import-/export-features|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureDone|Rocs|User Interface Cleanup|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureDone|Cantor|Add Qalculate backend|matteo@agostinelli.me|Matteo Agostinelli}}&lt;br /&gt;
{{FeatureInProgress|Cantor|Add Scilab backend|filip.saraiva@gmail.com|Filipe Saraiva}}&lt;br /&gt;
{{FeatureDone|Marble|Marble Runner plugins for Parsing files|tgridel@freedotfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureDone|Marble|(GSoC) OSM file rendering|oblaukhov.konstantin@gmail.com|Konstantin Oblaukhov}}&lt;br /&gt;
{{FeatureDone|Marble|Marble Graphics Scene (Performance of Vector Drawing)|oblaukhov.konstantin@gmail.com|Konstantin Oblaukhov}}&lt;br /&gt;
{{FeatureDone|Marble|Gps Info Plugin|tgridel@freedotfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureDone|Marble|Improve LatLonEdit to allow input as Radian and DM|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureInProgress|Marble|Marble Touch (GSoC, Marble on MeeGo/N9)|earthwings@gentoo.org|Daniel Marth, Dennis Nienhüser}}&lt;br /&gt;
{{FeatureDone|Marble|Routing API|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureInProgress|Marble|Adjustable Map Orientation (Rotation in Screen Plane)|bbeschow@cs.tu-berlin.de|Bernhard Beschow}}&lt;br /&gt;
{{FeatureDone|Marble|Speedometer Plugin|bbeschow@cs.tu-berlin.de|Bernhard Beschow}}&lt;br /&gt;
{{FeatureDone|Marble|Plasma Runner for geo coords and Marble bookmarks|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureDone|Marble|Make bookmark editor support editing the lonlat coordinates|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureDone|Marble|Fix GeoDataCoordinates parsing from a QString|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureDone|Marble|OsmNominatim improved display|tgridel@freedorfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureTodo|Marble|Create New Marble About Dialog|rahn@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureTodo|Marble|Add Float Item Management|rahn@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureTodo|Marble|New Search|rahn@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureInProgress|Marble|Make API more QML-friendly|bbeschow@cs.tu-berlin.de|Bernhard Beschow}}&lt;br /&gt;
{{FeatureTodo|KTurtle|Add modulo command|nielsslot@gmaildotcom|Niels Slot}}&lt;br /&gt;
{{FeatureDone|KGeography|Merge stuff from the cherry_field branch|aacid@kde.org|Albert Astals Cid}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdegames=&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|Libkdegames|Improve graphics performance in all games by standardizing on the use of Qt Raster Graphics.|stefan.majewsky@googlemail.com|Stefan Majewsky}}&lt;br /&gt;
{{FeatureDone|KSudoku|Add a new generator and solver to KSudoku, based on published algorithms. This will provide a full range of puzzle difficulties, rather than mainly easy puzzles, and will address bug 217925 and its duplicates 228614 and 237262 (now nearly two years old).|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KSudoku|Re-implement the puzzle-symmetry feature.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KSudoku|Re-order the puzzle types on the welcome screen.  Use KDE Games Difficulty combo-box instead of a slider. Save user's choices of puzzle between sessions.  Do minor tidy-ups of the user interface.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KGoldrunner|Add the championship level &amp;quot;Gold Rush&amp;quot; game, with Traditional rules, contributed by Gabriel Miltschitzky.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KGoldrunner|Add the championship level &amp;quot;Jail Break&amp;quot; game, with KGoldrunner rules, contributed by Gabriel Miltschitzky.|iandw.au@gmail.com|Ian Wadham}}|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdegraphics=&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureInProgress|Okular|Reset Form Action support|aacid@kde.org|Albert Astals Cid}}&lt;br /&gt;
{{FeatureDone|Okular|Viewer Mode &amp;amp; Interface.|michel.ludwig@kdemail.net|Michel Ludwig}}&lt;br /&gt;
{{FeatureDone|Okular|Table selection tool improvements|aacid@kde.org|Albert Astals Cid}}&lt;br /&gt;
{{FeatureInProgress|Gwenview|Animated image transitions|agateau@kde.org|Aurélien Gâteau}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdemultimedia =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo|JuK|MPRIS2 support|alex.merry@kdemail.net|Alex Merry}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdenetwork=&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureInProgress|KGet|Better interaction for torrents if they are seeding and other downloads stopped because of that|mat69@gmx.net|Matthias Fuchs}}&lt;br /&gt;
{{FeatureInProgress|KGet|Class that handles deleting files|mat69@gmx.net|Matthias Fuchs}}&lt;br /&gt;
{{FeatureInProgress|Kopete|Akonadi History Plugin |roideuniverse@gmail.com|Kaushik Saurabh}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdepim  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo&lt;br /&gt;
|attachment:/ kio-slave&lt;br /&gt;
|Implement kio-slave to access (email) attachments in Akonadi&lt;br /&gt;
|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|KAlarm|Port to Akonadi|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo&lt;br /&gt;
|sieve: implement wizard&lt;br /&gt;
|Implement wizard to help user to create sieve script&lt;br /&gt;
|montel@kde.org|Montel Laurent}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureDone&lt;br /&gt;
|HTML Replies&lt;br /&gt;
|Give messagecomposer (especially for KMail) the ability to compose replies in HTML&lt;br /&gt;
|nyblom@kde.org|Torgny Nyblom}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|KMail import|KMail1 setup import instead of migration|krammer@kde.org|Kevin Krammer}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|Agent control workspace integration|Monitoring and control of Akonadi agents through Plasma workspace facilitites|krammer@kde.org|Kevin Krammer}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeplasma-addons =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|Kimpanel|Port kimpanel to DataEngine based one|wengxt@gmail.com|Xuetian Weng}}&lt;br /&gt;
{{FeatureDone|IconTasks|Import IconTasks|craig@kde.org|Craig Drummond}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdesdk  =&lt;br /&gt;
&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureTodo|Okteta|Add a general KPart adapter to Kasten, than finish port of Okteta KPart to Okteta Kasten|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add global toggle option for the offset display, hex or decimal|kossebau@kde.org|Friedrich W. H. Kossebau}} &lt;br /&gt;
{{FeatureTodo|Okteta|Add Kate-like combined dialogs to query for actions on files|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add Kate-like search tool|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add Okular like embedded notifications|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for import by drop, both url and data|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for memory mapping of files and 64-bit addressing|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for jobs like io, printing, string search or filter|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add view profiles, incl. editor/manager|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|copy again puts also a value or char variant of the data to clipboard|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Improve the titels of the changes to the bytearray to be more descriptive, best using ids to avoid text string|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Make all user interaction in the KastenCore managers plugin-based|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Merge row and column widgets into one|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Store bookmarks|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Store bookmarks and other view settings for next load|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add custom datatypes to structures tool|alex.richardson@gmx.de|Alex Richardson}}&lt;br /&gt;
{{FeatureDone|Okteta|Add Flags Datatype to structures tool|alex.richardson@gmx.de|Alex Richardson}}&lt;br /&gt;
{{FeatureInProgress|dolphin-plugins|Mercurial plugin for Dolphin|vishesh3y@gmail.com|Vishesh Yadav}}&lt;br /&gt;
{{FeatureDone|KCachegrind|Upgrade interface to Callgrind (use callgrind_control instead of writing a command file, for &amp;gt; VG 3.7.x)|Josef.Weidendorfer@gmx.de|Josef Weidendorfer}} &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeutils=&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|ark|Allow Ark to be used as a KPart again|rakuco@FreeBSD.org|Raphael Kubo da Costa}}&lt;br /&gt;
{{FeatureInProgress|ksecrets|A suite of tools related to the KSecretsService infrastructure|kde@rusu.info|Valentin Rusu}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Git/Configuration</id>
		<title>Development/Git/Configuration</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Git/Configuration"/>
				<updated>2011-12-27T05:29:45Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: Add gitexcludes file documentation, now that I've added it to kdelibs master (well, frameworks branch apparently)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Git Configuration ==&lt;br /&gt;
&lt;br /&gt;
How to set up Git for use in KDE.&lt;br /&gt;
&lt;br /&gt;
=== Quick Start ===&lt;br /&gt;
&lt;br /&gt;
To quickly set up git to just build a copy of KDE you do not need to perform any git configuration, however the following steps will simplify using Git:&lt;br /&gt;
&lt;br /&gt;
* [[../Configuration#URL_Renaming|URL Renaming]]&lt;br /&gt;
&lt;br /&gt;
If you plan to commit to a KDE repository using Git then you should follow all the steps on this page.&lt;br /&gt;
&lt;br /&gt;
=== Configuration Levels ===&lt;br /&gt;
&lt;br /&gt;
Your Git configuration operates at 3 levels:&lt;br /&gt;
* System&lt;br /&gt;
* User&lt;br /&gt;
* Repository&lt;br /&gt;
&lt;br /&gt;
The System Level sets up global Git configuration defaults for every User and Repository on your system.  We will ignore these for our purposes as they are usually blank.&lt;br /&gt;
&lt;br /&gt;
The User Level (aka Global) sets up the default configuration for a particular User to apply to all repositories used by that User.  Settings made at this level will always override any matching System Level settings.  The User Configuration is stored in your ~/.gitconfig file.&lt;br /&gt;
&lt;br /&gt;
The Repository Level sets up the configuration for a particular Repository clone.  Settings made at this level will always override any matching User or System Level settings.  The Repository Configuration is stored in the repository .git/config file.&lt;br /&gt;
&lt;br /&gt;
The recommended KDE Git Configuration will set some settings at a user level and some at a repository level.  You may wish to change the level some settings apply at however as we will assume you only or mostly use Git for developing KDE.&lt;br /&gt;
&lt;br /&gt;
You can set Git settings either by directly editing the config files, but it is far safer to use the ''git config'' command.&lt;br /&gt;
&lt;br /&gt;
To set a Git setting at User level (i.e. in ~/.gitconfig):&lt;br /&gt;
&lt;br /&gt;
 git config --global &amp;lt;key&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To set a Git setting at repo level (i.e in &amp;lt;repo&amp;gt;/.git/config):&lt;br /&gt;
&lt;br /&gt;
 cd &amp;lt;repo&amp;gt;&lt;br /&gt;
 git config &amp;lt;key&amp;gt; &amp;lt;value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Basic Settings ===&lt;br /&gt;
&lt;br /&gt;
If you plan to commit to KDE Git, then you will need to set up git to use your identity.kde.org name and details to help identify your work:&lt;br /&gt;
&lt;br /&gt;
 git config --global user.name &amp;lt;Your Real Name&amp;gt;&lt;br /&gt;
 git config --global user.email &amp;lt;Your identity.kde.org email&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The name and email address you configure will be used as the author information for every commit you make. Note that in order for commit message keywords such as BUG and CCBUG to work, your Bugzilla account email address has to match the email address used in your commits.&lt;br /&gt;
&lt;br /&gt;
To enable colored output when using git:&lt;br /&gt;
&lt;br /&gt;
 git config --global color.ui true&lt;br /&gt;
&lt;br /&gt;
=== Commit Template ===&lt;br /&gt;
&lt;br /&gt;
The Commit Template is a standard layout for commit messages, usually containing instructions for how a project expects messages to formatted and what details are to be included.  You can choose to set a User Level template as a default, then use any project level variations at a repo level.&lt;br /&gt;
&lt;br /&gt;
It is recommended to use the kdelibs template as your default.  Once you have cloned kdelibs then set as follows to ensure you use the latest available version:&lt;br /&gt;
&lt;br /&gt;
 git config --global commit.template &amp;lt;path/to/kdelibs/&amp;gt;.commit-template&lt;br /&gt;
&lt;br /&gt;
If you don't plan to have kdelibs cloned then download the kdelibs template from [https://projects.kde.org/projects/kde/kdelibs/repository/revisions/master/raw/.commit-template here], save as ~/.commit-template, and configure to use that copy:&lt;br /&gt;
&lt;br /&gt;
 git config --global commit.template ~/.commit-template&lt;br /&gt;
&lt;br /&gt;
When cloning other KDE repositories, you should check to see if they have a project specific commit template, and if so you should set that at a repo level:&lt;br /&gt;
&lt;br /&gt;
 cd &amp;lt;repo&amp;gt;&lt;br /&gt;
 git config commit.template .commit-template&lt;br /&gt;
&lt;br /&gt;
=== Exclusion rules ===&lt;br /&gt;
It's often necessary or desirable to limit the types of files that git will consider when commands like 'git status' and 'git add' or 'git add --all' are run. There are 2 types of exclusion rules.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first, is a .gitignore in the repository. This text file will contain a list of wildcard expressions to ignore files and/or dirs. It can also contain bash-like comments (#) in addition to new lines.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The second method is similar to the first, except it is specified globally and will override (and add to) settings specified on a per-repository basis. This file can be named whatever, wherever, as long as it is specified in your ~/.gitconfig file.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An example .gitexcludes file can be found in kdelibs from [https://projects.kde.org/projects/kde/kdelibs/repository/revisions/master/raw/.gitexcludes here], save as ~/.gitexcludes, and configure to use that copy using:&lt;br /&gt;
&lt;br /&gt;
 git config --global core.excludesfile ~/.gitexcludes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or alternatively, edit ~/.gitconfig manually and specify:&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [core]&lt;br /&gt;
    excludesfile = ~/.gitexcludes&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remember that this file is meant to be a global exclusion rule, so you probably shouldn't use it on a per-repo basis unless you really feel the need. The file excludes archive files (tar, gz, 7z, rar, etc.) as well as .directory, thumbs.db(Microsoft Windows file), .swp (swap file, used for vim and kate), as well as many many others.&lt;br /&gt;
&lt;br /&gt;
=== Push Default ===&lt;br /&gt;
&lt;br /&gt;
It is recommended for new Git users to set the push default to nothing:&lt;br /&gt;
&lt;br /&gt;
 git config --global push.default nothing&lt;br /&gt;
&lt;br /&gt;
This option forces you to ''always'' enter the name of the remote branch you wish to push to, rather than using a default value.  This is good practice as it ensures you push to the correct remote branch and avoid accidentally pushing all local branches to the remote.&lt;br /&gt;
&lt;br /&gt;
More experienced users may wish to set the option to tracking:&lt;br /&gt;
&lt;br /&gt;
 git config --global push.default tracking&lt;br /&gt;
&lt;br /&gt;
This will default to push to the remote branch your local branch is tracking, but if you setup your local branch incorrectly you may still accidentally push to the wrong remote.&lt;br /&gt;
&lt;br /&gt;
=== URL Renaming ===&lt;br /&gt;
&lt;br /&gt;
Instead of having to remember and type in the different full git addresses for pulling and pushing, we recommend you manually add the following to your Git User Configuration (~/.gitconfig):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;[url &amp;quot;git://anongit.kde.org/&amp;quot;]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     insteadOf = kde:&lt;br /&gt;
 [url &amp;quot;git@git.kde.org:&amp;quot;]&lt;br /&gt;
     pushInsteadOf = kde:&lt;br /&gt;
&lt;br /&gt;
=== Bash Auto-Completion ===&lt;br /&gt;
&lt;br /&gt;
Bash auto-completion for Git commands and branches may or may not work out-of-the-box for you depending on how Git is installed on your system.  To see if you have auto-completion already working type ''git'' on your command line followed by a space and hit the ''tab'' key twice.  If you see a list of available git commands then you have Git auto-completion enabled.&lt;br /&gt;
&lt;br /&gt;
If auto-completion does not work for you then you can download the [http://git.kernel.org/?p=git/git.git;a=blob_plain;f=contrib/completion/git-completion.bash;hb=HEAD git-completion.bash] script and follow the instructions inside it.&lt;br /&gt;
&lt;br /&gt;
=== Bash Prompt ===&lt;br /&gt;
&lt;br /&gt;
If you have git-completion.bash installed, you can also add details like the branch name and dirty status to your command prompt, which will save repeated uses of ''git branch'' and ''git status''.&lt;br /&gt;
&lt;br /&gt;
To activate this, you need to add the following to your $PS1 environment variable:&lt;br /&gt;
&lt;br /&gt;
 $(__git_ps1 &amp;quot; (%s)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Note that in the &amp;quot; (%s)&amp;quot; part the %s variable is replaced with the branch name, the rest of the text between the quotes is up to you.&lt;br /&gt;
&lt;br /&gt;
If you have not set a PS1 value yourself, then you are likely to be using your distro default value which you can find out by typing:&lt;br /&gt;
&lt;br /&gt;
 echo $PS1&lt;br /&gt;
&lt;br /&gt;
To change this for your user, edit your .bashrc and copy the result of the echo command into there, then change it to add the Git branch.&lt;br /&gt;
&lt;br /&gt;
For example, if ''echo $PS1'' shows:&lt;br /&gt;
&lt;br /&gt;
 $(ppwd \l)\u@\h:\w&amp;gt;&lt;br /&gt;
&lt;br /&gt;
then add the following to your .bashrc:&lt;br /&gt;
&lt;br /&gt;
 PS1='$(ppwd \l)\u@\h:\w$(__git_ps1 &amp;quot; (%s)&amp;quot;)&amp;gt; ' &lt;br /&gt;
&lt;br /&gt;
which will show your prompt as follows:&lt;br /&gt;
&lt;br /&gt;
 odysseus@argo:~/kde/src/trunk/KDE/kdelibs (master + u+2)&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can learn more about customizing your bash prompt at http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/.&lt;br /&gt;
&lt;br /&gt;
You can also have the prompt show the 'dirty' status of your repo, i.e. if you have uncommited changes, and whether your branch differs from upstream HEAD:&lt;br /&gt;
&lt;br /&gt;
* * = unstaged changes&lt;br /&gt;
* + = staged changes&lt;br /&gt;
* $ = stashed changes&lt;br /&gt;
* % = untracked files&lt;br /&gt;
* u-1 = behind upstream by 1 commit&lt;br /&gt;
* u+2 = ahead of upstream by 2 commits&lt;br /&gt;
* u= = same as upstream&lt;br /&gt;
&lt;br /&gt;
To enable showing the dirty (unstaged/staged) state, add the following line to your .bashrc 'before' your PS1 setting:&lt;br /&gt;
&lt;br /&gt;
 export GIT_PS1_SHOWDIRTYSTATE=1&lt;br /&gt;
&lt;br /&gt;
To enable showing the stashed state, add the following line to your .bashrc ''before'' your PS1 setting:&lt;br /&gt;
&lt;br /&gt;
 export GIT_PS1_SHOWSTASHSTATE=1&lt;br /&gt;
&lt;br /&gt;
To enable showing the untracked state, add the following line to your .bashrc ''before'' your PS1 setting:&lt;br /&gt;
&lt;br /&gt;
 export GIT_PS1_SHOWUNTRACKEDFILES=1&lt;br /&gt;
&lt;br /&gt;
To enable showing the upstream state, add the following line to your .bashrc ''before'' your PS1 setting:&lt;br /&gt;
&lt;br /&gt;
 export GIT_PS1_SHOWUPSTREAM=&amp;quot;auto verbose&amp;quot;&lt;br /&gt;
&lt;br /&gt;
To not show the number of commits ahead or behind remove the &amp;quot;verbose&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
To disable showing the dirty state for any one repo:&lt;br /&gt;
&lt;br /&gt;
 cd &amp;lt;repo&amp;gt;&lt;br /&gt;
 git config bash.showDirtyState false&lt;br /&gt;
&lt;br /&gt;
To disable showing the upstream state for any one repo:&lt;br /&gt;
&lt;br /&gt;
 cd &amp;lt;repo&amp;gt;&lt;br /&gt;
 git config bash.showUpstream false&lt;br /&gt;
&lt;br /&gt;
=== Multiple Work Branches ===&lt;br /&gt;
&lt;br /&gt;
You will often want to have more than one build environment in parallel, for example if you want to work on both stable and unstable branches at the same time.&lt;br /&gt;
&lt;br /&gt;
With Git you can easily have many work branches in your repository and easily switch between them.  The problem here however is that you can only work on the one branch at a time, and switching branches will usually trigger a massive rebuild of the entire repository.  &lt;br /&gt;
&lt;br /&gt;
One solution would be to have a separate repository clone for each branch you wish to work on in parallel, but this takes up more disk space, the clones and branches can easily get out-of-sync, and it makes forward/back porting bug fixes between branches more difficult.  If choosing this method then you should make each new clone from your initial local clone rather than from the main repo as this will be quicker.&lt;br /&gt;
&lt;br /&gt;
The ideal solution is for a single git repository clone to provide separate source directories for each branch you wish to work on.  This can be achieved using the git-new-workdir script provided in the Git contrib directory.  This script uses sym-links to create what appears as a new clone in a separate folder but actually uses the same local clone.&lt;br /&gt;
&lt;br /&gt;
The git-new-workdir script may be installed as part of your system git.  If not download the script from [https://github.com/git/git/raw/master/contrib/workdir/git-new-workdir the git repo] and install in your ~/.bin.&lt;br /&gt;
&lt;br /&gt;
For example, assuming your have a kdelibs.git clone living in ~/kde/src/master/kdelibs, then the following command will create a 4.6 work branch in ~/kde/src/4.6/kdelibs:&lt;br /&gt;
&lt;br /&gt;
 git-new-workdir ~/kde/src/master/kdelibs ~/kde/src/4.6/kdelibs KDE/4.6&lt;br /&gt;
&lt;br /&gt;
== RSA Key fingerprint for git.kde.org==&lt;br /&gt;
c8:45:ba:89:85:11:78:b5:a4:09:d9:31:f6:7f:7c:79&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Getting_Started/Build</id>
		<title>Getting Started/Build</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Getting_Started/Build"/>
				<updated>2011-12-21T20:08:16Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* build-tool */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{warning|These pages are currently being completely re-written to reflect the new KDE infrastructure and may not be in a consistent state.  Information and commands on some page may no longer be valid and should be used with care.}}&lt;br /&gt;
&lt;br /&gt;
{{Template:I18n/Language Navigation Bar|Getting Started/Build}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
This page provides an overview of the KDE build process.  Once you complete the steps described here you will have a complete KDE development system customized to your needs.&lt;br /&gt;
&lt;br /&gt;
== Build Steps ==&lt;br /&gt;
&lt;br /&gt;
This section will briefly explain the concepts and steps involved in building software so you are not being asked to blindly follow some recipes you do not understand.&lt;br /&gt;
&lt;br /&gt;
It is assumed you are at least familiar with the basics of using the command line.&lt;br /&gt;
&lt;br /&gt;
Once you have read the summary you can see a [[/Example|worked example here]].&lt;br /&gt;
&lt;br /&gt;
=== Source ===&lt;br /&gt;
&lt;br /&gt;
The ''Source'' step is obtaining a local copy of the source code that you want to build.  For a detailed explanation of where to obtain the source code and how KDE stores and organizes our source code please read the [[Getting_Started/Sources|KDE Sources section]].&lt;br /&gt;
&lt;br /&gt;
The two main options here are to either download a snapshot tarball of the code, or to directly access the source code repository.  For developing on the unstable branch of the KDE SC it is recommended you directly access the required repositories.&lt;br /&gt;
&lt;br /&gt;
=== Configure ===&lt;br /&gt;
&lt;br /&gt;
The ''Configure'' step is setting up how the source code is to be built and installed.&lt;br /&gt;
&lt;br /&gt;
=== Build ===&lt;br /&gt;
&lt;br /&gt;
The ''Build'' step is compiling the source code and linking it to other libraries to create the new executables and libraries.&lt;br /&gt;
&lt;br /&gt;
=== Install ===&lt;br /&gt;
&lt;br /&gt;
The ''Install'' step is copy the new executables and libraries somewhere that they can be found and run from.&lt;br /&gt;
&lt;br /&gt;
=== Update ===&lt;br /&gt;
&lt;br /&gt;
The ''Update'' step is updating an existing build to use the latest version of the source code and then re-building and re-installing it.&lt;br /&gt;
&lt;br /&gt;
== Scripted Builds ==&lt;br /&gt;
&lt;br /&gt;
The easiest way to build the KDE SC from scratch is to use one of the build scripts that are available.  This approach is highly recommended for those new to building KDE SC as it takes care of the Source, Configure, Build, Install and Update steps for you.  The builds remain compatible with the manual methods of building KDE SC so you can change later if you want.&lt;br /&gt;
&lt;br /&gt;
Even KDE Core Developers use build scripts like these as opposed to doing everything manually, as there's just no point otherwise.&lt;br /&gt;
&lt;br /&gt;
* The [[/kdesrc-build|kdesrc-build]] script by Michael Pyne&lt;br /&gt;
* The [http://michael-jansen.biz/build-tool build-tool] script by Michael Jansen&lt;br /&gt;
&lt;br /&gt;
If you run into any issues, be sure to ask either on the kde-devel mailing list, or the #kde-devel IRC channel (which many developers reside in and are willing to ask any questions or address any problems encountered).&lt;br /&gt;
&lt;br /&gt;
== kdesrc-build ==&lt;br /&gt;
&lt;br /&gt;
=== build-tool ===&lt;br /&gt;
&lt;br /&gt;
Build-tool is a ruby program which is meant not for just building KDE, but also can easily be expanded to compile any other applications. It also has some neat features like progress bars and eta for compile time. It can also automatically generate a ~/.xsessionrc which can be used by KDM when you select to boot into a &amp;quot;Custom&amp;quot; session type. That will enable you to easily get into a KDE session which was built from source, without even having to modify any of your scripts like ~/.bashrc, ~/.zshrc, etc.&lt;br /&gt;
&lt;br /&gt;
Install rubygems through your package manager. Run 'sudo gem install build-tool'. Now that build-tool is installed, we need to install the KDE recipes to have it build KDE from source. Run 'build-tool recipe add git://gitorious.org/build-tool/kde-trunk-recipe.git kde' to add the KDE recipe to the program. Then 'build-tool recipes install kde'. From there, you can run 'kde-build help' to see the commands available for the KDE recipe, as well as compile and update the git repositories. &lt;br /&gt;
For more detailed information, visit: [[http://michael-jansen.biz/content/quick-start]]&lt;br /&gt;
&lt;br /&gt;
== Platform Specific Information ==&lt;br /&gt;
&lt;br /&gt;
The build process described in these pages is kept as simple and generic as possible, but it is generally assumed you are building KDE4 on Linux.  Extra information about building KDE Software on specific distributions or platforms, or under certain conditions can be found at the following links:&lt;br /&gt;
&lt;br /&gt;
* [[/Distributions|Linux, BSD and other *nix based distributions]]&lt;br /&gt;
* [[/Windows|Microsoft Windows]]&lt;br /&gt;
* [[/Mac_OS_X|Apple Mac OS X]]&lt;br /&gt;
* [[/KDE4/on_virtual_machines|On a Virtual Machine]].&lt;br /&gt;
* [[/Historic|Building historic versions of KDE Software (KDE3 and KDE2)]]&lt;br /&gt;
&lt;br /&gt;
== Stable versus Unstable ==&lt;br /&gt;
&lt;br /&gt;
A stable build is a released and supported version of KDE Software, such as KDE SC 4.6.  This software is guaranteed to remain unchanged other than bug-fixes.  You will want a Stable build if you want to use the KDE Software for normal use or to develop bug fixes.&lt;br /&gt;
&lt;br /&gt;
An unstable build is the latest development version of KDE Software and is not guaranteed to build or run properly at any given time.  You will want an Unstable build if you want to develop new features for KDE Software.&lt;br /&gt;
&lt;br /&gt;
In Git, the Unstable branch is called Master while in Subversion it is called Trunk.&lt;br /&gt;
&lt;br /&gt;
== Build and Install ==&lt;br /&gt;
&lt;br /&gt;
You need to complete each of the following steps to build and/or install a working KDE development system. Manually building KDE Software requires that you first set up the build environment and install the required development tools and libraries.&lt;br /&gt;
&lt;br /&gt;
* Choose the appropriate [[/Methods|Build Method]] for your requirements&lt;br /&gt;
* Set up your [[/Environment|Build Environment]]&lt;br /&gt;
* Choose the appropriate [[/Recipes|Build Recipes]] for your requirements and environment&lt;br /&gt;
* Install the [[/Requirements|Build Requirements]]&lt;br /&gt;
* Install or build [[/Qt|Qt]]&lt;br /&gt;
* Install or build [[/KDE_Support|KDE Support]]&lt;br /&gt;
* Install or build [[/KDE_Development_Platform|KDE Development Platform]]&lt;br /&gt;
* Install or build [[/KDE_Workspace|KDE Workspace]]&lt;br /&gt;
* [[/KDE_Applications|Build KDE Applications]]&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting The Build ==&lt;br /&gt;
&lt;br /&gt;
Compile and Linking errors are frequent sources of discouragement. Make careful note of the first occurrence of an error in your build process. It could be as simple as a bad environment variable, an unexpected version of a library or missing prerequisite.  Please read the instructions carefully.&lt;br /&gt;
&lt;br /&gt;
Please review your logs and do searches for fixes. If you cannot find a solution, try the [[/Troubleshooting|Troubleshooting]] page.  If you still cannot resolve the problem then please [[Development/Getting_Help|ask for help]] on IRC or a Mailing List.&lt;br /&gt;
&lt;br /&gt;
[[Category:Build KDE]]&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Getting_Started/Build</id>
		<title>Getting Started/Build</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Getting_Started/Build"/>
				<updated>2011-12-21T20:07:50Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* Scripted Builds */ further build-tool info. i don't know kdesrc-build, so I can't add stuff about that.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{warning|These pages are currently being completely re-written to reflect the new KDE infrastructure and may not be in a consistent state.  Information and commands on some page may no longer be valid and should be used with care.}}&lt;br /&gt;
&lt;br /&gt;
{{Template:I18n/Language Navigation Bar|Getting Started/Build}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
This page provides an overview of the KDE build process.  Once you complete the steps described here you will have a complete KDE development system customized to your needs.&lt;br /&gt;
&lt;br /&gt;
== Build Steps ==&lt;br /&gt;
&lt;br /&gt;
This section will briefly explain the concepts and steps involved in building software so you are not being asked to blindly follow some recipes you do not understand.&lt;br /&gt;
&lt;br /&gt;
It is assumed you are at least familiar with the basics of using the command line.&lt;br /&gt;
&lt;br /&gt;
Once you have read the summary you can see a [[/Example|worked example here]].&lt;br /&gt;
&lt;br /&gt;
=== Source ===&lt;br /&gt;
&lt;br /&gt;
The ''Source'' step is obtaining a local copy of the source code that you want to build.  For a detailed explanation of where to obtain the source code and how KDE stores and organizes our source code please read the [[Getting_Started/Sources|KDE Sources section]].&lt;br /&gt;
&lt;br /&gt;
The two main options here are to either download a snapshot tarball of the code, or to directly access the source code repository.  For developing on the unstable branch of the KDE SC it is recommended you directly access the required repositories.&lt;br /&gt;
&lt;br /&gt;
=== Configure ===&lt;br /&gt;
&lt;br /&gt;
The ''Configure'' step is setting up how the source code is to be built and installed.&lt;br /&gt;
&lt;br /&gt;
=== Build ===&lt;br /&gt;
&lt;br /&gt;
The ''Build'' step is compiling the source code and linking it to other libraries to create the new executables and libraries.&lt;br /&gt;
&lt;br /&gt;
=== Install ===&lt;br /&gt;
&lt;br /&gt;
The ''Install'' step is copy the new executables and libraries somewhere that they can be found and run from.&lt;br /&gt;
&lt;br /&gt;
=== Update ===&lt;br /&gt;
&lt;br /&gt;
The ''Update'' step is updating an existing build to use the latest version of the source code and then re-building and re-installing it.&lt;br /&gt;
&lt;br /&gt;
== Scripted Builds ==&lt;br /&gt;
&lt;br /&gt;
The easiest way to build the KDE SC from scratch is to use one of the build scripts that are available.  This approach is highly recommended for those new to building KDE SC as it takes care of the Source, Configure, Build, Install and Update steps for you.  The builds remain compatible with the manual methods of building KDE SC so you can change later if you want.&lt;br /&gt;
&lt;br /&gt;
Even KDE Core Developers use build scripts like these as opposed to doing everything manually, as there's just no point otherwise.&lt;br /&gt;
&lt;br /&gt;
* The [[/kdesrc-build|kdesrc-build]] script by Michael Pyne&lt;br /&gt;
* The [http://michael-jansen.biz/build-tool build-tool] script by Michael Jansen&lt;br /&gt;
&lt;br /&gt;
If you run into any issues, be sure to ask either on the kde-devel mailing list, or the #kde-devel IRC channel (which many developers reside in and are willing to ask any questions or address any problems encountered).&lt;br /&gt;
&lt;br /&gt;
== kdesrc-build ==&lt;br /&gt;
&lt;br /&gt;
=== build-tool ===&lt;br /&gt;
&lt;br /&gt;
Build-tool is a ruby program which is meant not for just building KDE, but also can easily be expanded to compile any other applications. It also has some neat features like progress bars and eta for compile time. It can also automatically generate a ~/.xsessionrc which can be used by KDM when you select to boot into a &amp;quot;Custom&amp;quot; session type. That will enable you to easily get into a KDE session which was built from source, without even having to modify any of your scripts like ~/.bashrc, ~/.zshrc, etc.&lt;br /&gt;
&lt;br /&gt;
Install rubygems through your package manager. Run 'sudo gem install build-tool'. Now that build-tool is installed, we need to install the KDE recipes to have it build KDE from source. Run 'build-tool recipe add git://gitorious.org/build-tool/kde-trunk-recipe.git kde' to add the KDE recipe to the program. Then 'build-tool recipes install kde'. From there, you can run 'kde-build help' to see the commands available for the KDE recipe, as well as compile and update the git repositories. &lt;br /&gt;
For more detailed information, visit: [[http://michael-jansen.biz/content/quick-start|kde-build quick start]]&lt;br /&gt;
&lt;br /&gt;
== Platform Specific Information ==&lt;br /&gt;
&lt;br /&gt;
The build process described in these pages is kept as simple and generic as possible, but it is generally assumed you are building KDE4 on Linux.  Extra information about building KDE Software on specific distributions or platforms, or under certain conditions can be found at the following links:&lt;br /&gt;
&lt;br /&gt;
* [[/Distributions|Linux, BSD and other *nix based distributions]]&lt;br /&gt;
* [[/Windows|Microsoft Windows]]&lt;br /&gt;
* [[/Mac_OS_X|Apple Mac OS X]]&lt;br /&gt;
* [[/KDE4/on_virtual_machines|On a Virtual Machine]].&lt;br /&gt;
* [[/Historic|Building historic versions of KDE Software (KDE3 and KDE2)]]&lt;br /&gt;
&lt;br /&gt;
== Stable versus Unstable ==&lt;br /&gt;
&lt;br /&gt;
A stable build is a released and supported version of KDE Software, such as KDE SC 4.6.  This software is guaranteed to remain unchanged other than bug-fixes.  You will want a Stable build if you want to use the KDE Software for normal use or to develop bug fixes.&lt;br /&gt;
&lt;br /&gt;
An unstable build is the latest development version of KDE Software and is not guaranteed to build or run properly at any given time.  You will want an Unstable build if you want to develop new features for KDE Software.&lt;br /&gt;
&lt;br /&gt;
In Git, the Unstable branch is called Master while in Subversion it is called Trunk.&lt;br /&gt;
&lt;br /&gt;
== Build and Install ==&lt;br /&gt;
&lt;br /&gt;
You need to complete each of the following steps to build and/or install a working KDE development system. Manually building KDE Software requires that you first set up the build environment and install the required development tools and libraries.&lt;br /&gt;
&lt;br /&gt;
* Choose the appropriate [[/Methods|Build Method]] for your requirements&lt;br /&gt;
* Set up your [[/Environment|Build Environment]]&lt;br /&gt;
* Choose the appropriate [[/Recipes|Build Recipes]] for your requirements and environment&lt;br /&gt;
* Install the [[/Requirements|Build Requirements]]&lt;br /&gt;
* Install or build [[/Qt|Qt]]&lt;br /&gt;
* Install or build [[/KDE_Support|KDE Support]]&lt;br /&gt;
* Install or build [[/KDE_Development_Platform|KDE Development Platform]]&lt;br /&gt;
* Install or build [[/KDE_Workspace|KDE Workspace]]&lt;br /&gt;
* [[/KDE_Applications|Build KDE Applications]]&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting The Build ==&lt;br /&gt;
&lt;br /&gt;
Compile and Linking errors are frequent sources of discouragement. Make careful note of the first occurrence of an error in your build process. It could be as simple as a bad environment variable, an unexpected version of a library or missing prerequisite.  Please read the instructions carefully.&lt;br /&gt;
&lt;br /&gt;
Please review your logs and do searches for fixes. If you cannot find a solution, try the [[/Troubleshooting|Troubleshooting]] page.  If you still cannot resolve the problem then please [[Development/Getting_Help|ask for help]] on IRC or a Mailing List.&lt;br /&gt;
&lt;br /&gt;
[[Category:Build KDE]]&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted</id>
		<title>Development/Tutorials/Plasma/QML/GettingStarted</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted"/>
				<updated>2011-08-23T16:45:04Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* metadata.desktop */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Writing a plasma applet in QML is very easy, in fact, with KDE 4.6 and Qt 4.7 it just works.&lt;br /&gt;
&lt;br /&gt;
== QML Basics ==&lt;br /&gt;
&lt;br /&gt;
It is recommended that you have read through the [http://doc.qt.nokia.com/4.7/qtquick.html Qt QML Tutorials], as there are quite a few and they are explained thoroughly. There is also a list of all [http://doc.qt.nokia.com/4.7/qdeclarativeelements.html standard QML elements].&lt;br /&gt;
&lt;br /&gt;
Essentially, most of the content is the same. The exceptions to be noted are how data is gathered...since we use Data Engines, it is a bit different. Text color and font should be made to use PlasmaCore.Theme.&lt;br /&gt;
&lt;br /&gt;
See the [https://projects.kde.org/projects/kde/kdeexamples/repository KDE Examples] repository for more KDE-related helpful resources. Also of use (which use QML and Plasma) are: [https://projects.kde.org/projects/playground/base/plasma-mobile/repository Plasma Mobile], [https://projects.kde.org/projects/playground/base/declarative-plasmoids/repository Declarative Plasmoids (playground)], for WIP ports of C++ originals&lt;br /&gt;
&lt;br /&gt;
=== Root Item ===&lt;br /&gt;
&lt;br /&gt;
The root item can be anything that inherits QGraphicsItem. For example, in this case it is QGraphicsWidget which is a plasmoid. It can also simply be an Item. I also noticed that PathView does not respond to mouse inputs automatically (so flicking doesn't work). Probably because events are being intercepted. So take note, it'll have to be e.g. an Item, for that case.&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
&lt;br /&gt;
==== Row and Column ====&lt;br /&gt;
&lt;br /&gt;
==== Anchors ====&lt;br /&gt;
Anchor layouts offer a nice way of grouping UI elements nicely together. The idea is that you connect edges or corners of one element to the edge or corner of another widget.&lt;br /&gt;
Some examples:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 200&lt;br /&gt;
    height: 300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Text {&lt;br /&gt;
        id: first&lt;br /&gt;
        text: i18n(&amp;quot;1st line&amp;quot;)&lt;br /&gt;
        anchors { &lt;br /&gt;
            top: parent.top;&lt;br /&gt;
            left: parent.left;&lt;br /&gt;
            right: parent.right;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    Text {&lt;br /&gt;
        id: second&lt;br /&gt;
        text: i18n(&amp;quot;2nd line&amp;quot;)&lt;br /&gt;
        anchors {&lt;br /&gt;
            top: first.bottom;&lt;br /&gt;
            left: parent.left;&lt;br /&gt;
            right: parent.right;&lt;br /&gt;
            bottom: parent.bottom;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Buttons ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Animations ===&lt;br /&gt;
&lt;br /&gt;
== Package Structure ==&lt;br /&gt;
&lt;br /&gt;
You create a .desktop file and the .qml file. They have to be in the usual plasma package structure.&lt;br /&gt;
&lt;br /&gt;
plasmoid-qml/metadata.desktop&lt;br /&gt;
plasmoid-qml/contents/ui/main.qml&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;metadata.desktop&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Name=Hello QML&lt;br /&gt;
Comment=A hello world widget in QML&lt;br /&gt;
Icon=chronometer&lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
X-Plasma-MainScript=ui/main.qml&lt;br /&gt;
X-Plasma-DefaultSize=200,100&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Author=Frederik Gladhorn&lt;br /&gt;
X-KDE-PluginInfo-Email=gladhorn@kde.org&lt;br /&gt;
X-KDE-PluginInfo-Website=http://plasma.kde.org/&lt;br /&gt;
X-KDE-PluginInfo-Category=Examples&lt;br /&gt;
X-KDE-PluginInfo-Name=org.kde.hello-qml&lt;br /&gt;
X-KDE-PluginInfo-Version=0.0&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Depends=&lt;br /&gt;
X-KDE-PluginInfo-License=GPL&lt;br /&gt;
X-KDE-PluginInfo-EnabledByDefault=true&lt;br /&gt;
X-KDE-ServiceTypes=Plasma/Applet&lt;br /&gt;
Type=Service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The line below indicates the default size of the plasmoid. The applet's starting size will be this, when added to a scene:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-Plasma-DefaultSize=200,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  &amp;lt;tt&amp;gt;main.qml&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing ==&lt;br /&gt;
You can install your plasmoid, though obviously this is just temporary. CMake, below, is recommended:&lt;br /&gt;
plasmapkg --install plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
=== Installation through CMake ===&lt;br /&gt;
In your CMakeLists.txt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
project(helloqml)&lt;br /&gt;
&lt;br /&gt;
install(DIRECTORY package/&lt;br /&gt;
        DESTINATION ${DATA_INSTALL_DIR}/plasma/plasmoids/org.kde.plasma.applet.myapplet)&lt;br /&gt;
&lt;br /&gt;
install(FILES package/metadata.desktop DESTINATION ${SERVICES_INSTALL_DIR} RENAME plasma-applet-myapplet.desktop)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Your directory structure should now be as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
myproject/CMakeLists.txt&lt;br /&gt;
myproject/package/&lt;br /&gt;
myproject/package/metadata.desktop&lt;br /&gt;
myproject/package/contents/&lt;br /&gt;
myproject/package/contents/ui/&lt;br /&gt;
myproject/package/contents/ui/helloworld.qml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(if you have a configuration file (.ui file) to load the right-click 'plasmoid settings' menu, then your structure will also have myproject/package/contents/config/config.ui, or so)&lt;br /&gt;
&lt;br /&gt;
== plasmoidviewer ==&lt;br /&gt;
You can run it in plasmoidviewer as usual:&lt;br /&gt;
plasmoidviewer plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
== qmlviewer ==&lt;br /&gt;
It's possible to use Plasma specific imports in qml files loaded by qmlviewer:&lt;br /&gt;
&lt;br /&gt;
qmlviewer -I /usr/lib/kde4/imports/ plasmoid-qml/contents/qml/main.qml &lt;br /&gt;
&lt;br /&gt;
Where the -I is the path to the plasma plugin for qml. Try to look for the path of &lt;br /&gt;
/usr/lib/kde4/imports/org/kde/plasma/graphicswidgets/libgraphicswidgetsbindingsplugin.so&lt;br /&gt;
and use everything up to org of that path.&lt;br /&gt;
&lt;br /&gt;
Hovewer it's '''strongly discouraged''' to use qmlviewer to develop plasmoids, because '''some features won't be available there, like the following''':&lt;br /&gt;
* localization with i18n()&lt;br /&gt;
* access to the global ''plasmoid'' object&lt;br /&gt;
* device specific qml files imported with plasmapackage:// urls&lt;br /&gt;
* bindings for qicons, KJobs, services and KConfig&lt;br /&gt;
* retrieving data from a DataEngine&lt;br /&gt;
&lt;br /&gt;
Therefore, it is recommended to simply use '''plasmoidviewer'''&lt;br /&gt;
&lt;br /&gt;
= Features only available in Plasma widgets =&lt;br /&gt;
In order to have a better integration with the KDE platform and to reach an higher degree of expressivity, the stock features of QML have been expanded with the following features, that strictly follow the Plasmoid JavaScript API:&lt;br /&gt;
&lt;br /&gt;
== Minimum size ==&lt;br /&gt;
if the root object of the plasmoid has the properties minimumWidth and minimumHeight, they will be used as the minimum size for the plasmoid. If they will change during the plasmoid execution, the plasmoid minimum size will be updated accordingly.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    property int minimumWidth: paintedWidth&lt;br /&gt;
    property int minimumHeight: paintedHeight&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above example, the minimum size is binded to the paintedWidth/paintedHeight properties of the Text element, ensuring there will always be enough room for the whole text to be displayed.&lt;br /&gt;
&lt;br /&gt;
== Plasmoid object ==&lt;br /&gt;
Every QML plasmoid will have an object called ''plasmoid'', that will give access to the configuration, the formfactor, immutability and so on. It offers the same api as the object with the same name in the Javascript API.&lt;br /&gt;
&lt;br /&gt;
For specific info on this, see [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API-PlasmoidObject Javascript API-Plasmoid Object]&lt;br /&gt;
&lt;br /&gt;
== Localization ==&lt;br /&gt;
It's possible to localize strings with the usual i18n(), i18nc(), i18np() global functions&lt;br /&gt;
&lt;br /&gt;
== Extra types ==&lt;br /&gt;
Some extra types are available from withing JavaScript, namely&lt;br /&gt;
&lt;br /&gt;
* KConfigGroup: it's an object with its config keys readable and writable as properties&lt;br /&gt;
* QIcon: can be constructed with QIcon(&amp;quot;fdo name&amp;quot;) such as QIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
* KJob&lt;br /&gt;
* Plasma Service api&lt;br /&gt;
&lt;br /&gt;
= Plasma specific imports =&lt;br /&gt;
To use some Plasma specific features and to take advantage of them in order for your applet to become a true Plasma applet, it is necessary to use some particular QML imports. See [http://techbase.kde.org/Development/Tutorials/Plasma/QML/API Plasma QML API].&lt;br /&gt;
&lt;br /&gt;
== Extra Qt features ==&lt;br /&gt;
org.kde.qtextraimports&lt;br /&gt;
To use, do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import org.kde.qtextracomponents 0.1 as QtExtraComponents&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* QPixmapItem&lt;br /&gt;
* QImageItem&lt;br /&gt;
* QIconItem&lt;br /&gt;
&lt;br /&gt;
== Plasma Widgets in QML ==&lt;br /&gt;
To use standard plasma widgets (e.g. Plasma::LineEdit, etc.), you simply add an import line for them.&lt;br /&gt;
All properties, signals and slots from ordinary Plasma widgets are available there.&lt;br /&gt;
'''These widgets are provided as a transition tool, intended to be replaced by the Plasma version of QtComponents''', which is currently in development by a gsoc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.graphicswidgets 0.1 as PlasmaWidgets&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 64&lt;br /&gt;
    height: 64&lt;br /&gt;
    PlasmaWidgets.IconWidget {&lt;br /&gt;
        id: icon&lt;br /&gt;
        Component.onCompleted: setIcon(&amp;quot;flag-red&amp;quot;)&lt;br /&gt;
        anchors.centerIn: parent&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted</id>
		<title>Development/Tutorials/Plasma/QML/GettingStarted</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted"/>
				<updated>2011-08-22T16:38:02Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* Package Structure */ fixen fixen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Writing a plasma applet in QML is very easy, in fact, with KDE 4.6 and Qt 4.7 it just works.&lt;br /&gt;
&lt;br /&gt;
== QML Basics ==&lt;br /&gt;
&lt;br /&gt;
It is recommended that you have read through the [http://doc.qt.nokia.com/4.7/qtquick.html Qt QML Tutorials], as there are quite a few and they are explained thoroughly. There is also a list of all [http://doc.qt.nokia.com/4.7/qdeclarativeelements.html standard QML elements].&lt;br /&gt;
&lt;br /&gt;
Essentially, most of the content is the same. The exceptions to be noted are how data is gathered...since we use Data Engines, it is a bit different. Text color and font should be made to use PlasmaCore.Theme.&lt;br /&gt;
&lt;br /&gt;
See the [https://projects.kde.org/projects/kde/kdeexamples/repository KDE Examples] repository for more KDE-related helpful resources. Also of use (which use QML and Plasma) are: [https://projects.kde.org/projects/playground/base/plasma-mobile/repository Plasma Mobile], [https://projects.kde.org/projects/playground/base/declarative-plasmoids/repository Declarative Plasmoids (playground)], for WIP ports of C++ originals&lt;br /&gt;
&lt;br /&gt;
=== Root Item ===&lt;br /&gt;
&lt;br /&gt;
The root item can be anything that inherits QGraphicsItem. For example, in this case it is QGraphicsWidget which is a plasmoid. It can also simply be an Item. I also noticed that PathView does not respond to mouse inputs automatically (so flicking doesn't work). Probably because events are being intercepted. So take note, it'll have to be e.g. an Item, for that case.&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
&lt;br /&gt;
==== Row and Column ====&lt;br /&gt;
&lt;br /&gt;
==== Anchors ====&lt;br /&gt;
Anchor layouts offer a nice way of grouping UI elements nicely together. The idea is that you connect edges or corners of one element to the edge or corner of another widget.&lt;br /&gt;
Some examples:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 200&lt;br /&gt;
    height: 300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Text {&lt;br /&gt;
        id: first&lt;br /&gt;
        text: i18n(&amp;quot;1st line&amp;quot;)&lt;br /&gt;
        anchors { &lt;br /&gt;
            top: parent.top;&lt;br /&gt;
            left: parent.left;&lt;br /&gt;
            right: parent.right;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    Text {&lt;br /&gt;
        id: second&lt;br /&gt;
        text: i18n(&amp;quot;2nd line&amp;quot;)&lt;br /&gt;
        anchors {&lt;br /&gt;
            top: first.bottom;&lt;br /&gt;
            left: parent.left;&lt;br /&gt;
            right: parent.right;&lt;br /&gt;
            bottom: parent.bottom;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Buttons ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Animations ===&lt;br /&gt;
&lt;br /&gt;
== Package Structure ==&lt;br /&gt;
&lt;br /&gt;
You create a .desktop file and the .qml file. They have to be in the usual plasma package structure.&lt;br /&gt;
&lt;br /&gt;
plasmoid-qml/metadata.desktop&lt;br /&gt;
plasmoid-qml/contents/ui/main.qml&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;metadata.desktop&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Name=Hello QML&lt;br /&gt;
Comment=A hello world widget in QML&lt;br /&gt;
Icon=chronometer&lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
X-Plasma-MainScript=ui/main.qml&lt;br /&gt;
X-Plasma-DefaultSize=200,100&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Author=Frederik Gladhorn&lt;br /&gt;
X-KDE-PluginInfo-Email=gladhorn@kde.org&lt;br /&gt;
X-KDE-PluginInfo-Website=http://plasma.kde.org/&lt;br /&gt;
X-KDE-PluginInfo-Category=Examples&lt;br /&gt;
X-KDE-PluginInfo-Name=org.kde.hello-qml&lt;br /&gt;
X-KDE-PluginInfo-Version=0.0&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Depends=&lt;br /&gt;
X-KDE-PluginInfo-License=GPL&lt;br /&gt;
X-KDE-PluginInfo-EnabledByDefault=true&lt;br /&gt;
X-KDE-ServiceTypes=Plasma/Applet&lt;br /&gt;
Type=Service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The line below indicates the starting minimum size of the plasmoid. The applet will become no smaller than this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-Plasma-DefaultSize=200,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  &amp;lt;tt&amp;gt;main.qml&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing ==&lt;br /&gt;
You can install your plasmoid, though obviously this is just temporary. CMake, below, is recommended:&lt;br /&gt;
plasmapkg --install plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
=== Installation through CMake ===&lt;br /&gt;
In your CMakeLists.txt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
project(helloqml)&lt;br /&gt;
&lt;br /&gt;
install(DIRECTORY package/&lt;br /&gt;
        DESTINATION ${DATA_INSTALL_DIR}/plasma/plasmoids/org.kde.plasma.applet.myapplet)&lt;br /&gt;
&lt;br /&gt;
install(FILES package/metadata.desktop DESTINATION ${SERVICES_INSTALL_DIR} RENAME plasma-applet-myapplet.desktop)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Your directory structure should now be as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
myproject/CMakeLists.txt&lt;br /&gt;
myproject/package/&lt;br /&gt;
myproject/package/metadata.desktop&lt;br /&gt;
myproject/package/contents/&lt;br /&gt;
myproject/package/contents/ui/&lt;br /&gt;
myproject/package/contents/ui/helloworld.qml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(if you have a configuration file (.ui file) to load the right-click 'plasmoid settings' menu, then your structure will also have myproject/package/contents/config/config.ui, or so)&lt;br /&gt;
&lt;br /&gt;
== plasmoidviewer ==&lt;br /&gt;
You can run it in plasmoidviewer as usual:&lt;br /&gt;
plasmoidviewer plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
== qmlviewer ==&lt;br /&gt;
It's possible to use Plasma specific imports in qml files loaded by qmlviewer:&lt;br /&gt;
&lt;br /&gt;
qmlviewer -I /usr/lib/kde4/imports/ plasmoid-qml/contents/qml/main.qml &lt;br /&gt;
&lt;br /&gt;
Where the -I is the path to the plasma plugin for qml. Try to look for the path of &lt;br /&gt;
/usr/lib/kde4/imports/org/kde/plasma/graphicswidgets/libgraphicswidgetsbindingsplugin.so&lt;br /&gt;
and use everything up to org of that path.&lt;br /&gt;
&lt;br /&gt;
Hovewer it's '''strongly discouraged''' to use qmlviewer to develop plasmoids, because '''some features won't be available there, like the following''':&lt;br /&gt;
* localization with i18n()&lt;br /&gt;
* access to the global ''plasmoid'' object&lt;br /&gt;
* device specific qml files imported with plasmapackage:// urls&lt;br /&gt;
* bindings for qicons, KJobs, services and KConfig&lt;br /&gt;
* retrieving data from a DataEngine&lt;br /&gt;
&lt;br /&gt;
Therefore, it is recommended to simply use '''plasmoidviewer'''&lt;br /&gt;
&lt;br /&gt;
= Features only available in Plasma widgets =&lt;br /&gt;
In order to have a better integration with the KDE platform and to reach an higher degree of expressivity, the stock features of QML have been expanded with the following features, that strictly follow the Plasmoid JavaScript API:&lt;br /&gt;
&lt;br /&gt;
== Minimum size ==&lt;br /&gt;
if the root object of the plasmoid has the properties minimumWidth and minimumHeight, they will be used as the minimum size for the plasmoid. If they will change during the plasmoid execution, the plasmoid minimum size will be updated accordingly.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    property int minimumWidth: paintedWidth&lt;br /&gt;
    property int minimumHeight: paintedHeight&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above example, the minimum size is binded to the paintedWidth/paintedHeight properties of the Text element, ensuring there will always be enough room for the whole text to be displayed.&lt;br /&gt;
&lt;br /&gt;
== Plasmoid object ==&lt;br /&gt;
Every QML plasmoid will have an object called ''plasmoid'', that will give access to the configuration, the formfactor, immutability and so on. It offers the same api as the object with the same name in the Javascript API.&lt;br /&gt;
&lt;br /&gt;
For specific info on this, see [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API-PlasmoidObject Javascript API-Plasmoid Object]&lt;br /&gt;
&lt;br /&gt;
== Localization ==&lt;br /&gt;
It's possible to localize strings with the usual i18n(), i18nc(), i18np() global functions&lt;br /&gt;
&lt;br /&gt;
== Extra types ==&lt;br /&gt;
Some extra types are available from withing JavaScript, namely&lt;br /&gt;
&lt;br /&gt;
* KConfigGroup: it's an object with its config keys readable and writable as properties&lt;br /&gt;
* QIcon: can be constructed with QIcon(&amp;quot;fdo name&amp;quot;) such as QIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
* KJob&lt;br /&gt;
* Plasma Service api&lt;br /&gt;
&lt;br /&gt;
= Plasma specific imports =&lt;br /&gt;
To use some Plasma specific features and to take advantage of them in order for your applet to become a true Plasma applet, it is necessary to use some particular QML imports. See [http://techbase.kde.org/Development/Tutorials/Plasma/QML/API Plasma QML API].&lt;br /&gt;
&lt;br /&gt;
== Extra Qt features ==&lt;br /&gt;
org.kde.qtextraimports&lt;br /&gt;
To use, do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import org.kde.qtextracomponents 0.1 as QtExtraComponents&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* QPixmapItem&lt;br /&gt;
* QImageItem&lt;br /&gt;
* QIconItem&lt;br /&gt;
&lt;br /&gt;
== Plasma Widgets in QML ==&lt;br /&gt;
To use standard plasma widgets (e.g. Plasma::LineEdit, etc.), you simply add an import line for them.&lt;br /&gt;
All properties, signals and slots from ordinary Plasma widgets are available there.&lt;br /&gt;
'''These widgets are provided as a transition tool, intended to be replaced by the Plasma version of QtComponents''', which is currently in development by a gsoc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.graphicswidgets 0.1 as PlasmaWidgets&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 64&lt;br /&gt;
    height: 64&lt;br /&gt;
    PlasmaWidgets.IconWidget {&lt;br /&gt;
        id: icon&lt;br /&gt;
        Component.onCompleted: setIcon(&amp;quot;flag-red&amp;quot;)&lt;br /&gt;
        anchors.centerIn: parent&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted</id>
		<title>Development/Tutorials/Plasma/QML/GettingStarted</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted"/>
				<updated>2011-08-22T02:18:46Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* metadata.desktop */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Writing a plasma applet in QML is very easy, in fact, with KDE 4.6 and Qt 4.7 it just works.&lt;br /&gt;
&lt;br /&gt;
== QML Basics ==&lt;br /&gt;
&lt;br /&gt;
It is recommended that you have read through the [http://doc.qt.nokia.com/4.7/qtquick.html Qt QML Tutorials], as there are quite a few and they are explained thoroughly. There is also a list of all [http://doc.qt.nokia.com/4.7/qdeclarativeelements.html standard QML elements].&lt;br /&gt;
&lt;br /&gt;
Essentially, most of the content is the same. The exceptions to be noted are how data is gathered...since we use Data Engines, it is a bit different. Text color and font should be made to use PlasmaCore.Theme.&lt;br /&gt;
&lt;br /&gt;
See the [https://projects.kde.org/projects/kde/kdeexamples/repository KDE Examples] repository for more KDE-related helpful resources. Also of use (which use QML and Plasma) are: [https://projects.kde.org/projects/playground/base/plasma-mobile/repository Plasma Mobile], [https://projects.kde.org/projects/playground/base/declarative-plasmoids/repository Declarative Plasmoids (playground)], for WIP ports of C++ originals&lt;br /&gt;
&lt;br /&gt;
=== Root Item ===&lt;br /&gt;
&lt;br /&gt;
The root item can be anything that inherits QGraphicsItem. For example, in this case it is QGraphicsWidget which is a plasmoid. It can also simply be an Item. I also noticed that PathView does not respond to mouse inputs automatically (so flicking doesn't work). Probably because events are being intercepted. So take note, it'll have to be e.g. an Item, for that case.&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
&lt;br /&gt;
==== Row and Column ====&lt;br /&gt;
&lt;br /&gt;
==== Anchors ====&lt;br /&gt;
Anchor layouts offer a nice way of grouping UI elements nicely together. The idea is that you connect edges or corners of one element to the edge or corner of another widget.&lt;br /&gt;
Some examples:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 200&lt;br /&gt;
    height: 300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Text {&lt;br /&gt;
        id: first&lt;br /&gt;
        text: i18n(&amp;quot;1st line&amp;quot;)&lt;br /&gt;
        anchors { &lt;br /&gt;
            top: parent.top;&lt;br /&gt;
            left: parent.left;&lt;br /&gt;
            right: parent.right;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    Text {&lt;br /&gt;
        id: second&lt;br /&gt;
        text: i18n(&amp;quot;2nd line&amp;quot;)&lt;br /&gt;
        anchors {&lt;br /&gt;
            top: first.bottom;&lt;br /&gt;
            left: parent.left;&lt;br /&gt;
            right: parent.right;&lt;br /&gt;
            bottom: parent.bottom;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Buttons ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Animations ===&lt;br /&gt;
&lt;br /&gt;
== Package Structure ==&lt;br /&gt;
&lt;br /&gt;
You create a .desktop file and the .qml file. They have to be in the usual plasma package structure.&lt;br /&gt;
&lt;br /&gt;
plasmoid-qml/metadata.desktop&lt;br /&gt;
plasmoid-qml/contents/ui/main.qml&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;metadata.desktop&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Name=Hello QML&lt;br /&gt;
Comment=A hello world widget in QML&lt;br /&gt;
Icon=chronometer&lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
X-Plasma-MainScript=ui/main.qml&lt;br /&gt;
X-Plasma-DefaultSize=200,100&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Author=Frederik Gladhorn&lt;br /&gt;
X-KDE-PluginInfo-Email=gladhorn@kde.org&lt;br /&gt;
X-KDE-PluginInfo-Website=http://plasma.kde.org/&lt;br /&gt;
X-KDE-PluginInfo-Category=Examples&lt;br /&gt;
X-KDE-PluginInfo-Name=org.kde.hello-qml&lt;br /&gt;
X-KDE-PluginInfo-Version=0.0&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Depends=&lt;br /&gt;
X-KDE-PluginInfo-License=GPL&lt;br /&gt;
X-KDE-PluginInfo-EnabledByDefault=true&lt;br /&gt;
X-KDE-ServiceTypes=Plasma/Applet&lt;br /&gt;
Type=Service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The line below indicates the starting minimum size of the plasmoid. The applet will become no smaller than this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;gt;&lt;br /&gt;
X-Plasma-DefaultSize=200,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  &amp;lt;tt&amp;gt;main.qml&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing ==&lt;br /&gt;
You can install your plasmoid, though obviously this is just temporary. CMake, below, is recommended:&lt;br /&gt;
plasmapkg --install plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
=== Installation through CMake ===&lt;br /&gt;
In your CMakeLists.txt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
project(helloqml)&lt;br /&gt;
&lt;br /&gt;
install(DIRECTORY package/&lt;br /&gt;
        DESTINATION ${DATA_INSTALL_DIR}/plasma/plasmoids/org.kde.plasma.applet.myapplet)&lt;br /&gt;
&lt;br /&gt;
install(FILES package/metadata.desktop DESTINATION ${SERVICES_INSTALL_DIR} RENAME plasma-applet-myapplet.desktop)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Your directory structure should now be as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
myproject/CMakeLists.txt&lt;br /&gt;
myproject/package/&lt;br /&gt;
myproject/package/metadata.desktop&lt;br /&gt;
myproject/package/contents/&lt;br /&gt;
myproject/package/contents/ui/&lt;br /&gt;
myproject/package/contents/ui/helloworld.qml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(if you have a configuration file (.ui file) to load the right-click 'plasmoid settings' menu, then your structure will also have myproject/package/contents/config/config.ui, or so)&lt;br /&gt;
&lt;br /&gt;
== plasmoidviewer ==&lt;br /&gt;
You can run it in plasmoidviewer as usual:&lt;br /&gt;
plasmoidviewer plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
== qmlviewer ==&lt;br /&gt;
It's possible to use Plasma specific imports in qml files loaded by qmlviewer:&lt;br /&gt;
&lt;br /&gt;
qmlviewer -I /usr/lib/kde4/imports/ plasmoid-qml/contents/qml/main.qml &lt;br /&gt;
&lt;br /&gt;
Where the -I is the path to the plasma plugin for qml. Try to look for the path of &lt;br /&gt;
/usr/lib/kde4/imports/org/kde/plasma/graphicswidgets/libgraphicswidgetsbindingsplugin.so&lt;br /&gt;
and use everything up to org of that path.&lt;br /&gt;
&lt;br /&gt;
Hovewer it's '''strongly discouraged''' to use qmlviewer to develop plasmoids, because '''some features won't be available there, like the following''':&lt;br /&gt;
* localization with i18n()&lt;br /&gt;
* access to the global ''plasmoid'' object&lt;br /&gt;
* device specific qml files imported with plasmapackage:// urls&lt;br /&gt;
* bindings for qicons, KJobs, services and KConfig&lt;br /&gt;
* retrieving data from a DataEngine&lt;br /&gt;
&lt;br /&gt;
Therefore, it is recommended to simply use '''plasmoidviewer'''&lt;br /&gt;
&lt;br /&gt;
= Features only available in Plasma widgets =&lt;br /&gt;
In order to have a better integration with the KDE platform and to reach an higher degree of expressivity, the stock features of QML have been expanded with the following features, that strictly follow the Plasmoid JavaScript API:&lt;br /&gt;
&lt;br /&gt;
== Minimum size ==&lt;br /&gt;
if the root object of the plasmoid has the properties minimumWidth and minimumHeight, they will be used as the minimum size for the plasmoid. If they will change during the plasmoid execution, the plasmoid minimum size will be updated accordingly.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    property int minimumWidth: paintedWidth&lt;br /&gt;
    property int minimumHeight: paintedHeight&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above example, the minimum size is binded to the paintedWidth/paintedHeight properties of the Text element, ensuring there will always be enough room for the whole text to be displayed.&lt;br /&gt;
&lt;br /&gt;
== Plasmoid object ==&lt;br /&gt;
Every QML plasmoid will have an object called ''plasmoid'', that will give access to the configuration, the formfactor, immutability and so on. It offers the same api as the object with the same name in the Javascript API.&lt;br /&gt;
&lt;br /&gt;
For specific info on this, see [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API-PlasmoidObject Javascript API-Plasmoid Object]&lt;br /&gt;
&lt;br /&gt;
== Localization ==&lt;br /&gt;
It's possible to localize strings with the usual i18n(), i18nc(), i18np() global functions&lt;br /&gt;
&lt;br /&gt;
== Extra types ==&lt;br /&gt;
Some extra types are available from withing JavaScript, namely&lt;br /&gt;
&lt;br /&gt;
* KConfigGroup: it's an object with its config keys readable and writable as properties&lt;br /&gt;
* QIcon: can be constructed with QIcon(&amp;quot;fdo name&amp;quot;) such as QIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
* KJob&lt;br /&gt;
* Plasma Service api&lt;br /&gt;
&lt;br /&gt;
= Plasma specific imports =&lt;br /&gt;
To use some Plasma specific features and to take advantage of them in order for your applet to become a true Plasma applet, it is necessary to use some particular QML imports. See [http://techbase.kde.org/Development/Tutorials/Plasma/QML/API Plasma QML API].&lt;br /&gt;
&lt;br /&gt;
== Extra Qt features ==&lt;br /&gt;
org.kde.qtextraimports&lt;br /&gt;
To use, do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import org.kde.qtextracomponents 0.1 as QtExtraComponents&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* QPixmapItem&lt;br /&gt;
* QImageItem&lt;br /&gt;
* QIconItem&lt;br /&gt;
&lt;br /&gt;
== Plasma Widgets in QML ==&lt;br /&gt;
To use standard plasma widgets (e.g. Plasma::LineEdit, etc.), you simply add an import line for them.&lt;br /&gt;
All properties, signals and slots from ordinary Plasma widgets are available there.&lt;br /&gt;
'''These widgets are provided as a transition tool, intended to be replaced by the Plasma version of QtComponents''', which is currently in development by a gsoc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.graphicswidgets 0.1 as PlasmaWidgets&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 64&lt;br /&gt;
    height: 64&lt;br /&gt;
    PlasmaWidgets.IconWidget {&lt;br /&gt;
        id: icon&lt;br /&gt;
        Component.onCompleted: setIcon(&amp;quot;flag-red&amp;quot;)&lt;br /&gt;
        anchors.centerIn: parent&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma</id>
		<title>Development/Tutorials/Plasma</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma"/>
				<updated>2011-08-19T01:34:08Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* Plasma and Creating QML Plasmoids */ rename that&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Plasma}}&lt;br /&gt;
&lt;br /&gt;
== Plasma and Creating QML Plasmoids ==&lt;br /&gt;
Plasmoids that use the QML (aka QtQuick) declarative language to describe their user interface while having the logic of the applet, in JavaScript (QML is essentially a forge between CSS and JavaScript). &lt;br /&gt;
&lt;br /&gt;
This is now the '''recommended''' method of creating plasmoids, where possible. The plasmoid, or applet serves as the visualization for the data which a Plasma::DataEngine contains.&lt;br /&gt;
&lt;br /&gt;
It allows easily the declaring of an interface and to easily create things like ListViews with native Plasma theming. It is what Plasma is leaning the most towards, especially in the Mobile, MediaCenter and KDM shells.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/QML/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in QML''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/QML/Basic_ListView|Basic List Plasmoid]]&lt;br /&gt;
:''Make a QML ListView which displays basic text objects as items. Utilizes native Plasma theming and animations.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/QML/API|API Reference]]&lt;br /&gt;
:''The QML Plasmoid API. Useful for referencing what is available in the runtime, what are the differences with the pure JavaScript ScriptEngine, the differences between pure Qt QML and Plasma, and as a study aid for the tutorials above.''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with C++ ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/GettingStarted|Getting Started With Plasmoids]]&lt;br /&gt;
:''Creating your first plasmoid in C++ with SVG background, icon and text''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/GettingStarted..Some_More|Getting Started With Plasmoids..Some more]] :''A few more starter's tips.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/DataEngines|Writing a DataEngine]]&lt;br /&gt;
:''DataEngines provide a standardized interface to various (read only) data sources for visualizations to use. Learn what a DataEngine is and how to write one of your own.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Services|Writing a Service]]&lt;br /&gt;
:''Services provide a standardized interface for visualizations to perform &amp;quot;write operations&amp;quot;. This can be for example, uploading pasted test to a pastebin service..''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PackageStructure|Writing a PackageStructure Plugin]]&lt;br /&gt;
:''PackageStructure plugins allow custom Packages to be defined, installed, removed and listed as well as provide access their contents at runtime. Packages may contain any kind of data addons, including scripts.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/UsingExtenders|How to use extenders in your Plasmoid]]&lt;br /&gt;
:''A simple example that shows how to use extenders in a Plasmoid.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/AbstractRunner|Creating Runners]]&lt;br /&gt;
:''Runners are plugins that provide action-based search functionality in the Plasma workspace &amp;quot;run command&amp;quot; dialog. These plugins can be used by any application that links again libplasma.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/WallpaperHelloWorld|Wallpaper Tutorial 1]]&lt;br /&gt;
:''This tutorial shows you how to make a simple Hello World plasma wallpaper plugin.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/WallpaperConfiguration|Wallpaper Tutorial 2]]&lt;br /&gt;
:''This tutorial covers how to add configuration options to the wallpaper.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ShellDesign|Creating a Plasma Shell]]&lt;br /&gt;
:''This tutorial covers the essentials of writing a new Plasma shell from scratch. A must-read for anyone creating a new or modifying an existing Plasma Shell. Existing Plasma shells include Plasma Desktop, Plasma Netbook, Plasma Mobile, Plasma Media Center, Plasma Screensaver, Plasma KPart and Plasma KDM, and all follow the patterns documented here.''&lt;br /&gt;
&lt;br /&gt;
;[http://www.linux-magazine.com/w3/issue/114/036-040_plasma.pdf Creating Plasmoids]&lt;br /&gt;
:''May 2010 article from Linux Magazine''&lt;br /&gt;
&lt;br /&gt;
;[http://www.ibm.com/developerworks/linux/library/l-kde-plasmoids/index.html Create Plasmoids using KDevelop]&lt;br /&gt;
:''Article explaining the structure of Plasma and how to create a Plasmoid''&lt;br /&gt;
&lt;br /&gt;
;[http://community.kde.org/User:Mxttie#Adding_configuration Adding configuration to your plasmoid]&lt;br /&gt;
:''Article explaining how to add a configuration dialog to your plasmoid.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ApplicationShell|Integrate Plasma in Applications]]&lt;br /&gt;
:''This tutorial shows you how to make an application dashboard based on Plasma technologies.''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with JavaScript ==&lt;br /&gt;
&lt;br /&gt;
Plasma has built-in JavaScript (also known as ECMAScript, and often referred to as QtScript in the context of Qt) scripting support without requiring any external dependencies.&lt;br /&gt;
&lt;br /&gt;
=== Plasmoids ===&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in JavaScript''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/DataEngine|Getting Data]]&lt;br /&gt;
:''How to retreive data from a data engine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/NowPlaying|Now Playing]]&lt;br /&gt;
:''Slightly more advanced data engine usage: displaying what's currently playing''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/SystemMonitor|System Monitor]]&lt;br /&gt;
:''How to access systemmonitor data engine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/CheatSheet|Cheat Sheet]]&lt;br /&gt;
:''A cheat sheet, rather than a tutorial, of things to remember and watch out for when developing JavaScript plasmoids''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/API|API Reference]]&lt;br /&gt;
:''The Simplified JavaScript Plasmoid API. Useful for referencing what is available in the runtime and as a study aid for the tutorials above.''&lt;br /&gt;
&lt;br /&gt;
=== Other Applications Of Javascript ===&lt;br /&gt;
;[[KDE_System_Administration/PlasmaDestkopScripting|Scripting Plasma Shells]]&lt;br /&gt;
:The KDE Plasma Desktop and Netbook provide means to manage the desktop shell (desktop, panels, widget) via scripts written in JavaScript. This article describes how to take advantage of this feature set as well as documents the full API. This is primarily a system administration tool, but may also be of interest to power users.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/Animations|Javascript Animations]]&lt;br /&gt;
:''How to write Animations using Javascript for use in Plasma applications''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ComicPlugin|Creating Comic Plugins]]&lt;br /&gt;
:''This guide shows you how to create a comic plugin for the comic plasmoid.''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Python ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Python''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Using DataEngines|Using DataEngines]]&lt;br /&gt;
:''How to use DataEngines from a plasmoid''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Writing DataEngines|Writing DataEngines]]&lt;br /&gt;
:''How to write your own Plasma DataEngine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonPlasmoid|Writing a Plasmoid in Python]]&lt;br /&gt;
:''Writing a simple battery graph in python''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonRunner|Writing a KRunner plugin in Python]]&lt;br /&gt;
:''Writing a simple krunner plugin in python''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Ruby ==&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Ruby''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/SimplePasteApplet|Writing a simple paste applet]]&lt;br /&gt;
:''A tutorial explaining how to set up a plasmoid, create a simple paste applet using widgets and add Plasma features seen elsewhere. Complete with tips for those who have never programmed before.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Writing DataEngines|Writing DataEngines]]&lt;br /&gt;
:''How to write your own Plasma DataEngine using Ruby''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Blinker|Use SVG artwork in the simplest way possible]]&lt;br /&gt;
:''Follow a fellow student as he asks around about SVG usage and explains why the code examples work. This is a wiki so feel free to add your own insights until this tutorial can be considered complete.''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Web Technologies (HTML/JS/CSS etc) ==&lt;br /&gt;
;[[Development/Tutorials/Plasma/Web/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in HTML''&lt;br /&gt;
&lt;br /&gt;
== Plasma integration ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Solid_Device_Actions|Creating a Device Notifier action]]&lt;br /&gt;
:''When your application is interested in removable hardware''&lt;br /&gt;
&lt;br /&gt;
== Theme development ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Theme|Creating a Plasma Theme Quickstart]]&lt;br /&gt;
:''A quick guide to creating your first Plasma theme''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ThemeDetails|The Plasma Theme Structure In Detail]]&lt;br /&gt;
:''A comprehensive guide to the contents of a Plasma SVG theme, including configuration options, wallpapers, on-disk layout, names of all standard SVG files and every element in them.''&lt;br /&gt;
&lt;br /&gt;
== Activity Template development ==&lt;br /&gt;
&lt;br /&gt;
;[[KDE_System_Administration/PlasmaDesktopScripting#Activity_templates|Creating a Plasma Activity Template Quickstart]]&lt;br /&gt;
:''A quick guide to creating your first Plasma Activity Template''&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
* [[Projects/Plasma|Projects: Plasma]]&lt;br /&gt;
* [http://api.kde.org/4.x-api/kdelibs-apidocs/plasma/html/index.html Plasma api documentation]&lt;br /&gt;
* [http://techbase.kde.org/Projects/Plasma/Eclipse_Integration Plasma Eclipse Integration]&lt;br /&gt;
* The [https://mail.kde.org/mailman/listinfo/plasma-devel plasma-devel mailing list] and #plasma on IRC (irc.freenode.org).&lt;br /&gt;
&lt;br /&gt;
== Presentation Slides==&lt;br /&gt;
http://chani.wordpress.com/2009/04/25/quick-update-for-my-presentation/ Victory Calendar -- also link to websvn plasma playground in the odp file.&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma</id>
		<title>Development/Tutorials/Plasma</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma"/>
				<updated>2011-08-19T01:33:44Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* Plasma and Creating QML Plasmoids */ Add listview example(TODO)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Plasma}}&lt;br /&gt;
&lt;br /&gt;
== Plasma and Creating QML Plasmoids ==&lt;br /&gt;
Plasmoids that use the QML (aka QtQuick) declarative language to describe their user interface while having the logic of the applet, in JavaScript (QML is essentially a forge between CSS and JavaScript). &lt;br /&gt;
&lt;br /&gt;
This is now the '''recommended''' method of creating plasmoids, where possible. The plasmoid, or applet serves as the visualization for the data which a Plasma::DataEngine contains.&lt;br /&gt;
&lt;br /&gt;
It allows easily the declaring of an interface and to easily create things like ListViews with native Plasma theming. It is what Plasma is leaning the most towards, especially in the Mobile, MediaCenter and KDM shells.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/QML/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in QML''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/QML/Basic_ListView|Basic Listing Plasmoid]]&lt;br /&gt;
:''Make a QML ListView which displays basic text objects as items. Utilizes native Plasma theming and animations.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/QML/API|API Reference]]&lt;br /&gt;
:''The QML Plasmoid API. Useful for referencing what is available in the runtime, what are the differences with the pure JavaScript ScriptEngine, the differences between pure Qt QML and Plasma, and as a study aid for the tutorials above.''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with C++ ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/GettingStarted|Getting Started With Plasmoids]]&lt;br /&gt;
:''Creating your first plasmoid in C++ with SVG background, icon and text''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/GettingStarted..Some_More|Getting Started With Plasmoids..Some more]] :''A few more starter's tips.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/DataEngines|Writing a DataEngine]]&lt;br /&gt;
:''DataEngines provide a standardized interface to various (read only) data sources for visualizations to use. Learn what a DataEngine is and how to write one of your own.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Services|Writing a Service]]&lt;br /&gt;
:''Services provide a standardized interface for visualizations to perform &amp;quot;write operations&amp;quot;. This can be for example, uploading pasted test to a pastebin service..''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PackageStructure|Writing a PackageStructure Plugin]]&lt;br /&gt;
:''PackageStructure plugins allow custom Packages to be defined, installed, removed and listed as well as provide access their contents at runtime. Packages may contain any kind of data addons, including scripts.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/UsingExtenders|How to use extenders in your Plasmoid]]&lt;br /&gt;
:''A simple example that shows how to use extenders in a Plasmoid.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/AbstractRunner|Creating Runners]]&lt;br /&gt;
:''Runners are plugins that provide action-based search functionality in the Plasma workspace &amp;quot;run command&amp;quot; dialog. These plugins can be used by any application that links again libplasma.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/WallpaperHelloWorld|Wallpaper Tutorial 1]]&lt;br /&gt;
:''This tutorial shows you how to make a simple Hello World plasma wallpaper plugin.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/WallpaperConfiguration|Wallpaper Tutorial 2]]&lt;br /&gt;
:''This tutorial covers how to add configuration options to the wallpaper.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ShellDesign|Creating a Plasma Shell]]&lt;br /&gt;
:''This tutorial covers the essentials of writing a new Plasma shell from scratch. A must-read for anyone creating a new or modifying an existing Plasma Shell. Existing Plasma shells include Plasma Desktop, Plasma Netbook, Plasma Mobile, Plasma Media Center, Plasma Screensaver, Plasma KPart and Plasma KDM, and all follow the patterns documented here.''&lt;br /&gt;
&lt;br /&gt;
;[http://www.linux-magazine.com/w3/issue/114/036-040_plasma.pdf Creating Plasmoids]&lt;br /&gt;
:''May 2010 article from Linux Magazine''&lt;br /&gt;
&lt;br /&gt;
;[http://www.ibm.com/developerworks/linux/library/l-kde-plasmoids/index.html Create Plasmoids using KDevelop]&lt;br /&gt;
:''Article explaining the structure of Plasma and how to create a Plasmoid''&lt;br /&gt;
&lt;br /&gt;
;[http://community.kde.org/User:Mxttie#Adding_configuration Adding configuration to your plasmoid]&lt;br /&gt;
:''Article explaining how to add a configuration dialog to your plasmoid.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ApplicationShell|Integrate Plasma in Applications]]&lt;br /&gt;
:''This tutorial shows you how to make an application dashboard based on Plasma technologies.''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with JavaScript ==&lt;br /&gt;
&lt;br /&gt;
Plasma has built-in JavaScript (also known as ECMAScript, and often referred to as QtScript in the context of Qt) scripting support without requiring any external dependencies.&lt;br /&gt;
&lt;br /&gt;
=== Plasmoids ===&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in JavaScript''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/DataEngine|Getting Data]]&lt;br /&gt;
:''How to retreive data from a data engine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/NowPlaying|Now Playing]]&lt;br /&gt;
:''Slightly more advanced data engine usage: displaying what's currently playing''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/SystemMonitor|System Monitor]]&lt;br /&gt;
:''How to access systemmonitor data engine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/CheatSheet|Cheat Sheet]]&lt;br /&gt;
:''A cheat sheet, rather than a tutorial, of things to remember and watch out for when developing JavaScript plasmoids''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/API|API Reference]]&lt;br /&gt;
:''The Simplified JavaScript Plasmoid API. Useful for referencing what is available in the runtime and as a study aid for the tutorials above.''&lt;br /&gt;
&lt;br /&gt;
=== Other Applications Of Javascript ===&lt;br /&gt;
;[[KDE_System_Administration/PlasmaDestkopScripting|Scripting Plasma Shells]]&lt;br /&gt;
:The KDE Plasma Desktop and Netbook provide means to manage the desktop shell (desktop, panels, widget) via scripts written in JavaScript. This article describes how to take advantage of this feature set as well as documents the full API. This is primarily a system administration tool, but may also be of interest to power users.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/Animations|Javascript Animations]]&lt;br /&gt;
:''How to write Animations using Javascript for use in Plasma applications''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ComicPlugin|Creating Comic Plugins]]&lt;br /&gt;
:''This guide shows you how to create a comic plugin for the comic plasmoid.''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Python ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Python''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Using DataEngines|Using DataEngines]]&lt;br /&gt;
:''How to use DataEngines from a plasmoid''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Writing DataEngines|Writing DataEngines]]&lt;br /&gt;
:''How to write your own Plasma DataEngine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonPlasmoid|Writing a Plasmoid in Python]]&lt;br /&gt;
:''Writing a simple battery graph in python''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonRunner|Writing a KRunner plugin in Python]]&lt;br /&gt;
:''Writing a simple krunner plugin in python''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Ruby ==&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Ruby''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/SimplePasteApplet|Writing a simple paste applet]]&lt;br /&gt;
:''A tutorial explaining how to set up a plasmoid, create a simple paste applet using widgets and add Plasma features seen elsewhere. Complete with tips for those who have never programmed before.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Writing DataEngines|Writing DataEngines]]&lt;br /&gt;
:''How to write your own Plasma DataEngine using Ruby''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Blinker|Use SVG artwork in the simplest way possible]]&lt;br /&gt;
:''Follow a fellow student as he asks around about SVG usage and explains why the code examples work. This is a wiki so feel free to add your own insights until this tutorial can be considered complete.''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Web Technologies (HTML/JS/CSS etc) ==&lt;br /&gt;
;[[Development/Tutorials/Plasma/Web/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in HTML''&lt;br /&gt;
&lt;br /&gt;
== Plasma integration ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Solid_Device_Actions|Creating a Device Notifier action]]&lt;br /&gt;
:''When your application is interested in removable hardware''&lt;br /&gt;
&lt;br /&gt;
== Theme development ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Theme|Creating a Plasma Theme Quickstart]]&lt;br /&gt;
:''A quick guide to creating your first Plasma theme''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ThemeDetails|The Plasma Theme Structure In Detail]]&lt;br /&gt;
:''A comprehensive guide to the contents of a Plasma SVG theme, including configuration options, wallpapers, on-disk layout, names of all standard SVG files and every element in them.''&lt;br /&gt;
&lt;br /&gt;
== Activity Template development ==&lt;br /&gt;
&lt;br /&gt;
;[[KDE_System_Administration/PlasmaDesktopScripting#Activity_templates|Creating a Plasma Activity Template Quickstart]]&lt;br /&gt;
:''A quick guide to creating your first Plasma Activity Template''&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
* [[Projects/Plasma|Projects: Plasma]]&lt;br /&gt;
* [http://api.kde.org/4.x-api/kdelibs-apidocs/plasma/html/index.html Plasma api documentation]&lt;br /&gt;
* [http://techbase.kde.org/Projects/Plasma/Eclipse_Integration Plasma Eclipse Integration]&lt;br /&gt;
* The [https://mail.kde.org/mailman/listinfo/plasma-devel plasma-devel mailing list] and #plasma on IRC (irc.freenode.org).&lt;br /&gt;
&lt;br /&gt;
== Presentation Slides==&lt;br /&gt;
http://chani.wordpress.com/2009/04/25/quick-update-for-my-presentation/ Victory Calendar -- also link to websvn plasma playground in the odp file.&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted</id>
		<title>Development/Tutorials/Plasma/QML/GettingStarted</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted"/>
				<updated>2011-08-19T01:30:02Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* Installation through CMake */ .ui file thing. We'll need to touch on that later...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Writing a plasma applet in QML is very easy, in fact, with KDE 4.6 and Qt 4.7 it just works.&lt;br /&gt;
&lt;br /&gt;
== QML Basics ==&lt;br /&gt;
&lt;br /&gt;
It is recommended that you have read through the [http://doc.qt.nokia.com/4.7/qtquick.html Qt QML Tutorials], as there are quite a few and they are explained thoroughly. There is also a list of all [http://doc.qt.nokia.com/4.7/qdeclarativeelements.html standard QML elements].&lt;br /&gt;
&lt;br /&gt;
Essentially, most of the content is the same. The exceptions to be noted are how data is gathered...since we use Data Engines, it is a bit different. Text color and font should be made to use PlasmaCore.Theme.&lt;br /&gt;
&lt;br /&gt;
See the [https://projects.kde.org/projects/kde/kdeexamples/repository KDE Examples] repository for more KDE-related helpful resources. Also of use (which use QML and Plasma) are: [https://projects.kde.org/projects/playground/base/plasma-mobile/repository Plasma Mobile], [https://projects.kde.org/projects/playground/base/declarative-plasmoids/repository Declarative Plasmoids (playground)], for WIP ports of C++ originals&lt;br /&gt;
&lt;br /&gt;
=== Root Item ===&lt;br /&gt;
&lt;br /&gt;
The root item can be anything that inherits QGraphicsItem. For example, in this case it is QGraphicsWidget which is a plasmoid. It can also simply be an Item. I also noticed that PathView does not respond to mouse inputs automatically (so flicking doesn't work). Probably because events are being intercepted. So take note, it'll have to be e.g. an Item, for that case.&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
&lt;br /&gt;
==== Row and Column ====&lt;br /&gt;
&lt;br /&gt;
==== Anchors ====&lt;br /&gt;
Anchor layouts offer a nice way of grouping UI elements nicely together. The idea is that you connect edges or corners of one element to the edge or corner of another widget.&lt;br /&gt;
Some examples:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 200&lt;br /&gt;
    height: 300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Text {&lt;br /&gt;
        id: first&lt;br /&gt;
        text: i18n(&amp;quot;1st line&amp;quot;)&lt;br /&gt;
        anchors { &lt;br /&gt;
            top: parent.top;&lt;br /&gt;
            left: parent.left;&lt;br /&gt;
            right: parent.right;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    Text {&lt;br /&gt;
        id: second&lt;br /&gt;
        text: i18n(&amp;quot;2nd line&amp;quot;)&lt;br /&gt;
        anchors {&lt;br /&gt;
            top: first.bottom;&lt;br /&gt;
            left: parent.left;&lt;br /&gt;
            right: parent.right;&lt;br /&gt;
            bottom: parent.bottom;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Buttons ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Animations ===&lt;br /&gt;
&lt;br /&gt;
== Package Structure ==&lt;br /&gt;
&lt;br /&gt;
You create a .desktop file and the .qml file. They have to be in the usual plasma package structure.&lt;br /&gt;
&lt;br /&gt;
plasmoid-qml/metadata.desktop&lt;br /&gt;
plasmoid-qml/contents/ui/main.qml&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;metadata.desktop&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Name=Hello QML&lt;br /&gt;
Comment=A hello world widget in QML&lt;br /&gt;
Icon=chronometer&lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
X-Plasma-MainScript=ui/main.qml&lt;br /&gt;
X-Plasma-DefaultSize=200,100&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Author=Frederik Gladhorn&lt;br /&gt;
X-KDE-PluginInfo-Email=gladhorn@kde.org&lt;br /&gt;
X-KDE-PluginInfo-Website=http://plasma.kde.org/&lt;br /&gt;
X-KDE-PluginInfo-Category=Examples&lt;br /&gt;
X-KDE-PluginInfo-Name=org.kde.hello-qml&lt;br /&gt;
X-KDE-PluginInfo-Version=0.0&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Depends=&lt;br /&gt;
X-KDE-PluginInfo-License=GPL&lt;br /&gt;
X-KDE-PluginInfo-EnabledByDefault=true&lt;br /&gt;
X-KDE-ServiceTypes=Plasma/Applet&lt;br /&gt;
Type=Service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  &amp;lt;tt&amp;gt;main.qml&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing ==&lt;br /&gt;
You can install your plasmoid, though obviously this is just temporary. CMake, below, is recommended:&lt;br /&gt;
plasmapkg --install plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
=== Installation through CMake ===&lt;br /&gt;
In your CMakeLists.txt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
project(helloqml)&lt;br /&gt;
&lt;br /&gt;
install(DIRECTORY package/&lt;br /&gt;
        DESTINATION ${DATA_INSTALL_DIR}/plasma/plasmoids/org.kde.plasma.applet.myapplet)&lt;br /&gt;
&lt;br /&gt;
install(FILES package/metadata.desktop DESTINATION ${SERVICES_INSTALL_DIR} RENAME plasma-applet-myapplet.desktop)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Your directory structure should now be as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
myproject/CMakeLists.txt&lt;br /&gt;
myproject/package/&lt;br /&gt;
myproject/package/metadata.desktop&lt;br /&gt;
myproject/package/contents/&lt;br /&gt;
myproject/package/contents/ui/&lt;br /&gt;
myproject/package/contents/ui/helloworld.qml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(if you have a configuration file (.ui file) to load the right-click 'plasmoid settings' menu, then your structure will also have myproject/package/contents/config/config.ui, or so)&lt;br /&gt;
&lt;br /&gt;
== plasmoidviewer ==&lt;br /&gt;
You can run it in plasmoidviewer as usual:&lt;br /&gt;
plasmoidviewer plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
== qmlviewer ==&lt;br /&gt;
It's possible to use Plasma specific imports in qml files loaded by qmlviewer:&lt;br /&gt;
&lt;br /&gt;
qmlviewer -I /usr/lib/kde4/imports/ plasmoid-qml/contents/qml/main.qml &lt;br /&gt;
&lt;br /&gt;
Where the -I is the path to the plasma plugin for qml. Try to look for the path of &lt;br /&gt;
/usr/lib/kde4/imports/org/kde/plasma/graphicswidgets/libgraphicswidgetsbindingsplugin.so&lt;br /&gt;
and use everything up to org of that path.&lt;br /&gt;
&lt;br /&gt;
Hovewer it's '''strongly discouraged''' to use qmlviewer to develop plasmoids, because '''some features won't be available there, like the following''':&lt;br /&gt;
* localization with i18n()&lt;br /&gt;
* access to the global ''plasmoid'' object&lt;br /&gt;
* device specific qml files imported with plasmapackage:// urls&lt;br /&gt;
* bindings for qicons, KJobs, services and KConfig&lt;br /&gt;
* retrieving data from a DataEngine&lt;br /&gt;
&lt;br /&gt;
Therefore, it is recommended to simply use '''plasmoidviewer'''&lt;br /&gt;
&lt;br /&gt;
= Features only available in Plasma widgets =&lt;br /&gt;
In order to have a better integration with the KDE platform and to reach an higher degree of expressivity, the stock features of QML have been expanded with the following features, that strictly follow the Plasmoid JavaScript API:&lt;br /&gt;
&lt;br /&gt;
== Minimum size ==&lt;br /&gt;
if the root object of the plasmoid has the properties minimumWidth and minimumHeight, they will be used as the minimum size for the plasmoid. If they will change during the plasmoid execution, the plasmoid minimum size will be updated accordingly.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    property int minimumWidth: paintedWidth&lt;br /&gt;
    property int minimumHeight: paintedHeight&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above example, the minimum size is binded to the paintedWidth/paintedHeight properties of the Text element, ensuring there will always be enough room for the whole text to be displayed.&lt;br /&gt;
&lt;br /&gt;
== Plasmoid object ==&lt;br /&gt;
Every QML plasmoid will have an object called ''plasmoid'', that will give access to the configuration, the formfactor, immutability and so on. It offers the same api as the object with the same name in the Javascript API.&lt;br /&gt;
&lt;br /&gt;
For specific info on this, see [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API-PlasmoidObject Javascript API-Plasmoid Object]&lt;br /&gt;
&lt;br /&gt;
== Localization ==&lt;br /&gt;
It's possible to localize strings with the usual i18n(), i18nc(), i18np() global functions&lt;br /&gt;
&lt;br /&gt;
== Extra types ==&lt;br /&gt;
Some extra types are available from withing JavaScript, namely&lt;br /&gt;
&lt;br /&gt;
* KConfigGroup: it's an object with its config keys readable and writable as properties&lt;br /&gt;
* QIcon: can be constructed with QIcon(&amp;quot;fdo name&amp;quot;) such as QIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
* KJob&lt;br /&gt;
* Plasma Service api&lt;br /&gt;
&lt;br /&gt;
= Plasma specific imports =&lt;br /&gt;
To use some Plasma specific features and to take advantage of them in order for your applet to become a true Plasma applet, it is necessary to use some particular QML imports. See [http://techbase.kde.org/Development/Tutorials/Plasma/QML/API Plasma QML API].&lt;br /&gt;
&lt;br /&gt;
== Extra Qt features ==&lt;br /&gt;
org.kde.qtextraimports&lt;br /&gt;
To use, do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import org.kde.qtextracomponents 0.1 as QtExtraComponents&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* QPixmapItem&lt;br /&gt;
* QImageItem&lt;br /&gt;
* QIconItem&lt;br /&gt;
&lt;br /&gt;
== Plasma Widgets in QML ==&lt;br /&gt;
To use standard plasma widgets (e.g. Plasma::LineEdit, etc.), you simply add an import line for them.&lt;br /&gt;
All properties, signals and slots from ordinary Plasma widgets are available there.&lt;br /&gt;
'''These widgets are provided as a transition tool, intended to be replaced by the Plasma version of QtComponents''', which is currently in development by a gsoc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.graphicswidgets 0.1 as PlasmaWidgets&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 64&lt;br /&gt;
    height: 64&lt;br /&gt;
    PlasmaWidgets.IconWidget {&lt;br /&gt;
        id: icon&lt;br /&gt;
        Component.onCompleted: setIcon(&amp;quot;flag-red&amp;quot;)&lt;br /&gt;
        anchors.centerIn: parent&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted</id>
		<title>Development/Tutorials/Plasma/QML/GettingStarted</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted"/>
				<updated>2011-08-19T01:27:21Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* Anchors */ format&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Writing a plasma applet in QML is very easy, in fact, with KDE 4.6 and Qt 4.7 it just works.&lt;br /&gt;
&lt;br /&gt;
== QML Basics ==&lt;br /&gt;
&lt;br /&gt;
It is recommended that you have read through the [http://doc.qt.nokia.com/4.7/qtquick.html Qt QML Tutorials], as there are quite a few and they are explained thoroughly. There is also a list of all [http://doc.qt.nokia.com/4.7/qdeclarativeelements.html standard QML elements].&lt;br /&gt;
&lt;br /&gt;
Essentially, most of the content is the same. The exceptions to be noted are how data is gathered...since we use Data Engines, it is a bit different. Text color and font should be made to use PlasmaCore.Theme.&lt;br /&gt;
&lt;br /&gt;
See the [https://projects.kde.org/projects/kde/kdeexamples/repository KDE Examples] repository for more KDE-related helpful resources. Also of use (which use QML and Plasma) are: [https://projects.kde.org/projects/playground/base/plasma-mobile/repository Plasma Mobile], [https://projects.kde.org/projects/playground/base/declarative-plasmoids/repository Declarative Plasmoids (playground)], for WIP ports of C++ originals&lt;br /&gt;
&lt;br /&gt;
=== Root Item ===&lt;br /&gt;
&lt;br /&gt;
The root item can be anything that inherits QGraphicsItem. For example, in this case it is QGraphicsWidget which is a plasmoid. It can also simply be an Item. I also noticed that PathView does not respond to mouse inputs automatically (so flicking doesn't work). Probably because events are being intercepted. So take note, it'll have to be e.g. an Item, for that case.&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
&lt;br /&gt;
==== Row and Column ====&lt;br /&gt;
&lt;br /&gt;
==== Anchors ====&lt;br /&gt;
Anchor layouts offer a nice way of grouping UI elements nicely together. The idea is that you connect edges or corners of one element to the edge or corner of another widget.&lt;br /&gt;
Some examples:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 200&lt;br /&gt;
    height: 300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Text {&lt;br /&gt;
        id: first&lt;br /&gt;
        text: i18n(&amp;quot;1st line&amp;quot;)&lt;br /&gt;
        anchors { &lt;br /&gt;
            top: parent.top;&lt;br /&gt;
            left: parent.left;&lt;br /&gt;
            right: parent.right;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    Text {&lt;br /&gt;
        id: second&lt;br /&gt;
        text: i18n(&amp;quot;2nd line&amp;quot;)&lt;br /&gt;
        anchors {&lt;br /&gt;
            top: first.bottom;&lt;br /&gt;
            left: parent.left;&lt;br /&gt;
            right: parent.right;&lt;br /&gt;
            bottom: parent.bottom;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Buttons ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Animations ===&lt;br /&gt;
&lt;br /&gt;
== Package Structure ==&lt;br /&gt;
&lt;br /&gt;
You create a .desktop file and the .qml file. They have to be in the usual plasma package structure.&lt;br /&gt;
&lt;br /&gt;
plasmoid-qml/metadata.desktop&lt;br /&gt;
plasmoid-qml/contents/ui/main.qml&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;metadata.desktop&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Name=Hello QML&lt;br /&gt;
Comment=A hello world widget in QML&lt;br /&gt;
Icon=chronometer&lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
X-Plasma-MainScript=ui/main.qml&lt;br /&gt;
X-Plasma-DefaultSize=200,100&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Author=Frederik Gladhorn&lt;br /&gt;
X-KDE-PluginInfo-Email=gladhorn@kde.org&lt;br /&gt;
X-KDE-PluginInfo-Website=http://plasma.kde.org/&lt;br /&gt;
X-KDE-PluginInfo-Category=Examples&lt;br /&gt;
X-KDE-PluginInfo-Name=org.kde.hello-qml&lt;br /&gt;
X-KDE-PluginInfo-Version=0.0&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Depends=&lt;br /&gt;
X-KDE-PluginInfo-License=GPL&lt;br /&gt;
X-KDE-PluginInfo-EnabledByDefault=true&lt;br /&gt;
X-KDE-ServiceTypes=Plasma/Applet&lt;br /&gt;
Type=Service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  &amp;lt;tt&amp;gt;main.qml&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing ==&lt;br /&gt;
You can install your plasmoid, though obviously this is just temporary. CMake, below, is recommended:&lt;br /&gt;
plasmapkg --install plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
=== Installation through CMake ===&lt;br /&gt;
In your CMakeLists.txt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
project(helloqml)&lt;br /&gt;
&lt;br /&gt;
install(DIRECTORY package/&lt;br /&gt;
        DESTINATION ${DATA_INSTALL_DIR}/plasma/plasmoids/org.kde.plasma.applet.myapplet)&lt;br /&gt;
&lt;br /&gt;
install(FILES package/metadata.desktop DESTINATION ${SERVICES_INSTALL_DIR} RENAME plasma-applet-myapplet.desktop)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Your directory structure should now be as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
myproject/CMakeLists.txt&lt;br /&gt;
myproject/package/&lt;br /&gt;
myproject/package/metadata.desktop&lt;br /&gt;
myproject/package/contents/&lt;br /&gt;
myproject/package/contents/ui/&lt;br /&gt;
myproject/package/contents/ui/helloworld.qml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== plasmoidviewer ==&lt;br /&gt;
You can run it in plasmoidviewer as usual:&lt;br /&gt;
plasmoidviewer plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
== qmlviewer ==&lt;br /&gt;
It's possible to use Plasma specific imports in qml files loaded by qmlviewer:&lt;br /&gt;
&lt;br /&gt;
qmlviewer -I /usr/lib/kde4/imports/ plasmoid-qml/contents/qml/main.qml &lt;br /&gt;
&lt;br /&gt;
Where the -I is the path to the plasma plugin for qml. Try to look for the path of &lt;br /&gt;
/usr/lib/kde4/imports/org/kde/plasma/graphicswidgets/libgraphicswidgetsbindingsplugin.so&lt;br /&gt;
and use everything up to org of that path.&lt;br /&gt;
&lt;br /&gt;
Hovewer it's '''strongly discouraged''' to use qmlviewer to develop plasmoids, because '''some features won't be available there, like the following''':&lt;br /&gt;
* localization with i18n()&lt;br /&gt;
* access to the global ''plasmoid'' object&lt;br /&gt;
* device specific qml files imported with plasmapackage:// urls&lt;br /&gt;
* bindings for qicons, KJobs, services and KConfig&lt;br /&gt;
* retrieving data from a DataEngine&lt;br /&gt;
&lt;br /&gt;
Therefore, it is recommended to simply use '''plasmoidviewer'''&lt;br /&gt;
&lt;br /&gt;
= Features only available in Plasma widgets =&lt;br /&gt;
In order to have a better integration with the KDE platform and to reach an higher degree of expressivity, the stock features of QML have been expanded with the following features, that strictly follow the Plasmoid JavaScript API:&lt;br /&gt;
&lt;br /&gt;
== Minimum size ==&lt;br /&gt;
if the root object of the plasmoid has the properties minimumWidth and minimumHeight, they will be used as the minimum size for the plasmoid. If they will change during the plasmoid execution, the plasmoid minimum size will be updated accordingly.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    property int minimumWidth: paintedWidth&lt;br /&gt;
    property int minimumHeight: paintedHeight&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above example, the minimum size is binded to the paintedWidth/paintedHeight properties of the Text element, ensuring there will always be enough room for the whole text to be displayed.&lt;br /&gt;
&lt;br /&gt;
== Plasmoid object ==&lt;br /&gt;
Every QML plasmoid will have an object called ''plasmoid'', that will give access to the configuration, the formfactor, immutability and so on. It offers the same api as the object with the same name in the Javascript API.&lt;br /&gt;
&lt;br /&gt;
For specific info on this, see [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API-PlasmoidObject Javascript API-Plasmoid Object]&lt;br /&gt;
&lt;br /&gt;
== Localization ==&lt;br /&gt;
It's possible to localize strings with the usual i18n(), i18nc(), i18np() global functions&lt;br /&gt;
&lt;br /&gt;
== Extra types ==&lt;br /&gt;
Some extra types are available from withing JavaScript, namely&lt;br /&gt;
&lt;br /&gt;
* KConfigGroup: it's an object with its config keys readable and writable as properties&lt;br /&gt;
* QIcon: can be constructed with QIcon(&amp;quot;fdo name&amp;quot;) such as QIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
* KJob&lt;br /&gt;
* Plasma Service api&lt;br /&gt;
&lt;br /&gt;
= Plasma specific imports =&lt;br /&gt;
To use some Plasma specific features and to take advantage of them in order for your applet to become a true Plasma applet, it is necessary to use some particular QML imports. See [http://techbase.kde.org/Development/Tutorials/Plasma/QML/API Plasma QML API].&lt;br /&gt;
&lt;br /&gt;
== Extra Qt features ==&lt;br /&gt;
org.kde.qtextraimports&lt;br /&gt;
To use, do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import org.kde.qtextracomponents 0.1 as QtExtraComponents&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* QPixmapItem&lt;br /&gt;
* QImageItem&lt;br /&gt;
* QIconItem&lt;br /&gt;
&lt;br /&gt;
== Plasma Widgets in QML ==&lt;br /&gt;
To use standard plasma widgets (e.g. Plasma::LineEdit, etc.), you simply add an import line for them.&lt;br /&gt;
All properties, signals and slots from ordinary Plasma widgets are available there.&lt;br /&gt;
'''These widgets are provided as a transition tool, intended to be replaced by the Plasma version of QtComponents''', which is currently in development by a gsoc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.graphicswidgets 0.1 as PlasmaWidgets&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 64&lt;br /&gt;
    height: 64&lt;br /&gt;
    PlasmaWidgets.IconWidget {&lt;br /&gt;
        id: icon&lt;br /&gt;
        Component.onCompleted: setIcon(&amp;quot;flag-red&amp;quot;)&lt;br /&gt;
        anchors.centerIn: parent&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted</id>
		<title>Development/Tutorials/Plasma/QML/GettingStarted</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted"/>
				<updated>2011-08-19T01:25:40Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* qmlviewer */ bold&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Writing a plasma applet in QML is very easy, in fact, with KDE 4.6 and Qt 4.7 it just works.&lt;br /&gt;
&lt;br /&gt;
== QML Basics ==&lt;br /&gt;
&lt;br /&gt;
It is recommended that you have read through the [http://doc.qt.nokia.com/4.7/qtquick.html Qt QML Tutorials], as there are quite a few and they are explained thoroughly. There is also a list of all [http://doc.qt.nokia.com/4.7/qdeclarativeelements.html standard QML elements].&lt;br /&gt;
&lt;br /&gt;
Essentially, most of the content is the same. The exceptions to be noted are how data is gathered...since we use Data Engines, it is a bit different. Text color and font should be made to use PlasmaCore.Theme.&lt;br /&gt;
&lt;br /&gt;
See the [https://projects.kde.org/projects/kde/kdeexamples/repository KDE Examples] repository for more KDE-related helpful resources. Also of use (which use QML and Plasma) are: [https://projects.kde.org/projects/playground/base/plasma-mobile/repository Plasma Mobile], [https://projects.kde.org/projects/playground/base/declarative-plasmoids/repository Declarative Plasmoids (playground)], for WIP ports of C++ originals&lt;br /&gt;
&lt;br /&gt;
=== Root Item ===&lt;br /&gt;
&lt;br /&gt;
The root item can be anything that inherits QGraphicsItem. For example, in this case it is QGraphicsWidget which is a plasmoid. It can also simply be an Item. I also noticed that PathView does not respond to mouse inputs automatically (so flicking doesn't work). Probably because events are being intercepted. So take note, it'll have to be e.g. an Item, for that case.&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
&lt;br /&gt;
==== Row and Column ====&lt;br /&gt;
&lt;br /&gt;
==== Anchors ====&lt;br /&gt;
Anchor layouts offer a nice way of grouping UI elements nicely together. The idea is that you connect edges or corners of one element to the edge or corner of another widget.&lt;br /&gt;
Some examples:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 200&lt;br /&gt;
    height: 300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Text {&lt;br /&gt;
        id: first&lt;br /&gt;
        text: i18n(&amp;quot;1st line&amp;quot;)&lt;br /&gt;
        anchors { top: parent.top;&lt;br /&gt;
                  left: parent.left;&lt;br /&gt;
                  right: parent.right;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    Text {&lt;br /&gt;
        id: second&lt;br /&gt;
        text: i18n(&amp;quot;2nd line&amp;quot;)&lt;br /&gt;
        anchors { top: first.bottom;&lt;br /&gt;
                  left: parent.left;&lt;br /&gt;
                  right: parent.right;&lt;br /&gt;
                  bottom: parent.bottom;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Buttons ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Animations ===&lt;br /&gt;
&lt;br /&gt;
== Package Structure ==&lt;br /&gt;
&lt;br /&gt;
You create a .desktop file and the .qml file. They have to be in the usual plasma package structure.&lt;br /&gt;
&lt;br /&gt;
plasmoid-qml/metadata.desktop&lt;br /&gt;
plasmoid-qml/contents/ui/main.qml&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;metadata.desktop&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Name=Hello QML&lt;br /&gt;
Comment=A hello world widget in QML&lt;br /&gt;
Icon=chronometer&lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
X-Plasma-MainScript=ui/main.qml&lt;br /&gt;
X-Plasma-DefaultSize=200,100&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Author=Frederik Gladhorn&lt;br /&gt;
X-KDE-PluginInfo-Email=gladhorn@kde.org&lt;br /&gt;
X-KDE-PluginInfo-Website=http://plasma.kde.org/&lt;br /&gt;
X-KDE-PluginInfo-Category=Examples&lt;br /&gt;
X-KDE-PluginInfo-Name=org.kde.hello-qml&lt;br /&gt;
X-KDE-PluginInfo-Version=0.0&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Depends=&lt;br /&gt;
X-KDE-PluginInfo-License=GPL&lt;br /&gt;
X-KDE-PluginInfo-EnabledByDefault=true&lt;br /&gt;
X-KDE-ServiceTypes=Plasma/Applet&lt;br /&gt;
Type=Service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  &amp;lt;tt&amp;gt;main.qml&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing ==&lt;br /&gt;
You can install your plasmoid, though obviously this is just temporary. CMake, below, is recommended:&lt;br /&gt;
plasmapkg --install plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
=== Installation through CMake ===&lt;br /&gt;
In your CMakeLists.txt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
project(helloqml)&lt;br /&gt;
&lt;br /&gt;
install(DIRECTORY package/&lt;br /&gt;
        DESTINATION ${DATA_INSTALL_DIR}/plasma/plasmoids/org.kde.plasma.applet.myapplet)&lt;br /&gt;
&lt;br /&gt;
install(FILES package/metadata.desktop DESTINATION ${SERVICES_INSTALL_DIR} RENAME plasma-applet-myapplet.desktop)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Your directory structure should now be as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
myproject/CMakeLists.txt&lt;br /&gt;
myproject/package/&lt;br /&gt;
myproject/package/metadata.desktop&lt;br /&gt;
myproject/package/contents/&lt;br /&gt;
myproject/package/contents/ui/&lt;br /&gt;
myproject/package/contents/ui/helloworld.qml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== plasmoidviewer ==&lt;br /&gt;
You can run it in plasmoidviewer as usual:&lt;br /&gt;
plasmoidviewer plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
== qmlviewer ==&lt;br /&gt;
It's possible to use Plasma specific imports in qml files loaded by qmlviewer:&lt;br /&gt;
&lt;br /&gt;
qmlviewer -I /usr/lib/kde4/imports/ plasmoid-qml/contents/qml/main.qml &lt;br /&gt;
&lt;br /&gt;
Where the -I is the path to the plasma plugin for qml. Try to look for the path of &lt;br /&gt;
/usr/lib/kde4/imports/org/kde/plasma/graphicswidgets/libgraphicswidgetsbindingsplugin.so&lt;br /&gt;
and use everything up to org of that path.&lt;br /&gt;
&lt;br /&gt;
Hovewer it's '''strongly discouraged''' to use qmlviewer to develop plasmoids, because '''some features won't be available there, like the following''':&lt;br /&gt;
* localization with i18n()&lt;br /&gt;
* access to the global ''plasmoid'' object&lt;br /&gt;
* device specific qml files imported with plasmapackage:// urls&lt;br /&gt;
* bindings for qicons, KJobs, services and KConfig&lt;br /&gt;
* retrieving data from a DataEngine&lt;br /&gt;
&lt;br /&gt;
Therefore, it is recommended to simply use '''plasmoidviewer'''&lt;br /&gt;
&lt;br /&gt;
= Features only available in Plasma widgets =&lt;br /&gt;
In order to have a better integration with the KDE platform and to reach an higher degree of expressivity, the stock features of QML have been expanded with the following features, that strictly follow the Plasmoid JavaScript API:&lt;br /&gt;
&lt;br /&gt;
== Minimum size ==&lt;br /&gt;
if the root object of the plasmoid has the properties minimumWidth and minimumHeight, they will be used as the minimum size for the plasmoid. If they will change during the plasmoid execution, the plasmoid minimum size will be updated accordingly.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    property int minimumWidth: paintedWidth&lt;br /&gt;
    property int minimumHeight: paintedHeight&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above example, the minimum size is binded to the paintedWidth/paintedHeight properties of the Text element, ensuring there will always be enough room for the whole text to be displayed.&lt;br /&gt;
&lt;br /&gt;
== Plasmoid object ==&lt;br /&gt;
Every QML plasmoid will have an object called ''plasmoid'', that will give access to the configuration, the formfactor, immutability and so on. It offers the same api as the object with the same name in the Javascript API.&lt;br /&gt;
&lt;br /&gt;
For specific info on this, see [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API-PlasmoidObject Javascript API-Plasmoid Object]&lt;br /&gt;
&lt;br /&gt;
== Localization ==&lt;br /&gt;
It's possible to localize strings with the usual i18n(), i18nc(), i18np() global functions&lt;br /&gt;
&lt;br /&gt;
== Extra types ==&lt;br /&gt;
Some extra types are available from withing JavaScript, namely&lt;br /&gt;
&lt;br /&gt;
* KConfigGroup: it's an object with its config keys readable and writable as properties&lt;br /&gt;
* QIcon: can be constructed with QIcon(&amp;quot;fdo name&amp;quot;) such as QIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
* KJob&lt;br /&gt;
* Plasma Service api&lt;br /&gt;
&lt;br /&gt;
= Plasma specific imports =&lt;br /&gt;
To use some Plasma specific features and to take advantage of them in order for your applet to become a true Plasma applet, it is necessary to use some particular QML imports. See [http://techbase.kde.org/Development/Tutorials/Plasma/QML/API Plasma QML API].&lt;br /&gt;
&lt;br /&gt;
== Extra Qt features ==&lt;br /&gt;
org.kde.qtextraimports&lt;br /&gt;
To use, do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import org.kde.qtextracomponents 0.1 as QtExtraComponents&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* QPixmapItem&lt;br /&gt;
* QImageItem&lt;br /&gt;
* QIconItem&lt;br /&gt;
&lt;br /&gt;
== Plasma Widgets in QML ==&lt;br /&gt;
To use standard plasma widgets (e.g. Plasma::LineEdit, etc.), you simply add an import line for them.&lt;br /&gt;
All properties, signals and slots from ordinary Plasma widgets are available there.&lt;br /&gt;
'''These widgets are provided as a transition tool, intended to be replaced by the Plasma version of QtComponents''', which is currently in development by a gsoc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.graphicswidgets 0.1 as PlasmaWidgets&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 64&lt;br /&gt;
    height: 64&lt;br /&gt;
    PlasmaWidgets.IconWidget {&lt;br /&gt;
        id: icon&lt;br /&gt;
        Component.onCompleted: setIcon(&amp;quot;flag-red&amp;quot;)&lt;br /&gt;
        anchors.centerIn: parent&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted</id>
		<title>Development/Tutorials/Plasma/QML/GettingStarted</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted"/>
				<updated>2011-08-19T01:25:18Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* qmlviewer */ plasmoidviewer&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Writing a plasma applet in QML is very easy, in fact, with KDE 4.6 and Qt 4.7 it just works.&lt;br /&gt;
&lt;br /&gt;
== QML Basics ==&lt;br /&gt;
&lt;br /&gt;
It is recommended that you have read through the [http://doc.qt.nokia.com/4.7/qtquick.html Qt QML Tutorials], as there are quite a few and they are explained thoroughly. There is also a list of all [http://doc.qt.nokia.com/4.7/qdeclarativeelements.html standard QML elements].&lt;br /&gt;
&lt;br /&gt;
Essentially, most of the content is the same. The exceptions to be noted are how data is gathered...since we use Data Engines, it is a bit different. Text color and font should be made to use PlasmaCore.Theme.&lt;br /&gt;
&lt;br /&gt;
See the [https://projects.kde.org/projects/kde/kdeexamples/repository KDE Examples] repository for more KDE-related helpful resources. Also of use (which use QML and Plasma) are: [https://projects.kde.org/projects/playground/base/plasma-mobile/repository Plasma Mobile], [https://projects.kde.org/projects/playground/base/declarative-plasmoids/repository Declarative Plasmoids (playground)], for WIP ports of C++ originals&lt;br /&gt;
&lt;br /&gt;
=== Root Item ===&lt;br /&gt;
&lt;br /&gt;
The root item can be anything that inherits QGraphicsItem. For example, in this case it is QGraphicsWidget which is a plasmoid. It can also simply be an Item. I also noticed that PathView does not respond to mouse inputs automatically (so flicking doesn't work). Probably because events are being intercepted. So take note, it'll have to be e.g. an Item, for that case.&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
&lt;br /&gt;
==== Row and Column ====&lt;br /&gt;
&lt;br /&gt;
==== Anchors ====&lt;br /&gt;
Anchor layouts offer a nice way of grouping UI elements nicely together. The idea is that you connect edges or corners of one element to the edge or corner of another widget.&lt;br /&gt;
Some examples:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 200&lt;br /&gt;
    height: 300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Text {&lt;br /&gt;
        id: first&lt;br /&gt;
        text: i18n(&amp;quot;1st line&amp;quot;)&lt;br /&gt;
        anchors { top: parent.top;&lt;br /&gt;
                  left: parent.left;&lt;br /&gt;
                  right: parent.right;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    Text {&lt;br /&gt;
        id: second&lt;br /&gt;
        text: i18n(&amp;quot;2nd line&amp;quot;)&lt;br /&gt;
        anchors { top: first.bottom;&lt;br /&gt;
                  left: parent.left;&lt;br /&gt;
                  right: parent.right;&lt;br /&gt;
                  bottom: parent.bottom;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Buttons ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Animations ===&lt;br /&gt;
&lt;br /&gt;
== Package Structure ==&lt;br /&gt;
&lt;br /&gt;
You create a .desktop file and the .qml file. They have to be in the usual plasma package structure.&lt;br /&gt;
&lt;br /&gt;
plasmoid-qml/metadata.desktop&lt;br /&gt;
plasmoid-qml/contents/ui/main.qml&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;metadata.desktop&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Name=Hello QML&lt;br /&gt;
Comment=A hello world widget in QML&lt;br /&gt;
Icon=chronometer&lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
X-Plasma-MainScript=ui/main.qml&lt;br /&gt;
X-Plasma-DefaultSize=200,100&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Author=Frederik Gladhorn&lt;br /&gt;
X-KDE-PluginInfo-Email=gladhorn@kde.org&lt;br /&gt;
X-KDE-PluginInfo-Website=http://plasma.kde.org/&lt;br /&gt;
X-KDE-PluginInfo-Category=Examples&lt;br /&gt;
X-KDE-PluginInfo-Name=org.kde.hello-qml&lt;br /&gt;
X-KDE-PluginInfo-Version=0.0&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Depends=&lt;br /&gt;
X-KDE-PluginInfo-License=GPL&lt;br /&gt;
X-KDE-PluginInfo-EnabledByDefault=true&lt;br /&gt;
X-KDE-ServiceTypes=Plasma/Applet&lt;br /&gt;
Type=Service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  &amp;lt;tt&amp;gt;main.qml&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing ==&lt;br /&gt;
You can install your plasmoid, though obviously this is just temporary. CMake, below, is recommended:&lt;br /&gt;
plasmapkg --install plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
=== Installation through CMake ===&lt;br /&gt;
In your CMakeLists.txt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
project(helloqml)&lt;br /&gt;
&lt;br /&gt;
install(DIRECTORY package/&lt;br /&gt;
        DESTINATION ${DATA_INSTALL_DIR}/plasma/plasmoids/org.kde.plasma.applet.myapplet)&lt;br /&gt;
&lt;br /&gt;
install(FILES package/metadata.desktop DESTINATION ${SERVICES_INSTALL_DIR} RENAME plasma-applet-myapplet.desktop)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Your directory structure should now be as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
myproject/CMakeLists.txt&lt;br /&gt;
myproject/package/&lt;br /&gt;
myproject/package/metadata.desktop&lt;br /&gt;
myproject/package/contents/&lt;br /&gt;
myproject/package/contents/ui/&lt;br /&gt;
myproject/package/contents/ui/helloworld.qml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== plasmoidviewer ==&lt;br /&gt;
You can run it in plasmoidviewer as usual:&lt;br /&gt;
plasmoidviewer plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
== qmlviewer ==&lt;br /&gt;
It's possible to use Plasma specific imports in qml files loaded by qmlviewer:&lt;br /&gt;
&lt;br /&gt;
qmlviewer -I /usr/lib/kde4/imports/ plasmoid-qml/contents/qml/main.qml &lt;br /&gt;
&lt;br /&gt;
Where the -I is the path to the plasma plugin for qml. Try to look for the path of &lt;br /&gt;
/usr/lib/kde4/imports/org/kde/plasma/graphicswidgets/libgraphicswidgetsbindingsplugin.so&lt;br /&gt;
and use everything up to org of that path.&lt;br /&gt;
&lt;br /&gt;
Hovewer it's '''strongly discouraged''' to use qmlviewer to develop plasmoids, because some features won't be available there, like the following:&lt;br /&gt;
* localization with i18n()&lt;br /&gt;
* access to the global ''plasmoid'' object&lt;br /&gt;
* device specific qml files imported with plasmapackage:// urls&lt;br /&gt;
* bindings for qicons, KJobs, services and KConfig&lt;br /&gt;
* retrieving data from a DataEngine&lt;br /&gt;
&lt;br /&gt;
Therefore, it is recommended to simply use '''plasmoidviewer'''&lt;br /&gt;
&lt;br /&gt;
= Features only available in Plasma widgets =&lt;br /&gt;
In order to have a better integration with the KDE platform and to reach an higher degree of expressivity, the stock features of QML have been expanded with the following features, that strictly follow the Plasmoid JavaScript API:&lt;br /&gt;
&lt;br /&gt;
== Minimum size ==&lt;br /&gt;
if the root object of the plasmoid has the properties minimumWidth and minimumHeight, they will be used as the minimum size for the plasmoid. If they will change during the plasmoid execution, the plasmoid minimum size will be updated accordingly.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    property int minimumWidth: paintedWidth&lt;br /&gt;
    property int minimumHeight: paintedHeight&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above example, the minimum size is binded to the paintedWidth/paintedHeight properties of the Text element, ensuring there will always be enough room for the whole text to be displayed.&lt;br /&gt;
&lt;br /&gt;
== Plasmoid object ==&lt;br /&gt;
Every QML plasmoid will have an object called ''plasmoid'', that will give access to the configuration, the formfactor, immutability and so on. It offers the same api as the object with the same name in the Javascript API.&lt;br /&gt;
&lt;br /&gt;
For specific info on this, see [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API-PlasmoidObject Javascript API-Plasmoid Object]&lt;br /&gt;
&lt;br /&gt;
== Localization ==&lt;br /&gt;
It's possible to localize strings with the usual i18n(), i18nc(), i18np() global functions&lt;br /&gt;
&lt;br /&gt;
== Extra types ==&lt;br /&gt;
Some extra types are available from withing JavaScript, namely&lt;br /&gt;
&lt;br /&gt;
* KConfigGroup: it's an object with its config keys readable and writable as properties&lt;br /&gt;
* QIcon: can be constructed with QIcon(&amp;quot;fdo name&amp;quot;) such as QIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
* KJob&lt;br /&gt;
* Plasma Service api&lt;br /&gt;
&lt;br /&gt;
= Plasma specific imports =&lt;br /&gt;
To use some Plasma specific features and to take advantage of them in order for your applet to become a true Plasma applet, it is necessary to use some particular QML imports. See [http://techbase.kde.org/Development/Tutorials/Plasma/QML/API Plasma QML API].&lt;br /&gt;
&lt;br /&gt;
== Extra Qt features ==&lt;br /&gt;
org.kde.qtextraimports&lt;br /&gt;
To use, do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import org.kde.qtextracomponents 0.1 as QtExtraComponents&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* QPixmapItem&lt;br /&gt;
* QImageItem&lt;br /&gt;
* QIconItem&lt;br /&gt;
&lt;br /&gt;
== Plasma Widgets in QML ==&lt;br /&gt;
To use standard plasma widgets (e.g. Plasma::LineEdit, etc.), you simply add an import line for them.&lt;br /&gt;
All properties, signals and slots from ordinary Plasma widgets are available there.&lt;br /&gt;
'''These widgets are provided as a transition tool, intended to be replaced by the Plasma version of QtComponents''', which is currently in development by a gsoc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.graphicswidgets 0.1 as PlasmaWidgets&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 64&lt;br /&gt;
    height: 64&lt;br /&gt;
    PlasmaWidgets.IconWidget {&lt;br /&gt;
        id: icon&lt;br /&gt;
        Component.onCompleted: setIcon(&amp;quot;flag-red&amp;quot;)&lt;br /&gt;
        anchors.centerIn: parent&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted</id>
		<title>Development/Tutorials/Plasma/QML/GettingStarted</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted"/>
				<updated>2011-08-19T01:22:34Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* Installation through CMake */ Show dir structure.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Writing a plasma applet in QML is very easy, in fact, with KDE 4.6 and Qt 4.7 it just works.&lt;br /&gt;
&lt;br /&gt;
== QML Basics ==&lt;br /&gt;
&lt;br /&gt;
It is recommended that you have read through the [http://doc.qt.nokia.com/4.7/qtquick.html Qt QML Tutorials], as there are quite a few and they are explained thoroughly. There is also a list of all [http://doc.qt.nokia.com/4.7/qdeclarativeelements.html standard QML elements].&lt;br /&gt;
&lt;br /&gt;
Essentially, most of the content is the same. The exceptions to be noted are how data is gathered...since we use Data Engines, it is a bit different. Text color and font should be made to use PlasmaCore.Theme.&lt;br /&gt;
&lt;br /&gt;
See the [https://projects.kde.org/projects/kde/kdeexamples/repository KDE Examples] repository for more KDE-related helpful resources. Also of use (which use QML and Plasma) are: [https://projects.kde.org/projects/playground/base/plasma-mobile/repository Plasma Mobile], [https://projects.kde.org/projects/playground/base/declarative-plasmoids/repository Declarative Plasmoids (playground)], for WIP ports of C++ originals&lt;br /&gt;
&lt;br /&gt;
=== Root Item ===&lt;br /&gt;
&lt;br /&gt;
The root item can be anything that inherits QGraphicsItem. For example, in this case it is QGraphicsWidget which is a plasmoid. It can also simply be an Item. I also noticed that PathView does not respond to mouse inputs automatically (so flicking doesn't work). Probably because events are being intercepted. So take note, it'll have to be e.g. an Item, for that case.&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
&lt;br /&gt;
==== Row and Column ====&lt;br /&gt;
&lt;br /&gt;
==== Anchors ====&lt;br /&gt;
Anchor layouts offer a nice way of grouping UI elements nicely together. The idea is that you connect edges or corners of one element to the edge or corner of another widget.&lt;br /&gt;
Some examples:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 200&lt;br /&gt;
    height: 300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Text {&lt;br /&gt;
        id: first&lt;br /&gt;
        text: i18n(&amp;quot;1st line&amp;quot;)&lt;br /&gt;
        anchors { top: parent.top;&lt;br /&gt;
                  left: parent.left;&lt;br /&gt;
                  right: parent.right;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    Text {&lt;br /&gt;
        id: second&lt;br /&gt;
        text: i18n(&amp;quot;2nd line&amp;quot;)&lt;br /&gt;
        anchors { top: first.bottom;&lt;br /&gt;
                  left: parent.left;&lt;br /&gt;
                  right: parent.right;&lt;br /&gt;
                  bottom: parent.bottom;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Buttons ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Animations ===&lt;br /&gt;
&lt;br /&gt;
== Package Structure ==&lt;br /&gt;
&lt;br /&gt;
You create a .desktop file and the .qml file. They have to be in the usual plasma package structure.&lt;br /&gt;
&lt;br /&gt;
plasmoid-qml/metadata.desktop&lt;br /&gt;
plasmoid-qml/contents/ui/main.qml&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;metadata.desktop&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Name=Hello QML&lt;br /&gt;
Comment=A hello world widget in QML&lt;br /&gt;
Icon=chronometer&lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
X-Plasma-MainScript=ui/main.qml&lt;br /&gt;
X-Plasma-DefaultSize=200,100&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Author=Frederik Gladhorn&lt;br /&gt;
X-KDE-PluginInfo-Email=gladhorn@kde.org&lt;br /&gt;
X-KDE-PluginInfo-Website=http://plasma.kde.org/&lt;br /&gt;
X-KDE-PluginInfo-Category=Examples&lt;br /&gt;
X-KDE-PluginInfo-Name=org.kde.hello-qml&lt;br /&gt;
X-KDE-PluginInfo-Version=0.0&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Depends=&lt;br /&gt;
X-KDE-PluginInfo-License=GPL&lt;br /&gt;
X-KDE-PluginInfo-EnabledByDefault=true&lt;br /&gt;
X-KDE-ServiceTypes=Plasma/Applet&lt;br /&gt;
Type=Service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  &amp;lt;tt&amp;gt;main.qml&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing ==&lt;br /&gt;
You can install your plasmoid, though obviously this is just temporary. CMake, below, is recommended:&lt;br /&gt;
plasmapkg --install plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
=== Installation through CMake ===&lt;br /&gt;
In your CMakeLists.txt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
project(helloqml)&lt;br /&gt;
&lt;br /&gt;
install(DIRECTORY package/&lt;br /&gt;
        DESTINATION ${DATA_INSTALL_DIR}/plasma/plasmoids/org.kde.plasma.applet.myapplet)&lt;br /&gt;
&lt;br /&gt;
install(FILES package/metadata.desktop DESTINATION ${SERVICES_INSTALL_DIR} RENAME plasma-applet-myapplet.desktop)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Your directory structure should now be as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
myproject/CMakeLists.txt&lt;br /&gt;
myproject/package/&lt;br /&gt;
myproject/package/metadata.desktop&lt;br /&gt;
myproject/package/contents/&lt;br /&gt;
myproject/package/contents/ui/&lt;br /&gt;
myproject/package/contents/ui/helloworld.qml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== plasmoidviewer ==&lt;br /&gt;
You can run it in plasmoidviewer as usual:&lt;br /&gt;
plasmoidviewer plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
== qmlviewer ==&lt;br /&gt;
It's possible to use Plasma specific imports in qml files loaded by qmlviewer:&lt;br /&gt;
&lt;br /&gt;
qmlviewer -I /usr/lib/kde4/imports/ plasmoid-qml/contents/qml/main.qml &lt;br /&gt;
&lt;br /&gt;
Where the -I is the path to the plasma plugin for qml. Try to look for the path of &lt;br /&gt;
/usr/lib/kde4/imports/org/kde/plasma/graphicswidgets/libgraphicswidgetsbindingsplugin.so&lt;br /&gt;
and use everything up to org of that path.&lt;br /&gt;
&lt;br /&gt;
Hovewer it's '''strongly discouraged''' to use qmlviewer to develop plasmoids, because some features won't be available there:&lt;br /&gt;
* localization with i18n()&lt;br /&gt;
* access to the global ''plasmoid'' object&lt;br /&gt;
* device specific qml files imported with plasmapackage:// urls&lt;br /&gt;
* bindings for qicons, KJobs, services and KConfig&lt;br /&gt;
&lt;br /&gt;
= Features only available in Plasma widgets =&lt;br /&gt;
In order to have a better integration with the KDE platform and to reach an higher degree of expressivity, the stock features of QML have been expanded with the following features, that strictly follow the Plasmoid JavaScript API:&lt;br /&gt;
&lt;br /&gt;
== Minimum size ==&lt;br /&gt;
if the root object of the plasmoid has the properties minimumWidth and minimumHeight, they will be used as the minimum size for the plasmoid. If they will change during the plasmoid execution, the plasmoid minimum size will be updated accordingly.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    property int minimumWidth: paintedWidth&lt;br /&gt;
    property int minimumHeight: paintedHeight&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above example, the minimum size is binded to the paintedWidth/paintedHeight properties of the Text element, ensuring there will always be enough room for the whole text to be displayed.&lt;br /&gt;
&lt;br /&gt;
== Plasmoid object ==&lt;br /&gt;
Every QML plasmoid will have an object called ''plasmoid'', that will give access to the configuration, the formfactor, immutability and so on. It offers the same api as the object with the same name in the Javascript API.&lt;br /&gt;
&lt;br /&gt;
For specific info on this, see [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API-PlasmoidObject Javascript API-Plasmoid Object]&lt;br /&gt;
&lt;br /&gt;
== Localization ==&lt;br /&gt;
It's possible to localize strings with the usual i18n(), i18nc(), i18np() global functions&lt;br /&gt;
&lt;br /&gt;
== Extra types ==&lt;br /&gt;
Some extra types are available from withing JavaScript, namely&lt;br /&gt;
&lt;br /&gt;
* KConfigGroup: it's an object with its config keys readable and writable as properties&lt;br /&gt;
* QIcon: can be constructed with QIcon(&amp;quot;fdo name&amp;quot;) such as QIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
* KJob&lt;br /&gt;
* Plasma Service api&lt;br /&gt;
&lt;br /&gt;
= Plasma specific imports =&lt;br /&gt;
To use some Plasma specific features and to take advantage of them in order for your applet to become a true Plasma applet, it is necessary to use some particular QML imports. See [http://techbase.kde.org/Development/Tutorials/Plasma/QML/API Plasma QML API].&lt;br /&gt;
&lt;br /&gt;
== Extra Qt features ==&lt;br /&gt;
org.kde.qtextraimports&lt;br /&gt;
To use, do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import org.kde.qtextracomponents 0.1 as QtExtraComponents&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* QPixmapItem&lt;br /&gt;
* QImageItem&lt;br /&gt;
* QIconItem&lt;br /&gt;
&lt;br /&gt;
== Plasma Widgets in QML ==&lt;br /&gt;
To use standard plasma widgets (e.g. Plasma::LineEdit, etc.), you simply add an import line for them.&lt;br /&gt;
All properties, signals and slots from ordinary Plasma widgets are available there.&lt;br /&gt;
'''These widgets are provided as a transition tool, intended to be replaced by the Plasma version of QtComponents''', which is currently in development by a gsoc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.graphicswidgets 0.1 as PlasmaWidgets&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 64&lt;br /&gt;
    height: 64&lt;br /&gt;
    PlasmaWidgets.IconWidget {&lt;br /&gt;
        id: icon&lt;br /&gt;
        Component.onCompleted: setIcon(&amp;quot;flag-red&amp;quot;)&lt;br /&gt;
        anchors.centerIn: parent&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted</id>
		<title>Development/Tutorials/Plasma/QML/GettingStarted</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted"/>
				<updated>2011-08-19T01:16:44Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* Installing */ Add installation via cmake, and this only uses 1 file, not a dupe of .desktop like a lot of stuff in git has ;-)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Writing a plasma applet in QML is very easy, in fact, with KDE 4.6 and Qt 4.7 it just works.&lt;br /&gt;
&lt;br /&gt;
== QML Basics ==&lt;br /&gt;
&lt;br /&gt;
It is recommended that you have read through the [http://doc.qt.nokia.com/4.7/qtquick.html Qt QML Tutorials], as there are quite a few and they are explained thoroughly. There is also a list of all [http://doc.qt.nokia.com/4.7/qdeclarativeelements.html standard QML elements].&lt;br /&gt;
&lt;br /&gt;
Essentially, most of the content is the same. The exceptions to be noted are how data is gathered...since we use Data Engines, it is a bit different. Text color and font should be made to use PlasmaCore.Theme.&lt;br /&gt;
&lt;br /&gt;
See the [https://projects.kde.org/projects/kde/kdeexamples/repository KDE Examples] repository for more KDE-related helpful resources. Also of use (which use QML and Plasma) are: [https://projects.kde.org/projects/playground/base/plasma-mobile/repository Plasma Mobile], [https://projects.kde.org/projects/playground/base/declarative-plasmoids/repository Declarative Plasmoids (playground)], for WIP ports of C++ originals&lt;br /&gt;
&lt;br /&gt;
=== Root Item ===&lt;br /&gt;
&lt;br /&gt;
The root item can be anything that inherits QGraphicsItem. For example, in this case it is QGraphicsWidget which is a plasmoid. It can also simply be an Item. I also noticed that PathView does not respond to mouse inputs automatically (so flicking doesn't work). Probably because events are being intercepted. So take note, it'll have to be e.g. an Item, for that case.&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
&lt;br /&gt;
==== Row and Column ====&lt;br /&gt;
&lt;br /&gt;
==== Anchors ====&lt;br /&gt;
Anchor layouts offer a nice way of grouping UI elements nicely together. The idea is that you connect edges or corners of one element to the edge or corner of another widget.&lt;br /&gt;
Some examples:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 200&lt;br /&gt;
    height: 300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Text {&lt;br /&gt;
        id: first&lt;br /&gt;
        text: i18n(&amp;quot;1st line&amp;quot;)&lt;br /&gt;
        anchors { top: parent.top;&lt;br /&gt;
                  left: parent.left;&lt;br /&gt;
                  right: parent.right;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    Text {&lt;br /&gt;
        id: second&lt;br /&gt;
        text: i18n(&amp;quot;2nd line&amp;quot;)&lt;br /&gt;
        anchors { top: first.bottom;&lt;br /&gt;
                  left: parent.left;&lt;br /&gt;
                  right: parent.right;&lt;br /&gt;
                  bottom: parent.bottom;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Buttons ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Animations ===&lt;br /&gt;
&lt;br /&gt;
== Package Structure ==&lt;br /&gt;
&lt;br /&gt;
You create a .desktop file and the .qml file. They have to be in the usual plasma package structure.&lt;br /&gt;
&lt;br /&gt;
plasmoid-qml/metadata.desktop&lt;br /&gt;
plasmoid-qml/contents/ui/main.qml&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;metadata.desktop&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Name=Hello QML&lt;br /&gt;
Comment=A hello world widget in QML&lt;br /&gt;
Icon=chronometer&lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
X-Plasma-MainScript=ui/main.qml&lt;br /&gt;
X-Plasma-DefaultSize=200,100&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Author=Frederik Gladhorn&lt;br /&gt;
X-KDE-PluginInfo-Email=gladhorn@kde.org&lt;br /&gt;
X-KDE-PluginInfo-Website=http://plasma.kde.org/&lt;br /&gt;
X-KDE-PluginInfo-Category=Examples&lt;br /&gt;
X-KDE-PluginInfo-Name=org.kde.hello-qml&lt;br /&gt;
X-KDE-PluginInfo-Version=0.0&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Depends=&lt;br /&gt;
X-KDE-PluginInfo-License=GPL&lt;br /&gt;
X-KDE-PluginInfo-EnabledByDefault=true&lt;br /&gt;
X-KDE-ServiceTypes=Plasma/Applet&lt;br /&gt;
Type=Service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  &amp;lt;tt&amp;gt;main.qml&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing ==&lt;br /&gt;
You can install your plasmoid, though obviously this is just temporary. CMake, below, is recommended:&lt;br /&gt;
plasmapkg --install plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
=== Installation through CMake ===&lt;br /&gt;
In your CMakeLists.txt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
project(helloqml)&lt;br /&gt;
&lt;br /&gt;
install(DIRECTORY package/&lt;br /&gt;
        DESTINATION ${DATA_INSTALL_DIR}/plasma/plasmoids/org.kde.plasma.applet.myapplet)&lt;br /&gt;
&lt;br /&gt;
install(FILES package/metadata.desktop DESTINATION ${SERVICES_INSTALL_DIR} RENAME plasma-applet-myapplet.desktop)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Your directory structure should now be as follows:&lt;br /&gt;
&lt;br /&gt;
- myproject/&lt;br /&gt;
-- CMakeLists.txt&lt;br /&gt;
-- package/&lt;br /&gt;
--- metadata.desktop&lt;br /&gt;
--- contents/&lt;br /&gt;
---- ui/&lt;br /&gt;
----- helloworld.qml&lt;br /&gt;
&lt;br /&gt;
== plasmoidviewer ==&lt;br /&gt;
You can run it in plasmoidviewer as usual:&lt;br /&gt;
plasmoidviewer plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
== qmlviewer ==&lt;br /&gt;
It's possible to use Plasma specific imports in qml files loaded by qmlviewer:&lt;br /&gt;
&lt;br /&gt;
qmlviewer -I /usr/lib/kde4/imports/ plasmoid-qml/contents/qml/main.qml &lt;br /&gt;
&lt;br /&gt;
Where the -I is the path to the plasma plugin for qml. Try to look for the path of &lt;br /&gt;
/usr/lib/kde4/imports/org/kde/plasma/graphicswidgets/libgraphicswidgetsbindingsplugin.so&lt;br /&gt;
and use everything up to org of that path.&lt;br /&gt;
&lt;br /&gt;
Hovewer it's '''strongly discouraged''' to use qmlviewer to develop plasmoids, because some features won't be available there:&lt;br /&gt;
* localization with i18n()&lt;br /&gt;
* access to the global ''plasmoid'' object&lt;br /&gt;
* device specific qml files imported with plasmapackage:// urls&lt;br /&gt;
* bindings for qicons, KJobs, services and KConfig&lt;br /&gt;
&lt;br /&gt;
= Features only available in Plasma widgets =&lt;br /&gt;
In order to have a better integration with the KDE platform and to reach an higher degree of expressivity, the stock features of QML have been expanded with the following features, that strictly follow the Plasmoid JavaScript API:&lt;br /&gt;
&lt;br /&gt;
== Minimum size ==&lt;br /&gt;
if the root object of the plasmoid has the properties minimumWidth and minimumHeight, they will be used as the minimum size for the plasmoid. If they will change during the plasmoid execution, the plasmoid minimum size will be updated accordingly.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    property int minimumWidth: paintedWidth&lt;br /&gt;
    property int minimumHeight: paintedHeight&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above example, the minimum size is binded to the paintedWidth/paintedHeight properties of the Text element, ensuring there will always be enough room for the whole text to be displayed.&lt;br /&gt;
&lt;br /&gt;
== Plasmoid object ==&lt;br /&gt;
Every QML plasmoid will have an object called ''plasmoid'', that will give access to the configuration, the formfactor, immutability and so on. It offers the same api as the object with the same name in the Javascript API.&lt;br /&gt;
&lt;br /&gt;
For specific info on this, see [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API-PlasmoidObject Javascript API-Plasmoid Object]&lt;br /&gt;
&lt;br /&gt;
== Localization ==&lt;br /&gt;
It's possible to localize strings with the usual i18n(), i18nc(), i18np() global functions&lt;br /&gt;
&lt;br /&gt;
== Extra types ==&lt;br /&gt;
Some extra types are available from withing JavaScript, namely&lt;br /&gt;
&lt;br /&gt;
* KConfigGroup: it's an object with its config keys readable and writable as properties&lt;br /&gt;
* QIcon: can be constructed with QIcon(&amp;quot;fdo name&amp;quot;) such as QIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
* KJob&lt;br /&gt;
* Plasma Service api&lt;br /&gt;
&lt;br /&gt;
= Plasma specific imports =&lt;br /&gt;
To use some Plasma specific features and to take advantage of them in order for your applet to become a true Plasma applet, it is necessary to use some particular QML imports. See [http://techbase.kde.org/Development/Tutorials/Plasma/QML/API Plasma QML API].&lt;br /&gt;
&lt;br /&gt;
== Extra Qt features ==&lt;br /&gt;
org.kde.qtextraimports&lt;br /&gt;
To use, do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import org.kde.qtextracomponents 0.1 as QtExtraComponents&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* QPixmapItem&lt;br /&gt;
* QImageItem&lt;br /&gt;
* QIconItem&lt;br /&gt;
&lt;br /&gt;
== Plasma Widgets in QML ==&lt;br /&gt;
To use standard plasma widgets (e.g. Plasma::LineEdit, etc.), you simply add an import line for them.&lt;br /&gt;
All properties, signals and slots from ordinary Plasma widgets are available there.&lt;br /&gt;
'''These widgets are provided as a transition tool, intended to be replaced by the Plasma version of QtComponents''', which is currently in development by a gsoc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.graphicswidgets 0.1 as PlasmaWidgets&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 64&lt;br /&gt;
    height: 64&lt;br /&gt;
    PlasmaWidgets.IconWidget {&lt;br /&gt;
        id: icon&lt;br /&gt;
        Component.onCompleted: setIcon(&amp;quot;flag-red&amp;quot;)&lt;br /&gt;
        anchors.centerIn: parent&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted</id>
		<title>Development/Tutorials/Plasma/QML/GettingStarted</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted"/>
				<updated>2011-08-19T00:58:05Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* Extra types */ gram&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Writing a plasma applet in QML is very easy, in fact, with KDE 4.6 and Qt 4.7 it just works.&lt;br /&gt;
&lt;br /&gt;
== QML Basics ==&lt;br /&gt;
&lt;br /&gt;
It is recommended that you have read through the [http://doc.qt.nokia.com/4.7/qtquick.html Qt QML Tutorials], as there are quite a few and they are explained thoroughly. There is also a list of all [http://doc.qt.nokia.com/4.7/qdeclarativeelements.html standard QML elements].&lt;br /&gt;
&lt;br /&gt;
Essentially, most of the content is the same. The exceptions to be noted are how data is gathered...since we use Data Engines, it is a bit different. Text color and font should be made to use PlasmaCore.Theme.&lt;br /&gt;
&lt;br /&gt;
See the [https://projects.kde.org/projects/kde/kdeexamples/repository KDE Examples] repository for more KDE-related helpful resources. Also of use (which use QML and Plasma) are: [https://projects.kde.org/projects/playground/base/plasma-mobile/repository Plasma Mobile], [https://projects.kde.org/projects/playground/base/declarative-plasmoids/repository Declarative Plasmoids (playground)], for WIP ports of C++ originals&lt;br /&gt;
&lt;br /&gt;
=== Root Item ===&lt;br /&gt;
&lt;br /&gt;
The root item can be anything that inherits QGraphicsItem. For example, in this case it is QGraphicsWidget which is a plasmoid. It can also simply be an Item. I also noticed that PathView does not respond to mouse inputs automatically (so flicking doesn't work). Probably because events are being intercepted. So take note, it'll have to be e.g. an Item, for that case.&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
&lt;br /&gt;
==== Row and Column ====&lt;br /&gt;
&lt;br /&gt;
==== Anchors ====&lt;br /&gt;
Anchor layouts offer a nice way of grouping UI elements nicely together. The idea is that you connect edges or corners of one element to the edge or corner of another widget.&lt;br /&gt;
Some examples:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 200&lt;br /&gt;
    height: 300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Text {&lt;br /&gt;
        id: first&lt;br /&gt;
        text: i18n(&amp;quot;1st line&amp;quot;)&lt;br /&gt;
        anchors { top: parent.top;&lt;br /&gt;
                  left: parent.left;&lt;br /&gt;
                  right: parent.right;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    Text {&lt;br /&gt;
        id: second&lt;br /&gt;
        text: i18n(&amp;quot;2nd line&amp;quot;)&lt;br /&gt;
        anchors { top: first.bottom;&lt;br /&gt;
                  left: parent.left;&lt;br /&gt;
                  right: parent.right;&lt;br /&gt;
                  bottom: parent.bottom;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Buttons ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Animations ===&lt;br /&gt;
&lt;br /&gt;
== Package Structure ==&lt;br /&gt;
&lt;br /&gt;
You create a .desktop file and the .qml file. They have to be in the usual plasma package structure.&lt;br /&gt;
&lt;br /&gt;
plasmoid-qml/metadata.desktop&lt;br /&gt;
plasmoid-qml/contents/ui/main.qml&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;metadata.desktop&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Name=Hello QML&lt;br /&gt;
Comment=A hello world widget in QML&lt;br /&gt;
Icon=chronometer&lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
X-Plasma-MainScript=ui/main.qml&lt;br /&gt;
X-Plasma-DefaultSize=200,100&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Author=Frederik Gladhorn&lt;br /&gt;
X-KDE-PluginInfo-Email=gladhorn@kde.org&lt;br /&gt;
X-KDE-PluginInfo-Website=http://plasma.kde.org/&lt;br /&gt;
X-KDE-PluginInfo-Category=Examples&lt;br /&gt;
X-KDE-PluginInfo-Name=org.kde.hello-qml&lt;br /&gt;
X-KDE-PluginInfo-Version=0.0&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Depends=&lt;br /&gt;
X-KDE-PluginInfo-License=GPL&lt;br /&gt;
X-KDE-PluginInfo-EnabledByDefault=true&lt;br /&gt;
X-KDE-ServiceTypes=Plasma/Applet&lt;br /&gt;
Type=Service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  &amp;lt;tt&amp;gt;main.qml&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing ==&lt;br /&gt;
You can install your plasmoid:&lt;br /&gt;
plasmapkg --install plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
== plasmoidviewer ==&lt;br /&gt;
You can run it in plasmoidviewer as usual:&lt;br /&gt;
plasmoidviewer plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
== qmlviewer ==&lt;br /&gt;
It's possible to use Plasma specific imports in qml files loaded by qmlviewer:&lt;br /&gt;
&lt;br /&gt;
qmlviewer -I /usr/lib/kde4/imports/ plasmoid-qml/contents/qml/main.qml &lt;br /&gt;
&lt;br /&gt;
Where the -I is the path to the plasma plugin for qml. Try to look for the path of &lt;br /&gt;
/usr/lib/kde4/imports/org/kde/plasma/graphicswidgets/libgraphicswidgetsbindingsplugin.so&lt;br /&gt;
and use everything up to org of that path.&lt;br /&gt;
&lt;br /&gt;
Hovewer it's '''strongly discouraged''' to use qmlviewer to develop plasmoids, because some features won't be available there:&lt;br /&gt;
* localization with i18n()&lt;br /&gt;
* access to the global ''plasmoid'' object&lt;br /&gt;
* device specific qml files imported with plasmapackage:// urls&lt;br /&gt;
* bindings for qicons, KJobs, services and KConfig&lt;br /&gt;
&lt;br /&gt;
= Features only available in Plasma widgets =&lt;br /&gt;
In order to have a better integration with the KDE platform and to reach an higher degree of expressivity, the stock features of QML have been expanded with the following features, that strictly follow the Plasmoid JavaScript API:&lt;br /&gt;
&lt;br /&gt;
== Minimum size ==&lt;br /&gt;
if the root object of the plasmoid has the properties minimumWidth and minimumHeight, they will be used as the minimum size for the plasmoid. If they will change during the plasmoid execution, the plasmoid minimum size will be updated accordingly.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    property int minimumWidth: paintedWidth&lt;br /&gt;
    property int minimumHeight: paintedHeight&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above example, the minimum size is binded to the paintedWidth/paintedHeight properties of the Text element, ensuring there will always be enough room for the whole text to be displayed.&lt;br /&gt;
&lt;br /&gt;
== Plasmoid object ==&lt;br /&gt;
Every QML plasmoid will have an object called ''plasmoid'', that will give access to the configuration, the formfactor, immutability and so on. It offers the same api as the object with the same name in the Javascript API.&lt;br /&gt;
&lt;br /&gt;
For specific info on this, see [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API-PlasmoidObject Javascript API-Plasmoid Object]&lt;br /&gt;
&lt;br /&gt;
== Localization ==&lt;br /&gt;
It's possible to localize strings with the usual i18n(), i18nc(), i18np() global functions&lt;br /&gt;
&lt;br /&gt;
== Extra types ==&lt;br /&gt;
Some extra types are available from withing JavaScript, namely&lt;br /&gt;
&lt;br /&gt;
* KConfigGroup: it's an object with its config keys readable and writable as properties&lt;br /&gt;
* QIcon: can be constructed with QIcon(&amp;quot;fdo name&amp;quot;) such as QIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
* KJob&lt;br /&gt;
* Plasma Service api&lt;br /&gt;
&lt;br /&gt;
= Plasma specific imports =&lt;br /&gt;
To use some Plasma specific features and to take advantage of them in order for your applet to become a true Plasma applet, it is necessary to use some particular QML imports. See [http://techbase.kde.org/Development/Tutorials/Plasma/QML/API Plasma QML API].&lt;br /&gt;
&lt;br /&gt;
== Extra Qt features ==&lt;br /&gt;
org.kde.qtextraimports&lt;br /&gt;
To use, do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import org.kde.qtextracomponents 0.1 as QtExtraComponents&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* QPixmapItem&lt;br /&gt;
* QImageItem&lt;br /&gt;
* QIconItem&lt;br /&gt;
&lt;br /&gt;
== Plasma Widgets in QML ==&lt;br /&gt;
To use standard plasma widgets (e.g. Plasma::LineEdit, etc.), you simply add an import line for them.&lt;br /&gt;
All properties, signals and slots from ordinary Plasma widgets are available there.&lt;br /&gt;
'''These widgets are provided as a transition tool, intended to be replaced by the Plasma version of QtComponents''', which is currently in development by a gsoc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.graphicswidgets 0.1 as PlasmaWidgets&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 64&lt;br /&gt;
    height: 64&lt;br /&gt;
    PlasmaWidgets.IconWidget {&lt;br /&gt;
        id: icon&lt;br /&gt;
        Component.onCompleted: setIcon(&amp;quot;flag-red&amp;quot;)&lt;br /&gt;
        anchors.centerIn: parent&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/API</id>
		<title>Development/Tutorials/Plasma/QML/API</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/API"/>
				<updated>2011-08-19T00:57:31Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* Properties */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction to the Plasmoid QML Declarative API  =&lt;br /&gt;
&lt;br /&gt;
This document provides an overview/reference of the Declarative QML API for Plasmoids. It isn't a full binding to all of Qt or KDE's libraries, but a focused set of bindings designed to make writing Plasmoids fast and easy, while remaining powerful.&lt;br /&gt;
&lt;br /&gt;
The API in this documentation covers the API of the Plasma specific QML components, so only the Declarative part of the API.&lt;br /&gt;
&lt;br /&gt;
The QML ScriptEngine is bassed upon the Plasma JavaScript engine, making the API of the JavaScript part identical to the one of the JavaScript plasmoids engine.&lt;br /&gt;
To see the api of the global ''Plasmoid'' object, see the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#The_Global_plasmoid_Object JavaScript API] documentation.&lt;br /&gt;
(TODO: the JavaScript api paged should probably be copied and stripped down the imperative bits not present there, it would make harder to update tough)&lt;br /&gt;
&lt;br /&gt;
== What Is a Declarative Plasmoid?  ==&lt;br /&gt;
&lt;br /&gt;
To denote that this Plasmoid is a Declarative widget, ensure that in the metadata.desktop file there is this line: &lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
&lt;br /&gt;
What follows is a description of the Plasma declarative classes instantiable from QML.&lt;br /&gt;
&lt;br /&gt;
= Main Plasma QML Classes =&lt;br /&gt;
&lt;br /&gt;
== Data Engines ==&lt;br /&gt;
While it's possible to fetch data from a Plasma DataEngine in the same way as the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#DataEngine JavaScript API], however it is preferrable to use the following declarative classes:&lt;br /&gt;
&lt;br /&gt;
=== DataSource ===&lt;br /&gt;
DataSource is a receiver for a dataEngine and can be declared inside QML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
 PlasmaCore.DataSource {&lt;br /&gt;
     id: dataSource&lt;br /&gt;
     engine: &amp;quot;time&amp;quot;&lt;br /&gt;
     connectedSources: [&amp;quot;Local&amp;quot;]&lt;br /&gt;
     interval: 500&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Properties ====&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* bool '''valid''' (read only): true when the DataSource is successfully connected to a data engine&lt;br /&gt;
* int '''interval''': interval of polling of the dataengine, if 0 (default value, so no need to specify if you don't need it) no polling will be executed&lt;br /&gt;
* string '''engine''': the plugin name of the dataengine to load, e.g. &amp;quot;nowplaying&amp;quot;, etc.&lt;br /&gt;
* Array(string) '''connectedSources''': all the sources of the dataengine we are connected to (and whose data will appear in the '''data''' property)&lt;br /&gt;
* Array(string) '''sources''' (read only): all the sources available from the dataengine&lt;br /&gt;
* variant map '''data''' (read only): It's the most important property, it's a map of all the data available from the dataengine: its structure will be as follows:&lt;br /&gt;
** each key of the map will be a source name, in '''connectedSources'''&lt;br /&gt;
** each value will be a variant hash, so an hash with strings as keys and any variant as value&lt;br /&gt;
** example: dataSource.data[&amp;quot;Local&amp;quot;][&amp;quot;Time&amp;quot;] indicates the '''Time''' key of the dataengine source called &amp;quot;Local&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Signals ====&lt;br /&gt;
It has the following signals:&lt;br /&gt;
&lt;br /&gt;
Note that javascript/qml applies the 'on' prefix to signals. So the actual signal name in C++ which is e.g. '''newData''(...) becomes '''onNewData'''(...).&lt;br /&gt;
&lt;br /&gt;
* '''onNewData'''(String sourceName, Plasma::DataEngine::Data data)&lt;br /&gt;
* '''onSourceAdded'''(String source)&lt;br /&gt;
* '''onSourceRemoved'''(String source)&lt;br /&gt;
* '''onSourceConnected'''(String source)&lt;br /&gt;
* '''onSourceDisconnected'''(String source)&lt;br /&gt;
* '''onIntervalChanged'''()&lt;br /&gt;
* '''onEngineChanged'''()&lt;br /&gt;
* '''onDataChanged'''()&lt;br /&gt;
* '''onConnectedSourcesChanged'''()&lt;br /&gt;
* '''onSourcesChanged'''()&lt;br /&gt;
&lt;br /&gt;
==== Methods ====&lt;br /&gt;
It has the following methods:&lt;br /&gt;
* StringList keysForSource(String source): lists all the keys corresponding to a certain source: for instance in the &amp;quot;time&amp;quot; dataengine, for the &amp;quot;Local&amp;quot; source, keys will be:&lt;br /&gt;
** &amp;quot;Timezone Continent&amp;quot;&lt;br /&gt;
** &amp;quot;Offset&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone&amp;quot;&lt;br /&gt;
** &amp;quot;Time&amp;quot;&lt;br /&gt;
** &amp;quot;Date&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone City&amp;quot;&lt;br /&gt;
* Service serviceForSource(String source): returns a Plasma service that corresponds a given source: see the section about services for how to use it.&lt;br /&gt;
* void connectSource(String source): adds to '''connectedSources''' the new source&lt;br /&gt;
* void disconnectSource(String source): removes that source from '''connectedSources'''&lt;br /&gt;
&lt;br /&gt;
=== Service ===&lt;br /&gt;
Due to their imperative nature, Plasma Services are not instantiated as QML classes, but rather created out of a '''DataSource''' with the method '''serviceForSource''' and used in the JavaScript portions of the QML files.&lt;br /&gt;
This following example is a simplified version from the Now Playing QML widget in the kdeexamples git repository: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var service = dataSource.serviceForSource(activeSource)&lt;br /&gt;
  var operation = service.operationDescription(&amp;quot;seek&amp;quot;)&lt;br /&gt;
  operation.seconds = 10&lt;br /&gt;
&lt;br /&gt;
  var job = service.startOperationCall(operation)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Here dataSource is the id of a DataSource object, and activeSource is a source contained in one of its '''connectedSources'''.&lt;br /&gt;
The service provides an operation called &amp;quot;seek&amp;quot;, with a parameter called &amp;quot;seconds&amp;quot;, that can be written on it as a property of a JavaScript object.&lt;br /&gt;
&lt;br /&gt;
=== ServiceJob ===&lt;br /&gt;
If is necessary to monitor the result of a Service operation, it's possible to connect to the '''finished''' signal provided by the job return paramenter of the '''startOperationCall''' service method.&lt;br /&gt;
The '''finished''' signal has the same job as parameter, from which is possible to check the variant '''result''' property, to check the result.&lt;br /&gt;
&lt;br /&gt;
=== DataModel ===&lt;br /&gt;
Some data engines return as their data something that can be interpreted as a list of items, rather than simple key/value pairs.&lt;br /&gt;
QML provides some item views such as '''ListView''', '''GridView''' and '''Repeater'''.&lt;br /&gt;
The '''DataModel''' QML object can provide, based on a DataSource a model suitable for those QML item views.&lt;br /&gt;
&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* DataSource '''dataSource''': the id of an existing (and connected) DataSource&lt;br /&gt;
* String '''sourceFilter''': it's a regular expression. If the DataSource is connected to more than one source, only inserts data from sources matching this filter expression in the model. To, for example, have a source watch all sources beginning with say &amp;quot;name:&amp;quot;, the required regexp would be sourceFilter: &amp;quot;name:.*&amp;quot;&lt;br /&gt;
* String '''keyRoleFilter''': it's a regular expression. Only data with keys that match this filter expression will be inserted in the model&lt;br /&gt;
* int '''count''' (read only): how many items are in the model&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 ListView {&lt;br /&gt;
   model: PlasmaCore.DataModel {&lt;br /&gt;
        dataSource: microblogSource&lt;br /&gt;
        keyRoleFilter: &amp;quot;[\\d]*&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    delegate: Text {&lt;br /&gt;
        text: title&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the example, ''microblogSource'' is the id of a DataSource, and inserts in the model only entries that have a number as the key name (matched with [\\d]*, in this case tweets ids)&lt;br /&gt;
&lt;br /&gt;
Each item in the model will have the form of a variant hash: all the keys of the hash will be registered as model role names, in the example, &amp;quot;title&amp;quot; is a role of the model containing a string (also reachable with model[&amp;quot;title&amp;quot;]).&lt;br /&gt;
&lt;br /&gt;
A special reserved role will always be present: '''&amp;quot;DataEngineSource&amp;quot;''': it will contain the name of the data engine source that gave origin to this item. Therefore, if you want merely the string of the current source that the model is at...do model[&amp;quot;DataEngineSource&amp;quot;].&lt;br /&gt;
&lt;br /&gt;
Note that view.currentItem holds the item currently selected. However, due to (http://bugreports.qt.nokia.com/browse/QTBUG-16347) this does not work in PathView. A workaround is to make your own.&lt;br /&gt;
&lt;br /&gt;
=== SortFilterModel ===&lt;br /&gt;
SortFilterModel is a proxy model for easy sorting and/or filtering of the items in a DataModel (or any other QAbstractItemModel subclass that has been registered in QML with setContextProperty from a C++ application)&lt;br /&gt;
Properties:&lt;br /&gt;
* model '''sourceModel'''&lt;br /&gt;
* String '''filterRegExp'''&lt;br /&gt;
* String '''filterRole'''&lt;br /&gt;
* String '''sortRole'''&lt;br /&gt;
* Qt::SortOrder '''sortOrder'''&lt;br /&gt;
* int '''count''' (read only)&lt;br /&gt;
&lt;br /&gt;
== Popup Applet ==&lt;br /&gt;
So you want your QML applet to be a popup applet, like the device notifier (an icon in the panel shows and expands the applet)?&lt;br /&gt;
&lt;br /&gt;
Why, that's easy.&lt;br /&gt;
&lt;br /&gt;
To change your plasmoid from being a regular boring one, in your '''metadata.desktop''', simply change this following line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
ServiceTypes=Plasma/Applet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
ServiceTypes=Plasma/Applet,Plasma/PopupApplet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then in the main QML item's Component.onCompleted, do:&lt;br /&gt;
&lt;br /&gt;
NOTE: the below code presently has no affect, yet the icons seems to get retrieved from the desktop file (FIXME - is this needed? It has no affect presently).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    plasmoid.popupIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Plasma Themes ==&lt;br /&gt;
&lt;br /&gt;
=== Theme ===&lt;br /&gt;
This class instantiable from QML provides access to the Plasma Theme colors and other facilities such as fonts.&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* String '''themeName''' (read only)&lt;br /&gt;
* QFont '''font''' (read only)&lt;br /&gt;
* bool '''windowTranslucentEnabled''' (read only)&lt;br /&gt;
* Url '''homepage''' (read only)&lt;br /&gt;
* bool '''useGlobalSettings''' (read only)&lt;br /&gt;
* QString '''wallpaperPath''' (read only)&lt;br /&gt;
* color '''textColor''' (read only)&lt;br /&gt;
* color '''highlightColor''' (read only)&lt;br /&gt;
* color '''backgroundColor''' (read only)&lt;br /&gt;
* color '''buttonTextColor''' (read only)&lt;br /&gt;
* color '''buttonBackgroundColor''' (read only)&lt;br /&gt;
* color '''linkColor''' (read only)&lt;br /&gt;
* color '''visitedLinkColor''' (read only)&lt;br /&gt;
* color '''visitedLinkColor''' (read only)&lt;br /&gt;
* color '''buttonHoverColor''' (read only)&lt;br /&gt;
* color '''buttonFocusColor''' (read only)&lt;br /&gt;
* color '''viewTextColor''' (read only)&lt;br /&gt;
* color '''viewBackgroundColor''' (read only)&lt;br /&gt;
* color '''viewHoverColor''' (read only)&lt;br /&gt;
* color '''viewFocusColor''' (read only)&lt;br /&gt;
* String '''styleSheet''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== Svg ===&lt;br /&gt;
Declaring a Svg element instantiates a Plasma Svg instance. This class doesn't draw anything. For drawing, SvgItem is used.&lt;br /&gt;
Properties:&lt;br /&gt;
* QSize '''size'''&lt;br /&gt;
* bool '''multipleImages'''&lt;br /&gt;
* String '''imagePath''' can be anything in the '''desktoptheme/''' folder. For more information on what is available, see [http://techbase.kde.org/Projects/Plasma/Theme#Current_Theme_Elements Plasma Theme Elements]&lt;br /&gt;
* bool '''usingRenderingCache'''&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPixmap pixmap(QString elementID)&lt;br /&gt;
* void resize(qreal width, qreal height)&lt;br /&gt;
* void resize(): resets the image to its default dimension&lt;br /&gt;
* QSize elementSize(QString elementId)&lt;br /&gt;
* QRectF elementRect(QString elementId)&lt;br /&gt;
* bool hasElement(QString elementId)&lt;br /&gt;
* bool isValid(): true if valid svg file&lt;br /&gt;
&lt;br /&gt;
Sample Code:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    PlasmaCore.Svg {&lt;br /&gt;
        id: mySvg&lt;br /&gt;
        imagePath: &amp;quot;widgets/line&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SvgItem ===&lt;br /&gt;
It's a graphical element that will actually paint a Svg instance.&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''elementId''': what element to render. If null, the whole svg will be rendered&lt;br /&gt;
* Svg '''svg''': instance of the Svg class mentioned above&lt;br /&gt;
* QSizeF '''naturalSize''' (read only): default size of the Svg&lt;br /&gt;
* bool '''smooth''': paint with antialias (default false)&lt;br /&gt;
&lt;br /&gt;
Sample Code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    PlasmaCore.SvgItem {&lt;br /&gt;
        id: mySvgItem&lt;br /&gt;
        anchors {&lt;br /&gt;
            top: parent.top&lt;br /&gt;
            left: parent.left&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        width: 300&lt;br /&gt;
        height: 3&lt;br /&gt;
&lt;br /&gt;
        svg: mySvg&lt;br /&gt;
        elementId: &amp;quot;horizontal-line&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FrameSvgItem ===&lt;br /&gt;
It's a graphical element that paints a Plasma::FrameSvg, so a rectangular image composed by 9 elements contained in a Svg file, useful for things like buttons and frames.&lt;br /&gt;
&lt;br /&gt;
Flags&lt;br /&gt;
* EnabledBorders: combination of TopBorder | BottomBorder | LeftBorder | RightBorder, NoBorder if no border of the frame is enabled&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''imagePath''': path of the file relative to the Plasma Theme, for instance &amp;quot;widgets/background&amp;quot;&lt;br /&gt;
* String '''prefix''': a FrameSvg can contain multiple frames, for instance a button contains &amp;quot;normal&amp;quot;, &amp;quot;raised&amp;quot; and &amp;quot;pressed&amp;quot;&lt;br /&gt;
* Margins '''margins''' (read only): the margins of the frame, see documentation below&lt;br /&gt;
* EnabledBorders '''enabledBorders''': what borders are enabled&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
Sample Code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
PlasmaCore.FrameSvgItem {&lt;br /&gt;
    id: myFrameSvgItem&lt;br /&gt;
    anchors.fill: parent&lt;br /&gt;
    imagePath: &amp;quot;translucent/dialogs/background&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Top Level windows ==&lt;br /&gt;
&lt;br /&gt;
=== Dialog ===&lt;br /&gt;
Dialog instantiates a Plasma::Dialog, it will be a Plasma themed top level window that can contain any QML component.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item mainItem: the Item contained in the Dialog, it can be any QML Item instance&lt;br /&gt;
* bool '''visible''': if the window (not the mainItem) is visible&lt;br /&gt;
* int '''x''': x position of the window in screen coordinates&lt;br /&gt;
* int '''y''': y position of the window in screen coordinates&lt;br /&gt;
* int '''width''' (read only): total width of the dialog, including margins&lt;br /&gt;
* int '''height''' (read only): total height of the dialog, including margins&lt;br /&gt;
* int '''windowFlags''': Qt window flags of the Dialog&lt;br /&gt;
* Margins '''margins''' (read only): margins of the Dialog&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPoint popupPosition(Item item, Qt::Alignment alignment=Qt::AlignLeft): the suggested position for the Dialog if it has to be correctly placed as popup of the QML item passed as parameter.&lt;br /&gt;
* void setAttribute(Qt::WindowAttribute attribute, bool on): set an attribute for the dialog window&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== ToolTip ===&lt;br /&gt;
Declaring a ToolTip instance makes it possible to use Plasma tooltips with any QML item.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item '''target''': the QML item we want to show a tooltip of&lt;br /&gt;
* String '''mainText'''&lt;br /&gt;
* String '''subText'''&lt;br /&gt;
* String '''image''': freedesktop compliant icon name as image of the tooltip&lt;br /&gt;
&lt;br /&gt;
= Plasma QtComponents (4.8) =&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/API</id>
		<title>Development/Tutorials/Plasma/QML/API</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/API"/>
				<updated>2011-08-19T00:54:56Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* Properties */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction to the Plasmoid QML Declarative API  =&lt;br /&gt;
&lt;br /&gt;
This document provides an overview/reference of the Declarative QML API for Plasmoids. It isn't a full binding to all of Qt or KDE's libraries, but a focused set of bindings designed to make writing Plasmoids fast and easy, while remaining powerful.&lt;br /&gt;
&lt;br /&gt;
The API in this documentation covers the API of the Plasma specific QML components, so only the Declarative part of the API.&lt;br /&gt;
&lt;br /&gt;
The QML ScriptEngine is bassed upon the Plasma JavaScript engine, making the API of the JavaScript part identical to the one of the JavaScript plasmoids engine.&lt;br /&gt;
To see the api of the global ''Plasmoid'' object, see the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#The_Global_plasmoid_Object JavaScript API] documentation.&lt;br /&gt;
(TODO: the JavaScript api paged should probably be copied and stripped down the imperative bits not present there, it would make harder to update tough)&lt;br /&gt;
&lt;br /&gt;
== What Is a Declarative Plasmoid?  ==&lt;br /&gt;
&lt;br /&gt;
To denote that this Plasmoid is a Declarative widget, ensure that in the metadata.desktop file there is this line: &lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
&lt;br /&gt;
What follows is a description of the Plasma declarative classes instantiable from QML.&lt;br /&gt;
&lt;br /&gt;
= Main Plasma QML Classes =&lt;br /&gt;
&lt;br /&gt;
== Data Engines ==&lt;br /&gt;
While it's possible to fetch data from a Plasma DataEngine in the same way as the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#DataEngine JavaScript API], however it is preferrable to use the following declarative classes:&lt;br /&gt;
&lt;br /&gt;
=== DataSource ===&lt;br /&gt;
DataSource is a receiver for a dataEngine and can be declared inside QML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
 PlasmaCore.DataSource {&lt;br /&gt;
     id: dataSource&lt;br /&gt;
     engine: &amp;quot;time&amp;quot;&lt;br /&gt;
     connectedSources: [&amp;quot;Local&amp;quot;]&lt;br /&gt;
     interval: 500&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Properties ====&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* bool '''valid''' (read only): true when the DataSource is successfully connected to a data engine&lt;br /&gt;
* int '''interval''': interval of polling of the dataengine, if 0 (default value, so no need to specify if you don't need it) no polling will be executed&lt;br /&gt;
* string '''engine''': the plugin name of the dataengine to load&lt;br /&gt;
* Array(string) '''connectedSources''': all the sources of the dataengine we are connected to (and whose data will appear in the '''data''' property)&lt;br /&gt;
* Array(string) '''sources''' (read only): all the sources available from the dataengine&lt;br /&gt;
* variant map '''data''' (read only): It's the most important property, it's a map of all the data available from the dataengine: its structure will be as follows:&lt;br /&gt;
** each key of the map will be a source name, in '''connectedSources'''&lt;br /&gt;
** each value will be a variant hash, so an hash with strings as keys and any variant as value&lt;br /&gt;
** example: dataSource.data[&amp;quot;Local&amp;quot;][&amp;quot;Time&amp;quot;] indicates the '''Time''' key of the dataengine source called &amp;quot;Local&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Signals ====&lt;br /&gt;
It has the following signals:&lt;br /&gt;
&lt;br /&gt;
Note that javascript/qml applies the 'on' prefix to signals. So the actual signal name in C++ which is e.g. '''newData''(...) becomes '''onNewData'''(...).&lt;br /&gt;
&lt;br /&gt;
* '''onNewData'''(String sourceName, Plasma::DataEngine::Data data)&lt;br /&gt;
* '''onSourceAdded'''(String source)&lt;br /&gt;
* '''onSourceRemoved'''(String source)&lt;br /&gt;
* '''onSourceConnected'''(String source)&lt;br /&gt;
* '''onSourceDisconnected'''(String source)&lt;br /&gt;
* '''onIntervalChanged'''()&lt;br /&gt;
* '''onEngineChanged'''()&lt;br /&gt;
* '''onDataChanged'''()&lt;br /&gt;
* '''onConnectedSourcesChanged'''()&lt;br /&gt;
* '''onSourcesChanged'''()&lt;br /&gt;
&lt;br /&gt;
==== Methods ====&lt;br /&gt;
It has the following methods:&lt;br /&gt;
* StringList keysForSource(String source): lists all the keys corresponding to a certain source: for instance in the &amp;quot;time&amp;quot; dataengine, for the &amp;quot;Local&amp;quot; source, keys will be:&lt;br /&gt;
** &amp;quot;Timezone Continent&amp;quot;&lt;br /&gt;
** &amp;quot;Offset&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone&amp;quot;&lt;br /&gt;
** &amp;quot;Time&amp;quot;&lt;br /&gt;
** &amp;quot;Date&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone City&amp;quot;&lt;br /&gt;
* Service serviceForSource(String source): returns a Plasma service that corresponds a given source: see the section about services for how to use it.&lt;br /&gt;
* void connectSource(String source): adds to '''connectedSources''' the new source&lt;br /&gt;
* void disconnectSource(String source): removes that source from '''connectedSources'''&lt;br /&gt;
&lt;br /&gt;
=== Service ===&lt;br /&gt;
Due to their imperative nature, Plasma Services are not instantiated as QML classes, but rather created out of a '''DataSource''' with the method '''serviceForSource''' and used in the JavaScript portions of the QML files.&lt;br /&gt;
This following example is a simplified version from the Now Playing QML widget in the kdeexamples git repository: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var service = dataSource.serviceForSource(activeSource)&lt;br /&gt;
  var operation = service.operationDescription(&amp;quot;seek&amp;quot;)&lt;br /&gt;
  operation.seconds = 10&lt;br /&gt;
&lt;br /&gt;
  var job = service.startOperationCall(operation)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Here dataSource is the id of a DataSource object, and activeSource is a source contained in one of its '''connectedSources'''.&lt;br /&gt;
The service provides an operation called &amp;quot;seek&amp;quot;, with a parameter called &amp;quot;seconds&amp;quot;, that can be written on it as a property of a JavaScript object.&lt;br /&gt;
&lt;br /&gt;
=== ServiceJob ===&lt;br /&gt;
If is necessary to monitor the result of a Service operation, it's possible to connect to the '''finished''' signal provided by the job return paramenter of the '''startOperationCall''' service method.&lt;br /&gt;
The '''finished''' signal has the same job as parameter, from which is possible to check the variant '''result''' property, to check the result.&lt;br /&gt;
&lt;br /&gt;
=== DataModel ===&lt;br /&gt;
Some data engines return as their data something that can be interpreted as a list of items, rather than simple key/value pairs.&lt;br /&gt;
QML provides some item views such as '''ListView''', '''GridView''' and '''Repeater'''.&lt;br /&gt;
The '''DataModel''' QML object can provide, based on a DataSource a model suitable for those QML item views.&lt;br /&gt;
&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* DataSource '''dataSource''': the id of an existing (and connected) DataSource&lt;br /&gt;
* String '''sourceFilter''': it's a regular expression. If the DataSource is connected to more than one source, only inserts data from sources matching this filter expression in the model. To, for example, have a source watch all sources beginning with say &amp;quot;name:&amp;quot;, the required regexp would be sourceFilter: &amp;quot;name:.*&amp;quot;&lt;br /&gt;
* String '''keyRoleFilter''': it's a regular expression. Only data with keys that match this filter expression will be inserted in the model&lt;br /&gt;
* int '''count''' (read only): how many items are in the model&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 ListView {&lt;br /&gt;
   model: PlasmaCore.DataModel {&lt;br /&gt;
        dataSource: microblogSource&lt;br /&gt;
        keyRoleFilter: &amp;quot;[\\d]*&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    delegate: Text {&lt;br /&gt;
        text: title&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the example, ''microblogSource'' is the id of a DataSource, and inserts in the model only entries that have a number as the key name (matched with [\\d]*, in this case tweets ids)&lt;br /&gt;
&lt;br /&gt;
Each item in the model will have the form of a variant hash: all the keys of the hash will be registered as model role names, in the example, &amp;quot;title&amp;quot; is a role of the model containing a string (also reachable with model[&amp;quot;title&amp;quot;]).&lt;br /&gt;
&lt;br /&gt;
A special reserved role will always be present: '''&amp;quot;DataEngineSource&amp;quot;''': it will contain the name of the data engine source that gave origin to this item. Therefore, if you want merely the string of the current source that the model is at...do model[&amp;quot;DataEngineSource&amp;quot;].&lt;br /&gt;
&lt;br /&gt;
Note that view.currentItem holds the item currently selected. However, due to (http://bugreports.qt.nokia.com/browse/QTBUG-16347) this does not work in PathView. A workaround is to make your own.&lt;br /&gt;
&lt;br /&gt;
=== SortFilterModel ===&lt;br /&gt;
SortFilterModel is a proxy model for easy sorting and/or filtering of the items in a DataModel (or any other QAbstractItemModel subclass that has been registered in QML with setContextProperty from a C++ application)&lt;br /&gt;
Properties:&lt;br /&gt;
* model '''sourceModel'''&lt;br /&gt;
* String '''filterRegExp'''&lt;br /&gt;
* String '''filterRole'''&lt;br /&gt;
* String '''sortRole'''&lt;br /&gt;
* Qt::SortOrder '''sortOrder'''&lt;br /&gt;
* int '''count''' (read only)&lt;br /&gt;
&lt;br /&gt;
== Popup Applet ==&lt;br /&gt;
So you want your QML applet to be a popup applet, like the device notifier (an icon in the panel shows and expands the applet)?&lt;br /&gt;
&lt;br /&gt;
Why, that's easy.&lt;br /&gt;
&lt;br /&gt;
To change your plasmoid from being a regular boring one, in your '''metadata.desktop''', simply change this following line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
ServiceTypes=Plasma/Applet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
ServiceTypes=Plasma/Applet,Plasma/PopupApplet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then in the main QML item's Component.onCompleted, do:&lt;br /&gt;
&lt;br /&gt;
NOTE: the below code presently has no affect, yet the icons seems to get retrieved from the desktop file (FIXME - is this needed? It has no affect presently).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    plasmoid.popupIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Plasma Themes ==&lt;br /&gt;
&lt;br /&gt;
=== Theme ===&lt;br /&gt;
This class instantiable from QML provides access to the Plasma Theme colors and other facilities such as fonts.&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* String '''themeName''' (read only)&lt;br /&gt;
* QFont '''font''' (read only)&lt;br /&gt;
* bool '''windowTranslucentEnabled''' (read only)&lt;br /&gt;
* Url '''homepage''' (read only)&lt;br /&gt;
* bool '''useGlobalSettings''' (read only)&lt;br /&gt;
* QString '''wallpaperPath''' (read only)&lt;br /&gt;
* color '''textColor''' (read only)&lt;br /&gt;
* color '''highlightColor''' (read only)&lt;br /&gt;
* color '''backgroundColor''' (read only)&lt;br /&gt;
* color '''buttonTextColor''' (read only)&lt;br /&gt;
* color '''buttonBackgroundColor''' (read only)&lt;br /&gt;
* color '''linkColor''' (read only)&lt;br /&gt;
* color '''visitedLinkColor''' (read only)&lt;br /&gt;
* color '''visitedLinkColor''' (read only)&lt;br /&gt;
* color '''buttonHoverColor''' (read only)&lt;br /&gt;
* color '''buttonFocusColor''' (read only)&lt;br /&gt;
* color '''viewTextColor''' (read only)&lt;br /&gt;
* color '''viewBackgroundColor''' (read only)&lt;br /&gt;
* color '''viewHoverColor''' (read only)&lt;br /&gt;
* color '''viewFocusColor''' (read only)&lt;br /&gt;
* String '''styleSheet''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== Svg ===&lt;br /&gt;
Declaring a Svg element instantiates a Plasma Svg instance. This class doesn't draw anything. For drawing, SvgItem is used.&lt;br /&gt;
Properties:&lt;br /&gt;
* QSize '''size'''&lt;br /&gt;
* bool '''multipleImages'''&lt;br /&gt;
* String '''imagePath''' can be anything in the '''desktoptheme/''' folder. For more information on what is available, see [http://techbase.kde.org/Projects/Plasma/Theme#Current_Theme_Elements Plasma Theme Elements]&lt;br /&gt;
* bool '''usingRenderingCache'''&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPixmap pixmap(QString elementID)&lt;br /&gt;
* void resize(qreal width, qreal height)&lt;br /&gt;
* void resize(): resets the image to its default dimension&lt;br /&gt;
* QSize elementSize(QString elementId)&lt;br /&gt;
* QRectF elementRect(QString elementId)&lt;br /&gt;
* bool hasElement(QString elementId)&lt;br /&gt;
* bool isValid(): true if valid svg file&lt;br /&gt;
&lt;br /&gt;
Sample Code:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    PlasmaCore.Svg {&lt;br /&gt;
        id: mySvg&lt;br /&gt;
        imagePath: &amp;quot;widgets/line&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SvgItem ===&lt;br /&gt;
It's a graphical element that will actually paint a Svg instance.&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''elementId''': what element to render. If null, the whole svg will be rendered&lt;br /&gt;
* Svg '''svg''': instance of the Svg class mentioned above&lt;br /&gt;
* QSizeF '''naturalSize''' (read only): default size of the Svg&lt;br /&gt;
* bool '''smooth''': paint with antialias (default false)&lt;br /&gt;
&lt;br /&gt;
Sample Code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    PlasmaCore.SvgItem {&lt;br /&gt;
        id: mySvgItem&lt;br /&gt;
        anchors {&lt;br /&gt;
            top: parent.top&lt;br /&gt;
            left: parent.left&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        width: 300&lt;br /&gt;
        height: 3&lt;br /&gt;
&lt;br /&gt;
        svg: mySvg&lt;br /&gt;
        elementId: &amp;quot;horizontal-line&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FrameSvgItem ===&lt;br /&gt;
It's a graphical element that paints a Plasma::FrameSvg, so a rectangular image composed by 9 elements contained in a Svg file, useful for things like buttons and frames.&lt;br /&gt;
&lt;br /&gt;
Flags&lt;br /&gt;
* EnabledBorders: combination of TopBorder | BottomBorder | LeftBorder | RightBorder, NoBorder if no border of the frame is enabled&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''imagePath''': path of the file relative to the Plasma Theme, for instance &amp;quot;widgets/background&amp;quot;&lt;br /&gt;
* String '''prefix''': a FrameSvg can contain multiple frames, for instance a button contains &amp;quot;normal&amp;quot;, &amp;quot;raised&amp;quot; and &amp;quot;pressed&amp;quot;&lt;br /&gt;
* Margins '''margins''' (read only): the margins of the frame, see documentation below&lt;br /&gt;
* EnabledBorders '''enabledBorders''': what borders are enabled&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
Sample Code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
PlasmaCore.FrameSvgItem {&lt;br /&gt;
    id: myFrameSvgItem&lt;br /&gt;
    anchors.fill: parent&lt;br /&gt;
    imagePath: &amp;quot;translucent/dialogs/background&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Top Level windows ==&lt;br /&gt;
&lt;br /&gt;
=== Dialog ===&lt;br /&gt;
Dialog instantiates a Plasma::Dialog, it will be a Plasma themed top level window that can contain any QML component.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item mainItem: the Item contained in the Dialog, it can be any QML Item instance&lt;br /&gt;
* bool '''visible''': if the window (not the mainItem) is visible&lt;br /&gt;
* int '''x''': x position of the window in screen coordinates&lt;br /&gt;
* int '''y''': y position of the window in screen coordinates&lt;br /&gt;
* int '''width''' (read only): total width of the dialog, including margins&lt;br /&gt;
* int '''height''' (read only): total height of the dialog, including margins&lt;br /&gt;
* int '''windowFlags''': Qt window flags of the Dialog&lt;br /&gt;
* Margins '''margins''' (read only): margins of the Dialog&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPoint popupPosition(Item item, Qt::Alignment alignment=Qt::AlignLeft): the suggested position for the Dialog if it has to be correctly placed as popup of the QML item passed as parameter.&lt;br /&gt;
* void setAttribute(Qt::WindowAttribute attribute, bool on): set an attribute for the dialog window&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== ToolTip ===&lt;br /&gt;
Declaring a ToolTip instance makes it possible to use Plasma tooltips with any QML item.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item '''target''': the QML item we want to show a tooltip of&lt;br /&gt;
* String '''mainText'''&lt;br /&gt;
* String '''subText'''&lt;br /&gt;
* String '''image''': freedesktop compliant icon name as image of the tooltip&lt;br /&gt;
&lt;br /&gt;
= Plasma QtComponents (4.8) =&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/API</id>
		<title>Development/Tutorials/Plasma/QML/API</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/API"/>
				<updated>2011-08-19T00:53:41Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* Main QML classes */ rename header&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction to the Plasmoid QML Declarative API  =&lt;br /&gt;
&lt;br /&gt;
This document provides an overview/reference of the Declarative QML API for Plasmoids. It isn't a full binding to all of Qt or KDE's libraries, but a focused set of bindings designed to make writing Plasmoids fast and easy, while remaining powerful.&lt;br /&gt;
&lt;br /&gt;
The API in this documentation covers the API of the Plasma specific QML components, so only the Declarative part of the API.&lt;br /&gt;
&lt;br /&gt;
The QML ScriptEngine is bassed upon the Plasma JavaScript engine, making the API of the JavaScript part identical to the one of the JavaScript plasmoids engine.&lt;br /&gt;
To see the api of the global ''Plasmoid'' object, see the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#The_Global_plasmoid_Object JavaScript API] documentation.&lt;br /&gt;
(TODO: the JavaScript api paged should probably be copied and stripped down the imperative bits not present there, it would make harder to update tough)&lt;br /&gt;
&lt;br /&gt;
== What Is a Declarative Plasmoid?  ==&lt;br /&gt;
&lt;br /&gt;
To denote that this Plasmoid is a Declarative widget, ensure that in the metadata.desktop file there is this line: &lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
&lt;br /&gt;
What follows is a description of the Plasma declarative classes instantiable from QML.&lt;br /&gt;
&lt;br /&gt;
= Main Plasma QML Classes =&lt;br /&gt;
&lt;br /&gt;
== Data Engines ==&lt;br /&gt;
While it's possible to fetch data from a Plasma DataEngine in the same way as the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#DataEngine JavaScript API], however it is preferrable to use the following declarative classes:&lt;br /&gt;
&lt;br /&gt;
=== DataSource ===&lt;br /&gt;
DataSource is a receiver for a dataEngine and can be declared inside QML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
 PlasmaCore.DataSource {&lt;br /&gt;
     id: dataSource&lt;br /&gt;
     engine: &amp;quot;time&amp;quot;&lt;br /&gt;
     connectedSources: [&amp;quot;Local&amp;quot;]&lt;br /&gt;
     interval: 500&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Properties ====&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* bool '''valid''' (read only): true when the DataSource is successfully connected to a data engine&lt;br /&gt;
* int '''interval''': interval of polling of the dataengine, if 0 (default value) no polling will be executed&lt;br /&gt;
* string '''engine''': the plugin name of the dataengine to load&lt;br /&gt;
* Array(string) '''connectedSources''': all the sources of the dataengine we are connected to (and whose data will appear in the '''data''' property)&lt;br /&gt;
* Array(string) '''sources''' (read only): all the sources available from the dataengine&lt;br /&gt;
* variant map '''data''' (read only): It's the most important property, it's a map of all the data available from the dataengine: its structure will be as follows:&lt;br /&gt;
** each key of the map will be a source name, in '''connectedSources'''&lt;br /&gt;
** each value will be a variant hash, so an hash with strings as keys and any variant as value&lt;br /&gt;
** example: dataSource.data[&amp;quot;Local&amp;quot;][&amp;quot;Time&amp;quot;] indicates the '''Time''' key of the dataengine source called &amp;quot;Local&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Signals ====&lt;br /&gt;
It has the following signals:&lt;br /&gt;
&lt;br /&gt;
Note that javascript/qml applies the 'on' prefix to signals. So the actual signal name in C++ which is e.g. '''newData''(...) becomes '''onNewData'''(...).&lt;br /&gt;
&lt;br /&gt;
* '''onNewData'''(String sourceName, Plasma::DataEngine::Data data)&lt;br /&gt;
* '''onSourceAdded'''(String source)&lt;br /&gt;
* '''onSourceRemoved'''(String source)&lt;br /&gt;
* '''onSourceConnected'''(String source)&lt;br /&gt;
* '''onSourceDisconnected'''(String source)&lt;br /&gt;
* '''onIntervalChanged'''()&lt;br /&gt;
* '''onEngineChanged'''()&lt;br /&gt;
* '''onDataChanged'''()&lt;br /&gt;
* '''onConnectedSourcesChanged'''()&lt;br /&gt;
* '''onSourcesChanged'''()&lt;br /&gt;
&lt;br /&gt;
==== Methods ====&lt;br /&gt;
It has the following methods:&lt;br /&gt;
* StringList keysForSource(String source): lists all the keys corresponding to a certain source: for instance in the &amp;quot;time&amp;quot; dataengine, for the &amp;quot;Local&amp;quot; source, keys will be:&lt;br /&gt;
** &amp;quot;Timezone Continent&amp;quot;&lt;br /&gt;
** &amp;quot;Offset&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone&amp;quot;&lt;br /&gt;
** &amp;quot;Time&amp;quot;&lt;br /&gt;
** &amp;quot;Date&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone City&amp;quot;&lt;br /&gt;
* Service serviceForSource(String source): returns a Plasma service that corresponds a given source: see the section about services for how to use it.&lt;br /&gt;
* void connectSource(String source): adds to '''connectedSources''' the new source&lt;br /&gt;
* void disconnectSource(String source): removes that source from '''connectedSources'''&lt;br /&gt;
&lt;br /&gt;
=== Service ===&lt;br /&gt;
Due to their imperative nature, Plasma Services are not instantiated as QML classes, but rather created out of a '''DataSource''' with the method '''serviceForSource''' and used in the JavaScript portions of the QML files.&lt;br /&gt;
This following example is a simplified version from the Now Playing QML widget in the kdeexamples git repository: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var service = dataSource.serviceForSource(activeSource)&lt;br /&gt;
  var operation = service.operationDescription(&amp;quot;seek&amp;quot;)&lt;br /&gt;
  operation.seconds = 10&lt;br /&gt;
&lt;br /&gt;
  var job = service.startOperationCall(operation)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Here dataSource is the id of a DataSource object, and activeSource is a source contained in one of its '''connectedSources'''.&lt;br /&gt;
The service provides an operation called &amp;quot;seek&amp;quot;, with a parameter called &amp;quot;seconds&amp;quot;, that can be written on it as a property of a JavaScript object.&lt;br /&gt;
&lt;br /&gt;
=== ServiceJob ===&lt;br /&gt;
If is necessary to monitor the result of a Service operation, it's possible to connect to the '''finished''' signal provided by the job return paramenter of the '''startOperationCall''' service method.&lt;br /&gt;
The '''finished''' signal has the same job as parameter, from which is possible to check the variant '''result''' property, to check the result.&lt;br /&gt;
&lt;br /&gt;
=== DataModel ===&lt;br /&gt;
Some data engines return as their data something that can be interpreted as a list of items, rather than simple key/value pairs.&lt;br /&gt;
QML provides some item views such as '''ListView''', '''GridView''' and '''Repeater'''.&lt;br /&gt;
The '''DataModel''' QML object can provide, based on a DataSource a model suitable for those QML item views.&lt;br /&gt;
&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* DataSource '''dataSource''': the id of an existing (and connected) DataSource&lt;br /&gt;
* String '''sourceFilter''': it's a regular expression. If the DataSource is connected to more than one source, only inserts data from sources matching this filter expression in the model. To, for example, have a source watch all sources beginning with say &amp;quot;name:&amp;quot;, the required regexp would be sourceFilter: &amp;quot;name:.*&amp;quot;&lt;br /&gt;
* String '''keyRoleFilter''': it's a regular expression. Only data with keys that match this filter expression will be inserted in the model&lt;br /&gt;
* int '''count''' (read only): how many items are in the model&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 ListView {&lt;br /&gt;
   model: PlasmaCore.DataModel {&lt;br /&gt;
        dataSource: microblogSource&lt;br /&gt;
        keyRoleFilter: &amp;quot;[\\d]*&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    delegate: Text {&lt;br /&gt;
        text: title&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the example, ''microblogSource'' is the id of a DataSource, and inserts in the model only entries that have a number as the key name (matched with [\\d]*, in this case tweets ids)&lt;br /&gt;
&lt;br /&gt;
Each item in the model will have the form of a variant hash: all the keys of the hash will be registered as model role names, in the example, &amp;quot;title&amp;quot; is a role of the model containing a string (also reachable with model[&amp;quot;title&amp;quot;]).&lt;br /&gt;
&lt;br /&gt;
A special reserved role will always be present: '''&amp;quot;DataEngineSource&amp;quot;''': it will contain the name of the data engine source that gave origin to this item. Therefore, if you want merely the string of the current source that the model is at...do model[&amp;quot;DataEngineSource&amp;quot;].&lt;br /&gt;
&lt;br /&gt;
Note that view.currentItem holds the item currently selected. However, due to (http://bugreports.qt.nokia.com/browse/QTBUG-16347) this does not work in PathView. A workaround is to make your own.&lt;br /&gt;
&lt;br /&gt;
=== SortFilterModel ===&lt;br /&gt;
SortFilterModel is a proxy model for easy sorting and/or filtering of the items in a DataModel (or any other QAbstractItemModel subclass that has been registered in QML with setContextProperty from a C++ application)&lt;br /&gt;
Properties:&lt;br /&gt;
* model '''sourceModel'''&lt;br /&gt;
* String '''filterRegExp'''&lt;br /&gt;
* String '''filterRole'''&lt;br /&gt;
* String '''sortRole'''&lt;br /&gt;
* Qt::SortOrder '''sortOrder'''&lt;br /&gt;
* int '''count''' (read only)&lt;br /&gt;
&lt;br /&gt;
== Popup Applet ==&lt;br /&gt;
So you want your QML applet to be a popup applet, like the device notifier (an icon in the panel shows and expands the applet)?&lt;br /&gt;
&lt;br /&gt;
Why, that's easy.&lt;br /&gt;
&lt;br /&gt;
To change your plasmoid from being a regular boring one, in your '''metadata.desktop''', simply change this following line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
ServiceTypes=Plasma/Applet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
ServiceTypes=Plasma/Applet,Plasma/PopupApplet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then in the main QML item's Component.onCompleted, do:&lt;br /&gt;
&lt;br /&gt;
NOTE: the below code presently has no affect, yet the icons seems to get retrieved from the desktop file (FIXME - is this needed? It has no affect presently).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    plasmoid.popupIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Plasma Themes ==&lt;br /&gt;
&lt;br /&gt;
=== Theme ===&lt;br /&gt;
This class instantiable from QML provides access to the Plasma Theme colors and other facilities such as fonts.&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* String '''themeName''' (read only)&lt;br /&gt;
* QFont '''font''' (read only)&lt;br /&gt;
* bool '''windowTranslucentEnabled''' (read only)&lt;br /&gt;
* Url '''homepage''' (read only)&lt;br /&gt;
* bool '''useGlobalSettings''' (read only)&lt;br /&gt;
* QString '''wallpaperPath''' (read only)&lt;br /&gt;
* color '''textColor''' (read only)&lt;br /&gt;
* color '''highlightColor''' (read only)&lt;br /&gt;
* color '''backgroundColor''' (read only)&lt;br /&gt;
* color '''buttonTextColor''' (read only)&lt;br /&gt;
* color '''buttonBackgroundColor''' (read only)&lt;br /&gt;
* color '''linkColor''' (read only)&lt;br /&gt;
* color '''visitedLinkColor''' (read only)&lt;br /&gt;
* color '''visitedLinkColor''' (read only)&lt;br /&gt;
* color '''buttonHoverColor''' (read only)&lt;br /&gt;
* color '''buttonFocusColor''' (read only)&lt;br /&gt;
* color '''viewTextColor''' (read only)&lt;br /&gt;
* color '''viewBackgroundColor''' (read only)&lt;br /&gt;
* color '''viewHoverColor''' (read only)&lt;br /&gt;
* color '''viewFocusColor''' (read only)&lt;br /&gt;
* String '''styleSheet''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== Svg ===&lt;br /&gt;
Declaring a Svg element instantiates a Plasma Svg instance. This class doesn't draw anything. For drawing, SvgItem is used.&lt;br /&gt;
Properties:&lt;br /&gt;
* QSize '''size'''&lt;br /&gt;
* bool '''multipleImages'''&lt;br /&gt;
* String '''imagePath''' can be anything in the '''desktoptheme/''' folder. For more information on what is available, see [http://techbase.kde.org/Projects/Plasma/Theme#Current_Theme_Elements Plasma Theme Elements]&lt;br /&gt;
* bool '''usingRenderingCache'''&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPixmap pixmap(QString elementID)&lt;br /&gt;
* void resize(qreal width, qreal height)&lt;br /&gt;
* void resize(): resets the image to its default dimension&lt;br /&gt;
* QSize elementSize(QString elementId)&lt;br /&gt;
* QRectF elementRect(QString elementId)&lt;br /&gt;
* bool hasElement(QString elementId)&lt;br /&gt;
* bool isValid(): true if valid svg file&lt;br /&gt;
&lt;br /&gt;
Sample Code:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    PlasmaCore.Svg {&lt;br /&gt;
        id: mySvg&lt;br /&gt;
        imagePath: &amp;quot;widgets/line&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SvgItem ===&lt;br /&gt;
It's a graphical element that will actually paint a Svg instance.&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''elementId''': what element to render. If null, the whole svg will be rendered&lt;br /&gt;
* Svg '''svg''': instance of the Svg class mentioned above&lt;br /&gt;
* QSizeF '''naturalSize''' (read only): default size of the Svg&lt;br /&gt;
* bool '''smooth''': paint with antialias (default false)&lt;br /&gt;
&lt;br /&gt;
Sample Code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    PlasmaCore.SvgItem {&lt;br /&gt;
        id: mySvgItem&lt;br /&gt;
        anchors {&lt;br /&gt;
            top: parent.top&lt;br /&gt;
            left: parent.left&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        width: 300&lt;br /&gt;
        height: 3&lt;br /&gt;
&lt;br /&gt;
        svg: mySvg&lt;br /&gt;
        elementId: &amp;quot;horizontal-line&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FrameSvgItem ===&lt;br /&gt;
It's a graphical element that paints a Plasma::FrameSvg, so a rectangular image composed by 9 elements contained in a Svg file, useful for things like buttons and frames.&lt;br /&gt;
&lt;br /&gt;
Flags&lt;br /&gt;
* EnabledBorders: combination of TopBorder | BottomBorder | LeftBorder | RightBorder, NoBorder if no border of the frame is enabled&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''imagePath''': path of the file relative to the Plasma Theme, for instance &amp;quot;widgets/background&amp;quot;&lt;br /&gt;
* String '''prefix''': a FrameSvg can contain multiple frames, for instance a button contains &amp;quot;normal&amp;quot;, &amp;quot;raised&amp;quot; and &amp;quot;pressed&amp;quot;&lt;br /&gt;
* Margins '''margins''' (read only): the margins of the frame, see documentation below&lt;br /&gt;
* EnabledBorders '''enabledBorders''': what borders are enabled&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
Sample Code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
PlasmaCore.FrameSvgItem {&lt;br /&gt;
    id: myFrameSvgItem&lt;br /&gt;
    anchors.fill: parent&lt;br /&gt;
    imagePath: &amp;quot;translucent/dialogs/background&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Top Level windows ==&lt;br /&gt;
&lt;br /&gt;
=== Dialog ===&lt;br /&gt;
Dialog instantiates a Plasma::Dialog, it will be a Plasma themed top level window that can contain any QML component.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item mainItem: the Item contained in the Dialog, it can be any QML Item instance&lt;br /&gt;
* bool '''visible''': if the window (not the mainItem) is visible&lt;br /&gt;
* int '''x''': x position of the window in screen coordinates&lt;br /&gt;
* int '''y''': y position of the window in screen coordinates&lt;br /&gt;
* int '''width''' (read only): total width of the dialog, including margins&lt;br /&gt;
* int '''height''' (read only): total height of the dialog, including margins&lt;br /&gt;
* int '''windowFlags''': Qt window flags of the Dialog&lt;br /&gt;
* Margins '''margins''' (read only): margins of the Dialog&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPoint popupPosition(Item item, Qt::Alignment alignment=Qt::AlignLeft): the suggested position for the Dialog if it has to be correctly placed as popup of the QML item passed as parameter.&lt;br /&gt;
* void setAttribute(Qt::WindowAttribute attribute, bool on): set an attribute for the dialog window&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== ToolTip ===&lt;br /&gt;
Declaring a ToolTip instance makes it possible to use Plasma tooltips with any QML item.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item '''target''': the QML item we want to show a tooltip of&lt;br /&gt;
* String '''mainText'''&lt;br /&gt;
* String '''subText'''&lt;br /&gt;
* String '''image''': freedesktop compliant icon name as image of the tooltip&lt;br /&gt;
&lt;br /&gt;
= Plasma QtComponents (4.8) =&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma</id>
		<title>Development/Tutorials/Plasma</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma"/>
				<updated>2011-08-19T00:46:23Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* Plasma and Creating QML Plasmoids */ gram&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Plasma}}&lt;br /&gt;
&lt;br /&gt;
== Plasma and Creating QML Plasmoids ==&lt;br /&gt;
Plasmoids that use the QML (aka QtQuick) declarative language to describe their user interface while having the logic of the applet, in JavaScript (QML is essentially a forge between CSS and JavaScript). &lt;br /&gt;
&lt;br /&gt;
This is now the '''recommended''' method of creating plasmoids, where possible. The plasmoid, or applet serves as the visualization for the data which a Plasma::DataEngine contains.&lt;br /&gt;
&lt;br /&gt;
It allows easily the declaring of an interface and to easily create things like ListViews with native Plasma theming. It is what Plasma is leaning the most towards, especially in the Mobile, MediaCenter and KDM shells.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/QML/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in QML''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/QML/API|API Reference]]&lt;br /&gt;
:''The QML Plasmoid API. Useful for referencing what is available in the runtime, what are the differences with the pure JavaScript ScriptEngine, the differences between pure Qt QML and Plasma, and as a study aid for the tutorials above.''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with C++ ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/GettingStarted|Getting Started With Plasmoids]]&lt;br /&gt;
:''Creating your first plasmoid in C++ with SVG background, icon and text''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/GettingStarted..Some_More|Getting Started With Plasmoids..Some more]] :''A few more starter's tips.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/DataEngines|Writing a DataEngine]]&lt;br /&gt;
:''DataEngines provide a standardized interface to various (read only) data sources for visualizations to use. Learn what a DataEngine is and how to write one of your own.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Services|Writing a Service]]&lt;br /&gt;
:''Services provide a standardized interface for visualizations to perform &amp;quot;write operations&amp;quot;. This can be for example, uploading pasted test to a pastebin service..''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PackageStructure|Writing a PackageStructure Plugin]]&lt;br /&gt;
:''PackageStructure plugins allow custom Packages to be defined, installed, removed and listed as well as provide access their contents at runtime. Packages may contain any kind of data addons, including scripts.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/UsingExtenders|How to use extenders in your Plasmoid]]&lt;br /&gt;
:''A simple example that shows how to use extenders in a Plasmoid.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/AbstractRunner|Creating Runners]]&lt;br /&gt;
:''Runners are plugins that provide action-based search functionality in the Plasma workspace &amp;quot;run command&amp;quot; dialog. These plugins can be used by any application that links again libplasma.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/WallpaperHelloWorld|Wallpaper Tutorial 1]]&lt;br /&gt;
:''This tutorial shows you how to make a simple Hello World plasma wallpaper plugin.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/WallpaperConfiguration|Wallpaper Tutorial 2]]&lt;br /&gt;
:''This tutorial covers how to add configuration options to the wallpaper.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ShellDesign|Creating a Plasma Shell]]&lt;br /&gt;
:''This tutorial covers the essentials of writing a new Plasma shell from scratch. A must-read for anyone creating a new or modifying an existing Plasma Shell. Existing Plasma shells include Plasma Desktop, Plasma Netbook, Plasma Mobile, Plasma Media Center, Plasma Screensaver, Plasma KPart and Plasma KDM, and all follow the patterns documented here.''&lt;br /&gt;
&lt;br /&gt;
;[http://www.linux-magazine.com/w3/issue/114/036-040_plasma.pdf Creating Plasmoids]&lt;br /&gt;
:''May 2010 article from Linux Magazine''&lt;br /&gt;
&lt;br /&gt;
;[http://www.ibm.com/developerworks/linux/library/l-kde-plasmoids/index.html Create Plasmoids using KDevelop]&lt;br /&gt;
:''Article explaining the structure of Plasma and how to create a Plasmoid''&lt;br /&gt;
&lt;br /&gt;
;[http://community.kde.org/User:Mxttie#Adding_configuration Adding configuration to your plasmoid]&lt;br /&gt;
:''Article explaining how to add a configuration dialog to your plasmoid.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ApplicationShell|Integrate Plasma in Applications]]&lt;br /&gt;
:''This tutorial shows you how to make an application dashboard based on Plasma technologies.''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with JavaScript ==&lt;br /&gt;
&lt;br /&gt;
Plasma has built-in JavaScript (also known as ECMAScript, and often referred to as QtScript in the context of Qt) scripting support without requiring any external dependencies.&lt;br /&gt;
&lt;br /&gt;
=== Plasmoids ===&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in JavaScript''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/DataEngine|Getting Data]]&lt;br /&gt;
:''How to retreive data from a data engine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/NowPlaying|Now Playing]]&lt;br /&gt;
:''Slightly more advanced data engine usage: displaying what's currently playing''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/SystemMonitor|System Monitor]]&lt;br /&gt;
:''How to access systemmonitor data engine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/CheatSheet|Cheat Sheet]]&lt;br /&gt;
:''A cheat sheet, rather than a tutorial, of things to remember and watch out for when developing JavaScript plasmoids''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/API|API Reference]]&lt;br /&gt;
:''The Simplified JavaScript Plasmoid API. Useful for referencing what is available in the runtime and as a study aid for the tutorials above.''&lt;br /&gt;
&lt;br /&gt;
=== Other Applications Of Javascript ===&lt;br /&gt;
;[[KDE_System_Administration/PlasmaDestkopScripting|Scripting Plasma Shells]]&lt;br /&gt;
:The KDE Plasma Desktop and Netbook provide means to manage the desktop shell (desktop, panels, widget) via scripts written in JavaScript. This article describes how to take advantage of this feature set as well as documents the full API. This is primarily a system administration tool, but may also be of interest to power users.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/Animations|Javascript Animations]]&lt;br /&gt;
:''How to write Animations using Javascript for use in Plasma applications''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ComicPlugin|Creating Comic Plugins]]&lt;br /&gt;
:''This guide shows you how to create a comic plugin for the comic plasmoid.''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Python ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Python''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Using DataEngines|Using DataEngines]]&lt;br /&gt;
:''How to use DataEngines from a plasmoid''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Writing DataEngines|Writing DataEngines]]&lt;br /&gt;
:''How to write your own Plasma DataEngine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonPlasmoid|Writing a Plasmoid in Python]]&lt;br /&gt;
:''Writing a simple battery graph in python''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonRunner|Writing a KRunner plugin in Python]]&lt;br /&gt;
:''Writing a simple krunner plugin in python''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Ruby ==&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Ruby''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/SimplePasteApplet|Writing a simple paste applet]]&lt;br /&gt;
:''A tutorial explaining how to set up a plasmoid, create a simple paste applet using widgets and add Plasma features seen elsewhere. Complete with tips for those who have never programmed before.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Writing DataEngines|Writing DataEngines]]&lt;br /&gt;
:''How to write your own Plasma DataEngine using Ruby''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Blinker|Use SVG artwork in the simplest way possible]]&lt;br /&gt;
:''Follow a fellow student as he asks around about SVG usage and explains why the code examples work. This is a wiki so feel free to add your own insights until this tutorial can be considered complete.''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Web Technologies (HTML/JS/CSS etc) ==&lt;br /&gt;
;[[Development/Tutorials/Plasma/Web/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in HTML''&lt;br /&gt;
&lt;br /&gt;
== Plasma integration ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Solid_Device_Actions|Creating a Device Notifier action]]&lt;br /&gt;
:''When your application is interested in removable hardware''&lt;br /&gt;
&lt;br /&gt;
== Theme development ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Theme|Creating a Plasma Theme Quickstart]]&lt;br /&gt;
:''A quick guide to creating your first Plasma theme''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ThemeDetails|The Plasma Theme Structure In Detail]]&lt;br /&gt;
:''A comprehensive guide to the contents of a Plasma SVG theme, including configuration options, wallpapers, on-disk layout, names of all standard SVG files and every element in them.''&lt;br /&gt;
&lt;br /&gt;
== Activity Template development ==&lt;br /&gt;
&lt;br /&gt;
;[[KDE_System_Administration/PlasmaDesktopScripting#Activity_templates|Creating a Plasma Activity Template Quickstart]]&lt;br /&gt;
:''A quick guide to creating your first Plasma Activity Template''&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
* [[Projects/Plasma|Projects: Plasma]]&lt;br /&gt;
* [http://api.kde.org/4.x-api/kdelibs-apidocs/plasma/html/index.html Plasma api documentation]&lt;br /&gt;
* [http://techbase.kde.org/Projects/Plasma/Eclipse_Integration Plasma Eclipse Integration]&lt;br /&gt;
* The [https://mail.kde.org/mailman/listinfo/plasma-devel plasma-devel mailing list] and #plasma on IRC (irc.freenode.org).&lt;br /&gt;
&lt;br /&gt;
== Presentation Slides==&lt;br /&gt;
http://chani.wordpress.com/2009/04/25/quick-update-for-my-presentation/ Victory Calendar -- also link to websvn plasma playground in the odp file.&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma</id>
		<title>Development/Tutorials/Plasma</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma"/>
				<updated>2011-08-19T00:45:41Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: better summary&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Plasma}}&lt;br /&gt;
&lt;br /&gt;
== Plasma and Creating QML Plasmoids ==&lt;br /&gt;
Plasmoids that use the QML (aka QtQuick) declarative language to describe their user interface while having the logic of the applet, in JavaScript (QML is essentially a forge between CSS and JavaScript). &lt;br /&gt;
&lt;br /&gt;
This is now the '''recommended''' method of creating plasmoids, where possible. The plasmoid, or applet serves as the visualization for the data which a Plasma::DataEngine contains.&lt;br /&gt;
&lt;br /&gt;
It allows easily the declaring of an interface and to easily create things like ListViews with native Plasma theming. It what Plasma is leaning the most towards, especially in the Mobile, MediaCenter and KDM shells.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/QML/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in QML''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/QML/API|API Reference]]&lt;br /&gt;
:''The QML Plasmoid API. Useful for referencing what is available in the runtime, what are the differences with the pure JavaScript ScriptEngine, the differences between pure Qt QML and Plasma, and as a study aid for the tutorials above.''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with C++ ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/GettingStarted|Getting Started With Plasmoids]]&lt;br /&gt;
:''Creating your first plasmoid in C++ with SVG background, icon and text''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/GettingStarted..Some_More|Getting Started With Plasmoids..Some more]] :''A few more starter's tips.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/DataEngines|Writing a DataEngine]]&lt;br /&gt;
:''DataEngines provide a standardized interface to various (read only) data sources for visualizations to use. Learn what a DataEngine is and how to write one of your own.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Services|Writing a Service]]&lt;br /&gt;
:''Services provide a standardized interface for visualizations to perform &amp;quot;write operations&amp;quot;. This can be for example, uploading pasted test to a pastebin service..''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PackageStructure|Writing a PackageStructure Plugin]]&lt;br /&gt;
:''PackageStructure plugins allow custom Packages to be defined, installed, removed and listed as well as provide access their contents at runtime. Packages may contain any kind of data addons, including scripts.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/UsingExtenders|How to use extenders in your Plasmoid]]&lt;br /&gt;
:''A simple example that shows how to use extenders in a Plasmoid.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/AbstractRunner|Creating Runners]]&lt;br /&gt;
:''Runners are plugins that provide action-based search functionality in the Plasma workspace &amp;quot;run command&amp;quot; dialog. These plugins can be used by any application that links again libplasma.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/WallpaperHelloWorld|Wallpaper Tutorial 1]]&lt;br /&gt;
:''This tutorial shows you how to make a simple Hello World plasma wallpaper plugin.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/WallpaperConfiguration|Wallpaper Tutorial 2]]&lt;br /&gt;
:''This tutorial covers how to add configuration options to the wallpaper.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ShellDesign|Creating a Plasma Shell]]&lt;br /&gt;
:''This tutorial covers the essentials of writing a new Plasma shell from scratch. A must-read for anyone creating a new or modifying an existing Plasma Shell. Existing Plasma shells include Plasma Desktop, Plasma Netbook, Plasma Mobile, Plasma Media Center, Plasma Screensaver, Plasma KPart and Plasma KDM, and all follow the patterns documented here.''&lt;br /&gt;
&lt;br /&gt;
;[http://www.linux-magazine.com/w3/issue/114/036-040_plasma.pdf Creating Plasmoids]&lt;br /&gt;
:''May 2010 article from Linux Magazine''&lt;br /&gt;
&lt;br /&gt;
;[http://www.ibm.com/developerworks/linux/library/l-kde-plasmoids/index.html Create Plasmoids using KDevelop]&lt;br /&gt;
:''Article explaining the structure of Plasma and how to create a Plasmoid''&lt;br /&gt;
&lt;br /&gt;
;[http://community.kde.org/User:Mxttie#Adding_configuration Adding configuration to your plasmoid]&lt;br /&gt;
:''Article explaining how to add a configuration dialog to your plasmoid.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ApplicationShell|Integrate Plasma in Applications]]&lt;br /&gt;
:''This tutorial shows you how to make an application dashboard based on Plasma technologies.''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with JavaScript ==&lt;br /&gt;
&lt;br /&gt;
Plasma has built-in JavaScript (also known as ECMAScript, and often referred to as QtScript in the context of Qt) scripting support without requiring any external dependencies.&lt;br /&gt;
&lt;br /&gt;
=== Plasmoids ===&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in JavaScript''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/DataEngine|Getting Data]]&lt;br /&gt;
:''How to retreive data from a data engine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/NowPlaying|Now Playing]]&lt;br /&gt;
:''Slightly more advanced data engine usage: displaying what's currently playing''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/SystemMonitor|System Monitor]]&lt;br /&gt;
:''How to access systemmonitor data engine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/CheatSheet|Cheat Sheet]]&lt;br /&gt;
:''A cheat sheet, rather than a tutorial, of things to remember and watch out for when developing JavaScript plasmoids''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/API|API Reference]]&lt;br /&gt;
:''The Simplified JavaScript Plasmoid API. Useful for referencing what is available in the runtime and as a study aid for the tutorials above.''&lt;br /&gt;
&lt;br /&gt;
=== Other Applications Of Javascript ===&lt;br /&gt;
;[[KDE_System_Administration/PlasmaDestkopScripting|Scripting Plasma Shells]]&lt;br /&gt;
:The KDE Plasma Desktop and Netbook provide means to manage the desktop shell (desktop, panels, widget) via scripts written in JavaScript. This article describes how to take advantage of this feature set as well as documents the full API. This is primarily a system administration tool, but may also be of interest to power users.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/Animations|Javascript Animations]]&lt;br /&gt;
:''How to write Animations using Javascript for use in Plasma applications''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ComicPlugin|Creating Comic Plugins]]&lt;br /&gt;
:''This guide shows you how to create a comic plugin for the comic plasmoid.''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Python ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Python''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Using DataEngines|Using DataEngines]]&lt;br /&gt;
:''How to use DataEngines from a plasmoid''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Writing DataEngines|Writing DataEngines]]&lt;br /&gt;
:''How to write your own Plasma DataEngine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonPlasmoid|Writing a Plasmoid in Python]]&lt;br /&gt;
:''Writing a simple battery graph in python''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonRunner|Writing a KRunner plugin in Python]]&lt;br /&gt;
:''Writing a simple krunner plugin in python''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Ruby ==&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Ruby''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/SimplePasteApplet|Writing a simple paste applet]]&lt;br /&gt;
:''A tutorial explaining how to set up a plasmoid, create a simple paste applet using widgets and add Plasma features seen elsewhere. Complete with tips for those who have never programmed before.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Writing DataEngines|Writing DataEngines]]&lt;br /&gt;
:''How to write your own Plasma DataEngine using Ruby''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Blinker|Use SVG artwork in the simplest way possible]]&lt;br /&gt;
:''Follow a fellow student as he asks around about SVG usage and explains why the code examples work. This is a wiki so feel free to add your own insights until this tutorial can be considered complete.''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Web Technologies (HTML/JS/CSS etc) ==&lt;br /&gt;
;[[Development/Tutorials/Plasma/Web/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in HTML''&lt;br /&gt;
&lt;br /&gt;
== Plasma integration ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Solid_Device_Actions|Creating a Device Notifier action]]&lt;br /&gt;
:''When your application is interested in removable hardware''&lt;br /&gt;
&lt;br /&gt;
== Theme development ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Theme|Creating a Plasma Theme Quickstart]]&lt;br /&gt;
:''A quick guide to creating your first Plasma theme''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ThemeDetails|The Plasma Theme Structure In Detail]]&lt;br /&gt;
:''A comprehensive guide to the contents of a Plasma SVG theme, including configuration options, wallpapers, on-disk layout, names of all standard SVG files and every element in them.''&lt;br /&gt;
&lt;br /&gt;
== Activity Template development ==&lt;br /&gt;
&lt;br /&gt;
;[[KDE_System_Administration/PlasmaDesktopScripting#Activity_templates|Creating a Plasma Activity Template Quickstart]]&lt;br /&gt;
:''A quick guide to creating your first Plasma Activity Template''&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
* [[Projects/Plasma|Projects: Plasma]]&lt;br /&gt;
* [http://api.kde.org/4.x-api/kdelibs-apidocs/plasma/html/index.html Plasma api documentation]&lt;br /&gt;
* [http://techbase.kde.org/Projects/Plasma/Eclipse_Integration Plasma Eclipse Integration]&lt;br /&gt;
* The [https://mail.kde.org/mailman/listinfo/plasma-devel plasma-devel mailing list] and #plasma on IRC (irc.freenode.org).&lt;br /&gt;
&lt;br /&gt;
== Presentation Slides==&lt;br /&gt;
http://chani.wordpress.com/2009/04/25/quick-update-for-my-presentation/ Victory Calendar -- also link to websvn plasma playground in the odp file.&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma</id>
		<title>Development/Tutorials/Plasma</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma"/>
				<updated>2011-08-19T00:42:02Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: reorder QML to be at the top. it's the most important yet it's at the bottom. I've seen too many people think that C++, or simply javascript is the best way/preferred to write Plasmoids&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Plasma}}&lt;br /&gt;
&lt;br /&gt;
== Plasma and Creating QML Plasmoids ==&lt;br /&gt;
It's possible to write Javascript Plasmoids that use the QML (aka QtQuick) declarative language to describe their user interface, while having the logic in JavaScript. This is now the '''recommended''' method of creating plasmoids, if possible. It allows easily the declaring of an interface. It is also what Plasma is leaning the most towards, especially in the Mobile, MediaCenter and KDM shells.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/QML/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in QML''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/QML/API|API Reference]]&lt;br /&gt;
:''The QML Plasmoid API. Useful for referencing what is available in the runtime, what are the differences with the pure JavaScript ScriptEngine, the differences between pure Qt QML and Plasma, and as a study aid for the tutorials above.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with C++ ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/GettingStarted|Getting Started With Plasmoids]]&lt;br /&gt;
:''Creating your first plasmoid in C++ with SVG background, icon and text''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/GettingStarted..Some_More|Getting Started With Plasmoids..Some more]] :''A few more starter's tips.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/DataEngines|Writing a DataEngine]]&lt;br /&gt;
:''DataEngines provide a standardized interface to various (read only) data sources for visualizations to use. Learn what a DataEngine is and how to write one of your own.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Services|Writing a Service]]&lt;br /&gt;
:''Services provide a standardized interface for visualizations to perform &amp;quot;write operations&amp;quot;. This can be for example, uploading pasted test to a pastebin service..''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PackageStructure|Writing a PackageStructure Plugin]]&lt;br /&gt;
:''PackageStructure plugins allow custom Packages to be defined, installed, removed and listed as well as provide access their contents at runtime. Packages may contain any kind of data addons, including scripts.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/UsingExtenders|How to use extenders in your Plasmoid]]&lt;br /&gt;
:''A simple example that shows how to use extenders in a Plasmoid.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/AbstractRunner|Creating Runners]]&lt;br /&gt;
:''Runners are plugins that provide action-based search functionality in the Plasma workspace &amp;quot;run command&amp;quot; dialog. These plugins can be used by any application that links again libplasma.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/WallpaperHelloWorld|Wallpaper Tutorial 1]]&lt;br /&gt;
:''This tutorial shows you how to make a simple Hello World plasma wallpaper plugin.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/WallpaperConfiguration|Wallpaper Tutorial 2]]&lt;br /&gt;
:''This tutorial covers how to add configuration options to the wallpaper.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ShellDesign|Creating a Plasma Shell]]&lt;br /&gt;
:''This tutorial covers the essentials of writing a new Plasma shell from scratch. A must-read for anyone creating a new or modifying an existing Plasma Shell. Existing Plasma shells include Plasma Desktop, Plasma Netbook, Plasma Mobile, Plasma Media Center, Plasma Screensaver, Plasma KPart and Plasma KDM, and all follow the patterns documented here.''&lt;br /&gt;
&lt;br /&gt;
;[http://www.linux-magazine.com/w3/issue/114/036-040_plasma.pdf Creating Plasmoids]&lt;br /&gt;
:''May 2010 article from Linux Magazine''&lt;br /&gt;
&lt;br /&gt;
;[http://www.ibm.com/developerworks/linux/library/l-kde-plasmoids/index.html Create Plasmoids using KDevelop]&lt;br /&gt;
:''Article explaining the structure of Plasma and how to create a Plasmoid''&lt;br /&gt;
&lt;br /&gt;
;[http://community.kde.org/User:Mxttie#Adding_configuration Adding configuration to your plasmoid]&lt;br /&gt;
:''Article explaining how to add a configuration dialog to your plasmoid.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ApplicationShell|Integrate Plasma in Applications]]&lt;br /&gt;
:''This tutorial shows you how to make an application dashboard based on Plasma technologies.''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with JavaScript ==&lt;br /&gt;
&lt;br /&gt;
Plasma has built-in JavaScript (also known as ECMAScript, and often referred to as QtScript in the context of Qt) scripting support without requiring any external dependencies.&lt;br /&gt;
&lt;br /&gt;
=== Plasmoids ===&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in JavaScript''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/DataEngine|Getting Data]]&lt;br /&gt;
:''How to retreive data from a data engine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/NowPlaying|Now Playing]]&lt;br /&gt;
:''Slightly more advanced data engine usage: displaying what's currently playing''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/SystemMonitor|System Monitor]]&lt;br /&gt;
:''How to access systemmonitor data engine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/CheatSheet|Cheat Sheet]]&lt;br /&gt;
:''A cheat sheet, rather than a tutorial, of things to remember and watch out for when developing JavaScript plasmoids''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/API|API Reference]]&lt;br /&gt;
:''The Simplified JavaScript Plasmoid API. Useful for referencing what is available in the runtime and as a study aid for the tutorials above.''&lt;br /&gt;
&lt;br /&gt;
=== Other Applications Of Javascript ===&lt;br /&gt;
;[[KDE_System_Administration/PlasmaDestkopScripting|Scripting Plasma Shells]]&lt;br /&gt;
:The KDE Plasma Desktop and Netbook provide means to manage the desktop shell (desktop, panels, widget) via scripts written in JavaScript. This article describes how to take advantage of this feature set as well as documents the full API. This is primarily a system administration tool, but may also be of interest to power users.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/Animations|Javascript Animations]]&lt;br /&gt;
:''How to write Animations using Javascript for use in Plasma applications''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ComicPlugin|Creating Comic Plugins]]&lt;br /&gt;
:''This guide shows you how to create a comic plugin for the comic plasmoid.''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Python ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Python''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Using DataEngines|Using DataEngines]]&lt;br /&gt;
:''How to use DataEngines from a plasmoid''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Writing DataEngines|Writing DataEngines]]&lt;br /&gt;
:''How to write your own Plasma DataEngine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonPlasmoid|Writing a Plasmoid in Python]]&lt;br /&gt;
:''Writing a simple battery graph in python''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonRunner|Writing a KRunner plugin in Python]]&lt;br /&gt;
:''Writing a simple krunner plugin in python''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Ruby ==&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Ruby''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/SimplePasteApplet|Writing a simple paste applet]]&lt;br /&gt;
:''A tutorial explaining how to set up a plasmoid, create a simple paste applet using widgets and add Plasma features seen elsewhere. Complete with tips for those who have never programmed before.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Writing DataEngines|Writing DataEngines]]&lt;br /&gt;
:''How to write your own Plasma DataEngine using Ruby''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Blinker|Use SVG artwork in the simplest way possible]]&lt;br /&gt;
:''Follow a fellow student as he asks around about SVG usage and explains why the code examples work. This is a wiki so feel free to add your own insights until this tutorial can be considered complete.''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Web Technologies (HTML/JS/CSS etc) ==&lt;br /&gt;
;[[Development/Tutorials/Plasma/Web/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in HTML''&lt;br /&gt;
&lt;br /&gt;
== Plasma integration ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Solid_Device_Actions|Creating a Device Notifier action]]&lt;br /&gt;
:''When your application is interested in removable hardware''&lt;br /&gt;
&lt;br /&gt;
== Theme development ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Theme|Creating a Plasma Theme Quickstart]]&lt;br /&gt;
:''A quick guide to creating your first Plasma theme''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ThemeDetails|The Plasma Theme Structure In Detail]]&lt;br /&gt;
:''A comprehensive guide to the contents of a Plasma SVG theme, including configuration options, wallpapers, on-disk layout, names of all standard SVG files and every element in them.''&lt;br /&gt;
&lt;br /&gt;
== Activity Template development ==&lt;br /&gt;
&lt;br /&gt;
;[[KDE_System_Administration/PlasmaDesktopScripting#Activity_templates|Creating a Plasma Activity Template Quickstart]]&lt;br /&gt;
:''A quick guide to creating your first Plasma Activity Template''&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
* [[Projects/Plasma|Projects: Plasma]]&lt;br /&gt;
* [http://api.kde.org/4.x-api/kdelibs-apidocs/plasma/html/index.html Plasma api documentation]&lt;br /&gt;
* [http://techbase.kde.org/Projects/Plasma/Eclipse_Integration Plasma Eclipse Integration]&lt;br /&gt;
* The [https://mail.kde.org/mailman/listinfo/plasma-devel plasma-devel mailing list] and #plasma on IRC (irc.freenode.org).&lt;br /&gt;
&lt;br /&gt;
== Presentation Slides==&lt;br /&gt;
http://chani.wordpress.com/2009/04/25/quick-update-for-my-presentation/ Victory Calendar -- also link to websvn plasma playground in the odp file.&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma</id>
		<title>Development/Tutorials/Plasma</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma"/>
				<updated>2011-08-19T00:40:02Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* Plasma Programming with JavaScript */ lets move this&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Plasma}}&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with C++ ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/GettingStarted|Getting Started With Plasmoids]]&lt;br /&gt;
:''Creating your first plasmoid in C++ with SVG background, icon and text''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/GettingStarted..Some_More|Getting Started With Plasmoids..Some more]] :''A few more starter's tips.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/DataEngines|Writing a DataEngine]]&lt;br /&gt;
:''DataEngines provide a standardized interface to various (read only) data sources for visualizations to use. Learn what a DataEngine is and how to write one of your own.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Services|Writing a Service]]&lt;br /&gt;
:''Services provide a standardized interface for visualizations to perform &amp;quot;write operations&amp;quot;. This can be for example, uploading pasted test to a pastebin service..''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PackageStructure|Writing a PackageStructure Plugin]]&lt;br /&gt;
:''PackageStructure plugins allow custom Packages to be defined, installed, removed and listed as well as provide access their contents at runtime. Packages may contain any kind of data addons, including scripts.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/UsingExtenders|How to use extenders in your Plasmoid]]&lt;br /&gt;
:''A simple example that shows how to use extenders in a Plasmoid.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/AbstractRunner|Creating Runners]]&lt;br /&gt;
:''Runners are plugins that provide action-based search functionality in the Plasma workspace &amp;quot;run command&amp;quot; dialog. These plugins can be used by any application that links again libplasma.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/WallpaperHelloWorld|Wallpaper Tutorial 1]]&lt;br /&gt;
:''This tutorial shows you how to make a simple Hello World plasma wallpaper plugin.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/WallpaperConfiguration|Wallpaper Tutorial 2]]&lt;br /&gt;
:''This tutorial covers how to add configuration options to the wallpaper.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ShellDesign|Creating a Plasma Shell]]&lt;br /&gt;
:''This tutorial covers the essentials of writing a new Plasma shell from scratch. A must-read for anyone creating a new or modifying an existing Plasma Shell. Existing Plasma shells include Plasma Desktop, Plasma Netbook, Plasma Mobile, Plasma Media Center, Plasma Screensaver, Plasma KPart and Plasma KDM, and all follow the patterns documented here.''&lt;br /&gt;
&lt;br /&gt;
;[http://www.linux-magazine.com/w3/issue/114/036-040_plasma.pdf Creating Plasmoids]&lt;br /&gt;
:''May 2010 article from Linux Magazine''&lt;br /&gt;
&lt;br /&gt;
;[http://www.ibm.com/developerworks/linux/library/l-kde-plasmoids/index.html Create Plasmoids using KDevelop]&lt;br /&gt;
:''Article explaining the structure of Plasma and how to create a Plasmoid''&lt;br /&gt;
&lt;br /&gt;
;[http://community.kde.org/User:Mxttie#Adding_configuration Adding configuration to your plasmoid]&lt;br /&gt;
:''Article explaining how to add a configuration dialog to your plasmoid.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ApplicationShell|Integrate Plasma in Applications]]&lt;br /&gt;
:''This tutorial shows you how to make an application dashboard based on Plasma technologies.''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with JavaScript ==&lt;br /&gt;
&lt;br /&gt;
Plasma has built-in JavaScript (also known as ECMAScript, and often referred to as QtScript in the context of Qt) scripting support without requiring any external dependencies.&lt;br /&gt;
&lt;br /&gt;
=== Plasmoids ===&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in JavaScript''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/DataEngine|Getting Data]]&lt;br /&gt;
:''How to retreive data from a data engine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/NowPlaying|Now Playing]]&lt;br /&gt;
:''Slightly more advanced data engine usage: displaying what's currently playing''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/SystemMonitor|System Monitor]]&lt;br /&gt;
:''How to access systemmonitor data engine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/CheatSheet|Cheat Sheet]]&lt;br /&gt;
:''A cheat sheet, rather than a tutorial, of things to remember and watch out for when developing JavaScript plasmoids''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/API|API Reference]]&lt;br /&gt;
:''The Simplified JavaScript Plasmoid API. Useful for referencing what is available in the runtime and as a study aid for the tutorials above.''&lt;br /&gt;
&lt;br /&gt;
=== Other Applications Of Javascript ===&lt;br /&gt;
;[[KDE_System_Administration/PlasmaDestkopScripting|Scripting Plasma Shells]]&lt;br /&gt;
:The KDE Plasma Desktop and Netbook provide means to manage the desktop shell (desktop, panels, widget) via scripts written in JavaScript. This article describes how to take advantage of this feature set as well as documents the full API. This is primarily a system administration tool, but may also be of interest to power users.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/Animations|Javascript Animations]]&lt;br /&gt;
:''How to write Animations using Javascript for use in Plasma applications''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ComicPlugin|Creating Comic Plugins]]&lt;br /&gt;
:''This guide shows you how to create a comic plugin for the comic plasmoid.''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Python ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Python''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Using DataEngines|Using DataEngines]]&lt;br /&gt;
:''How to use DataEngines from a plasmoid''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Writing DataEngines|Writing DataEngines]]&lt;br /&gt;
:''How to write your own Plasma DataEngine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonPlasmoid|Writing a Plasmoid in Python]]&lt;br /&gt;
:''Writing a simple battery graph in python''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonRunner|Writing a KRunner plugin in Python]]&lt;br /&gt;
:''Writing a simple krunner plugin in python''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Ruby ==&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Ruby''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/SimplePasteApplet|Writing a simple paste applet]]&lt;br /&gt;
:''A tutorial explaining how to set up a plasmoid, create a simple paste applet using widgets and add Plasma features seen elsewhere. Complete with tips for those who have never programmed before.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Writing DataEngines|Writing DataEngines]]&lt;br /&gt;
:''How to write your own Plasma DataEngine using Ruby''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Blinker|Use SVG artwork in the simplest way possible]]&lt;br /&gt;
:''Follow a fellow student as he asks around about SVG usage and explains why the code examples work. This is a wiki so feel free to add your own insights until this tutorial can be considered complete.''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Web Technologies (HTML/JS/CSS etc) ==&lt;br /&gt;
;[[Development/Tutorials/Plasma/Web/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in HTML''&lt;br /&gt;
&lt;br /&gt;
== Plasma integration ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Solid_Device_Actions|Creating a Device Notifier action]]&lt;br /&gt;
:''When your application is interested in removable hardware''&lt;br /&gt;
&lt;br /&gt;
== Theme development ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Theme|Creating a Plasma Theme Quickstart]]&lt;br /&gt;
:''A quick guide to creating your first Plasma theme''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ThemeDetails|The Plasma Theme Structure In Detail]]&lt;br /&gt;
:''A comprehensive guide to the contents of a Plasma SVG theme, including configuration options, wallpapers, on-disk layout, names of all standard SVG files and every element in them.''&lt;br /&gt;
&lt;br /&gt;
== Activity Template development ==&lt;br /&gt;
&lt;br /&gt;
;[[KDE_System_Administration/PlasmaDesktopScripting#Activity_templates|Creating a Plasma Activity Template Quickstart]]&lt;br /&gt;
:''A quick guide to creating your first Plasma Activity Template''&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
* [[Projects/Plasma|Projects: Plasma]]&lt;br /&gt;
* [http://api.kde.org/4.x-api/kdelibs-apidocs/plasma/html/index.html Plasma api documentation]&lt;br /&gt;
* [http://techbase.kde.org/Projects/Plasma/Eclipse_Integration Plasma Eclipse Integration]&lt;br /&gt;
* The [https://mail.kde.org/mailman/listinfo/plasma-devel plasma-devel mailing list] and #plasma on IRC (irc.freenode.org).&lt;br /&gt;
&lt;br /&gt;
== Presentation Slides==&lt;br /&gt;
http://chani.wordpress.com/2009/04/25/quick-update-for-my-presentation/ Victory Calendar -- also link to websvn plasma playground in the odp file.&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted</id>
		<title>Development/Tutorials/Plasma/QML/GettingStarted</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted"/>
				<updated>2011-08-19T00:38:12Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* Plasma Widgets in QML */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Writing a plasma applet in QML is very easy, in fact, with KDE 4.6 and Qt 4.7 it just works.&lt;br /&gt;
&lt;br /&gt;
== QML Basics ==&lt;br /&gt;
&lt;br /&gt;
It is recommended that you have read through the [http://doc.qt.nokia.com/4.7/qtquick.html Qt QML Tutorials], as there are quite a few and they are explained thoroughly. There is also a list of all [http://doc.qt.nokia.com/4.7/qdeclarativeelements.html standard QML elements].&lt;br /&gt;
&lt;br /&gt;
Essentially, most of the content is the same. The exceptions to be noted are how data is gathered...since we use Data Engines, it is a bit different. Text color and font should be made to use PlasmaCore.Theme.&lt;br /&gt;
&lt;br /&gt;
See the [https://projects.kde.org/projects/kde/kdeexamples/repository KDE Examples] repository for more KDE-related helpful resources. Also of use (which use QML and Plasma) are: [https://projects.kde.org/projects/playground/base/plasma-mobile/repository Plasma Mobile], [https://projects.kde.org/projects/playground/base/declarative-plasmoids/repository Declarative Plasmoids (playground)], for WIP ports of C++ originals&lt;br /&gt;
&lt;br /&gt;
=== Root Item ===&lt;br /&gt;
&lt;br /&gt;
The root item can be anything that inherits QGraphicsItem. For example, in this case it is QGraphicsWidget which is a plasmoid. It can also simply be an Item. I also noticed that PathView does not respond to mouse inputs automatically (so flicking doesn't work). Probably because events are being intercepted. So take note, it'll have to be e.g. an Item, for that case.&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
&lt;br /&gt;
==== Row and Column ====&lt;br /&gt;
&lt;br /&gt;
==== Anchors ====&lt;br /&gt;
Anchor layouts offer a nice way of grouping UI elements nicely together. The idea is that you connect edges or corners of one element to the edge or corner of another widget.&lt;br /&gt;
Some examples:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 200&lt;br /&gt;
    height: 300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Text {&lt;br /&gt;
        id: first&lt;br /&gt;
        text: i18n(&amp;quot;1st line&amp;quot;)&lt;br /&gt;
        anchors { top: parent.top;&lt;br /&gt;
                  left: parent.left;&lt;br /&gt;
                  right: parent.right;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    Text {&lt;br /&gt;
        id: second&lt;br /&gt;
        text: i18n(&amp;quot;2nd line&amp;quot;)&lt;br /&gt;
        anchors { top: first.bottom;&lt;br /&gt;
                  left: parent.left;&lt;br /&gt;
                  right: parent.right;&lt;br /&gt;
                  bottom: parent.bottom;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Buttons ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Animations ===&lt;br /&gt;
&lt;br /&gt;
== Package Structure ==&lt;br /&gt;
&lt;br /&gt;
You create a .desktop file and the .qml file. They have to be in the usual plasma package structure.&lt;br /&gt;
&lt;br /&gt;
plasmoid-qml/metadata.desktop&lt;br /&gt;
plasmoid-qml/contents/ui/main.qml&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;metadata.desktop&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Name=Hello QML&lt;br /&gt;
Comment=A hello world widget in QML&lt;br /&gt;
Icon=chronometer&lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
X-Plasma-MainScript=ui/main.qml&lt;br /&gt;
X-Plasma-DefaultSize=200,100&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Author=Frederik Gladhorn&lt;br /&gt;
X-KDE-PluginInfo-Email=gladhorn@kde.org&lt;br /&gt;
X-KDE-PluginInfo-Website=http://plasma.kde.org/&lt;br /&gt;
X-KDE-PluginInfo-Category=Examples&lt;br /&gt;
X-KDE-PluginInfo-Name=org.kde.hello-qml&lt;br /&gt;
X-KDE-PluginInfo-Version=0.0&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Depends=&lt;br /&gt;
X-KDE-PluginInfo-License=GPL&lt;br /&gt;
X-KDE-PluginInfo-EnabledByDefault=true&lt;br /&gt;
X-KDE-ServiceTypes=Plasma/Applet&lt;br /&gt;
Type=Service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  &amp;lt;tt&amp;gt;main.qml&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing ==&lt;br /&gt;
You can install your plasmoid:&lt;br /&gt;
plasmapkg --install plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
== plasmoidviewer ==&lt;br /&gt;
You can run it in plasmoidviewer as usual:&lt;br /&gt;
plasmoidviewer plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
== qmlviewer ==&lt;br /&gt;
It's possible to use Plasma specific imports in qml files loaded by qmlviewer:&lt;br /&gt;
&lt;br /&gt;
qmlviewer -I /usr/lib/kde4/imports/ plasmoid-qml/contents/qml/main.qml &lt;br /&gt;
&lt;br /&gt;
Where the -I is the path to the plasma plugin for qml. Try to look for the path of &lt;br /&gt;
/usr/lib/kde4/imports/org/kde/plasma/graphicswidgets/libgraphicswidgetsbindingsplugin.so&lt;br /&gt;
and use everything up to org of that path.&lt;br /&gt;
&lt;br /&gt;
Hovewer it's '''strongly discouraged''' to use qmlviewer to develop plasmoids, because some features won't be available there:&lt;br /&gt;
* localization with i18n()&lt;br /&gt;
* access to the global ''plasmoid'' object&lt;br /&gt;
* device specific qml files imported with plasmapackage:// urls&lt;br /&gt;
* bindings for qicons, KJobs, services and KConfig&lt;br /&gt;
&lt;br /&gt;
= Features only available in Plasma widgets =&lt;br /&gt;
In order to have a better integration with the KDE platform and to reach an higher degree of expressivity, the stock features of QML have been expanded with the following features, that strictly follow the Plasmoid JavaScript API:&lt;br /&gt;
&lt;br /&gt;
== Minimum size ==&lt;br /&gt;
if the root object of the plasmoid has the properties minimumWidth and minimumHeight, they will be used as the minimum size for the plasmoid. If they will change during the plasmoid execution, the plasmoid minimum size will be updated accordingly.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    property int minimumWidth: paintedWidth&lt;br /&gt;
    property int minimumHeight: paintedHeight&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above example, the minimum size is binded to the paintedWidth/paintedHeight properties of the Text element, ensuring there will always be enough room for the whole text to be displayed.&lt;br /&gt;
&lt;br /&gt;
== Plasmoid object ==&lt;br /&gt;
Every QML plasmoid will have an object called ''plasmoid'', that will give access to the configuration, the formfactor, immutability and so on. It offers the same api as the object with the same name in the Javascript API.&lt;br /&gt;
&lt;br /&gt;
For specific info on this, see [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API-PlasmoidObject Javascript API-Plasmoid Object]&lt;br /&gt;
&lt;br /&gt;
== Localization ==&lt;br /&gt;
It's possible to localize strings with the usual i18n(), i18nc(), i18np() global functions&lt;br /&gt;
&lt;br /&gt;
== Extra types ==&lt;br /&gt;
Some extra types are available from withing JavaScript, namely&lt;br /&gt;
&lt;br /&gt;
* KConfigGroup: it's an object with its cnfig keys readable and writable as properties&lt;br /&gt;
* QIcon: can be constructed with QIcon(&amp;quot;fdo name&amp;quot;) such as QIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
* KJob&lt;br /&gt;
* Plasma Service api&lt;br /&gt;
&lt;br /&gt;
= Plasma specific imports =&lt;br /&gt;
To use some Plasma specific features and to take advantage of them in order for your applet to become a true Plasma applet, it is necessary to use some particular QML imports. See [http://techbase.kde.org/Development/Tutorials/Plasma/QML/API Plasma QML API].&lt;br /&gt;
&lt;br /&gt;
== Extra Qt features ==&lt;br /&gt;
org.kde.qtextraimports&lt;br /&gt;
To use, do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import org.kde.qtextracomponents 0.1 as QtExtraComponents&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* QPixmapItem&lt;br /&gt;
* QImageItem&lt;br /&gt;
* QIconItem&lt;br /&gt;
&lt;br /&gt;
== Plasma Widgets in QML ==&lt;br /&gt;
To use standard plasma widgets (e.g. Plasma::LineEdit, etc.), you simply add an import line for them.&lt;br /&gt;
All properties, signals and slots from ordinary Plasma widgets are available there.&lt;br /&gt;
'''These widgets are provided as a transition tool, intended to be replaced by the Plasma version of QtComponents''', which is currently in development by a gsoc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.graphicswidgets 0.1 as PlasmaWidgets&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 64&lt;br /&gt;
    height: 64&lt;br /&gt;
    PlasmaWidgets.IconWidget {&lt;br /&gt;
        id: icon&lt;br /&gt;
        Component.onCompleted: setIcon(&amp;quot;flag-red&amp;quot;)&lt;br /&gt;
        anchors.centerIn: parent&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted</id>
		<title>Development/Tutorials/Plasma/QML/GettingStarted</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted"/>
				<updated>2011-08-19T00:38:02Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* Plasma Widgets in QML */ bold&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Writing a plasma applet in QML is very easy, in fact, with KDE 4.6 and Qt 4.7 it just works.&lt;br /&gt;
&lt;br /&gt;
== QML Basics ==&lt;br /&gt;
&lt;br /&gt;
It is recommended that you have read through the [http://doc.qt.nokia.com/4.7/qtquick.html Qt QML Tutorials], as there are quite a few and they are explained thoroughly. There is also a list of all [http://doc.qt.nokia.com/4.7/qdeclarativeelements.html standard QML elements].&lt;br /&gt;
&lt;br /&gt;
Essentially, most of the content is the same. The exceptions to be noted are how data is gathered...since we use Data Engines, it is a bit different. Text color and font should be made to use PlasmaCore.Theme.&lt;br /&gt;
&lt;br /&gt;
See the [https://projects.kde.org/projects/kde/kdeexamples/repository KDE Examples] repository for more KDE-related helpful resources. Also of use (which use QML and Plasma) are: [https://projects.kde.org/projects/playground/base/plasma-mobile/repository Plasma Mobile], [https://projects.kde.org/projects/playground/base/declarative-plasmoids/repository Declarative Plasmoids (playground)], for WIP ports of C++ originals&lt;br /&gt;
&lt;br /&gt;
=== Root Item ===&lt;br /&gt;
&lt;br /&gt;
The root item can be anything that inherits QGraphicsItem. For example, in this case it is QGraphicsWidget which is a plasmoid. It can also simply be an Item. I also noticed that PathView does not respond to mouse inputs automatically (so flicking doesn't work). Probably because events are being intercepted. So take note, it'll have to be e.g. an Item, for that case.&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
&lt;br /&gt;
==== Row and Column ====&lt;br /&gt;
&lt;br /&gt;
==== Anchors ====&lt;br /&gt;
Anchor layouts offer a nice way of grouping UI elements nicely together. The idea is that you connect edges or corners of one element to the edge or corner of another widget.&lt;br /&gt;
Some examples:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 200&lt;br /&gt;
    height: 300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Text {&lt;br /&gt;
        id: first&lt;br /&gt;
        text: i18n(&amp;quot;1st line&amp;quot;)&lt;br /&gt;
        anchors { top: parent.top;&lt;br /&gt;
                  left: parent.left;&lt;br /&gt;
                  right: parent.right;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    Text {&lt;br /&gt;
        id: second&lt;br /&gt;
        text: i18n(&amp;quot;2nd line&amp;quot;)&lt;br /&gt;
        anchors { top: first.bottom;&lt;br /&gt;
                  left: parent.left;&lt;br /&gt;
                  right: parent.right;&lt;br /&gt;
                  bottom: parent.bottom;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Buttons ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Animations ===&lt;br /&gt;
&lt;br /&gt;
== Package Structure ==&lt;br /&gt;
&lt;br /&gt;
You create a .desktop file and the .qml file. They have to be in the usual plasma package structure.&lt;br /&gt;
&lt;br /&gt;
plasmoid-qml/metadata.desktop&lt;br /&gt;
plasmoid-qml/contents/ui/main.qml&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;metadata.desktop&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Name=Hello QML&lt;br /&gt;
Comment=A hello world widget in QML&lt;br /&gt;
Icon=chronometer&lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
X-Plasma-MainScript=ui/main.qml&lt;br /&gt;
X-Plasma-DefaultSize=200,100&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Author=Frederik Gladhorn&lt;br /&gt;
X-KDE-PluginInfo-Email=gladhorn@kde.org&lt;br /&gt;
X-KDE-PluginInfo-Website=http://plasma.kde.org/&lt;br /&gt;
X-KDE-PluginInfo-Category=Examples&lt;br /&gt;
X-KDE-PluginInfo-Name=org.kde.hello-qml&lt;br /&gt;
X-KDE-PluginInfo-Version=0.0&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Depends=&lt;br /&gt;
X-KDE-PluginInfo-License=GPL&lt;br /&gt;
X-KDE-PluginInfo-EnabledByDefault=true&lt;br /&gt;
X-KDE-ServiceTypes=Plasma/Applet&lt;br /&gt;
Type=Service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  &amp;lt;tt&amp;gt;main.qml&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing ==&lt;br /&gt;
You can install your plasmoid:&lt;br /&gt;
plasmapkg --install plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
== plasmoidviewer ==&lt;br /&gt;
You can run it in plasmoidviewer as usual:&lt;br /&gt;
plasmoidviewer plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
== qmlviewer ==&lt;br /&gt;
It's possible to use Plasma specific imports in qml files loaded by qmlviewer:&lt;br /&gt;
&lt;br /&gt;
qmlviewer -I /usr/lib/kde4/imports/ plasmoid-qml/contents/qml/main.qml &lt;br /&gt;
&lt;br /&gt;
Where the -I is the path to the plasma plugin for qml. Try to look for the path of &lt;br /&gt;
/usr/lib/kde4/imports/org/kde/plasma/graphicswidgets/libgraphicswidgetsbindingsplugin.so&lt;br /&gt;
and use everything up to org of that path.&lt;br /&gt;
&lt;br /&gt;
Hovewer it's '''strongly discouraged''' to use qmlviewer to develop plasmoids, because some features won't be available there:&lt;br /&gt;
* localization with i18n()&lt;br /&gt;
* access to the global ''plasmoid'' object&lt;br /&gt;
* device specific qml files imported with plasmapackage:// urls&lt;br /&gt;
* bindings for qicons, KJobs, services and KConfig&lt;br /&gt;
&lt;br /&gt;
= Features only available in Plasma widgets =&lt;br /&gt;
In order to have a better integration with the KDE platform and to reach an higher degree of expressivity, the stock features of QML have been expanded with the following features, that strictly follow the Plasmoid JavaScript API:&lt;br /&gt;
&lt;br /&gt;
== Minimum size ==&lt;br /&gt;
if the root object of the plasmoid has the properties minimumWidth and minimumHeight, they will be used as the minimum size for the plasmoid. If they will change during the plasmoid execution, the plasmoid minimum size will be updated accordingly.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    property int minimumWidth: paintedWidth&lt;br /&gt;
    property int minimumHeight: paintedHeight&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above example, the minimum size is binded to the paintedWidth/paintedHeight properties of the Text element, ensuring there will always be enough room for the whole text to be displayed.&lt;br /&gt;
&lt;br /&gt;
== Plasmoid object ==&lt;br /&gt;
Every QML plasmoid will have an object called ''plasmoid'', that will give access to the configuration, the formfactor, immutability and so on. It offers the same api as the object with the same name in the Javascript API.&lt;br /&gt;
&lt;br /&gt;
For specific info on this, see [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API-PlasmoidObject Javascript API-Plasmoid Object]&lt;br /&gt;
&lt;br /&gt;
== Localization ==&lt;br /&gt;
It's possible to localize strings with the usual i18n(), i18nc(), i18np() global functions&lt;br /&gt;
&lt;br /&gt;
== Extra types ==&lt;br /&gt;
Some extra types are available from withing JavaScript, namely&lt;br /&gt;
&lt;br /&gt;
* KConfigGroup: it's an object with its cnfig keys readable and writable as properties&lt;br /&gt;
* QIcon: can be constructed with QIcon(&amp;quot;fdo name&amp;quot;) such as QIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
* KJob&lt;br /&gt;
* Plasma Service api&lt;br /&gt;
&lt;br /&gt;
= Plasma specific imports =&lt;br /&gt;
To use some Plasma specific features and to take advantage of them in order for your applet to become a true Plasma applet, it is necessary to use some particular QML imports. See [http://techbase.kde.org/Development/Tutorials/Plasma/QML/API Plasma QML API].&lt;br /&gt;
&lt;br /&gt;
== Extra Qt features ==&lt;br /&gt;
org.kde.qtextraimports&lt;br /&gt;
To use, do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import org.kde.qtextracomponents 0.1 as QtExtraComponents&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* QPixmapItem&lt;br /&gt;
* QImageItem&lt;br /&gt;
* QIconItem&lt;br /&gt;
&lt;br /&gt;
== Plasma Widgets in QML ==&lt;br /&gt;
To use standard plasma widgets (e.g. Plasma::LineEdit, etc.), you simply add an import line for them.&lt;br /&gt;
All properties, signals and slots from ordinary Plasma widgets are available there.&lt;br /&gt;
'''Those widgets are provided as a transition tool, intended to be replaced by the Plasma version of QtComponents''', which is currently in development by a gsoc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.graphicswidgets 0.1 as PlasmaWidgets&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 64&lt;br /&gt;
    height: 64&lt;br /&gt;
    PlasmaWidgets.IconWidget {&lt;br /&gt;
        id: icon&lt;br /&gt;
        Component.onCompleted: setIcon(&amp;quot;flag-red&amp;quot;)&lt;br /&gt;
        anchors.centerIn: parent&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted</id>
		<title>Development/Tutorials/Plasma/QML/GettingStarted</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted"/>
				<updated>2011-08-19T00:37:48Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* Plasma Widgets in QML */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Writing a plasma applet in QML is very easy, in fact, with KDE 4.6 and Qt 4.7 it just works.&lt;br /&gt;
&lt;br /&gt;
== QML Basics ==&lt;br /&gt;
&lt;br /&gt;
It is recommended that you have read through the [http://doc.qt.nokia.com/4.7/qtquick.html Qt QML Tutorials], as there are quite a few and they are explained thoroughly. There is also a list of all [http://doc.qt.nokia.com/4.7/qdeclarativeelements.html standard QML elements].&lt;br /&gt;
&lt;br /&gt;
Essentially, most of the content is the same. The exceptions to be noted are how data is gathered...since we use Data Engines, it is a bit different. Text color and font should be made to use PlasmaCore.Theme.&lt;br /&gt;
&lt;br /&gt;
See the [https://projects.kde.org/projects/kde/kdeexamples/repository KDE Examples] repository for more KDE-related helpful resources. Also of use (which use QML and Plasma) are: [https://projects.kde.org/projects/playground/base/plasma-mobile/repository Plasma Mobile], [https://projects.kde.org/projects/playground/base/declarative-plasmoids/repository Declarative Plasmoids (playground)], for WIP ports of C++ originals&lt;br /&gt;
&lt;br /&gt;
=== Root Item ===&lt;br /&gt;
&lt;br /&gt;
The root item can be anything that inherits QGraphicsItem. For example, in this case it is QGraphicsWidget which is a plasmoid. It can also simply be an Item. I also noticed that PathView does not respond to mouse inputs automatically (so flicking doesn't work). Probably because events are being intercepted. So take note, it'll have to be e.g. an Item, for that case.&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
&lt;br /&gt;
==== Row and Column ====&lt;br /&gt;
&lt;br /&gt;
==== Anchors ====&lt;br /&gt;
Anchor layouts offer a nice way of grouping UI elements nicely together. The idea is that you connect edges or corners of one element to the edge or corner of another widget.&lt;br /&gt;
Some examples:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 200&lt;br /&gt;
    height: 300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Text {&lt;br /&gt;
        id: first&lt;br /&gt;
        text: i18n(&amp;quot;1st line&amp;quot;)&lt;br /&gt;
        anchors { top: parent.top;&lt;br /&gt;
                  left: parent.left;&lt;br /&gt;
                  right: parent.right;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    Text {&lt;br /&gt;
        id: second&lt;br /&gt;
        text: i18n(&amp;quot;2nd line&amp;quot;)&lt;br /&gt;
        anchors { top: first.bottom;&lt;br /&gt;
                  left: parent.left;&lt;br /&gt;
                  right: parent.right;&lt;br /&gt;
                  bottom: parent.bottom;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Buttons ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Animations ===&lt;br /&gt;
&lt;br /&gt;
== Package Structure ==&lt;br /&gt;
&lt;br /&gt;
You create a .desktop file and the .qml file. They have to be in the usual plasma package structure.&lt;br /&gt;
&lt;br /&gt;
plasmoid-qml/metadata.desktop&lt;br /&gt;
plasmoid-qml/contents/ui/main.qml&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;metadata.desktop&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Name=Hello QML&lt;br /&gt;
Comment=A hello world widget in QML&lt;br /&gt;
Icon=chronometer&lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
X-Plasma-MainScript=ui/main.qml&lt;br /&gt;
X-Plasma-DefaultSize=200,100&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Author=Frederik Gladhorn&lt;br /&gt;
X-KDE-PluginInfo-Email=gladhorn@kde.org&lt;br /&gt;
X-KDE-PluginInfo-Website=http://plasma.kde.org/&lt;br /&gt;
X-KDE-PluginInfo-Category=Examples&lt;br /&gt;
X-KDE-PluginInfo-Name=org.kde.hello-qml&lt;br /&gt;
X-KDE-PluginInfo-Version=0.0&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Depends=&lt;br /&gt;
X-KDE-PluginInfo-License=GPL&lt;br /&gt;
X-KDE-PluginInfo-EnabledByDefault=true&lt;br /&gt;
X-KDE-ServiceTypes=Plasma/Applet&lt;br /&gt;
Type=Service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  &amp;lt;tt&amp;gt;main.qml&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing ==&lt;br /&gt;
You can install your plasmoid:&lt;br /&gt;
plasmapkg --install plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
== plasmoidviewer ==&lt;br /&gt;
You can run it in plasmoidviewer as usual:&lt;br /&gt;
plasmoidviewer plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
== qmlviewer ==&lt;br /&gt;
It's possible to use Plasma specific imports in qml files loaded by qmlviewer:&lt;br /&gt;
&lt;br /&gt;
qmlviewer -I /usr/lib/kde4/imports/ plasmoid-qml/contents/qml/main.qml &lt;br /&gt;
&lt;br /&gt;
Where the -I is the path to the plasma plugin for qml. Try to look for the path of &lt;br /&gt;
/usr/lib/kde4/imports/org/kde/plasma/graphicswidgets/libgraphicswidgetsbindingsplugin.so&lt;br /&gt;
and use everything up to org of that path.&lt;br /&gt;
&lt;br /&gt;
Hovewer it's '''strongly discouraged''' to use qmlviewer to develop plasmoids, because some features won't be available there:&lt;br /&gt;
* localization with i18n()&lt;br /&gt;
* access to the global ''plasmoid'' object&lt;br /&gt;
* device specific qml files imported with plasmapackage:// urls&lt;br /&gt;
* bindings for qicons, KJobs, services and KConfig&lt;br /&gt;
&lt;br /&gt;
= Features only available in Plasma widgets =&lt;br /&gt;
In order to have a better integration with the KDE platform and to reach an higher degree of expressivity, the stock features of QML have been expanded with the following features, that strictly follow the Plasmoid JavaScript API:&lt;br /&gt;
&lt;br /&gt;
== Minimum size ==&lt;br /&gt;
if the root object of the plasmoid has the properties minimumWidth and minimumHeight, they will be used as the minimum size for the plasmoid. If they will change during the plasmoid execution, the plasmoid minimum size will be updated accordingly.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    property int minimumWidth: paintedWidth&lt;br /&gt;
    property int minimumHeight: paintedHeight&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above example, the minimum size is binded to the paintedWidth/paintedHeight properties of the Text element, ensuring there will always be enough room for the whole text to be displayed.&lt;br /&gt;
&lt;br /&gt;
== Plasmoid object ==&lt;br /&gt;
Every QML plasmoid will have an object called ''plasmoid'', that will give access to the configuration, the formfactor, immutability and so on. It offers the same api as the object with the same name in the Javascript API.&lt;br /&gt;
&lt;br /&gt;
For specific info on this, see [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API-PlasmoidObject Javascript API-Plasmoid Object]&lt;br /&gt;
&lt;br /&gt;
== Localization ==&lt;br /&gt;
It's possible to localize strings with the usual i18n(), i18nc(), i18np() global functions&lt;br /&gt;
&lt;br /&gt;
== Extra types ==&lt;br /&gt;
Some extra types are available from withing JavaScript, namely&lt;br /&gt;
&lt;br /&gt;
* KConfigGroup: it's an object with its cnfig keys readable and writable as properties&lt;br /&gt;
* QIcon: can be constructed with QIcon(&amp;quot;fdo name&amp;quot;) such as QIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
* KJob&lt;br /&gt;
* Plasma Service api&lt;br /&gt;
&lt;br /&gt;
= Plasma specific imports =&lt;br /&gt;
To use some Plasma specific features and to take advantage of them in order for your applet to become a true Plasma applet, it is necessary to use some particular QML imports. See [http://techbase.kde.org/Development/Tutorials/Plasma/QML/API Plasma QML API].&lt;br /&gt;
&lt;br /&gt;
== Extra Qt features ==&lt;br /&gt;
org.kde.qtextraimports&lt;br /&gt;
To use, do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import org.kde.qtextracomponents 0.1 as QtExtraComponents&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* QPixmapItem&lt;br /&gt;
* QImageItem&lt;br /&gt;
* QIconItem&lt;br /&gt;
&lt;br /&gt;
== Plasma Widgets in QML ==&lt;br /&gt;
To use standard plasma widgets (e.g. Plasma::LineEdit, etc.), you simply add an import line for them.&lt;br /&gt;
All properties, signals and slots from ordinary Plasma widgets are available there.&lt;br /&gt;
''Those widgets are provided as a transition tool, intended to be replaced by the Plasma version of QtComponents'', which is currently in development by a gsoc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.graphicswidgets 0.1 as PlasmaWidgets&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 64&lt;br /&gt;
    height: 64&lt;br /&gt;
    PlasmaWidgets.IconWidget {&lt;br /&gt;
        id: icon&lt;br /&gt;
        Component.onCompleted: setIcon(&amp;quot;flag-red&amp;quot;)&lt;br /&gt;
        anchors.centerIn: parent&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma</id>
		<title>Development/Tutorials/Plasma</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma"/>
				<updated>2011-08-19T00:31:25Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* QML (QtQuick) Plasmoids */ bolden&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Plasma}}&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with C++ ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/GettingStarted|Getting Started With Plasmoids]]&lt;br /&gt;
:''Creating your first plasmoid in C++ with SVG background, icon and text''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/GettingStarted..Some_More|Getting Started With Plasmoids..Some more]] :''A few more starter's tips.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/DataEngines|Writing a DataEngine]]&lt;br /&gt;
:''DataEngines provide a standardized interface to various (read only) data sources for visualizations to use. Learn what a DataEngine is and how to write one of your own.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Services|Writing a Service]]&lt;br /&gt;
:''Services provide a standardized interface for visualizations to perform &amp;quot;write operations&amp;quot;. This can be for example, uploading pasted test to a pastebin service..''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PackageStructure|Writing a PackageStructure Plugin]]&lt;br /&gt;
:''PackageStructure plugins allow custom Packages to be defined, installed, removed and listed as well as provide access their contents at runtime. Packages may contain any kind of data addons, including scripts.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/UsingExtenders|How to use extenders in your Plasmoid]]&lt;br /&gt;
:''A simple example that shows how to use extenders in a Plasmoid.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/AbstractRunner|Creating Runners]]&lt;br /&gt;
:''Runners are plugins that provide action-based search functionality in the Plasma workspace &amp;quot;run command&amp;quot; dialog. These plugins can be used by any application that links again libplasma.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/WallpaperHelloWorld|Wallpaper Tutorial 1]]&lt;br /&gt;
:''This tutorial shows you how to make a simple Hello World plasma wallpaper plugin.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/WallpaperConfiguration|Wallpaper Tutorial 2]]&lt;br /&gt;
:''This tutorial covers how to add configuration options to the wallpaper.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ShellDesign|Creating a Plasma Shell]]&lt;br /&gt;
:''This tutorial covers the essentials of writing a new Plasma shell from scratch. A must-read for anyone creating a new or modifying an existing Plasma Shell. Existing Plasma shells include Plasma Desktop, Plasma Netbook, Plasma Mobile, Plasma Media Center, Plasma Screensaver, Plasma KPart and Plasma KDM, and all follow the patterns documented here.''&lt;br /&gt;
&lt;br /&gt;
;[http://www.linux-magazine.com/w3/issue/114/036-040_plasma.pdf Creating Plasmoids]&lt;br /&gt;
:''May 2010 article from Linux Magazine''&lt;br /&gt;
&lt;br /&gt;
;[http://www.ibm.com/developerworks/linux/library/l-kde-plasmoids/index.html Create Plasmoids using KDevelop]&lt;br /&gt;
:''Article explaining the structure of Plasma and how to create a Plasmoid''&lt;br /&gt;
&lt;br /&gt;
;[http://community.kde.org/User:Mxttie#Adding_configuration Adding configuration to your plasmoid]&lt;br /&gt;
:''Article explaining how to add a configuration dialog to your plasmoid.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ApplicationShell|Integrate Plasma in Applications]]&lt;br /&gt;
:''This tutorial shows you how to make an application dashboard based on Plasma technologies.''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with JavaScript ==&lt;br /&gt;
&lt;br /&gt;
Plasma has built-in JavaScript (also known as ECMAScript, and often referred to as QtScript in the context of Qt) scripting support without requiring any external dependencies.&lt;br /&gt;
&lt;br /&gt;
=== Plasmoids ===&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in JavaScript''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/DataEngine|Getting Data]]&lt;br /&gt;
:''How to retreive data from a data engine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/NowPlaying|Now Playing]]&lt;br /&gt;
:''Slightly more advanced data engine usage: displaying what's currently playing''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/SystemMonitor|System Monitor]]&lt;br /&gt;
:''How to access systemmonitor data engine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/CheatSheet|Cheat Sheet]]&lt;br /&gt;
:''A cheat sheet, rather than a tutorial, of things to remember and watch out for when developing JavaScript plasmoids''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/API|API Reference]]&lt;br /&gt;
:''The Simplified JavaScript Plasmoid API. Useful for referencing what is available in the runtime and as a study aid for the tutorials above.''&lt;br /&gt;
&lt;br /&gt;
=== QML (QtQuick) Plasmoids ===&lt;br /&gt;
It's possible to write Javascript Plasmoids that use the QML declarative language to describe their user interface, while having the logic in JavaScript. This is now the '''recommended''' method of creating plasmoids, if possible. It allows easily the declaring of an interface. It is also what Plasma is leaning the most towards, especially in the Mobile, MediaCenter and KDM shells.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/QML/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in QML''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/QML/API|API Reference]]&lt;br /&gt;
:''The QML Plasmoid API. Useful for referencing what is available in the runtime, what are the differences with the pure JavaScript ScriptEngine, the differences between pure Qt QML and Plasma, and as a study aid for the tutorials above.''&lt;br /&gt;
&lt;br /&gt;
=== Other Applications Of Javascript ===&lt;br /&gt;
;[[KDE_System_Administration/PlasmaDestkopScripting|Scripting Plasma Shells]]&lt;br /&gt;
:The KDE Plasma Desktop and Netbook provide means to manage the desktop shell (desktop, panels, widget) via scripts written in JavaScript. This article describes how to take advantage of this feature set as well as documents the full API. This is primarily a system administration tool, but may also be of interest to power users.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/Animations|Javascript Animations]]&lt;br /&gt;
:''How to write Animations using Javascript for use in Plasma applications''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ComicPlugin|Creating Comic Plugins]]&lt;br /&gt;
:''This guide shows you how to create a comic plugin for the comic plasmoid.''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Python ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Python''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Using DataEngines|Using DataEngines]]&lt;br /&gt;
:''How to use DataEngines from a plasmoid''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Writing DataEngines|Writing DataEngines]]&lt;br /&gt;
:''How to write your own Plasma DataEngine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonPlasmoid|Writing a Plasmoid in Python]]&lt;br /&gt;
:''Writing a simple battery graph in python''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonRunner|Writing a KRunner plugin in Python]]&lt;br /&gt;
:''Writing a simple krunner plugin in python''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Ruby ==&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Ruby''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/SimplePasteApplet|Writing a simple paste applet]]&lt;br /&gt;
:''A tutorial explaining how to set up a plasmoid, create a simple paste applet using widgets and add Plasma features seen elsewhere. Complete with tips for those who have never programmed before.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Writing DataEngines|Writing DataEngines]]&lt;br /&gt;
:''How to write your own Plasma DataEngine using Ruby''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Blinker|Use SVG artwork in the simplest way possible]]&lt;br /&gt;
:''Follow a fellow student as he asks around about SVG usage and explains why the code examples work. This is a wiki so feel free to add your own insights until this tutorial can be considered complete.''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Web Technologies (HTML/JS/CSS etc) ==&lt;br /&gt;
;[[Development/Tutorials/Plasma/Web/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in HTML''&lt;br /&gt;
&lt;br /&gt;
== Plasma integration ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Solid_Device_Actions|Creating a Device Notifier action]]&lt;br /&gt;
:''When your application is interested in removable hardware''&lt;br /&gt;
&lt;br /&gt;
== Theme development ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Theme|Creating a Plasma Theme Quickstart]]&lt;br /&gt;
:''A quick guide to creating your first Plasma theme''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ThemeDetails|The Plasma Theme Structure In Detail]]&lt;br /&gt;
:''A comprehensive guide to the contents of a Plasma SVG theme, including configuration options, wallpapers, on-disk layout, names of all standard SVG files and every element in them.''&lt;br /&gt;
&lt;br /&gt;
== Activity Template development ==&lt;br /&gt;
&lt;br /&gt;
;[[KDE_System_Administration/PlasmaDesktopScripting#Activity_templates|Creating a Plasma Activity Template Quickstart]]&lt;br /&gt;
:''A quick guide to creating your first Plasma Activity Template''&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
* [[Projects/Plasma|Projects: Plasma]]&lt;br /&gt;
* [http://api.kde.org/4.x-api/kdelibs-apidocs/plasma/html/index.html Plasma api documentation]&lt;br /&gt;
* [http://techbase.kde.org/Projects/Plasma/Eclipse_Integration Plasma Eclipse Integration]&lt;br /&gt;
* The [https://mail.kde.org/mailman/listinfo/plasma-devel plasma-devel mailing list] and #plasma on IRC (irc.freenode.org).&lt;br /&gt;
&lt;br /&gt;
== Presentation Slides==&lt;br /&gt;
http://chani.wordpress.com/2009/04/25/quick-update-for-my-presentation/ Victory Calendar -- also link to websvn plasma playground in the odp file.&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma</id>
		<title>Development/Tutorials/Plasma</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma"/>
				<updated>2011-08-19T00:28:45Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* QML (QtQuick) Plasmoids */ clarify&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Plasma}}&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with C++ ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/GettingStarted|Getting Started With Plasmoids]]&lt;br /&gt;
:''Creating your first plasmoid in C++ with SVG background, icon and text''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/GettingStarted..Some_More|Getting Started With Plasmoids..Some more]] :''A few more starter's tips.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/DataEngines|Writing a DataEngine]]&lt;br /&gt;
:''DataEngines provide a standardized interface to various (read only) data sources for visualizations to use. Learn what a DataEngine is and how to write one of your own.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Services|Writing a Service]]&lt;br /&gt;
:''Services provide a standardized interface for visualizations to perform &amp;quot;write operations&amp;quot;. This can be for example, uploading pasted test to a pastebin service..''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PackageStructure|Writing a PackageStructure Plugin]]&lt;br /&gt;
:''PackageStructure plugins allow custom Packages to be defined, installed, removed and listed as well as provide access their contents at runtime. Packages may contain any kind of data addons, including scripts.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/UsingExtenders|How to use extenders in your Plasmoid]]&lt;br /&gt;
:''A simple example that shows how to use extenders in a Plasmoid.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/AbstractRunner|Creating Runners]]&lt;br /&gt;
:''Runners are plugins that provide action-based search functionality in the Plasma workspace &amp;quot;run command&amp;quot; dialog. These plugins can be used by any application that links again libplasma.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/WallpaperHelloWorld|Wallpaper Tutorial 1]]&lt;br /&gt;
:''This tutorial shows you how to make a simple Hello World plasma wallpaper plugin.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/WallpaperConfiguration|Wallpaper Tutorial 2]]&lt;br /&gt;
:''This tutorial covers how to add configuration options to the wallpaper.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ShellDesign|Creating a Plasma Shell]]&lt;br /&gt;
:''This tutorial covers the essentials of writing a new Plasma shell from scratch. A must-read for anyone creating a new or modifying an existing Plasma Shell. Existing Plasma shells include Plasma Desktop, Plasma Netbook, Plasma Mobile, Plasma Media Center, Plasma Screensaver, Plasma KPart and Plasma KDM, and all follow the patterns documented here.''&lt;br /&gt;
&lt;br /&gt;
;[http://www.linux-magazine.com/w3/issue/114/036-040_plasma.pdf Creating Plasmoids]&lt;br /&gt;
:''May 2010 article from Linux Magazine''&lt;br /&gt;
&lt;br /&gt;
;[http://www.ibm.com/developerworks/linux/library/l-kde-plasmoids/index.html Create Plasmoids using KDevelop]&lt;br /&gt;
:''Article explaining the structure of Plasma and how to create a Plasmoid''&lt;br /&gt;
&lt;br /&gt;
;[http://community.kde.org/User:Mxttie#Adding_configuration Adding configuration to your plasmoid]&lt;br /&gt;
:''Article explaining how to add a configuration dialog to your plasmoid.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ApplicationShell|Integrate Plasma in Applications]]&lt;br /&gt;
:''This tutorial shows you how to make an application dashboard based on Plasma technologies.''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with JavaScript ==&lt;br /&gt;
&lt;br /&gt;
Plasma has built-in JavaScript (also known as ECMAScript, and often referred to as QtScript in the context of Qt) scripting support without requiring any external dependencies.&lt;br /&gt;
&lt;br /&gt;
=== Plasmoids ===&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in JavaScript''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/DataEngine|Getting Data]]&lt;br /&gt;
:''How to retreive data from a data engine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/NowPlaying|Now Playing]]&lt;br /&gt;
:''Slightly more advanced data engine usage: displaying what's currently playing''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/SystemMonitor|System Monitor]]&lt;br /&gt;
:''How to access systemmonitor data engine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/CheatSheet|Cheat Sheet]]&lt;br /&gt;
:''A cheat sheet, rather than a tutorial, of things to remember and watch out for when developing JavaScript plasmoids''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/API|API Reference]]&lt;br /&gt;
:''The Simplified JavaScript Plasmoid API. Useful for referencing what is available in the runtime and as a study aid for the tutorials above.''&lt;br /&gt;
&lt;br /&gt;
=== QML (QtQuick) Plasmoids ===&lt;br /&gt;
It's possible to write Javascript Plasmoids that use the QML declarative language to describe their user interface, while having the logic in JavaScript. This is now the recommended method of creating plasmoids, if possible. It allows easily the declaring of an interface. It is also what Plasma is leaning the most towards, especially in the Mobile, MediaCenter and KDM shells.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/QML/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in QML''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/QML/API|API Reference]]&lt;br /&gt;
:''The QML Plasmoid API. Useful for referencing what is available in the runtime, what are the differences with the pure JavaScript ScriptEngine, the differences between pure Qt QML and Plasma, and as a study aid for the tutorials above.''&lt;br /&gt;
&lt;br /&gt;
=== Other Applications Of Javascript ===&lt;br /&gt;
;[[KDE_System_Administration/PlasmaDestkopScripting|Scripting Plasma Shells]]&lt;br /&gt;
:The KDE Plasma Desktop and Netbook provide means to manage the desktop shell (desktop, panels, widget) via scripts written in JavaScript. This article describes how to take advantage of this feature set as well as documents the full API. This is primarily a system administration tool, but may also be of interest to power users.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/Animations|Javascript Animations]]&lt;br /&gt;
:''How to write Animations using Javascript for use in Plasma applications''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ComicPlugin|Creating Comic Plugins]]&lt;br /&gt;
:''This guide shows you how to create a comic plugin for the comic plasmoid.''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Python ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Python''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Using DataEngines|Using DataEngines]]&lt;br /&gt;
:''How to use DataEngines from a plasmoid''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Writing DataEngines|Writing DataEngines]]&lt;br /&gt;
:''How to write your own Plasma DataEngine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonPlasmoid|Writing a Plasmoid in Python]]&lt;br /&gt;
:''Writing a simple battery graph in python''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonRunner|Writing a KRunner plugin in Python]]&lt;br /&gt;
:''Writing a simple krunner plugin in python''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Ruby ==&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Ruby''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/SimplePasteApplet|Writing a simple paste applet]]&lt;br /&gt;
:''A tutorial explaining how to set up a plasmoid, create a simple paste applet using widgets and add Plasma features seen elsewhere. Complete with tips for those who have never programmed before.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Writing DataEngines|Writing DataEngines]]&lt;br /&gt;
:''How to write your own Plasma DataEngine using Ruby''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Blinker|Use SVG artwork in the simplest way possible]]&lt;br /&gt;
:''Follow a fellow student as he asks around about SVG usage and explains why the code examples work. This is a wiki so feel free to add your own insights until this tutorial can be considered complete.''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Web Technologies (HTML/JS/CSS etc) ==&lt;br /&gt;
;[[Development/Tutorials/Plasma/Web/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in HTML''&lt;br /&gt;
&lt;br /&gt;
== Plasma integration ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Solid_Device_Actions|Creating a Device Notifier action]]&lt;br /&gt;
:''When your application is interested in removable hardware''&lt;br /&gt;
&lt;br /&gt;
== Theme development ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Theme|Creating a Plasma Theme Quickstart]]&lt;br /&gt;
:''A quick guide to creating your first Plasma theme''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ThemeDetails|The Plasma Theme Structure In Detail]]&lt;br /&gt;
:''A comprehensive guide to the contents of a Plasma SVG theme, including configuration options, wallpapers, on-disk layout, names of all standard SVG files and every element in them.''&lt;br /&gt;
&lt;br /&gt;
== Activity Template development ==&lt;br /&gt;
&lt;br /&gt;
;[[KDE_System_Administration/PlasmaDesktopScripting#Activity_templates|Creating a Plasma Activity Template Quickstart]]&lt;br /&gt;
:''A quick guide to creating your first Plasma Activity Template''&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
* [[Projects/Plasma|Projects: Plasma]]&lt;br /&gt;
* [http://api.kde.org/4.x-api/kdelibs-apidocs/plasma/html/index.html Plasma api documentation]&lt;br /&gt;
* [http://techbase.kde.org/Projects/Plasma/Eclipse_Integration Plasma Eclipse Integration]&lt;br /&gt;
* The [https://mail.kde.org/mailman/listinfo/plasma-devel plasma-devel mailing list] and #plasma on IRC (irc.freenode.org).&lt;br /&gt;
&lt;br /&gt;
== Presentation Slides==&lt;br /&gt;
http://chani.wordpress.com/2009/04/25/quick-update-for-my-presentation/ Victory Calendar -- also link to websvn plasma playground in the odp file.&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/API</id>
		<title>Development/Tutorials/Plasma/QML/API</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/API"/>
				<updated>2011-08-19T00:26:41Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* Popup Applet */ clarify&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction to the Plasmoid QML Declarative API  =&lt;br /&gt;
&lt;br /&gt;
This document provides an overview/reference of the Declarative QML API for Plasmoids. It isn't a full binding to all of Qt or KDE's libraries, but a focused set of bindings designed to make writing Plasmoids fast and easy, while remaining powerful.&lt;br /&gt;
&lt;br /&gt;
The API in this documentation covers the API of the Plasma specific QML components, so only the Declarative part of the API.&lt;br /&gt;
&lt;br /&gt;
The QML ScriptEngine is bassed upon the Plasma JavaScript engine, making the API of the JavaScript part identical to the one of the JavaScript plasmoids engine.&lt;br /&gt;
To see the api of the global ''Plasmoid'' object, see the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#The_Global_plasmoid_Object JavaScript API] documentation.&lt;br /&gt;
(TODO: the JavaScript api paged should probably be copied and stripped down the imperative bits not present there, it would make harder to update tough)&lt;br /&gt;
&lt;br /&gt;
== What Is a Declarative Plasmoid?  ==&lt;br /&gt;
&lt;br /&gt;
To denote that this Plasmoid is a Declarative widget, ensure that in the metadata.desktop file there is this line: &lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
&lt;br /&gt;
What follows is a description of the Plasma declarative classes instantiable from QML.&lt;br /&gt;
&lt;br /&gt;
= Main QML classes =&lt;br /&gt;
&lt;br /&gt;
== Data engines ==&lt;br /&gt;
While it's possible to fetch data from a Plasma DataEngine in the same way as the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#DataEngine JavaScript API], however it is preferrable to use the following declarative classes:&lt;br /&gt;
&lt;br /&gt;
=== DataSource ===&lt;br /&gt;
DataSource is a receiver for a dataEngine and can be declared inside QML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
 PlasmaCore.DataSource {&lt;br /&gt;
     id: dataSource&lt;br /&gt;
     engine: &amp;quot;time&amp;quot;&lt;br /&gt;
     connectedSources: [&amp;quot;Local&amp;quot;]&lt;br /&gt;
     interval: 500&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Properties ====&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* bool '''valid''' (read only): true when the DataSource is successfully connected to a data engine&lt;br /&gt;
* int '''interval''': interval of polling of the dataengine, if 0 (default value) no polling will be executed&lt;br /&gt;
* string '''engine''': the plugin name of the dataengine to load&lt;br /&gt;
* Array(string) '''connectedSources''': all the sources of the dataengine we are connected to (and whose data will appear in the '''data''' property)&lt;br /&gt;
* Array(string) '''sources''' (read only): all the sources available from the dataengine&lt;br /&gt;
* variant map '''data''' (read only): It's the most important property, it's a map of all the data available from the dataengine: its structure will be as follows:&lt;br /&gt;
** each key of the map will be a source name, in '''connectedSources'''&lt;br /&gt;
** each value will be a variant hash, so an hash with strings as keys and any variant as value&lt;br /&gt;
** example: dataSource.data[&amp;quot;Local&amp;quot;][&amp;quot;Time&amp;quot;] indicates the '''Time''' key of the dataengine source called &amp;quot;Local&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Signals ====&lt;br /&gt;
It has the following signals:&lt;br /&gt;
&lt;br /&gt;
Note that javascript/qml applies the 'on' prefix to signals. So the actual signal name in C++ which is e.g. '''newData''(...) becomes '''onNewData'''(...).&lt;br /&gt;
&lt;br /&gt;
* '''onNewData'''(String sourceName, Plasma::DataEngine::Data data)&lt;br /&gt;
* '''onSourceAdded'''(String source)&lt;br /&gt;
* '''onSourceRemoved'''(String source)&lt;br /&gt;
* '''onSourceConnected'''(String source)&lt;br /&gt;
* '''onSourceDisconnected'''(String source)&lt;br /&gt;
* '''onIntervalChanged'''()&lt;br /&gt;
* '''onEngineChanged'''()&lt;br /&gt;
* '''onDataChanged'''()&lt;br /&gt;
* '''onConnectedSourcesChanged'''()&lt;br /&gt;
* '''onSourcesChanged'''()&lt;br /&gt;
&lt;br /&gt;
==== Methods ====&lt;br /&gt;
It has the following methods:&lt;br /&gt;
* StringList keysForSource(String source): lists all the keys corresponding to a certain source: for instance in the &amp;quot;time&amp;quot; dataengine, for the &amp;quot;Local&amp;quot; source, keys will be:&lt;br /&gt;
** &amp;quot;Timezone Continent&amp;quot;&lt;br /&gt;
** &amp;quot;Offset&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone&amp;quot;&lt;br /&gt;
** &amp;quot;Time&amp;quot;&lt;br /&gt;
** &amp;quot;Date&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone City&amp;quot;&lt;br /&gt;
* Service serviceForSource(String source): returns a Plasma service that corresponds a given source: see the section about services for how to use it.&lt;br /&gt;
* void connectSource(String source): adds to '''connectedSources''' the new source&lt;br /&gt;
* void disconnectSource(String source): removes that source from '''connectedSources'''&lt;br /&gt;
&lt;br /&gt;
=== Service ===&lt;br /&gt;
Due to their imperative nature, Plasma Services are not instantiated as QML classes, but rather created out of a '''DataSource''' with the method '''serviceForSource''' and used in the JavaScript portions of the QML files.&lt;br /&gt;
This following example is a simplified version from the Now Playing QML widget in the kdeexamples git repository: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var service = dataSource.serviceForSource(activeSource)&lt;br /&gt;
  var operation = service.operationDescription(&amp;quot;seek&amp;quot;)&lt;br /&gt;
  operation.seconds = 10&lt;br /&gt;
&lt;br /&gt;
  var job = service.startOperationCall(operation)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Here dataSource is the id of a DataSource object, and activeSource is a source contained in one of its '''connectedSources'''.&lt;br /&gt;
The service provides an operation called &amp;quot;seek&amp;quot;, with a parameter called &amp;quot;seconds&amp;quot;, that can be written on it as a property of a JavaScript object.&lt;br /&gt;
&lt;br /&gt;
=== ServiceJob ===&lt;br /&gt;
If is necessary to monitor the result of a Service operation, it's possible to connect to the '''finished''' signal provided by the job return paramenter of the '''startOperationCall''' service method.&lt;br /&gt;
The '''finished''' signal has the same job as parameter, from which is possible to check the variant '''result''' property, to check the result.&lt;br /&gt;
&lt;br /&gt;
=== DataModel ===&lt;br /&gt;
Some data engines return as their data something that can be interpreted as a list of items, rather than simple key/value pairs.&lt;br /&gt;
QML provides some item views such as '''ListView''', '''GridView''' and '''Repeater'''.&lt;br /&gt;
The '''DataModel''' QML object can provide, based on a DataSource a model suitable for those QML item views.&lt;br /&gt;
&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* DataSource '''dataSource''': the id of an existing (and connected) DataSource&lt;br /&gt;
* String '''sourceFilter''': it's a regular expression. If the DataSource is connected to more than one source, only inserts data from sources matching this filter expression in the model. To, for example, have a source watch all sources beginning with say &amp;quot;name:&amp;quot;, the required regexp would be sourceFilter: &amp;quot;name:.*&amp;quot;&lt;br /&gt;
* String '''keyRoleFilter''': it's a regular expression. Only data with keys that match this filter expression will be inserted in the model&lt;br /&gt;
* int '''count''' (read only): how many items are in the model&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 ListView {&lt;br /&gt;
   model: PlasmaCore.DataModel {&lt;br /&gt;
        dataSource: microblogSource&lt;br /&gt;
        keyRoleFilter: &amp;quot;[\\d]*&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    delegate: Text {&lt;br /&gt;
        text: title&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the example, ''microblogSource'' is the id of a DataSource, and inserts in the model only entries that have a number as the key name (matched with [\\d]*, in this case tweets ids)&lt;br /&gt;
&lt;br /&gt;
Each item in the model will have the form of a variant hash: all the keys of the hash will be registered as model role names, in the example, &amp;quot;title&amp;quot; is a role of the model containing a string (also reachable with model[&amp;quot;title&amp;quot;]).&lt;br /&gt;
&lt;br /&gt;
A special reserved role will always be present: '''&amp;quot;DataEngineSource&amp;quot;''': it will contain the name of the data engine source that gave origin to this item. Therefore, if you want merely the string of the current source that the model is at...do model[&amp;quot;DataEngineSource&amp;quot;].&lt;br /&gt;
&lt;br /&gt;
Note that view.currentItem holds the item currently selected. However, due to (http://bugreports.qt.nokia.com/browse/QTBUG-16347) this does not work in PathView. A workaround is to make your own.&lt;br /&gt;
&lt;br /&gt;
=== SortFilterModel ===&lt;br /&gt;
SortFilterModel is a proxy model for easy sorting and/or filtering of the items in a DataModel (or any other QAbstractItemModel subclass that has been registered in QML with setContextProperty from a C++ application)&lt;br /&gt;
Properties:&lt;br /&gt;
* model '''sourceModel'''&lt;br /&gt;
* String '''filterRegExp'''&lt;br /&gt;
* String '''filterRole'''&lt;br /&gt;
* String '''sortRole'''&lt;br /&gt;
* Qt::SortOrder '''sortOrder'''&lt;br /&gt;
* int '''count''' (read only)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Popup Applet ==&lt;br /&gt;
So you want your QML applet to be a popup applet, like the device notifier (an icon in the panel shows and expands the applet)?&lt;br /&gt;
&lt;br /&gt;
Why, that's easy.&lt;br /&gt;
&lt;br /&gt;
To change your plasmoid from being a regular boring one, in your '''metadata.desktop''', simply change this following line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
ServiceTypes=Plasma/Applet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
ServiceTypes=Plasma/Applet,Plasma/PopupApplet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then in the main QML item's Component.onCompleted, do:&lt;br /&gt;
&lt;br /&gt;
NOTE: the below code presently has no affect, yet the icons seems to get retrieved from the desktop file (FIXME - is this needed? It has no affect presently).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    plasmoid.popupIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Plasma Themes ==&lt;br /&gt;
&lt;br /&gt;
=== Theme ===&lt;br /&gt;
This class instantiable from QML provides access to the Plasma Theme colors and other facilities such as fonts.&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* String '''themeName''' (read only)&lt;br /&gt;
* QFont '''font''' (read only)&lt;br /&gt;
* bool '''windowTranslucentEnabled''' (read only)&lt;br /&gt;
* Url '''homepage''' (read only)&lt;br /&gt;
* bool '''useGlobalSettings''' (read only)&lt;br /&gt;
* QString '''wallpaperPath''' (read only)&lt;br /&gt;
* color '''textColor''' (read only)&lt;br /&gt;
* color '''highlightColor''' (read only)&lt;br /&gt;
* color '''backgroundColor''' (read only)&lt;br /&gt;
* color '''buttonTextColor''' (read only)&lt;br /&gt;
* color '''buttonBackgroundColor''' (read only)&lt;br /&gt;
* color '''linkColor''' (read only)&lt;br /&gt;
* color '''visitedLinkColor''' (read only)&lt;br /&gt;
* color '''visitedLinkColor''' (read only)&lt;br /&gt;
* color '''buttonHoverColor''' (read only)&lt;br /&gt;
* color '''buttonFocusColor''' (read only)&lt;br /&gt;
* color '''viewTextColor''' (read only)&lt;br /&gt;
* color '''viewBackgroundColor''' (read only)&lt;br /&gt;
* color '''viewHoverColor''' (read only)&lt;br /&gt;
* color '''viewFocusColor''' (read only)&lt;br /&gt;
* String '''styleSheet''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== Svg ===&lt;br /&gt;
Declaring a Svg element instantiates a Plasma Svg instance. This class doesn't draw anything. For drawing, SvgItem is used.&lt;br /&gt;
Properties:&lt;br /&gt;
* QSize '''size'''&lt;br /&gt;
* bool '''multipleImages'''&lt;br /&gt;
* String '''imagePath''' can be anything in the '''desktoptheme/''' folder. For more information on what is available, see [http://techbase.kde.org/Projects/Plasma/Theme#Current_Theme_Elements Plasma Theme Elements]&lt;br /&gt;
* bool '''usingRenderingCache'''&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPixmap pixmap(QString elementID)&lt;br /&gt;
* void resize(qreal width, qreal height)&lt;br /&gt;
* void resize(): resets the image to its default dimension&lt;br /&gt;
* QSize elementSize(QString elementId)&lt;br /&gt;
* QRectF elementRect(QString elementId)&lt;br /&gt;
* bool hasElement(QString elementId)&lt;br /&gt;
* bool isValid(): true if valid svg file&lt;br /&gt;
&lt;br /&gt;
Sample Code:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    PlasmaCore.Svg {&lt;br /&gt;
        id: mySvg&lt;br /&gt;
        imagePath: &amp;quot;widgets/line&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SvgItem ===&lt;br /&gt;
It's a graphical element that will actually paint a Svg instance.&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''elementId''': what element to render. If null, the whole svg will be rendered&lt;br /&gt;
* Svg '''svg''': instance of the Svg class mentioned above&lt;br /&gt;
* QSizeF '''naturalSize''' (read only): default size of the Svg&lt;br /&gt;
* bool '''smooth''': paint with antialias (default false)&lt;br /&gt;
&lt;br /&gt;
Sample Code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    PlasmaCore.SvgItem {&lt;br /&gt;
        id: mySvgItem&lt;br /&gt;
        anchors {&lt;br /&gt;
            top: parent.top&lt;br /&gt;
            left: parent.left&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        width: 300&lt;br /&gt;
        height: 3&lt;br /&gt;
&lt;br /&gt;
        svg: mySvg&lt;br /&gt;
        elementId: &amp;quot;horizontal-line&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FrameSvgItem ===&lt;br /&gt;
It's a graphical element that paints a Plasma::FrameSvg, so a rectangular image composed by 9 elements contained in a Svg file, useful for things like buttons and frames.&lt;br /&gt;
&lt;br /&gt;
Flags&lt;br /&gt;
* EnabledBorders: combination of TopBorder | BottomBorder | LeftBorder | RightBorder, NoBorder if no border of the frame is enabled&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''imagePath''': path of the file relative to the Plasma Theme, for instance &amp;quot;widgets/background&amp;quot;&lt;br /&gt;
* String '''prefix''': a FrameSvg can contain multiple frames, for instance a button contains &amp;quot;normal&amp;quot;, &amp;quot;raised&amp;quot; and &amp;quot;pressed&amp;quot;&lt;br /&gt;
* Margins '''margins''' (read only): the margins of the frame, see documentation below&lt;br /&gt;
* EnabledBorders '''enabledBorders''': what borders are enabled&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
Sample Code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
PlasmaCore.FrameSvgItem {&lt;br /&gt;
    id: myFrameSvgItem&lt;br /&gt;
    anchors.fill: parent&lt;br /&gt;
    imagePath: &amp;quot;translucent/dialogs/background&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Top Level windows ==&lt;br /&gt;
&lt;br /&gt;
=== Dialog ===&lt;br /&gt;
Dialog instantiates a Plasma::Dialog, it will be a Plasma themed top level window that can contain any QML component.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item mainItem: the Item contained in the Dialog, it can be any QML Item instance&lt;br /&gt;
* bool '''visible''': if the window (not the mainItem) is visible&lt;br /&gt;
* int '''x''': x position of the window in screen coordinates&lt;br /&gt;
* int '''y''': y position of the window in screen coordinates&lt;br /&gt;
* int '''width''' (read only): total width of the dialog, including margins&lt;br /&gt;
* int '''height''' (read only): total height of the dialog, including margins&lt;br /&gt;
* int '''windowFlags''': Qt window flags of the Dialog&lt;br /&gt;
* Margins '''margins''' (read only): margins of the Dialog&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPoint popupPosition(Item item, Qt::Alignment alignment=Qt::AlignLeft): the suggested position for the Dialog if it has to be correctly placed as popup of the QML item passed as parameter.&lt;br /&gt;
* void setAttribute(Qt::WindowAttribute attribute, bool on): set an attribute for the dialog window&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== ToolTip ===&lt;br /&gt;
Declaring a ToolTip instance makes it possible to use Plasma tooltips with any QML item.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item '''target''': the QML item we want to show a tooltip of&lt;br /&gt;
* String '''mainText'''&lt;br /&gt;
* String '''subText'''&lt;br /&gt;
* String '''image''': freedesktop compliant icon name as image of the tooltip&lt;br /&gt;
&lt;br /&gt;
= Plasma QtComponents (4.8) =&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/API</id>
		<title>Development/Tutorials/Plasma/QML/API</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/API"/>
				<updated>2011-08-19T00:23:51Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* FrameSvgItem */ add sample code&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction to the Plasmoid QML Declarative API  =&lt;br /&gt;
&lt;br /&gt;
This document provides an overview/reference of the Declarative QML API for Plasmoids. It isn't a full binding to all of Qt or KDE's libraries, but a focused set of bindings designed to make writing Plasmoids fast and easy, while remaining powerful.&lt;br /&gt;
&lt;br /&gt;
The API in this documentation covers the API of the Plasma specific QML components, so only the Declarative part of the API.&lt;br /&gt;
&lt;br /&gt;
The QML ScriptEngine is bassed upon the Plasma JavaScript engine, making the API of the JavaScript part identical to the one of the JavaScript plasmoids engine.&lt;br /&gt;
To see the api of the global ''Plasmoid'' object, see the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#The_Global_plasmoid_Object JavaScript API] documentation.&lt;br /&gt;
(TODO: the JavaScript api paged should probably be copied and stripped down the imperative bits not present there, it would make harder to update tough)&lt;br /&gt;
&lt;br /&gt;
== What Is a Declarative Plasmoid?  ==&lt;br /&gt;
&lt;br /&gt;
To denote that this Plasmoid is a Declarative widget, ensure that in the metadata.desktop file there is this line: &lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
&lt;br /&gt;
What follows is a description of the Plasma declarative classes instantiable from QML.&lt;br /&gt;
&lt;br /&gt;
= Main QML classes =&lt;br /&gt;
&lt;br /&gt;
== Data engines ==&lt;br /&gt;
While it's possible to fetch data from a Plasma DataEngine in the same way as the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#DataEngine JavaScript API], however it is preferrable to use the following declarative classes:&lt;br /&gt;
&lt;br /&gt;
=== DataSource ===&lt;br /&gt;
DataSource is a receiver for a dataEngine and can be declared inside QML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
 PlasmaCore.DataSource {&lt;br /&gt;
     id: dataSource&lt;br /&gt;
     engine: &amp;quot;time&amp;quot;&lt;br /&gt;
     connectedSources: [&amp;quot;Local&amp;quot;]&lt;br /&gt;
     interval: 500&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Properties ====&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* bool '''valid''' (read only): true when the DataSource is successfully connected to a data engine&lt;br /&gt;
* int '''interval''': interval of polling of the dataengine, if 0 (default value) no polling will be executed&lt;br /&gt;
* string '''engine''': the plugin name of the dataengine to load&lt;br /&gt;
* Array(string) '''connectedSources''': all the sources of the dataengine we are connected to (and whose data will appear in the '''data''' property)&lt;br /&gt;
* Array(string) '''sources''' (read only): all the sources available from the dataengine&lt;br /&gt;
* variant map '''data''' (read only): It's the most important property, it's a map of all the data available from the dataengine: its structure will be as follows:&lt;br /&gt;
** each key of the map will be a source name, in '''connectedSources'''&lt;br /&gt;
** each value will be a variant hash, so an hash with strings as keys and any variant as value&lt;br /&gt;
** example: dataSource.data[&amp;quot;Local&amp;quot;][&amp;quot;Time&amp;quot;] indicates the '''Time''' key of the dataengine source called &amp;quot;Local&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Signals ====&lt;br /&gt;
It has the following signals:&lt;br /&gt;
&lt;br /&gt;
Note that javascript/qml applies the 'on' prefix to signals. So the actual signal name in C++ which is e.g. '''newData''(...) becomes '''onNewData'''(...).&lt;br /&gt;
&lt;br /&gt;
* '''onNewData'''(String sourceName, Plasma::DataEngine::Data data)&lt;br /&gt;
* '''onSourceAdded'''(String source)&lt;br /&gt;
* '''onSourceRemoved'''(String source)&lt;br /&gt;
* '''onSourceConnected'''(String source)&lt;br /&gt;
* '''onSourceDisconnected'''(String source)&lt;br /&gt;
* '''onIntervalChanged'''()&lt;br /&gt;
* '''onEngineChanged'''()&lt;br /&gt;
* '''onDataChanged'''()&lt;br /&gt;
* '''onConnectedSourcesChanged'''()&lt;br /&gt;
* '''onSourcesChanged'''()&lt;br /&gt;
&lt;br /&gt;
==== Methods ====&lt;br /&gt;
It has the following methods:&lt;br /&gt;
* StringList keysForSource(String source): lists all the keys corresponding to a certain source: for instance in the &amp;quot;time&amp;quot; dataengine, for the &amp;quot;Local&amp;quot; source, keys will be:&lt;br /&gt;
** &amp;quot;Timezone Continent&amp;quot;&lt;br /&gt;
** &amp;quot;Offset&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone&amp;quot;&lt;br /&gt;
** &amp;quot;Time&amp;quot;&lt;br /&gt;
** &amp;quot;Date&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone City&amp;quot;&lt;br /&gt;
* Service serviceForSource(String source): returns a Plasma service that corresponds a given source: see the section about services for how to use it.&lt;br /&gt;
* void connectSource(String source): adds to '''connectedSources''' the new source&lt;br /&gt;
* void disconnectSource(String source): removes that source from '''connectedSources'''&lt;br /&gt;
&lt;br /&gt;
=== Service ===&lt;br /&gt;
Due to their imperative nature, Plasma Services are not instantiated as QML classes, but rather created out of a '''DataSource''' with the method '''serviceForSource''' and used in the JavaScript portions of the QML files.&lt;br /&gt;
This following example is a simplified version from the Now Playing QML widget in the kdeexamples git repository: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var service = dataSource.serviceForSource(activeSource)&lt;br /&gt;
  var operation = service.operationDescription(&amp;quot;seek&amp;quot;)&lt;br /&gt;
  operation.seconds = 10&lt;br /&gt;
&lt;br /&gt;
  var job = service.startOperationCall(operation)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Here dataSource is the id of a DataSource object, and activeSource is a source contained in one of its '''connectedSources'''.&lt;br /&gt;
The service provides an operation called &amp;quot;seek&amp;quot;, with a parameter called &amp;quot;seconds&amp;quot;, that can be written on it as a property of a JavaScript object.&lt;br /&gt;
&lt;br /&gt;
=== ServiceJob ===&lt;br /&gt;
If is necessary to monitor the result of a Service operation, it's possible to connect to the '''finished''' signal provided by the job return paramenter of the '''startOperationCall''' service method.&lt;br /&gt;
The '''finished''' signal has the same job as parameter, from which is possible to check the variant '''result''' property, to check the result.&lt;br /&gt;
&lt;br /&gt;
=== DataModel ===&lt;br /&gt;
Some data engines return as their data something that can be interpreted as a list of items, rather than simple key/value pairs.&lt;br /&gt;
QML provides some item views such as '''ListView''', '''GridView''' and '''Repeater'''.&lt;br /&gt;
The '''DataModel''' QML object can provide, based on a DataSource a model suitable for those QML item views.&lt;br /&gt;
&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* DataSource '''dataSource''': the id of an existing (and connected) DataSource&lt;br /&gt;
* String '''sourceFilter''': it's a regular expression. If the DataSource is connected to more than one source, only inserts data from sources matching this filter expression in the model. To, for example, have a source watch all sources beginning with say &amp;quot;name:&amp;quot;, the required regexp would be sourceFilter: &amp;quot;name:.*&amp;quot;&lt;br /&gt;
* String '''keyRoleFilter''': it's a regular expression. Only data with keys that match this filter expression will be inserted in the model&lt;br /&gt;
* int '''count''' (read only): how many items are in the model&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 ListView {&lt;br /&gt;
   model: PlasmaCore.DataModel {&lt;br /&gt;
        dataSource: microblogSource&lt;br /&gt;
        keyRoleFilter: &amp;quot;[\\d]*&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    delegate: Text {&lt;br /&gt;
        text: title&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the example, ''microblogSource'' is the id of a DataSource, and inserts in the model only entries that have a number as the key name (matched with [\\d]*, in this case tweets ids)&lt;br /&gt;
&lt;br /&gt;
Each item in the model will have the form of a variant hash: all the keys of the hash will be registered as model role names, in the example, &amp;quot;title&amp;quot; is a role of the model containing a string (also reachable with model[&amp;quot;title&amp;quot;]).&lt;br /&gt;
&lt;br /&gt;
A special reserved role will always be present: '''&amp;quot;DataEngineSource&amp;quot;''': it will contain the name of the data engine source that gave origin to this item. Therefore, if you want merely the string of the current source that the model is at...do model[&amp;quot;DataEngineSource&amp;quot;].&lt;br /&gt;
&lt;br /&gt;
Note that view.currentItem holds the item currently selected. However, due to (http://bugreports.qt.nokia.com/browse/QTBUG-16347) this does not work in PathView. A workaround is to make your own.&lt;br /&gt;
&lt;br /&gt;
=== SortFilterModel ===&lt;br /&gt;
SortFilterModel is a proxy model for easy sorting and/or filtering of the items in a DataModel (or any other QAbstractItemModel subclass that has been registered in QML with setContextProperty from a C++ application)&lt;br /&gt;
Properties:&lt;br /&gt;
* model '''sourceModel'''&lt;br /&gt;
* String '''filterRegExp'''&lt;br /&gt;
* String '''filterRole'''&lt;br /&gt;
* String '''sortRole'''&lt;br /&gt;
* Qt::SortOrder '''sortOrder'''&lt;br /&gt;
* int '''count''' (read only)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Popup Applet ==&lt;br /&gt;
So you want your QML applet to be a popup applet, like the device notifier (an icon in the panel shows and expands the applet)?&lt;br /&gt;
&lt;br /&gt;
Why, that's easy.&lt;br /&gt;
&lt;br /&gt;
To change your plasmoid from being a regular boring one, simply change&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
ServiceTypes=Plasma/Applet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
ServiceTypes=Plasma/Applet,Plasma/PopupApplet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then in the main QML item's Component.onCompleted, do:&lt;br /&gt;
&lt;br /&gt;
NOTE: the below code presently has no affect, yet the icons seems to get retrieved from the desktop file (FIXME - is this needed?).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    plasmoid.popupIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Plasma Themes ==&lt;br /&gt;
&lt;br /&gt;
=== Theme ===&lt;br /&gt;
This class instantiable from QML provides access to the Plasma Theme colors and other facilities such as fonts.&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* String '''themeName''' (read only)&lt;br /&gt;
* QFont '''font''' (read only)&lt;br /&gt;
* bool '''windowTranslucentEnabled''' (read only)&lt;br /&gt;
* Url '''homepage''' (read only)&lt;br /&gt;
* bool '''useGlobalSettings''' (read only)&lt;br /&gt;
* QString '''wallpaperPath''' (read only)&lt;br /&gt;
* color '''textColor''' (read only)&lt;br /&gt;
* color '''highlightColor''' (read only)&lt;br /&gt;
* color '''backgroundColor''' (read only)&lt;br /&gt;
* color '''buttonTextColor''' (read only)&lt;br /&gt;
* color '''buttonBackgroundColor''' (read only)&lt;br /&gt;
* color '''linkColor''' (read only)&lt;br /&gt;
* color '''visitedLinkColor''' (read only)&lt;br /&gt;
* color '''visitedLinkColor''' (read only)&lt;br /&gt;
* color '''buttonHoverColor''' (read only)&lt;br /&gt;
* color '''buttonFocusColor''' (read only)&lt;br /&gt;
* color '''viewTextColor''' (read only)&lt;br /&gt;
* color '''viewBackgroundColor''' (read only)&lt;br /&gt;
* color '''viewHoverColor''' (read only)&lt;br /&gt;
* color '''viewFocusColor''' (read only)&lt;br /&gt;
* String '''styleSheet''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== Svg ===&lt;br /&gt;
Declaring a Svg element instantiates a Plasma Svg instance. This class doesn't draw anything. For drawing, SvgItem is used.&lt;br /&gt;
Properties:&lt;br /&gt;
* QSize '''size'''&lt;br /&gt;
* bool '''multipleImages'''&lt;br /&gt;
* String '''imagePath''' can be anything in the '''desktoptheme/''' folder. For more information on what is available, see [http://techbase.kde.org/Projects/Plasma/Theme#Current_Theme_Elements Plasma Theme Elements]&lt;br /&gt;
* bool '''usingRenderingCache'''&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPixmap pixmap(QString elementID)&lt;br /&gt;
* void resize(qreal width, qreal height)&lt;br /&gt;
* void resize(): resets the image to its default dimension&lt;br /&gt;
* QSize elementSize(QString elementId)&lt;br /&gt;
* QRectF elementRect(QString elementId)&lt;br /&gt;
* bool hasElement(QString elementId)&lt;br /&gt;
* bool isValid(): true if valid svg file&lt;br /&gt;
&lt;br /&gt;
Sample Code:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    PlasmaCore.Svg {&lt;br /&gt;
        id: mySvg&lt;br /&gt;
        imagePath: &amp;quot;widgets/line&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SvgItem ===&lt;br /&gt;
It's a graphical element that will actually paint a Svg instance.&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''elementId''': what element to render. If null, the whole svg will be rendered&lt;br /&gt;
* Svg '''svg''': instance of the Svg class mentioned above&lt;br /&gt;
* QSizeF '''naturalSize''' (read only): default size of the Svg&lt;br /&gt;
* bool '''smooth''': paint with antialias (default false)&lt;br /&gt;
&lt;br /&gt;
Sample Code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    PlasmaCore.SvgItem {&lt;br /&gt;
        id: mySvgItem&lt;br /&gt;
        anchors {&lt;br /&gt;
            top: parent.top&lt;br /&gt;
            left: parent.left&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        width: 300&lt;br /&gt;
        height: 3&lt;br /&gt;
&lt;br /&gt;
        svg: mySvg&lt;br /&gt;
        elementId: &amp;quot;horizontal-line&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FrameSvgItem ===&lt;br /&gt;
It's a graphical element that paints a Plasma::FrameSvg, so a rectangular image composed by 9 elements contained in a Svg file, useful for things like buttons and frames.&lt;br /&gt;
&lt;br /&gt;
Flags&lt;br /&gt;
* EnabledBorders: combination of TopBorder | BottomBorder | LeftBorder | RightBorder, NoBorder if no border of the frame is enabled&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''imagePath''': path of the file relative to the Plasma Theme, for instance &amp;quot;widgets/background&amp;quot;&lt;br /&gt;
* String '''prefix''': a FrameSvg can contain multiple frames, for instance a button contains &amp;quot;normal&amp;quot;, &amp;quot;raised&amp;quot; and &amp;quot;pressed&amp;quot;&lt;br /&gt;
* Margins '''margins''' (read only): the margins of the frame, see documentation below&lt;br /&gt;
* EnabledBorders '''enabledBorders''': what borders are enabled&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
Sample Code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
PlasmaCore.FrameSvgItem {&lt;br /&gt;
    id: myFrameSvgItem&lt;br /&gt;
    anchors.fill: parent&lt;br /&gt;
    imagePath: &amp;quot;translucent/dialogs/background&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Top Level windows ==&lt;br /&gt;
&lt;br /&gt;
=== Dialog ===&lt;br /&gt;
Dialog instantiates a Plasma::Dialog, it will be a Plasma themed top level window that can contain any QML component.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item mainItem: the Item contained in the Dialog, it can be any QML Item instance&lt;br /&gt;
* bool '''visible''': if the window (not the mainItem) is visible&lt;br /&gt;
* int '''x''': x position of the window in screen coordinates&lt;br /&gt;
* int '''y''': y position of the window in screen coordinates&lt;br /&gt;
* int '''width''' (read only): total width of the dialog, including margins&lt;br /&gt;
* int '''height''' (read only): total height of the dialog, including margins&lt;br /&gt;
* int '''windowFlags''': Qt window flags of the Dialog&lt;br /&gt;
* Margins '''margins''' (read only): margins of the Dialog&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPoint popupPosition(Item item, Qt::Alignment alignment=Qt::AlignLeft): the suggested position for the Dialog if it has to be correctly placed as popup of the QML item passed as parameter.&lt;br /&gt;
* void setAttribute(Qt::WindowAttribute attribute, bool on): set an attribute for the dialog window&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== ToolTip ===&lt;br /&gt;
Declaring a ToolTip instance makes it possible to use Plasma tooltips with any QML item.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item '''target''': the QML item we want to show a tooltip of&lt;br /&gt;
* String '''mainText'''&lt;br /&gt;
* String '''subText'''&lt;br /&gt;
* String '''image''': freedesktop compliant icon name as image of the tooltip&lt;br /&gt;
&lt;br /&gt;
= Plasma QtComponents (4.8) =&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/API</id>
		<title>Development/Tutorials/Plasma/QML/API</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/API"/>
				<updated>2011-08-19T00:18:15Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* SvgItem */ fix bracket&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction to the Plasmoid QML Declarative API  =&lt;br /&gt;
&lt;br /&gt;
This document provides an overview/reference of the Declarative QML API for Plasmoids. It isn't a full binding to all of Qt or KDE's libraries, but a focused set of bindings designed to make writing Plasmoids fast and easy, while remaining powerful.&lt;br /&gt;
&lt;br /&gt;
The API in this documentation covers the API of the Plasma specific QML components, so only the Declarative part of the API.&lt;br /&gt;
&lt;br /&gt;
The QML ScriptEngine is bassed upon the Plasma JavaScript engine, making the API of the JavaScript part identical to the one of the JavaScript plasmoids engine.&lt;br /&gt;
To see the api of the global ''Plasmoid'' object, see the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#The_Global_plasmoid_Object JavaScript API] documentation.&lt;br /&gt;
(TODO: the JavaScript api paged should probably be copied and stripped down the imperative bits not present there, it would make harder to update tough)&lt;br /&gt;
&lt;br /&gt;
== What Is a Declarative Plasmoid?  ==&lt;br /&gt;
&lt;br /&gt;
To denote that this Plasmoid is a Declarative widget, ensure that in the metadata.desktop file there is this line: &lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
&lt;br /&gt;
What follows is a description of the Plasma declarative classes instantiable from QML.&lt;br /&gt;
&lt;br /&gt;
= Main QML classes =&lt;br /&gt;
&lt;br /&gt;
== Data engines ==&lt;br /&gt;
While it's possible to fetch data from a Plasma DataEngine in the same way as the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#DataEngine JavaScript API], however it is preferrable to use the following declarative classes:&lt;br /&gt;
&lt;br /&gt;
=== DataSource ===&lt;br /&gt;
DataSource is a receiver for a dataEngine and can be declared inside QML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
 PlasmaCore.DataSource {&lt;br /&gt;
     id: dataSource&lt;br /&gt;
     engine: &amp;quot;time&amp;quot;&lt;br /&gt;
     connectedSources: [&amp;quot;Local&amp;quot;]&lt;br /&gt;
     interval: 500&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Properties ====&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* bool '''valid''' (read only): true when the DataSource is successfully connected to a data engine&lt;br /&gt;
* int '''interval''': interval of polling of the dataengine, if 0 (default value) no polling will be executed&lt;br /&gt;
* string '''engine''': the plugin name of the dataengine to load&lt;br /&gt;
* Array(string) '''connectedSources''': all the sources of the dataengine we are connected to (and whose data will appear in the '''data''' property)&lt;br /&gt;
* Array(string) '''sources''' (read only): all the sources available from the dataengine&lt;br /&gt;
* variant map '''data''' (read only): It's the most important property, it's a map of all the data available from the dataengine: its structure will be as follows:&lt;br /&gt;
** each key of the map will be a source name, in '''connectedSources'''&lt;br /&gt;
** each value will be a variant hash, so an hash with strings as keys and any variant as value&lt;br /&gt;
** example: dataSource.data[&amp;quot;Local&amp;quot;][&amp;quot;Time&amp;quot;] indicates the '''Time''' key of the dataengine source called &amp;quot;Local&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Signals ====&lt;br /&gt;
It has the following signals:&lt;br /&gt;
&lt;br /&gt;
Note that javascript/qml applies the 'on' prefix to signals. So the actual signal name in C++ which is e.g. '''newData''(...) becomes '''onNewData'''(...).&lt;br /&gt;
&lt;br /&gt;
* '''onNewData'''(String sourceName, Plasma::DataEngine::Data data)&lt;br /&gt;
* '''onSourceAdded'''(String source)&lt;br /&gt;
* '''onSourceRemoved'''(String source)&lt;br /&gt;
* '''onSourceConnected'''(String source)&lt;br /&gt;
* '''onSourceDisconnected'''(String source)&lt;br /&gt;
* '''onIntervalChanged'''()&lt;br /&gt;
* '''onEngineChanged'''()&lt;br /&gt;
* '''onDataChanged'''()&lt;br /&gt;
* '''onConnectedSourcesChanged'''()&lt;br /&gt;
* '''onSourcesChanged'''()&lt;br /&gt;
&lt;br /&gt;
==== Methods ====&lt;br /&gt;
It has the following methods:&lt;br /&gt;
* StringList keysForSource(String source): lists all the keys corresponding to a certain source: for instance in the &amp;quot;time&amp;quot; dataengine, for the &amp;quot;Local&amp;quot; source, keys will be:&lt;br /&gt;
** &amp;quot;Timezone Continent&amp;quot;&lt;br /&gt;
** &amp;quot;Offset&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone&amp;quot;&lt;br /&gt;
** &amp;quot;Time&amp;quot;&lt;br /&gt;
** &amp;quot;Date&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone City&amp;quot;&lt;br /&gt;
* Service serviceForSource(String source): returns a Plasma service that corresponds a given source: see the section about services for how to use it.&lt;br /&gt;
* void connectSource(String source): adds to '''connectedSources''' the new source&lt;br /&gt;
* void disconnectSource(String source): removes that source from '''connectedSources'''&lt;br /&gt;
&lt;br /&gt;
=== Service ===&lt;br /&gt;
Due to their imperative nature, Plasma Services are not instantiated as QML classes, but rather created out of a '''DataSource''' with the method '''serviceForSource''' and used in the JavaScript portions of the QML files.&lt;br /&gt;
This following example is a simplified version from the Now Playing QML widget in the kdeexamples git repository: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var service = dataSource.serviceForSource(activeSource)&lt;br /&gt;
  var operation = service.operationDescription(&amp;quot;seek&amp;quot;)&lt;br /&gt;
  operation.seconds = 10&lt;br /&gt;
&lt;br /&gt;
  var job = service.startOperationCall(operation)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Here dataSource is the id of a DataSource object, and activeSource is a source contained in one of its '''connectedSources'''.&lt;br /&gt;
The service provides an operation called &amp;quot;seek&amp;quot;, with a parameter called &amp;quot;seconds&amp;quot;, that can be written on it as a property of a JavaScript object.&lt;br /&gt;
&lt;br /&gt;
=== ServiceJob ===&lt;br /&gt;
If is necessary to monitor the result of a Service operation, it's possible to connect to the '''finished''' signal provided by the job return paramenter of the '''startOperationCall''' service method.&lt;br /&gt;
The '''finished''' signal has the same job as parameter, from which is possible to check the variant '''result''' property, to check the result.&lt;br /&gt;
&lt;br /&gt;
=== DataModel ===&lt;br /&gt;
Some data engines return as their data something that can be interpreted as a list of items, rather than simple key/value pairs.&lt;br /&gt;
QML provides some item views such as '''ListView''', '''GridView''' and '''Repeater'''.&lt;br /&gt;
The '''DataModel''' QML object can provide, based on a DataSource a model suitable for those QML item views.&lt;br /&gt;
&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* DataSource '''dataSource''': the id of an existing (and connected) DataSource&lt;br /&gt;
* String '''sourceFilter''': it's a regular expression. If the DataSource is connected to more than one source, only inserts data from sources matching this filter expression in the model. To, for example, have a source watch all sources beginning with say &amp;quot;name:&amp;quot;, the required regexp would be sourceFilter: &amp;quot;name:.*&amp;quot;&lt;br /&gt;
* String '''keyRoleFilter''': it's a regular expression. Only data with keys that match this filter expression will be inserted in the model&lt;br /&gt;
* int '''count''' (read only): how many items are in the model&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 ListView {&lt;br /&gt;
   model: PlasmaCore.DataModel {&lt;br /&gt;
        dataSource: microblogSource&lt;br /&gt;
        keyRoleFilter: &amp;quot;[\\d]*&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    delegate: Text {&lt;br /&gt;
        text: title&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the example, ''microblogSource'' is the id of a DataSource, and inserts in the model only entries that have a number as the key name (matched with [\\d]*, in this case tweets ids)&lt;br /&gt;
&lt;br /&gt;
Each item in the model will have the form of a variant hash: all the keys of the hash will be registered as model role names, in the example, &amp;quot;title&amp;quot; is a role of the model containing a string (also reachable with model[&amp;quot;title&amp;quot;]).&lt;br /&gt;
&lt;br /&gt;
A special reserved role will always be present: '''&amp;quot;DataEngineSource&amp;quot;''': it will contain the name of the data engine source that gave origin to this item. Therefore, if you want merely the string of the current source that the model is at...do model[&amp;quot;DataEngineSource&amp;quot;].&lt;br /&gt;
&lt;br /&gt;
Note that view.currentItem holds the item currently selected. However, due to (http://bugreports.qt.nokia.com/browse/QTBUG-16347) this does not work in PathView. A workaround is to make your own.&lt;br /&gt;
&lt;br /&gt;
=== SortFilterModel ===&lt;br /&gt;
SortFilterModel is a proxy model for easy sorting and/or filtering of the items in a DataModel (or any other QAbstractItemModel subclass that has been registered in QML with setContextProperty from a C++ application)&lt;br /&gt;
Properties:&lt;br /&gt;
* model '''sourceModel'''&lt;br /&gt;
* String '''filterRegExp'''&lt;br /&gt;
* String '''filterRole'''&lt;br /&gt;
* String '''sortRole'''&lt;br /&gt;
* Qt::SortOrder '''sortOrder'''&lt;br /&gt;
* int '''count''' (read only)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Popup Applet ==&lt;br /&gt;
So you want your QML applet to be a popup applet, like the device notifier (an icon in the panel shows and expands the applet)?&lt;br /&gt;
&lt;br /&gt;
Why, that's easy.&lt;br /&gt;
&lt;br /&gt;
To change your plasmoid from being a regular boring one, simply change&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
ServiceTypes=Plasma/Applet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
ServiceTypes=Plasma/Applet,Plasma/PopupApplet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then in the main QML item's Component.onCompleted, do:&lt;br /&gt;
&lt;br /&gt;
NOTE: the below code presently has no affect, yet the icons seems to get retrieved from the desktop file (FIXME - is this needed?).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    plasmoid.popupIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Plasma Themes ==&lt;br /&gt;
&lt;br /&gt;
=== Theme ===&lt;br /&gt;
This class instantiable from QML provides access to the Plasma Theme colors and other facilities such as fonts.&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* String '''themeName''' (read only)&lt;br /&gt;
* QFont '''font''' (read only)&lt;br /&gt;
* bool '''windowTranslucentEnabled''' (read only)&lt;br /&gt;
* Url '''homepage''' (read only)&lt;br /&gt;
* bool '''useGlobalSettings''' (read only)&lt;br /&gt;
* QString '''wallpaperPath''' (read only)&lt;br /&gt;
* color '''textColor''' (read only)&lt;br /&gt;
* color '''highlightColor''' (read only)&lt;br /&gt;
* color '''backgroundColor''' (read only)&lt;br /&gt;
* color '''buttonTextColor''' (read only)&lt;br /&gt;
* color '''buttonBackgroundColor''' (read only)&lt;br /&gt;
* color '''linkColor''' (read only)&lt;br /&gt;
* color '''visitedLinkColor''' (read only)&lt;br /&gt;
* color '''visitedLinkColor''' (read only)&lt;br /&gt;
* color '''buttonHoverColor''' (read only)&lt;br /&gt;
* color '''buttonFocusColor''' (read only)&lt;br /&gt;
* color '''viewTextColor''' (read only)&lt;br /&gt;
* color '''viewBackgroundColor''' (read only)&lt;br /&gt;
* color '''viewHoverColor''' (read only)&lt;br /&gt;
* color '''viewFocusColor''' (read only)&lt;br /&gt;
* String '''styleSheet''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== Svg ===&lt;br /&gt;
Declaring a Svg element instantiates a Plasma Svg instance. This class doesn't draw anything. For drawing, SvgItem is used.&lt;br /&gt;
Properties:&lt;br /&gt;
* QSize '''size'''&lt;br /&gt;
* bool '''multipleImages'''&lt;br /&gt;
* String '''imagePath''' can be anything in the '''desktoptheme/''' folder. For more information on what is available, see [http://techbase.kde.org/Projects/Plasma/Theme#Current_Theme_Elements Plasma Theme Elements]&lt;br /&gt;
* bool '''usingRenderingCache'''&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPixmap pixmap(QString elementID)&lt;br /&gt;
* void resize(qreal width, qreal height)&lt;br /&gt;
* void resize(): resets the image to its default dimension&lt;br /&gt;
* QSize elementSize(QString elementId)&lt;br /&gt;
* QRectF elementRect(QString elementId)&lt;br /&gt;
* bool hasElement(QString elementId)&lt;br /&gt;
* bool isValid(): true if valid svg file&lt;br /&gt;
&lt;br /&gt;
Sample Code:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    PlasmaCore.Svg {&lt;br /&gt;
        id: mySvg&lt;br /&gt;
        imagePath: &amp;quot;widgets/line&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SvgItem ===&lt;br /&gt;
It's a graphical element that will actually paint a Svg instance.&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''elementId''': what element to render. If null, the whole svg will be rendered&lt;br /&gt;
* Svg '''svg''': instance of the Svg class mentioned above&lt;br /&gt;
* QSizeF '''naturalSize''' (read only): default size of the Svg&lt;br /&gt;
* bool '''smooth''': paint with antialias (default false)&lt;br /&gt;
&lt;br /&gt;
Sample Code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    PlasmaCore.SvgItem {&lt;br /&gt;
        id: mySvgItem&lt;br /&gt;
        anchors {&lt;br /&gt;
            top: parent.top&lt;br /&gt;
            left: parent.left&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        width: 300&lt;br /&gt;
        height: 3&lt;br /&gt;
&lt;br /&gt;
        svg: mySvg&lt;br /&gt;
        elementId: &amp;quot;horizontal-line&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FrameSvgItem ===&lt;br /&gt;
It's a graphical element that paints a Plasma::FrameSvg, so a rectangular image composed by 9 elements contained in a Svg file, useful for things like buttons and frames.&lt;br /&gt;
&lt;br /&gt;
Flags&lt;br /&gt;
* EnabledBorders: combination of TopBorder | BottomBorder | LeftBorder | RightBorder, NoBorder if no border of the frame is enabled&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''imagePath''': path of the file relative to the Plasma Theme, for instance &amp;quot;widgets/background&amp;quot;&lt;br /&gt;
* String '''prefix''': a FrameSvg can contain multiple frames, for instance a button contains &amp;quot;normal&amp;quot;, &amp;quot;raised&amp;quot; and &amp;quot;pressed&amp;quot;&lt;br /&gt;
* Margins '''margins''' (read only): the margins of the frame, see documentation below&lt;br /&gt;
* EnabledBorders '''enabledBorders''': what borders are enabled&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
== Top Level windows ==&lt;br /&gt;
&lt;br /&gt;
=== Dialog ===&lt;br /&gt;
Dialog instantiates a Plasma::Dialog, it will be a Plasma themed top level window that can contain any QML component.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item mainItem: the Item contained in the Dialog, it can be any QML Item instance&lt;br /&gt;
* bool '''visible''': if the window (not the mainItem) is visible&lt;br /&gt;
* int '''x''': x position of the window in screen coordinates&lt;br /&gt;
* int '''y''': y position of the window in screen coordinates&lt;br /&gt;
* int '''width''' (read only): total width of the dialog, including margins&lt;br /&gt;
* int '''height''' (read only): total height of the dialog, including margins&lt;br /&gt;
* int '''windowFlags''': Qt window flags of the Dialog&lt;br /&gt;
* Margins '''margins''' (read only): margins of the Dialog&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPoint popupPosition(Item item, Qt::Alignment alignment=Qt::AlignLeft): the suggested position for the Dialog if it has to be correctly placed as popup of the QML item passed as parameter.&lt;br /&gt;
* void setAttribute(Qt::WindowAttribute attribute, bool on): set an attribute for the dialog window&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== ToolTip ===&lt;br /&gt;
Declaring a ToolTip instance makes it possible to use Plasma tooltips with any QML item.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item '''target''': the QML item we want to show a tooltip of&lt;br /&gt;
* String '''mainText'''&lt;br /&gt;
* String '''subText'''&lt;br /&gt;
* String '''image''': freedesktop compliant icon name as image of the tooltip&lt;br /&gt;
&lt;br /&gt;
= Plasma QtComponents (4.8) =&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/API</id>
		<title>Development/Tutorials/Plasma/QML/API</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/API"/>
				<updated>2011-08-19T00:17:56Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* SvgItem */ add SvgItem sample code&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction to the Plasmoid QML Declarative API  =&lt;br /&gt;
&lt;br /&gt;
This document provides an overview/reference of the Declarative QML API for Plasmoids. It isn't a full binding to all of Qt or KDE's libraries, but a focused set of bindings designed to make writing Plasmoids fast and easy, while remaining powerful.&lt;br /&gt;
&lt;br /&gt;
The API in this documentation covers the API of the Plasma specific QML components, so only the Declarative part of the API.&lt;br /&gt;
&lt;br /&gt;
The QML ScriptEngine is bassed upon the Plasma JavaScript engine, making the API of the JavaScript part identical to the one of the JavaScript plasmoids engine.&lt;br /&gt;
To see the api of the global ''Plasmoid'' object, see the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#The_Global_plasmoid_Object JavaScript API] documentation.&lt;br /&gt;
(TODO: the JavaScript api paged should probably be copied and stripped down the imperative bits not present there, it would make harder to update tough)&lt;br /&gt;
&lt;br /&gt;
== What Is a Declarative Plasmoid?  ==&lt;br /&gt;
&lt;br /&gt;
To denote that this Plasmoid is a Declarative widget, ensure that in the metadata.desktop file there is this line: &lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
&lt;br /&gt;
What follows is a description of the Plasma declarative classes instantiable from QML.&lt;br /&gt;
&lt;br /&gt;
= Main QML classes =&lt;br /&gt;
&lt;br /&gt;
== Data engines ==&lt;br /&gt;
While it's possible to fetch data from a Plasma DataEngine in the same way as the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#DataEngine JavaScript API], however it is preferrable to use the following declarative classes:&lt;br /&gt;
&lt;br /&gt;
=== DataSource ===&lt;br /&gt;
DataSource is a receiver for a dataEngine and can be declared inside QML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
 PlasmaCore.DataSource {&lt;br /&gt;
     id: dataSource&lt;br /&gt;
     engine: &amp;quot;time&amp;quot;&lt;br /&gt;
     connectedSources: [&amp;quot;Local&amp;quot;]&lt;br /&gt;
     interval: 500&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Properties ====&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* bool '''valid''' (read only): true when the DataSource is successfully connected to a data engine&lt;br /&gt;
* int '''interval''': interval of polling of the dataengine, if 0 (default value) no polling will be executed&lt;br /&gt;
* string '''engine''': the plugin name of the dataengine to load&lt;br /&gt;
* Array(string) '''connectedSources''': all the sources of the dataengine we are connected to (and whose data will appear in the '''data''' property)&lt;br /&gt;
* Array(string) '''sources''' (read only): all the sources available from the dataengine&lt;br /&gt;
* variant map '''data''' (read only): It's the most important property, it's a map of all the data available from the dataengine: its structure will be as follows:&lt;br /&gt;
** each key of the map will be a source name, in '''connectedSources'''&lt;br /&gt;
** each value will be a variant hash, so an hash with strings as keys and any variant as value&lt;br /&gt;
** example: dataSource.data[&amp;quot;Local&amp;quot;][&amp;quot;Time&amp;quot;] indicates the '''Time''' key of the dataengine source called &amp;quot;Local&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Signals ====&lt;br /&gt;
It has the following signals:&lt;br /&gt;
&lt;br /&gt;
Note that javascript/qml applies the 'on' prefix to signals. So the actual signal name in C++ which is e.g. '''newData''(...) becomes '''onNewData'''(...).&lt;br /&gt;
&lt;br /&gt;
* '''onNewData'''(String sourceName, Plasma::DataEngine::Data data)&lt;br /&gt;
* '''onSourceAdded'''(String source)&lt;br /&gt;
* '''onSourceRemoved'''(String source)&lt;br /&gt;
* '''onSourceConnected'''(String source)&lt;br /&gt;
* '''onSourceDisconnected'''(String source)&lt;br /&gt;
* '''onIntervalChanged'''()&lt;br /&gt;
* '''onEngineChanged'''()&lt;br /&gt;
* '''onDataChanged'''()&lt;br /&gt;
* '''onConnectedSourcesChanged'''()&lt;br /&gt;
* '''onSourcesChanged'''()&lt;br /&gt;
&lt;br /&gt;
==== Methods ====&lt;br /&gt;
It has the following methods:&lt;br /&gt;
* StringList keysForSource(String source): lists all the keys corresponding to a certain source: for instance in the &amp;quot;time&amp;quot; dataengine, for the &amp;quot;Local&amp;quot; source, keys will be:&lt;br /&gt;
** &amp;quot;Timezone Continent&amp;quot;&lt;br /&gt;
** &amp;quot;Offset&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone&amp;quot;&lt;br /&gt;
** &amp;quot;Time&amp;quot;&lt;br /&gt;
** &amp;quot;Date&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone City&amp;quot;&lt;br /&gt;
* Service serviceForSource(String source): returns a Plasma service that corresponds a given source: see the section about services for how to use it.&lt;br /&gt;
* void connectSource(String source): adds to '''connectedSources''' the new source&lt;br /&gt;
* void disconnectSource(String source): removes that source from '''connectedSources'''&lt;br /&gt;
&lt;br /&gt;
=== Service ===&lt;br /&gt;
Due to their imperative nature, Plasma Services are not instantiated as QML classes, but rather created out of a '''DataSource''' with the method '''serviceForSource''' and used in the JavaScript portions of the QML files.&lt;br /&gt;
This following example is a simplified version from the Now Playing QML widget in the kdeexamples git repository: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var service = dataSource.serviceForSource(activeSource)&lt;br /&gt;
  var operation = service.operationDescription(&amp;quot;seek&amp;quot;)&lt;br /&gt;
  operation.seconds = 10&lt;br /&gt;
&lt;br /&gt;
  var job = service.startOperationCall(operation)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Here dataSource is the id of a DataSource object, and activeSource is a source contained in one of its '''connectedSources'''.&lt;br /&gt;
The service provides an operation called &amp;quot;seek&amp;quot;, with a parameter called &amp;quot;seconds&amp;quot;, that can be written on it as a property of a JavaScript object.&lt;br /&gt;
&lt;br /&gt;
=== ServiceJob ===&lt;br /&gt;
If is necessary to monitor the result of a Service operation, it's possible to connect to the '''finished''' signal provided by the job return paramenter of the '''startOperationCall''' service method.&lt;br /&gt;
The '''finished''' signal has the same job as parameter, from which is possible to check the variant '''result''' property, to check the result.&lt;br /&gt;
&lt;br /&gt;
=== DataModel ===&lt;br /&gt;
Some data engines return as their data something that can be interpreted as a list of items, rather than simple key/value pairs.&lt;br /&gt;
QML provides some item views such as '''ListView''', '''GridView''' and '''Repeater'''.&lt;br /&gt;
The '''DataModel''' QML object can provide, based on a DataSource a model suitable for those QML item views.&lt;br /&gt;
&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* DataSource '''dataSource''': the id of an existing (and connected) DataSource&lt;br /&gt;
* String '''sourceFilter''': it's a regular expression. If the DataSource is connected to more than one source, only inserts data from sources matching this filter expression in the model. To, for example, have a source watch all sources beginning with say &amp;quot;name:&amp;quot;, the required regexp would be sourceFilter: &amp;quot;name:.*&amp;quot;&lt;br /&gt;
* String '''keyRoleFilter''': it's a regular expression. Only data with keys that match this filter expression will be inserted in the model&lt;br /&gt;
* int '''count''' (read only): how many items are in the model&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 ListView {&lt;br /&gt;
   model: PlasmaCore.DataModel {&lt;br /&gt;
        dataSource: microblogSource&lt;br /&gt;
        keyRoleFilter: &amp;quot;[\\d]*&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    delegate: Text {&lt;br /&gt;
        text: title&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the example, ''microblogSource'' is the id of a DataSource, and inserts in the model only entries that have a number as the key name (matched with [\\d]*, in this case tweets ids)&lt;br /&gt;
&lt;br /&gt;
Each item in the model will have the form of a variant hash: all the keys of the hash will be registered as model role names, in the example, &amp;quot;title&amp;quot; is a role of the model containing a string (also reachable with model[&amp;quot;title&amp;quot;]).&lt;br /&gt;
&lt;br /&gt;
A special reserved role will always be present: '''&amp;quot;DataEngineSource&amp;quot;''': it will contain the name of the data engine source that gave origin to this item. Therefore, if you want merely the string of the current source that the model is at...do model[&amp;quot;DataEngineSource&amp;quot;].&lt;br /&gt;
&lt;br /&gt;
Note that view.currentItem holds the item currently selected. However, due to (http://bugreports.qt.nokia.com/browse/QTBUG-16347) this does not work in PathView. A workaround is to make your own.&lt;br /&gt;
&lt;br /&gt;
=== SortFilterModel ===&lt;br /&gt;
SortFilterModel is a proxy model for easy sorting and/or filtering of the items in a DataModel (or any other QAbstractItemModel subclass that has been registered in QML with setContextProperty from a C++ application)&lt;br /&gt;
Properties:&lt;br /&gt;
* model '''sourceModel'''&lt;br /&gt;
* String '''filterRegExp'''&lt;br /&gt;
* String '''filterRole'''&lt;br /&gt;
* String '''sortRole'''&lt;br /&gt;
* Qt::SortOrder '''sortOrder'''&lt;br /&gt;
* int '''count''' (read only)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Popup Applet ==&lt;br /&gt;
So you want your QML applet to be a popup applet, like the device notifier (an icon in the panel shows and expands the applet)?&lt;br /&gt;
&lt;br /&gt;
Why, that's easy.&lt;br /&gt;
&lt;br /&gt;
To change your plasmoid from being a regular boring one, simply change&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
ServiceTypes=Plasma/Applet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
ServiceTypes=Plasma/Applet,Plasma/PopupApplet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then in the main QML item's Component.onCompleted, do:&lt;br /&gt;
&lt;br /&gt;
NOTE: the below code presently has no affect, yet the icons seems to get retrieved from the desktop file (FIXME - is this needed?).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    plasmoid.popupIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Plasma Themes ==&lt;br /&gt;
&lt;br /&gt;
=== Theme ===&lt;br /&gt;
This class instantiable from QML provides access to the Plasma Theme colors and other facilities such as fonts.&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* String '''themeName''' (read only)&lt;br /&gt;
* QFont '''font''' (read only)&lt;br /&gt;
* bool '''windowTranslucentEnabled''' (read only)&lt;br /&gt;
* Url '''homepage''' (read only)&lt;br /&gt;
* bool '''useGlobalSettings''' (read only)&lt;br /&gt;
* QString '''wallpaperPath''' (read only)&lt;br /&gt;
* color '''textColor''' (read only)&lt;br /&gt;
* color '''highlightColor''' (read only)&lt;br /&gt;
* color '''backgroundColor''' (read only)&lt;br /&gt;
* color '''buttonTextColor''' (read only)&lt;br /&gt;
* color '''buttonBackgroundColor''' (read only)&lt;br /&gt;
* color '''linkColor''' (read only)&lt;br /&gt;
* color '''visitedLinkColor''' (read only)&lt;br /&gt;
* color '''visitedLinkColor''' (read only)&lt;br /&gt;
* color '''buttonHoverColor''' (read only)&lt;br /&gt;
* color '''buttonFocusColor''' (read only)&lt;br /&gt;
* color '''viewTextColor''' (read only)&lt;br /&gt;
* color '''viewBackgroundColor''' (read only)&lt;br /&gt;
* color '''viewHoverColor''' (read only)&lt;br /&gt;
* color '''viewFocusColor''' (read only)&lt;br /&gt;
* String '''styleSheet''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== Svg ===&lt;br /&gt;
Declaring a Svg element instantiates a Plasma Svg instance. This class doesn't draw anything. For drawing, SvgItem is used.&lt;br /&gt;
Properties:&lt;br /&gt;
* QSize '''size'''&lt;br /&gt;
* bool '''multipleImages'''&lt;br /&gt;
* String '''imagePath''' can be anything in the '''desktoptheme/''' folder. For more information on what is available, see [http://techbase.kde.org/Projects/Plasma/Theme#Current_Theme_Elements Plasma Theme Elements]&lt;br /&gt;
* bool '''usingRenderingCache'''&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPixmap pixmap(QString elementID)&lt;br /&gt;
* void resize(qreal width, qreal height)&lt;br /&gt;
* void resize(): resets the image to its default dimension&lt;br /&gt;
* QSize elementSize(QString elementId)&lt;br /&gt;
* QRectF elementRect(QString elementId)&lt;br /&gt;
* bool hasElement(QString elementId)&lt;br /&gt;
* bool isValid(): true if valid svg file&lt;br /&gt;
&lt;br /&gt;
Sample Code:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    PlasmaCore.Svg {&lt;br /&gt;
        id: mySvg&lt;br /&gt;
        imagePath: &amp;quot;widgets/line&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SvgItem ===&lt;br /&gt;
It's a graphical element that will actually paint a Svg instance.&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''elementId''': what element to render. If null, the whole svg will be rendered&lt;br /&gt;
* Svg '''svg''': instance of the Svg class mentioned above&lt;br /&gt;
* QSizeF '''naturalSize''' (read only): default size of the Svg&lt;br /&gt;
* bool '''smooth''': paint with antialias (default false)&lt;br /&gt;
&lt;br /&gt;
Sample Code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    PlasmaCore.SvgItem {&lt;br /&gt;
        id: mySvgItem&lt;br /&gt;
        anchors {&lt;br /&gt;
            top: parent.top&lt;br /&gt;
            left: parent.left&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        width: 300&lt;br /&gt;
        height: 3&lt;br /&gt;
&lt;br /&gt;
        svg: mySvg&lt;br /&gt;
        elementId: &amp;quot;horizontal-line&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&lt;br /&gt;
&lt;br /&gt;
=== FrameSvgItem ===&lt;br /&gt;
It's a graphical element that paints a Plasma::FrameSvg, so a rectangular image composed by 9 elements contained in a Svg file, useful for things like buttons and frames.&lt;br /&gt;
&lt;br /&gt;
Flags&lt;br /&gt;
* EnabledBorders: combination of TopBorder | BottomBorder | LeftBorder | RightBorder, NoBorder if no border of the frame is enabled&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''imagePath''': path of the file relative to the Plasma Theme, for instance &amp;quot;widgets/background&amp;quot;&lt;br /&gt;
* String '''prefix''': a FrameSvg can contain multiple frames, for instance a button contains &amp;quot;normal&amp;quot;, &amp;quot;raised&amp;quot; and &amp;quot;pressed&amp;quot;&lt;br /&gt;
* Margins '''margins''' (read only): the margins of the frame, see documentation below&lt;br /&gt;
* EnabledBorders '''enabledBorders''': what borders are enabled&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
== Top Level windows ==&lt;br /&gt;
&lt;br /&gt;
=== Dialog ===&lt;br /&gt;
Dialog instantiates a Plasma::Dialog, it will be a Plasma themed top level window that can contain any QML component.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item mainItem: the Item contained in the Dialog, it can be any QML Item instance&lt;br /&gt;
* bool '''visible''': if the window (not the mainItem) is visible&lt;br /&gt;
* int '''x''': x position of the window in screen coordinates&lt;br /&gt;
* int '''y''': y position of the window in screen coordinates&lt;br /&gt;
* int '''width''' (read only): total width of the dialog, including margins&lt;br /&gt;
* int '''height''' (read only): total height of the dialog, including margins&lt;br /&gt;
* int '''windowFlags''': Qt window flags of the Dialog&lt;br /&gt;
* Margins '''margins''' (read only): margins of the Dialog&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPoint popupPosition(Item item, Qt::Alignment alignment=Qt::AlignLeft): the suggested position for the Dialog if it has to be correctly placed as popup of the QML item passed as parameter.&lt;br /&gt;
* void setAttribute(Qt::WindowAttribute attribute, bool on): set an attribute for the dialog window&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== ToolTip ===&lt;br /&gt;
Declaring a ToolTip instance makes it possible to use Plasma tooltips with any QML item.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item '''target''': the QML item we want to show a tooltip of&lt;br /&gt;
* String '''mainText'''&lt;br /&gt;
* String '''subText'''&lt;br /&gt;
* String '''image''': freedesktop compliant icon name as image of the tooltip&lt;br /&gt;
&lt;br /&gt;
= Plasma QtComponents (4.8) =&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/API</id>
		<title>Development/Tutorials/Plasma/QML/API</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/API"/>
				<updated>2011-08-19T00:15:18Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* Svg */ explain imagepath, rearrange it&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction to the Plasmoid QML Declarative API  =&lt;br /&gt;
&lt;br /&gt;
This document provides an overview/reference of the Declarative QML API for Plasmoids. It isn't a full binding to all of Qt or KDE's libraries, but a focused set of bindings designed to make writing Plasmoids fast and easy, while remaining powerful.&lt;br /&gt;
&lt;br /&gt;
The API in this documentation covers the API of the Plasma specific QML components, so only the Declarative part of the API.&lt;br /&gt;
&lt;br /&gt;
The QML ScriptEngine is bassed upon the Plasma JavaScript engine, making the API of the JavaScript part identical to the one of the JavaScript plasmoids engine.&lt;br /&gt;
To see the api of the global ''Plasmoid'' object, see the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#The_Global_plasmoid_Object JavaScript API] documentation.&lt;br /&gt;
(TODO: the JavaScript api paged should probably be copied and stripped down the imperative bits not present there, it would make harder to update tough)&lt;br /&gt;
&lt;br /&gt;
== What Is a Declarative Plasmoid?  ==&lt;br /&gt;
&lt;br /&gt;
To denote that this Plasmoid is a Declarative widget, ensure that in the metadata.desktop file there is this line: &lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
&lt;br /&gt;
What follows is a description of the Plasma declarative classes instantiable from QML.&lt;br /&gt;
&lt;br /&gt;
= Main QML classes =&lt;br /&gt;
&lt;br /&gt;
== Data engines ==&lt;br /&gt;
While it's possible to fetch data from a Plasma DataEngine in the same way as the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#DataEngine JavaScript API], however it is preferrable to use the following declarative classes:&lt;br /&gt;
&lt;br /&gt;
=== DataSource ===&lt;br /&gt;
DataSource is a receiver for a dataEngine and can be declared inside QML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
 PlasmaCore.DataSource {&lt;br /&gt;
     id: dataSource&lt;br /&gt;
     engine: &amp;quot;time&amp;quot;&lt;br /&gt;
     connectedSources: [&amp;quot;Local&amp;quot;]&lt;br /&gt;
     interval: 500&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Properties ====&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* bool '''valid''' (read only): true when the DataSource is successfully connected to a data engine&lt;br /&gt;
* int '''interval''': interval of polling of the dataengine, if 0 (default value) no polling will be executed&lt;br /&gt;
* string '''engine''': the plugin name of the dataengine to load&lt;br /&gt;
* Array(string) '''connectedSources''': all the sources of the dataengine we are connected to (and whose data will appear in the '''data''' property)&lt;br /&gt;
* Array(string) '''sources''' (read only): all the sources available from the dataengine&lt;br /&gt;
* variant map '''data''' (read only): It's the most important property, it's a map of all the data available from the dataengine: its structure will be as follows:&lt;br /&gt;
** each key of the map will be a source name, in '''connectedSources'''&lt;br /&gt;
** each value will be a variant hash, so an hash with strings as keys and any variant as value&lt;br /&gt;
** example: dataSource.data[&amp;quot;Local&amp;quot;][&amp;quot;Time&amp;quot;] indicates the '''Time''' key of the dataengine source called &amp;quot;Local&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Signals ====&lt;br /&gt;
It has the following signals:&lt;br /&gt;
&lt;br /&gt;
Note that javascript/qml applies the 'on' prefix to signals. So the actual signal name in C++ which is e.g. '''newData''(...) becomes '''onNewData'''(...).&lt;br /&gt;
&lt;br /&gt;
* '''onNewData'''(String sourceName, Plasma::DataEngine::Data data)&lt;br /&gt;
* '''onSourceAdded'''(String source)&lt;br /&gt;
* '''onSourceRemoved'''(String source)&lt;br /&gt;
* '''onSourceConnected'''(String source)&lt;br /&gt;
* '''onSourceDisconnected'''(String source)&lt;br /&gt;
* '''onIntervalChanged'''()&lt;br /&gt;
* '''onEngineChanged'''()&lt;br /&gt;
* '''onDataChanged'''()&lt;br /&gt;
* '''onConnectedSourcesChanged'''()&lt;br /&gt;
* '''onSourcesChanged'''()&lt;br /&gt;
&lt;br /&gt;
==== Methods ====&lt;br /&gt;
It has the following methods:&lt;br /&gt;
* StringList keysForSource(String source): lists all the keys corresponding to a certain source: for instance in the &amp;quot;time&amp;quot; dataengine, for the &amp;quot;Local&amp;quot; source, keys will be:&lt;br /&gt;
** &amp;quot;Timezone Continent&amp;quot;&lt;br /&gt;
** &amp;quot;Offset&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone&amp;quot;&lt;br /&gt;
** &amp;quot;Time&amp;quot;&lt;br /&gt;
** &amp;quot;Date&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone City&amp;quot;&lt;br /&gt;
* Service serviceForSource(String source): returns a Plasma service that corresponds a given source: see the section about services for how to use it.&lt;br /&gt;
* void connectSource(String source): adds to '''connectedSources''' the new source&lt;br /&gt;
* void disconnectSource(String source): removes that source from '''connectedSources'''&lt;br /&gt;
&lt;br /&gt;
=== Service ===&lt;br /&gt;
Due to their imperative nature, Plasma Services are not instantiated as QML classes, but rather created out of a '''DataSource''' with the method '''serviceForSource''' and used in the JavaScript portions of the QML files.&lt;br /&gt;
This following example is a simplified version from the Now Playing QML widget in the kdeexamples git repository: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var service = dataSource.serviceForSource(activeSource)&lt;br /&gt;
  var operation = service.operationDescription(&amp;quot;seek&amp;quot;)&lt;br /&gt;
  operation.seconds = 10&lt;br /&gt;
&lt;br /&gt;
  var job = service.startOperationCall(operation)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Here dataSource is the id of a DataSource object, and activeSource is a source contained in one of its '''connectedSources'''.&lt;br /&gt;
The service provides an operation called &amp;quot;seek&amp;quot;, with a parameter called &amp;quot;seconds&amp;quot;, that can be written on it as a property of a JavaScript object.&lt;br /&gt;
&lt;br /&gt;
=== ServiceJob ===&lt;br /&gt;
If is necessary to monitor the result of a Service operation, it's possible to connect to the '''finished''' signal provided by the job return paramenter of the '''startOperationCall''' service method.&lt;br /&gt;
The '''finished''' signal has the same job as parameter, from which is possible to check the variant '''result''' property, to check the result.&lt;br /&gt;
&lt;br /&gt;
=== DataModel ===&lt;br /&gt;
Some data engines return as their data something that can be interpreted as a list of items, rather than simple key/value pairs.&lt;br /&gt;
QML provides some item views such as '''ListView''', '''GridView''' and '''Repeater'''.&lt;br /&gt;
The '''DataModel''' QML object can provide, based on a DataSource a model suitable for those QML item views.&lt;br /&gt;
&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* DataSource '''dataSource''': the id of an existing (and connected) DataSource&lt;br /&gt;
* String '''sourceFilter''': it's a regular expression. If the DataSource is connected to more than one source, only inserts data from sources matching this filter expression in the model. To, for example, have a source watch all sources beginning with say &amp;quot;name:&amp;quot;, the required regexp would be sourceFilter: &amp;quot;name:.*&amp;quot;&lt;br /&gt;
* String '''keyRoleFilter''': it's a regular expression. Only data with keys that match this filter expression will be inserted in the model&lt;br /&gt;
* int '''count''' (read only): how many items are in the model&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 ListView {&lt;br /&gt;
   model: PlasmaCore.DataModel {&lt;br /&gt;
        dataSource: microblogSource&lt;br /&gt;
        keyRoleFilter: &amp;quot;[\\d]*&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    delegate: Text {&lt;br /&gt;
        text: title&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the example, ''microblogSource'' is the id of a DataSource, and inserts in the model only entries that have a number as the key name (matched with [\\d]*, in this case tweets ids)&lt;br /&gt;
&lt;br /&gt;
Each item in the model will have the form of a variant hash: all the keys of the hash will be registered as model role names, in the example, &amp;quot;title&amp;quot; is a role of the model containing a string (also reachable with model[&amp;quot;title&amp;quot;]).&lt;br /&gt;
&lt;br /&gt;
A special reserved role will always be present: '''&amp;quot;DataEngineSource&amp;quot;''': it will contain the name of the data engine source that gave origin to this item. Therefore, if you want merely the string of the current source that the model is at...do model[&amp;quot;DataEngineSource&amp;quot;].&lt;br /&gt;
&lt;br /&gt;
Note that view.currentItem holds the item currently selected. However, due to (http://bugreports.qt.nokia.com/browse/QTBUG-16347) this does not work in PathView. A workaround is to make your own.&lt;br /&gt;
&lt;br /&gt;
=== SortFilterModel ===&lt;br /&gt;
SortFilterModel is a proxy model for easy sorting and/or filtering of the items in a DataModel (or any other QAbstractItemModel subclass that has been registered in QML with setContextProperty from a C++ application)&lt;br /&gt;
Properties:&lt;br /&gt;
* model '''sourceModel'''&lt;br /&gt;
* String '''filterRegExp'''&lt;br /&gt;
* String '''filterRole'''&lt;br /&gt;
* String '''sortRole'''&lt;br /&gt;
* Qt::SortOrder '''sortOrder'''&lt;br /&gt;
* int '''count''' (read only)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Popup Applet ==&lt;br /&gt;
So you want your QML applet to be a popup applet, like the device notifier (an icon in the panel shows and expands the applet)?&lt;br /&gt;
&lt;br /&gt;
Why, that's easy.&lt;br /&gt;
&lt;br /&gt;
To change your plasmoid from being a regular boring one, simply change&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
ServiceTypes=Plasma/Applet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
ServiceTypes=Plasma/Applet,Plasma/PopupApplet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then in the main QML item's Component.onCompleted, do:&lt;br /&gt;
&lt;br /&gt;
NOTE: the below code presently has no affect, yet the icons seems to get retrieved from the desktop file (FIXME - is this needed?).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    plasmoid.popupIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Plasma Themes ==&lt;br /&gt;
&lt;br /&gt;
=== Theme ===&lt;br /&gt;
This class instantiable from QML provides access to the Plasma Theme colors and other facilities such as fonts.&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* String '''themeName''' (read only)&lt;br /&gt;
* QFont '''font''' (read only)&lt;br /&gt;
* bool '''windowTranslucentEnabled''' (read only)&lt;br /&gt;
* Url '''homepage''' (read only)&lt;br /&gt;
* bool '''useGlobalSettings''' (read only)&lt;br /&gt;
* QString '''wallpaperPath''' (read only)&lt;br /&gt;
* color '''textColor''' (read only)&lt;br /&gt;
* color '''highlightColor''' (read only)&lt;br /&gt;
* color '''backgroundColor''' (read only)&lt;br /&gt;
* color '''buttonTextColor''' (read only)&lt;br /&gt;
* color '''buttonBackgroundColor''' (read only)&lt;br /&gt;
* color '''linkColor''' (read only)&lt;br /&gt;
* color '''visitedLinkColor''' (read only)&lt;br /&gt;
* color '''visitedLinkColor''' (read only)&lt;br /&gt;
* color '''buttonHoverColor''' (read only)&lt;br /&gt;
* color '''buttonFocusColor''' (read only)&lt;br /&gt;
* color '''viewTextColor''' (read only)&lt;br /&gt;
* color '''viewBackgroundColor''' (read only)&lt;br /&gt;
* color '''viewHoverColor''' (read only)&lt;br /&gt;
* color '''viewFocusColor''' (read only)&lt;br /&gt;
* String '''styleSheet''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== Svg ===&lt;br /&gt;
Declaring a Svg element instantiates a Plasma Svg instance. This class doesn't draw anything. For drawing, SvgItem is used.&lt;br /&gt;
Properties:&lt;br /&gt;
* QSize '''size'''&lt;br /&gt;
* bool '''multipleImages'''&lt;br /&gt;
* String '''imagePath''' can be anything in the '''desktoptheme/''' folder. For more information on what is available, see [http://techbase.kde.org/Projects/Plasma/Theme#Current_Theme_Elements Plasma Theme Elements]&lt;br /&gt;
* bool '''usingRenderingCache'''&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPixmap pixmap(QString elementID)&lt;br /&gt;
* void resize(qreal width, qreal height)&lt;br /&gt;
* void resize(): resets the image to its default dimension&lt;br /&gt;
* QSize elementSize(QString elementId)&lt;br /&gt;
* QRectF elementRect(QString elementId)&lt;br /&gt;
* bool hasElement(QString elementId)&lt;br /&gt;
* bool isValid(): true if valid svg file&lt;br /&gt;
&lt;br /&gt;
Sample Code:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    PlasmaCore.Svg {&lt;br /&gt;
        id: mySvg&lt;br /&gt;
        imagePath: &amp;quot;widgets/line&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SvgItem ===&lt;br /&gt;
It's a graphical element that will actually paint a Svg instance.&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''elementId''': what element to render. If null, the whole svg will be rendered&lt;br /&gt;
* Svg '''svg''': instance of the Svg class mentioned above&lt;br /&gt;
* QSizeF '''naturalSize''' (read only): default size of the Svg&lt;br /&gt;
* bool '''smooth''': paint with antialias (default false)&lt;br /&gt;
&lt;br /&gt;
=== FrameSvgItem ===&lt;br /&gt;
It's a graphical element that paints a Plasma::FrameSvg, so a rectangular image composed by 9 elements contained in a Svg file, useful for things like buttons and frames.&lt;br /&gt;
&lt;br /&gt;
Flags&lt;br /&gt;
* EnabledBorders: combination of TopBorder | BottomBorder | LeftBorder | RightBorder, NoBorder if no border of the frame is enabled&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''imagePath''': path of the file relative to the Plasma Theme, for instance &amp;quot;widgets/background&amp;quot;&lt;br /&gt;
* String '''prefix''': a FrameSvg can contain multiple frames, for instance a button contains &amp;quot;normal&amp;quot;, &amp;quot;raised&amp;quot; and &amp;quot;pressed&amp;quot;&lt;br /&gt;
* Margins '''margins''' (read only): the margins of the frame, see documentation below&lt;br /&gt;
* EnabledBorders '''enabledBorders''': what borders are enabled&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
== Top Level windows ==&lt;br /&gt;
&lt;br /&gt;
=== Dialog ===&lt;br /&gt;
Dialog instantiates a Plasma::Dialog, it will be a Plasma themed top level window that can contain any QML component.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item mainItem: the Item contained in the Dialog, it can be any QML Item instance&lt;br /&gt;
* bool '''visible''': if the window (not the mainItem) is visible&lt;br /&gt;
* int '''x''': x position of the window in screen coordinates&lt;br /&gt;
* int '''y''': y position of the window in screen coordinates&lt;br /&gt;
* int '''width''' (read only): total width of the dialog, including margins&lt;br /&gt;
* int '''height''' (read only): total height of the dialog, including margins&lt;br /&gt;
* int '''windowFlags''': Qt window flags of the Dialog&lt;br /&gt;
* Margins '''margins''' (read only): margins of the Dialog&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPoint popupPosition(Item item, Qt::Alignment alignment=Qt::AlignLeft): the suggested position for the Dialog if it has to be correctly placed as popup of the QML item passed as parameter.&lt;br /&gt;
* void setAttribute(Qt::WindowAttribute attribute, bool on): set an attribute for the dialog window&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== ToolTip ===&lt;br /&gt;
Declaring a ToolTip instance makes it possible to use Plasma tooltips with any QML item.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item '''target''': the QML item we want to show a tooltip of&lt;br /&gt;
* String '''mainText'''&lt;br /&gt;
* String '''subText'''&lt;br /&gt;
* String '''image''': freedesktop compliant icon name as image of the tooltip&lt;br /&gt;
&lt;br /&gt;
= Plasma QtComponents (4.8) =&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/API</id>
		<title>Development/Tutorials/Plasma/QML/API</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/API"/>
				<updated>2011-08-19T00:14:09Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* Theme */ bolden&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction to the Plasmoid QML Declarative API  =&lt;br /&gt;
&lt;br /&gt;
This document provides an overview/reference of the Declarative QML API for Plasmoids. It isn't a full binding to all of Qt or KDE's libraries, but a focused set of bindings designed to make writing Plasmoids fast and easy, while remaining powerful.&lt;br /&gt;
&lt;br /&gt;
The API in this documentation covers the API of the Plasma specific QML components, so only the Declarative part of the API.&lt;br /&gt;
&lt;br /&gt;
The QML ScriptEngine is bassed upon the Plasma JavaScript engine, making the API of the JavaScript part identical to the one of the JavaScript plasmoids engine.&lt;br /&gt;
To see the api of the global ''Plasmoid'' object, see the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#The_Global_plasmoid_Object JavaScript API] documentation.&lt;br /&gt;
(TODO: the JavaScript api paged should probably be copied and stripped down the imperative bits not present there, it would make harder to update tough)&lt;br /&gt;
&lt;br /&gt;
== What Is a Declarative Plasmoid?  ==&lt;br /&gt;
&lt;br /&gt;
To denote that this Plasmoid is a Declarative widget, ensure that in the metadata.desktop file there is this line: &lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
&lt;br /&gt;
What follows is a description of the Plasma declarative classes instantiable from QML.&lt;br /&gt;
&lt;br /&gt;
= Main QML classes =&lt;br /&gt;
&lt;br /&gt;
== Data engines ==&lt;br /&gt;
While it's possible to fetch data from a Plasma DataEngine in the same way as the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#DataEngine JavaScript API], however it is preferrable to use the following declarative classes:&lt;br /&gt;
&lt;br /&gt;
=== DataSource ===&lt;br /&gt;
DataSource is a receiver for a dataEngine and can be declared inside QML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
 PlasmaCore.DataSource {&lt;br /&gt;
     id: dataSource&lt;br /&gt;
     engine: &amp;quot;time&amp;quot;&lt;br /&gt;
     connectedSources: [&amp;quot;Local&amp;quot;]&lt;br /&gt;
     interval: 500&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Properties ====&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* bool '''valid''' (read only): true when the DataSource is successfully connected to a data engine&lt;br /&gt;
* int '''interval''': interval of polling of the dataengine, if 0 (default value) no polling will be executed&lt;br /&gt;
* string '''engine''': the plugin name of the dataengine to load&lt;br /&gt;
* Array(string) '''connectedSources''': all the sources of the dataengine we are connected to (and whose data will appear in the '''data''' property)&lt;br /&gt;
* Array(string) '''sources''' (read only): all the sources available from the dataengine&lt;br /&gt;
* variant map '''data''' (read only): It's the most important property, it's a map of all the data available from the dataengine: its structure will be as follows:&lt;br /&gt;
** each key of the map will be a source name, in '''connectedSources'''&lt;br /&gt;
** each value will be a variant hash, so an hash with strings as keys and any variant as value&lt;br /&gt;
** example: dataSource.data[&amp;quot;Local&amp;quot;][&amp;quot;Time&amp;quot;] indicates the '''Time''' key of the dataengine source called &amp;quot;Local&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Signals ====&lt;br /&gt;
It has the following signals:&lt;br /&gt;
&lt;br /&gt;
Note that javascript/qml applies the 'on' prefix to signals. So the actual signal name in C++ which is e.g. '''newData''(...) becomes '''onNewData'''(...).&lt;br /&gt;
&lt;br /&gt;
* '''onNewData'''(String sourceName, Plasma::DataEngine::Data data)&lt;br /&gt;
* '''onSourceAdded'''(String source)&lt;br /&gt;
* '''onSourceRemoved'''(String source)&lt;br /&gt;
* '''onSourceConnected'''(String source)&lt;br /&gt;
* '''onSourceDisconnected'''(String source)&lt;br /&gt;
* '''onIntervalChanged'''()&lt;br /&gt;
* '''onEngineChanged'''()&lt;br /&gt;
* '''onDataChanged'''()&lt;br /&gt;
* '''onConnectedSourcesChanged'''()&lt;br /&gt;
* '''onSourcesChanged'''()&lt;br /&gt;
&lt;br /&gt;
==== Methods ====&lt;br /&gt;
It has the following methods:&lt;br /&gt;
* StringList keysForSource(String source): lists all the keys corresponding to a certain source: for instance in the &amp;quot;time&amp;quot; dataengine, for the &amp;quot;Local&amp;quot; source, keys will be:&lt;br /&gt;
** &amp;quot;Timezone Continent&amp;quot;&lt;br /&gt;
** &amp;quot;Offset&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone&amp;quot;&lt;br /&gt;
** &amp;quot;Time&amp;quot;&lt;br /&gt;
** &amp;quot;Date&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone City&amp;quot;&lt;br /&gt;
* Service serviceForSource(String source): returns a Plasma service that corresponds a given source: see the section about services for how to use it.&lt;br /&gt;
* void connectSource(String source): adds to '''connectedSources''' the new source&lt;br /&gt;
* void disconnectSource(String source): removes that source from '''connectedSources'''&lt;br /&gt;
&lt;br /&gt;
=== Service ===&lt;br /&gt;
Due to their imperative nature, Plasma Services are not instantiated as QML classes, but rather created out of a '''DataSource''' with the method '''serviceForSource''' and used in the JavaScript portions of the QML files.&lt;br /&gt;
This following example is a simplified version from the Now Playing QML widget in the kdeexamples git repository: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var service = dataSource.serviceForSource(activeSource)&lt;br /&gt;
  var operation = service.operationDescription(&amp;quot;seek&amp;quot;)&lt;br /&gt;
  operation.seconds = 10&lt;br /&gt;
&lt;br /&gt;
  var job = service.startOperationCall(operation)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Here dataSource is the id of a DataSource object, and activeSource is a source contained in one of its '''connectedSources'''.&lt;br /&gt;
The service provides an operation called &amp;quot;seek&amp;quot;, with a parameter called &amp;quot;seconds&amp;quot;, that can be written on it as a property of a JavaScript object.&lt;br /&gt;
&lt;br /&gt;
=== ServiceJob ===&lt;br /&gt;
If is necessary to monitor the result of a Service operation, it's possible to connect to the '''finished''' signal provided by the job return paramenter of the '''startOperationCall''' service method.&lt;br /&gt;
The '''finished''' signal has the same job as parameter, from which is possible to check the variant '''result''' property, to check the result.&lt;br /&gt;
&lt;br /&gt;
=== DataModel ===&lt;br /&gt;
Some data engines return as their data something that can be interpreted as a list of items, rather than simple key/value pairs.&lt;br /&gt;
QML provides some item views such as '''ListView''', '''GridView''' and '''Repeater'''.&lt;br /&gt;
The '''DataModel''' QML object can provide, based on a DataSource a model suitable for those QML item views.&lt;br /&gt;
&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* DataSource '''dataSource''': the id of an existing (and connected) DataSource&lt;br /&gt;
* String '''sourceFilter''': it's a regular expression. If the DataSource is connected to more than one source, only inserts data from sources matching this filter expression in the model. To, for example, have a source watch all sources beginning with say &amp;quot;name:&amp;quot;, the required regexp would be sourceFilter: &amp;quot;name:.*&amp;quot;&lt;br /&gt;
* String '''keyRoleFilter''': it's a regular expression. Only data with keys that match this filter expression will be inserted in the model&lt;br /&gt;
* int '''count''' (read only): how many items are in the model&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 ListView {&lt;br /&gt;
   model: PlasmaCore.DataModel {&lt;br /&gt;
        dataSource: microblogSource&lt;br /&gt;
        keyRoleFilter: &amp;quot;[\\d]*&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    delegate: Text {&lt;br /&gt;
        text: title&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the example, ''microblogSource'' is the id of a DataSource, and inserts in the model only entries that have a number as the key name (matched with [\\d]*, in this case tweets ids)&lt;br /&gt;
&lt;br /&gt;
Each item in the model will have the form of a variant hash: all the keys of the hash will be registered as model role names, in the example, &amp;quot;title&amp;quot; is a role of the model containing a string (also reachable with model[&amp;quot;title&amp;quot;]).&lt;br /&gt;
&lt;br /&gt;
A special reserved role will always be present: '''&amp;quot;DataEngineSource&amp;quot;''': it will contain the name of the data engine source that gave origin to this item. Therefore, if you want merely the string of the current source that the model is at...do model[&amp;quot;DataEngineSource&amp;quot;].&lt;br /&gt;
&lt;br /&gt;
Note that view.currentItem holds the item currently selected. However, due to (http://bugreports.qt.nokia.com/browse/QTBUG-16347) this does not work in PathView. A workaround is to make your own.&lt;br /&gt;
&lt;br /&gt;
=== SortFilterModel ===&lt;br /&gt;
SortFilterModel is a proxy model for easy sorting and/or filtering of the items in a DataModel (or any other QAbstractItemModel subclass that has been registered in QML with setContextProperty from a C++ application)&lt;br /&gt;
Properties:&lt;br /&gt;
* model '''sourceModel'''&lt;br /&gt;
* String '''filterRegExp'''&lt;br /&gt;
* String '''filterRole'''&lt;br /&gt;
* String '''sortRole'''&lt;br /&gt;
* Qt::SortOrder '''sortOrder'''&lt;br /&gt;
* int '''count''' (read only)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Popup Applet ==&lt;br /&gt;
So you want your QML applet to be a popup applet, like the device notifier (an icon in the panel shows and expands the applet)?&lt;br /&gt;
&lt;br /&gt;
Why, that's easy.&lt;br /&gt;
&lt;br /&gt;
To change your plasmoid from being a regular boring one, simply change&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
ServiceTypes=Plasma/Applet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
ServiceTypes=Plasma/Applet,Plasma/PopupApplet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then in the main QML item's Component.onCompleted, do:&lt;br /&gt;
&lt;br /&gt;
NOTE: the below code presently has no affect, yet the icons seems to get retrieved from the desktop file (FIXME - is this needed?).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    plasmoid.popupIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Plasma Themes ==&lt;br /&gt;
&lt;br /&gt;
=== Theme ===&lt;br /&gt;
This class instantiable from QML provides access to the Plasma Theme colors and other facilities such as fonts.&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* String '''themeName''' (read only)&lt;br /&gt;
* QFont '''font''' (read only)&lt;br /&gt;
* bool '''windowTranslucentEnabled''' (read only)&lt;br /&gt;
* Url '''homepage''' (read only)&lt;br /&gt;
* bool '''useGlobalSettings''' (read only)&lt;br /&gt;
* QString '''wallpaperPath''' (read only)&lt;br /&gt;
* color '''textColor''' (read only)&lt;br /&gt;
* color '''highlightColor''' (read only)&lt;br /&gt;
* color '''backgroundColor''' (read only)&lt;br /&gt;
* color '''buttonTextColor''' (read only)&lt;br /&gt;
* color '''buttonBackgroundColor''' (read only)&lt;br /&gt;
* color '''linkColor''' (read only)&lt;br /&gt;
* color '''visitedLinkColor''' (read only)&lt;br /&gt;
* color '''visitedLinkColor''' (read only)&lt;br /&gt;
* color '''buttonHoverColor''' (read only)&lt;br /&gt;
* color '''buttonFocusColor''' (read only)&lt;br /&gt;
* color '''viewTextColor''' (read only)&lt;br /&gt;
* color '''viewBackgroundColor''' (read only)&lt;br /&gt;
* color '''viewHoverColor''' (read only)&lt;br /&gt;
* color '''viewFocusColor''' (read only)&lt;br /&gt;
* String '''styleSheet''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== Svg ===&lt;br /&gt;
Declaring a Svg element instantiates a Plasma Svg instance. This class doesn't draw anything. For drawing, SvgItem is used.&lt;br /&gt;
Properties:&lt;br /&gt;
* QSize '''size'''&lt;br /&gt;
* bool '''multipleImages'''&lt;br /&gt;
* String '''imagePath'''&lt;br /&gt;
* bool '''usingRenderingCache'''&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPixmap pixmap(QString elementID)&lt;br /&gt;
* void resize(qreal width, qreal height)&lt;br /&gt;
* void resize(): resets the image to its default dimension&lt;br /&gt;
* QSize elementSize(QString elementId)&lt;br /&gt;
* QRectF elementRect(QString elementId)&lt;br /&gt;
* bool hasElement(QString elementId)&lt;br /&gt;
* bool isValid(): true if valid svg file&lt;br /&gt;
&lt;br /&gt;
Sample Code:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    PlasmaCore.Svg {&lt;br /&gt;
        id: mySvg&lt;br /&gt;
        imagePath: &amp;quot;widgets/line&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
'''imagePath''' can be anything in the '''desktoptheme/''' folder. For more information on what is available, see [http://techbase.kde.org/Projects/Plasma/Theme#Current_Theme_Elements Plasma Theme Elements]&lt;br /&gt;
&lt;br /&gt;
=== SvgItem ===&lt;br /&gt;
It's a graphical element that will actually paint a Svg instance.&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''elementId''': what element to render. If null, the whole svg will be rendered&lt;br /&gt;
* Svg '''svg''': instance of the Svg class mentioned above&lt;br /&gt;
* QSizeF '''naturalSize''' (read only): default size of the Svg&lt;br /&gt;
* bool '''smooth''': paint with antialias (default false)&lt;br /&gt;
&lt;br /&gt;
=== FrameSvgItem ===&lt;br /&gt;
It's a graphical element that paints a Plasma::FrameSvg, so a rectangular image composed by 9 elements contained in a Svg file, useful for things like buttons and frames.&lt;br /&gt;
&lt;br /&gt;
Flags&lt;br /&gt;
* EnabledBorders: combination of TopBorder | BottomBorder | LeftBorder | RightBorder, NoBorder if no border of the frame is enabled&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''imagePath''': path of the file relative to the Plasma Theme, for instance &amp;quot;widgets/background&amp;quot;&lt;br /&gt;
* String '''prefix''': a FrameSvg can contain multiple frames, for instance a button contains &amp;quot;normal&amp;quot;, &amp;quot;raised&amp;quot; and &amp;quot;pressed&amp;quot;&lt;br /&gt;
* Margins '''margins''' (read only): the margins of the frame, see documentation below&lt;br /&gt;
* EnabledBorders '''enabledBorders''': what borders are enabled&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
== Top Level windows ==&lt;br /&gt;
&lt;br /&gt;
=== Dialog ===&lt;br /&gt;
Dialog instantiates a Plasma::Dialog, it will be a Plasma themed top level window that can contain any QML component.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item mainItem: the Item contained in the Dialog, it can be any QML Item instance&lt;br /&gt;
* bool '''visible''': if the window (not the mainItem) is visible&lt;br /&gt;
* int '''x''': x position of the window in screen coordinates&lt;br /&gt;
* int '''y''': y position of the window in screen coordinates&lt;br /&gt;
* int '''width''' (read only): total width of the dialog, including margins&lt;br /&gt;
* int '''height''' (read only): total height of the dialog, including margins&lt;br /&gt;
* int '''windowFlags''': Qt window flags of the Dialog&lt;br /&gt;
* Margins '''margins''' (read only): margins of the Dialog&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPoint popupPosition(Item item, Qt::Alignment alignment=Qt::AlignLeft): the suggested position for the Dialog if it has to be correctly placed as popup of the QML item passed as parameter.&lt;br /&gt;
* void setAttribute(Qt::WindowAttribute attribute, bool on): set an attribute for the dialog window&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== ToolTip ===&lt;br /&gt;
Declaring a ToolTip instance makes it possible to use Plasma tooltips with any QML item.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item '''target''': the QML item we want to show a tooltip of&lt;br /&gt;
* String '''mainText'''&lt;br /&gt;
* String '''subText'''&lt;br /&gt;
* String '''image''': freedesktop compliant icon name as image of the tooltip&lt;br /&gt;
&lt;br /&gt;
= Plasma QtComponents (4.8) =&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/API</id>
		<title>Development/Tutorials/Plasma/QML/API</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/API"/>
				<updated>2011-08-19T00:13:13Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* Theme */ gram&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction to the Plasmoid QML Declarative API  =&lt;br /&gt;
&lt;br /&gt;
This document provides an overview/reference of the Declarative QML API for Plasmoids. It isn't a full binding to all of Qt or KDE's libraries, but a focused set of bindings designed to make writing Plasmoids fast and easy, while remaining powerful.&lt;br /&gt;
&lt;br /&gt;
The API in this documentation covers the API of the Plasma specific QML components, so only the Declarative part of the API.&lt;br /&gt;
&lt;br /&gt;
The QML ScriptEngine is bassed upon the Plasma JavaScript engine, making the API of the JavaScript part identical to the one of the JavaScript plasmoids engine.&lt;br /&gt;
To see the api of the global ''Plasmoid'' object, see the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#The_Global_plasmoid_Object JavaScript API] documentation.&lt;br /&gt;
(TODO: the JavaScript api paged should probably be copied and stripped down the imperative bits not present there, it would make harder to update tough)&lt;br /&gt;
&lt;br /&gt;
== What Is a Declarative Plasmoid?  ==&lt;br /&gt;
&lt;br /&gt;
To denote that this Plasmoid is a Declarative widget, ensure that in the metadata.desktop file there is this line: &lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
&lt;br /&gt;
What follows is a description of the Plasma declarative classes instantiable from QML.&lt;br /&gt;
&lt;br /&gt;
= Main QML classes =&lt;br /&gt;
&lt;br /&gt;
== Data engines ==&lt;br /&gt;
While it's possible to fetch data from a Plasma DataEngine in the same way as the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#DataEngine JavaScript API], however it is preferrable to use the following declarative classes:&lt;br /&gt;
&lt;br /&gt;
=== DataSource ===&lt;br /&gt;
DataSource is a receiver for a dataEngine and can be declared inside QML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
 PlasmaCore.DataSource {&lt;br /&gt;
     id: dataSource&lt;br /&gt;
     engine: &amp;quot;time&amp;quot;&lt;br /&gt;
     connectedSources: [&amp;quot;Local&amp;quot;]&lt;br /&gt;
     interval: 500&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Properties ====&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* bool '''valid''' (read only): true when the DataSource is successfully connected to a data engine&lt;br /&gt;
* int '''interval''': interval of polling of the dataengine, if 0 (default value) no polling will be executed&lt;br /&gt;
* string '''engine''': the plugin name of the dataengine to load&lt;br /&gt;
* Array(string) '''connectedSources''': all the sources of the dataengine we are connected to (and whose data will appear in the '''data''' property)&lt;br /&gt;
* Array(string) '''sources''' (read only): all the sources available from the dataengine&lt;br /&gt;
* variant map '''data''' (read only): It's the most important property, it's a map of all the data available from the dataengine: its structure will be as follows:&lt;br /&gt;
** each key of the map will be a source name, in '''connectedSources'''&lt;br /&gt;
** each value will be a variant hash, so an hash with strings as keys and any variant as value&lt;br /&gt;
** example: dataSource.data[&amp;quot;Local&amp;quot;][&amp;quot;Time&amp;quot;] indicates the '''Time''' key of the dataengine source called &amp;quot;Local&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Signals ====&lt;br /&gt;
It has the following signals:&lt;br /&gt;
&lt;br /&gt;
Note that javascript/qml applies the 'on' prefix to signals. So the actual signal name in C++ which is e.g. '''newData''(...) becomes '''onNewData'''(...).&lt;br /&gt;
&lt;br /&gt;
* '''onNewData'''(String sourceName, Plasma::DataEngine::Data data)&lt;br /&gt;
* '''onSourceAdded'''(String source)&lt;br /&gt;
* '''onSourceRemoved'''(String source)&lt;br /&gt;
* '''onSourceConnected'''(String source)&lt;br /&gt;
* '''onSourceDisconnected'''(String source)&lt;br /&gt;
* '''onIntervalChanged'''()&lt;br /&gt;
* '''onEngineChanged'''()&lt;br /&gt;
* '''onDataChanged'''()&lt;br /&gt;
* '''onConnectedSourcesChanged'''()&lt;br /&gt;
* '''onSourcesChanged'''()&lt;br /&gt;
&lt;br /&gt;
==== Methods ====&lt;br /&gt;
It has the following methods:&lt;br /&gt;
* StringList keysForSource(String source): lists all the keys corresponding to a certain source: for instance in the &amp;quot;time&amp;quot; dataengine, for the &amp;quot;Local&amp;quot; source, keys will be:&lt;br /&gt;
** &amp;quot;Timezone Continent&amp;quot;&lt;br /&gt;
** &amp;quot;Offset&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone&amp;quot;&lt;br /&gt;
** &amp;quot;Time&amp;quot;&lt;br /&gt;
** &amp;quot;Date&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone City&amp;quot;&lt;br /&gt;
* Service serviceForSource(String source): returns a Plasma service that corresponds a given source: see the section about services for how to use it.&lt;br /&gt;
* void connectSource(String source): adds to '''connectedSources''' the new source&lt;br /&gt;
* void disconnectSource(String source): removes that source from '''connectedSources'''&lt;br /&gt;
&lt;br /&gt;
=== Service ===&lt;br /&gt;
Due to their imperative nature, Plasma Services are not instantiated as QML classes, but rather created out of a '''DataSource''' with the method '''serviceForSource''' and used in the JavaScript portions of the QML files.&lt;br /&gt;
This following example is a simplified version from the Now Playing QML widget in the kdeexamples git repository: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var service = dataSource.serviceForSource(activeSource)&lt;br /&gt;
  var operation = service.operationDescription(&amp;quot;seek&amp;quot;)&lt;br /&gt;
  operation.seconds = 10&lt;br /&gt;
&lt;br /&gt;
  var job = service.startOperationCall(operation)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Here dataSource is the id of a DataSource object, and activeSource is a source contained in one of its '''connectedSources'''.&lt;br /&gt;
The service provides an operation called &amp;quot;seek&amp;quot;, with a parameter called &amp;quot;seconds&amp;quot;, that can be written on it as a property of a JavaScript object.&lt;br /&gt;
&lt;br /&gt;
=== ServiceJob ===&lt;br /&gt;
If is necessary to monitor the result of a Service operation, it's possible to connect to the '''finished''' signal provided by the job return paramenter of the '''startOperationCall''' service method.&lt;br /&gt;
The '''finished''' signal has the same job as parameter, from which is possible to check the variant '''result''' property, to check the result.&lt;br /&gt;
&lt;br /&gt;
=== DataModel ===&lt;br /&gt;
Some data engines return as their data something that can be interpreted as a list of items, rather than simple key/value pairs.&lt;br /&gt;
QML provides some item views such as '''ListView''', '''GridView''' and '''Repeater'''.&lt;br /&gt;
The '''DataModel''' QML object can provide, based on a DataSource a model suitable for those QML item views.&lt;br /&gt;
&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* DataSource '''dataSource''': the id of an existing (and connected) DataSource&lt;br /&gt;
* String '''sourceFilter''': it's a regular expression. If the DataSource is connected to more than one source, only inserts data from sources matching this filter expression in the model. To, for example, have a source watch all sources beginning with say &amp;quot;name:&amp;quot;, the required regexp would be sourceFilter: &amp;quot;name:.*&amp;quot;&lt;br /&gt;
* String '''keyRoleFilter''': it's a regular expression. Only data with keys that match this filter expression will be inserted in the model&lt;br /&gt;
* int '''count''' (read only): how many items are in the model&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 ListView {&lt;br /&gt;
   model: PlasmaCore.DataModel {&lt;br /&gt;
        dataSource: microblogSource&lt;br /&gt;
        keyRoleFilter: &amp;quot;[\\d]*&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    delegate: Text {&lt;br /&gt;
        text: title&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the example, ''microblogSource'' is the id of a DataSource, and inserts in the model only entries that have a number as the key name (matched with [\\d]*, in this case tweets ids)&lt;br /&gt;
&lt;br /&gt;
Each item in the model will have the form of a variant hash: all the keys of the hash will be registered as model role names, in the example, &amp;quot;title&amp;quot; is a role of the model containing a string (also reachable with model[&amp;quot;title&amp;quot;]).&lt;br /&gt;
&lt;br /&gt;
A special reserved role will always be present: '''&amp;quot;DataEngineSource&amp;quot;''': it will contain the name of the data engine source that gave origin to this item. Therefore, if you want merely the string of the current source that the model is at...do model[&amp;quot;DataEngineSource&amp;quot;].&lt;br /&gt;
&lt;br /&gt;
Note that view.currentItem holds the item currently selected. However, due to (http://bugreports.qt.nokia.com/browse/QTBUG-16347) this does not work in PathView. A workaround is to make your own.&lt;br /&gt;
&lt;br /&gt;
=== SortFilterModel ===&lt;br /&gt;
SortFilterModel is a proxy model for easy sorting and/or filtering of the items in a DataModel (or any other QAbstractItemModel subclass that has been registered in QML with setContextProperty from a C++ application)&lt;br /&gt;
Properties:&lt;br /&gt;
* model '''sourceModel'''&lt;br /&gt;
* String '''filterRegExp'''&lt;br /&gt;
* String '''filterRole'''&lt;br /&gt;
* String '''sortRole'''&lt;br /&gt;
* Qt::SortOrder '''sortOrder'''&lt;br /&gt;
* int '''count''' (read only)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Popup Applet ==&lt;br /&gt;
So you want your QML applet to be a popup applet, like the device notifier (an icon in the panel shows and expands the applet)?&lt;br /&gt;
&lt;br /&gt;
Why, that's easy.&lt;br /&gt;
&lt;br /&gt;
To change your plasmoid from being a regular boring one, simply change&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
ServiceTypes=Plasma/Applet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
ServiceTypes=Plasma/Applet,Plasma/PopupApplet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then in the main QML item's Component.onCompleted, do:&lt;br /&gt;
&lt;br /&gt;
NOTE: the below code presently has no affect, yet the icons seems to get retrieved from the desktop file (FIXME - is this needed?).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    plasmoid.popupIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Plasma Themes ==&lt;br /&gt;
&lt;br /&gt;
=== Theme ===&lt;br /&gt;
This class instantiable from QML provides access to the Plasma Theme colors and other facilities such as fonts.&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* String '''themeName''' (read only)&lt;br /&gt;
* QFont '''font''' (read only)&lt;br /&gt;
* bool '''windowTranslucentEnabled''' (read only)&lt;br /&gt;
* Url '''homepage''' (read only)&lt;br /&gt;
* bool '''useGlobalSettings''' (read only)&lt;br /&gt;
* QString '''wallpaperPath''' (read only)&lt;br /&gt;
* color '''textColor''' (read only)&lt;br /&gt;
* color '''highlightColor''' (read only)&lt;br /&gt;
* color '''backgroundColor''' (read only)&lt;br /&gt;
* color '''buttonTextColor''' (read only)&lt;br /&gt;
* color '''buttonBackgroundColor''' (read only)&lt;br /&gt;
* color '''linkColor''' (read only)&lt;br /&gt;
* color visitedLinkColor''' (read only)&lt;br /&gt;
* color '''visitedLinkColor''' (read only)&lt;br /&gt;
* color '''buttonHoverColor''' (read only)&lt;br /&gt;
* color '''buttonFocusColor''' (read only)&lt;br /&gt;
* color '''viewTextColor''' (read only)&lt;br /&gt;
* color '''viewBackgroundColor''' (read only)&lt;br /&gt;
* color '''viewHoverColor''' (read only)&lt;br /&gt;
* color '''viewFocusColor''' (read only)&lt;br /&gt;
* String '''styleSheet''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== Svg ===&lt;br /&gt;
Declaring a Svg element instantiates a Plasma Svg instance. This class doesn't draw anything. For drawing, SvgItem is used.&lt;br /&gt;
Properties:&lt;br /&gt;
* QSize '''size'''&lt;br /&gt;
* bool '''multipleImages'''&lt;br /&gt;
* String '''imagePath'''&lt;br /&gt;
* bool '''usingRenderingCache'''&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPixmap pixmap(QString elementID)&lt;br /&gt;
* void resize(qreal width, qreal height)&lt;br /&gt;
* void resize(): resets the image to its default dimension&lt;br /&gt;
* QSize elementSize(QString elementId)&lt;br /&gt;
* QRectF elementRect(QString elementId)&lt;br /&gt;
* bool hasElement(QString elementId)&lt;br /&gt;
* bool isValid(): true if valid svg file&lt;br /&gt;
&lt;br /&gt;
Sample Code:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    PlasmaCore.Svg {&lt;br /&gt;
        id: mySvg&lt;br /&gt;
        imagePath: &amp;quot;widgets/line&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
'''imagePath''' can be anything in the '''desktoptheme/''' folder. For more information on what is available, see [http://techbase.kde.org/Projects/Plasma/Theme#Current_Theme_Elements Plasma Theme Elements]&lt;br /&gt;
&lt;br /&gt;
=== SvgItem ===&lt;br /&gt;
It's a graphical element that will actually paint a Svg instance.&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''elementId''': what element to render. If null, the whole svg will be rendered&lt;br /&gt;
* Svg '''svg''': instance of the Svg class mentioned above&lt;br /&gt;
* QSizeF '''naturalSize''' (read only): default size of the Svg&lt;br /&gt;
* bool '''smooth''': paint with antialias (default false)&lt;br /&gt;
&lt;br /&gt;
=== FrameSvgItem ===&lt;br /&gt;
It's a graphical element that paints a Plasma::FrameSvg, so a rectangular image composed by 9 elements contained in a Svg file, useful for things like buttons and frames.&lt;br /&gt;
&lt;br /&gt;
Flags&lt;br /&gt;
* EnabledBorders: combination of TopBorder | BottomBorder | LeftBorder | RightBorder, NoBorder if no border of the frame is enabled&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''imagePath''': path of the file relative to the Plasma Theme, for instance &amp;quot;widgets/background&amp;quot;&lt;br /&gt;
* String '''prefix''': a FrameSvg can contain multiple frames, for instance a button contains &amp;quot;normal&amp;quot;, &amp;quot;raised&amp;quot; and &amp;quot;pressed&amp;quot;&lt;br /&gt;
* Margins '''margins''' (read only): the margins of the frame, see documentation below&lt;br /&gt;
* EnabledBorders '''enabledBorders''': what borders are enabled&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
== Top Level windows ==&lt;br /&gt;
&lt;br /&gt;
=== Dialog ===&lt;br /&gt;
Dialog instantiates a Plasma::Dialog, it will be a Plasma themed top level window that can contain any QML component.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item mainItem: the Item contained in the Dialog, it can be any QML Item instance&lt;br /&gt;
* bool '''visible''': if the window (not the mainItem) is visible&lt;br /&gt;
* int '''x''': x position of the window in screen coordinates&lt;br /&gt;
* int '''y''': y position of the window in screen coordinates&lt;br /&gt;
* int '''width''' (read only): total width of the dialog, including margins&lt;br /&gt;
* int '''height''' (read only): total height of the dialog, including margins&lt;br /&gt;
* int '''windowFlags''': Qt window flags of the Dialog&lt;br /&gt;
* Margins '''margins''' (read only): margins of the Dialog&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPoint popupPosition(Item item, Qt::Alignment alignment=Qt::AlignLeft): the suggested position for the Dialog if it has to be correctly placed as popup of the QML item passed as parameter.&lt;br /&gt;
* void setAttribute(Qt::WindowAttribute attribute, bool on): set an attribute for the dialog window&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== ToolTip ===&lt;br /&gt;
Declaring a ToolTip instance makes it possible to use Plasma tooltips with any QML item.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item '''target''': the QML item we want to show a tooltip of&lt;br /&gt;
* String '''mainText'''&lt;br /&gt;
* String '''subText'''&lt;br /&gt;
* String '''image''': freedesktop compliant icon name as image of the tooltip&lt;br /&gt;
&lt;br /&gt;
= Plasma QtComponents (4.8) =&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/API</id>
		<title>Development/Tutorials/Plasma/QML/API</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/API"/>
				<updated>2011-08-19T00:10:28Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* Svg */ code sample for Svg, as well as link to more information&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction to the Plasmoid QML Declarative API  =&lt;br /&gt;
&lt;br /&gt;
This document provides an overview/reference of the Declarative QML API for Plasmoids. It isn't a full binding to all of Qt or KDE's libraries, but a focused set of bindings designed to make writing Plasmoids fast and easy, while remaining powerful.&lt;br /&gt;
&lt;br /&gt;
The API in this documentation covers the API of the Plasma specific QML components, so only the Declarative part of the API.&lt;br /&gt;
&lt;br /&gt;
The QML ScriptEngine is bassed upon the Plasma JavaScript engine, making the API of the JavaScript part identical to the one of the JavaScript plasmoids engine.&lt;br /&gt;
To see the api of the global ''Plasmoid'' object, see the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#The_Global_plasmoid_Object JavaScript API] documentation.&lt;br /&gt;
(TODO: the JavaScript api paged should probably be copied and stripped down the imperative bits not present there, it would make harder to update tough)&lt;br /&gt;
&lt;br /&gt;
== What Is a Declarative Plasmoid?  ==&lt;br /&gt;
&lt;br /&gt;
To denote that this Plasmoid is a Declarative widget, ensure that in the metadata.desktop file there is this line: &lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
&lt;br /&gt;
What follows is a description of the Plasma declarative classes instantiable from QML.&lt;br /&gt;
&lt;br /&gt;
= Main QML classes =&lt;br /&gt;
&lt;br /&gt;
== Data engines ==&lt;br /&gt;
While it's possible to fetch data from a Plasma DataEngine in the same way as the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#DataEngine JavaScript API], however it is preferrable to use the following declarative classes:&lt;br /&gt;
&lt;br /&gt;
=== DataSource ===&lt;br /&gt;
DataSource is a receiver for a dataEngine and can be declared inside QML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
 PlasmaCore.DataSource {&lt;br /&gt;
     id: dataSource&lt;br /&gt;
     engine: &amp;quot;time&amp;quot;&lt;br /&gt;
     connectedSources: [&amp;quot;Local&amp;quot;]&lt;br /&gt;
     interval: 500&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Properties ====&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* bool '''valid''' (read only): true when the DataSource is successfully connected to a data engine&lt;br /&gt;
* int '''interval''': interval of polling of the dataengine, if 0 (default value) no polling will be executed&lt;br /&gt;
* string '''engine''': the plugin name of the dataengine to load&lt;br /&gt;
* Array(string) '''connectedSources''': all the sources of the dataengine we are connected to (and whose data will appear in the '''data''' property)&lt;br /&gt;
* Array(string) '''sources''' (read only): all the sources available from the dataengine&lt;br /&gt;
* variant map '''data''' (read only): It's the most important property, it's a map of all the data available from the dataengine: its structure will be as follows:&lt;br /&gt;
** each key of the map will be a source name, in '''connectedSources'''&lt;br /&gt;
** each value will be a variant hash, so an hash with strings as keys and any variant as value&lt;br /&gt;
** example: dataSource.data[&amp;quot;Local&amp;quot;][&amp;quot;Time&amp;quot;] indicates the '''Time''' key of the dataengine source called &amp;quot;Local&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Signals ====&lt;br /&gt;
It has the following signals:&lt;br /&gt;
&lt;br /&gt;
Note that javascript/qml applies the 'on' prefix to signals. So the actual signal name in C++ which is e.g. '''newData''(...) becomes '''onNewData'''(...).&lt;br /&gt;
&lt;br /&gt;
* '''onNewData'''(String sourceName, Plasma::DataEngine::Data data)&lt;br /&gt;
* '''onSourceAdded'''(String source)&lt;br /&gt;
* '''onSourceRemoved'''(String source)&lt;br /&gt;
* '''onSourceConnected'''(String source)&lt;br /&gt;
* '''onSourceDisconnected'''(String source)&lt;br /&gt;
* '''onIntervalChanged'''()&lt;br /&gt;
* '''onEngineChanged'''()&lt;br /&gt;
* '''onDataChanged'''()&lt;br /&gt;
* '''onConnectedSourcesChanged'''()&lt;br /&gt;
* '''onSourcesChanged'''()&lt;br /&gt;
&lt;br /&gt;
==== Methods ====&lt;br /&gt;
It has the following methods:&lt;br /&gt;
* StringList keysForSource(String source): lists all the keys corresponding to a certain source: for instance in the &amp;quot;time&amp;quot; dataengine, for the &amp;quot;Local&amp;quot; source, keys will be:&lt;br /&gt;
** &amp;quot;Timezone Continent&amp;quot;&lt;br /&gt;
** &amp;quot;Offset&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone&amp;quot;&lt;br /&gt;
** &amp;quot;Time&amp;quot;&lt;br /&gt;
** &amp;quot;Date&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone City&amp;quot;&lt;br /&gt;
* Service serviceForSource(String source): returns a Plasma service that corresponds a given source: see the section about services for how to use it.&lt;br /&gt;
* void connectSource(String source): adds to '''connectedSources''' the new source&lt;br /&gt;
* void disconnectSource(String source): removes that source from '''connectedSources'''&lt;br /&gt;
&lt;br /&gt;
=== Service ===&lt;br /&gt;
Due to their imperative nature, Plasma Services are not instantiated as QML classes, but rather created out of a '''DataSource''' with the method '''serviceForSource''' and used in the JavaScript portions of the QML files.&lt;br /&gt;
This following example is a simplified version from the Now Playing QML widget in the kdeexamples git repository: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var service = dataSource.serviceForSource(activeSource)&lt;br /&gt;
  var operation = service.operationDescription(&amp;quot;seek&amp;quot;)&lt;br /&gt;
  operation.seconds = 10&lt;br /&gt;
&lt;br /&gt;
  var job = service.startOperationCall(operation)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Here dataSource is the id of a DataSource object, and activeSource is a source contained in one of its '''connectedSources'''.&lt;br /&gt;
The service provides an operation called &amp;quot;seek&amp;quot;, with a parameter called &amp;quot;seconds&amp;quot;, that can be written on it as a property of a JavaScript object.&lt;br /&gt;
&lt;br /&gt;
=== ServiceJob ===&lt;br /&gt;
If is necessary to monitor the result of a Service operation, it's possible to connect to the '''finished''' signal provided by the job return paramenter of the '''startOperationCall''' service method.&lt;br /&gt;
The '''finished''' signal has the same job as parameter, from which is possible to check the variant '''result''' property, to check the result.&lt;br /&gt;
&lt;br /&gt;
=== DataModel ===&lt;br /&gt;
Some data engines return as their data something that can be interpreted as a list of items, rather than simple key/value pairs.&lt;br /&gt;
QML provides some item views such as '''ListView''', '''GridView''' and '''Repeater'''.&lt;br /&gt;
The '''DataModel''' QML object can provide, based on a DataSource a model suitable for those QML item views.&lt;br /&gt;
&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* DataSource '''dataSource''': the id of an existing (and connected) DataSource&lt;br /&gt;
* String '''sourceFilter''': it's a regular expression. If the DataSource is connected to more than one source, only inserts data from sources matching this filter expression in the model. To, for example, have a source watch all sources beginning with say &amp;quot;name:&amp;quot;, the required regexp would be sourceFilter: &amp;quot;name:.*&amp;quot;&lt;br /&gt;
* String '''keyRoleFilter''': it's a regular expression. Only data with keys that match this filter expression will be inserted in the model&lt;br /&gt;
* int '''count''' (read only): how many items are in the model&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 ListView {&lt;br /&gt;
   model: PlasmaCore.DataModel {&lt;br /&gt;
        dataSource: microblogSource&lt;br /&gt;
        keyRoleFilter: &amp;quot;[\\d]*&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    delegate: Text {&lt;br /&gt;
        text: title&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the example, ''microblogSource'' is the id of a DataSource, and inserts in the model only entries that have a number as the key name (matched with [\\d]*, in this case tweets ids)&lt;br /&gt;
&lt;br /&gt;
Each item in the model will have the form of a variant hash: all the keys of the hash will be registered as model role names, in the example, &amp;quot;title&amp;quot; is a role of the model containing a string (also reachable with model[&amp;quot;title&amp;quot;]).&lt;br /&gt;
&lt;br /&gt;
A special reserved role will always be present: '''&amp;quot;DataEngineSource&amp;quot;''': it will contain the name of the data engine source that gave origin to this item. Therefore, if you want merely the string of the current source that the model is at...do model[&amp;quot;DataEngineSource&amp;quot;].&lt;br /&gt;
&lt;br /&gt;
Note that view.currentItem holds the item currently selected. However, due to (http://bugreports.qt.nokia.com/browse/QTBUG-16347) this does not work in PathView. A workaround is to make your own.&lt;br /&gt;
&lt;br /&gt;
=== SortFilterModel ===&lt;br /&gt;
SortFilterModel is a proxy model for easy sorting and/or filtering of the items in a DataModel (or any other QAbstractItemModel subclass that has been registered in QML with setContextProperty from a C++ application)&lt;br /&gt;
Properties:&lt;br /&gt;
* model '''sourceModel'''&lt;br /&gt;
* String '''filterRegExp'''&lt;br /&gt;
* String '''filterRole'''&lt;br /&gt;
* String '''sortRole'''&lt;br /&gt;
* Qt::SortOrder '''sortOrder'''&lt;br /&gt;
* int '''count''' (read only)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Popup Applet ==&lt;br /&gt;
So you want your QML applet to be a popup applet, like the device notifier (an icon in the panel shows and expands the applet)?&lt;br /&gt;
&lt;br /&gt;
Why, that's easy.&lt;br /&gt;
&lt;br /&gt;
To change your plasmoid from being a regular boring one, simply change&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
ServiceTypes=Plasma/Applet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
ServiceTypes=Plasma/Applet,Plasma/PopupApplet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then in the main QML item's Component.onCompleted, do:&lt;br /&gt;
&lt;br /&gt;
NOTE: the below code presently has no affect, yet the icons seems to get retrieved from the desktop file (FIXME - is this needed?).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    plasmoid.popupIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Plasma Themes ==&lt;br /&gt;
&lt;br /&gt;
=== Theme ===&lt;br /&gt;
This class instantiable from QML provides access to the Plasma Theme colors and other facilities such as fonts.&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* String '''themeName''' (read only)&lt;br /&gt;
* QFont '''font''' (read only)&lt;br /&gt;
* bool '''windowTranslucentEnabled''' (read only)&lt;br /&gt;
* Url '''homepage''' (read only)&lt;br /&gt;
* bool '''useGlobalSettings''' (read only)&lt;br /&gt;
* QString '''wallpaperPath''' (read only)&lt;br /&gt;
* color '''textColor''' (read only)&lt;br /&gt;
* color '''highlightColor''' (read only)&lt;br /&gt;
* color '''backgroundColor''' (read only)&lt;br /&gt;
* color '''buttonTextColor''' (read only)&lt;br /&gt;
* color '''buttonBackgroundColor''' (read only)&lt;br /&gt;
* color '''linkColor''' (read only)&lt;br /&gt;
* color visitedLinkColor''' (read only)&lt;br /&gt;
* color '''visitedLinkColor''' (read only)&lt;br /&gt;
* color '''buttonHoverColor''' (read only)&lt;br /&gt;
* color '''buttonFocusColor''' (read only)&lt;br /&gt;
* color '''viewTextColor''' (read only)&lt;br /&gt;
* color '''viewBackgroundColo''' (read only)r&lt;br /&gt;
* color '''viewHoverColor''' (read only)&lt;br /&gt;
* color '''viewFocusColor''' (read only)&lt;br /&gt;
* String '''styleSheet''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== Svg ===&lt;br /&gt;
Declaring a Svg element instantiates a Plasma Svg instance. This class doesn't draw anything. For drawing, SvgItem is used.&lt;br /&gt;
Properties:&lt;br /&gt;
* QSize '''size'''&lt;br /&gt;
* bool '''multipleImages'''&lt;br /&gt;
* String '''imagePath'''&lt;br /&gt;
* bool '''usingRenderingCache'''&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPixmap pixmap(QString elementID)&lt;br /&gt;
* void resize(qreal width, qreal height)&lt;br /&gt;
* void resize(): resets the image to its default dimension&lt;br /&gt;
* QSize elementSize(QString elementId)&lt;br /&gt;
* QRectF elementRect(QString elementId)&lt;br /&gt;
* bool hasElement(QString elementId)&lt;br /&gt;
* bool isValid(): true if valid svg file&lt;br /&gt;
&lt;br /&gt;
Sample Code:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    PlasmaCore.Svg {&lt;br /&gt;
        id: mySvg&lt;br /&gt;
        imagePath: &amp;quot;widgets/line&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
'''imagePath''' can be anything in the '''desktoptheme/''' folder. For more information on what is available, see [http://techbase.kde.org/Projects/Plasma/Theme#Current_Theme_Elements Plasma Theme Elements]&lt;br /&gt;
&lt;br /&gt;
=== SvgItem ===&lt;br /&gt;
It's a graphical element that will actually paint a Svg instance.&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''elementId''': what element to render. If null, the whole svg will be rendered&lt;br /&gt;
* Svg '''svg''': instance of the Svg class mentioned above&lt;br /&gt;
* QSizeF '''naturalSize''' (read only): default size of the Svg&lt;br /&gt;
* bool '''smooth''': paint with antialias (default false)&lt;br /&gt;
&lt;br /&gt;
=== FrameSvgItem ===&lt;br /&gt;
It's a graphical element that paints a Plasma::FrameSvg, so a rectangular image composed by 9 elements contained in a Svg file, useful for things like buttons and frames.&lt;br /&gt;
&lt;br /&gt;
Flags&lt;br /&gt;
* EnabledBorders: combination of TopBorder | BottomBorder | LeftBorder | RightBorder, NoBorder if no border of the frame is enabled&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''imagePath''': path of the file relative to the Plasma Theme, for instance &amp;quot;widgets/background&amp;quot;&lt;br /&gt;
* String '''prefix''': a FrameSvg can contain multiple frames, for instance a button contains &amp;quot;normal&amp;quot;, &amp;quot;raised&amp;quot; and &amp;quot;pressed&amp;quot;&lt;br /&gt;
* Margins '''margins''' (read only): the margins of the frame, see documentation below&lt;br /&gt;
* EnabledBorders '''enabledBorders''': what borders are enabled&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
== Top Level windows ==&lt;br /&gt;
&lt;br /&gt;
=== Dialog ===&lt;br /&gt;
Dialog instantiates a Plasma::Dialog, it will be a Plasma themed top level window that can contain any QML component.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item mainItem: the Item contained in the Dialog, it can be any QML Item instance&lt;br /&gt;
* bool '''visible''': if the window (not the mainItem) is visible&lt;br /&gt;
* int '''x''': x position of the window in screen coordinates&lt;br /&gt;
* int '''y''': y position of the window in screen coordinates&lt;br /&gt;
* int '''width''' (read only): total width of the dialog, including margins&lt;br /&gt;
* int '''height''' (read only): total height of the dialog, including margins&lt;br /&gt;
* int '''windowFlags''': Qt window flags of the Dialog&lt;br /&gt;
* Margins '''margins''' (read only): margins of the Dialog&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPoint popupPosition(Item item, Qt::Alignment alignment=Qt::AlignLeft): the suggested position for the Dialog if it has to be correctly placed as popup of the QML item passed as parameter.&lt;br /&gt;
* void setAttribute(Qt::WindowAttribute attribute, bool on): set an attribute for the dialog window&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== ToolTip ===&lt;br /&gt;
Declaring a ToolTip instance makes it possible to use Plasma tooltips with any QML item.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item '''target''': the QML item we want to show a tooltip of&lt;br /&gt;
* String '''mainText'''&lt;br /&gt;
* String '''subText'''&lt;br /&gt;
* String '''image''': freedesktop compliant icon name as image of the tooltip&lt;br /&gt;
&lt;br /&gt;
= Plasma QtComponents (4.8) =&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/API</id>
		<title>Development/Tutorials/Plasma/QML/API</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/API"/>
				<updated>2011-08-19T00:04:33Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* Svg */ gram&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction to the Plasmoid QML Declarative API  =&lt;br /&gt;
&lt;br /&gt;
This document provides an overview/reference of the Declarative QML API for Plasmoids. It isn't a full binding to all of Qt or KDE's libraries, but a focused set of bindings designed to make writing Plasmoids fast and easy, while remaining powerful.&lt;br /&gt;
&lt;br /&gt;
The API in this documentation covers the API of the Plasma specific QML components, so only the Declarative part of the API.&lt;br /&gt;
&lt;br /&gt;
The QML ScriptEngine is bassed upon the Plasma JavaScript engine, making the API of the JavaScript part identical to the one of the JavaScript plasmoids engine.&lt;br /&gt;
To see the api of the global ''Plasmoid'' object, see the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#The_Global_plasmoid_Object JavaScript API] documentation.&lt;br /&gt;
(TODO: the JavaScript api paged should probably be copied and stripped down the imperative bits not present there, it would make harder to update tough)&lt;br /&gt;
&lt;br /&gt;
== What Is a Declarative Plasmoid?  ==&lt;br /&gt;
&lt;br /&gt;
To denote that this Plasmoid is a Declarative widget, ensure that in the metadata.desktop file there is this line: &lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
&lt;br /&gt;
What follows is a description of the Plasma declarative classes instantiable from QML.&lt;br /&gt;
&lt;br /&gt;
= Main QML classes =&lt;br /&gt;
&lt;br /&gt;
== Data engines ==&lt;br /&gt;
While it's possible to fetch data from a Plasma DataEngine in the same way as the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#DataEngine JavaScript API], however it is preferrable to use the following declarative classes:&lt;br /&gt;
&lt;br /&gt;
=== DataSource ===&lt;br /&gt;
DataSource is a receiver for a dataEngine and can be declared inside QML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
 PlasmaCore.DataSource {&lt;br /&gt;
     id: dataSource&lt;br /&gt;
     engine: &amp;quot;time&amp;quot;&lt;br /&gt;
     connectedSources: [&amp;quot;Local&amp;quot;]&lt;br /&gt;
     interval: 500&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Properties ====&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* bool '''valid''' (read only): true when the DataSource is successfully connected to a data engine&lt;br /&gt;
* int '''interval''': interval of polling of the dataengine, if 0 (default value) no polling will be executed&lt;br /&gt;
* string '''engine''': the plugin name of the dataengine to load&lt;br /&gt;
* Array(string) '''connectedSources''': all the sources of the dataengine we are connected to (and whose data will appear in the '''data''' property)&lt;br /&gt;
* Array(string) '''sources''' (read only): all the sources available from the dataengine&lt;br /&gt;
* variant map '''data''' (read only): It's the most important property, it's a map of all the data available from the dataengine: its structure will be as follows:&lt;br /&gt;
** each key of the map will be a source name, in '''connectedSources'''&lt;br /&gt;
** each value will be a variant hash, so an hash with strings as keys and any variant as value&lt;br /&gt;
** example: dataSource.data[&amp;quot;Local&amp;quot;][&amp;quot;Time&amp;quot;] indicates the '''Time''' key of the dataengine source called &amp;quot;Local&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Signals ====&lt;br /&gt;
It has the following signals:&lt;br /&gt;
&lt;br /&gt;
Note that javascript/qml applies the 'on' prefix to signals. So the actual signal name in C++ which is e.g. '''newData''(...) becomes '''onNewData'''(...).&lt;br /&gt;
&lt;br /&gt;
* '''onNewData'''(String sourceName, Plasma::DataEngine::Data data)&lt;br /&gt;
* '''onSourceAdded'''(String source)&lt;br /&gt;
* '''onSourceRemoved'''(String source)&lt;br /&gt;
* '''onSourceConnected'''(String source)&lt;br /&gt;
* '''onSourceDisconnected'''(String source)&lt;br /&gt;
* '''onIntervalChanged'''()&lt;br /&gt;
* '''onEngineChanged'''()&lt;br /&gt;
* '''onDataChanged'''()&lt;br /&gt;
* '''onConnectedSourcesChanged'''()&lt;br /&gt;
* '''onSourcesChanged'''()&lt;br /&gt;
&lt;br /&gt;
==== Methods ====&lt;br /&gt;
It has the following methods:&lt;br /&gt;
* StringList keysForSource(String source): lists all the keys corresponding to a certain source: for instance in the &amp;quot;time&amp;quot; dataengine, for the &amp;quot;Local&amp;quot; source, keys will be:&lt;br /&gt;
** &amp;quot;Timezone Continent&amp;quot;&lt;br /&gt;
** &amp;quot;Offset&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone&amp;quot;&lt;br /&gt;
** &amp;quot;Time&amp;quot;&lt;br /&gt;
** &amp;quot;Date&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone City&amp;quot;&lt;br /&gt;
* Service serviceForSource(String source): returns a Plasma service that corresponds a given source: see the section about services for how to use it.&lt;br /&gt;
* void connectSource(String source): adds to '''connectedSources''' the new source&lt;br /&gt;
* void disconnectSource(String source): removes that source from '''connectedSources'''&lt;br /&gt;
&lt;br /&gt;
=== Service ===&lt;br /&gt;
Due to their imperative nature, Plasma Services are not instantiated as QML classes, but rather created out of a '''DataSource''' with the method '''serviceForSource''' and used in the JavaScript portions of the QML files.&lt;br /&gt;
This following example is a simplified version from the Now Playing QML widget in the kdeexamples git repository: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var service = dataSource.serviceForSource(activeSource)&lt;br /&gt;
  var operation = service.operationDescription(&amp;quot;seek&amp;quot;)&lt;br /&gt;
  operation.seconds = 10&lt;br /&gt;
&lt;br /&gt;
  var job = service.startOperationCall(operation)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Here dataSource is the id of a DataSource object, and activeSource is a source contained in one of its '''connectedSources'''.&lt;br /&gt;
The service provides an operation called &amp;quot;seek&amp;quot;, with a parameter called &amp;quot;seconds&amp;quot;, that can be written on it as a property of a JavaScript object.&lt;br /&gt;
&lt;br /&gt;
=== ServiceJob ===&lt;br /&gt;
If is necessary to monitor the result of a Service operation, it's possible to connect to the '''finished''' signal provided by the job return paramenter of the '''startOperationCall''' service method.&lt;br /&gt;
The '''finished''' signal has the same job as parameter, from which is possible to check the variant '''result''' property, to check the result.&lt;br /&gt;
&lt;br /&gt;
=== DataModel ===&lt;br /&gt;
Some data engines return as their data something that can be interpreted as a list of items, rather than simple key/value pairs.&lt;br /&gt;
QML provides some item views such as '''ListView''', '''GridView''' and '''Repeater'''.&lt;br /&gt;
The '''DataModel''' QML object can provide, based on a DataSource a model suitable for those QML item views.&lt;br /&gt;
&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* DataSource '''dataSource''': the id of an existing (and connected) DataSource&lt;br /&gt;
* String '''sourceFilter''': it's a regular expression. If the DataSource is connected to more than one source, only inserts data from sources matching this filter expression in the model. To, for example, have a source watch all sources beginning with say &amp;quot;name:&amp;quot;, the required regexp would be sourceFilter: &amp;quot;name:.*&amp;quot;&lt;br /&gt;
* String '''keyRoleFilter''': it's a regular expression. Only data with keys that match this filter expression will be inserted in the model&lt;br /&gt;
* int '''count''' (read only): how many items are in the model&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 ListView {&lt;br /&gt;
   model: PlasmaCore.DataModel {&lt;br /&gt;
        dataSource: microblogSource&lt;br /&gt;
        keyRoleFilter: &amp;quot;[\\d]*&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    delegate: Text {&lt;br /&gt;
        text: title&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the example, ''microblogSource'' is the id of a DataSource, and inserts in the model only entries that have a number as the key name (matched with [\\d]*, in this case tweets ids)&lt;br /&gt;
&lt;br /&gt;
Each item in the model will have the form of a variant hash: all the keys of the hash will be registered as model role names, in the example, &amp;quot;title&amp;quot; is a role of the model containing a string (also reachable with model[&amp;quot;title&amp;quot;]).&lt;br /&gt;
&lt;br /&gt;
A special reserved role will always be present: '''&amp;quot;DataEngineSource&amp;quot;''': it will contain the name of the data engine source that gave origin to this item. Therefore, if you want merely the string of the current source that the model is at...do model[&amp;quot;DataEngineSource&amp;quot;].&lt;br /&gt;
&lt;br /&gt;
Note that view.currentItem holds the item currently selected. However, due to (http://bugreports.qt.nokia.com/browse/QTBUG-16347) this does not work in PathView. A workaround is to make your own.&lt;br /&gt;
&lt;br /&gt;
=== SortFilterModel ===&lt;br /&gt;
SortFilterModel is a proxy model for easy sorting and/or filtering of the items in a DataModel (or any other QAbstractItemModel subclass that has been registered in QML with setContextProperty from a C++ application)&lt;br /&gt;
Properties:&lt;br /&gt;
* model '''sourceModel'''&lt;br /&gt;
* String '''filterRegExp'''&lt;br /&gt;
* String '''filterRole'''&lt;br /&gt;
* String '''sortRole'''&lt;br /&gt;
* Qt::SortOrder '''sortOrder'''&lt;br /&gt;
* int '''count''' (read only)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Popup Applet ==&lt;br /&gt;
So you want your QML applet to be a popup applet, like the device notifier (an icon in the panel shows and expands the applet)?&lt;br /&gt;
&lt;br /&gt;
Why, that's easy.&lt;br /&gt;
&lt;br /&gt;
To change your plasmoid from being a regular boring one, simply change&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
ServiceTypes=Plasma/Applet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
ServiceTypes=Plasma/Applet,Plasma/PopupApplet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then in the main QML item's Component.onCompleted, do:&lt;br /&gt;
&lt;br /&gt;
NOTE: the below code presently has no affect, yet the icons seems to get retrieved from the desktop file (FIXME - is this needed?).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    plasmoid.popupIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Plasma Themes ==&lt;br /&gt;
&lt;br /&gt;
=== Theme ===&lt;br /&gt;
This class instantiable from QML provides access to the Plasma Theme colors and other facilities such as fonts.&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* String '''themeName''' (read only)&lt;br /&gt;
* QFont '''font''' (read only)&lt;br /&gt;
* bool '''windowTranslucentEnabled''' (read only)&lt;br /&gt;
* Url '''homepage''' (read only)&lt;br /&gt;
* bool '''useGlobalSettings''' (read only)&lt;br /&gt;
* QString '''wallpaperPath''' (read only)&lt;br /&gt;
* color '''textColor''' (read only)&lt;br /&gt;
* color '''highlightColor''' (read only)&lt;br /&gt;
* color '''backgroundColor''' (read only)&lt;br /&gt;
* color '''buttonTextColor''' (read only)&lt;br /&gt;
* color '''buttonBackgroundColor''' (read only)&lt;br /&gt;
* color '''linkColor''' (read only)&lt;br /&gt;
* color visitedLinkColor''' (read only)&lt;br /&gt;
* color '''visitedLinkColor''' (read only)&lt;br /&gt;
* color '''buttonHoverColor''' (read only)&lt;br /&gt;
* color '''buttonFocusColor''' (read only)&lt;br /&gt;
* color '''viewTextColor''' (read only)&lt;br /&gt;
* color '''viewBackgroundColo''' (read only)r&lt;br /&gt;
* color '''viewHoverColor''' (read only)&lt;br /&gt;
* color '''viewFocusColor''' (read only)&lt;br /&gt;
* String '''styleSheet''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== Svg ===&lt;br /&gt;
Declaring a Svg element instantiates a Plasma Svg instance. This class doesn't draw anything. For drawing, SvgItem is used.&lt;br /&gt;
Properties:&lt;br /&gt;
* QSize '''size'''&lt;br /&gt;
* bool '''multipleImages'''&lt;br /&gt;
* String '''imagePath'''&lt;br /&gt;
* bool '''usingRenderingCache'''&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPixmap pixmap(QString elementID)&lt;br /&gt;
* void resize(qreal width, qreal height)&lt;br /&gt;
* void resize(): resets the image to its default dimension&lt;br /&gt;
* QSize elementSize(QString elementId)&lt;br /&gt;
* QRectF elementRect(QString elementId)&lt;br /&gt;
* bool hasElement(QString elementId)&lt;br /&gt;
* bool isValid(): true if valid svg file&lt;br /&gt;
&lt;br /&gt;
=== SvgItem ===&lt;br /&gt;
It's a graphical element that will actually paint a Svg instance.&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''elementId''': what element to render. If null, the whole svg will be rendered&lt;br /&gt;
* Svg '''svg''': instance of the Svg class mentioned above&lt;br /&gt;
* QSizeF '''naturalSize''' (read only): default size of the Svg&lt;br /&gt;
* bool '''smooth''': paint with antialias (default false)&lt;br /&gt;
&lt;br /&gt;
=== FrameSvgItem ===&lt;br /&gt;
It's a graphical element that paints a Plasma::FrameSvg, so a rectangular image composed by 9 elements contained in a Svg file, useful for things like buttons and frames.&lt;br /&gt;
&lt;br /&gt;
Flags&lt;br /&gt;
* EnabledBorders: combination of TopBorder | BottomBorder | LeftBorder | RightBorder, NoBorder if no border of the frame is enabled&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''imagePath''': path of the file relative to the Plasma Theme, for instance &amp;quot;widgets/background&amp;quot;&lt;br /&gt;
* String '''prefix''': a FrameSvg can contain multiple frames, for instance a button contains &amp;quot;normal&amp;quot;, &amp;quot;raised&amp;quot; and &amp;quot;pressed&amp;quot;&lt;br /&gt;
* Margins '''margins''' (read only): the margins of the frame, see documentation below&lt;br /&gt;
* EnabledBorders '''enabledBorders''': what borders are enabled&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
== Top Level windows ==&lt;br /&gt;
&lt;br /&gt;
=== Dialog ===&lt;br /&gt;
Dialog instantiates a Plasma::Dialog, it will be a Plasma themed top level window that can contain any QML component.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item mainItem: the Item contained in the Dialog, it can be any QML Item instance&lt;br /&gt;
* bool '''visible''': if the window (not the mainItem) is visible&lt;br /&gt;
* int '''x''': x position of the window in screen coordinates&lt;br /&gt;
* int '''y''': y position of the window in screen coordinates&lt;br /&gt;
* int '''width''' (read only): total width of the dialog, including margins&lt;br /&gt;
* int '''height''' (read only): total height of the dialog, including margins&lt;br /&gt;
* int '''windowFlags''': Qt window flags of the Dialog&lt;br /&gt;
* Margins '''margins''' (read only): margins of the Dialog&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPoint popupPosition(Item item, Qt::Alignment alignment=Qt::AlignLeft): the suggested position for the Dialog if it has to be correctly placed as popup of the QML item passed as parameter.&lt;br /&gt;
* void setAttribute(Qt::WindowAttribute attribute, bool on): set an attribute for the dialog window&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== ToolTip ===&lt;br /&gt;
Declaring a ToolTip instance makes it possible to use Plasma tooltips with any QML item.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item '''target''': the QML item we want to show a tooltip of&lt;br /&gt;
* String '''mainText'''&lt;br /&gt;
* String '''subText'''&lt;br /&gt;
* String '''image''': freedesktop compliant icon name as image of the tooltip&lt;br /&gt;
&lt;br /&gt;
= Plasma QtComponents (4.8) =&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted</id>
		<title>Development/Tutorials/Plasma/QML/GettingStarted</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted"/>
				<updated>2011-08-19T00:03:46Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* Plasma specific imports */ clarify&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Writing a plasma applet in QML is very easy, in fact, with KDE 4.6 and Qt 4.7 it just works.&lt;br /&gt;
&lt;br /&gt;
== QML Basics ==&lt;br /&gt;
&lt;br /&gt;
It is recommended that you have read through the [http://doc.qt.nokia.com/4.7/qtquick.html Qt QML Tutorials], as there are quite a few and they are explained thoroughly. There is also a list of all [http://doc.qt.nokia.com/4.7/qdeclarativeelements.html standard QML elements].&lt;br /&gt;
&lt;br /&gt;
Essentially, most of the content is the same. The exceptions to be noted are how data is gathered...since we use Data Engines, it is a bit different. Text color and font should be made to use PlasmaCore.Theme.&lt;br /&gt;
&lt;br /&gt;
See the [https://projects.kde.org/projects/kde/kdeexamples/repository KDE Examples] repository for more KDE-related helpful resources. Also of use (which use QML and Plasma) are: [https://projects.kde.org/projects/playground/base/plasma-mobile/repository Plasma Mobile], [https://projects.kde.org/projects/playground/base/declarative-plasmoids/repository Declarative Plasmoids (playground)], for WIP ports of C++ originals&lt;br /&gt;
&lt;br /&gt;
=== Root Item ===&lt;br /&gt;
&lt;br /&gt;
The root item can be anything that inherits QGraphicsItem. For example, in this case it is QGraphicsWidget which is a plasmoid. It can also simply be an Item. I also noticed that PathView does not respond to mouse inputs automatically (so flicking doesn't work). Probably because events are being intercepted. So take note, it'll have to be e.g. an Item, for that case.&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
&lt;br /&gt;
==== Row and Column ====&lt;br /&gt;
&lt;br /&gt;
==== Anchors ====&lt;br /&gt;
Anchor layouts offer a nice way of grouping UI elements nicely together. The idea is that you connect edges or corners of one element to the edge or corner of another widget.&lt;br /&gt;
Some examples:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 200&lt;br /&gt;
    height: 300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Text {&lt;br /&gt;
        id: first&lt;br /&gt;
        text: i18n(&amp;quot;1st line&amp;quot;)&lt;br /&gt;
        anchors { top: parent.top;&lt;br /&gt;
                  left: parent.left;&lt;br /&gt;
                  right: parent.right;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    Text {&lt;br /&gt;
        id: second&lt;br /&gt;
        text: i18n(&amp;quot;2nd line&amp;quot;)&lt;br /&gt;
        anchors { top: first.bottom;&lt;br /&gt;
                  left: parent.left;&lt;br /&gt;
                  right: parent.right;&lt;br /&gt;
                  bottom: parent.bottom;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Buttons ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Animations ===&lt;br /&gt;
&lt;br /&gt;
== Package Structure ==&lt;br /&gt;
&lt;br /&gt;
You create a .desktop file and the .qml file. They have to be in the usual plasma package structure.&lt;br /&gt;
&lt;br /&gt;
plasmoid-qml/metadata.desktop&lt;br /&gt;
plasmoid-qml/contents/ui/main.qml&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;metadata.desktop&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Name=Hello QML&lt;br /&gt;
Comment=A hello world widget in QML&lt;br /&gt;
Icon=chronometer&lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
X-Plasma-MainScript=ui/main.qml&lt;br /&gt;
X-Plasma-DefaultSize=200,100&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Author=Frederik Gladhorn&lt;br /&gt;
X-KDE-PluginInfo-Email=gladhorn@kde.org&lt;br /&gt;
X-KDE-PluginInfo-Website=http://plasma.kde.org/&lt;br /&gt;
X-KDE-PluginInfo-Category=Examples&lt;br /&gt;
X-KDE-PluginInfo-Name=org.kde.hello-qml&lt;br /&gt;
X-KDE-PluginInfo-Version=0.0&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Depends=&lt;br /&gt;
X-KDE-PluginInfo-License=GPL&lt;br /&gt;
X-KDE-PluginInfo-EnabledByDefault=true&lt;br /&gt;
X-KDE-ServiceTypes=Plasma/Applet&lt;br /&gt;
Type=Service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  &amp;lt;tt&amp;gt;main.qml&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing ==&lt;br /&gt;
You can install your plasmoid:&lt;br /&gt;
plasmapkg --install plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
== plasmoidviewer ==&lt;br /&gt;
You can run it in plasmoidviewer as usual:&lt;br /&gt;
plasmoidviewer plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
== qmlviewer ==&lt;br /&gt;
It's possible to use Plasma specific imports in qml files loaded by qmlviewer:&lt;br /&gt;
&lt;br /&gt;
qmlviewer -I /usr/lib/kde4/imports/ plasmoid-qml/contents/qml/main.qml &lt;br /&gt;
&lt;br /&gt;
Where the -I is the path to the plasma plugin for qml. Try to look for the path of &lt;br /&gt;
/usr/lib/kde4/imports/org/kde/plasma/graphicswidgets/libgraphicswidgetsbindingsplugin.so&lt;br /&gt;
and use everything up to org of that path.&lt;br /&gt;
&lt;br /&gt;
Hovewer it's '''strongly discouraged''' to use qmlviewer to develop plasmoids, because some features won't be available there:&lt;br /&gt;
* localization with i18n()&lt;br /&gt;
* access to the global ''plasmoid'' object&lt;br /&gt;
* device specific qml files imported with plasmapackage:// urls&lt;br /&gt;
* bindings for qicons, KJobs, services and KConfig&lt;br /&gt;
&lt;br /&gt;
= Features only available in Plasma widgets =&lt;br /&gt;
In order to have a better integration with the KDE platform and to reach an higher degree of expressivity, the stock features of QML have been expanded with the following features, that strictly follow the Plasmoid JavaScript API:&lt;br /&gt;
&lt;br /&gt;
== Minimum size ==&lt;br /&gt;
if the root object of the plasmoid has the properties minimumWidth and minimumHeight, they will be used as the minimum size for the plasmoid. If they will change during the plasmoid execution, the plasmoid minimum size will be updated accordingly.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    property int minimumWidth: paintedWidth&lt;br /&gt;
    property int minimumHeight: paintedHeight&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above example, the minimum size is binded to the paintedWidth/paintedHeight properties of the Text element, ensuring there will always be enough room for the whole text to be displayed.&lt;br /&gt;
&lt;br /&gt;
== Plasmoid object ==&lt;br /&gt;
Every QML plasmoid will have an object called ''plasmoid'', that will give access to the configuration, the formfactor, immutability and so on. It offers the same api as the object with the same name in the Javascript API.&lt;br /&gt;
&lt;br /&gt;
For specific info on this, see [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API-PlasmoidObject Javascript API-Plasmoid Object]&lt;br /&gt;
&lt;br /&gt;
== Localization ==&lt;br /&gt;
It's possible to localize strings with the usual i18n(), i18nc(), i18np() global functions&lt;br /&gt;
&lt;br /&gt;
== Extra types ==&lt;br /&gt;
Some extra types are available from withing JavaScript, namely&lt;br /&gt;
&lt;br /&gt;
* KConfigGroup: it's an object with its cnfig keys readable and writable as properties&lt;br /&gt;
* QIcon: can be constructed with QIcon(&amp;quot;fdo name&amp;quot;) such as QIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
* KJob&lt;br /&gt;
* Plasma Service api&lt;br /&gt;
&lt;br /&gt;
= Plasma specific imports =&lt;br /&gt;
To use some Plasma specific features and to take advantage of them in order for your applet to become a true Plasma applet, it is necessary to use some particular QML imports. See [http://techbase.kde.org/Development/Tutorials/Plasma/QML/API Plasma QML API].&lt;br /&gt;
&lt;br /&gt;
== Extra Qt features ==&lt;br /&gt;
org.kde.qtextraimports&lt;br /&gt;
To use, do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import org.kde.qtextracomponents 0.1 as QtExtraComponents&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* QPixmapItem&lt;br /&gt;
* QImageItem&lt;br /&gt;
* QIconItem&lt;br /&gt;
&lt;br /&gt;
== Plasma Widgets in QML ==&lt;br /&gt;
To use standard plasma widgets (e.g. Plasma::LineEdit, etc.), you simply add an import line for them.&lt;br /&gt;
All properties, signals and slots from ordinary Plasma widgets are available there.&lt;br /&gt;
Those widgets are provided as a transition tool, intended to be replaced by the Plasma version of QtComponents.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.graphicswidgets 0.1 as PlasmaWidgets&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 64&lt;br /&gt;
    height: 64&lt;br /&gt;
    PlasmaWidgets.IconWidget {&lt;br /&gt;
        id: icon&lt;br /&gt;
        Component.onCompleted: setIcon(&amp;quot;flag-red&amp;quot;)&lt;br /&gt;
        anchors.centerIn: parent&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted</id>
		<title>Development/Tutorials/Plasma/QML/GettingStarted</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted"/>
				<updated>2011-08-19T00:01:23Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* Plasma specific imports */ remove the dupes from QML/API, and just link to there. too much to maintain as it is...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Writing a plasma applet in QML is very easy, in fact, with KDE 4.6 and Qt 4.7 it just works.&lt;br /&gt;
&lt;br /&gt;
== QML Basics ==&lt;br /&gt;
&lt;br /&gt;
It is recommended that you have read through the [http://doc.qt.nokia.com/4.7/qtquick.html Qt QML Tutorials], as there are quite a few and they are explained thoroughly. There is also a list of all [http://doc.qt.nokia.com/4.7/qdeclarativeelements.html standard QML elements].&lt;br /&gt;
&lt;br /&gt;
Essentially, most of the content is the same. The exceptions to be noted are how data is gathered...since we use Data Engines, it is a bit different. Text color and font should be made to use PlasmaCore.Theme.&lt;br /&gt;
&lt;br /&gt;
See the [https://projects.kde.org/projects/kde/kdeexamples/repository KDE Examples] repository for more KDE-related helpful resources. Also of use (which use QML and Plasma) are: [https://projects.kde.org/projects/playground/base/plasma-mobile/repository Plasma Mobile], [https://projects.kde.org/projects/playground/base/declarative-plasmoids/repository Declarative Plasmoids (playground)], for WIP ports of C++ originals&lt;br /&gt;
&lt;br /&gt;
=== Root Item ===&lt;br /&gt;
&lt;br /&gt;
The root item can be anything that inherits QGraphicsItem. For example, in this case it is QGraphicsWidget which is a plasmoid. It can also simply be an Item. I also noticed that PathView does not respond to mouse inputs automatically (so flicking doesn't work). Probably because events are being intercepted. So take note, it'll have to be e.g. an Item, for that case.&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
&lt;br /&gt;
==== Row and Column ====&lt;br /&gt;
&lt;br /&gt;
==== Anchors ====&lt;br /&gt;
Anchor layouts offer a nice way of grouping UI elements nicely together. The idea is that you connect edges or corners of one element to the edge or corner of another widget.&lt;br /&gt;
Some examples:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 200&lt;br /&gt;
    height: 300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Text {&lt;br /&gt;
        id: first&lt;br /&gt;
        text: i18n(&amp;quot;1st line&amp;quot;)&lt;br /&gt;
        anchors { top: parent.top;&lt;br /&gt;
                  left: parent.left;&lt;br /&gt;
                  right: parent.right;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    Text {&lt;br /&gt;
        id: second&lt;br /&gt;
        text: i18n(&amp;quot;2nd line&amp;quot;)&lt;br /&gt;
        anchors { top: first.bottom;&lt;br /&gt;
                  left: parent.left;&lt;br /&gt;
                  right: parent.right;&lt;br /&gt;
                  bottom: parent.bottom;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Buttons ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Animations ===&lt;br /&gt;
&lt;br /&gt;
== Package Structure ==&lt;br /&gt;
&lt;br /&gt;
You create a .desktop file and the .qml file. They have to be in the usual plasma package structure.&lt;br /&gt;
&lt;br /&gt;
plasmoid-qml/metadata.desktop&lt;br /&gt;
plasmoid-qml/contents/ui/main.qml&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;metadata.desktop&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Name=Hello QML&lt;br /&gt;
Comment=A hello world widget in QML&lt;br /&gt;
Icon=chronometer&lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
X-Plasma-MainScript=ui/main.qml&lt;br /&gt;
X-Plasma-DefaultSize=200,100&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Author=Frederik Gladhorn&lt;br /&gt;
X-KDE-PluginInfo-Email=gladhorn@kde.org&lt;br /&gt;
X-KDE-PluginInfo-Website=http://plasma.kde.org/&lt;br /&gt;
X-KDE-PluginInfo-Category=Examples&lt;br /&gt;
X-KDE-PluginInfo-Name=org.kde.hello-qml&lt;br /&gt;
X-KDE-PluginInfo-Version=0.0&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Depends=&lt;br /&gt;
X-KDE-PluginInfo-License=GPL&lt;br /&gt;
X-KDE-PluginInfo-EnabledByDefault=true&lt;br /&gt;
X-KDE-ServiceTypes=Plasma/Applet&lt;br /&gt;
Type=Service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  &amp;lt;tt&amp;gt;main.qml&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing ==&lt;br /&gt;
You can install your plasmoid:&lt;br /&gt;
plasmapkg --install plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
== plasmoidviewer ==&lt;br /&gt;
You can run it in plasmoidviewer as usual:&lt;br /&gt;
plasmoidviewer plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
== qmlviewer ==&lt;br /&gt;
It's possible to use Plasma specific imports in qml files loaded by qmlviewer:&lt;br /&gt;
&lt;br /&gt;
qmlviewer -I /usr/lib/kde4/imports/ plasmoid-qml/contents/qml/main.qml &lt;br /&gt;
&lt;br /&gt;
Where the -I is the path to the plasma plugin for qml. Try to look for the path of &lt;br /&gt;
/usr/lib/kde4/imports/org/kde/plasma/graphicswidgets/libgraphicswidgetsbindingsplugin.so&lt;br /&gt;
and use everything up to org of that path.&lt;br /&gt;
&lt;br /&gt;
Hovewer it's '''strongly discouraged''' to use qmlviewer to develop plasmoids, because some features won't be available there:&lt;br /&gt;
* localization with i18n()&lt;br /&gt;
* access to the global ''plasmoid'' object&lt;br /&gt;
* device specific qml files imported with plasmapackage:// urls&lt;br /&gt;
* bindings for qicons, KJobs, services and KConfig&lt;br /&gt;
&lt;br /&gt;
= Features only available in Plasma widgets =&lt;br /&gt;
In order to have a better integration with the KDE platform and to reach an higher degree of expressivity, the stock features of QML have been expanded with the following features, that strictly follow the Plasmoid JavaScript API:&lt;br /&gt;
&lt;br /&gt;
== Minimum size ==&lt;br /&gt;
if the root object of the plasmoid has the properties minimumWidth and minimumHeight, they will be used as the minimum size for the plasmoid. If they will change during the plasmoid execution, the plasmoid minimum size will be updated accordingly.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    property int minimumWidth: paintedWidth&lt;br /&gt;
    property int minimumHeight: paintedHeight&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above example, the minimum size is binded to the paintedWidth/paintedHeight properties of the Text element, ensuring there will always be enough room for the whole text to be displayed.&lt;br /&gt;
&lt;br /&gt;
== Plasmoid object ==&lt;br /&gt;
Every QML plasmoid will have an object called ''plasmoid'', that will give access to the configuration, the formfactor, immutability and so on. It offers the same api as the object with the same name in the Javascript API.&lt;br /&gt;
&lt;br /&gt;
For specific info on this, see [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API-PlasmoidObject Javascript API-Plasmoid Object]&lt;br /&gt;
&lt;br /&gt;
== Localization ==&lt;br /&gt;
It's possible to localize strings with the usual i18n(), i18nc(), i18np() global functions&lt;br /&gt;
&lt;br /&gt;
== Extra types ==&lt;br /&gt;
Some extra types are available from withing JavaScript, namely&lt;br /&gt;
&lt;br /&gt;
* KConfigGroup: it's an object with its cnfig keys readable and writable as properties&lt;br /&gt;
* QIcon: can be constructed with QIcon(&amp;quot;fdo name&amp;quot;) such as QIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
* KJob&lt;br /&gt;
* Plasma Service api&lt;br /&gt;
&lt;br /&gt;
= Plasma specific imports =&lt;br /&gt;
To use some Plasma specific features it is necessary to use some particular QML imports. See [http://techbase.kde.org/Development/Tutorials/Plasma/QML/API Plasma QML API].&lt;br /&gt;
&lt;br /&gt;
== Extra Qt features ==&lt;br /&gt;
org.kde.qtextraimports&lt;br /&gt;
To use, do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import org.kde.qtextracomponents 0.1 as QtExtraComponents&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* QPixmapItem&lt;br /&gt;
* QImageItem&lt;br /&gt;
* QIconItem&lt;br /&gt;
&lt;br /&gt;
== Plasma Widgets in QML ==&lt;br /&gt;
To use standard plasma widgets (e.g. Plasma::LineEdit, etc.), you simply add an import line for them.&lt;br /&gt;
All properties, signals and slots from ordinary Plasma widgets are available there.&lt;br /&gt;
Those widgets are provided as a transition tool, intended to be replaced by the Plasma version of QtComponents.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.graphicswidgets 0.1 as PlasmaWidgets&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 64&lt;br /&gt;
    height: 64&lt;br /&gt;
    PlasmaWidgets.IconWidget {&lt;br /&gt;
        id: icon&lt;br /&gt;
        Component.onCompleted: setIcon(&amp;quot;flag-red&amp;quot;)&lt;br /&gt;
        anchors.centerIn: parent&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted</id>
		<title>Development/Tutorials/Plasma/QML/GettingStarted</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted"/>
				<updated>2011-08-18T21:43:59Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* QML Basics */ add some links to QML examples&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Writing a plasma applet in QML is very easy, in fact, with KDE 4.6 and Qt 4.7 it just works.&lt;br /&gt;
&lt;br /&gt;
== QML Basics ==&lt;br /&gt;
&lt;br /&gt;
It is recommended that you have read through the [http://doc.qt.nokia.com/4.7/qtquick.html Qt QML Tutorials], as there are quite a few and they are explained thoroughly. There is also a list of all [http://doc.qt.nokia.com/4.7/qdeclarativeelements.html standard QML elements].&lt;br /&gt;
&lt;br /&gt;
Essentially, most of the content is the same. The exceptions to be noted are how data is gathered...since we use Data Engines, it is a bit different. Text color and font should be made to use PlasmaCore.Theme.&lt;br /&gt;
&lt;br /&gt;
See the [https://projects.kde.org/projects/kde/kdeexamples/repository KDE Examples] repository for more KDE-related helpful resources. Also of use (which use QML and Plasma) are: [https://projects.kde.org/projects/playground/base/plasma-mobile/repository Plasma Mobile], [https://projects.kde.org/projects/playground/base/declarative-plasmoids/repository Declarative Plasmoids (playground)], for WIP ports of C++ originals&lt;br /&gt;
&lt;br /&gt;
=== Root Item ===&lt;br /&gt;
&lt;br /&gt;
The root item can be anything that inherits QGraphicsItem. For example, in this case it is QGraphicsWidget which is a plasmoid. It can also simply be an Item. I also noticed that PathView does not respond to mouse inputs automatically (so flicking doesn't work). Probably because events are being intercepted. So take note, it'll have to be e.g. an Item, for that case.&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
&lt;br /&gt;
==== Row and Column ====&lt;br /&gt;
&lt;br /&gt;
==== Anchors ====&lt;br /&gt;
Anchor layouts offer a nice way of grouping UI elements nicely together. The idea is that you connect edges or corners of one element to the edge or corner of another widget.&lt;br /&gt;
Some examples:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 200&lt;br /&gt;
    height: 300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Text {&lt;br /&gt;
        id: first&lt;br /&gt;
        text: i18n(&amp;quot;1st line&amp;quot;)&lt;br /&gt;
        anchors { top: parent.top;&lt;br /&gt;
                  left: parent.left;&lt;br /&gt;
                  right: parent.right;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    Text {&lt;br /&gt;
        id: second&lt;br /&gt;
        text: i18n(&amp;quot;2nd line&amp;quot;)&lt;br /&gt;
        anchors { top: first.bottom;&lt;br /&gt;
                  left: parent.left;&lt;br /&gt;
                  right: parent.right;&lt;br /&gt;
                  bottom: parent.bottom;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Buttons ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Animations ===&lt;br /&gt;
&lt;br /&gt;
== Package Structure ==&lt;br /&gt;
&lt;br /&gt;
You create a .desktop file and the .qml file. They have to be in the usual plasma package structure.&lt;br /&gt;
&lt;br /&gt;
plasmoid-qml/metadata.desktop&lt;br /&gt;
plasmoid-qml/contents/ui/main.qml&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;metadata.desktop&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Name=Hello QML&lt;br /&gt;
Comment=A hello world widget in QML&lt;br /&gt;
Icon=chronometer&lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
X-Plasma-MainScript=ui/main.qml&lt;br /&gt;
X-Plasma-DefaultSize=200,100&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Author=Frederik Gladhorn&lt;br /&gt;
X-KDE-PluginInfo-Email=gladhorn@kde.org&lt;br /&gt;
X-KDE-PluginInfo-Website=http://plasma.kde.org/&lt;br /&gt;
X-KDE-PluginInfo-Category=Examples&lt;br /&gt;
X-KDE-PluginInfo-Name=org.kde.hello-qml&lt;br /&gt;
X-KDE-PluginInfo-Version=0.0&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Depends=&lt;br /&gt;
X-KDE-PluginInfo-License=GPL&lt;br /&gt;
X-KDE-PluginInfo-EnabledByDefault=true&lt;br /&gt;
X-KDE-ServiceTypes=Plasma/Applet&lt;br /&gt;
Type=Service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  &amp;lt;tt&amp;gt;main.qml&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing ==&lt;br /&gt;
You can install your plasmoid:&lt;br /&gt;
plasmapkg --install plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
== plasmoidviewer ==&lt;br /&gt;
You can run it in plasmoidviewer as usual:&lt;br /&gt;
plasmoidviewer plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
== qmlviewer ==&lt;br /&gt;
It's possible to use Plasma specific imports in qml files loaded by qmlviewer:&lt;br /&gt;
&lt;br /&gt;
qmlviewer -I /usr/lib/kde4/imports/ plasmoid-qml/contents/qml/main.qml &lt;br /&gt;
&lt;br /&gt;
Where the -I is the path to the plasma plugin for qml. Try to look for the path of &lt;br /&gt;
/usr/lib/kde4/imports/org/kde/plasma/graphicswidgets/libgraphicswidgetsbindingsplugin.so&lt;br /&gt;
and use everything up to org of that path.&lt;br /&gt;
&lt;br /&gt;
Hovewer it's '''strongly discouraged''' to use qmlviewer to develop plasmoids, because some features won't be available there:&lt;br /&gt;
* localization with i18n()&lt;br /&gt;
* access to the global ''plasmoid'' object&lt;br /&gt;
* device specific qml files imported with plasmapackage:// urls&lt;br /&gt;
* bindings for qicons, KJobs, services and KConfig&lt;br /&gt;
&lt;br /&gt;
= Features only available in Plasma widgets =&lt;br /&gt;
In order to have a better integration with the KDE platform and to reach an higher degree of expressivity, the stock features of QML have been expanded with the following features, that strictly follow the Plasmoid JavaScript API:&lt;br /&gt;
&lt;br /&gt;
== Minimum size ==&lt;br /&gt;
if the root object of the plasmoid has the properties minimumWidth and minimumHeight, they will be used as the minimum size for the plasmoid. If they will change during the plasmoid execution, the plasmoid minimum size will be updated accordingly.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    property int minimumWidth: paintedWidth&lt;br /&gt;
    property int minimumHeight: paintedHeight&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above example, the minimum size is binded to the paintedWidth/paintedHeight properties of the Text element, ensuring there will always be enough room for the whole text to be displayed.&lt;br /&gt;
&lt;br /&gt;
== Plasmoid object ==&lt;br /&gt;
Every QML plasmoid will have an object called ''plasmoid'', that will give access to the configuration, the formfactor, immutability and so on. It offers the same api as the object with the same name in the Javascript API.&lt;br /&gt;
&lt;br /&gt;
For specific info on this, see [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API-PlasmoidObject Javascript API-Plasmoid Object]&lt;br /&gt;
&lt;br /&gt;
== Localization ==&lt;br /&gt;
It's possible to localize strings with the usual i18n(), i18nc(), i18np() global functions&lt;br /&gt;
&lt;br /&gt;
== Extra types ==&lt;br /&gt;
Some extra types are available from withing JavaScript, namely&lt;br /&gt;
&lt;br /&gt;
* KConfigGroup: it's an object with its cnfig keys readable and writable as properties&lt;br /&gt;
* QIcon: can be constructed with QIcon(&amp;quot;fdo name&amp;quot;) such as QIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
* KJob&lt;br /&gt;
* Plasma Service api&lt;br /&gt;
&lt;br /&gt;
= Plasma specific imports =&lt;br /&gt;
To use some Plasma specific features is necessary to use some particular QML imports.&lt;br /&gt;
&lt;br /&gt;
== Plasma Core ==&lt;br /&gt;
org.kde.plasma.core&lt;br /&gt;
This is the import that lets you access to the most important Plasma Core features.&lt;br /&gt;
&lt;br /&gt;
=== DataSource ===&lt;br /&gt;
Used to connect to a dataengine&lt;br /&gt;
&lt;br /&gt;
=== DataModel ===&lt;br /&gt;
Attaches to a DataSource, makes possible to use a dataengine as a model for a QML ListView, GridView, PathView and so on&lt;br /&gt;
&lt;br /&gt;
=== Svg ===&lt;br /&gt;
Loads a Plasma Svg, it's not the visual item&lt;br /&gt;
&lt;br /&gt;
=== SvgItem ===&lt;br /&gt;
Visual item that paints a Svg&lt;br /&gt;
&lt;br /&gt;
=== FrameSvg ===&lt;br /&gt;
Loads a Plasma FrameSvg, it's not the visual item.&lt;br /&gt;
&lt;br /&gt;
=== FrameSvgItem ===&lt;br /&gt;
Visual item that displays a Plasma FrameSvg&lt;br /&gt;
&lt;br /&gt;
== Extra Qt features ==&lt;br /&gt;
org.kde.qtextraimports&lt;br /&gt;
To use, do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import org.kde.qtextracomponents 0.1 as QtExtraComponents&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* QPixmapItem&lt;br /&gt;
* QImageItem&lt;br /&gt;
* QIconItem&lt;br /&gt;
&lt;br /&gt;
== Plasma Widgets in QML ==&lt;br /&gt;
To use standard plasma widgets (e.g. Plasma::LineEdit, etc.), you simply add an import line for them.&lt;br /&gt;
All properties, signals and slots from ordinary Plasma widgets are available there.&lt;br /&gt;
Those widgets are provided as a transition tool, intended to be replaced by the Plasma version of QtComponents.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.graphicswidgets 0.1 as PlasmaWidgets&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 64&lt;br /&gt;
    height: 64&lt;br /&gt;
    PlasmaWidgets.IconWidget {&lt;br /&gt;
        id: icon&lt;br /&gt;
        Component.onCompleted: setIcon(&amp;quot;flag-red&amp;quot;)&lt;br /&gt;
        anchors.centerIn: parent&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted</id>
		<title>Development/Tutorials/Plasma/QML/GettingStarted</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted"/>
				<updated>2011-08-18T21:41:35Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* QML Basics */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Writing a plasma applet in QML is very easy, in fact, with KDE 4.6 and Qt 4.7 it just works.&lt;br /&gt;
&lt;br /&gt;
== QML Basics ==&lt;br /&gt;
&lt;br /&gt;
It is recommended that you have read through the [http://doc.qt.nokia.com/4.7/qtquick.html Qt QML Tutorials], as there are quite a few and they are explained thoroughly. There is also a list of all [http://doc.qt.nokia.com/4.7/qdeclarativeelements.html standard QML elements].&lt;br /&gt;
&lt;br /&gt;
Essentially, most of the content is the same. The exceptions to be noted are how data is gathered...since we use Data Engines, it is a bit different. Text color and font should be made to use PlasmaCore.Theme.&lt;br /&gt;
&lt;br /&gt;
See the [https://projects.kde.org/projects/kde/kdeexamples KDE Examples] repository for more KDE-related helpful resources. Also of use (which use QML and Plasma) are: [https://projects.kde.org/projects/playground/base/plasma-mobile Plasma Mobile], [https://projects.kde.org/projects/playground/base/declarative-plasmoids/repository Declarative Plasmoids (playground)], for WIP ports of C++ originals&lt;br /&gt;
&lt;br /&gt;
=== Root Item ===&lt;br /&gt;
&lt;br /&gt;
The root item can be anything that inherits QGraphicsItem. For example, in this case it is QGraphicsWidget which is a plasmoid. It can also simply be an Item. I also noticed that PathView does not respond to mouse inputs automatically (so flicking doesn't work). Probably because events are being intercepted. So take note, it'll have to be e.g. an Item, for that case.&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
&lt;br /&gt;
==== Row and Column ====&lt;br /&gt;
&lt;br /&gt;
==== Anchors ====&lt;br /&gt;
Anchor layouts offer a nice way of grouping UI elements nicely together. The idea is that you connect edges or corners of one element to the edge or corner of another widget.&lt;br /&gt;
Some examples:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 200&lt;br /&gt;
    height: 300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Text {&lt;br /&gt;
        id: first&lt;br /&gt;
        text: i18n(&amp;quot;1st line&amp;quot;)&lt;br /&gt;
        anchors { top: parent.top;&lt;br /&gt;
                  left: parent.left;&lt;br /&gt;
                  right: parent.right;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    Text {&lt;br /&gt;
        id: second&lt;br /&gt;
        text: i18n(&amp;quot;2nd line&amp;quot;)&lt;br /&gt;
        anchors { top: first.bottom;&lt;br /&gt;
                  left: parent.left;&lt;br /&gt;
                  right: parent.right;&lt;br /&gt;
                  bottom: parent.bottom;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Buttons ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Animations ===&lt;br /&gt;
&lt;br /&gt;
== Package Structure ==&lt;br /&gt;
&lt;br /&gt;
You create a .desktop file and the .qml file. They have to be in the usual plasma package structure.&lt;br /&gt;
&lt;br /&gt;
plasmoid-qml/metadata.desktop&lt;br /&gt;
plasmoid-qml/contents/ui/main.qml&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;metadata.desktop&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Name=Hello QML&lt;br /&gt;
Comment=A hello world widget in QML&lt;br /&gt;
Icon=chronometer&lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
X-Plasma-MainScript=ui/main.qml&lt;br /&gt;
X-Plasma-DefaultSize=200,100&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Author=Frederik Gladhorn&lt;br /&gt;
X-KDE-PluginInfo-Email=gladhorn@kde.org&lt;br /&gt;
X-KDE-PluginInfo-Website=http://plasma.kde.org/&lt;br /&gt;
X-KDE-PluginInfo-Category=Examples&lt;br /&gt;
X-KDE-PluginInfo-Name=org.kde.hello-qml&lt;br /&gt;
X-KDE-PluginInfo-Version=0.0&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Depends=&lt;br /&gt;
X-KDE-PluginInfo-License=GPL&lt;br /&gt;
X-KDE-PluginInfo-EnabledByDefault=true&lt;br /&gt;
X-KDE-ServiceTypes=Plasma/Applet&lt;br /&gt;
Type=Service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  &amp;lt;tt&amp;gt;main.qml&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing ==&lt;br /&gt;
You can install your plasmoid:&lt;br /&gt;
plasmapkg --install plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
== plasmoidviewer ==&lt;br /&gt;
You can run it in plasmoidviewer as usual:&lt;br /&gt;
plasmoidviewer plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
== qmlviewer ==&lt;br /&gt;
It's possible to use Plasma specific imports in qml files loaded by qmlviewer:&lt;br /&gt;
&lt;br /&gt;
qmlviewer -I /usr/lib/kde4/imports/ plasmoid-qml/contents/qml/main.qml &lt;br /&gt;
&lt;br /&gt;
Where the -I is the path to the plasma plugin for qml. Try to look for the path of &lt;br /&gt;
/usr/lib/kde4/imports/org/kde/plasma/graphicswidgets/libgraphicswidgetsbindingsplugin.so&lt;br /&gt;
and use everything up to org of that path.&lt;br /&gt;
&lt;br /&gt;
Hovewer it's '''strongly discouraged''' to use qmlviewer to develop plasmoids, because some features won't be available there:&lt;br /&gt;
* localization with i18n()&lt;br /&gt;
* access to the global ''plasmoid'' object&lt;br /&gt;
* device specific qml files imported with plasmapackage:// urls&lt;br /&gt;
* bindings for qicons, KJobs, services and KConfig&lt;br /&gt;
&lt;br /&gt;
= Features only available in Plasma widgets =&lt;br /&gt;
In order to have a better integration with the KDE platform and to reach an higher degree of expressivity, the stock features of QML have been expanded with the following features, that strictly follow the Plasmoid JavaScript API:&lt;br /&gt;
&lt;br /&gt;
== Minimum size ==&lt;br /&gt;
if the root object of the plasmoid has the properties minimumWidth and minimumHeight, they will be used as the minimum size for the plasmoid. If they will change during the plasmoid execution, the plasmoid minimum size will be updated accordingly.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    property int minimumWidth: paintedWidth&lt;br /&gt;
    property int minimumHeight: paintedHeight&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above example, the minimum size is binded to the paintedWidth/paintedHeight properties of the Text element, ensuring there will always be enough room for the whole text to be displayed.&lt;br /&gt;
&lt;br /&gt;
== Plasmoid object ==&lt;br /&gt;
Every QML plasmoid will have an object called ''plasmoid'', that will give access to the configuration, the formfactor, immutability and so on. It offers the same api as the object with the same name in the Javascript API.&lt;br /&gt;
&lt;br /&gt;
For specific info on this, see [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API-PlasmoidObject Javascript API-Plasmoid Object]&lt;br /&gt;
&lt;br /&gt;
== Localization ==&lt;br /&gt;
It's possible to localize strings with the usual i18n(), i18nc(), i18np() global functions&lt;br /&gt;
&lt;br /&gt;
== Extra types ==&lt;br /&gt;
Some extra types are available from withing JavaScript, namely&lt;br /&gt;
&lt;br /&gt;
* KConfigGroup: it's an object with its cnfig keys readable and writable as properties&lt;br /&gt;
* QIcon: can be constructed with QIcon(&amp;quot;fdo name&amp;quot;) such as QIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
* KJob&lt;br /&gt;
* Plasma Service api&lt;br /&gt;
&lt;br /&gt;
= Plasma specific imports =&lt;br /&gt;
To use some Plasma specific features is necessary to use some particular QML imports.&lt;br /&gt;
&lt;br /&gt;
== Plasma Core ==&lt;br /&gt;
org.kde.plasma.core&lt;br /&gt;
This is the import that lets you access to the most important Plasma Core features.&lt;br /&gt;
&lt;br /&gt;
=== DataSource ===&lt;br /&gt;
Used to connect to a dataengine&lt;br /&gt;
&lt;br /&gt;
=== DataModel ===&lt;br /&gt;
Attaches to a DataSource, makes possible to use a dataengine as a model for a QML ListView, GridView, PathView and so on&lt;br /&gt;
&lt;br /&gt;
=== Svg ===&lt;br /&gt;
Loads a Plasma Svg, it's not the visual item&lt;br /&gt;
&lt;br /&gt;
=== SvgItem ===&lt;br /&gt;
Visual item that paints a Svg&lt;br /&gt;
&lt;br /&gt;
=== FrameSvg ===&lt;br /&gt;
Loads a Plasma FrameSvg, it's not the visual item.&lt;br /&gt;
&lt;br /&gt;
=== FrameSvgItem ===&lt;br /&gt;
Visual item that displays a Plasma FrameSvg&lt;br /&gt;
&lt;br /&gt;
== Extra Qt features ==&lt;br /&gt;
org.kde.qtextraimports&lt;br /&gt;
To use, do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import org.kde.qtextracomponents 0.1 as QtExtraComponents&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* QPixmapItem&lt;br /&gt;
* QImageItem&lt;br /&gt;
* QIconItem&lt;br /&gt;
&lt;br /&gt;
== Plasma Widgets in QML ==&lt;br /&gt;
To use standard plasma widgets (e.g. Plasma::LineEdit, etc.), you simply add an import line for them.&lt;br /&gt;
All properties, signals and slots from ordinary Plasma widgets are available there.&lt;br /&gt;
Those widgets are provided as a transition tool, intended to be replaced by the Plasma version of QtComponents.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.graphicswidgets 0.1 as PlasmaWidgets&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 64&lt;br /&gt;
    height: 64&lt;br /&gt;
    PlasmaWidgets.IconWidget {&lt;br /&gt;
        id: icon&lt;br /&gt;
        Component.onCompleted: setIcon(&amp;quot;flag-red&amp;quot;)&lt;br /&gt;
        anchors.centerIn: parent&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted</id>
		<title>Development/Tutorials/Plasma/QML/GettingStarted</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted"/>
				<updated>2011-08-18T21:32:52Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* Extra Qt features */ add extracomponents import&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Writing a plasma applet in QML is very easy, in fact, with KDE 4.6 and Qt 4.7 it just works.&lt;br /&gt;
&lt;br /&gt;
== QML Basics ==&lt;br /&gt;
&lt;br /&gt;
It is recommended that you have read through the [http://doc.qt.nokia.com/4.7/qtquick.html Qt QML Tutorials], as there are quite a few and they are explained thoroughly. There is also a list of all [http://doc.qt.nokia.com/4.7/qdeclarativeelements.html standard QML elements].&lt;br /&gt;
&lt;br /&gt;
Essentially, most of the content is the same. The exceptions to be noted are how data is gathered...since we use Data Engines, it is a bit different. Text color and font should be made to use PlasmaCore.Theme.&lt;br /&gt;
&lt;br /&gt;
See the [https://projects.kde.org/projects/kde/kdeexamples KDE Examples] repository for more KDE-related helpful resources.&lt;br /&gt;
&lt;br /&gt;
=== Root Item ===&lt;br /&gt;
&lt;br /&gt;
The root item can be anything that inherits QGraphicsItem. For example, in this case it is QGraphicsWidget which is a plasmoid. It can also simply be an Item. I also noticed that PathView does not respond to mouse inputs automatically (so flicking doesn't work). Probably because events are being intercepted. So take note, it'll have to be e.g. an Item, for that case.&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
&lt;br /&gt;
==== Row and Column ====&lt;br /&gt;
&lt;br /&gt;
==== Anchors ====&lt;br /&gt;
Anchor layouts offer a nice way of grouping UI elements nicely together. The idea is that you connect edges or corners of one element to the edge or corner of another widget.&lt;br /&gt;
Some examples:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 200&lt;br /&gt;
    height: 300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Text {&lt;br /&gt;
        id: first&lt;br /&gt;
        text: i18n(&amp;quot;1st line&amp;quot;)&lt;br /&gt;
        anchors { top: parent.top;&lt;br /&gt;
                  left: parent.left;&lt;br /&gt;
                  right: parent.right;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    Text {&lt;br /&gt;
        id: second&lt;br /&gt;
        text: i18n(&amp;quot;2nd line&amp;quot;)&lt;br /&gt;
        anchors { top: first.bottom;&lt;br /&gt;
                  left: parent.left;&lt;br /&gt;
                  right: parent.right;&lt;br /&gt;
                  bottom: parent.bottom;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Buttons ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Animations ===&lt;br /&gt;
&lt;br /&gt;
== Package Structure ==&lt;br /&gt;
&lt;br /&gt;
You create a .desktop file and the .qml file. They have to be in the usual plasma package structure.&lt;br /&gt;
&lt;br /&gt;
plasmoid-qml/metadata.desktop&lt;br /&gt;
plasmoid-qml/contents/ui/main.qml&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;metadata.desktop&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Name=Hello QML&lt;br /&gt;
Comment=A hello world widget in QML&lt;br /&gt;
Icon=chronometer&lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
X-Plasma-MainScript=ui/main.qml&lt;br /&gt;
X-Plasma-DefaultSize=200,100&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Author=Frederik Gladhorn&lt;br /&gt;
X-KDE-PluginInfo-Email=gladhorn@kde.org&lt;br /&gt;
X-KDE-PluginInfo-Website=http://plasma.kde.org/&lt;br /&gt;
X-KDE-PluginInfo-Category=Examples&lt;br /&gt;
X-KDE-PluginInfo-Name=org.kde.hello-qml&lt;br /&gt;
X-KDE-PluginInfo-Version=0.0&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Depends=&lt;br /&gt;
X-KDE-PluginInfo-License=GPL&lt;br /&gt;
X-KDE-PluginInfo-EnabledByDefault=true&lt;br /&gt;
X-KDE-ServiceTypes=Plasma/Applet&lt;br /&gt;
Type=Service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  &amp;lt;tt&amp;gt;main.qml&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing ==&lt;br /&gt;
You can install your plasmoid:&lt;br /&gt;
plasmapkg --install plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
== plasmoidviewer ==&lt;br /&gt;
You can run it in plasmoidviewer as usual:&lt;br /&gt;
plasmoidviewer plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
== qmlviewer ==&lt;br /&gt;
It's possible to use Plasma specific imports in qml files loaded by qmlviewer:&lt;br /&gt;
&lt;br /&gt;
qmlviewer -I /usr/lib/kde4/imports/ plasmoid-qml/contents/qml/main.qml &lt;br /&gt;
&lt;br /&gt;
Where the -I is the path to the plasma plugin for qml. Try to look for the path of &lt;br /&gt;
/usr/lib/kde4/imports/org/kde/plasma/graphicswidgets/libgraphicswidgetsbindingsplugin.so&lt;br /&gt;
and use everything up to org of that path.&lt;br /&gt;
&lt;br /&gt;
Hovewer it's '''strongly discouraged''' to use qmlviewer to develop plasmoids, because some features won't be available there:&lt;br /&gt;
* localization with i18n()&lt;br /&gt;
* access to the global ''plasmoid'' object&lt;br /&gt;
* device specific qml files imported with plasmapackage:// urls&lt;br /&gt;
* bindings for qicons, KJobs, services and KConfig&lt;br /&gt;
&lt;br /&gt;
= Features only available in Plasma widgets =&lt;br /&gt;
In order to have a better integration with the KDE platform and to reach an higher degree of expressivity, the stock features of QML have been expanded with the following features, that strictly follow the Plasmoid JavaScript API:&lt;br /&gt;
&lt;br /&gt;
== Minimum size ==&lt;br /&gt;
if the root object of the plasmoid has the properties minimumWidth and minimumHeight, they will be used as the minimum size for the plasmoid. If they will change during the plasmoid execution, the plasmoid minimum size will be updated accordingly.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    property int minimumWidth: paintedWidth&lt;br /&gt;
    property int minimumHeight: paintedHeight&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above example, the minimum size is binded to the paintedWidth/paintedHeight properties of the Text element, ensuring there will always be enough room for the whole text to be displayed.&lt;br /&gt;
&lt;br /&gt;
== Plasmoid object ==&lt;br /&gt;
Every QML plasmoid will have an object called ''plasmoid'', that will give access to the configuration, the formfactor, immutability and so on. It offers the same api as the object with the same name in the Javascript API.&lt;br /&gt;
&lt;br /&gt;
For specific info on this, see [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API-PlasmoidObject Javascript API-Plasmoid Object]&lt;br /&gt;
&lt;br /&gt;
== Localization ==&lt;br /&gt;
It's possible to localize strings with the usual i18n(), i18nc(), i18np() global functions&lt;br /&gt;
&lt;br /&gt;
== Extra types ==&lt;br /&gt;
Some extra types are available from withing JavaScript, namely&lt;br /&gt;
&lt;br /&gt;
* KConfigGroup: it's an object with its cnfig keys readable and writable as properties&lt;br /&gt;
* QIcon: can be constructed with QIcon(&amp;quot;fdo name&amp;quot;) such as QIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
* KJob&lt;br /&gt;
* Plasma Service api&lt;br /&gt;
&lt;br /&gt;
= Plasma specific imports =&lt;br /&gt;
To use some Plasma specific features is necessary to use some particular QML imports.&lt;br /&gt;
&lt;br /&gt;
== Plasma Core ==&lt;br /&gt;
org.kde.plasma.core&lt;br /&gt;
This is the import that lets you access to the most important Plasma Core features.&lt;br /&gt;
&lt;br /&gt;
=== DataSource ===&lt;br /&gt;
Used to connect to a dataengine&lt;br /&gt;
&lt;br /&gt;
=== DataModel ===&lt;br /&gt;
Attaches to a DataSource, makes possible to use a dataengine as a model for a QML ListView, GridView, PathView and so on&lt;br /&gt;
&lt;br /&gt;
=== Svg ===&lt;br /&gt;
Loads a Plasma Svg, it's not the visual item&lt;br /&gt;
&lt;br /&gt;
=== SvgItem ===&lt;br /&gt;
Visual item that paints a Svg&lt;br /&gt;
&lt;br /&gt;
=== FrameSvg ===&lt;br /&gt;
Loads a Plasma FrameSvg, it's not the visual item.&lt;br /&gt;
&lt;br /&gt;
=== FrameSvgItem ===&lt;br /&gt;
Visual item that displays a Plasma FrameSvg&lt;br /&gt;
&lt;br /&gt;
== Extra Qt features ==&lt;br /&gt;
org.kde.qtextraimports&lt;br /&gt;
To use, do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import org.kde.qtextracomponents 0.1 as QtExtraComponents&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* QPixmapItem&lt;br /&gt;
* QImageItem&lt;br /&gt;
* QIconItem&lt;br /&gt;
&lt;br /&gt;
== Plasma Widgets in QML ==&lt;br /&gt;
To use standard plasma widgets (e.g. Plasma::LineEdit, etc.), you simply add an import line for them.&lt;br /&gt;
All properties, signals and slots from ordinary Plasma widgets are available there.&lt;br /&gt;
Those widgets are provided as a transition tool, intended to be replaced by the Plasma version of QtComponents.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.graphicswidgets 0.1 as PlasmaWidgets&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 64&lt;br /&gt;
    height: 64&lt;br /&gt;
    PlasmaWidgets.IconWidget {&lt;br /&gt;
        id: icon&lt;br /&gt;
        Component.onCompleted: setIcon(&amp;quot;flag-red&amp;quot;)&lt;br /&gt;
        anchors.centerIn: parent&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/API</id>
		<title>Development/Tutorials/Plasma/QML/API</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/API"/>
				<updated>2011-08-17T22:41:51Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* Popup Applet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction to the Plasmoid QML Declarative API  =&lt;br /&gt;
&lt;br /&gt;
This document provides an overview/reference of the Declarative QML API for Plasmoids. It isn't a full binding to all of Qt or KDE's libraries, but a focused set of bindings designed to make writing Plasmoids fast and easy, while remaining powerful.&lt;br /&gt;
&lt;br /&gt;
The API in this documentation covers the API of the Plasma specific QML components, so only the Declarative part of the API.&lt;br /&gt;
&lt;br /&gt;
The QML ScriptEngine is bassed upon the Plasma JavaScript engine, making the API of the JavaScript part identical to the one of the JavaScript plasmoids engine.&lt;br /&gt;
To see the api of the global ''Plasmoid'' object, see the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#The_Global_plasmoid_Object JavaScript API] documentation.&lt;br /&gt;
(TODO: the JavaScript api paged should probably be copied and stripped down the imperative bits not present there, it would make harder to update tough)&lt;br /&gt;
&lt;br /&gt;
== What Is a Declarative Plasmoid?  ==&lt;br /&gt;
&lt;br /&gt;
To denote that this Plasmoid is a Declarative widget, ensure that in the metadata.desktop file there is this line: &lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
&lt;br /&gt;
What follows is a description of the Plasma declarative classes instantiable from QML.&lt;br /&gt;
&lt;br /&gt;
= Main QML classes =&lt;br /&gt;
&lt;br /&gt;
== Data engines ==&lt;br /&gt;
While it's possible to fetch data from a Plasma DataEngine in the same way as the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#DataEngine JavaScript API], however it is preferrable to use the following declarative classes:&lt;br /&gt;
&lt;br /&gt;
=== DataSource ===&lt;br /&gt;
DataSource is a receiver for a dataEngine and can be declared inside QML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
 PlasmaCore.DataSource {&lt;br /&gt;
     id: dataSource&lt;br /&gt;
     engine: &amp;quot;time&amp;quot;&lt;br /&gt;
     connectedSources: [&amp;quot;Local&amp;quot;]&lt;br /&gt;
     interval: 500&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Properties ====&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* bool '''valid''' (read only): true when the DataSource is successfully connected to a data engine&lt;br /&gt;
* int '''interval''': interval of polling of the dataengine, if 0 (default value) no polling will be executed&lt;br /&gt;
* string '''engine''': the plugin name of the dataengine to load&lt;br /&gt;
* Array(string) '''connectedSources''': all the sources of the dataengine we are connected to (and whose data will appear in the '''data''' property)&lt;br /&gt;
* Array(string) '''sources''' (read only): all the sources available from the dataengine&lt;br /&gt;
* variant map '''data''' (read only): It's the most important property, it's a map of all the data available from the dataengine: its structure will be as follows:&lt;br /&gt;
** each key of the map will be a source name, in '''connectedSources'''&lt;br /&gt;
** each value will be a variant hash, so an hash with strings as keys and any variant as value&lt;br /&gt;
** example: dataSource.data[&amp;quot;Local&amp;quot;][&amp;quot;Time&amp;quot;] indicates the '''Time''' key of the dataengine source called &amp;quot;Local&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Signals ====&lt;br /&gt;
It has the following signals:&lt;br /&gt;
&lt;br /&gt;
Note that javascript/qml applies the 'on' prefix to signals. So the actual signal name in C++ which is e.g. '''newData''(...) becomes '''onNewData'''(...).&lt;br /&gt;
&lt;br /&gt;
* '''onNewData'''(String sourceName, Plasma::DataEngine::Data data)&lt;br /&gt;
* '''onSourceAdded'''(String source)&lt;br /&gt;
* '''onSourceRemoved'''(String source)&lt;br /&gt;
* '''onSourceConnected'''(String source)&lt;br /&gt;
* '''onSourceDisconnected'''(String source)&lt;br /&gt;
* '''onIntervalChanged'''()&lt;br /&gt;
* '''onEngineChanged'''()&lt;br /&gt;
* '''onDataChanged'''()&lt;br /&gt;
* '''onConnectedSourcesChanged'''()&lt;br /&gt;
* '''onSourcesChanged'''()&lt;br /&gt;
&lt;br /&gt;
==== Methods ====&lt;br /&gt;
It has the following methods:&lt;br /&gt;
* StringList keysForSource(String source): lists all the keys corresponding to a certain source: for instance in the &amp;quot;time&amp;quot; dataengine, for the &amp;quot;Local&amp;quot; source, keys will be:&lt;br /&gt;
** &amp;quot;Timezone Continent&amp;quot;&lt;br /&gt;
** &amp;quot;Offset&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone&amp;quot;&lt;br /&gt;
** &amp;quot;Time&amp;quot;&lt;br /&gt;
** &amp;quot;Date&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone City&amp;quot;&lt;br /&gt;
* Service serviceForSource(String source): returns a Plasma service that corresponds a given source: see the section about services for how to use it.&lt;br /&gt;
* void connectSource(String source): adds to '''connectedSources''' the new source&lt;br /&gt;
* void disconnectSource(String source): removes that source from '''connectedSources'''&lt;br /&gt;
&lt;br /&gt;
=== Service ===&lt;br /&gt;
Due to their imperative nature, Plasma Services are not instantiated as QML classes, but rather created out of a '''DataSource''' with the method '''serviceForSource''' and used in the JavaScript portions of the QML files.&lt;br /&gt;
This following example is a simplified version from the Now Playing QML widget in the kdeexamples git repository: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var service = dataSource.serviceForSource(activeSource)&lt;br /&gt;
  var operation = service.operationDescription(&amp;quot;seek&amp;quot;)&lt;br /&gt;
  operation.seconds = 10&lt;br /&gt;
&lt;br /&gt;
  var job = service.startOperationCall(operation)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Here dataSource is the id of a DataSource object, and activeSource is a source contained in one of its '''connectedSources'''.&lt;br /&gt;
The service provides an operation called &amp;quot;seek&amp;quot;, with a parameter called &amp;quot;seconds&amp;quot;, that can be written on it as a property of a JavaScript object.&lt;br /&gt;
&lt;br /&gt;
=== ServiceJob ===&lt;br /&gt;
If is necessary to monitor the result of a Service operation, it's possible to connect to the '''finished''' signal provided by the job return paramenter of the '''startOperationCall''' service method.&lt;br /&gt;
The '''finished''' signal has the same job as parameter, from which is possible to check the variant '''result''' property, to check the result.&lt;br /&gt;
&lt;br /&gt;
=== DataModel ===&lt;br /&gt;
Some data engines return as their data something that can be interpreted as a list of items, rather than simple key/value pairs.&lt;br /&gt;
QML provides some item views such as '''ListView''', '''GridView''' and '''Repeater'''.&lt;br /&gt;
The '''DataModel''' QML object can provide, based on a DataSource a model suitable for those QML item views.&lt;br /&gt;
&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* DataSource '''dataSource''': the id of an existing (and connected) DataSource&lt;br /&gt;
* String '''sourceFilter''': it's a regular expression. If the DataSource is connected to more than one source, only inserts data from sources matching this filter expression in the model. To, for example, have a source watch all sources beginning with say &amp;quot;name:&amp;quot;, the required regexp would be sourceFilter: &amp;quot;name:.*&amp;quot;&lt;br /&gt;
* String '''keyRoleFilter''': it's a regular expression. Only data with keys that match this filter expression will be inserted in the model&lt;br /&gt;
* int '''count''' (read only): how many items are in the model&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 ListView {&lt;br /&gt;
   model: PlasmaCore.DataModel {&lt;br /&gt;
        dataSource: microblogSource&lt;br /&gt;
        keyRoleFilter: &amp;quot;[\\d]*&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    delegate: Text {&lt;br /&gt;
        text: title&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the example, ''microblogSource'' is the id of a DataSource, and inserts in the model only entries that have a number as the key name (matched with [\\d]*, in this case tweets ids)&lt;br /&gt;
&lt;br /&gt;
Each item in the model will have the form of a variant hash: all the keys of the hash will be registered as model role names, in the example, &amp;quot;title&amp;quot; is a role of the model containing a string (also reachable with model[&amp;quot;title&amp;quot;]).&lt;br /&gt;
&lt;br /&gt;
A special reserved role will always be present: '''&amp;quot;DataEngineSource&amp;quot;''': it will contain the name of the data engine source that gave origin to this item. Therefore, if you want merely the string of the current source that the model is at...do model[&amp;quot;DataEngineSource&amp;quot;].&lt;br /&gt;
&lt;br /&gt;
Note that view.currentItem holds the item currently selected. However, due to (http://bugreports.qt.nokia.com/browse/QTBUG-16347) this does not work in PathView. A workaround is to make your own.&lt;br /&gt;
&lt;br /&gt;
=== SortFilterModel ===&lt;br /&gt;
SortFilterModel is a proxy model for easy sorting and/or filtering of the items in a DataModel (or any other QAbstractItemModel subclass that has been registered in QML with setContextProperty from a C++ application)&lt;br /&gt;
Properties:&lt;br /&gt;
* model '''sourceModel'''&lt;br /&gt;
* String '''filterRegExp'''&lt;br /&gt;
* String '''filterRole'''&lt;br /&gt;
* String '''sortRole'''&lt;br /&gt;
* Qt::SortOrder '''sortOrder'''&lt;br /&gt;
* int '''count''' (read only)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Popup Applet ==&lt;br /&gt;
So you want your QML applet to be a popup applet, like the device notifier (an icon in the panel shows and expands the applet)?&lt;br /&gt;
&lt;br /&gt;
Why, that's easy.&lt;br /&gt;
&lt;br /&gt;
To change your plasmoid from being a regular boring one, simply change&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
ServiceTypes=Plasma/Applet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
ServiceTypes=Plasma/Applet,Plasma/PopupApplet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then in the main QML item's Component.onCompleted, do:&lt;br /&gt;
&lt;br /&gt;
NOTE: the below code presently has no affect, yet the icons seems to get retrieved from the desktop file (FIXME - is this needed?).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    plasmoid.popupIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Plasma Themes ==&lt;br /&gt;
&lt;br /&gt;
=== Theme ===&lt;br /&gt;
This class instantiable from QML provides access to the Plasma Theme colors and other facilities such as fonts.&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* String '''themeName''' (read only)&lt;br /&gt;
* QFont '''font''' (read only)&lt;br /&gt;
* bool '''windowTranslucentEnabled''' (read only)&lt;br /&gt;
* Url '''homepage''' (read only)&lt;br /&gt;
* bool '''useGlobalSettings''' (read only)&lt;br /&gt;
* QString '''wallpaperPath''' (read only)&lt;br /&gt;
* color '''textColor''' (read only)&lt;br /&gt;
* color '''highlightColor''' (read only)&lt;br /&gt;
* color '''backgroundColor''' (read only)&lt;br /&gt;
* color '''buttonTextColor''' (read only)&lt;br /&gt;
* color '''buttonBackgroundColor''' (read only)&lt;br /&gt;
* color '''linkColor''' (read only)&lt;br /&gt;
* color visitedLinkColor''' (read only)&lt;br /&gt;
* color '''visitedLinkColor''' (read only)&lt;br /&gt;
* color '''buttonHoverColor''' (read only)&lt;br /&gt;
* color '''buttonFocusColor''' (read only)&lt;br /&gt;
* color '''viewTextColor''' (read only)&lt;br /&gt;
* color '''viewBackgroundColo''' (read only)r&lt;br /&gt;
* color '''viewHoverColor''' (read only)&lt;br /&gt;
* color '''viewFocusColor''' (read only)&lt;br /&gt;
* String '''styleSheet''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== Svg ===&lt;br /&gt;
Declaring a Svg element instantiates a Plasma Svg instance. This class doesn't draw anything, for drawing, SvgItem is used.&lt;br /&gt;
Properties:&lt;br /&gt;
* QSize '''size'''&lt;br /&gt;
* bool '''multipleImages'''&lt;br /&gt;
* String '''imagePath'''&lt;br /&gt;
* bool '''usingRenderingCache'''&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPixmap pixmap(QString elementID)&lt;br /&gt;
* void resize(qreal width, qreal height)&lt;br /&gt;
* void resize(): resets the image to its default dimension&lt;br /&gt;
* QSize elementSize(QString elementId)&lt;br /&gt;
* QRectF elementRect(QString elementId)&lt;br /&gt;
* bool hasElement(QString elementId)&lt;br /&gt;
* bool isValid(): true if valid svg file&lt;br /&gt;
&lt;br /&gt;
=== SvgItem ===&lt;br /&gt;
It's a graphical element that will actually paint a Svg instance.&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''elementId''': what element to render. If null, the whole svg will be rendered&lt;br /&gt;
* Svg '''svg''': instance of the Svg class mentioned above&lt;br /&gt;
* QSizeF '''naturalSize''' (read only): default size of the Svg&lt;br /&gt;
* bool '''smooth''': paint with antialias (default false)&lt;br /&gt;
&lt;br /&gt;
=== FrameSvgItem ===&lt;br /&gt;
It's a graphical element that paints a Plasma::FrameSvg, so a rectangular image composed by 9 elements contained in a Svg file, useful for things like buttons and frames.&lt;br /&gt;
&lt;br /&gt;
Flags&lt;br /&gt;
* EnabledBorders: combination of TopBorder | BottomBorder | LeftBorder | RightBorder, NoBorder if no border of the frame is enabled&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''imagePath''': path of the file relative to the Plasma Theme, for instance &amp;quot;widgets/background&amp;quot;&lt;br /&gt;
* String '''prefix''': a FrameSvg can contain multiple frames, for instance a button contains &amp;quot;normal&amp;quot;, &amp;quot;raised&amp;quot; and &amp;quot;pressed&amp;quot;&lt;br /&gt;
* Margins '''margins''' (read only): the margins of the frame, see documentation below&lt;br /&gt;
* EnabledBorders '''enabledBorders''': what borders are enabled&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
== Top Level windows ==&lt;br /&gt;
&lt;br /&gt;
=== Dialog ===&lt;br /&gt;
Dialog instantiates a Plasma::Dialog, it will be a Plasma themed top level window that can contain any QML component.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item mainItem: the Item contained in the Dialog, it can be any QML Item instance&lt;br /&gt;
* bool '''visible''': if the window (not the mainItem) is visible&lt;br /&gt;
* int '''x''': x position of the window in screen coordinates&lt;br /&gt;
* int '''y''': y position of the window in screen coordinates&lt;br /&gt;
* int '''width''' (read only): total width of the dialog, including margins&lt;br /&gt;
* int '''height''' (read only): total height of the dialog, including margins&lt;br /&gt;
* int '''windowFlags''': Qt window flags of the Dialog&lt;br /&gt;
* Margins '''margins''' (read only): margins of the Dialog&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPoint popupPosition(Item item, Qt::Alignment alignment=Qt::AlignLeft): the suggested position for the Dialog if it has to be correctly placed as popup of the QML item passed as parameter.&lt;br /&gt;
* void setAttribute(Qt::WindowAttribute attribute, bool on): set an attribute for the dialog window&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== ToolTip ===&lt;br /&gt;
Declaring a ToolTip instance makes it possible to use Plasma tooltips with any QML item.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item '''target''': the QML item we want to show a tooltip of&lt;br /&gt;
* String '''mainText'''&lt;br /&gt;
* String '''subText'''&lt;br /&gt;
* String '''image''': freedesktop compliant icon name as image of the tooltip&lt;br /&gt;
&lt;br /&gt;
= Plasma QtComponents (4.8) =&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/API</id>
		<title>Development/Tutorials/Plasma/QML/API</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/API"/>
				<updated>2011-08-17T22:30:29Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: move popupapplet up a bit so it's seen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction to the Plasmoid QML Declarative API  =&lt;br /&gt;
&lt;br /&gt;
This document provides an overview/reference of the Declarative QML API for Plasmoids. It isn't a full binding to all of Qt or KDE's libraries, but a focused set of bindings designed to make writing Plasmoids fast and easy, while remaining powerful.&lt;br /&gt;
&lt;br /&gt;
The API in this documentation covers the API of the Plasma specific QML components, so only the Declarative part of the API.&lt;br /&gt;
&lt;br /&gt;
The QML ScriptEngine is bassed upon the Plasma JavaScript engine, making the API of the JavaScript part identical to the one of the JavaScript plasmoids engine.&lt;br /&gt;
To see the api of the global ''Plasmoid'' object, see the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#The_Global_plasmoid_Object JavaScript API] documentation.&lt;br /&gt;
(TODO: the JavaScript api paged should probably be copied and stripped down the imperative bits not present there, it would make harder to update tough)&lt;br /&gt;
&lt;br /&gt;
== What Is a Declarative Plasmoid?  ==&lt;br /&gt;
&lt;br /&gt;
To denote that this Plasmoid is a Declarative widget, ensure that in the metadata.desktop file there is this line: &lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
&lt;br /&gt;
What follows is a description of the Plasma declarative classes instantiable from QML.&lt;br /&gt;
&lt;br /&gt;
= Main QML classes =&lt;br /&gt;
&lt;br /&gt;
== Data engines ==&lt;br /&gt;
While it's possible to fetch data from a Plasma DataEngine in the same way as the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#DataEngine JavaScript API], however it is preferrable to use the following declarative classes:&lt;br /&gt;
&lt;br /&gt;
=== DataSource ===&lt;br /&gt;
DataSource is a receiver for a dataEngine and can be declared inside QML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
 PlasmaCore.DataSource {&lt;br /&gt;
     id: dataSource&lt;br /&gt;
     engine: &amp;quot;time&amp;quot;&lt;br /&gt;
     connectedSources: [&amp;quot;Local&amp;quot;]&lt;br /&gt;
     interval: 500&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Properties ====&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* bool '''valid''' (read only): true when the DataSource is successfully connected to a data engine&lt;br /&gt;
* int '''interval''': interval of polling of the dataengine, if 0 (default value) no polling will be executed&lt;br /&gt;
* string '''engine''': the plugin name of the dataengine to load&lt;br /&gt;
* Array(string) '''connectedSources''': all the sources of the dataengine we are connected to (and whose data will appear in the '''data''' property)&lt;br /&gt;
* Array(string) '''sources''' (read only): all the sources available from the dataengine&lt;br /&gt;
* variant map '''data''' (read only): It's the most important property, it's a map of all the data available from the dataengine: its structure will be as follows:&lt;br /&gt;
** each key of the map will be a source name, in '''connectedSources'''&lt;br /&gt;
** each value will be a variant hash, so an hash with strings as keys and any variant as value&lt;br /&gt;
** example: dataSource.data[&amp;quot;Local&amp;quot;][&amp;quot;Time&amp;quot;] indicates the '''Time''' key of the dataengine source called &amp;quot;Local&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Signals ====&lt;br /&gt;
It has the following signals:&lt;br /&gt;
&lt;br /&gt;
Note that javascript/qml applies the 'on' prefix to signals. So the actual signal name in C++ which is e.g. '''newData''(...) becomes '''onNewData'''(...).&lt;br /&gt;
&lt;br /&gt;
* '''onNewData'''(String sourceName, Plasma::DataEngine::Data data)&lt;br /&gt;
* '''onSourceAdded'''(String source)&lt;br /&gt;
* '''onSourceRemoved'''(String source)&lt;br /&gt;
* '''onSourceConnected'''(String source)&lt;br /&gt;
* '''onSourceDisconnected'''(String source)&lt;br /&gt;
* '''onIntervalChanged'''()&lt;br /&gt;
* '''onEngineChanged'''()&lt;br /&gt;
* '''onDataChanged'''()&lt;br /&gt;
* '''onConnectedSourcesChanged'''()&lt;br /&gt;
* '''onSourcesChanged'''()&lt;br /&gt;
&lt;br /&gt;
==== Methods ====&lt;br /&gt;
It has the following methods:&lt;br /&gt;
* StringList keysForSource(String source): lists all the keys corresponding to a certain source: for instance in the &amp;quot;time&amp;quot; dataengine, for the &amp;quot;Local&amp;quot; source, keys will be:&lt;br /&gt;
** &amp;quot;Timezone Continent&amp;quot;&lt;br /&gt;
** &amp;quot;Offset&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone&amp;quot;&lt;br /&gt;
** &amp;quot;Time&amp;quot;&lt;br /&gt;
** &amp;quot;Date&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone City&amp;quot;&lt;br /&gt;
* Service serviceForSource(String source): returns a Plasma service that corresponds a given source: see the section about services for how to use it.&lt;br /&gt;
* void connectSource(String source): adds to '''connectedSources''' the new source&lt;br /&gt;
* void disconnectSource(String source): removes that source from '''connectedSources'''&lt;br /&gt;
&lt;br /&gt;
=== Service ===&lt;br /&gt;
Due to their imperative nature, Plasma Services are not instantiated as QML classes, but rather created out of a '''DataSource''' with the method '''serviceForSource''' and used in the JavaScript portions of the QML files.&lt;br /&gt;
This following example is a simplified version from the Now Playing QML widget in the kdeexamples git repository: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var service = dataSource.serviceForSource(activeSource)&lt;br /&gt;
  var operation = service.operationDescription(&amp;quot;seek&amp;quot;)&lt;br /&gt;
  operation.seconds = 10&lt;br /&gt;
&lt;br /&gt;
  var job = service.startOperationCall(operation)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Here dataSource is the id of a DataSource object, and activeSource is a source contained in one of its '''connectedSources'''.&lt;br /&gt;
The service provides an operation called &amp;quot;seek&amp;quot;, with a parameter called &amp;quot;seconds&amp;quot;, that can be written on it as a property of a JavaScript object.&lt;br /&gt;
&lt;br /&gt;
=== ServiceJob ===&lt;br /&gt;
If is necessary to monitor the result of a Service operation, it's possible to connect to the '''finished''' signal provided by the job return paramenter of the '''startOperationCall''' service method.&lt;br /&gt;
The '''finished''' signal has the same job as parameter, from which is possible to check the variant '''result''' property, to check the result.&lt;br /&gt;
&lt;br /&gt;
=== DataModel ===&lt;br /&gt;
Some data engines return as their data something that can be interpreted as a list of items, rather than simple key/value pairs.&lt;br /&gt;
QML provides some item views such as '''ListView''', '''GridView''' and '''Repeater'''.&lt;br /&gt;
The '''DataModel''' QML object can provide, based on a DataSource a model suitable for those QML item views.&lt;br /&gt;
&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* DataSource '''dataSource''': the id of an existing (and connected) DataSource&lt;br /&gt;
* String '''sourceFilter''': it's a regular expression. If the DataSource is connected to more than one source, only inserts data from sources matching this filter expression in the model. To, for example, have a source watch all sources beginning with say &amp;quot;name:&amp;quot;, the required regexp would be sourceFilter: &amp;quot;name:.*&amp;quot;&lt;br /&gt;
* String '''keyRoleFilter''': it's a regular expression. Only data with keys that match this filter expression will be inserted in the model&lt;br /&gt;
* int '''count''' (read only): how many items are in the model&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 ListView {&lt;br /&gt;
   model: PlasmaCore.DataModel {&lt;br /&gt;
        dataSource: microblogSource&lt;br /&gt;
        keyRoleFilter: &amp;quot;[\\d]*&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    delegate: Text {&lt;br /&gt;
        text: title&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the example, ''microblogSource'' is the id of a DataSource, and inserts in the model only entries that have a number as the key name (matched with [\\d]*, in this case tweets ids)&lt;br /&gt;
&lt;br /&gt;
Each item in the model will have the form of a variant hash: all the keys of the hash will be registered as model role names, in the example, &amp;quot;title&amp;quot; is a role of the model containing a string (also reachable with model[&amp;quot;title&amp;quot;]).&lt;br /&gt;
&lt;br /&gt;
A special reserved role will always be present: '''&amp;quot;DataEngineSource&amp;quot;''': it will contain the name of the data engine source that gave origin to this item. Therefore, if you want merely the string of the current source that the model is at...do model[&amp;quot;DataEngineSource&amp;quot;].&lt;br /&gt;
&lt;br /&gt;
Note that view.currentItem holds the item currently selected. However, due to (http://bugreports.qt.nokia.com/browse/QTBUG-16347) this does not work in PathView. A workaround is to make your own.&lt;br /&gt;
&lt;br /&gt;
=== SortFilterModel ===&lt;br /&gt;
SortFilterModel is a proxy model for easy sorting and/or filtering of the items in a DataModel (or any other QAbstractItemModel subclass that has been registered in QML with setContextProperty from a C++ application)&lt;br /&gt;
Properties:&lt;br /&gt;
* model '''sourceModel'''&lt;br /&gt;
* String '''filterRegExp'''&lt;br /&gt;
* String '''filterRole'''&lt;br /&gt;
* String '''sortRole'''&lt;br /&gt;
* Qt::SortOrder '''sortOrder'''&lt;br /&gt;
* int '''count''' (read only)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Popup Applet ==&lt;br /&gt;
So you want your QML applet to be a popup applet, like the device notifier (an icon in the panel shows and expands the applet)?&lt;br /&gt;
&lt;br /&gt;
Why, that's easy.&lt;br /&gt;
&lt;br /&gt;
To change your plasmoid from being a regular boring one, simply change&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
ServiceTypes=Plasma/Applet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
ServiceTypes=Plasma/Applet,Plasma/PopupApplet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then in the main QML item's Component.onCompleted, do:&lt;br /&gt;
&lt;br /&gt;
NOTE: the below code presently has no affect (FIXME).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    plasmoid.popupIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Plasma Themes ==&lt;br /&gt;
&lt;br /&gt;
=== Theme ===&lt;br /&gt;
This class instantiable from QML provides access to the Plasma Theme colors and other facilities such as fonts.&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* String '''themeName''' (read only)&lt;br /&gt;
* QFont '''font''' (read only)&lt;br /&gt;
* bool '''windowTranslucentEnabled''' (read only)&lt;br /&gt;
* Url '''homepage''' (read only)&lt;br /&gt;
* bool '''useGlobalSettings''' (read only)&lt;br /&gt;
* QString '''wallpaperPath''' (read only)&lt;br /&gt;
* color '''textColor''' (read only)&lt;br /&gt;
* color '''highlightColor''' (read only)&lt;br /&gt;
* color '''backgroundColor''' (read only)&lt;br /&gt;
* color '''buttonTextColor''' (read only)&lt;br /&gt;
* color '''buttonBackgroundColor''' (read only)&lt;br /&gt;
* color '''linkColor''' (read only)&lt;br /&gt;
* color visitedLinkColor''' (read only)&lt;br /&gt;
* color '''visitedLinkColor''' (read only)&lt;br /&gt;
* color '''buttonHoverColor''' (read only)&lt;br /&gt;
* color '''buttonFocusColor''' (read only)&lt;br /&gt;
* color '''viewTextColor''' (read only)&lt;br /&gt;
* color '''viewBackgroundColo''' (read only)r&lt;br /&gt;
* color '''viewHoverColor''' (read only)&lt;br /&gt;
* color '''viewFocusColor''' (read only)&lt;br /&gt;
* String '''styleSheet''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== Svg ===&lt;br /&gt;
Declaring a Svg element instantiates a Plasma Svg instance. This class doesn't draw anything, for drawing, SvgItem is used.&lt;br /&gt;
Properties:&lt;br /&gt;
* QSize '''size'''&lt;br /&gt;
* bool '''multipleImages'''&lt;br /&gt;
* String '''imagePath'''&lt;br /&gt;
* bool '''usingRenderingCache'''&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPixmap pixmap(QString elementID)&lt;br /&gt;
* void resize(qreal width, qreal height)&lt;br /&gt;
* void resize(): resets the image to its default dimension&lt;br /&gt;
* QSize elementSize(QString elementId)&lt;br /&gt;
* QRectF elementRect(QString elementId)&lt;br /&gt;
* bool hasElement(QString elementId)&lt;br /&gt;
* bool isValid(): true if valid svg file&lt;br /&gt;
&lt;br /&gt;
=== SvgItem ===&lt;br /&gt;
It's a graphical element that will actually paint a Svg instance.&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''elementId''': what element to render. If null, the whole svg will be rendered&lt;br /&gt;
* Svg '''svg''': instance of the Svg class mentioned above&lt;br /&gt;
* QSizeF '''naturalSize''' (read only): default size of the Svg&lt;br /&gt;
* bool '''smooth''': paint with antialias (default false)&lt;br /&gt;
&lt;br /&gt;
=== FrameSvgItem ===&lt;br /&gt;
It's a graphical element that paints a Plasma::FrameSvg, so a rectangular image composed by 9 elements contained in a Svg file, useful for things like buttons and frames.&lt;br /&gt;
&lt;br /&gt;
Flags&lt;br /&gt;
* EnabledBorders: combination of TopBorder | BottomBorder | LeftBorder | RightBorder, NoBorder if no border of the frame is enabled&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''imagePath''': path of the file relative to the Plasma Theme, for instance &amp;quot;widgets/background&amp;quot;&lt;br /&gt;
* String '''prefix''': a FrameSvg can contain multiple frames, for instance a button contains &amp;quot;normal&amp;quot;, &amp;quot;raised&amp;quot; and &amp;quot;pressed&amp;quot;&lt;br /&gt;
* Margins '''margins''' (read only): the margins of the frame, see documentation below&lt;br /&gt;
* EnabledBorders '''enabledBorders''': what borders are enabled&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
== Top Level windows ==&lt;br /&gt;
&lt;br /&gt;
=== Dialog ===&lt;br /&gt;
Dialog instantiates a Plasma::Dialog, it will be a Plasma themed top level window that can contain any QML component.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item mainItem: the Item contained in the Dialog, it can be any QML Item instance&lt;br /&gt;
* bool '''visible''': if the window (not the mainItem) is visible&lt;br /&gt;
* int '''x''': x position of the window in screen coordinates&lt;br /&gt;
* int '''y''': y position of the window in screen coordinates&lt;br /&gt;
* int '''width''' (read only): total width of the dialog, including margins&lt;br /&gt;
* int '''height''' (read only): total height of the dialog, including margins&lt;br /&gt;
* int '''windowFlags''': Qt window flags of the Dialog&lt;br /&gt;
* Margins '''margins''' (read only): margins of the Dialog&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPoint popupPosition(Item item, Qt::Alignment alignment=Qt::AlignLeft): the suggested position for the Dialog if it has to be correctly placed as popup of the QML item passed as parameter.&lt;br /&gt;
* void setAttribute(Qt::WindowAttribute attribute, bool on): set an attribute for the dialog window&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== ToolTip ===&lt;br /&gt;
Declaring a ToolTip instance makes it possible to use Plasma tooltips with any QML item.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item '''target''': the QML item we want to show a tooltip of&lt;br /&gt;
* String '''mainText'''&lt;br /&gt;
* String '''subText'''&lt;br /&gt;
* String '''image''': freedesktop compliant icon name as image of the tooltip&lt;br /&gt;
&lt;br /&gt;
= Plasma QtComponents (4.8) =&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/API</id>
		<title>Development/Tutorials/Plasma/QML/API</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/API"/>
				<updated>2011-08-17T22:26:39Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: add popup applet crap&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction to the Plasmoid QML Declarative API  =&lt;br /&gt;
&lt;br /&gt;
This document provides an overview/reference of the Declarative QML API for Plasmoids. It isn't a full binding to all of Qt or KDE's libraries, but a focused set of bindings designed to make writing Plasmoids fast and easy, while remaining powerful.&lt;br /&gt;
&lt;br /&gt;
The API in this documentation covers the API of the Plasma specific QML components, so only the Declarative part of the API.&lt;br /&gt;
&lt;br /&gt;
The QML ScriptEngine is bassed upon the Plasma JavaScript engine, making the API of the JavaScript part identical to the one of the JavaScript plasmoids engine.&lt;br /&gt;
To see the api of the global ''Plasmoid'' object, see the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#The_Global_plasmoid_Object JavaScript API] documentation.&lt;br /&gt;
(TODO: the JavaScript api paged should probably be copied and stripped down the imperative bits not present there, it would make harder to update tough)&lt;br /&gt;
&lt;br /&gt;
== What Is a Declarative Plasmoid?  ==&lt;br /&gt;
&lt;br /&gt;
To denote that this Plasmoid is a Declarative widget, ensure that in the metadata.desktop file there is this line: &lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
&lt;br /&gt;
What follows is a description of the Plasma declarative classes instantiable from QML.&lt;br /&gt;
&lt;br /&gt;
= Main QML classes =&lt;br /&gt;
&lt;br /&gt;
== Data engines ==&lt;br /&gt;
While it's possible to fetch data from a Plasma DataEngine in the same way as the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#DataEngine JavaScript API], however it is preferrable to use the following declarative classes:&lt;br /&gt;
&lt;br /&gt;
=== DataSource ===&lt;br /&gt;
DataSource is a receiver for a dataEngine and can be declared inside QML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
 PlasmaCore.DataSource {&lt;br /&gt;
     id: dataSource&lt;br /&gt;
     engine: &amp;quot;time&amp;quot;&lt;br /&gt;
     connectedSources: [&amp;quot;Local&amp;quot;]&lt;br /&gt;
     interval: 500&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Properties ====&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* bool '''valid''' (read only): true when the DataSource is successfully connected to a data engine&lt;br /&gt;
* int '''interval''': interval of polling of the dataengine, if 0 (default value) no polling will be executed&lt;br /&gt;
* string '''engine''': the plugin name of the dataengine to load&lt;br /&gt;
* Array(string) '''connectedSources''': all the sources of the dataengine we are connected to (and whose data will appear in the '''data''' property)&lt;br /&gt;
* Array(string) '''sources''' (read only): all the sources available from the dataengine&lt;br /&gt;
* variant map '''data''' (read only): It's the most important property, it's a map of all the data available from the dataengine: its structure will be as follows:&lt;br /&gt;
** each key of the map will be a source name, in '''connectedSources'''&lt;br /&gt;
** each value will be a variant hash, so an hash with strings as keys and any variant as value&lt;br /&gt;
** example: dataSource.data[&amp;quot;Local&amp;quot;][&amp;quot;Time&amp;quot;] indicates the '''Time''' key of the dataengine source called &amp;quot;Local&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Signals ====&lt;br /&gt;
It has the following signals:&lt;br /&gt;
&lt;br /&gt;
Note that javascript/qml applies the 'on' prefix to signals. So the actual signal name in C++ which is e.g. '''newData''(...) becomes '''onNewData'''(...).&lt;br /&gt;
&lt;br /&gt;
* '''onNewData'''(String sourceName, Plasma::DataEngine::Data data)&lt;br /&gt;
* '''onSourceAdded'''(String source)&lt;br /&gt;
* '''onSourceRemoved'''(String source)&lt;br /&gt;
* '''onSourceConnected'''(String source)&lt;br /&gt;
* '''onSourceDisconnected'''(String source)&lt;br /&gt;
* '''onIntervalChanged'''()&lt;br /&gt;
* '''onEngineChanged'''()&lt;br /&gt;
* '''onDataChanged'''()&lt;br /&gt;
* '''onConnectedSourcesChanged'''()&lt;br /&gt;
* '''onSourcesChanged'''()&lt;br /&gt;
&lt;br /&gt;
==== Methods ====&lt;br /&gt;
It has the following methods:&lt;br /&gt;
* StringList keysForSource(String source): lists all the keys corresponding to a certain source: for instance in the &amp;quot;time&amp;quot; dataengine, for the &amp;quot;Local&amp;quot; source, keys will be:&lt;br /&gt;
** &amp;quot;Timezone Continent&amp;quot;&lt;br /&gt;
** &amp;quot;Offset&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone&amp;quot;&lt;br /&gt;
** &amp;quot;Time&amp;quot;&lt;br /&gt;
** &amp;quot;Date&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone City&amp;quot;&lt;br /&gt;
* Service serviceForSource(String source): returns a Plasma service that corresponds a given source: see the section about services for how to use it.&lt;br /&gt;
* void connectSource(String source): adds to '''connectedSources''' the new source&lt;br /&gt;
* void disconnectSource(String source): removes that source from '''connectedSources'''&lt;br /&gt;
&lt;br /&gt;
=== Service ===&lt;br /&gt;
Due to their imperative nature, Plasma Services are not instantiated as QML classes, but rather created out of a '''DataSource''' with the method '''serviceForSource''' and used in the JavaScript portions of the QML files.&lt;br /&gt;
This following example is a simplified version from the Now Playing QML widget in the kdeexamples git repository: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var service = dataSource.serviceForSource(activeSource)&lt;br /&gt;
  var operation = service.operationDescription(&amp;quot;seek&amp;quot;)&lt;br /&gt;
  operation.seconds = 10&lt;br /&gt;
&lt;br /&gt;
  var job = service.startOperationCall(operation)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Here dataSource is the id of a DataSource object, and activeSource is a source contained in one of its '''connectedSources'''.&lt;br /&gt;
The service provides an operation called &amp;quot;seek&amp;quot;, with a parameter called &amp;quot;seconds&amp;quot;, that can be written on it as a property of a JavaScript object.&lt;br /&gt;
&lt;br /&gt;
=== ServiceJob ===&lt;br /&gt;
If is necessary to monitor the result of a Service operation, it's possible to connect to the '''finished''' signal provided by the job return paramenter of the '''startOperationCall''' service method.&lt;br /&gt;
The '''finished''' signal has the same job as parameter, from which is possible to check the variant '''result''' property, to check the result.&lt;br /&gt;
&lt;br /&gt;
=== DataModel ===&lt;br /&gt;
Some data engines return as their data something that can be interpreted as a list of items, rather than simple key/value pairs.&lt;br /&gt;
QML provides some item views such as '''ListView''', '''GridView''' and '''Repeater'''.&lt;br /&gt;
The '''DataModel''' QML object can provide, based on a DataSource a model suitable for those QML item views.&lt;br /&gt;
&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* DataSource '''dataSource''': the id of an existing (and connected) DataSource&lt;br /&gt;
* String '''sourceFilter''': it's a regular expression. If the DataSource is connected to more than one source, only inserts data from sources matching this filter expression in the model. To, for example, have a source watch all sources beginning with say &amp;quot;name:&amp;quot;, the required regexp would be sourceFilter: &amp;quot;name:.*&amp;quot;&lt;br /&gt;
* String '''keyRoleFilter''': it's a regular expression. Only data with keys that match this filter expression will be inserted in the model&lt;br /&gt;
* int '''count''' (read only): how many items are in the model&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 ListView {&lt;br /&gt;
   model: PlasmaCore.DataModel {&lt;br /&gt;
        dataSource: microblogSource&lt;br /&gt;
        keyRoleFilter: &amp;quot;[\\d]*&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    delegate: Text {&lt;br /&gt;
        text: title&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the example, ''microblogSource'' is the id of a DataSource, and inserts in the model only entries that have a number as the key name (matched with [\\d]*, in this case tweets ids)&lt;br /&gt;
&lt;br /&gt;
Each item in the model will have the form of a variant hash: all the keys of the hash will be registered as model role names, in the example, &amp;quot;title&amp;quot; is a role of the model containing a string (also reachable with model[&amp;quot;title&amp;quot;]).&lt;br /&gt;
&lt;br /&gt;
A special reserved role will always be present: '''&amp;quot;DataEngineSource&amp;quot;''': it will contain the name of the data engine source that gave origin to this item. Therefore, if you want merely the string of the current source that the model is at...do model[&amp;quot;DataEngineSource&amp;quot;].&lt;br /&gt;
&lt;br /&gt;
Note that view.currentItem holds the item currently selected. However, due to (http://bugreports.qt.nokia.com/browse/QTBUG-16347) this does not work in PathView. A workaround is to make your own.&lt;br /&gt;
&lt;br /&gt;
=== SortFilterModel ===&lt;br /&gt;
SortFilterModel is a proxy model for easy sorting and/or filtering of the items in a DataModel (or any other QAbstractItemModel subclass that has been registered in QML with setContextProperty from a C++ application)&lt;br /&gt;
Properties:&lt;br /&gt;
* model '''sourceModel'''&lt;br /&gt;
* String '''filterRegExp'''&lt;br /&gt;
* String '''filterRole'''&lt;br /&gt;
* String '''sortRole'''&lt;br /&gt;
* Qt::SortOrder '''sortOrder'''&lt;br /&gt;
* int '''count''' (read only)&lt;br /&gt;
&lt;br /&gt;
== Plasma Themes ==&lt;br /&gt;
&lt;br /&gt;
=== Theme ===&lt;br /&gt;
This class instantiable from QML provides access to the Plasma Theme colors and other facilities such as fonts.&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* String '''themeName''' (read only)&lt;br /&gt;
* QFont '''font''' (read only)&lt;br /&gt;
* bool '''windowTranslucentEnabled''' (read only)&lt;br /&gt;
* Url '''homepage''' (read only)&lt;br /&gt;
* bool '''useGlobalSettings''' (read only)&lt;br /&gt;
* QString '''wallpaperPath''' (read only)&lt;br /&gt;
* color '''textColor''' (read only)&lt;br /&gt;
* color '''highlightColor''' (read only)&lt;br /&gt;
* color '''backgroundColor''' (read only)&lt;br /&gt;
* color '''buttonTextColor''' (read only)&lt;br /&gt;
* color '''buttonBackgroundColor''' (read only)&lt;br /&gt;
* color '''linkColor''' (read only)&lt;br /&gt;
* color visitedLinkColor''' (read only)&lt;br /&gt;
* color '''visitedLinkColor''' (read only)&lt;br /&gt;
* color '''buttonHoverColor''' (read only)&lt;br /&gt;
* color '''buttonFocusColor''' (read only)&lt;br /&gt;
* color '''viewTextColor''' (read only)&lt;br /&gt;
* color '''viewBackgroundColo''' (read only)r&lt;br /&gt;
* color '''viewHoverColor''' (read only)&lt;br /&gt;
* color '''viewFocusColor''' (read only)&lt;br /&gt;
* String '''styleSheet''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== Svg ===&lt;br /&gt;
Declaring a Svg element instantiates a Plasma Svg instance. This class doesn't draw anything, for drawing, SvgItem is used.&lt;br /&gt;
Properties:&lt;br /&gt;
* QSize '''size'''&lt;br /&gt;
* bool '''multipleImages'''&lt;br /&gt;
* String '''imagePath'''&lt;br /&gt;
* bool '''usingRenderingCache'''&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPixmap pixmap(QString elementID)&lt;br /&gt;
* void resize(qreal width, qreal height)&lt;br /&gt;
* void resize(): resets the image to its default dimension&lt;br /&gt;
* QSize elementSize(QString elementId)&lt;br /&gt;
* QRectF elementRect(QString elementId)&lt;br /&gt;
* bool hasElement(QString elementId)&lt;br /&gt;
* bool isValid(): true if valid svg file&lt;br /&gt;
&lt;br /&gt;
=== SvgItem ===&lt;br /&gt;
It's a graphical element that will actually paint a Svg instance.&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''elementId''': what element to render. If null, the whole svg will be rendered&lt;br /&gt;
* Svg '''svg''': instance of the Svg class mentioned above&lt;br /&gt;
* QSizeF '''naturalSize''' (read only): default size of the Svg&lt;br /&gt;
* bool '''smooth''': paint with antialias (default false)&lt;br /&gt;
&lt;br /&gt;
=== FrameSvgItem ===&lt;br /&gt;
It's a graphical element that paints a Plasma::FrameSvg, so a rectangular image composed by 9 elements contained in a Svg file, useful for things like buttons and frames.&lt;br /&gt;
&lt;br /&gt;
Flags&lt;br /&gt;
* EnabledBorders: combination of TopBorder | BottomBorder | LeftBorder | RightBorder, NoBorder if no border of the frame is enabled&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''imagePath''': path of the file relative to the Plasma Theme, for instance &amp;quot;widgets/background&amp;quot;&lt;br /&gt;
* String '''prefix''': a FrameSvg can contain multiple frames, for instance a button contains &amp;quot;normal&amp;quot;, &amp;quot;raised&amp;quot; and &amp;quot;pressed&amp;quot;&lt;br /&gt;
* Margins '''margins''' (read only): the margins of the frame, see documentation below&lt;br /&gt;
* EnabledBorders '''enabledBorders''': what borders are enabled&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
== Top Level windows ==&lt;br /&gt;
&lt;br /&gt;
=== Dialog ===&lt;br /&gt;
Dialog instantiates a Plasma::Dialog, it will be a Plasma themed top level window that can contain any QML component.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item mainItem: the Item contained in the Dialog, it can be any QML Item instance&lt;br /&gt;
* bool '''visible''': if the window (not the mainItem) is visible&lt;br /&gt;
* int '''x''': x position of the window in screen coordinates&lt;br /&gt;
* int '''y''': y position of the window in screen coordinates&lt;br /&gt;
* int '''width''' (read only): total width of the dialog, including margins&lt;br /&gt;
* int '''height''' (read only): total height of the dialog, including margins&lt;br /&gt;
* int '''windowFlags''': Qt window flags of the Dialog&lt;br /&gt;
* Margins '''margins''' (read only): margins of the Dialog&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPoint popupPosition(Item item, Qt::Alignment alignment=Qt::AlignLeft): the suggested position for the Dialog if it has to be correctly placed as popup of the QML item passed as parameter.&lt;br /&gt;
* void setAttribute(Qt::WindowAttribute attribute, bool on): set an attribute for the dialog window&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== ToolTip ===&lt;br /&gt;
Declaring a ToolTip instance makes it possible to use Plasma tooltips with any QML item.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item '''target''': the QML item we want to show a tooltip of&lt;br /&gt;
* String '''mainText'''&lt;br /&gt;
* String '''subText'''&lt;br /&gt;
* String '''image''': freedesktop compliant icon name as image of the tooltip&lt;br /&gt;
&lt;br /&gt;
== Popup Applet ==&lt;br /&gt;
So you want your QML applet to be a popup applet, like the device notifier (an icon in the panel shows and expands the applet)?&lt;br /&gt;
&lt;br /&gt;
Why, that's easy.&lt;br /&gt;
&lt;br /&gt;
To change your plasmoid from being a regular boring one, simply change&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
ServiceTypes=Plasma/Applet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
ServiceTypes=Plasma/Applet,Plasma/PopupApplet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then in the main QML item's Component.onCompleted, do:&lt;br /&gt;
&lt;br /&gt;
NOTE: the below code presently has no affect (FIXME).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    plasmoid.popupIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Plasma QtComponents (4.8) =&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted</id>
		<title>Development/Tutorials/Plasma/QML/GettingStarted</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted"/>
				<updated>2011-08-10T18:36:36Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* QML Basics */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Writing a plasma applet in QML is very easy, in fact, with KDE 4.6 and Qt 4.7 it just works.&lt;br /&gt;
&lt;br /&gt;
== QML Basics ==&lt;br /&gt;
&lt;br /&gt;
It is recommended that you have read through the [http://doc.qt.nokia.com/4.7/qtquick.html Qt QML Tutorials], as there are quite a few and they are explained thoroughly. There is also a list of all [http://doc.qt.nokia.com/4.7/qdeclarativeelements.html standard QML elements].&lt;br /&gt;
&lt;br /&gt;
Essentially, most of the content is the same. The exceptions to be noted are how data is gathered...since we use Data Engines, it is a bit different. Text color and font should be made to use PlasmaCore.Theme.&lt;br /&gt;
&lt;br /&gt;
See the [https://projects.kde.org/projects/kde/kdeexamples KDE Examples] repository for more KDE-related helpful resources.&lt;br /&gt;
&lt;br /&gt;
=== Root Item ===&lt;br /&gt;
&lt;br /&gt;
The root item can be anything that inherits QGraphicsItem. For example, in this case it is QGraphicsWidget which is a plasmoid. It can also simply be an Item. I also noticed that PathView does not respond to mouse inputs automatically (so flicking doesn't work). Probably because events are being intercepted. So take note, it'll have to be e.g. an Item, for that case.&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
&lt;br /&gt;
==== Row and Column ====&lt;br /&gt;
&lt;br /&gt;
==== Anchors ====&lt;br /&gt;
Anchor layouts offer a nice way of grouping UI elements nicely together. The idea is that you connect edges or corners of one element to the edge or corner of another widget.&lt;br /&gt;
Some examples:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 200&lt;br /&gt;
    height: 300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Text {&lt;br /&gt;
        id: first&lt;br /&gt;
        text: i18n(&amp;quot;1st line&amp;quot;)&lt;br /&gt;
        anchors { top: parent.top;&lt;br /&gt;
                  left: parent.left;&lt;br /&gt;
                  right: parent.right;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    Text {&lt;br /&gt;
        id: second&lt;br /&gt;
        text: i18n(&amp;quot;2nd line&amp;quot;)&lt;br /&gt;
        anchors { top: first.bottom;&lt;br /&gt;
                  left: parent.left;&lt;br /&gt;
                  right: parent.right;&lt;br /&gt;
                  bottom: parent.bottom;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Buttons ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Animations ===&lt;br /&gt;
&lt;br /&gt;
== Package Structure ==&lt;br /&gt;
&lt;br /&gt;
You create a .desktop file and the .qml file. They have to be in the usual plasma package structure.&lt;br /&gt;
&lt;br /&gt;
plasmoid-qml/metadata.desktop&lt;br /&gt;
plasmoid-qml/contents/ui/main.qml&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;metadata.desktop&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Name=Hello QML&lt;br /&gt;
Comment=A hello world widget in QML&lt;br /&gt;
Icon=chronometer&lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
X-Plasma-MainScript=ui/main.qml&lt;br /&gt;
X-Plasma-DefaultSize=200,100&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Author=Frederik Gladhorn&lt;br /&gt;
X-KDE-PluginInfo-Email=gladhorn@kde.org&lt;br /&gt;
X-KDE-PluginInfo-Website=http://plasma.kde.org/&lt;br /&gt;
X-KDE-PluginInfo-Category=Examples&lt;br /&gt;
X-KDE-PluginInfo-Name=org.kde.hello-qml&lt;br /&gt;
X-KDE-PluginInfo-Version=0.0&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Depends=&lt;br /&gt;
X-KDE-PluginInfo-License=GPL&lt;br /&gt;
X-KDE-PluginInfo-EnabledByDefault=true&lt;br /&gt;
X-KDE-ServiceTypes=Plasma/Applet&lt;br /&gt;
Type=Service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  &amp;lt;tt&amp;gt;main.qml&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing ==&lt;br /&gt;
You can install your plasmoid:&lt;br /&gt;
plasmapkg --install plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
== plasmoidviewer ==&lt;br /&gt;
You can run it in plasmoidviewer as usual:&lt;br /&gt;
plasmoidviewer plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
== qmlviewer ==&lt;br /&gt;
It's possible to use Plasma specific imports in qml files loaded by qmlviewer:&lt;br /&gt;
&lt;br /&gt;
qmlviewer -I /usr/lib/kde4/imports/ plasmoid-qml/contents/qml/main.qml &lt;br /&gt;
&lt;br /&gt;
Where the -I is the path to the plasma plugin for qml. Try to look for the path of &lt;br /&gt;
/usr/lib/kde4/imports/org/kde/plasma/graphicswidgets/libgraphicswidgetsbindingsplugin.so&lt;br /&gt;
and use everything up to org of that path.&lt;br /&gt;
&lt;br /&gt;
Hovewer it's '''strongly discouraged''' to use qmlviewer to develop plasmoids, because some features won't be available there:&lt;br /&gt;
* localization with i18n()&lt;br /&gt;
* access to the global ''plasmoid'' object&lt;br /&gt;
* device specific qml files imported with plasmapackage:// urls&lt;br /&gt;
* bindings for qicons, KJobs, services and KConfig&lt;br /&gt;
&lt;br /&gt;
= Features only available in Plasma widgets =&lt;br /&gt;
In order to have a better integration with the KDE platform and to reach an higher degree of expressivity, the stock features of QML have been expanded with the following features, that strictly follow the Plasmoid JavaScript API:&lt;br /&gt;
&lt;br /&gt;
== Plasmoid object ==&lt;br /&gt;
Every QML plasmoid will have an object called ''plasmoid'', that will give access to the configuration, the formfactor, immutability and so on. It offers the same api as the object with the same name in the Javascript API.&lt;br /&gt;
&lt;br /&gt;
For specific info on this, see [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API-PlasmoidObject Javascript API-Plasmoid Object]&lt;br /&gt;
&lt;br /&gt;
== Localization ==&lt;br /&gt;
It's possible to localize strings with the usual i18n(), i18nc(), i18np() global functions&lt;br /&gt;
&lt;br /&gt;
== Extra types ==&lt;br /&gt;
Some extra types are available from withing JavaScript, namely&lt;br /&gt;
&lt;br /&gt;
* KConfigGroup: it's an object with its cnfig keys readable and writable as properties&lt;br /&gt;
* QIcon: can be constructed with QIcon(&amp;quot;fdo name&amp;quot;) such as QIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
* KJob&lt;br /&gt;
* Plasma Service api&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Plasma specific imports =&lt;br /&gt;
To use some Plasma specific features is necessary to use some particular QML imports.&lt;br /&gt;
&lt;br /&gt;
== Plasma Core ==&lt;br /&gt;
org.kde.plasma.core&lt;br /&gt;
This is the import that lets you access to the most important Plasma Core features.&lt;br /&gt;
&lt;br /&gt;
=== DataSource ===&lt;br /&gt;
Used to connect to a dataengine&lt;br /&gt;
&lt;br /&gt;
=== DataModel ===&lt;br /&gt;
Attaches to a DataSource, makes possible to use a dataengine as a model for a QML ListView, GridView, PathView and so on&lt;br /&gt;
&lt;br /&gt;
=== Svg ===&lt;br /&gt;
Loads a Plasma Svg, it's not the visual item&lt;br /&gt;
&lt;br /&gt;
=== SvgItem ===&lt;br /&gt;
Visual item that paints a Svg&lt;br /&gt;
&lt;br /&gt;
=== FrameSvg ===&lt;br /&gt;
Loads a Plasma FrameSvg, it's not the visual item.&lt;br /&gt;
&lt;br /&gt;
=== FrameSvgItem ===&lt;br /&gt;
Visual item that displays a Plasma FrameSvg&lt;br /&gt;
&lt;br /&gt;
== Extra Qt features ==&lt;br /&gt;
org.kde.qtextraimports&lt;br /&gt;
&lt;br /&gt;
* QPixmapItem&lt;br /&gt;
* QImageItem&lt;br /&gt;
* QIconItem&lt;br /&gt;
&lt;br /&gt;
== Plasma Widgets in QML ==&lt;br /&gt;
To use standard plasma widgets (e.g. Plasma::LineEdit, etc.), you simply add an import line for them.&lt;br /&gt;
All properties, signals and slots from ordinary Plasma widgets are available there.&lt;br /&gt;
Those widgets are provided as a transition tool, intended to be replaced by the Plasma version of QtComponents.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.graphicswidgets 0.1 as PlasmaWidgets&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 64&lt;br /&gt;
    height: 64&lt;br /&gt;
    PlasmaWidgets.IconWidget {&lt;br /&gt;
        id: icon&lt;br /&gt;
        Component.onCompleted: setIcon(&amp;quot;flag-red&amp;quot;)&lt;br /&gt;
        anchors.centerIn: parent&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/API</id>
		<title>Development/Tutorials/Plasma/QML/API</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/API"/>
				<updated>2011-08-01T20:33:58Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* FrameSvgItem */ grammar++&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction to the Plasmoid QML Declarative API  =&lt;br /&gt;
&lt;br /&gt;
This document provides an overview/reference of the Declarative QML API for Plasmoids. It isn't a full binding to all of Qt or KDE's libraries, but a focused set of bindings designed to make writing Plasmoids fast and easy, while remaining powerful.&lt;br /&gt;
&lt;br /&gt;
The API in this documentation covers the API of the Plasma specific QML components, so only the Declarative part of the API.&lt;br /&gt;
&lt;br /&gt;
The QML ScriptEngine is bassed upon the Plasma JavaScript engine, making the API of the JavaScript part identical to the one of the JavaScript plasmoids engine.&lt;br /&gt;
To see the api of the global ''Plasmoid'' object, see the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#The_Global_plasmoid_Object JavaScript API] documentation.&lt;br /&gt;
(TODO: the JavaScript api paged should probably be copied and stripped down the imperative bits not present there, it would make harder to update tough)&lt;br /&gt;
&lt;br /&gt;
== What Is a Declarative Plasmoid?  ==&lt;br /&gt;
&lt;br /&gt;
To denote that this Plasmoid is a Declarative widget, ensure that in the metadata.desktop file there is this line: &lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
&lt;br /&gt;
What follows is a description of the Plasma declarative classes instantiable from QML.&lt;br /&gt;
&lt;br /&gt;
= Main QML classes =&lt;br /&gt;
&lt;br /&gt;
== Data engines ==&lt;br /&gt;
While it's possible to fetch data from a Plasma DataEngine in the same way as the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#DataEngine JavaScript API], however it is preferrable to use the following declarative classes:&lt;br /&gt;
&lt;br /&gt;
=== DataSource ===&lt;br /&gt;
DataSource is a receiver for a dataEngine and can be declared inside QML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
 PlasmaCore.DataSource {&lt;br /&gt;
     id: dataSource&lt;br /&gt;
     engine: &amp;quot;time&amp;quot;&lt;br /&gt;
     connectedSources: [&amp;quot;Local&amp;quot;]&lt;br /&gt;
     interval: 500&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Properties ====&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* bool '''valid''' (read only): true when the DataSource is successfully connected to a data engine&lt;br /&gt;
* int '''interval''': interval of polling of the dataengine, if 0 (default value) no polling will be executed&lt;br /&gt;
* string '''engine''': the plugin name of the dataengine to load&lt;br /&gt;
* Array(string) '''connectedSources''': all the sources of the dataengine we are connected to (and whose data will appear in the '''data''' property)&lt;br /&gt;
* Array(string) '''sources''' (read only): all the sources available from the dataengine&lt;br /&gt;
* variant map '''data''' (read only): It's the most important property, it's a map of all the data available from the dataengine: its structure will be as follows:&lt;br /&gt;
** each key of the map will be a source name, in '''connectedSources'''&lt;br /&gt;
** each value will be a variant hash, so an hash with strings as keys and any variant as value&lt;br /&gt;
** example: dataSource.data[&amp;quot;Local&amp;quot;][&amp;quot;Time&amp;quot;] indicates the '''Time''' key of the dataengine source called &amp;quot;Local&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Signals ====&lt;br /&gt;
It has the following signals:&lt;br /&gt;
&lt;br /&gt;
Note that javascript/qml applies the 'on' prefix to signals. So the actual signal name in C++ which is e.g. '''newData''(...) becomes '''onNewData'''(...).&lt;br /&gt;
&lt;br /&gt;
* '''onNewData'''(String sourceName, Plasma::DataEngine::Data data)&lt;br /&gt;
* '''onSourceAdded'''(String source)&lt;br /&gt;
* '''onSourceRemoved'''(String source)&lt;br /&gt;
* '''onSourceConnected'''(String source)&lt;br /&gt;
* '''onSourceDisconnected'''(String source)&lt;br /&gt;
* '''onIntervalChanged'''()&lt;br /&gt;
* '''onEngineChanged'''()&lt;br /&gt;
* '''onDataChanged'''()&lt;br /&gt;
* '''onConnectedSourcesChanged'''()&lt;br /&gt;
* '''onSourcesChanged'''()&lt;br /&gt;
&lt;br /&gt;
==== Methods ====&lt;br /&gt;
It has the following methods:&lt;br /&gt;
* StringList keysForSource(String source): lists all the keys corresponding to a certain source: for instance in the &amp;quot;time&amp;quot; dataengine, for the &amp;quot;Local&amp;quot; source, keys will be:&lt;br /&gt;
** &amp;quot;Timezone Continent&amp;quot;&lt;br /&gt;
** &amp;quot;Offset&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone&amp;quot;&lt;br /&gt;
** &amp;quot;Time&amp;quot;&lt;br /&gt;
** &amp;quot;Date&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone City&amp;quot;&lt;br /&gt;
* Service serviceForSource(String source): returns a Plasma service that corresponds a given source: see the section about services for how to use it.&lt;br /&gt;
* void connectSource(String source): adds to '''connectedSources''' the new source&lt;br /&gt;
* void disconnectSource(String source): removes that source from '''connectedSources'''&lt;br /&gt;
&lt;br /&gt;
=== Service ===&lt;br /&gt;
Due to their imperative nature, Plasma Services are not instantiated as QML classes, but rather created out of a '''DataSource''' with the method '''serviceForSource''' and used in the JavaScript portions of the QML files.&lt;br /&gt;
This following example is a simplified version from the Now Playing QML widget in the kdeexamples git repository: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var service = dataSource.serviceForSource(activeSource)&lt;br /&gt;
  var operation = service.operationDescription(&amp;quot;seek&amp;quot;)&lt;br /&gt;
  operation.seconds = 10&lt;br /&gt;
&lt;br /&gt;
  var job = service.startOperationCall(operation)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Here dataSource is the id of a DataSource object, and activeSource is a source contained in one of its '''connectedSources'''.&lt;br /&gt;
The service provides an operation called &amp;quot;seek&amp;quot;, with a parameter called &amp;quot;seconds&amp;quot;, that can be written on it as a property of a JavaScript object.&lt;br /&gt;
&lt;br /&gt;
=== ServiceJob ===&lt;br /&gt;
If is necessary to monitor the result of a Service operation, it's possible to connect to the '''finished''' signal provided by the job return paramenter of the '''startOperationCall''' service method.&lt;br /&gt;
The '''finished''' signal has the same job as parameter, from which is possible to check the variant '''result''' property, to check the result.&lt;br /&gt;
&lt;br /&gt;
=== DataModel ===&lt;br /&gt;
Some data engines return as their data something that can be interpreted as a list of items, rather than simple key/value pairs.&lt;br /&gt;
QML provides some item views such as '''ListView''', '''GridView''' and '''Repeater'''.&lt;br /&gt;
The '''DataModel''' QML object can provide, based on a DataSource a model suitable for those QML item views.&lt;br /&gt;
&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* DataSource '''dataSource''': the id of an existing (and connected) DataSource&lt;br /&gt;
* String '''sourceFilter''': it's a regular expression. If the DataSource is connected to more than one source, only inserts data from sources matching this filter expression in the model. To, for example, have a source watch all sources beginning with say &amp;quot;name:&amp;quot;, the required regexp would be sourceFilter: &amp;quot;name:.*&amp;quot;&lt;br /&gt;
* String '''keyRoleFilter''': it's a regular expression. Only data with keys that match this filter expression will be inserted in the model&lt;br /&gt;
* int '''count''' (read only): how many items are in the model&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 ListView {&lt;br /&gt;
   model: PlasmaCore.DataModel {&lt;br /&gt;
        dataSource: microblogSource&lt;br /&gt;
        keyRoleFilter: &amp;quot;[\\d]*&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    delegate: Text {&lt;br /&gt;
        text: title&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the example, ''microblogSource'' is the id of a DataSource, and inserts in the model only entries that have a number as the key name (matched with [\\d]*, in this case tweets ids)&lt;br /&gt;
&lt;br /&gt;
Each item in the model will have the form of a variant hash: all the keys of the hash will be registered as model role names, in the example, &amp;quot;title&amp;quot; is a role of the model containing a string (also reachable with model[&amp;quot;title&amp;quot;]).&lt;br /&gt;
&lt;br /&gt;
A special reserved role will always be present: '''&amp;quot;DataEngineSource&amp;quot;''': it will contain the name of the data engine source that gave origin to this item. Therefore, if you want merely the string of the current source that the model is at...do model[&amp;quot;DataEngineSource&amp;quot;].&lt;br /&gt;
&lt;br /&gt;
Note that view.currentItem holds the item currently selected. However, due to (http://bugreports.qt.nokia.com/browse/QTBUG-16347) this does not work in PathView. A workaround is to make your own.&lt;br /&gt;
&lt;br /&gt;
=== SortFilterModel ===&lt;br /&gt;
SortFilterModel is a proxy model for easy sorting and/or filtering of the items in a DataModel (or any other QAbstractItemModel subclass that has been registered in QML with setContextProperty from a C++ application)&lt;br /&gt;
Properties:&lt;br /&gt;
* model '''sourceModel'''&lt;br /&gt;
* String '''filterRegExp'''&lt;br /&gt;
* String '''filterRole'''&lt;br /&gt;
* String '''sortRole'''&lt;br /&gt;
* Qt::SortOrder '''sortOrder'''&lt;br /&gt;
* int '''count''' (read only)&lt;br /&gt;
&lt;br /&gt;
== Plasma Themes ==&lt;br /&gt;
&lt;br /&gt;
=== Theme ===&lt;br /&gt;
This class instantiable from QML provides access to the Plasma Theme colors and other facilities such as fonts.&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* String '''themeName''' (read only)&lt;br /&gt;
* QFont '''font''' (read only)&lt;br /&gt;
* bool '''windowTranslucentEnabled''' (read only)&lt;br /&gt;
* Url '''homepage''' (read only)&lt;br /&gt;
* bool '''useGlobalSettings''' (read only)&lt;br /&gt;
* QString '''wallpaperPath''' (read only)&lt;br /&gt;
* color '''textColor''' (read only)&lt;br /&gt;
* color '''highlightColor''' (read only)&lt;br /&gt;
* color '''backgroundColor''' (read only)&lt;br /&gt;
* color '''buttonTextColor''' (read only)&lt;br /&gt;
* color '''buttonBackgroundColor''' (read only)&lt;br /&gt;
* color '''linkColor''' (read only)&lt;br /&gt;
* color visitedLinkColor''' (read only)&lt;br /&gt;
* color '''visitedLinkColor''' (read only)&lt;br /&gt;
* color '''buttonHoverColor''' (read only)&lt;br /&gt;
* color '''buttonFocusColor''' (read only)&lt;br /&gt;
* color '''viewTextColor''' (read only)&lt;br /&gt;
* color '''viewBackgroundColo''' (read only)r&lt;br /&gt;
* color '''viewHoverColor''' (read only)&lt;br /&gt;
* color '''viewFocusColor''' (read only)&lt;br /&gt;
* String '''styleSheet''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== Svg ===&lt;br /&gt;
Declaring a Svg element instantiates a Plasma Svg instance. This class doesn't draw anything, for drawing, SvgItem is used.&lt;br /&gt;
Properties:&lt;br /&gt;
* QSize '''size'''&lt;br /&gt;
* bool '''multipleImages'''&lt;br /&gt;
* String '''imagePath'''&lt;br /&gt;
* bool '''usingRenderingCache'''&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPixmap pixmap(QString elementID)&lt;br /&gt;
* void resize(qreal width, qreal height)&lt;br /&gt;
* void resize(): resets the image to its default dimension&lt;br /&gt;
* QSize elementSize(QString elementId)&lt;br /&gt;
* QRectF elementRect(QString elementId)&lt;br /&gt;
* bool hasElement(QString elementId)&lt;br /&gt;
* bool isValid(): true if valid svg file&lt;br /&gt;
&lt;br /&gt;
=== SvgItem ===&lt;br /&gt;
It's a graphical element that will actually paint a Svg instance.&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''elementId''': what element to render. If null, the whole svg will be rendered&lt;br /&gt;
* Svg '''svg''': instance of the Svg class mentioned above&lt;br /&gt;
* QSizeF '''naturalSize''' (read only): default size of the Svg&lt;br /&gt;
* bool '''smooth''': paint with antialias (default false)&lt;br /&gt;
&lt;br /&gt;
=== FrameSvgItem ===&lt;br /&gt;
It's a graphical element that paints a Plasma::FrameSvg, so a rectangular image composed by 9 elements contained in a Svg file, useful for things like buttons and frames.&lt;br /&gt;
&lt;br /&gt;
Flags&lt;br /&gt;
* EnabledBorders: combination of TopBorder | BottomBorder | LeftBorder | RightBorder, NoBorder if no border of the frame is enabled&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''imagePath''': path of the file relative to the Plasma Theme, for instance &amp;quot;widgets/background&amp;quot;&lt;br /&gt;
* String '''prefix''': a FrameSvg can contain multiple frames, for instance a button contains &amp;quot;normal&amp;quot;, &amp;quot;raised&amp;quot; and &amp;quot;pressed&amp;quot;&lt;br /&gt;
* Margins '''margins''' (read only): the margins of the frame, see documentation below&lt;br /&gt;
* EnabledBorders '''enabledBorders''': what borders are enabled&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
== Top Level windows ==&lt;br /&gt;
&lt;br /&gt;
=== Dialog ===&lt;br /&gt;
Dialog instantiates a Plasma::Dialog, it will be a Plasma themed top level window that can contain any QML component.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item mainItem: the Item contained in the Dialog, it can be any QML Item instance&lt;br /&gt;
* bool '''visible''': if the window (not the mainItem) is visible&lt;br /&gt;
* int '''x''': x position of the window in screen coordinates&lt;br /&gt;
* int '''y''': y position of the window in screen coordinates&lt;br /&gt;
* int '''width''' (read only): total width of the dialog, including margins&lt;br /&gt;
* int '''height''' (read only): total height of the dialog, including margins&lt;br /&gt;
* int '''windowFlags''': Qt window flags of the Dialog&lt;br /&gt;
* Margins '''margins''' (read only): margins of the Dialog&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPoint popupPosition(Item item, Qt::Alignment alignment=Qt::AlignLeft): the suggested position for the Dialog if it has to be correctly placed as popup of the QML item passed as parameter.&lt;br /&gt;
* void setAttribute(Qt::WindowAttribute attribute, bool on): set an attribute for the dialog window&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== ToolTip ===&lt;br /&gt;
Declaring a ToolTip instance makes it possible to use Plasma tooltips with any QML item.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item '''target''': the QML item we want to show a tooltip of&lt;br /&gt;
* String '''mainText'''&lt;br /&gt;
* String '''subText'''&lt;br /&gt;
* String '''image''': freedesktop compliant icon name as image of the tooltip&lt;br /&gt;
&lt;br /&gt;
= Plasma QtComponents (4.8) =&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Git/Recipes</id>
		<title>Development/Git/Recipes</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Git/Recipes"/>
				<updated>2011-07-28T03:40:17Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* Interactive Rebasing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Git Recipes ==&lt;br /&gt;
&lt;br /&gt;
Brief recipes for common use cases.&lt;br /&gt;
&lt;br /&gt;
=== Cloning a Repository ===&lt;br /&gt;
&lt;br /&gt;
To clone a local copy of a KDE Git repository, find the repository on http://projects.kde.org/projects, choose the project, choose the Repository tab and copy the git clone command displayed:&lt;br /&gt;
&lt;br /&gt;
 git clone git://anongit.kde.org/&amp;lt;repository-name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note this clone will be read-only and you will not be able to push from it.&lt;br /&gt;
&lt;br /&gt;
Alternatively, if you have the standard [[Development/Git/Configuration|KDE Git configuration]] and know the name of the repository simply do:&lt;br /&gt;
&lt;br /&gt;
 git clone kde:&amp;lt;repository-name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will automatically set the repository up to have push access.&lt;br /&gt;
&lt;br /&gt;
=== Working with existing remote branches ===&lt;br /&gt;
&lt;br /&gt;
Remote branches are branches created on the main KDE repository.  These may be a stable branch that you need to do bugfixes on, i.e. the 4.6 release, or a feature branch based on master.&lt;br /&gt;
&lt;br /&gt;
To see what local and remote branches exist:&lt;br /&gt;
 git branch -a&lt;br /&gt;
&lt;br /&gt;
Create a local branch that tracks a remote branch:&lt;br /&gt;
 git branch --track &amp;lt;local-branch&amp;gt; &amp;lt;remote-branch&amp;gt;&lt;br /&gt;
 git checkout &amp;lt;local-branch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When you want to add your commits to the local branch, first update your local to the current remote state, then push your commits:&lt;br /&gt;
 git pull --rebase&lt;br /&gt;
 git push origin &amp;lt;local-branch&amp;gt;:&amp;lt;remote-branch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Working with stable branches ===&lt;br /&gt;
&lt;br /&gt;
For kdelibs, kdepimlibs, kde-runtime, kate, konsole and kde-workspace, the remote stable branches are named as follows:&lt;br /&gt;
&lt;br /&gt;
 origin/KDE/4.6&lt;br /&gt;
&lt;br /&gt;
For these modules, to set up a local stable branch to track the remote stable branch:&lt;br /&gt;
&lt;br /&gt;
 git branch --track KDE/4.6 origin/KDE/4.6&lt;br /&gt;
 git checkout KDE/4.6&lt;br /&gt;
&lt;br /&gt;
To then push changes to the remote stable branch:&lt;br /&gt;
&lt;br /&gt;
 git push origin KDE/4.6:KDE/4.6&lt;br /&gt;
&lt;br /&gt;
In other projects the remote stable branches are named as follows:&lt;br /&gt;
&lt;br /&gt;
 origin/4.6&lt;br /&gt;
&lt;br /&gt;
For these modules, to set up a local stable branch to track the remote stable branch:&lt;br /&gt;
&lt;br /&gt;
 git branch --track 4.6 origin/4.6&lt;br /&gt;
 git checkout 4.6&lt;br /&gt;
&lt;br /&gt;
To then push changes to the remote stable branch:&lt;br /&gt;
&lt;br /&gt;
 git push origin 4.6:4.6&lt;br /&gt;
&lt;br /&gt;
=== Creating / Deleting Remote Branches ===&lt;br /&gt;
&lt;br /&gt;
To create a new remote branch simply push your current branch to it:&lt;br /&gt;
&lt;br /&gt;
 git push origin &amp;lt;local-branch&amp;gt;:&amp;lt;remote-branch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To delete a remote branch is a little obscure:&lt;br /&gt;
&lt;br /&gt;
 git push origin :&amp;lt;remote-branch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tracking Branches ===&lt;br /&gt;
&lt;br /&gt;
To create a new branch that tracks an existing local or remote branch:&lt;br /&gt;
&lt;br /&gt;
 git branch --track &amp;lt;new-branch&amp;gt; &amp;lt;existing-branch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To change the branch the current branch is tracking to a different local or remote branch:&lt;br /&gt;
&lt;br /&gt;
 git branch --set-upstream &amp;lt;existing-branch&amp;gt; &amp;lt;new-upstream-branch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Cherry Picking ===&lt;br /&gt;
&lt;br /&gt;
Cherry picking is a way to copy a single commit from any local or remote branch to your current local branch.&lt;br /&gt;
&lt;br /&gt;
When cherry picking between stable and unstable branches, use the following form:&lt;br /&gt;
&lt;br /&gt;
 git cherry-pick -e -x &amp;lt;original-commit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note you can add ''any'' remote repository to your local clone if cherry-pick from.&lt;br /&gt;
&lt;br /&gt;
;Common Options&lt;br /&gt;
&lt;br /&gt;
'''-e''' will allow you to edit the commit message to add any extra details and to change the BUG/CCBUG/FIXED-IN messages.&lt;br /&gt;
&lt;br /&gt;
'''-x''' will automatically add the original commit number to the end of the commit message to enable better tracing and to simplify merging.  Only do this if the original commit was already published in a public repository, e.g. your are forward porting or back porting the patch.&lt;br /&gt;
&lt;br /&gt;
'''-n''' will cherry-pick the changes but not commit them to the new branch.  This is very useful if you need to do further work on a commit.&lt;br /&gt;
&lt;br /&gt;
=== Interactive Rebasing ===&lt;br /&gt;
&lt;br /&gt;
If you have many commits in a branch that you want to clean up before pushing to the central repository, then you can use interactive rebasing to merge, split, delete, re-order or edit them.&lt;br /&gt;
&lt;br /&gt;
To work with all commits to a branch:&lt;br /&gt;
&lt;br /&gt;
 git rebase -i &amp;lt;parent-branch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where &amp;lt;parent-branch&amp;gt; is the branch you want to rebase onto.  This is usually the branch that you based the original local branch off or are remotely tracking, but can be any branch you want.&lt;br /&gt;
&lt;br /&gt;
To work with just the last x commits you made to a branch:&lt;br /&gt;
&lt;br /&gt;
 git rebase -i HEAD^x&lt;br /&gt;
&lt;br /&gt;
HEAD^ is the terminology for saying &amp;quot;commit prior to head&amp;quot;. HEAD~ works too. HEAD^^ would indicate 2 commits back, and so forth.&lt;br /&gt;
&lt;br /&gt;
See http://book.git-scm.com/4_interactive_rebasing.html for full details.&lt;br /&gt;
&lt;br /&gt;
=== Viewing What You've Changed ===&lt;br /&gt;
&lt;br /&gt;
To see the difference between your tracked but unstaged changes and the current branch (including your not-yet-pushed commits)&lt;br /&gt;
&lt;br /&gt;
 git diff&lt;br /&gt;
 git diff &amp;lt;filename&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To see the difference between your staged changes and the current branch (including your not-yet-pushed commits):&lt;br /&gt;
&lt;br /&gt;
 git diff --staged&lt;br /&gt;
 git diff --staged &amp;lt;filename&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Stashing Changes ===&lt;br /&gt;
&lt;br /&gt;
If you have changes you don't wish to commit but don't want to lose either while you do something else, you can temporarily 'stash' the changes away.  This could be some frequently used debug code,or just some work in progress you need to move to another branch without committing.  If the code is just WIP for the current branch we recommend using an interim commit instead.&lt;br /&gt;
&lt;br /&gt;
The stash is a temporary store that holds a stack of uncommitted changes at a repository level.  Commands given below work by default with the stash at the top of the stack, or you can optionally provide the stack reference.&lt;br /&gt;
&lt;br /&gt;
To store your current changes at the top of the stash stack:&lt;br /&gt;
&lt;br /&gt;
 git stash &amp;lt;optional comment&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
 git stash &amp;quot;My debug code&amp;quot;&lt;br /&gt;
&lt;br /&gt;
To see all your stashed items in the stash stack:&lt;br /&gt;
&lt;br /&gt;
 git stash list&lt;br /&gt;
&lt;br /&gt;
This will show something like:&lt;br /&gt;
&lt;br /&gt;
 stash@{0}: WIP on master: 6ebd0e2... My debug code&lt;br /&gt;
 stash@{1}: WIP on master: 9cc0589... My stashed changes&lt;br /&gt;
&lt;br /&gt;
To see the details of an individual stash:&lt;br /&gt;
&lt;br /&gt;
 git stash show &amp;lt;optional stash ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To see the stash at the top of the stack:&lt;br /&gt;
&lt;br /&gt;
 git stash show&lt;br /&gt;
&lt;br /&gt;
To see the second item from top:&lt;br /&gt;
&lt;br /&gt;
 git stash show stash@{1}&lt;br /&gt;
&lt;br /&gt;
To restore a stash while keeping a copy in the stack:&lt;br /&gt;
&lt;br /&gt;
 git stash apply &amp;lt;optional stash ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To restore a stash and remove it from the stack:&lt;br /&gt;
&lt;br /&gt;
 git stash pop &amp;lt;optional stash ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To remove a single stash from the stack without applying it:&lt;br /&gt;
&lt;br /&gt;
 git stash drop &amp;lt;optional stash ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To clear out your entire stash stack:&lt;br /&gt;
&lt;br /&gt;
 git stash clear&lt;br /&gt;
&lt;br /&gt;
For more details see:&lt;br /&gt;
&lt;br /&gt;
 http://www.kernel.org/pub/software/scm/git/docs/git-stash.html&lt;br /&gt;
 http://book.git-scm.com/4_stashing.html&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/ISV/Why_use_KDE</id>
		<title>ISV/Why use KDE</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/ISV/Why_use_KDE"/>
				<updated>2011-07-23T05:40:16Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* Technologies */ s/hal/udev/&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|ISV/Why use KDE}}&lt;br /&gt;
This page intends to help '''Independent Software Vendors (ISVs)''' getting into KDE related topics. This includes companies developing commercial applications as well as other Open Source Projects.&lt;br /&gt;
&lt;br /&gt;
== The KDE Community ==&lt;br /&gt;
The KDE project attracts many people with different backgrounds. As such, the day-by-day growing KDE community includes many '''developers''', '''translators''', '''artists''' as well as '''usability and accessibility experts''' and - of course - '''lots of users'''. For several years now all those people are welcome to meet at the '''annual KDE Conference [http://akademy.kde.org/ aKademy]''' to discuss KDE related topics and shape the ''roadmap'' for future development.&lt;br /&gt;
&lt;br /&gt;
== KDE e.V. ==&lt;br /&gt;
The non-profit organization [http://ev.kde.org KDE e.V.] helps in creating and distributing KDE by securing cash, hardware, and other donations, then using donations to aid KDE development and promotion. All its members are part of the KDE community which means the KDE e.V. plays an important role in the KDE project. Members of the KDE e.V. form several '''working groups''' like the [http://www.spreadkde.org/handbook/mwg/charter Marketing Working Group (MWG)] and the [http://ev.kde.org/workinggroups/hci.php Human-Computer Interaction (HCI) Working Group] to help realize KDE's vision.&lt;br /&gt;
&lt;br /&gt;
== Adoption of KDE ==&lt;br /&gt;
KDE is one of the biggest Open Source projects making the Linux/UNIX desktop's experience much more user friendly. As such, distributions strongly support KDE by actively taking part in its development process and ship KDE as their default desktop environment. Many companies use KDE for production use.&lt;br /&gt;
&lt;br /&gt;
== Development ==&lt;br /&gt;
The KDE development process takes place in steady release cycles. '''[http://developer.kde.org/development-versions/release.html Release schedules]''' and '''feature plans''' help the KDE project coordinating a KDE release by introducing several ''phases'' like ''feature freeze'' and ''message freeze''. This phases make sure that developers concentrate on polishing the release and the translation teams have time enough to translate all the KDE software into many different languages. Further information about KDE development tools can be found on the [[Development|development pages]].&lt;br /&gt;
&lt;br /&gt;
=== Documentation ===&lt;br /&gt;
The KDE project provides excellent documentation about its API and its technologies, such as KParts or KXmlGui. There are many '''Tutorials and HOWTOs''' which help getting into KDE development. An overview can be found at the [[Development|development pages]].&lt;br /&gt;
&lt;br /&gt;
=== Technologies ===&lt;br /&gt;
KDE provides a wide range of '''powerful technologies''' such as [http://khtml.info KHTML and KJS] which are adopted by other companies like Apple (Safari browsers) and Nokia. Additionally there are several '''development frameworks''' like KParts (KDE's component technology), KIO (network/protocol architecture) or KXmlGui (build GUIs based on XML definitions).&lt;br /&gt;
&lt;br /&gt;
KDE uses '''well-known standards''' like [http://en.wikipedia.org/wiki/Udev UDev]) and [http://dbus.freedesktop.org D-Bus] (interprocess communication).&lt;br /&gt;
&lt;br /&gt;
=== Compatibility &amp;amp; Integration ===&lt;br /&gt;
The last major KDE release was KDE 4.0. All KDE 4.x versions are '''binary compatible''', i.e. software written for KDE 4.0 will be compatible with KDE 4.5 years later. As KDE is based on standards it is, for instance, easy to integrate applications with plain [http://todo-link-to-howto .desktop files].&lt;br /&gt;
&lt;br /&gt;
==== Freedesktop.org &amp;amp; Portland ====&lt;br /&gt;
As an ISV, your target is probably not only KDE but all Linux/UNIX desktops. This is made possible due to '''strong collaboration between KDE and other projects''' like [http://freedesktop.org freedesktop.org] which defines standards and software that helps integrating applications in all standard conform desktop environments.&lt;br /&gt;
&lt;br /&gt;
One of those projects is the [http://developer.kde.org/portland/ Portland project], which intends to develop a common set of Linux Desktop Programming Interfaces and Tools to allow applications to '''easily integrate''' with the free desktop configuration an end user has chosen to work with.&lt;br /&gt;
&lt;br /&gt;
=== Sub-Projects ===&lt;br /&gt;
KDE has many sub-projects to more specifically coordinate unique project goals of major supporting applications.  Several of these significant projects are noted below:&lt;br /&gt;
&lt;br /&gt;
; KDE Pim&lt;br /&gt;
: The goal of [http://pim.kde.org KDE Pim] (Personal information management) is to provide an application suite to manage personal information. This includes applications like an email client, a calender etc. The main result is '''KDE Kontact''', our personal information manager.&lt;br /&gt;
&lt;br /&gt;
; KOffice&lt;br /&gt;
: [http://koffice.kde.org KOffice] is an '''integrated office suite''' using KDE-technology and features a full set of applications which work together seamlessly to provide the best user experience possible. The office suite contains applications like KWord, KSpread, KPresenter, Krita and many more.&lt;br /&gt;
&lt;br /&gt;
; KDevelop&lt;br /&gt;
: [http://kdevelop.kde.org KDevelop] is an '''Integrated Development Environment''' (IDE) for KDE. It supports language like C/C++ and Java and helps with rapid application development.&lt;br /&gt;
&lt;br /&gt;
== Roadmap ==&lt;br /&gt;
KDE development follows a release schedule in order to coordinate releases. These usually cover for minor releases the last 10 weeks and for major releases the last 20 weeks before the official release. The features planned for a release are usually published at the same time as the schedule.&lt;br /&gt;
&lt;br /&gt;
Further details can be found in the [[../Roadmap|roadmap page]].&lt;br /&gt;
&lt;br /&gt;
[[Category:ISV]]&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/ISV/Why_use_KDE</id>
		<title>ISV/Why use KDE</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/ISV/Why_use_KDE"/>
				<updated>2011-07-23T05:38:37Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* Technologies */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|ISV/Why use KDE}}&lt;br /&gt;
This page intends to help '''Independent Software Vendors (ISVs)''' getting into KDE related topics. This includes companies developing commercial applications as well as other Open Source Projects.&lt;br /&gt;
&lt;br /&gt;
== The KDE Community ==&lt;br /&gt;
The KDE project attracts many people with different backgrounds. As such, the day-by-day growing KDE community includes many '''developers''', '''translators''', '''artists''' as well as '''usability and accessibility experts''' and - of course - '''lots of users'''. For several years now all those people are welcome to meet at the '''annual KDE Conference [http://akademy.kde.org/ aKademy]''' to discuss KDE related topics and shape the ''roadmap'' for future development.&lt;br /&gt;
&lt;br /&gt;
== KDE e.V. ==&lt;br /&gt;
The non-profit organization [http://ev.kde.org KDE e.V.] helps in creating and distributing KDE by securing cash, hardware, and other donations, then using donations to aid KDE development and promotion. All its members are part of the KDE community which means the KDE e.V. plays an important role in the KDE project. Members of the KDE e.V. form several '''working groups''' like the [http://www.spreadkde.org/handbook/mwg/charter Marketing Working Group (MWG)] and the [http://ev.kde.org/workinggroups/hci.php Human-Computer Interaction (HCI) Working Group] to help realize KDE's vision.&lt;br /&gt;
&lt;br /&gt;
== Adoption of KDE ==&lt;br /&gt;
KDE is one of the biggest Open Source projects making the Linux/UNIX desktop's experience much more user friendly. As such, distributions strongly support KDE by actively taking part in its development process and ship KDE as their default desktop environment. Many companies use KDE for production use.&lt;br /&gt;
&lt;br /&gt;
== Development ==&lt;br /&gt;
The KDE development process takes place in steady release cycles. '''[http://developer.kde.org/development-versions/release.html Release schedules]''' and '''feature plans''' help the KDE project coordinating a KDE release by introducing several ''phases'' like ''feature freeze'' and ''message freeze''. This phases make sure that developers concentrate on polishing the release and the translation teams have time enough to translate all the KDE software into many different languages. Further information about KDE development tools can be found on the [[Development|development pages]].&lt;br /&gt;
&lt;br /&gt;
=== Documentation ===&lt;br /&gt;
The KDE project provides excellent documentation about its API and its technologies, such as KParts or KXmlGui. There are many '''Tutorials and HOWTOs''' which help getting into KDE development. An overview can be found at the [[Development|development pages]].&lt;br /&gt;
&lt;br /&gt;
=== Technologies ===&lt;br /&gt;
KDE provides a wide range of '''powerful technologies''' such as [http://khtml.info KHTML and KJS] which are adopted by other companies like Apple (Safari browsers) and Nokia. Additionally there are several '''development frameworks''' like KParts (KDE's component technology), KIO (network/protocol architecture) or KXmlGui (build GUIs based on XML definitions).&lt;br /&gt;
&lt;br /&gt;
KDE uses '''well-known standards''' like [http://hal.freedesktop.org HAL (Hardware Abstraction Layer)] (now replaced by [http://en.wikipedia.org/wiki/Udev UDev]) and [http://dbus.freedesktop.org D-Bus] (interprocess communication).&lt;br /&gt;
&lt;br /&gt;
=== Compatibility &amp;amp; Integration ===&lt;br /&gt;
The last major KDE release was KDE 4.0. All KDE 4.x versions are '''binary compatible''', i.e. software written for KDE 4.0 will be compatible with KDE 4.5 years later. As KDE is based on standards it is, for instance, easy to integrate applications with plain [http://todo-link-to-howto .desktop files].&lt;br /&gt;
&lt;br /&gt;
==== Freedesktop.org &amp;amp; Portland ====&lt;br /&gt;
As an ISV, your target is probably not only KDE but all Linux/UNIX desktops. This is made possible due to '''strong collaboration between KDE and other projects''' like [http://freedesktop.org freedesktop.org] which defines standards and software that helps integrating applications in all standard conform desktop environments.&lt;br /&gt;
&lt;br /&gt;
One of those projects is the [http://developer.kde.org/portland/ Portland project], which intends to develop a common set of Linux Desktop Programming Interfaces and Tools to allow applications to '''easily integrate''' with the free desktop configuration an end user has chosen to work with.&lt;br /&gt;
&lt;br /&gt;
=== Sub-Projects ===&lt;br /&gt;
KDE has many sub-projects to more specifically coordinate unique project goals of major supporting applications.  Several of these significant projects are noted below:&lt;br /&gt;
&lt;br /&gt;
; KDE Pim&lt;br /&gt;
: The goal of [http://pim.kde.org KDE Pim] (Personal information management) is to provide an application suite to manage personal information. This includes applications like an email client, a calender etc. The main result is '''KDE Kontact''', our personal information manager.&lt;br /&gt;
&lt;br /&gt;
; KOffice&lt;br /&gt;
: [http://koffice.kde.org KOffice] is an '''integrated office suite''' using KDE-technology and features a full set of applications which work together seamlessly to provide the best user experience possible. The office suite contains applications like KWord, KSpread, KPresenter, Krita and many more.&lt;br /&gt;
&lt;br /&gt;
; KDevelop&lt;br /&gt;
: [http://kdevelop.kde.org KDevelop] is an '''Integrated Development Environment''' (IDE) for KDE. It supports language like C/C++ and Java and helps with rapid application development.&lt;br /&gt;
&lt;br /&gt;
== Roadmap ==&lt;br /&gt;
KDE development follows a release schedule in order to coordinate releases. These usually cover for minor releases the last 10 weeks and for major releases the last 20 weeks before the official release. The features planned for a release are usually published at the same time as the schedule.&lt;br /&gt;
&lt;br /&gt;
Further details can be found in the [[../Roadmap|roadmap page]].&lt;br /&gt;
&lt;br /&gt;
[[Category:ISV]]&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma</id>
		<title>Development/Tutorials/Plasma</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma"/>
				<updated>2011-07-23T02:52:28Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* QML (QtQuick) Plasmoids */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Plasma}}&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with C++ ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/GettingStarted|Getting Started With Plasmoids]]&lt;br /&gt;
:''Creating your first plasmoid in C++ with SVG background, icon and text''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/GettingStarted..Some_More|Getting Started With Plasmoids..Some more]] :''A few more starter's tips.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/DataEngines|Writing a DataEngine]]&lt;br /&gt;
:''DataEngines provide a standardized interface to various (read only) data sources for visualizations to use. Learn what a DataEngine is and how to write one of your own.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Services|Writing a Service]]&lt;br /&gt;
:''Services provide a standardized interface for visualizations to perform &amp;quot;write operations&amp;quot;. This can be for example, uploading pasted test to a pastebin service..''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PackageStructure|Writing a PackageStructure Plugin]]&lt;br /&gt;
:''PackageStructure plugins allow custom Packages to be defined, installed, removed and listed as well as provide access their contents at runtime. Packages may contain any kind of data addons, including scripts.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/UsingExtenders|How to use extenders in your Plasmoid]]&lt;br /&gt;
:''A simple example that shows how to use extenders in a Plasmoid.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/AbstractRunner|Creating Runners]]&lt;br /&gt;
:''Runners are plugins that provide action-based search functionality in the Plasma workspace &amp;quot;run command&amp;quot; dialog. These plugins can be used by any application that links again libplasma.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/WallpaperHelloWorld|Wallpaper Tutorial 1]]&lt;br /&gt;
:''This tutorial shows you how to make a simple Hello World plasma wallpaper plugin.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/WallpaperConfiguration|Wallpaper Tutorial 2]]&lt;br /&gt;
:''This tutorial covers how to add configuration options to the wallpaper.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ShellDesign|Creating a Plasma Shell]]&lt;br /&gt;
:''This tutorial covers the essentials of writing a new Plasma shell from scratch. A must-read for anyone creating a new or modifying an existing Plasma Shell. Existing Plasma shells include Plasma Desktop, Plasma Netbook, Plasma Mobile, Plasma Media Center, Plasma Screensaver, Plasma KPart and Plasma KDM, and all follow the patterns documented here.''&lt;br /&gt;
&lt;br /&gt;
;[http://www.linux-magazine.com/w3/issue/114/036-040_plasma.pdf Creating Plasmoids]&lt;br /&gt;
:''May 2010 article from Linux Magazine''&lt;br /&gt;
&lt;br /&gt;
;[http://www.ibm.com/developerworks/linux/library/l-kde-plasmoids/index.html Create Plasmoids using KDevelop]&lt;br /&gt;
:''Article explaining the structure of Plasma and how to create a Plasmoid''&lt;br /&gt;
&lt;br /&gt;
;[http://community.kde.org/User:Mxttie#Adding_configuration Adding configuration to your plasmoid]&lt;br /&gt;
:''Article explaining how to add a configuration dialog to your plasmoid.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ApplicationShell|Integrate Plasma in Applications]]&lt;br /&gt;
:''This tutorial shows you how to make an application dashboard based on Plasma technologies.''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with JavaScript ==&lt;br /&gt;
&lt;br /&gt;
Plasma has built-in JavaScript (also known as ECMAScript, and often referred to as QtScript in the context of Qt) scripting support without requiring any external dependencies.&lt;br /&gt;
&lt;br /&gt;
=== Plasmoids ===&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in JavaScript''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/DataEngine|Getting Data]]&lt;br /&gt;
:''How to retreive data from a data engine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/NowPlaying|Now Playing]]&lt;br /&gt;
:''Slightly more advanced data engine usage: displaying what's currently playing''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/SystemMonitor|System Monitor]]&lt;br /&gt;
:''How to access systemmonitor data engine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/CheatSheet|Cheat Sheet]]&lt;br /&gt;
:''A cheat sheet, rather than a tutorial, of things to remember and watch out for when developing JavaScript plasmoids''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/API|API Reference]]&lt;br /&gt;
:''The Simplified JavaScript Plasmoid API. Useful for referencing what is available in the runtime and as a study aid for the tutorials above.''&lt;br /&gt;
&lt;br /&gt;
=== QML (QtQuick) Plasmoids ===&lt;br /&gt;
It's possible to write Javascript Plasmoids that use the QML declarative language to describe their user interface, while having the logic in JavaScript. This is now the recommended method of creating plasmoids, if possible. It allows easily the declaring of an interface. It is also what Plasma is leaning the most towards, especially in the Mobile, MediaCenter and KDM shells.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/QML/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in QML''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/QML/API|API Reference]]&lt;br /&gt;
:''The QML Plasmoid API. Useful for referencing what is available in the runtime, what are the differences with the pure JavaScript scriptengine and as a study aid for the tutorials above.''&lt;br /&gt;
&lt;br /&gt;
=== Other Applications Of Javascript ===&lt;br /&gt;
;[[KDE_System_Administration/PlasmaDestkopScripting|Scripting Plasma Shells]]&lt;br /&gt;
:The KDE Plasma Desktop and Netbook provide means to manage the desktop shell (desktop, panels, widget) via scripts written in JavaScript. This article describes how to take advantage of this feature set as well as documents the full API. This is primarily a system administration tool, but may also be of interest to power users.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/Animations|Javascript Animations]]&lt;br /&gt;
:''How to write Animations using Javascript for use in Plasma applications''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ComicPlugin|Creating Comic Plugins]]&lt;br /&gt;
:''This guide shows you how to create a comic plugin for the comic plasmoid.''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Python ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Python''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Using DataEngines|Using DataEngines]]&lt;br /&gt;
:''How to use DataEngines from a plasmoid''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Writing DataEngines|Writing DataEngines]]&lt;br /&gt;
:''How to write your own Plasma DataEngine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonPlasmoid|Writing a Plasmoid in Python]]&lt;br /&gt;
:''Writing a simple battery graph in python''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonRunner|Writing a KRunner plugin in Python]]&lt;br /&gt;
:''Writing a simple krunner plugin in python''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Ruby ==&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Ruby''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/SimplePasteApplet|Writing a simple paste applet]]&lt;br /&gt;
:''A tutorial explaining how to set up a plasmoid, create a simple paste applet using widgets and add Plasma features seen elsewhere. Complete with tips for those who have never programmed before.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Writing DataEngines|Writing DataEngines]]&lt;br /&gt;
:''How to write your own Plasma DataEngine using Ruby''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Blinker|Use SVG artwork in the simplest way possible]]&lt;br /&gt;
:''Follow a fellow student as he asks around about SVG usage and explains why the code examples work. This is a wiki so feel free to add your own insights until this tutorial can be considered complete.''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Web Technologies (HTML/JS/CSS etc) ==&lt;br /&gt;
;[[Development/Tutorials/Plasma/Web/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in HTML''&lt;br /&gt;
&lt;br /&gt;
== Plasma integration ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Solid_Device_Actions|Creating a Device Notifier action]]&lt;br /&gt;
:''When your application is interested in removable hardware''&lt;br /&gt;
&lt;br /&gt;
== Theme development ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Theme|Creating a Plasma Theme Quickstart]]&lt;br /&gt;
:''A quick guide to creating your first Plasma theme''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ThemeDetails|The Plasma Theme Structure In Detail]]&lt;br /&gt;
:''A comprehensive guide to the contents of a Plasma SVG theme, including configuration options, wallpapers, on-disk layout, names of all standard SVG files and every element in them.''&lt;br /&gt;
&lt;br /&gt;
== Activity Template development ==&lt;br /&gt;
&lt;br /&gt;
;[[KDE_System_Administration/PlasmaDesktopScripting#Activity_templates|Creating a Plasma Activity Template Quickstart]]&lt;br /&gt;
:''A quick guide to creating your first Plasma Activity Template''&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
* [[Projects/Plasma|Projects: Plasma]]&lt;br /&gt;
* [http://api.kde.org/4.x-api/kdelibs-apidocs/plasma/html/index.html Plasma api documentation]&lt;br /&gt;
* [http://techbase.kde.org/Projects/Plasma/Eclipse_Integration Plasma Eclipse Integration]&lt;br /&gt;
* The [https://mail.kde.org/mailman/listinfo/plasma-devel plasma-devel mailing list] and #plasma on IRC (irc.freenode.org).&lt;br /&gt;
&lt;br /&gt;
== Presentation Slides==&lt;br /&gt;
http://chani.wordpress.com/2009/04/25/quick-update-for-my-presentation/ Victory Calendar -- also link to websvn plasma playground in the odp file.&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma</id>
		<title>Development/Tutorials/Plasma</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma"/>
				<updated>2011-07-23T02:38:50Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: nevermind. I'm blind. although my excuse is that somebody else duplicated the first qml entry (and I don't think it was me ;p&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Plasma}}&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with C++ ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/GettingStarted|Getting Started With Plasmoids]]&lt;br /&gt;
:''Creating your first plasmoid in C++ with SVG background, icon and text''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/GettingStarted..Some_More|Getting Started With Plasmoids..Some more]] :''A few more starter's tips.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/DataEngines|Writing a DataEngine]]&lt;br /&gt;
:''DataEngines provide a standardized interface to various (read only) data sources for visualizations to use. Learn what a DataEngine is and how to write one of your own.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Services|Writing a Service]]&lt;br /&gt;
:''Services provide a standardized interface for visualizations to perform &amp;quot;write operations&amp;quot;. This can be for example, uploading pasted test to a pastebin service..''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PackageStructure|Writing a PackageStructure Plugin]]&lt;br /&gt;
:''PackageStructure plugins allow custom Packages to be defined, installed, removed and listed as well as provide access their contents at runtime. Packages may contain any kind of data addons, including scripts.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/UsingExtenders|How to use extenders in your Plasmoid]]&lt;br /&gt;
:''A simple example that shows how to use extenders in a Plasmoid.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/AbstractRunner|Creating Runners]]&lt;br /&gt;
:''Runners are plugins that provide action-based search functionality in the Plasma workspace &amp;quot;run command&amp;quot; dialog. These plugins can be used by any application that links again libplasma.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/WallpaperHelloWorld|Wallpaper Tutorial 1]]&lt;br /&gt;
:''This tutorial shows you how to make a simple Hello World plasma wallpaper plugin.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/WallpaperConfiguration|Wallpaper Tutorial 2]]&lt;br /&gt;
:''This tutorial covers how to add configuration options to the wallpaper.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ShellDesign|Creating a Plasma Shell]]&lt;br /&gt;
:''This tutorial covers the essentials of writing a new Plasma shell from scratch. A must-read for anyone creating a new or modifying an existing Plasma Shell. Existing Plasma shells include Plasma Desktop, Plasma Netbook, Plasma Mobile, Plasma Media Center, Plasma Screensaver, Plasma KPart and Plasma KDM, and all follow the patterns documented here.''&lt;br /&gt;
&lt;br /&gt;
;[http://www.linux-magazine.com/w3/issue/114/036-040_plasma.pdf Creating Plasmoids]&lt;br /&gt;
:''May 2010 article from Linux Magazine''&lt;br /&gt;
&lt;br /&gt;
;[http://www.ibm.com/developerworks/linux/library/l-kde-plasmoids/index.html Create Plasmoids using KDevelop]&lt;br /&gt;
:''Article explaining the structure of Plasma and how to create a Plasmoid''&lt;br /&gt;
&lt;br /&gt;
;[http://community.kde.org/User:Mxttie#Adding_configuration Adding configuration to your plasmoid]&lt;br /&gt;
:''Article explaining how to add a configuration dialog to your plasmoid.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ApplicationShell|Integrate Plasma in Applications]]&lt;br /&gt;
:''This tutorial shows you how to make an application dashboard based on Plasma technologies.''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with JavaScript ==&lt;br /&gt;
&lt;br /&gt;
Plasma has built-in JavaScript (also known as ECMAScript, and often referred to as QtScript in the context of Qt) scripting support without requiring any external dependencies.&lt;br /&gt;
&lt;br /&gt;
=== Plasmoids ===&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in JavaScript''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/DataEngine|Getting Data]]&lt;br /&gt;
:''How to retreive data from a data engine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/NowPlaying|Now Playing]]&lt;br /&gt;
:''Slightly more advanced data engine usage: displaying what's currently playing''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/SystemMonitor|System Monitor]]&lt;br /&gt;
:''How to access systemmonitor data engine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/CheatSheet|Cheat Sheet]]&lt;br /&gt;
:''A cheat sheet, rather than a tutorial, of things to remember and watch out for when developing JavaScript plasmoids''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/API|API Reference]]&lt;br /&gt;
:''The Simplified JavaScript Plasmoid API. Useful for referencing what is available in the runtime and as a study aid for the tutorials above.''&lt;br /&gt;
&lt;br /&gt;
=== QML (QtQuick) Plasmoids ===&lt;br /&gt;
It's possible to write Javascript Plasmoids that use the QML declarative language to describe their user interface, while having the logic in JavaScript.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/QML/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in QML''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/QML/API|API Reference]]&lt;br /&gt;
:''The QML Plasmoid API. Useful for referencing what is available in the runtime, what are the differences with the pure JavaScript scriptengine and as a study aid for the tutorials above.''&lt;br /&gt;
&lt;br /&gt;
=== Other Applications Of Javascript ===&lt;br /&gt;
;[[KDE_System_Administration/PlasmaDestkopScripting|Scripting Plasma Shells]]&lt;br /&gt;
:The KDE Plasma Desktop and Netbook provide means to manage the desktop shell (desktop, panels, widget) via scripts written in JavaScript. This article describes how to take advantage of this feature set as well as documents the full API. This is primarily a system administration tool, but may also be of interest to power users.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/Animations|Javascript Animations]]&lt;br /&gt;
:''How to write Animations using Javascript for use in Plasma applications''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ComicPlugin|Creating Comic Plugins]]&lt;br /&gt;
:''This guide shows you how to create a comic plugin for the comic plasmoid.''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Python ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Python''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Using DataEngines|Using DataEngines]]&lt;br /&gt;
:''How to use DataEngines from a plasmoid''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Writing DataEngines|Writing DataEngines]]&lt;br /&gt;
:''How to write your own Plasma DataEngine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonPlasmoid|Writing a Plasmoid in Python]]&lt;br /&gt;
:''Writing a simple battery graph in python''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonRunner|Writing a KRunner plugin in Python]]&lt;br /&gt;
:''Writing a simple krunner plugin in python''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Ruby ==&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Ruby''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/SimplePasteApplet|Writing a simple paste applet]]&lt;br /&gt;
:''A tutorial explaining how to set up a plasmoid, create a simple paste applet using widgets and add Plasma features seen elsewhere. Complete with tips for those who have never programmed before.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Writing DataEngines|Writing DataEngines]]&lt;br /&gt;
:''How to write your own Plasma DataEngine using Ruby''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Blinker|Use SVG artwork in the simplest way possible]]&lt;br /&gt;
:''Follow a fellow student as he asks around about SVG usage and explains why the code examples work. This is a wiki so feel free to add your own insights until this tutorial can be considered complete.''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Web Technologies (HTML/JS/CSS etc) ==&lt;br /&gt;
;[[Development/Tutorials/Plasma/Web/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in HTML''&lt;br /&gt;
&lt;br /&gt;
== Plasma integration ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Solid_Device_Actions|Creating a Device Notifier action]]&lt;br /&gt;
:''When your application is interested in removable hardware''&lt;br /&gt;
&lt;br /&gt;
== Theme development ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Theme|Creating a Plasma Theme Quickstart]]&lt;br /&gt;
:''A quick guide to creating your first Plasma theme''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ThemeDetails|The Plasma Theme Structure In Detail]]&lt;br /&gt;
:''A comprehensive guide to the contents of a Plasma SVG theme, including configuration options, wallpapers, on-disk layout, names of all standard SVG files and every element in them.''&lt;br /&gt;
&lt;br /&gt;
== Activity Template development ==&lt;br /&gt;
&lt;br /&gt;
;[[KDE_System_Administration/PlasmaDesktopScripting#Activity_templates|Creating a Plasma Activity Template Quickstart]]&lt;br /&gt;
:''A quick guide to creating your first Plasma Activity Template''&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
* [[Projects/Plasma|Projects: Plasma]]&lt;br /&gt;
* [http://api.kde.org/4.x-api/kdelibs-apidocs/plasma/html/index.html Plasma api documentation]&lt;br /&gt;
* [http://techbase.kde.org/Projects/Plasma/Eclipse_Integration Plasma Eclipse Integration]&lt;br /&gt;
* The [https://mail.kde.org/mailman/listinfo/plasma-devel plasma-devel mailing list] and #plasma on IRC (irc.freenode.org).&lt;br /&gt;
&lt;br /&gt;
== Presentation Slides==&lt;br /&gt;
http://chani.wordpress.com/2009/04/25/quick-update-for-my-presentation/ Victory Calendar -- also link to websvn plasma playground in the odp file.&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma</id>
		<title>Development/Tutorials/Plasma</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma"/>
				<updated>2011-07-23T02:32:59Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* Plasma Programming with Qt Quick (QML) */ add link to QML API. I'm *fairly* sure it was hidden behind 400 pages of nothingness, hidden in a hallway of unmarked doors leading to random, alternative universes.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Plasma}}&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with C++ ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/GettingStarted|Getting Started With Plasmoids]]&lt;br /&gt;
:''Creating your first plasmoid in C++ with SVG background, icon and text''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/GettingStarted..Some_More|Getting Started With Plasmoids..Some more]] :''A few more starter's tips.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/DataEngines|Writing a DataEngine]]&lt;br /&gt;
:''DataEngines provide a standardized interface to various (read only) data sources for visualizations to use. Learn what a DataEngine is and how to write one of your own.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Services|Writing a Service]]&lt;br /&gt;
:''Services provide a standardized interface for visualizations to perform &amp;quot;write operations&amp;quot;. This can be for example, uploading pasted test to a pastebin service..''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PackageStructure|Writing a PackageStructure Plugin]]&lt;br /&gt;
:''PackageStructure plugins allow custom Packages to be defined, installed, removed and listed as well as provide access their contents at runtime. Packages may contain any kind of data addons, including scripts.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/UsingExtenders|How to use extenders in your Plasmoid]]&lt;br /&gt;
:''A simple example that shows how to use extenders in a Plasmoid.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/AbstractRunner|Creating Runners]]&lt;br /&gt;
:''Runners are plugins that provide action-based search functionality in the Plasma workspace &amp;quot;run command&amp;quot; dialog. These plugins can be used by any application that links again libplasma.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/WallpaperHelloWorld|Wallpaper Tutorial 1]]&lt;br /&gt;
:''This tutorial shows you how to make a simple Hello World plasma wallpaper plugin.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/WallpaperConfiguration|Wallpaper Tutorial 2]]&lt;br /&gt;
:''This tutorial covers how to add configuration options to the wallpaper.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ShellDesign|Creating a Plasma Shell]]&lt;br /&gt;
:''This tutorial covers the essentials of writing a new Plasma shell from scratch. A must-read for anyone creating a new or modifying an existing Plasma Shell. Existing Plasma shells include Plasma Desktop, Plasma Netbook, Plasma Mobile, Plasma Media Center, Plasma Screensaver, Plasma KPart and Plasma KDM, and all follow the patterns documented here.''&lt;br /&gt;
&lt;br /&gt;
;[http://www.linux-magazine.com/w3/issue/114/036-040_plasma.pdf Creating Plasmoids]&lt;br /&gt;
:''May 2010 article from Linux Magazine''&lt;br /&gt;
&lt;br /&gt;
;[http://www.ibm.com/developerworks/linux/library/l-kde-plasmoids/index.html Create Plasmoids using KDevelop]&lt;br /&gt;
:''Article explaining the structure of Plasma and how to create a Plasmoid''&lt;br /&gt;
&lt;br /&gt;
;[http://community.kde.org/User:Mxttie#Adding_configuration Adding configuration to your plasmoid]&lt;br /&gt;
:''Article explaining how to add a configuration dialog to your plasmoid.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ApplicationShell|Integrate Plasma in Applications]]&lt;br /&gt;
:''This tutorial shows you how to make an application dashboard based on Plasma technologies.''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with JavaScript ==&lt;br /&gt;
&lt;br /&gt;
Plasma has built-in JavaScript (also known as ECMAScript, and often referred to as QtScript in the context of Qt) scripting support without requiring any external dependencies.&lt;br /&gt;
&lt;br /&gt;
=== Plasmoids ===&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in JavaScript''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/DataEngine|Getting Data]]&lt;br /&gt;
:''How to retreive data from a data engine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/NowPlaying|Now Playing]]&lt;br /&gt;
:''Slightly more advanced data engine usage: displaying what's currently playing''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/SystemMonitor|System Monitor]]&lt;br /&gt;
:''How to access systemmonitor data engine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/CheatSheet|Cheat Sheet]]&lt;br /&gt;
:''A cheat sheet, rather than a tutorial, of things to remember and watch out for when developing JavaScript plasmoids''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/API|API Reference]]&lt;br /&gt;
:''The Simplified JavaScript Plasmoid API. Useful for referencing what is available in the runtime and as a study aid for the tutorials above.''&lt;br /&gt;
&lt;br /&gt;
=== QML Plasmoids ===&lt;br /&gt;
It's possible to write Javascript Plasmoids that use the QML declarative language to describe their user interface, while having the logic in JavaScript.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/QML/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in QML''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/QML/API|API Reference]]&lt;br /&gt;
:''The QML Plasmoid API. Useful for referencing what is available in the runtime, what are the differences with the pure JavaScript scriptengine and as a study aid for the tutorials above.''&lt;br /&gt;
&lt;br /&gt;
=== Other Applications Of Javascript ===&lt;br /&gt;
;[[KDE_System_Administration/PlasmaDestkopScripting|Scripting Plasma Shells]]&lt;br /&gt;
:The KDE Plasma Desktop and Netbook provide means to manage the desktop shell (desktop, panels, widget) via scripts written in JavaScript. This article describes how to take advantage of this feature set as well as documents the full API. This is primarily a system administration tool, but may also be of interest to power users.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/Animations|Javascript Animations]]&lt;br /&gt;
:''How to write Animations using Javascript for use in Plasma applications''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ComicPlugin|Creating Comic Plugins]]&lt;br /&gt;
:''This guide shows you how to create a comic plugin for the comic plasmoid.''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Python ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Python''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Using DataEngines|Using DataEngines]]&lt;br /&gt;
:''How to use DataEngines from a plasmoid''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Writing DataEngines|Writing DataEngines]]&lt;br /&gt;
:''How to write your own Plasma DataEngine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonPlasmoid|Writing a Plasmoid in Python]]&lt;br /&gt;
:''Writing a simple battery graph in python''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonRunner|Writing a KRunner plugin in Python]]&lt;br /&gt;
:''Writing a simple krunner plugin in python''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Ruby ==&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Ruby''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/SimplePasteApplet|Writing a simple paste applet]]&lt;br /&gt;
:''A tutorial explaining how to set up a plasmoid, create a simple paste applet using widgets and add Plasma features seen elsewhere. Complete with tips for those who have never programmed before.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Writing DataEngines|Writing DataEngines]]&lt;br /&gt;
:''How to write your own Plasma DataEngine using Ruby''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Blinker|Use SVG artwork in the simplest way possible]]&lt;br /&gt;
:''Follow a fellow student as he asks around about SVG usage and explains why the code examples work. This is a wiki so feel free to add your own insights until this tutorial can be considered complete.''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Web Technologies (HTML/JS/CSS etc) ==&lt;br /&gt;
;[[Development/Tutorials/Plasma/Web/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in HTML''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Qt Quick (QML) ==&lt;br /&gt;
;[[Development/Tutorials/Plasma/QML/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid with Qt Quick/QML''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/QML/API|QML API]]&lt;br /&gt;
:''Check out the QML API and be amazed. Also check out the Javascript API docs''&lt;br /&gt;
&lt;br /&gt;
== Plasma integration ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Solid_Device_Actions|Creating a Device Notifier action]]&lt;br /&gt;
:''When your application is interested in removable hardware''&lt;br /&gt;
&lt;br /&gt;
== Theme development ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Theme|Creating a Plasma Theme Quickstart]]&lt;br /&gt;
:''A quick guide to creating your first Plasma theme''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ThemeDetails|The Plasma Theme Structure In Detail]]&lt;br /&gt;
:''A comprehensive guide to the contents of a Plasma SVG theme, including configuration options, wallpapers, on-disk layout, names of all standard SVG files and every element in them.''&lt;br /&gt;
&lt;br /&gt;
== Activity Template development ==&lt;br /&gt;
&lt;br /&gt;
;[[KDE_System_Administration/PlasmaDesktopScripting#Activity_templates|Creating a Plasma Activity Template Quickstart]]&lt;br /&gt;
:''A quick guide to creating your first Plasma Activity Template''&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
* [[Projects/Plasma|Projects: Plasma]]&lt;br /&gt;
* [http://api.kde.org/4.x-api/kdelibs-apidocs/plasma/html/index.html Plasma api documentation]&lt;br /&gt;
* [http://techbase.kde.org/Projects/Plasma/Eclipse_Integration Plasma Eclipse Integration]&lt;br /&gt;
* The [https://mail.kde.org/mailman/listinfo/plasma-devel plasma-devel mailing list] and #plasma on IRC (irc.freenode.org).&lt;br /&gt;
&lt;br /&gt;
== Presentation Slides==&lt;br /&gt;
http://chani.wordpress.com/2009/04/25/quick-update-for-my-presentation/ Victory Calendar -- also link to websvn plasma playground in the odp file.&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/API</id>
		<title>Development/Tutorials/Plasma/QML/API</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/API"/>
				<updated>2011-07-23T02:08:52Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* DataSource */ document signals for dataSource. HUZZAH! made a clearer separation as well.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction to the Plasmoid QML Declarative API  =&lt;br /&gt;
&lt;br /&gt;
This document provides an overview/reference of the Declarative QML API for Plasmoids. It isn't a full binding to all of Qt or KDE's libraries, but a focused set of bindings designed to make writing Plasmoids fast and easy, while remaining powerful.&lt;br /&gt;
&lt;br /&gt;
The API in this documentation covers the API of the Plasma specific QML components, so only the Declarative part of the API.&lt;br /&gt;
&lt;br /&gt;
The QML ScriptEngine is bassed upon the Plasma JavaScript engine, making the API of the JavaScript part identical to the one of the JavaScript plasmoids engine.&lt;br /&gt;
To see the api of the global ''Plasmoid'' object, see the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#The_Global_plasmoid_Object JavaScript API] documentation.&lt;br /&gt;
(TODO: the JavaScript api paged should probably be copied and stripped down the imperative bits not present there, it would make harder to update tough)&lt;br /&gt;
&lt;br /&gt;
== What Is a Declarative Plasmoid?  ==&lt;br /&gt;
&lt;br /&gt;
To denote that this Plasmoid is a Declarative widget, ensure that in the metadata.desktop file there is this line: &lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
&lt;br /&gt;
What follows is a description of the Plasma declarative classes instantiable from QML.&lt;br /&gt;
&lt;br /&gt;
= Main QML classes =&lt;br /&gt;
&lt;br /&gt;
== Data engines ==&lt;br /&gt;
While it's possible to fetch data from a Plasma DataEngine in the same way as the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#DataEngine JavaScript API], however it is preferrable to use the following declarative classes:&lt;br /&gt;
&lt;br /&gt;
=== DataSource ===&lt;br /&gt;
DataSource is a receiver for a dataEngine and can be declared inside QML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
 PlasmaCore.DataSource {&lt;br /&gt;
     id: dataSource&lt;br /&gt;
     engine: &amp;quot;time&amp;quot;&lt;br /&gt;
     connectedSources: [&amp;quot;Local&amp;quot;]&lt;br /&gt;
     interval: 500&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Properties ====&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* bool '''valid''' (read only): true when the DataSource is successfully connected to a data engine&lt;br /&gt;
* int '''interval''': interval of polling of the dataengine, if 0 (default value) no polling will be executed&lt;br /&gt;
* string '''engine''': the plugin name of the dataengine to load&lt;br /&gt;
* Array(string) '''connectedSources''': all the sources of the dataengine we are connected to (and whose data will appear in the '''data''' property)&lt;br /&gt;
* Array(string) '''sources''' (read only): all the sources available from the dataengine&lt;br /&gt;
* variant map '''data''' (read only): It's the most important property, it's a map of all the data available from the dataengine: its structure will be as follows:&lt;br /&gt;
** each key of the map will be a source name, in '''connectedSources'''&lt;br /&gt;
** each value will be a variant hash, so an hash with strings as keys and any variant as value&lt;br /&gt;
** example: dataSource.data[&amp;quot;Local&amp;quot;][&amp;quot;Time&amp;quot;] indicates the '''Time''' key of the dataengine source called &amp;quot;Local&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Signals ====&lt;br /&gt;
It has the following signals:&lt;br /&gt;
&lt;br /&gt;
Note that javascript/qml applies the 'on' prefix to signals. So the actual signal name in C++ which is e.g. '''newData''(...) becomes '''onNewData'''(...).&lt;br /&gt;
&lt;br /&gt;
* '''onNewData'''(String sourceName, Plasma::DataEngine::Data data)&lt;br /&gt;
* '''onSourceAdded'''(String source)&lt;br /&gt;
* '''onSourceRemoved'''(String source)&lt;br /&gt;
* '''onSourceConnected'''(String source)&lt;br /&gt;
* '''onSourceDisconnected'''(String source)&lt;br /&gt;
* '''onIntervalChanged'''()&lt;br /&gt;
* '''onEngineChanged'''()&lt;br /&gt;
* '''onDataChanged'''()&lt;br /&gt;
* '''onConnectedSourcesChanged'''()&lt;br /&gt;
* '''onSourcesChanged'''()&lt;br /&gt;
&lt;br /&gt;
==== Methods ====&lt;br /&gt;
It has the following methods:&lt;br /&gt;
* StringList keysForSource(String source): lists all the keys corresponding to a certain source: for instance in the &amp;quot;time&amp;quot; dataengine, for the &amp;quot;Local&amp;quot; source, keys will be:&lt;br /&gt;
** &amp;quot;Timezone Continent&amp;quot;&lt;br /&gt;
** &amp;quot;Offset&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone&amp;quot;&lt;br /&gt;
** &amp;quot;Time&amp;quot;&lt;br /&gt;
** &amp;quot;Date&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone City&amp;quot;&lt;br /&gt;
* Service serviceForSource(String source): returns a Plasma service that corresponds a given source: see the section about services for how to use it.&lt;br /&gt;
* void connectSource(String source): adds to '''connectedSources''' the new source&lt;br /&gt;
* void disconnectSource(String source): removes that source from '''connectedSources'''&lt;br /&gt;
&lt;br /&gt;
=== Service ===&lt;br /&gt;
Due to their imperative nature, Plasma Services are not instantiated as QML classes, but rather created out of a '''DataSource''' with the method '''serviceForSource''' and used in the JavaScript portions of the QML files.&lt;br /&gt;
This following example is a simplified version from the Now Playing QML widget in the kdeexamples git repository: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var service = dataSource.serviceForSource(activeSource)&lt;br /&gt;
  var operation = service.operationDescription(&amp;quot;seek&amp;quot;)&lt;br /&gt;
  operation.seconds = 10&lt;br /&gt;
&lt;br /&gt;
  var job = service.startOperationCall(operation)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Here dataSource is the id of a DataSource object, and activeSource is a source contained in one of its '''connectedSources'''.&lt;br /&gt;
The service provides an operation called &amp;quot;seek&amp;quot;, with a parameter called &amp;quot;seconds&amp;quot;, that can be written on it as a property of a JavaScript object.&lt;br /&gt;
&lt;br /&gt;
=== ServiceJob ===&lt;br /&gt;
If is necessary to monitor the result of a Service operation, it's possible to connect to the '''finished''' signal provided by the job return paramenter of the '''startOperationCall''' service method.&lt;br /&gt;
The '''finished''' signal has the same job as parameter, from which is possible to check the variant '''result''' property, to check the result.&lt;br /&gt;
&lt;br /&gt;
=== DataModel ===&lt;br /&gt;
Some data engines return as their data something that can be interpreted as a list of items, rather than simple key/value pairs.&lt;br /&gt;
QML provides some item views such as '''ListView''', '''GridView''' and '''Repeater'''.&lt;br /&gt;
The '''DataModel''' QML object can provide, based on a DataSource a model suitable for those QML item views.&lt;br /&gt;
&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* DataSource '''dataSource''': the id of an existing (and connected) DataSource&lt;br /&gt;
* String '''sourceFilter''': it's a regular expression. If the DataSource is connected to more than one source, only inserts data from sources matching this filter expression in the model. To, for example, have a source watch all sources beginning with say &amp;quot;name:&amp;quot;, the required regexp would be sourceFilter: &amp;quot;name:.*&amp;quot;&lt;br /&gt;
* String '''keyRoleFilter''': it's a regular expression. Only data with keys that match this filter expression will be inserted in the model&lt;br /&gt;
* int '''count''' (read only): how many items are in the model&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 ListView {&lt;br /&gt;
   model: PlasmaCore.DataModel {&lt;br /&gt;
        dataSource: microblogSource&lt;br /&gt;
        keyRoleFilter: &amp;quot;[\\d]*&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    delegate: Text {&lt;br /&gt;
        text: title&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the example, ''microblogSource'' is the id of a DataSource, and inserts in the model only entries that have a number as the key name (matched with [\\d]*, in this case tweets ids)&lt;br /&gt;
&lt;br /&gt;
Each item in the model will have the form of a variant hash: all the keys of the hash will be registered as model role names, in the example, &amp;quot;title&amp;quot; is a role of the model containing a string (also reachable with model[&amp;quot;title&amp;quot;]).&lt;br /&gt;
&lt;br /&gt;
A special reserved role will always be present: '''&amp;quot;DataEngineSource&amp;quot;''': it will contain the name of the data engine source that gave origin to this item. Therefore, if you want merely the string of the current source that the model is at...do model[&amp;quot;DataEngineSource&amp;quot;].&lt;br /&gt;
&lt;br /&gt;
Note that view.currentItem holds the item currently selected. However, due to (http://bugreports.qt.nokia.com/browse/QTBUG-16347) this does not work in PathView. A workaround is to make your own.&lt;br /&gt;
&lt;br /&gt;
=== SortFilterModel ===&lt;br /&gt;
SortFilterModel is a proxy model for easy sorting and/or filtering of the items in a DataModel (or any other QAbstractItemModel subclass that has been registered in QML with setContextProperty from a C++ application)&lt;br /&gt;
Properties:&lt;br /&gt;
* model '''sourceModel'''&lt;br /&gt;
* String '''filterRegExp'''&lt;br /&gt;
* String '''filterRole'''&lt;br /&gt;
* String '''sortRole'''&lt;br /&gt;
* Qt::SortOrder '''sortOrder'''&lt;br /&gt;
* int '''count''' (read only)&lt;br /&gt;
&lt;br /&gt;
== Plasma Themes ==&lt;br /&gt;
&lt;br /&gt;
=== Theme ===&lt;br /&gt;
This class instantiable from QML provides access to the Plasma Theme colors and other facilities such as fonts.&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* String '''themeName''' (read only)&lt;br /&gt;
* QFont '''font''' (read only)&lt;br /&gt;
* bool '''windowTranslucentEnabled''' (read only)&lt;br /&gt;
* Url '''homepage''' (read only)&lt;br /&gt;
* bool '''useGlobalSettings''' (read only)&lt;br /&gt;
* QString '''wallpaperPath''' (read only)&lt;br /&gt;
* color '''textColor''' (read only)&lt;br /&gt;
* color '''highlightColor''' (read only)&lt;br /&gt;
* color '''backgroundColor''' (read only)&lt;br /&gt;
* color '''buttonTextColor''' (read only)&lt;br /&gt;
* color '''buttonBackgroundColor''' (read only)&lt;br /&gt;
* color '''linkColor''' (read only)&lt;br /&gt;
* color visitedLinkColor''' (read only)&lt;br /&gt;
* color '''visitedLinkColor''' (read only)&lt;br /&gt;
* color '''buttonHoverColor''' (read only)&lt;br /&gt;
* color '''buttonFocusColor''' (read only)&lt;br /&gt;
* color '''viewTextColor''' (read only)&lt;br /&gt;
* color '''viewBackgroundColo''' (read only)r&lt;br /&gt;
* color '''viewHoverColor''' (read only)&lt;br /&gt;
* color '''viewFocusColor''' (read only)&lt;br /&gt;
* String '''styleSheet''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== Svg ===&lt;br /&gt;
Declaring a Svg element instantiates a Plasma Svg instance. This class doesn't draw anything, for drawing, SvgItem is used.&lt;br /&gt;
Properties:&lt;br /&gt;
* QSize '''size'''&lt;br /&gt;
* bool '''multipleImages'''&lt;br /&gt;
* String '''imagePath'''&lt;br /&gt;
* bool '''usingRenderingCache'''&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPixmap pixmap(QString elementID)&lt;br /&gt;
* void resize(qreal width, qreal height)&lt;br /&gt;
* void resize(): resets the image to its default dimension&lt;br /&gt;
* QSize elementSize(QString elementId)&lt;br /&gt;
* QRectF elementRect(QString elementId)&lt;br /&gt;
* bool hasElement(QString elementId)&lt;br /&gt;
* bool isValid(): true if valid svg file&lt;br /&gt;
&lt;br /&gt;
=== SvgItem ===&lt;br /&gt;
It's a graphical element that will actually paint a Svg instance.&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''elementId''': what element to render. If null, the whole svg will be rendered&lt;br /&gt;
* Svg '''svg''': instance of the Svg class mentioned above&lt;br /&gt;
* QSizeF '''naturalSize''' (read only): default size of the Svg&lt;br /&gt;
* bool '''smooth''': paint with antialias (default false)&lt;br /&gt;
&lt;br /&gt;
=== FrameSvgItem ===&lt;br /&gt;
It's a graphical elenent that paints a Plasma::FrameSvg, so a ractangular image composed by 9 elements contained in a Svg file, useful for things like buttons and frames.&lt;br /&gt;
&lt;br /&gt;
Flags&lt;br /&gt;
* EnabledBorders: combination of TopBorder | BottomBorder | LeftBorder | RightBorder, NoBorder if no border of the frame is enabled&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''imagePath''': path of the file relative to the Plasma Theme, for instance &amp;quot;widgets/background&amp;quot;&lt;br /&gt;
* String '''prefix''': a FrameSvg can contain multiple frames, for instance a button contains &amp;quot;normal&amp;quot;, &amp;quot;raised&amp;quot; and &amp;quot;pressed&amp;quot;&lt;br /&gt;
* Margins '''margins''' (read only): the margins of the frame, see documentation below&lt;br /&gt;
* EnabledBorders '''enabledBorders''': what borders are enabled&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
== Top Level windows ==&lt;br /&gt;
&lt;br /&gt;
=== Dialog ===&lt;br /&gt;
Dialog instantiates a Plasma::Dialog, it will be a Plasma themed top level window that can contain any QML component.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item mainItem: the Item contained in the Dialog, it can be any QML Item instance&lt;br /&gt;
* bool '''visible''': if the window (not the mainItem) is visible&lt;br /&gt;
* int '''x''': x position of the window in screen coordinates&lt;br /&gt;
* int '''y''': y position of the window in screen coordinates&lt;br /&gt;
* int '''width''' (read only): total width of the dialog, including margins&lt;br /&gt;
* int '''height''' (read only): total height of the dialog, including margins&lt;br /&gt;
* int '''windowFlags''': Qt window flags of the Dialog&lt;br /&gt;
* Margins '''margins''' (read only): margins of the Dialog&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPoint popupPosition(Item item, Qt::Alignment alignment=Qt::AlignLeft): the suggested position for the Dialog if it has to be correctly placed as popup of the QML item passed as parameter.&lt;br /&gt;
* void setAttribute(Qt::WindowAttribute attribute, bool on): set an attribute for the dialog window&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== ToolTip ===&lt;br /&gt;
Declaring a ToolTip instance makes it possible to use Plasma tooltips with any QML item.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item '''target''': the QML item we want to show a tooltip of&lt;br /&gt;
* String '''mainText'''&lt;br /&gt;
* String '''subText'''&lt;br /&gt;
* String '''image''': freedesktop compliant icon name as image of the tooltip&lt;br /&gt;
&lt;br /&gt;
= Plasma QtComponents (4.8) =&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/Services</id>
		<title>Development/Tutorials/Plasma/Services</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/Services"/>
				<updated>2011-07-19T18:31:01Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* The Code */ added operations file &amp;amp; cmake stuff. I'm not sure what should be added for the c++ code, since I can't think of a good example..*shrug*&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Plasma/DataEngines}}&lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Plasma Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=Writing a Service|&lt;br /&gt;
&lt;br /&gt;
pre=[http://mindview.net/Books/TICPP/ThinkingInCPP2e.html C++], [http://www.trolltech.com/products/qt/ Qt], [[Getting_Started/Build|KDE development environment]]|&lt;br /&gt;
&lt;br /&gt;
next=| &lt;br /&gt;
&lt;br /&gt;
reading=[http://api.kde.org/4.x-api/kdelibs-apidocs/plasma/html/classPlasma_1_1DataEngine.html DataEngine API], [[Development/Tutorials/CMake|CMake Tutorials]], [[Development/Tutorials/Plasma/GettingStarted|Writing a Plasmoid (Tutorial)]], [[Development/Tutorials/Plasma/DataEngines|Writing a Data Engine (Tutorial)]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
&lt;br /&gt;
cover services, .operations file, .operations dtd spec, perhaps make a service like the pastebin one or something. idk, something easy. &lt;br /&gt;
&lt;br /&gt;
http://www.kde.org/standards/kcfg/1.0/kcfg.xsd&lt;br /&gt;
&lt;br /&gt;
also mention how a service can access the dataengine via it's pointer(I think that's in public api), if it really really needs to(e.g. plasma-kdm can't live without that)&lt;br /&gt;
&lt;br /&gt;
==The Plasma Engine Explorer==&lt;br /&gt;
&lt;br /&gt;
A very useful tool for anyone writing services is the Plasma engine explorer. You can use it to see test services by launching them by running&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
plasmaengineexplorer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the service you want to test is associated to a source, you can access a dialog to launch the service and set its parameters by using the contextual menu of the source and selecting &amp;quot;Get associated service&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Image:Plasma-engine-explorer-task-service.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==The Code==&lt;br /&gt;
&lt;br /&gt;
This tutorial will cover adding a service associated with a source into an existing data engine. Depending on your requirements, you may want a service which is associated with a certain source, and will be able to perform actions based on that source, or you may want a service that simply performs global calls which are not tied to any one source. We will cover the first case, since it is the most prominent.&lt;br /&gt;
&lt;br /&gt;
===The Description of the Service and its parameters===&lt;br /&gt;
The service you make yourself and can really have any parameters you want, it's quite flexible. The constructor can be e.g. MyService(QObject* parent, const QString&amp;amp; source), or it can create a custom class which is a custom data source.&lt;br /&gt;
====Writing an Operations File====&lt;br /&gt;
The operations file is quite core to the service, as it defines which operations are available. It is simply an XML file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE kcfg SYSTEM&lt;br /&gt;
    &amp;quot;http://www.kde.org/standards/kcfg/1.0/kcfg.xsd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;kcfg&amp;gt;&lt;br /&gt;
    &amp;lt;group name=&amp;quot;setIcon&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;entry name=&amp;quot;Icon&amp;quot; type=&amp;quot;String&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label&amp;gt;Set the name of the icon for this somesource&amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
    &amp;lt;/group&amp;gt;&lt;br /&gt;
&amp;lt;/kcfg&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===The Main Code===&lt;br /&gt;
&lt;br /&gt;
====Responding to Request for the Service Associated to a Source====&lt;br /&gt;
&lt;br /&gt;
====Writing the Code Executing the Action of the Service====&lt;br /&gt;
&lt;br /&gt;
====Building it====&lt;br /&gt;
As in the previous DataEngine tutorial, the CMakeLists.txt file is required to build your plugin. To create a service in addition to an engine, only a few lines of code need to be added. We need to add our service's C++ source file to our existing project, then install the operations file that was made.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
set(myproject_SRCS &lt;br /&gt;
    myengine.cpp&lt;br /&gt;
    myservice.cpp&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(FILES org.kde.myprogramsname.service.operations&lt;br /&gt;
        DESTINATION ${DATA_INSTALL_DIR}/plasma/services)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the case of &amp;quot;myprogramsname&amp;quot;, that is simply e.g. microblog, pastebin, activities or whatever your collection of components is going to be named. (the reverse-domain name is used to prevent conflictions, so try to use it as much as possible).&lt;br /&gt;
&lt;br /&gt;
==Testing==&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/API</id>
		<title>Development/Tutorials/Plasma/QML/API</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/API"/>
				<updated>2011-07-16T18:03:17Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* DataModel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction to the Plasmoid QML Declarative API  =&lt;br /&gt;
&lt;br /&gt;
This document provides an overview/reference of the Declarative QML API for Plasmoids. It isn't a full binding to all of Qt or KDE's libraries, but a focused set of bindings designed to make writing Plasmoids fast and easy, while remaining powerful.&lt;br /&gt;
&lt;br /&gt;
The API in this documentation covers the API of the Plasma specific QML components, so only the Declarative part of the API.&lt;br /&gt;
&lt;br /&gt;
The QML ScriptEngine is bassed upon the Plasma JavaScript engine, making the API of the JavaScript part identical to the one of the JavaScript plasmoids engine.&lt;br /&gt;
To see the api of the global ''Plasmoid'' object, see the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#The_Global_plasmoid_Object JavaScript API] documentation.&lt;br /&gt;
(TODO: the JavaScript api paged should probably be copied and stripped down the imperative bits not present there, it would make harder to update tough)&lt;br /&gt;
&lt;br /&gt;
== What Is a Declarative Plasmoid?  ==&lt;br /&gt;
&lt;br /&gt;
To denote that this Plasmoid is a Declarative widget, ensure that in the metadata.desktop file there is this line: &lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
&lt;br /&gt;
What follows is a description of the Plasma declarative classes instantiable from QML.&lt;br /&gt;
&lt;br /&gt;
= Main QML classes =&lt;br /&gt;
&lt;br /&gt;
== Data engines ==&lt;br /&gt;
While it's possible to fetch data from a Plasma DataEngine in the same way as the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#DataEngine JavaScript API], however it is preferrable to use the following declarative classes:&lt;br /&gt;
&lt;br /&gt;
=== DataSource ===&lt;br /&gt;
DataSource is a receiver for a dataEngine and can be declared inside QML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
 PlasmaCore.DataSource {&lt;br /&gt;
     id: dataSource&lt;br /&gt;
     engine: &amp;quot;time&amp;quot;&lt;br /&gt;
     connectedSources: [&amp;quot;Local&amp;quot;]&lt;br /&gt;
     interval: 500&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* bool '''valid''' (read only): true when the DataSource is successfully connected to a data engine&lt;br /&gt;
* int '''interval''': interval of polling of the dataengine, if 0 (default value) no polling will be executed&lt;br /&gt;
* string '''engine''': the plugin name of the dataengine to load&lt;br /&gt;
* Array(string) '''connectedSources''': all the sources of the dataengine we are connected to (and whose data will appear in the '''data''' property)&lt;br /&gt;
* Array(string) '''sources''' (read only): all the sources available from the dataengine&lt;br /&gt;
* variant map '''data''' (read only): It's the most important property, it's a map of all the data available from the dataengine: its structure will be as follows:&lt;br /&gt;
** each key of the map will be a source name, in '''connectedSources'''&lt;br /&gt;
** each value will be a variant hash, so an hash with strings as keys and any variant as value&lt;br /&gt;
** example: dataSource.data[&amp;quot;Local&amp;quot;][&amp;quot;Time&amp;quot;] indicates the '''Time''' key of the dataengine source called &amp;quot;Local&amp;quot;&lt;br /&gt;
&lt;br /&gt;
It has the following methods:&lt;br /&gt;
* StringList keysForSource(String source): lists all the keys corresponding to a certain source: for instance in the &amp;quot;time&amp;quot; dataengine, for the &amp;quot;Local&amp;quot; source, keys will be:&lt;br /&gt;
** &amp;quot;Timezone Continent&amp;quot;&lt;br /&gt;
** &amp;quot;Offset&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone&amp;quot;&lt;br /&gt;
** &amp;quot;Time&amp;quot;&lt;br /&gt;
** &amp;quot;Date&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone City&amp;quot;&lt;br /&gt;
* Service serviceForSource(String source): returns a Plasma service that corresponds a given source: see the section about services for how to use it.&lt;br /&gt;
* void connectSource(String source): adds to '''connectedSources''' the new source&lt;br /&gt;
* void disconnectSource(String source): removes that source from '''connectedSources'''&lt;br /&gt;
&lt;br /&gt;
=== Service ===&lt;br /&gt;
Due to their imperative nature, Plasma Services are not instantiated as QML classes, but rather created out of a '''DataSource''' with the method '''serviceForSource''' and used in the JavaScript portions of the QML files.&lt;br /&gt;
This following example is a simplified version from the Now Playing QML widget in the kdeexamples git repository: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var service = dataSource.serviceForSource(activeSource)&lt;br /&gt;
  var operation = service.operationDescription(&amp;quot;seek&amp;quot;)&lt;br /&gt;
  operation.seconds = 10&lt;br /&gt;
&lt;br /&gt;
  var job = service.startOperationCall(operation)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Here dataSource is the id of a DataSource object, and activeSource is a source contained in one of its '''connectedSources'''.&lt;br /&gt;
The service provides an operation called &amp;quot;seek&amp;quot;, with a parameter called &amp;quot;seconds&amp;quot;, that can be written on it as a property of a JavaScript object.&lt;br /&gt;
&lt;br /&gt;
=== ServiceJob ===&lt;br /&gt;
If is necessary to monitor the result of a Service operation, it's possible to connect to the '''finished''' signal provided by the job return paramenter of the '''startOperationCall''' service method.&lt;br /&gt;
The '''finished''' signal has the same job as parameter, from which is possible to check the variant '''result''' property, to check the result.&lt;br /&gt;
&lt;br /&gt;
=== DataModel ===&lt;br /&gt;
Some data engines return as their data something that can be interpreted as a list of items, rather than simple key/value pairs.&lt;br /&gt;
QML provides some item views such as '''ListView''', '''GridView''' and '''Repeater'''.&lt;br /&gt;
The '''DataModel''' QML object can provide, based on a DataSource a model suitable for those QML item views.&lt;br /&gt;
&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* DataSource '''dataSource''': the id of an existing (and connected) DataSource&lt;br /&gt;
* String '''sourceFilter''': it's a regular expression. If the DataSource is connected to more than one source, only inserts data from sources matching this filter expression in the model. To, for example, have a source watch all sources beginning with say &amp;quot;name:&amp;quot;, the required regexp would be sourceFilter: &amp;quot;name:.*&amp;quot;&lt;br /&gt;
* String '''keyRoleFilter''': it's a regular expression. Only data with keys that match this filter expression will be inserted in the model&lt;br /&gt;
* int '''count''' (read only): how many items are in the model&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 ListView {&lt;br /&gt;
   model: PlasmaCore.DataModel {&lt;br /&gt;
        dataSource: microblogSource&lt;br /&gt;
        keyRoleFilter: &amp;quot;[\\d]*&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    delegate: Text {&lt;br /&gt;
        text: title&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the example, ''microblogSource'' is the id of a DataSource, and inserts in the model only entries that have a number as the key name (matched with [\\d]*, in this case tweets ids)&lt;br /&gt;
&lt;br /&gt;
Each item in the model will have the form of a variant hash: all the keys of the hash will be registered as model role names, in the example, &amp;quot;title&amp;quot; is a role of the model containing a string (also reachable with model[&amp;quot;title&amp;quot;]).&lt;br /&gt;
&lt;br /&gt;
A special reserved role will always be present: '''&amp;quot;DataEngineSource&amp;quot;''': it will contain the name of the data engine source that gave origin to this item. Therefore, if you want merely the string of the current source that the model is at...do model[&amp;quot;DataEngineSource&amp;quot;].&lt;br /&gt;
&lt;br /&gt;
Note that view.currentItem holds the item currently selected. However, due to (http://bugreports.qt.nokia.com/browse/QTBUG-16347) this does not work in PathView. A workaround is to make your own.&lt;br /&gt;
&lt;br /&gt;
=== SortFilterModel ===&lt;br /&gt;
SortFilterModel is a proxy model for easy sorting and/or filtering of the items in a DataModel (or any other QAbstractItemModel subclass that has been registered in QML with setContextProperty from a C++ application)&lt;br /&gt;
Properties:&lt;br /&gt;
* model '''sourceModel'''&lt;br /&gt;
* String '''filterRegExp'''&lt;br /&gt;
* String '''filterRole'''&lt;br /&gt;
* String '''sortRole'''&lt;br /&gt;
* Qt::SortOrder '''sortOrder'''&lt;br /&gt;
* int '''count''' (read only)&lt;br /&gt;
&lt;br /&gt;
== Plasma Themes ==&lt;br /&gt;
&lt;br /&gt;
=== Theme ===&lt;br /&gt;
This class instantiable from QML provides access to the Plasma Theme colors and other facilities such as fonts.&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* String '''themeName''' (read only)&lt;br /&gt;
* QFont '''font''' (read only)&lt;br /&gt;
* bool '''windowTranslucentEnabled''' (read only)&lt;br /&gt;
* Url '''homepage''' (read only)&lt;br /&gt;
* bool '''useGlobalSettings''' (read only)&lt;br /&gt;
* QString '''wallpaperPath''' (read only)&lt;br /&gt;
* color '''textColor''' (read only)&lt;br /&gt;
* color '''highlightColor''' (read only)&lt;br /&gt;
* color '''backgroundColor''' (read only)&lt;br /&gt;
* color '''buttonTextColor''' (read only)&lt;br /&gt;
* color '''buttonBackgroundColor''' (read only)&lt;br /&gt;
* color '''linkColor''' (read only)&lt;br /&gt;
* color visitedLinkColor''' (read only)&lt;br /&gt;
* color '''visitedLinkColor''' (read only)&lt;br /&gt;
* color '''buttonHoverColor''' (read only)&lt;br /&gt;
* color '''buttonFocusColor''' (read only)&lt;br /&gt;
* color '''viewTextColor''' (read only)&lt;br /&gt;
* color '''viewBackgroundColo''' (read only)r&lt;br /&gt;
* color '''viewHoverColor''' (read only)&lt;br /&gt;
* color '''viewFocusColor''' (read only)&lt;br /&gt;
* String '''styleSheet''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== Svg ===&lt;br /&gt;
Declaring a Svg element instantiates a Plasma Svg instance. This class doesn't draw anything, for drawing, SvgItem is used.&lt;br /&gt;
Properties:&lt;br /&gt;
* QSize '''size'''&lt;br /&gt;
* bool '''multipleImages'''&lt;br /&gt;
* String '''imagePath'''&lt;br /&gt;
* bool '''usingRenderingCache'''&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPixmap pixmap(QString elementID)&lt;br /&gt;
* void resize(qreal width, qreal height)&lt;br /&gt;
* void resize(): resets the image to its default dimension&lt;br /&gt;
* QSize elementSize(QString elementId)&lt;br /&gt;
* QRectF elementRect(QString elementId)&lt;br /&gt;
* bool hasElement(QString elementId)&lt;br /&gt;
* bool isValid(): true if valid svg file&lt;br /&gt;
&lt;br /&gt;
=== SvgItem ===&lt;br /&gt;
It's a graphical element that will actually paint a Svg instance.&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''elementId''': what element to render. If null, the whole svg will be rendered&lt;br /&gt;
* Svg '''svg''': instance of the Svg class mentioned above&lt;br /&gt;
* QSizeF '''naturalSize''' (read only): default size of the Svg&lt;br /&gt;
* bool '''smooth''': paint with antialias (default false)&lt;br /&gt;
&lt;br /&gt;
=== FrameSvgItem ===&lt;br /&gt;
It's a graphical elenent that paints a Plasma::FrameSvg, so a ractangular image composed by 9 elements contained in a Svg file, useful for things like buttons and frames.&lt;br /&gt;
&lt;br /&gt;
Flags&lt;br /&gt;
* EnabledBorders: combination of TopBorder | BottomBorder | LeftBorder | RightBorder, NoBorder if no border of the frame is enabled&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''imagePath''': path of the file relative to the Plasma Theme, for instance &amp;quot;widgets/background&amp;quot;&lt;br /&gt;
* String '''prefix''': a FrameSvg can contain multiple frames, for instance a button contains &amp;quot;normal&amp;quot;, &amp;quot;raised&amp;quot; and &amp;quot;pressed&amp;quot;&lt;br /&gt;
* Margins '''margins''' (read only): the margins of the frame, see documentation below&lt;br /&gt;
* EnabledBorders '''enabledBorders''': what borders are enabled&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
== Top Level windows ==&lt;br /&gt;
&lt;br /&gt;
=== Dialog ===&lt;br /&gt;
Dialog instantiates a Plasma::Dialog, it will be a Plasma themed top level window that can contain any QML component.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item mainItem: the Item contained in the Dialog, it can be any QML Item instance&lt;br /&gt;
* bool '''visible''': if the window (not the mainItem) is visible&lt;br /&gt;
* int '''x''': x position of the window in screen coordinates&lt;br /&gt;
* int '''y''': y position of the window in screen coordinates&lt;br /&gt;
* int '''width''' (read only): total width of the dialog, including margins&lt;br /&gt;
* int '''height''' (read only): total height of the dialog, including margins&lt;br /&gt;
* int '''windowFlags''': Qt window flags of the Dialog&lt;br /&gt;
* Margins '''margins''' (read only): margins of the Dialog&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPoint popupPosition(Item item, Qt::Alignment alignment=Qt::AlignLeft): the suggested position for the Dialog if it has to be correctly placed as popup of the QML item passed as parameter.&lt;br /&gt;
* void setAttribute(Qt::WindowAttribute attribute, bool on): set an attribute for the dialog window&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== ToolTip ===&lt;br /&gt;
Declaring a ToolTip instance makes it possible to use Plasma tooltips with any QML item.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item '''target''': the QML item we want to show a tooltip of&lt;br /&gt;
* String '''mainText'''&lt;br /&gt;
* String '''subText'''&lt;br /&gt;
* String '''image''': freedesktop compliant icon name as image of the tooltip&lt;br /&gt;
&lt;br /&gt;
= Plasma QtComponents (4.8) =&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/API</id>
		<title>Development/Tutorials/Plasma/QML/API</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/API"/>
				<updated>2011-07-15T01:45:41Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* DataModel */ how about I actually specify markup lang this time..&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction to the Plasmoid QML Declarative API  =&lt;br /&gt;
&lt;br /&gt;
This document provides an overview/reference of the Declarative QML API for Plasmoids. It isn't a full binding to all of Qt or KDE's libraries, but a focused set of bindings designed to make writing Plasmoids fast and easy, while remaining powerful.&lt;br /&gt;
&lt;br /&gt;
The API in this documentation covers the API of the Plasma specific QML components, so only the Declarative part of the API.&lt;br /&gt;
&lt;br /&gt;
The QML ScriptEngine is bassed upon the Plasma JavaScript engine, making the API of the JavaScript part identical to the one of the JavaScript plasmoids engine.&lt;br /&gt;
To see the api of the global ''Plasmoid'' object, see the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#The_Global_plasmoid_Object JavaScript API] documentation.&lt;br /&gt;
(TODO: the JavaScript api paged should probably be copied and stripped down the imperative bits not present there, it would make harder to update tough)&lt;br /&gt;
&lt;br /&gt;
== What Is a Declarative Plasmoid?  ==&lt;br /&gt;
&lt;br /&gt;
To denote that this Plasmoid is a Declarative widget, ensure that in the metadata.desktop file there is this line: &lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
&lt;br /&gt;
What follows is a description of the Plasma declarative classes instantiable from QML.&lt;br /&gt;
&lt;br /&gt;
= Main QML classes =&lt;br /&gt;
&lt;br /&gt;
== Data engines ==&lt;br /&gt;
While it's possible to fetch data from a Plasma DataEngine in the same way as the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#DataEngine JavaScript API], however it is preferrable to use the following declarative classes:&lt;br /&gt;
&lt;br /&gt;
=== DataSource ===&lt;br /&gt;
DataSource is a receiver for a dataEngine and can be declared inside QML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
 PlasmaCore.DataSource {&lt;br /&gt;
     id: dataSource&lt;br /&gt;
     engine: &amp;quot;time&amp;quot;&lt;br /&gt;
     connectedSources: [&amp;quot;Local&amp;quot;]&lt;br /&gt;
     interval: 500&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* bool '''valid''' (read only): true when the DataSource is successfully connected to a data engine&lt;br /&gt;
* int '''interval''': interval of polling of the dataengine, if 0 (default value) no polling will be executed&lt;br /&gt;
* string '''engine''': the plugin name of the dataengine to load&lt;br /&gt;
* Array(string) '''connectedSources''': all the sources of the dataengine we are connected to (and whose data will appear in the '''data''' property)&lt;br /&gt;
* Array(string) '''sources''' (read only): all the sources available from the dataengine&lt;br /&gt;
* variant map '''data''' (read only): It's the most important property, it's a map of all the data available from the dataengine: its structure will be as follows:&lt;br /&gt;
** each key of the map will be a source name, in '''connectedSources'''&lt;br /&gt;
** each value will be a variant hash, so an hash with strings as keys and any variant as value&lt;br /&gt;
** example: dataSource.data[&amp;quot;Local&amp;quot;][&amp;quot;Time&amp;quot;] indicates the '''Time''' key of the dataengine source called &amp;quot;Local&amp;quot;&lt;br /&gt;
&lt;br /&gt;
It has the following methods:&lt;br /&gt;
* StringList keysForSource(String source): lists all the keys corresponding to a certain source: for instance in the &amp;quot;time&amp;quot; dataengine, for the &amp;quot;Local&amp;quot; source, keys will be:&lt;br /&gt;
** &amp;quot;Timezone Continent&amp;quot;&lt;br /&gt;
** &amp;quot;Offset&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone&amp;quot;&lt;br /&gt;
** &amp;quot;Time&amp;quot;&lt;br /&gt;
** &amp;quot;Date&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone City&amp;quot;&lt;br /&gt;
* Service serviceForSource(String source): returns a Plasma service that corresponds a given source: see the section about services for how to use it.&lt;br /&gt;
* void connectSource(String source): adds to '''connectedSources''' the new source&lt;br /&gt;
* void disconnectSource(String source): removes that source from '''connectedSources'''&lt;br /&gt;
&lt;br /&gt;
=== Service ===&lt;br /&gt;
Due to their imperative nature, Plasma Services are not instantiated as QML classes, but rather created out of a '''DataSource''' with the method '''serviceForSource''' and used in the JavaScript portions of the QML files.&lt;br /&gt;
This following example is a simplified version from the Now Playing QML widget in the kdeexamples git repository: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var service = dataSource.serviceForSource(activeSource)&lt;br /&gt;
  var operation = service.operationDescription(&amp;quot;seek&amp;quot;)&lt;br /&gt;
  operation.seconds = 10&lt;br /&gt;
&lt;br /&gt;
  var job = service.startOperationCall(operation)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Here dataSource is the id of a DataSource object, and activeSource is a source contained in one of its '''connectedSources'''.&lt;br /&gt;
The service provides an operation called &amp;quot;seek&amp;quot;, with a parameter called &amp;quot;seconds&amp;quot;, that can be written on it as a property of a JavaScript object.&lt;br /&gt;
&lt;br /&gt;
=== ServiceJob ===&lt;br /&gt;
If is necessary to monitor the result of a Service operation, it's possible to connect to the '''finished''' signal provided by the job return paramenter of the '''startOperationCall''' service method.&lt;br /&gt;
The '''finished''' signal has the same job as parameter, from which is possible to check the variant '''result''' property, to check the result.&lt;br /&gt;
&lt;br /&gt;
=== DataModel ===&lt;br /&gt;
Some data engines return as their data something that can be interpreted as a list of items, rather than simple key/value pairs.&lt;br /&gt;
QML provides some item views such as '''ListView''', '''GridView''' and '''Repeater'''.&lt;br /&gt;
The '''DataModel''' QML object can provide, based on a DataSource a model suitable for those QML item views.&lt;br /&gt;
&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* DataSource '''dataSource''': the id of an existing (and connected) DataSource&lt;br /&gt;
* String '''sourceFilter''': it's a regular expression. If the DataSource is connected to more than one source, only inserts data from sources matching this filter expression in the model. To, for example, have a source watch all sources beginning with say &amp;quot;name:&amp;quot;, the required regexp would be sourceFilter: &amp;quot;name:.*&amp;quot;&lt;br /&gt;
* String '''keyRoleFilter''': it's a regular expression. Only data with keys that match this filter expression will be inserted in the model&lt;br /&gt;
* int '''count''' (read only): how many items are in the model&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 ListView {&lt;br /&gt;
   model: PlasmaCore.DataModel {&lt;br /&gt;
        dataSource: microblogSource&lt;br /&gt;
        keyRoleFilter: &amp;quot;[\\d]*&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    delegate: Text {&lt;br /&gt;
        text: title&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the example, ''microblogSource'' is the id of a DataSource, and inserts in the model only entries that have a number as the key name (matched with [\\d]*, in this case tweets ids)&lt;br /&gt;
&lt;br /&gt;
Each item in the model will have the form of a variant hash: all the keys of the hash will be registered as model role names, in the example, &amp;quot;title&amp;quot; is a role of the model containing a string (also reachable with model[&amp;quot;title&amp;quot;]).&lt;br /&gt;
&lt;br /&gt;
A special reserved role will always be present: '''&amp;quot;DataEngineSource&amp;quot;''': it will contain the name of the data engine source that gave origin to this item. Therefore, if you want merely the string of the current source that the model is at...do model[&amp;quot;DataEngineSource&amp;quot;].&lt;br /&gt;
&lt;br /&gt;
Note that view.currentItem holds the item currently selected. However, due to (http://bugreports.qt.nokia.com/browse/QTBUG-16347) this does not work in PathView. A workaround is to use, for example...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 onCurrentIndexChanged: sometextedit.text = model.get(currentIndex).myproperty&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SortFilterModel ===&lt;br /&gt;
SortFilterModel is a proxy model for easy sorting and/or filtering of the items in a DataModel (or any other QAbstractItemModel subclass that has been registered in QML with setContextProperty from a C++ application)&lt;br /&gt;
Properties:&lt;br /&gt;
* model '''sourceModel'''&lt;br /&gt;
* String '''filterRegExp'''&lt;br /&gt;
* String '''filterRole'''&lt;br /&gt;
* String '''sortRole'''&lt;br /&gt;
* Qt::SortOrder '''sortOrder'''&lt;br /&gt;
* int '''count''' (read only)&lt;br /&gt;
&lt;br /&gt;
== Plasma Themes ==&lt;br /&gt;
&lt;br /&gt;
=== Theme ===&lt;br /&gt;
This class instantiable from QML provides access to the Plasma Theme colors and other facilities such as fonts.&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* String '''themeName''' (read only)&lt;br /&gt;
* QFont '''font''' (read only)&lt;br /&gt;
* bool '''windowTranslucentEnabled''' (read only)&lt;br /&gt;
* Url '''homepage''' (read only)&lt;br /&gt;
* bool '''useGlobalSettings''' (read only)&lt;br /&gt;
* QString '''wallpaperPath''' (read only)&lt;br /&gt;
* color '''textColor''' (read only)&lt;br /&gt;
* color '''highlightColor''' (read only)&lt;br /&gt;
* color '''backgroundColor''' (read only)&lt;br /&gt;
* color '''buttonTextColor''' (read only)&lt;br /&gt;
* color '''buttonBackgroundColor''' (read only)&lt;br /&gt;
* color '''linkColor''' (read only)&lt;br /&gt;
* color visitedLinkColor''' (read only)&lt;br /&gt;
* color '''visitedLinkColor''' (read only)&lt;br /&gt;
* color '''buttonHoverColor''' (read only)&lt;br /&gt;
* color '''buttonFocusColor''' (read only)&lt;br /&gt;
* color '''viewTextColor''' (read only)&lt;br /&gt;
* color '''viewBackgroundColo''' (read only)r&lt;br /&gt;
* color '''viewHoverColor''' (read only)&lt;br /&gt;
* color '''viewFocusColor''' (read only)&lt;br /&gt;
* String '''styleSheet''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== Svg ===&lt;br /&gt;
Declaring a Svg element instantiates a Plasma Svg instance. This class doesn't draw anything, for drawing, SvgItem is used.&lt;br /&gt;
Properties:&lt;br /&gt;
* QSize '''size'''&lt;br /&gt;
* bool '''multipleImages'''&lt;br /&gt;
* String '''imagePath'''&lt;br /&gt;
* bool '''usingRenderingCache'''&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPixmap pixmap(QString elementID)&lt;br /&gt;
* void resize(qreal width, qreal height)&lt;br /&gt;
* void resize(): resets the image to its default dimension&lt;br /&gt;
* QSize elementSize(QString elementId)&lt;br /&gt;
* QRectF elementRect(QString elementId)&lt;br /&gt;
* bool hasElement(QString elementId)&lt;br /&gt;
* bool isValid(): true if valid svg file&lt;br /&gt;
&lt;br /&gt;
=== SvgItem ===&lt;br /&gt;
It's a graphical element that will actually paint a Svg instance.&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''elementId''': what element to render. If null, the whole svg will be rendered&lt;br /&gt;
* Svg '''svg''': instance of the Svg class mentioned above&lt;br /&gt;
* QSizeF '''naturalSize''' (read only): default size of the Svg&lt;br /&gt;
* bool '''smooth''': paint with antialias (default false)&lt;br /&gt;
&lt;br /&gt;
=== FrameSvgItem ===&lt;br /&gt;
It's a graphical elenent that paints a Plasma::FrameSvg, so a ractangular image composed by 9 elements contained in a Svg file, useful for things like buttons and frames.&lt;br /&gt;
&lt;br /&gt;
Flags&lt;br /&gt;
* EnabledBorders: combination of TopBorder | BottomBorder | LeftBorder | RightBorder, NoBorder if no border of the frame is enabled&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''imagePath''': path of the file relative to the Plasma Theme, for instance &amp;quot;widgets/background&amp;quot;&lt;br /&gt;
* String '''prefix''': a FrameSvg can contain multiple frames, for instance a button contains &amp;quot;normal&amp;quot;, &amp;quot;raised&amp;quot; and &amp;quot;pressed&amp;quot;&lt;br /&gt;
* Margins '''margins''' (read only): the margins of the frame, see documentation below&lt;br /&gt;
* EnabledBorders '''enabledBorders''': what borders are enabled&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
== Top Level windows ==&lt;br /&gt;
&lt;br /&gt;
=== Dialog ===&lt;br /&gt;
Dialog instantiates a Plasma::Dialog, it will be a Plasma themed top level window that can contain any QML component.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item mainItem: the Item contained in the Dialog, it can be any QML Item instance&lt;br /&gt;
* bool '''visible''': if the window (not the mainItem) is visible&lt;br /&gt;
* int '''x''': x position of the window in screen coordinates&lt;br /&gt;
* int '''y''': y position of the window in screen coordinates&lt;br /&gt;
* int '''width''' (read only): total width of the dialog, including margins&lt;br /&gt;
* int '''height''' (read only): total height of the dialog, including margins&lt;br /&gt;
* int '''windowFlags''': Qt window flags of the Dialog&lt;br /&gt;
* Margins '''margins''' (read only): margins of the Dialog&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPoint popupPosition(Item item, Qt::Alignment alignment=Qt::AlignLeft): the suggested position for the Dialog if it has to be correctly placed as popup of the QML item passed as parameter.&lt;br /&gt;
* void setAttribute(Qt::WindowAttribute attribute, bool on): set an attribute for the dialog window&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== ToolTip ===&lt;br /&gt;
Declaring a ToolTip instance makes it possible to use Plasma tooltips with any QML item.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item '''target''': the QML item we want to show a tooltip of&lt;br /&gt;
* String '''mainText'''&lt;br /&gt;
* String '''subText'''&lt;br /&gt;
* String '''image''': freedesktop compliant icon name as image of the tooltip&lt;br /&gt;
&lt;br /&gt;
= Plasma QtComponents (4.8) =&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/API</id>
		<title>Development/Tutorials/Plasma/QML/API</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/API"/>
				<updated>2011-07-15T01:44:36Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* DataModel */ I don't know where to put this, so I'm just going to cram it in there. but seeing as it's nowhere else and non-obvious, I'd might as well.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction to the Plasmoid QML Declarative API  =&lt;br /&gt;
&lt;br /&gt;
This document provides an overview/reference of the Declarative QML API for Plasmoids. It isn't a full binding to all of Qt or KDE's libraries, but a focused set of bindings designed to make writing Plasmoids fast and easy, while remaining powerful.&lt;br /&gt;
&lt;br /&gt;
The API in this documentation covers the API of the Plasma specific QML components, so only the Declarative part of the API.&lt;br /&gt;
&lt;br /&gt;
The QML ScriptEngine is bassed upon the Plasma JavaScript engine, making the API of the JavaScript part identical to the one of the JavaScript plasmoids engine.&lt;br /&gt;
To see the api of the global ''Plasmoid'' object, see the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#The_Global_plasmoid_Object JavaScript API] documentation.&lt;br /&gt;
(TODO: the JavaScript api paged should probably be copied and stripped down the imperative bits not present there, it would make harder to update tough)&lt;br /&gt;
&lt;br /&gt;
== What Is a Declarative Plasmoid?  ==&lt;br /&gt;
&lt;br /&gt;
To denote that this Plasmoid is a Declarative widget, ensure that in the metadata.desktop file there is this line: &lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
&lt;br /&gt;
What follows is a description of the Plasma declarative classes instantiable from QML.&lt;br /&gt;
&lt;br /&gt;
= Main QML classes =&lt;br /&gt;
&lt;br /&gt;
== Data engines ==&lt;br /&gt;
While it's possible to fetch data from a Plasma DataEngine in the same way as the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#DataEngine JavaScript API], however it is preferrable to use the following declarative classes:&lt;br /&gt;
&lt;br /&gt;
=== DataSource ===&lt;br /&gt;
DataSource is a receiver for a dataEngine and can be declared inside QML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
 PlasmaCore.DataSource {&lt;br /&gt;
     id: dataSource&lt;br /&gt;
     engine: &amp;quot;time&amp;quot;&lt;br /&gt;
     connectedSources: [&amp;quot;Local&amp;quot;]&lt;br /&gt;
     interval: 500&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* bool '''valid''' (read only): true when the DataSource is successfully connected to a data engine&lt;br /&gt;
* int '''interval''': interval of polling of the dataengine, if 0 (default value) no polling will be executed&lt;br /&gt;
* string '''engine''': the plugin name of the dataengine to load&lt;br /&gt;
* Array(string) '''connectedSources''': all the sources of the dataengine we are connected to (and whose data will appear in the '''data''' property)&lt;br /&gt;
* Array(string) '''sources''' (read only): all the sources available from the dataengine&lt;br /&gt;
* variant map '''data''' (read only): It's the most important property, it's a map of all the data available from the dataengine: its structure will be as follows:&lt;br /&gt;
** each key of the map will be a source name, in '''connectedSources'''&lt;br /&gt;
** each value will be a variant hash, so an hash with strings as keys and any variant as value&lt;br /&gt;
** example: dataSource.data[&amp;quot;Local&amp;quot;][&amp;quot;Time&amp;quot;] indicates the '''Time''' key of the dataengine source called &amp;quot;Local&amp;quot;&lt;br /&gt;
&lt;br /&gt;
It has the following methods:&lt;br /&gt;
* StringList keysForSource(String source): lists all the keys corresponding to a certain source: for instance in the &amp;quot;time&amp;quot; dataengine, for the &amp;quot;Local&amp;quot; source, keys will be:&lt;br /&gt;
** &amp;quot;Timezone Continent&amp;quot;&lt;br /&gt;
** &amp;quot;Offset&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone&amp;quot;&lt;br /&gt;
** &amp;quot;Time&amp;quot;&lt;br /&gt;
** &amp;quot;Date&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone City&amp;quot;&lt;br /&gt;
* Service serviceForSource(String source): returns a Plasma service that corresponds a given source: see the section about services for how to use it.&lt;br /&gt;
* void connectSource(String source): adds to '''connectedSources''' the new source&lt;br /&gt;
* void disconnectSource(String source): removes that source from '''connectedSources'''&lt;br /&gt;
&lt;br /&gt;
=== Service ===&lt;br /&gt;
Due to their imperative nature, Plasma Services are not instantiated as QML classes, but rather created out of a '''DataSource''' with the method '''serviceForSource''' and used in the JavaScript portions of the QML files.&lt;br /&gt;
This following example is a simplified version from the Now Playing QML widget in the kdeexamples git repository: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var service = dataSource.serviceForSource(activeSource)&lt;br /&gt;
  var operation = service.operationDescription(&amp;quot;seek&amp;quot;)&lt;br /&gt;
  operation.seconds = 10&lt;br /&gt;
&lt;br /&gt;
  var job = service.startOperationCall(operation)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Here dataSource is the id of a DataSource object, and activeSource is a source contained in one of its '''connectedSources'''.&lt;br /&gt;
The service provides an operation called &amp;quot;seek&amp;quot;, with a parameter called &amp;quot;seconds&amp;quot;, that can be written on it as a property of a JavaScript object.&lt;br /&gt;
&lt;br /&gt;
=== ServiceJob ===&lt;br /&gt;
If is necessary to monitor the result of a Service operation, it's possible to connect to the '''finished''' signal provided by the job return paramenter of the '''startOperationCall''' service method.&lt;br /&gt;
The '''finished''' signal has the same job as parameter, from which is possible to check the variant '''result''' property, to check the result.&lt;br /&gt;
&lt;br /&gt;
=== DataModel ===&lt;br /&gt;
Some data engines return as their data something that can be interpreted as a list of items, rather than simple key/value pairs.&lt;br /&gt;
QML provides some item views such as '''ListView''', '''GridView''' and '''Repeater'''.&lt;br /&gt;
The '''DataModel''' QML object can provide, based on a DataSource a model suitable for those QML item views.&lt;br /&gt;
&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* DataSource '''dataSource''': the id of an existing (and connected) DataSource&lt;br /&gt;
* String '''sourceFilter''': it's a regular expression. If the DataSource is connected to more than one source, only inserts data from sources matching this filter expression in the model. To, for example, have a source watch all sources beginning with say &amp;quot;name:&amp;quot;, the required regexp would be sourceFilter: &amp;quot;name:.*&amp;quot;&lt;br /&gt;
* String '''keyRoleFilter''': it's a regular expression. Only data with keys that match this filter expression will be inserted in the model&lt;br /&gt;
* int '''count''' (read only): how many items are in the model&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 ListView {&lt;br /&gt;
   model: PlasmaCore.DataModel {&lt;br /&gt;
        dataSource: microblogSource&lt;br /&gt;
        keyRoleFilter: &amp;quot;[\\d]*&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    delegate: Text {&lt;br /&gt;
        text: title&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the example, ''microblogSource'' is the id of a DataSource, and inserts in the model only entries that have a number as the key name (matched with [\\d]*, in this case tweets ids)&lt;br /&gt;
&lt;br /&gt;
Each item in the model will have the form of a variant hash: all the keys of the hash will be registered as model role names, in the example, &amp;quot;title&amp;quot; is a role of the model containing a string (also reachable with model[&amp;quot;title&amp;quot;]).&lt;br /&gt;
&lt;br /&gt;
A special reserved role will always be present: '''&amp;quot;DataEngineSource&amp;quot;''': it will contain the name of the data engine source that gave origin to this item. Therefore, if you want merely the string of the current source that the model is at...do model[&amp;quot;DataEngineSource&amp;quot;].&lt;br /&gt;
&lt;br /&gt;
Note that view.currentItem holds the item currently selected. However, due to (http://bugreports.qt.nokia.com/browse/QTBUG-16347) this does not work in PathView. A workaround is to use, for example...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
 onCurrentIndexChanged: sometextedit.text = model.get(currentIndex).myproperty&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SortFilterModel ===&lt;br /&gt;
SortFilterModel is a proxy model for easy sorting and/or filtering of the items in a DataModel (or any other QAbstractItemModel subclass that has been registered in QML with setContextProperty from a C++ application)&lt;br /&gt;
Properties:&lt;br /&gt;
* model '''sourceModel'''&lt;br /&gt;
* String '''filterRegExp'''&lt;br /&gt;
* String '''filterRole'''&lt;br /&gt;
* String '''sortRole'''&lt;br /&gt;
* Qt::SortOrder '''sortOrder'''&lt;br /&gt;
* int '''count''' (read only)&lt;br /&gt;
&lt;br /&gt;
== Plasma Themes ==&lt;br /&gt;
&lt;br /&gt;
=== Theme ===&lt;br /&gt;
This class instantiable from QML provides access to the Plasma Theme colors and other facilities such as fonts.&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* String '''themeName''' (read only)&lt;br /&gt;
* QFont '''font''' (read only)&lt;br /&gt;
* bool '''windowTranslucentEnabled''' (read only)&lt;br /&gt;
* Url '''homepage''' (read only)&lt;br /&gt;
* bool '''useGlobalSettings''' (read only)&lt;br /&gt;
* QString '''wallpaperPath''' (read only)&lt;br /&gt;
* color '''textColor''' (read only)&lt;br /&gt;
* color '''highlightColor''' (read only)&lt;br /&gt;
* color '''backgroundColor''' (read only)&lt;br /&gt;
* color '''buttonTextColor''' (read only)&lt;br /&gt;
* color '''buttonBackgroundColor''' (read only)&lt;br /&gt;
* color '''linkColor''' (read only)&lt;br /&gt;
* color visitedLinkColor''' (read only)&lt;br /&gt;
* color '''visitedLinkColor''' (read only)&lt;br /&gt;
* color '''buttonHoverColor''' (read only)&lt;br /&gt;
* color '''buttonFocusColor''' (read only)&lt;br /&gt;
* color '''viewTextColor''' (read only)&lt;br /&gt;
* color '''viewBackgroundColo''' (read only)r&lt;br /&gt;
* color '''viewHoverColor''' (read only)&lt;br /&gt;
* color '''viewFocusColor''' (read only)&lt;br /&gt;
* String '''styleSheet''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== Svg ===&lt;br /&gt;
Declaring a Svg element instantiates a Plasma Svg instance. This class doesn't draw anything, for drawing, SvgItem is used.&lt;br /&gt;
Properties:&lt;br /&gt;
* QSize '''size'''&lt;br /&gt;
* bool '''multipleImages'''&lt;br /&gt;
* String '''imagePath'''&lt;br /&gt;
* bool '''usingRenderingCache'''&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPixmap pixmap(QString elementID)&lt;br /&gt;
* void resize(qreal width, qreal height)&lt;br /&gt;
* void resize(): resets the image to its default dimension&lt;br /&gt;
* QSize elementSize(QString elementId)&lt;br /&gt;
* QRectF elementRect(QString elementId)&lt;br /&gt;
* bool hasElement(QString elementId)&lt;br /&gt;
* bool isValid(): true if valid svg file&lt;br /&gt;
&lt;br /&gt;
=== SvgItem ===&lt;br /&gt;
It's a graphical element that will actually paint a Svg instance.&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''elementId''': what element to render. If null, the whole svg will be rendered&lt;br /&gt;
* Svg '''svg''': instance of the Svg class mentioned above&lt;br /&gt;
* QSizeF '''naturalSize''' (read only): default size of the Svg&lt;br /&gt;
* bool '''smooth''': paint with antialias (default false)&lt;br /&gt;
&lt;br /&gt;
=== FrameSvgItem ===&lt;br /&gt;
It's a graphical elenent that paints a Plasma::FrameSvg, so a ractangular image composed by 9 elements contained in a Svg file, useful for things like buttons and frames.&lt;br /&gt;
&lt;br /&gt;
Flags&lt;br /&gt;
* EnabledBorders: combination of TopBorder | BottomBorder | LeftBorder | RightBorder, NoBorder if no border of the frame is enabled&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''imagePath''': path of the file relative to the Plasma Theme, for instance &amp;quot;widgets/background&amp;quot;&lt;br /&gt;
* String '''prefix''': a FrameSvg can contain multiple frames, for instance a button contains &amp;quot;normal&amp;quot;, &amp;quot;raised&amp;quot; and &amp;quot;pressed&amp;quot;&lt;br /&gt;
* Margins '''margins''' (read only): the margins of the frame, see documentation below&lt;br /&gt;
* EnabledBorders '''enabledBorders''': what borders are enabled&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
== Top Level windows ==&lt;br /&gt;
&lt;br /&gt;
=== Dialog ===&lt;br /&gt;
Dialog instantiates a Plasma::Dialog, it will be a Plasma themed top level window that can contain any QML component.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item mainItem: the Item contained in the Dialog, it can be any QML Item instance&lt;br /&gt;
* bool '''visible''': if the window (not the mainItem) is visible&lt;br /&gt;
* int '''x''': x position of the window in screen coordinates&lt;br /&gt;
* int '''y''': y position of the window in screen coordinates&lt;br /&gt;
* int '''width''' (read only): total width of the dialog, including margins&lt;br /&gt;
* int '''height''' (read only): total height of the dialog, including margins&lt;br /&gt;
* int '''windowFlags''': Qt window flags of the Dialog&lt;br /&gt;
* Margins '''margins''' (read only): margins of the Dialog&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPoint popupPosition(Item item, Qt::Alignment alignment=Qt::AlignLeft): the suggested position for the Dialog if it has to be correctly placed as popup of the QML item passed as parameter.&lt;br /&gt;
* void setAttribute(Qt::WindowAttribute attribute, bool on): set an attribute for the dialog window&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== ToolTip ===&lt;br /&gt;
Declaring a ToolTip instance makes it possible to use Plasma tooltips with any QML item.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item '''target''': the QML item we want to show a tooltip of&lt;br /&gt;
* String '''mainText'''&lt;br /&gt;
* String '''subText'''&lt;br /&gt;
* String '''image''': freedesktop compliant icon name as image of the tooltip&lt;br /&gt;
&lt;br /&gt;
= Plasma QtComponents (4.8) =&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/API</id>
		<title>Development/Tutorials/Plasma/QML/API</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/API"/>
				<updated>2011-07-14T17:29:00Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* DataModel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction to the Plasmoid QML Declarative API  =&lt;br /&gt;
&lt;br /&gt;
This document provides an overview/reference of the Declarative QML API for Plasmoids. It isn't a full binding to all of Qt or KDE's libraries, but a focused set of bindings designed to make writing Plasmoids fast and easy, while remaining powerful.&lt;br /&gt;
&lt;br /&gt;
The API in this documentation covers the API of the Plasma specific QML components, so only the Declarative part of the API.&lt;br /&gt;
&lt;br /&gt;
The QML ScriptEngine is bassed upon the Plasma JavaScript engine, making the API of the JavaScript part identical to the one of the JavaScript plasmoids engine.&lt;br /&gt;
To see the api of the global ''Plasmoid'' object, see the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#The_Global_plasmoid_Object JavaScript API] documentation.&lt;br /&gt;
(TODO: the JavaScript api paged should probably be copied and stripped down the imperative bits not present there, it would make harder to update tough)&lt;br /&gt;
&lt;br /&gt;
== What Is a Declarative Plasmoid?  ==&lt;br /&gt;
&lt;br /&gt;
To denote that this Plasmoid is a Declarative widget, ensure that in the metadata.desktop file there is this line: &lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
&lt;br /&gt;
What follows is a description of the Plasma declarative classes instantiable from QML.&lt;br /&gt;
&lt;br /&gt;
= Main QML classes =&lt;br /&gt;
&lt;br /&gt;
== Data engines ==&lt;br /&gt;
While it's possible to fetch data from a Plasma DataEngine in the same way as the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#DataEngine JavaScript API], however it is preferrable to use the following declarative classes:&lt;br /&gt;
&lt;br /&gt;
=== DataSource ===&lt;br /&gt;
DataSource is a receiver for a dataEngine and can be declared inside QML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
 PlasmaCore.DataSource {&lt;br /&gt;
     id: dataSource&lt;br /&gt;
     engine: &amp;quot;time&amp;quot;&lt;br /&gt;
     connectedSources: [&amp;quot;Local&amp;quot;]&lt;br /&gt;
     interval: 500&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* bool '''valid''' (read only): true when the DataSource is successfully connected to a data engine&lt;br /&gt;
* int '''interval''': interval of polling of the dataengine, if 0 (default value) no polling will be executed&lt;br /&gt;
* string '''engine''': the plugin name of the dataengine to load&lt;br /&gt;
* Array(string) '''connectedSources''': all the sources of the dataengine we are connected to (and whose data will appear in the '''data''' property)&lt;br /&gt;
* Array(string) '''sources''' (read only): all the sources available from the dataengine&lt;br /&gt;
* variant map '''data''' (read only): It's the most important property, it's a map of all the data available from the dataengine: its structure will be as follows:&lt;br /&gt;
** each key of the map will be a source name, in '''connectedSources'''&lt;br /&gt;
** each value will be a variant hash, so an hash with strings as keys and any variant as value&lt;br /&gt;
** example: dataSource.data[&amp;quot;Local&amp;quot;][&amp;quot;Time&amp;quot;] indicates the '''Time''' key of the dataengine source called &amp;quot;Local&amp;quot;&lt;br /&gt;
&lt;br /&gt;
It has the following methods:&lt;br /&gt;
* StringList keysForSource(String source): lists all the keys corresponding to a certain source: for instance in the &amp;quot;time&amp;quot; dataengine, for the &amp;quot;Local&amp;quot; source, keys will be:&lt;br /&gt;
** &amp;quot;Timezone Continent&amp;quot;&lt;br /&gt;
** &amp;quot;Offset&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone&amp;quot;&lt;br /&gt;
** &amp;quot;Time&amp;quot;&lt;br /&gt;
** &amp;quot;Date&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone City&amp;quot;&lt;br /&gt;
* Service serviceForSource(String source): returns a Plasma service that corresponds a given source: see the section about services for how to use it.&lt;br /&gt;
* void connectSource(String source): adds to '''connectedSources''' the new source&lt;br /&gt;
* void disconnectSource(String source): removes that source from '''connectedSources'''&lt;br /&gt;
&lt;br /&gt;
=== Service ===&lt;br /&gt;
Due to their imperative nature, Plasma Services are not instantiated as QML classes, but rather created out of a '''DataSource''' with the method '''serviceForSource''' and used in the JavaScript portions of the QML files.&lt;br /&gt;
This following example is a simplified version from the Now Playing QML widget in the kdeexamples git repository: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var service = dataSource.serviceForSource(activeSource)&lt;br /&gt;
  var operation = service.operationDescription(&amp;quot;seek&amp;quot;)&lt;br /&gt;
  operation.seconds = 10&lt;br /&gt;
&lt;br /&gt;
  var job = service.startOperationCall(operation)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Here dataSource is the id of a DataSource object, and activeSource is a source contained in one of its '''connectedSources'''.&lt;br /&gt;
The service provides an operation called &amp;quot;seek&amp;quot;, with a parameter called &amp;quot;seconds&amp;quot;, that can be written on it as a property of a JavaScript object.&lt;br /&gt;
&lt;br /&gt;
=== ServiceJob ===&lt;br /&gt;
If is necessary to monitor the result of a Service operation, it's possible to connect to the '''finished''' signal provided by the job return paramenter of the '''startOperationCall''' service method.&lt;br /&gt;
The '''finished''' signal has the same job as parameter, from which is possible to check the variant '''result''' property, to check the result.&lt;br /&gt;
&lt;br /&gt;
=== DataModel ===&lt;br /&gt;
Some data engines return as their data something that can be interpreted as a list of items, rather than simple key/value pairs.&lt;br /&gt;
QML provides some item views such as '''ListView''', '''GridView''' and '''Repeater'''.&lt;br /&gt;
The '''DataModel''' QML object can provide, based on a DataSource a model suitable for those QML item views.&lt;br /&gt;
&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* DataSource '''dataSource''': the id of an existing (and connected) DataSource&lt;br /&gt;
* String '''sourceFilter''': it's a regular expression. If the DataSource is connected to more than one source, only inserts data from sources matching this filter expression in the model. To, for example, have a source watch all sources beginning with say &amp;quot;name:&amp;quot;, the required regexp would be sourceFilter: &amp;quot;name:.*&amp;quot;&lt;br /&gt;
* String '''keyRoleFilter''': it's a regular expression. Only data with keys that match this filter expression will be inserted in the model&lt;br /&gt;
* int '''count''' (read only): how many items are in the model&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 ListView {&lt;br /&gt;
   model: PlasmaCore.DataModel {&lt;br /&gt;
        dataSource: microblogSource&lt;br /&gt;
        keyRoleFilter: &amp;quot;[\\d]*&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    delegate: Text {&lt;br /&gt;
        text: title&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the example, ''microblogSource'' is the id of a DataSource, and inserts in the model only entries that have a number as the key name (matched with [\\d]*, in this case tweets ids)&lt;br /&gt;
&lt;br /&gt;
Each item in the model will have the form of a variant hash: all the keys of the hash will be registered as model role names, in the example, &amp;quot;title&amp;quot; is a role of the model containing a string (also reachable with model[&amp;quot;title&amp;quot;]).&lt;br /&gt;
&lt;br /&gt;
A special reserved role will always be present: '''&amp;quot;DataEngineSource&amp;quot;''': it will contain the name of the data engine source that gave origin to this item. Therefore, if you want merely the string of the current source that the model is at...do model[&amp;quot;DataEngineSource&amp;quot;].&lt;br /&gt;
&lt;br /&gt;
=== SortFilterModel ===&lt;br /&gt;
SortFilterModel is a proxy model for easy sorting and/or filtering of the items in a DataModel (or any other QAbstractItemModel subclass that has been registered in QML with setContextProperty from a C++ application)&lt;br /&gt;
Properties:&lt;br /&gt;
* model '''sourceModel'''&lt;br /&gt;
* String '''filterRegExp'''&lt;br /&gt;
* String '''filterRole'''&lt;br /&gt;
* String '''sortRole'''&lt;br /&gt;
* Qt::SortOrder '''sortOrder'''&lt;br /&gt;
* int '''count''' (read only)&lt;br /&gt;
&lt;br /&gt;
== Plasma Themes ==&lt;br /&gt;
&lt;br /&gt;
=== Theme ===&lt;br /&gt;
This class instantiable from QML provides access to the Plasma Theme colors and other facilities such as fonts.&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* String '''themeName''' (read only)&lt;br /&gt;
* QFont '''font''' (read only)&lt;br /&gt;
* bool '''windowTranslucentEnabled''' (read only)&lt;br /&gt;
* Url '''homepage''' (read only)&lt;br /&gt;
* bool '''useGlobalSettings''' (read only)&lt;br /&gt;
* QString '''wallpaperPath''' (read only)&lt;br /&gt;
* color '''textColor''' (read only)&lt;br /&gt;
* color '''highlightColor''' (read only)&lt;br /&gt;
* color '''backgroundColor''' (read only)&lt;br /&gt;
* color '''buttonTextColor''' (read only)&lt;br /&gt;
* color '''buttonBackgroundColor''' (read only)&lt;br /&gt;
* color '''linkColor''' (read only)&lt;br /&gt;
* color visitedLinkColor''' (read only)&lt;br /&gt;
* color '''visitedLinkColor''' (read only)&lt;br /&gt;
* color '''buttonHoverColor''' (read only)&lt;br /&gt;
* color '''buttonFocusColor''' (read only)&lt;br /&gt;
* color '''viewTextColor''' (read only)&lt;br /&gt;
* color '''viewBackgroundColo''' (read only)r&lt;br /&gt;
* color '''viewHoverColor''' (read only)&lt;br /&gt;
* color '''viewFocusColor''' (read only)&lt;br /&gt;
* String '''styleSheet''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== Svg ===&lt;br /&gt;
Declaring a Svg element instantiates a Plasma Svg instance. This class doesn't draw anything, for drawing, SvgItem is used.&lt;br /&gt;
Properties:&lt;br /&gt;
* QSize '''size'''&lt;br /&gt;
* bool '''multipleImages'''&lt;br /&gt;
* String '''imagePath'''&lt;br /&gt;
* bool '''usingRenderingCache'''&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPixmap pixmap(QString elementID)&lt;br /&gt;
* void resize(qreal width, qreal height)&lt;br /&gt;
* void resize(): resets the image to its default dimension&lt;br /&gt;
* QSize elementSize(QString elementId)&lt;br /&gt;
* QRectF elementRect(QString elementId)&lt;br /&gt;
* bool hasElement(QString elementId)&lt;br /&gt;
* bool isValid(): true if valid svg file&lt;br /&gt;
&lt;br /&gt;
=== SvgItem ===&lt;br /&gt;
It's a graphical element that will actually paint a Svg instance.&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''elementId''': what element to render. If null, the whole svg will be rendered&lt;br /&gt;
* Svg '''svg''': instance of the Svg class mentioned above&lt;br /&gt;
* QSizeF '''naturalSize''' (read only): default size of the Svg&lt;br /&gt;
* bool '''smooth''': paint with antialias (default false)&lt;br /&gt;
&lt;br /&gt;
=== FrameSvgItem ===&lt;br /&gt;
It's a graphical elenent that paints a Plasma::FrameSvg, so a ractangular image composed by 9 elements contained in a Svg file, useful for things like buttons and frames.&lt;br /&gt;
&lt;br /&gt;
Flags&lt;br /&gt;
* EnabledBorders: combination of TopBorder | BottomBorder | LeftBorder | RightBorder, NoBorder if no border of the frame is enabled&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''imagePath''': path of the file relative to the Plasma Theme, for instance &amp;quot;widgets/background&amp;quot;&lt;br /&gt;
* String '''prefix''': a FrameSvg can contain multiple frames, for instance a button contains &amp;quot;normal&amp;quot;, &amp;quot;raised&amp;quot; and &amp;quot;pressed&amp;quot;&lt;br /&gt;
* Margins '''margins''' (read only): the margins of the frame, see documentation below&lt;br /&gt;
* EnabledBorders '''enabledBorders''': what borders are enabled&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
== Top Level windows ==&lt;br /&gt;
&lt;br /&gt;
=== Dialog ===&lt;br /&gt;
Dialog instantiates a Plasma::Dialog, it will be a Plasma themed top level window that can contain any QML component.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item mainItem: the Item contained in the Dialog, it can be any QML Item instance&lt;br /&gt;
* bool '''visible''': if the window (not the mainItem) is visible&lt;br /&gt;
* int '''x''': x position of the window in screen coordinates&lt;br /&gt;
* int '''y''': y position of the window in screen coordinates&lt;br /&gt;
* int '''width''' (read only): total width of the dialog, including margins&lt;br /&gt;
* int '''height''' (read only): total height of the dialog, including margins&lt;br /&gt;
* int '''windowFlags''': Qt window flags of the Dialog&lt;br /&gt;
* Margins '''margins''' (read only): margins of the Dialog&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPoint popupPosition(Item item, Qt::Alignment alignment=Qt::AlignLeft): the suggested position for the Dialog if it has to be correctly placed as popup of the QML item passed as parameter.&lt;br /&gt;
* void setAttribute(Qt::WindowAttribute attribute, bool on): set an attribute for the dialog window&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== ToolTip ===&lt;br /&gt;
Declaring a ToolTip instance makes it possible to use Plasma tooltips with any QML item.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item '''target''': the QML item we want to show a tooltip of&lt;br /&gt;
* String '''mainText'''&lt;br /&gt;
* String '''subText'''&lt;br /&gt;
* String '''image''': freedesktop compliant icon name as image of the tooltip&lt;br /&gt;
&lt;br /&gt;
= Plasma QtComponents (4.8) =&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/API</id>
		<title>Development/Tutorials/Plasma/QML/API</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/API"/>
				<updated>2011-07-14T17:27:02Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: /* DataModel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction to the Plasmoid QML Declarative API  =&lt;br /&gt;
&lt;br /&gt;
This document provides an overview/reference of the Declarative QML API for Plasmoids. It isn't a full binding to all of Qt or KDE's libraries, but a focused set of bindings designed to make writing Plasmoids fast and easy, while remaining powerful.&lt;br /&gt;
&lt;br /&gt;
The API in this documentation covers the API of the Plasma specific QML components, so only the Declarative part of the API.&lt;br /&gt;
&lt;br /&gt;
The QML ScriptEngine is bassed upon the Plasma JavaScript engine, making the API of the JavaScript part identical to the one of the JavaScript plasmoids engine.&lt;br /&gt;
To see the api of the global ''Plasmoid'' object, see the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#The_Global_plasmoid_Object JavaScript API] documentation.&lt;br /&gt;
(TODO: the JavaScript api paged should probably be copied and stripped down the imperative bits not present there, it would make harder to update tough)&lt;br /&gt;
&lt;br /&gt;
== What Is a Declarative Plasmoid?  ==&lt;br /&gt;
&lt;br /&gt;
To denote that this Plasmoid is a Declarative widget, ensure that in the metadata.desktop file there is this line: &lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
&lt;br /&gt;
What follows is a description of the Plasma declarative classes instantiable from QML.&lt;br /&gt;
&lt;br /&gt;
= Main QML classes =&lt;br /&gt;
&lt;br /&gt;
== Data engines ==&lt;br /&gt;
While it's possible to fetch data from a Plasma DataEngine in the same way as the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#DataEngine JavaScript API], however it is preferrable to use the following declarative classes:&lt;br /&gt;
&lt;br /&gt;
=== DataSource ===&lt;br /&gt;
DataSource is a receiver for a dataEngine and can be declared inside QML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
 PlasmaCore.DataSource {&lt;br /&gt;
     id: dataSource&lt;br /&gt;
     engine: &amp;quot;time&amp;quot;&lt;br /&gt;
     connectedSources: [&amp;quot;Local&amp;quot;]&lt;br /&gt;
     interval: 500&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* bool '''valid''' (read only): true when the DataSource is successfully connected to a data engine&lt;br /&gt;
* int '''interval''': interval of polling of the dataengine, if 0 (default value) no polling will be executed&lt;br /&gt;
* string '''engine''': the plugin name of the dataengine to load&lt;br /&gt;
* Array(string) '''connectedSources''': all the sources of the dataengine we are connected to (and whose data will appear in the '''data''' property)&lt;br /&gt;
* Array(string) '''sources''' (read only): all the sources available from the dataengine&lt;br /&gt;
* variant map '''data''' (read only): It's the most important property, it's a map of all the data available from the dataengine: its structure will be as follows:&lt;br /&gt;
** each key of the map will be a source name, in '''connectedSources'''&lt;br /&gt;
** each value will be a variant hash, so an hash with strings as keys and any variant as value&lt;br /&gt;
** example: dataSource.data[&amp;quot;Local&amp;quot;][&amp;quot;Time&amp;quot;] indicates the '''Time''' key of the dataengine source called &amp;quot;Local&amp;quot;&lt;br /&gt;
&lt;br /&gt;
It has the following methods:&lt;br /&gt;
* StringList keysForSource(String source): lists all the keys corresponding to a certain source: for instance in the &amp;quot;time&amp;quot; dataengine, for the &amp;quot;Local&amp;quot; source, keys will be:&lt;br /&gt;
** &amp;quot;Timezone Continent&amp;quot;&lt;br /&gt;
** &amp;quot;Offset&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone&amp;quot;&lt;br /&gt;
** &amp;quot;Time&amp;quot;&lt;br /&gt;
** &amp;quot;Date&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone City&amp;quot;&lt;br /&gt;
* Service serviceForSource(String source): returns a Plasma service that corresponds a given source: see the section about services for how to use it.&lt;br /&gt;
* void connectSource(String source): adds to '''connectedSources''' the new source&lt;br /&gt;
* void disconnectSource(String source): removes that source from '''connectedSources'''&lt;br /&gt;
&lt;br /&gt;
=== Service ===&lt;br /&gt;
Due to their imperative nature, Plasma Services are not instantiated as QML classes, but rather created out of a '''DataSource''' with the method '''serviceForSource''' and used in the JavaScript portions of the QML files.&lt;br /&gt;
This following example is a simplified version from the Now Playing QML widget in the kdeexamples git repository: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var service = dataSource.serviceForSource(activeSource)&lt;br /&gt;
  var operation = service.operationDescription(&amp;quot;seek&amp;quot;)&lt;br /&gt;
  operation.seconds = 10&lt;br /&gt;
&lt;br /&gt;
  var job = service.startOperationCall(operation)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Here dataSource is the id of a DataSource object, and activeSource is a source contained in one of its '''connectedSources'''.&lt;br /&gt;
The service provides an operation called &amp;quot;seek&amp;quot;, with a parameter called &amp;quot;seconds&amp;quot;, that can be written on it as a property of a JavaScript object.&lt;br /&gt;
&lt;br /&gt;
=== ServiceJob ===&lt;br /&gt;
If is necessary to monitor the result of a Service operation, it's possible to connect to the '''finished''' signal provided by the job return paramenter of the '''startOperationCall''' service method.&lt;br /&gt;
The '''finished''' signal has the same job as parameter, from which is possible to check the variant '''result''' property, to check the result.&lt;br /&gt;
&lt;br /&gt;
=== DataModel ===&lt;br /&gt;
Some data engines return as their data something that can be interpreted as a list of items, rather than simple key/value pairs.&lt;br /&gt;
QML provides some item views such as '''ListView''', '''GridView''' and '''Repeater'''.&lt;br /&gt;
The '''DataModel''' QML object can provide, based on a DataSource a model suitable for those QML item views.&lt;br /&gt;
&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* DataSource '''dataSource''': the id of an existing (and connected) DataSource&lt;br /&gt;
* String '''sourceFilter''': it's a regular expression. If the DataSource is connected to more than one source, only inserts data from sources matching this filter expression in the model&lt;br /&gt;
* String '''keyRoleFilter''': it's a regular expression. Only data with keys that match this filter expression will be inserted in the model&lt;br /&gt;
* int '''count''' (read only): how many items are in the model&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 ListView {&lt;br /&gt;
   model: PlasmaCore.DataModel {&lt;br /&gt;
        dataSource: microblogSource&lt;br /&gt;
        keyRoleFilter: &amp;quot;[\\d]*&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    delegate: Text {&lt;br /&gt;
        text: title&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the example, ''microblogSource'' is the id of a DataSource, and inserts in the model only entries that have a number as the key name (matched with [\\d]*, in this case tweets ids)&lt;br /&gt;
&lt;br /&gt;
Each item in the model will have the form of a variant hash: all the keys of the hash will be registered as model role names, in the example, &amp;quot;title&amp;quot; is a role of the model containing a string (also reachable with model[&amp;quot;title&amp;quot;]).&lt;br /&gt;
&lt;br /&gt;
A special reserved role will always be present: '''&amp;quot;DataEngineSource&amp;quot;''': it will contain the name of the data engine source that gave origin to this item. Therefore, if you want merely the string of the current source that the model is at...do model[&amp;quot;DataEngineSource&amp;quot;].&lt;br /&gt;
&lt;br /&gt;
=== SortFilterModel ===&lt;br /&gt;
SortFilterModel is a proxy model for easy sorting and/or filtering of the items in a DataModel (or any other QAbstractItemModel subclass that has been registered in QML with setContextProperty from a C++ application)&lt;br /&gt;
Properties:&lt;br /&gt;
* model '''sourceModel'''&lt;br /&gt;
* String '''filterRegExp'''&lt;br /&gt;
* String '''filterRole'''&lt;br /&gt;
* String '''sortRole'''&lt;br /&gt;
* Qt::SortOrder '''sortOrder'''&lt;br /&gt;
* int '''count''' (read only)&lt;br /&gt;
&lt;br /&gt;
== Plasma Themes ==&lt;br /&gt;
&lt;br /&gt;
=== Theme ===&lt;br /&gt;
This class instantiable from QML provides access to the Plasma Theme colors and other facilities such as fonts.&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* String '''themeName''' (read only)&lt;br /&gt;
* QFont '''font''' (read only)&lt;br /&gt;
* bool '''windowTranslucentEnabled''' (read only)&lt;br /&gt;
* Url '''homepage''' (read only)&lt;br /&gt;
* bool '''useGlobalSettings''' (read only)&lt;br /&gt;
* QString '''wallpaperPath''' (read only)&lt;br /&gt;
* color '''textColor''' (read only)&lt;br /&gt;
* color '''highlightColor''' (read only)&lt;br /&gt;
* color '''backgroundColor''' (read only)&lt;br /&gt;
* color '''buttonTextColor''' (read only)&lt;br /&gt;
* color '''buttonBackgroundColor''' (read only)&lt;br /&gt;
* color '''linkColor''' (read only)&lt;br /&gt;
* color visitedLinkColor''' (read only)&lt;br /&gt;
* color '''visitedLinkColor''' (read only)&lt;br /&gt;
* color '''buttonHoverColor''' (read only)&lt;br /&gt;
* color '''buttonFocusColor''' (read only)&lt;br /&gt;
* color '''viewTextColor''' (read only)&lt;br /&gt;
* color '''viewBackgroundColo''' (read only)r&lt;br /&gt;
* color '''viewHoverColor''' (read only)&lt;br /&gt;
* color '''viewFocusColor''' (read only)&lt;br /&gt;
* String '''styleSheet''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== Svg ===&lt;br /&gt;
Declaring a Svg element instantiates a Plasma Svg instance. This class doesn't draw anything, for drawing, SvgItem is used.&lt;br /&gt;
Properties:&lt;br /&gt;
* QSize '''size'''&lt;br /&gt;
* bool '''multipleImages'''&lt;br /&gt;
* String '''imagePath'''&lt;br /&gt;
* bool '''usingRenderingCache'''&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPixmap pixmap(QString elementID)&lt;br /&gt;
* void resize(qreal width, qreal height)&lt;br /&gt;
* void resize(): resets the image to its default dimension&lt;br /&gt;
* QSize elementSize(QString elementId)&lt;br /&gt;
* QRectF elementRect(QString elementId)&lt;br /&gt;
* bool hasElement(QString elementId)&lt;br /&gt;
* bool isValid(): true if valid svg file&lt;br /&gt;
&lt;br /&gt;
=== SvgItem ===&lt;br /&gt;
It's a graphical element that will actually paint a Svg instance.&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''elementId''': what element to render. If null, the whole svg will be rendered&lt;br /&gt;
* Svg '''svg''': instance of the Svg class mentioned above&lt;br /&gt;
* QSizeF '''naturalSize''' (read only): default size of the Svg&lt;br /&gt;
* bool '''smooth''': paint with antialias (default false)&lt;br /&gt;
&lt;br /&gt;
=== FrameSvgItem ===&lt;br /&gt;
It's a graphical elenent that paints a Plasma::FrameSvg, so a ractangular image composed by 9 elements contained in a Svg file, useful for things like buttons and frames.&lt;br /&gt;
&lt;br /&gt;
Flags&lt;br /&gt;
* EnabledBorders: combination of TopBorder | BottomBorder | LeftBorder | RightBorder, NoBorder if no border of the frame is enabled&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''imagePath''': path of the file relative to the Plasma Theme, for instance &amp;quot;widgets/background&amp;quot;&lt;br /&gt;
* String '''prefix''': a FrameSvg can contain multiple frames, for instance a button contains &amp;quot;normal&amp;quot;, &amp;quot;raised&amp;quot; and &amp;quot;pressed&amp;quot;&lt;br /&gt;
* Margins '''margins''' (read only): the margins of the frame, see documentation below&lt;br /&gt;
* EnabledBorders '''enabledBorders''': what borders are enabled&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
== Top Level windows ==&lt;br /&gt;
&lt;br /&gt;
=== Dialog ===&lt;br /&gt;
Dialog instantiates a Plasma::Dialog, it will be a Plasma themed top level window that can contain any QML component.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item mainItem: the Item contained in the Dialog, it can be any QML Item instance&lt;br /&gt;
* bool '''visible''': if the window (not the mainItem) is visible&lt;br /&gt;
* int '''x''': x position of the window in screen coordinates&lt;br /&gt;
* int '''y''': y position of the window in screen coordinates&lt;br /&gt;
* int '''width''' (read only): total width of the dialog, including margins&lt;br /&gt;
* int '''height''' (read only): total height of the dialog, including margins&lt;br /&gt;
* int '''windowFlags''': Qt window flags of the Dialog&lt;br /&gt;
* Margins '''margins''' (read only): margins of the Dialog&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPoint popupPosition(Item item, Qt::Alignment alignment=Qt::AlignLeft): the suggested position for the Dialog if it has to be correctly placed as popup of the QML item passed as parameter.&lt;br /&gt;
* void setAttribute(Qt::WindowAttribute attribute, bool on): set an attribute for the dialog window&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== ToolTip ===&lt;br /&gt;
Declaring a ToolTip instance makes it possible to use Plasma tooltips with any QML item.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item '''target''': the QML item we want to show a tooltip of&lt;br /&gt;
* String '''mainText'''&lt;br /&gt;
* String '''subText'''&lt;br /&gt;
* String '''image''': freedesktop compliant icon name as image of the tooltip&lt;br /&gt;
&lt;br /&gt;
= Plasma QtComponents (4.8) =&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/API</id>
		<title>Development/Tutorials/Plasma/QML/API</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/API"/>
				<updated>2011-06-29T17:34:37Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction to the Plasmoid QML Declarative API  =&lt;br /&gt;
&lt;br /&gt;
This document provides an overview/reference of the Declarative QML API for Plasmoids. It isn't a full binding to all of Qt or KDE's libraries, but a focused set of bindings designed to make writing Plasmoids fast and easy, while remaining powerful.&lt;br /&gt;
&lt;br /&gt;
The API in this documentation covers the API of the Plasma specific QML components, so only the Declarative part of the API.&lt;br /&gt;
&lt;br /&gt;
The QML ScriptEngine is bassed upon the Plasma JavaScript engine, making the API of the JavaScript part identical to the one of the JavaScript plasmoids engine.&lt;br /&gt;
To see the api of the global ''Plasmoid'' object, see the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#The_Global_plasmoid_Object JavaScript API] documentation.&lt;br /&gt;
(TODO: the JavaScript api paged should probably be copied and stripped down the imperative bits not present there, it would make harder to update tough)&lt;br /&gt;
&lt;br /&gt;
== What Is a Declarative Plasmoid?  ==&lt;br /&gt;
&lt;br /&gt;
To denote that this Plasmoid is a Declarative widget, ensure that in the metadata.desktop file there is this line: &lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
&lt;br /&gt;
What follows is a description of the Plasma declarative classes instantiable from QML.&lt;br /&gt;
&lt;br /&gt;
= Main QML classes =&lt;br /&gt;
&lt;br /&gt;
== Data engines ==&lt;br /&gt;
While it's possible to fetch data from a Plasma DataEngine in the same way as the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#DataEngine JavaScript API], however it is preferrable to use the following declarative classes:&lt;br /&gt;
&lt;br /&gt;
=== DataSource ===&lt;br /&gt;
DataSource is a receiver for a dataEngine and can be declared inside QML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
 PlasmaCore.DataSource {&lt;br /&gt;
     id: dataSource&lt;br /&gt;
     engine: &amp;quot;time&amp;quot;&lt;br /&gt;
     connectedSources: [&amp;quot;Local&amp;quot;]&lt;br /&gt;
     interval: 500&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* bool '''valid''' (read only): true when the DataSource is successfully connected to a data engine&lt;br /&gt;
* int '''interval''': interval of polling of the dataengine, if 0 (default value) no polling will be executed&lt;br /&gt;
* string '''engine''': the plugin name of the dataengine to load&lt;br /&gt;
* Array(string) '''connectedSources''': all the sources of the dataengine we are connected to (and whose data will appear in the '''data''' property)&lt;br /&gt;
* Array(string) '''sources''' (read only): all the sources available from the dataengine&lt;br /&gt;
* variant map '''data''' (read only): It's the most important property, it's a map of all the data available from the dataengine: its structure will be as follows:&lt;br /&gt;
** each key of the map will be a source name, in '''connectedSources'''&lt;br /&gt;
** each value will be a variant hash, so an hash with strings as keys and any variant as value&lt;br /&gt;
** example: dataSource.data[&amp;quot;Local&amp;quot;][&amp;quot;Time&amp;quot;] indicates the '''Time''' key of the dataengine source called &amp;quot;Local&amp;quot;&lt;br /&gt;
&lt;br /&gt;
It has the following methods:&lt;br /&gt;
* StringList keysForSource(String source): lists all the keys corresponding to a certain source: for instance in the &amp;quot;time&amp;quot; dataengine, for the &amp;quot;Local&amp;quot; source, keys will be:&lt;br /&gt;
** &amp;quot;Timezone Continent&amp;quot;&lt;br /&gt;
** &amp;quot;Offset&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone&amp;quot;&lt;br /&gt;
** &amp;quot;Time&amp;quot;&lt;br /&gt;
** &amp;quot;Date&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone City&amp;quot;&lt;br /&gt;
* Service serviceForSource(String source): returns a Plasma service that corresponds a given source: see the section about services for how to use it.&lt;br /&gt;
* void connectSource(String source): adds to '''connectedSources''' the new source&lt;br /&gt;
* void disconnectSource(String source): removes that source from '''connectedSources'''&lt;br /&gt;
&lt;br /&gt;
=== Service ===&lt;br /&gt;
Due to their imperative nature, Plasma Services are not instantiated as QML classes, but rather created out of a '''DataSource''' with the method '''serviceForSource''' and used in the JavaScript portions of the QML files.&lt;br /&gt;
This following example is a simplified version from the Now Playing QML widget in the kdeexamples git repository: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var service = dataSource.serviceForSource(activeSource)&lt;br /&gt;
  var operation = service.operationDescription(&amp;quot;seek&amp;quot;)&lt;br /&gt;
  operation.seconds = 10&lt;br /&gt;
&lt;br /&gt;
  var job = service.startOperationCall(operation)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Here dataSource is the id of a DataSource object, and activeSource is a source contained in one of its '''connectedSources'''.&lt;br /&gt;
The service provides an operation called &amp;quot;seek&amp;quot;, with a parameter called &amp;quot;seconds&amp;quot;, that can be written on it as a property of a JavaScript object.&lt;br /&gt;
&lt;br /&gt;
=== ServiceJob ===&lt;br /&gt;
If is necessary to monitor the result of a Service operation, it's possible to connect to the '''finished''' signal provided by the job return paramenter of the '''startOperationCall''' service method.&lt;br /&gt;
The '''finished''' signal has the same job as parameter, from which is possible to check the variant '''result''' property, to check the result.&lt;br /&gt;
&lt;br /&gt;
=== DataModel ===&lt;br /&gt;
Some data engines return as their data something that can be interpreted as a list of items, rather than simple key/value pairs.&lt;br /&gt;
QML provides some item views such as '''ListView''', '''GridView''' and '''Repeater'''.&lt;br /&gt;
The '''DataModel''' QML object can provide, based on a DataSource a model suitable for those QML item views.&lt;br /&gt;
&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* DataSource '''dataSource''': the id of an existing (and connected) DataSource&lt;br /&gt;
* String '''sourceFilter''': it's a regular expression. If the DataSource is connected to more than one source, only inserts data from sources matching this filter expression in the model&lt;br /&gt;
* String '''keyRoleFilter''': it's a regular expression. Only data with keys that match this filter expression will be inserted in the model&lt;br /&gt;
* int '''count''' (read only): how many items are in the model&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 ListView {&lt;br /&gt;
   model: PlasmaCore.DataModel {&lt;br /&gt;
        dataSource: microblogSource&lt;br /&gt;
        keyRoleFilter: &amp;quot;[\\d]*&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    delegate: Text {&lt;br /&gt;
        text: title&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the example, ''microblogSource'' is the id of a DataSource, and inserts in the model only entries that have a number as the key name (matched with [\\d]*, in this case tweets ids)&lt;br /&gt;
&lt;br /&gt;
Each item in the model will have the form of a variant hash: all the keys of the hash will be registered as model role names, in the example, &amp;quot;title&amp;quot; is a role of the model containing a string (also reachable with model[&amp;quot;title&amp;quot;]).&lt;br /&gt;
&lt;br /&gt;
A special reserved role will always be present: '''&amp;quot;DataEngineSource&amp;quot;''': it will contain the name of the data engine source that gave origin to this item.&lt;br /&gt;
&lt;br /&gt;
=== SortFilterModel ===&lt;br /&gt;
SortFilterModel is a proxy model for easy sorting and/or filtering of the items in a DataModel (or any other QAbstractItemModel subclass that has been registered in QML with setContextProperty from a C++ application)&lt;br /&gt;
Properties:&lt;br /&gt;
* model '''sourceModel'''&lt;br /&gt;
* String '''filterRegExp'''&lt;br /&gt;
* String '''filterRole'''&lt;br /&gt;
* String '''sortRole'''&lt;br /&gt;
* Qt::SortOrder '''sortOrder'''&lt;br /&gt;
* int '''count''' (read only)&lt;br /&gt;
&lt;br /&gt;
== Plasma Themes ==&lt;br /&gt;
&lt;br /&gt;
=== Theme ===&lt;br /&gt;
This class instantiable from QML provides access to the Plasma Theme colors and other facilities such as fonts.&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* String '''themeName''' (read only)&lt;br /&gt;
* QFont '''font''' (read only)&lt;br /&gt;
* bool '''windowTranslucentEnabled''' (read only)&lt;br /&gt;
* Url '''homepage''' (read only)&lt;br /&gt;
* bool '''useGlobalSettings''' (read only)&lt;br /&gt;
* QString '''wallpaperPath''' (read only)&lt;br /&gt;
* color '''textColor''' (read only)&lt;br /&gt;
* color '''highlightColor''' (read only)&lt;br /&gt;
* color '''backgroundColor''' (read only)&lt;br /&gt;
* color '''buttonTextColor''' (read only)&lt;br /&gt;
* color '''buttonBackgroundColor''' (read only)&lt;br /&gt;
* color '''linkColor''' (read only)&lt;br /&gt;
* color visitedLinkColor''' (read only)&lt;br /&gt;
* color '''visitedLinkColor''' (read only)&lt;br /&gt;
* color '''buttonHoverColor''' (read only)&lt;br /&gt;
* color '''buttonFocusColor''' (read only)&lt;br /&gt;
* color '''viewTextColor''' (read only)&lt;br /&gt;
* color '''viewBackgroundColo''' (read only)r&lt;br /&gt;
* color '''viewHoverColor''' (read only)&lt;br /&gt;
* color '''viewFocusColor''' (read only)&lt;br /&gt;
* String '''styleSheet''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== Svg ===&lt;br /&gt;
Declaring a Svg element instantiates a Plasma Svg instance. This class doesn't draw anything, for drawing, SvgItem is used.&lt;br /&gt;
Properties:&lt;br /&gt;
* QSize '''size'''&lt;br /&gt;
* bool '''multipleImages'''&lt;br /&gt;
* String '''imagePath'''&lt;br /&gt;
* bool '''usingRenderingCache'''&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPixmap pixmap(QString elementID)&lt;br /&gt;
* void resize(qreal width, qreal height)&lt;br /&gt;
* void resize(): resets the image to its default dimension&lt;br /&gt;
* QSize elementSize(QString elementId)&lt;br /&gt;
* QRectF elementRect(QString elementId)&lt;br /&gt;
* bool hasElement(QString elementId)&lt;br /&gt;
* bool isValid(): true if valid svg file&lt;br /&gt;
&lt;br /&gt;
=== SvgItem ===&lt;br /&gt;
It's a graphical element that will actually paint a Svg instance.&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''elementId''': what element to render. If null, the whole svg will be rendered&lt;br /&gt;
* Svg '''svg''': instance of the Svg class mentioned above&lt;br /&gt;
* QSizeF '''naturalSize''' (read only): default size of the Svg&lt;br /&gt;
* bool '''smooth''': paint with antialias (default false)&lt;br /&gt;
&lt;br /&gt;
=== FrameSvgItem ===&lt;br /&gt;
It's a graphical elenent that paints a Plasma::FrameSvg, so a ractangular image composed by 9 elements contained in a Svg file, useful for things like buttons and frames.&lt;br /&gt;
&lt;br /&gt;
Flags&lt;br /&gt;
* EnabledBorders: combination of TopBorder | BottomBorder | LeftBorder | RightBorder, NoBorder if no border of the frame is enabled&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''imagePath''': path of the file relative to the Plasma Theme, for instance &amp;quot;widgets/background&amp;quot;&lt;br /&gt;
* String '''prefix''': a FrameSvg can contain multiple frames, for instance a button contains &amp;quot;normal&amp;quot;, &amp;quot;raised&amp;quot; and &amp;quot;pressed&amp;quot;&lt;br /&gt;
* Margins '''margins''' (read only): the margins of the frame, see documentation below&lt;br /&gt;
* EnabledBorders '''enabledBorders''': what borders are enabled&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
== Top Level windows ==&lt;br /&gt;
&lt;br /&gt;
=== Dialog ===&lt;br /&gt;
Dialog instantiates a Plasma::Dialog, it will be a Plasma themed top level window that can contain any QML component.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item mainItem: the Item contained in the Dialog, it can be any QML Item instance&lt;br /&gt;
* bool '''visible''': if the window (not the mainItem) is visible&lt;br /&gt;
* int '''x''': x position of the window in screen coordinates&lt;br /&gt;
* int '''y''': y position of the window in screen coordinates&lt;br /&gt;
* int '''width''' (read only): total width of the dialog, including margins&lt;br /&gt;
* int '''height''' (read only): total height of the dialog, including margins&lt;br /&gt;
* int '''windowFlags''': Qt window flags of the Dialog&lt;br /&gt;
* Margins '''margins''' (read only): margins of the Dialog&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPoint popupPosition(Item item, Qt::Alignment alignment=Qt::AlignLeft): the suggested position for the Dialog if it has to be correctly placed as popup of the QML item passed as parameter.&lt;br /&gt;
* void setAttribute(Qt::WindowAttribute attribute, bool on): set an attribute for the dialog window&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== ToolTip ===&lt;br /&gt;
Declaring a ToolTip instance makes it possible to use Plasma tooltips with any QML item.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item '''target''': the QML item we want to show a tooltip of&lt;br /&gt;
* String '''mainText'''&lt;br /&gt;
* String '''subText'''&lt;br /&gt;
* String '''image''': freedesktop compliant icon name as image of the tooltip&lt;br /&gt;
&lt;br /&gt;
= Plasma QtComponents (4.8) =&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API-PlasmoidObject</id>
		<title>Development/Tutorials/Plasma/JavaScript/API-PlasmoidObject</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API-PlasmoidObject"/>
				<updated>2011-06-29T17:31:42Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: migrate to new syntaxhighlight&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= The Global plasmoid Object =&lt;br /&gt;
There is a global object available to the Plasmoid called, appropriately, &amp;quot;plasmoid&amp;quot;. It has a number of useful properties (some of which are read only, but many of which are read/write), functions, constant values and callbacks. Each are enumerated below. &lt;br /&gt;
&lt;br /&gt;
= Callbacks  =&lt;br /&gt;
&lt;br /&gt;
See the section on Events above.&lt;br /&gt;
&lt;br /&gt;
There are some events that are generated by Plasma for the Plasmoid. These can often be caught by providing a function assigned to a specific name in the plasmoid object. For instance, to get notified of form factor changes, one would provide a formFactorChanged method as follows: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
plasmoid.formFactorChanged = function() { &lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;the form factor has changed to: &amp;quot; + plasmoid.formFactor())&lt;br /&gt;
&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following callbacks are used to notify the Plasmoid of changes in its running environment:&lt;br /&gt;
&lt;br /&gt;
* '''configChanged()'''&lt;br /&gt;
* '''currentActivityChanged()'''&lt;br /&gt;
* '''formFactorChanged()'''&lt;br /&gt;
* '''immutabilityChanged()'''&lt;br /&gt;
* '''locationChanged()'''&lt;br /&gt;
* '''sizeChanged()'''&lt;br /&gt;
&lt;br /&gt;
Other callbacks include:&lt;br /&gt;
* '''dataUpdated(String source, Map[String, Any] data)''': used to pass in DataEngine updates&lt;br /&gt;
* '''activate()''': called when the widget is activated by the user, e.g. by a keyboard shortcut. Useful for setting the focus on a specific input widget, for instance. (API v2)&lt;br /&gt;
* '''initExtenderItem(Extender extender)''': Called when an Extender should be set up. (API v2)&lt;br /&gt;
* '''popupEvent(boolean shown)''': called on PopupApplets when the popup is shown or hidden. (API v2)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In API v2, all of these callbacks can also be used as events. So, for instance, instead of implementing plasmoid.popupEvent, one could also write:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
plasmoid.addEventListener('popupEvent', function(shown) { print('shown? ' + shown) } )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
This would also suppress any calls to plasmoid.popupEvent.&lt;br /&gt;
&lt;br /&gt;
Further documentation on these callbacks can be found in the relevant sections below.&lt;br /&gt;
&lt;br /&gt;
= Environment  =&lt;br /&gt;
&lt;br /&gt;
A set of read-only properties (and in most cases notification functions) that tell the Plasmoid about its current environment: &lt;br /&gt;
&lt;br /&gt;
* '''apiVersion''': the integer version of the Simplified JavaScript API in the current execution environment; can be used to change behaviour or usage of functions depending on the version number.&lt;br /&gt;
&lt;br /&gt;
* '''formFactor''': one of Planar (e.g. on a desktop or in an application main view), Horizontal, Vertical or MediaCenter. When the form factor changes, the plasmoid.formFactorChanged function, if defined in the Plasmoid, is called.&lt;br /&gt;
&lt;br /&gt;
* '''size''': the size of the Plasmoid, expressed in QSizeF (explained below). when it changes, plasmoid.sizeChanged() will be called.&lt;br /&gt;
&lt;br /&gt;
* '''location''': one of Floating (no specific location), Desktop (on the application's main view are), FullScreen, LeftEdge, RightEdge, TopEdge or ButtomEdge. When the location changes, the plasmoid.locationChanged function, if defined in the Plasmoid, is called.&lt;br /&gt;
&lt;br /&gt;
* '''immutable''': this property is set to true when the Plasmoid is set to not be movable or otherwise changeable, and false otherwise. Configuration is still usually allowed in this state. When the immutability changes, the plasmoid.immutabilityChanged function, if defined in the Plasmoid, is called.&lt;br /&gt;
&lt;br /&gt;
* '''currentActivity''': the current contextual activity name. When the current activity changes, the plasmoid.currentActivityChanged function, if defined in the Plasmoid, is called.&lt;br /&gt;
&lt;br /&gt;
* '''shouldConserveResources''': true if the plasmoid should not be doing anything that would create too much draw on power, e.g. when on a device with low battery power it may be a good idea not to run a computationally expensive but optional animation&lt;br /&gt;
&lt;br /&gt;
* '''userConfiguring''': true if the user configuration interface is currently being displayed.&lt;br /&gt;
&lt;br /&gt;
= Properties  =&lt;br /&gt;
A set of read/write properties that allow the Plasmoid to set various visual or functional properties: &lt;br /&gt;
&lt;br /&gt;
* ''AspectRatioMode'' '''aspectRatioMode''': defines how to treat the aspect ratio of a Plasmoid when resizing it. See the [[#AspectRatioMode|AspectRatioMode]] documentation for values and their meaning. &lt;br /&gt;
&lt;br /&gt;
* ''BackgroundHints'' '''backgroundHints''': defines how the background of the widget is rendered. See the [[#BackgroundHints|BackgroundHints]] documentation for values and their meaning. &lt;br /&gt;
&lt;br /&gt;
* ''boolean'' '''busy''': set to true when the Plasmoid is currently processing or waiting for data and the user interface should be blocked while doing so; will generally show a full-Plasmoid animated overlay to denote business&lt;br /&gt;
&lt;br /&gt;
= Geometry  =&lt;br /&gt;
&lt;br /&gt;
Read Only Properties: &lt;br /&gt;
&lt;br /&gt;
* ''QRectF'' '''rect''': the current rect of the Plasmoid; note that the top left may be not be the origin point (0,0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Functions: &lt;br /&gt;
&lt;br /&gt;
* '''resize(width, height)'''&lt;br /&gt;
* '''setMinimumSize(width, height)'''&lt;br /&gt;
* '''setPreferredSize(width, height)'''&lt;br /&gt;
* '''setBackgroundHints(background)''' - use '''NoBackground''' as value if you want to remove the default plasmoid background box.&lt;br /&gt;
* '''popupIcon(QIcon(&amp;quot;some icon&amp;quot;))''' - set icon to show when the plasmoid is added to the taskbar. NOTE if the plasmoid is made in QML, you MUST specify a default size for the main Item. This size will be used for the plasmoid when added to the taskbar&lt;br /&gt;
&lt;br /&gt;
= Painting and Layout  =&lt;br /&gt;
&lt;br /&gt;
To paint directly on to the canvas, a widget may implement the paintInterface function in the plasmoid object: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    plasmoid.paintInterface = function(painter) { /* painting code goes here*/ }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
See the Painting section below for information about helpful classes and functions that can be used when implementing a paintInterface function. &lt;br /&gt;
&lt;br /&gt;
Read/Write Properties: &lt;br /&gt;
&lt;br /&gt;
* ''Layout'' '''layout''': the QGraphicsLayout associated with the Plasmoid for laying out top level items; this property is read-write, though the property is not usually set as one can simply do &amp;quot;new LinearLayout&amp;quot; (or one of the other layout classes provided) and it will be automatically associated with the Plasmoid.&lt;br /&gt;
&lt;br /&gt;
Functions: &lt;br /&gt;
&lt;br /&gt;
* '''update()''': triggers a full repaint of the Plasmoid.&lt;br /&gt;
* '''update(QRectF rect)''' triggers a repaint of the rect area of the Plasmoid.&lt;br /&gt;
* '''failedToLaunch(bool failed[, string reason])''' sets the launch status of the Plasmoid; if set to true, the script will stop executing and the reason message, if any, will be displayed to the user.&lt;br /&gt;
&lt;br /&gt;
= Access To Packaged Files  =&lt;br /&gt;
&lt;br /&gt;
Functions: &lt;br /&gt;
&lt;br /&gt;
* ''string'' '''file(string type[, string fileName])''': returns the path to a file in the Plasmoid package of the given type, optionally with a file name to match, e.g. &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;var path = plasmoid.file(&amp;quot;mainscript&amp;quot;)&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
or &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;var pm = new QPixmap(plasmoid.file(&amp;quot;images&amp;quot;, &amp;quot;mypixmap.png&amp;quot;))&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* ''bool'' '''include(string filename)''': attempts to include the script defined from the package's code directory&lt;br /&gt;
&lt;br /&gt;
= Configuration Data  =&lt;br /&gt;
Configuration values can be defined using [[Development/Tutorials/Using_KConfig_XT|KConfig XT]] XML files in the {{path|contents/config/}} directory of the Plasmoid's package. The default file that is looked for and used is {{path|contents/config/main.xml}}.&lt;br /&gt;
&lt;br /&gt;
== Accessing Configuration Data  ==&lt;br /&gt;
Read-write properties:&lt;br /&gt;
* ''String'' '''activeConfig''': The current active configuration description. For instance, setting it to &amp;quot;foo&amp;quot; would cause the Plasmoid to try and reference the {{path|contents/config/foo.xml}} KConfigXT file. Setting this to an empty string will switch to the main.xml file.&lt;br /&gt;
&lt;br /&gt;
Functions:&lt;br /&gt;
* ''any'' '''readConfig(String key)''': reads the value from the configuration data for the given key as defined by the currently active configuration.&lt;br /&gt;
&lt;br /&gt;
* '''writeConfig(String key, any value) ''': writes a value to the configuration store under the given key&lt;br /&gt;
&lt;br /&gt;
== User Customization  ==&lt;br /&gt;
&lt;br /&gt;
User customization can be offered by providing a Qt Designer file called {{path|contents/ui/config.ui}} in the Plasmoid's package.&lt;br /&gt;
&lt;br /&gt;
Callbacks:&lt;br /&gt;
* '''configChanged()''': callback function called when the configuration is changed external to the Plasmoid, e.g. when the user changes settings in a configuration dialog.&lt;br /&gt;
&lt;br /&gt;
= Context menu =&lt;br /&gt;
&lt;br /&gt;
It's possible to add some items to the popup menu of the Plasmoid.&lt;br /&gt;
&lt;br /&gt;
Functions:&lt;br /&gt;
* '''setAction(name, text, icon, shortcut)''': adds an item to the context menu with the given text and icon; you need to define '''plasmoid.action_&amp;lt;name&amp;gt;''' function, where &amp;lt;name&amp;gt; is the first argument for setAction call, and this function will be called each time user clicks the item&lt;br /&gt;
&lt;br /&gt;
* '''removeAction(name)''': removes the item&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted</id>
		<title>Development/Tutorials/Plasma/QML/GettingStarted</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted"/>
				<updated>2011-06-24T18:30:36Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: bam. crosslink to js 'plasmoid' object api.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Writing a plasma applet in QML is very easy, in fact, with KDE 4.6 and Qt 4.7 it just works.&lt;br /&gt;
&lt;br /&gt;
== QML Basics ==&lt;br /&gt;
&lt;br /&gt;
It is recommended that you have read through the [http://doc.qt.nokia.com/4.7/qtquick.html Qt QML Tutorials], as there are quite a few and they are explained thoroughly. There is also a list of all [http://doc.qt.nokia.com/4.7/qdeclarativeelements.html standard QML elements].&lt;br /&gt;
&lt;br /&gt;
See the [https://projects.kde.org/projects/kde/kdeexamples KDE Examples] repository for more KDE-related helpful resources.&lt;br /&gt;
&lt;br /&gt;
=== Root Item ===&lt;br /&gt;
&lt;br /&gt;
The root item can be anything that inherits QGraphicsItem. For example, in this case it is QGraphicsWidget which is a plasmoid. It can also simply be an Item. I also noticed that PathView does not respond to mouse inputs automatically (so flicking doesn't work). Probably because events are being intercepted. So take note, it'll have to be e.g. an Item, for that case.&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
&lt;br /&gt;
==== Row and Column ====&lt;br /&gt;
&lt;br /&gt;
==== Anchors ====&lt;br /&gt;
Anchor layouts offer a nice way of grouping UI elements nicely together. The idea is that you connect edges or corners of one element to the edge or corner of another widget.&lt;br /&gt;
Some examples:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 200&lt;br /&gt;
    heigt: 300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Text {&lt;br /&gt;
        id: first&lt;br /&gt;
        text: i18n(&amp;quot;1st line&amp;quot;)&lt;br /&gt;
        anchors { top: parent.top;&lt;br /&gt;
                  left: parent.left;&lt;br /&gt;
                  right: parent.right;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    Text {&lt;br /&gt;
        id: second&lt;br /&gt;
        text: i18n(&amp;quot;2nd line&amp;quot;)&lt;br /&gt;
        anchors { top: first.bottom;&lt;br /&gt;
                  left: parent.left;&lt;br /&gt;
                  right: parent.right;&lt;br /&gt;
                  bottom: parent.bottom;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Buttons ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Animations ===&lt;br /&gt;
&lt;br /&gt;
== Package Structure ==&lt;br /&gt;
&lt;br /&gt;
You create a .desktop file and the .qml file. They have to be in the usual plasma package structure.&lt;br /&gt;
&lt;br /&gt;
plasmoid-qml/metadata.desktop&lt;br /&gt;
plasmoid-qml/contents/ui/main.qml&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;metadata.desktop&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;code ini&amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Name=Hello QML&lt;br /&gt;
Comment=A hello world widget in QML&lt;br /&gt;
Icon=chronometer&lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
X-Plasma-MainScript=ui/main.qml&lt;br /&gt;
X-Plasma-DefaultSize=200,100&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Author=Frederik Gladhorn&lt;br /&gt;
X-KDE-PluginInfo-Email=gladhorn@kde.org&lt;br /&gt;
X-KDE-PluginInfo-Website=http://plasma.kde.org/&lt;br /&gt;
X-KDE-PluginInfo-Category=Examples&lt;br /&gt;
X-KDE-PluginInfo-Name=org.kde.hello-qml&lt;br /&gt;
X-KDE-PluginInfo-Version=0.0&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Depends=&lt;br /&gt;
X-KDE-PluginInfo-License=GPL&lt;br /&gt;
X-KDE-PluginInfo-EnabledByDefault=true&lt;br /&gt;
X-KDE-ServiceTypes=Plasma/Applet&lt;br /&gt;
Type=Service&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  &amp;lt;tt&amp;gt;main.qml&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;code javascript&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing ==&lt;br /&gt;
You can install your plasmoid:&lt;br /&gt;
plasmapkg --install plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
== plasmoidviewer ==&lt;br /&gt;
You can run it in plasmoidviewer as usual:&lt;br /&gt;
plasmoidviewer plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
== qmlviewer ==&lt;br /&gt;
It's possible to use Plasma specific imports in qml files loaded by qmlviewer:&lt;br /&gt;
&lt;br /&gt;
qmlviewer -I /usr/lib/kde4/imports/ plasmoid-qml/contents/qml/main.qml &lt;br /&gt;
&lt;br /&gt;
Where the -I is the path to the plasma plugin for qml. Try to look for the path of &lt;br /&gt;
/usr/lib/kde4/imports/org/kde/plasma/graphicswidgets/libgraphicswidgetsbindingsplugin.so&lt;br /&gt;
and use everything up to org of that path.&lt;br /&gt;
&lt;br /&gt;
Hovewer it's '''strongly discouraged''' to use qmlviewer to develop plasmoids, because some features won't be available there:&lt;br /&gt;
* localization with i18n()&lt;br /&gt;
* access to the global ''plasmoid'' object&lt;br /&gt;
* device specific qml files imported with plasmapackage:// urls&lt;br /&gt;
* bindings for qicons, KJobs, services and KConfig&lt;br /&gt;
&lt;br /&gt;
= Features only available in Plasma widgets =&lt;br /&gt;
In order to have a better integration with the KDE platform and to reach an higher degree of expressivity, the stock features of QML have been expanded with the following features, that strictly follow the Plasmoid JavaScript API:&lt;br /&gt;
&lt;br /&gt;
== Plasmoid object ==&lt;br /&gt;
Every QML plasmoid will have an object called ''plasmoid'', that will give access to the configuration, the formfactor, immutability and so on. It offers the same api as the object with the same name in the Javascript API.&lt;br /&gt;
&lt;br /&gt;
For specific info on this, see [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API-PlasmoidObject Javascript API-Plasmoid Object]&lt;br /&gt;
&lt;br /&gt;
== Localization ==&lt;br /&gt;
It's possible to localize strings with the usual i18n(), i18nc(), i18np() global functions&lt;br /&gt;
&lt;br /&gt;
== Extra types ==&lt;br /&gt;
Some extra types are available from withing JavaScript, namely&lt;br /&gt;
&lt;br /&gt;
* KConfigGroup: it's an object with its cnfig keys readable and writable as properties&lt;br /&gt;
* QIcon: can be constructed with QIcon(&amp;quot;fdo name&amp;quot;) such as QIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
* KJob&lt;br /&gt;
* Plasma Service api&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Plasma specific imports =&lt;br /&gt;
To use some Plasma specific features is necessary to use some particular QML imports.&lt;br /&gt;
&lt;br /&gt;
== Plasma Core ==&lt;br /&gt;
org.kde.plasma.core&lt;br /&gt;
This is the import that lets you access to the most important Plasma Core features.&lt;br /&gt;
&lt;br /&gt;
=== DataSource ===&lt;br /&gt;
Used to connect to a dataengine&lt;br /&gt;
&lt;br /&gt;
=== DataModel ===&lt;br /&gt;
Attaches to a DataSource, makes possible to use a dataengine as a model for a QML ListView, GridView, PathView and so on&lt;br /&gt;
&lt;br /&gt;
=== Svg ===&lt;br /&gt;
Loads a Plasma Svg, it's not the visual item&lt;br /&gt;
&lt;br /&gt;
=== SvgItem ===&lt;br /&gt;
Visual item that paints a Svg&lt;br /&gt;
&lt;br /&gt;
=== FrameSvg ===&lt;br /&gt;
Loads a Plasma FrameSvg, it's not the visual item.&lt;br /&gt;
&lt;br /&gt;
=== FrameSvgItem ===&lt;br /&gt;
Visual item that displays a Plasma FrameSvg&lt;br /&gt;
&lt;br /&gt;
== Extra Qt features ==&lt;br /&gt;
org.kde.qtextraimports&lt;br /&gt;
&lt;br /&gt;
* QPixmapItem&lt;br /&gt;
* QImageItem&lt;br /&gt;
* QIconItem&lt;br /&gt;
&lt;br /&gt;
== Plasma Widgets in QML ==&lt;br /&gt;
To use standard plasma widgets (e.g. Plasma::LineEdit, etc.), you simply add an import line for them.&lt;br /&gt;
All properties, signals and slots from ordinary Plasma widgets are available there.&lt;br /&gt;
Those widgets are provided as a transition tool, intended to be replaced by the Plasma version of QtComponents.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code javascript&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.graphicswidgets 0.1 as PlasmaWidgets&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 64&lt;br /&gt;
    height: 64&lt;br /&gt;
    PlasmaWidgets.IconWidget {&lt;br /&gt;
        id: icon&lt;br /&gt;
        Component.onCompleted: setIcon(&amp;quot;flag-red&amp;quot;)&lt;br /&gt;
        anchors.centerIn: parent&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted</id>
		<title>Development/Tutorials/Plasma/QML/GettingStarted</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted"/>
				<updated>2011-04-19T19:26:19Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: more love for the world. hurrah!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Writing a plasma applet in QML is very easy, in fact, with KDE 4.6 and Qt 4.7 it just works.&lt;br /&gt;
&lt;br /&gt;
== QML Basics ==&lt;br /&gt;
&lt;br /&gt;
It is recommended that you have read through the Qt QML Tutorials, as there are quite a few and they are explained thoroughly:&lt;br /&gt;
http://doc.qt.nokia.com/4.7/qtquick.html&lt;br /&gt;
&lt;br /&gt;
Here is a list of the available elements:&lt;br /&gt;
http://doc.qt.nokia.com/4.7/qdeclarativeelements.html&lt;br /&gt;
&lt;br /&gt;
The root item can be anything that inherits QGraphicsItem. For example, in this case it is QGraphicsWidget which is a plasmoid. It can also simply be an Item. I also noticed that PathView does not respond to mouse inputs automatically (so flicking doesn't work). Probably because events are being intercepted. So take note, it'll have to be e.g. an Item, for that case.&lt;br /&gt;
&lt;br /&gt;
See the [https://projects.kde.org/projects/kde/kdeexamples KDE Examples] git repository for more KDE-related helpful resources.&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
&lt;br /&gt;
==== Row and Column ====&lt;br /&gt;
&lt;br /&gt;
==== Anchors ====&lt;br /&gt;
Anchor layouts offer a nice way of grouping UI elements nicely together. The idea is that you connect edges or corners of one element to the edge or corner of another widget.&lt;br /&gt;
Some examples:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import Qt 4.7&lt;br /&gt;
import org.kde.plasma.graphicswidgets 0.1 as PlasmaWidgets&lt;br /&gt;
import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
import org.kde.plasma.graphicslayouts 4.7 as GraphicsLayouts&lt;br /&gt;
&lt;br /&gt;
QGraphicsWidget {&lt;br /&gt;
    preferredSize: &amp;quot;200x300&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    Text {&lt;br /&gt;
        id: first&lt;br /&gt;
        text: i18n(&amp;quot;1st line&amp;quot;)&lt;br /&gt;
        anchors { top: parent.top;&lt;br /&gt;
                  left: parent.left;&lt;br /&gt;
                  right: parent.right;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    Text {&lt;br /&gt;
        id: second&lt;br /&gt;
        text: i18n(&amp;quot;2nd line&amp;quot;)&lt;br /&gt;
        anchors { top: first.bottom;&lt;br /&gt;
                  left: parent.left;&lt;br /&gt;
                  right: parent.right;&lt;br /&gt;
                  bottom: parent.bottom;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Buttons ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Animations ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Package Structure ==&lt;br /&gt;
&lt;br /&gt;
You create a .desktop file and the .qml file. They have to be in the usual plasma package structure.&lt;br /&gt;
&lt;br /&gt;
plasmoid-qml/metadata.desktop&lt;br /&gt;
plasmoid-qml/contents/ui/main.qml&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;metadata.desktop&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;code ini&amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Name=Hello QML&lt;br /&gt;
Comment=A hello world widget in QML&lt;br /&gt;
Icon=chronometer&lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
X-Plasma-MainScript=ui/main.qml&lt;br /&gt;
X-Plasma-DefaultSize=200,100&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Author=Frederik Gladhorn&lt;br /&gt;
X-KDE-PluginInfo-Email=gladhorn@kde.org&lt;br /&gt;
X-KDE-PluginInfo-Website=http://plasma.kde.org/&lt;br /&gt;
X-KDE-PluginInfo-Category=Examples&lt;br /&gt;
X-KDE-PluginInfo-Name=org.kde.hello-qml&lt;br /&gt;
X-KDE-PluginInfo-Version=0.0&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Depends=&lt;br /&gt;
X-KDE-PluginInfo-License=GPL&lt;br /&gt;
X-KDE-PluginInfo-EnabledByDefault=true&lt;br /&gt;
X-KDE-ServiceTypes=Plasma/Applet&lt;br /&gt;
Type=Service&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  &amp;lt;tt&amp;gt;main.qml&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;code javascript&amp;gt;&lt;br /&gt;
import Qt 4.7&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing ==&lt;br /&gt;
You can install your plasmoid:&lt;br /&gt;
plasmapkg --install plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
== plasmoidviewer ==&lt;br /&gt;
You can run it in plasmoidviewer as usual:&lt;br /&gt;
plasmoidviewer plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
== qmlviewer ==&lt;br /&gt;
It's possible to use Plasma specific imports in qml files loaded by qmlviewer:&lt;br /&gt;
&lt;br /&gt;
qmlviewer -I /usr/lib/kde4/imports/ plasmoid-qml/contents/qml/main.qml &lt;br /&gt;
&lt;br /&gt;
Where the -I is the path to the plasma plugin for qml. Try to look for the path of &lt;br /&gt;
/usr/lib/kde4/imports/org/kde/plasma/graphicswidgets/libgraphicswidgetsbindingsplugin.so&lt;br /&gt;
and use everything up to org of that path.&lt;br /&gt;
&lt;br /&gt;
Hovewer it's '''strongly discouraged''' to use qmlviewer to develop plasmoids, because some features won't be available there:&lt;br /&gt;
* localization with i18n()&lt;br /&gt;
* access to the global ''plasmoid'' object&lt;br /&gt;
* device specific qml files imported with plasmapackage:// urls&lt;br /&gt;
* bindings for qicons, KJobs, services and KConfig&lt;br /&gt;
&lt;br /&gt;
= Features only available in Plasma widgets =&lt;br /&gt;
In order to have a better integration with the KDE platform and to reach an higher degree of expressivity, the stock features of QML have been expanded with the following features, that strictly follow the Plasmoid JavaScript API:&lt;br /&gt;
&lt;br /&gt;
== Plasmoid object ==&lt;br /&gt;
Every QML plasmoid will have an object called ''plasmoid'', that will give access to the configuration, the formfactor, immutability and so on. It offers the same api as the object with the same name in the Javascript API.&lt;br /&gt;
&lt;br /&gt;
== Localization ==&lt;br /&gt;
It's possible to localize strings with the usual i18n(), i18nc(), i18np() global functions&lt;br /&gt;
&lt;br /&gt;
== Extra types ==&lt;br /&gt;
Some extra types are available from withing JavaScript, namely&lt;br /&gt;
&lt;br /&gt;
* KConfigGroup: it's an object with its cnfig keys readable and writable as properties&lt;br /&gt;
* QIcon: can be constructed with QIcon(&amp;quot;fdo name&amp;quot;) such as QIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
* KJob&lt;br /&gt;
* Plasma Service api&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Plasma specific imports =&lt;br /&gt;
To use some Plasma specific features is necessary to use some particular QML imports.&lt;br /&gt;
&lt;br /&gt;
== Plasma Core ==&lt;br /&gt;
org.kde.plasma.core&lt;br /&gt;
This is the import that lets you access to the most important Plasma Core features.&lt;br /&gt;
&lt;br /&gt;
=== DataSource ===&lt;br /&gt;
Used to connect to a dataengine&lt;br /&gt;
&lt;br /&gt;
=== DataModel ===&lt;br /&gt;
Attaches to a DataSource, makes possible to use a dataengine as a model for a QML ListView, GridView, PathView and so on&lt;br /&gt;
&lt;br /&gt;
=== Svg ===&lt;br /&gt;
Loads a Plasma Svg, it's not the visual item&lt;br /&gt;
&lt;br /&gt;
=== SvgItem ===&lt;br /&gt;
Visual item that paints a Svg&lt;br /&gt;
&lt;br /&gt;
=== FrameSvg ===&lt;br /&gt;
Loads a Plasma FrameSvg, it's not the visual item.&lt;br /&gt;
&lt;br /&gt;
=== FrameSvgItem ===&lt;br /&gt;
Visual item that displays a Plasma FrameSvg&lt;br /&gt;
&lt;br /&gt;
== Extra Qt features ==&lt;br /&gt;
org.kde.qtextraimports&lt;br /&gt;
&lt;br /&gt;
* QPixmapItem&lt;br /&gt;
* QImageItem&lt;br /&gt;
* QIconItem&lt;br /&gt;
&lt;br /&gt;
== Plasma Widgets in QML ==&lt;br /&gt;
To use standard plasma widgets (e.g. Plasma::LineEdit, etc.), you simply add an import line for them.&lt;br /&gt;
All properties, signals and slots from ordinary Plasma widgets are available there.&lt;br /&gt;
Those widgets are provided as a transition tool, intended to be replaced by the Plasma version of QtComponents.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code javascript&amp;gt;&lt;br /&gt;
import Qt 4.7&lt;br /&gt;
import org.kde.plasma.graphicswidgets 0.1 as PlasmaWidgets&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 64&lt;br /&gt;
    height: 64&lt;br /&gt;
    PlasmaWidgets.IconWidget {&lt;br /&gt;
        id: icon&lt;br /&gt;
        Component.onCompleted: setIcon(&amp;quot;flag-red&amp;quot;)&lt;br /&gt;
        anchors.centerIn: parent&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sreich</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Getting_Started/Build/KDE4</id>
		<title>Getting Started/Build/KDE4</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Getting_Started/Build/KDE4"/>
				<updated>2011-02-06T06:07:38Z</updated>
		
		<summary type="html">&lt;p&gt;Sreich: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Getting_Started/Build/KDE4}}&lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
series=Getting Started|&lt;br /&gt;
&lt;br /&gt;
name=Building KDE4 (Development version, TRUNK) From Source|&lt;br /&gt;
&lt;br /&gt;
pre=[[../../Sources/Anonymous_SVN|Anonymous SVN Quickstart Guide]]|&lt;br /&gt;
&lt;br /&gt;
next=[[../../Set_up_KDE_4_for_development|Set up KDE 4 for development]]|&lt;br /&gt;
&lt;br /&gt;
reading=[[../kdesrc-build|kdesrc-build: The KDE From Source Build Tool]]&amp;lt;br&amp;gt;[[Contribute/Send Patches|Sending Patches]]&amp;lt;br&amp;gt;[[../../Increased_Productivity_in_KDE4_with_Scripts|Increased Productivity in KDE4 with Scripts]]&amp;lt;br&amp;gt;[[Development/Tutorials/CMake |Introduction to CMake]]&amp;lt;br&amp;gt;[[../KDE4/FreeBSD|FreeBSD notes]]&amp;lt;br&amp;gt;[[../KDE4/Mac OS X|Instructions for Mac OS X]]&amp;lt;br&amp;gt;[[../KDE4/Windows|Instructions for MS Windows]]|&lt;br /&gt;
}}&lt;br /&gt;
{| class=&amp;quot;collapsible collapsed&amp;quot; style=&amp;quot;border: 1px #aaa solid; background: #efefef;&amp;quot;&lt;br /&gt;
! style=&amp;quot;font-size: 1.25em; &amp;quot;| Table of contents&lt;br /&gt;
|-&lt;br /&gt;
| __TOC__&lt;br /&gt;
|}&lt;br /&gt;
{{warning|The commands below are used to build the latest UNSTABLE version of KDE from TRUNK. &lt;br /&gt;
&lt;br /&gt;
This should not be used in a production environment -- not recommended for daily use.&lt;br /&gt;
&lt;br /&gt;
To build a stable KDE-4 version, go to:&lt;br /&gt;
&lt;br /&gt;
::[[Getting_Started/Build/KDE4.x|upgrading to KDE-4.x from KDE-3.x]]&lt;br /&gt;
&lt;br /&gt;
Or&lt;br /&gt;
&lt;br /&gt;
::[[Getting_Started/Build/KDE4.4 Upgrade|Upgrade KDE-4.x.y release version or KDE-4.x SVN BRANCH)]]&lt;br /&gt;
&lt;br /&gt;
which is currently under construction.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Note|&lt;br /&gt;
If you are new here, we recommend following [[Getting_Started/Build/kdesrc-build|this kdesrc-build tutorial]]. It's the most hassle free method, and will help you get up and running in no time. It even has neat progress indicators for compiling modules - what's not to like about it. It was previously called kdesvn-build.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Assuming you are still here...this tutorial shows a labor intensive way to get KDE from trunk running on Linux/BSD systems. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are also tutorials for [[Getting_Started/Build/KDE4/FreeBSD|FreeBSD]], [[/Windows|Windows]], [[/Mac OS X|Mac OS X]] and [http://solaris.kde.org/ Solaris]. This tutorial creates a special user, kde-devel, that will run KDE trunk. On the one hand, this allows other users to continue with another KDE version. On the other hand, testing special system-wide code like the KDE display manager is not possible. There is a tutorial to&lt;br /&gt;
[[Getting_Started/Build/KDE4/onVmWare|set up KDE 4 trunk on a virtual machine]].&lt;br /&gt;
&lt;br /&gt;
Throughout the tutorial the bash shell is used.&lt;br /&gt;
&lt;br /&gt;
{{warning|Expect a higher risk of build failure '''on Mondays''' when most kdelibs changes are committed. [http://developer.kde.org/~dirk/dashboard/ Dashboard] reports unexpected breakages. You are encouraged to fix failing modules.}}&lt;br /&gt;
&lt;br /&gt;
== Create a user account for KDE4 development ==&lt;br /&gt;
&lt;br /&gt;
It is important to keep the development version from interfering with the rest of your computer, The method covered here is creating a dedicated kde-devel user.&lt;br /&gt;
&lt;br /&gt;
We will need to:&lt;br /&gt;
 #Add the user&lt;br /&gt;
 #Set the shell to bash&lt;br /&gt;
 #and may have to use sudoedit if we want to be able to sudo&lt;br /&gt;
 #Create a .bashrc file with environment variables for the build system&lt;br /&gt;
&lt;br /&gt;
A graphical tool is avalable from most distributions, if you have KDE you can get to this tool via: K-&amp;gt;Computer-&amp;gt;System Settings-&amp;gt;User Management&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Note|&lt;br /&gt;
Less Safe Alternative:&lt;br /&gt;
One can do everything under your normal user account. This is recommended, as a separate user is quite a bit of work.&lt;br /&gt;
&lt;br /&gt;
See [[Getting_Started/Increased_Productivity_in_KDE4_with_Scripts|Increased Productivity in KDE4 with Scripts]]&lt;br /&gt;
for more details. &lt;br /&gt;
&lt;br /&gt;
The environment variables determinate what version you use. Proceed same as here except put the environment variables in a file. In your &amp;lt;tt&amp;gt;.bashrc&amp;lt;/tt&amp;gt; file add the line &amp;lt;tt&amp;gt;source .kde_devel_env&amp;lt;/tt&amp;gt;. renaming the .kde_devel_env file would make them not be loaded, so you wouldn't use the devel version.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Commandline useradd===&lt;br /&gt;
Some systems are configured to use {{path|/bin/sh}}. Many users prefer Bash{{path|/bin/bash}} &lt;br /&gt;
&lt;br /&gt;
{{Note|&lt;br /&gt;
On Ark Linux and Fedora, you can skip the &amp;lt;tt&amp;gt;-s /bin/bash&amp;lt;/tt&amp;gt; switch - {{path|/bin/sh}} is {{path|bash}}.&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;code bash&amp;gt;&lt;br /&gt;
sudo useradd -m kde-devel -s /bin/bash&lt;br /&gt;
sudo passwd kde-devel&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== commandline permissions and groups ====&lt;br /&gt;
Edit your /etc/groups file to add the kde-devel user to all the groups that you need (probably the groups that your usual username is already assigned to).&lt;br /&gt;
&lt;br /&gt;
You may need to add user to sudoers file. (beyond scope of this tutorial)&lt;br /&gt;
&lt;br /&gt;
=== Setting up the environment ===&lt;br /&gt;
&lt;br /&gt;
Copy the {{path|~/.bashrc}} from your normal user account to the new kde-devel account. &lt;br /&gt;
&lt;br /&gt;
Next, copy and paste the contents of the [[Getting Started/Increased Productivity in KDE4 with Scripts/.bashrc|example .bashrc]] into {{path|~kde-devel/.bashrc}}. Be sure to comment out the line &amp;lt;tt&amp;gt;alias make=makeobj&amp;lt;/tt&amp;gt; if you do not have the &amp;lt;tt&amp;gt;[[Getting Started/Build/KDE4/Prerequisites#Abstract|makeobj]]&amp;lt;/tt&amp;gt; command available. (What is this, how do we know???)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alternatively, you can download the kde-sdk a.k.a kdesdk package (or perform a subversion checkout) and include the kde-sdk/scripts/ directory in your path. (What is this???)&lt;br /&gt;
&lt;br /&gt;
You will probably also want to modify the path to make sure it doesn't include your kde3 paths.&lt;br /&gt;
&lt;br /&gt;
 Also if you want to use KDevelop to develop KDE 4 applications you may pass the ''-GKDevelop3'' flag to the ''cmake'' command (to make CMake generate KDevelop project files, it will help to avoid rebuilding in the future, see [[Getting_Started/Set_up_KDE_4_for_development#Setting_up_the_environment|this]]).  &lt;br /&gt;
To make it run, you have to open a new bash or to execute &lt;br /&gt;
&amp;lt;code bash&amp;gt;&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will provide access to commands such as &amp;lt;tt&amp;gt;cmakekde&amp;lt;/tt&amp;gt; that are used in this tutorial as well as ensure that the proper paths are in place for Qt, KDE and CMake binaries.&lt;br /&gt;
&lt;br /&gt;
For more information, please read the [[Getting Started/Increased Productivity in KDE4 with Scripts]] tutorial.&lt;br /&gt;
&lt;br /&gt;
=== Using the kde-devel User ===&lt;br /&gt;
To get a text-only command prompt, say from konsole&lt;br /&gt;
 su - kde-devel&lt;br /&gt;
'(need hyphen otherwise your environment will be the same as your regular user)&lt;br /&gt;
&lt;br /&gt;
To Log in Text-only from a virtual terminal:&lt;br /&gt;
 CTRL-F1  ( CTRL-F7 is normally graphical )&lt;br /&gt;
&lt;br /&gt;
To use a shell that can pop up applications when your normal user is logged in:&lt;br /&gt;
&amp;lt;code bash&amp;gt;&lt;br /&gt;
ssh -X kde-devel@localhost&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|&lt;br /&gt;
If the ssh command fails, check out the [[Getting_Started/Set_up_KDE_4_for_development#Launching_KDE_4_apps|Launching KDE 4 apps]] section of the [[Getting_Started/Set_up_KDE_4_for_development|KDE4 development guide]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Required packages from your distribution ==&lt;br /&gt;
The requirements to build kde4 from source vary from distribution to distribution. Instructions for your distribution are provided below:&lt;br /&gt;
See [[build requirements]] for more complete list.&lt;br /&gt;
&lt;br /&gt;
[[Getting_Started/Build/KDE4/Ark Linux|Ark Linux]],&lt;br /&gt;
[[Getting_Started/Build/KDE4/Arch Linux|Arch Linux]], [[Getting_Started/Build/KDE4/Chakra|Chakra]], [[Getting_Started/Build/KDE4/Fedora|Fedora]],&lt;br /&gt;
[[Getting_Started/Build/KDE4/Kubuntu and Debian|Kubuntu and Debian]] (or check out [[Getting_Started/Using_Project_Neon_to_contribute_to_KDE|Project Neon]]), [[Getting_Started/Build/KDE4/openSUSE|openSUSE]] ([http://en.opensuse.org/openSUSE:KDE_developers_guide specific guide for openSUSE]. However be careful because it updates a huge number of your stable packages.),&lt;br /&gt;
[[Getting_Started/Build/KDE4/Gentoo|Gentoo]],&lt;br /&gt;
[[Getting_Started/Build/KDE4/LFS|Linux from Scratch]] or to build from source.&lt;br /&gt;
[[Getting_Started/Build/KDE4/Mandriva|Mandriva]]&lt;br /&gt;
[[Getting_Started/Build/KDE4/Generic|any other distro]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Optional Documentation Dependencies ===&lt;br /&gt;
For trunk you also now need docbook-dtd42-xml for the docs. Depending on your distribution please get the docbook related packages and the 4.2 DTD.&lt;br /&gt;
&lt;br /&gt;
Your next compilation step depends on the packages supplied by your distro.&lt;br /&gt;
&lt;br /&gt;
== Compiling kde-qt, etc. ==&lt;br /&gt;
If you do not want to use the packages provided by your distro you can compile things like Qt yourself. Instructions for building all dependencies including CMake, Qt4 (kde-qt) and kdesupport are available in [[Getting_Started/Build/KDE4/Prerequisites|the build prerequisites page]].  Note that automoc, strigi, soprano, and a few other things are part of kdesupport, so if you have errors about these missing, you'll need to get kdesupport.&lt;br /&gt;
&lt;br /&gt;
=== Useful subversion tweaks ===&lt;br /&gt;
&lt;br /&gt;
{{Warning|Do not use this method when you don't know what you are doing or just want to test some trunk feature, seriously! &lt;br /&gt;
You can create a very costly load when you accidentially checkout all of trunk or for example all of &amp;quot;trunk/KDE&amp;quot; just to build single modules. This would generate immense useless load on the svn server.}}&lt;br /&gt;
&lt;br /&gt;
If you check out large parts of svn trunk regularly or if you want to create patches which touch several modules at once, you should try to checkout an empty tree of trunk first and then update only the relevant modules, for example:&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
 cd&lt;br /&gt;
 cs # [[Getting_Started/Increased_Productivity_in_KDE4_with_Scripts/.bashrc|'cs' is a bash function, click here to learn more]]&lt;br /&gt;
 svn checkout --depth empty svn://anonsvn.kde.org/home/kde/trunk&lt;br /&gt;
 cd trunk&lt;br /&gt;
 svn up kdesupport &amp;amp;&amp;amp; cd kdesupport&lt;br /&gt;
 cmakekde&lt;br /&gt;
 cs trunk&lt;br /&gt;
 svn up --depth empty KDE&lt;br /&gt;
 svn up KDE/kdelibs &amp;amp;&amp;amp; cd KDE/kdelibs&lt;br /&gt;
 cmakekde&lt;br /&gt;
 cs trunk&lt;br /&gt;
 svn up KDE/kdepimlibs&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
==== Why do I want to do that? ====&lt;br /&gt;
That way you can move stuff around all over the trunk repository, e.g. from playground to kdereview or to KDE/*. The following examples assume that you only want to test or work on single and few modules of trunk. &lt;br /&gt;
&lt;br /&gt;
This way updating the whole repository to a (hopefully) consitent state, the same revision, is really easy:&lt;br /&gt;
&lt;br /&gt;
 cs trunk # [[Getting_Started/Increased_Productivity_in_KDE4_with_Scripts/.bashrc|'cs' is a bash function, click here to learn more]]&lt;br /&gt;
 svn up&lt;br /&gt;
&lt;br /&gt;
== Download and Compile ==&lt;br /&gt;
In this section we go over acquiring and building the product.&lt;br /&gt;
{{Note|&lt;br /&gt;
check out http://kdesvn-build.kde.org/  you may not need to do all of this stuff.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Troubleshooting ===&lt;br /&gt;
Please note, that requirements and dependancies frequently change.&lt;br /&gt;
You are running an UNSTABLE version, and simply compiling is not guaranteed. You will need to review errors and locate packages, (see acquire dependencies above) and [[Getting_Started/Build/KDE4/Troubleshooting|Troubleshooting]] information.&lt;br /&gt;
&lt;br /&gt;
We can now move on to building KDE's most essential libraries.&lt;br /&gt;
&lt;br /&gt;
=== kdelibs ===&lt;br /&gt;
Very important for lots of things, you may need to see troubleshooting and install some things from kdesupport first.&lt;br /&gt;
&lt;br /&gt;
==== The Recipe ====&lt;br /&gt;
 cd   &lt;br /&gt;
 cs # [[Getting_Started/Increased_Productivity_in_KDE4_with_Scripts/.bashrc|'cs' is a bash function, click here to learn more]]&lt;br /&gt;
 mkdir KDE &amp;amp;&amp;amp; cd KDE&lt;br /&gt;
 svn checkout svn://anonsvn.kde.org/home/kde/trunk/KDE/kdelibs&lt;br /&gt;
 cd kdelibs&lt;br /&gt;
 mkdir build&lt;br /&gt;
 cd build&lt;br /&gt;
 cmakekde ..&lt;br /&gt;
&lt;br /&gt;
==== What's Happening ====&lt;br /&gt;
We change to the base source directory (line 1) then make and go into the KDE directory (line 3). We download the sources for kdelibs using subversion (line 4), go into the new {{path|~/kde/src/KDE/kdelibs}} directory (line 5), and commence the build (line 6). This will leave us in the &amp;lt;tt&amp;gt;kdelibs&amp;lt;/tt&amp;gt; build directory after the build is completed.&lt;br /&gt;
&lt;br /&gt;
{{tip|There might be missing dependencies on your system! They are easily overlooked in the output of &amp;lt;tt&amp;gt;cmakekde&amp;lt;/tt&amp;gt;.&lt;br /&gt;
You might want to do a &amp;lt;tt&amp;gt;cmake $KDE_SRC/KDE/MODULE_NAME&amp;lt;/tt&amp;gt; prior to compiling any kde modules (like kdelibs, kdepimlibs etc.)}}&lt;br /&gt;
&lt;br /&gt;
==== Additional KDE-specific CMake know-how ====&lt;br /&gt;
&lt;br /&gt;
There are additional CMake modules in {{path|kdelibs/cmake/modules/}} that are necessary for building KDE4 applications. These will be installed for you when  kdelibs itself is installed.&lt;br /&gt;
&lt;br /&gt;
To make a non-debug-release (e.g. suppressing all kDebug() messages), use e.g.&lt;br /&gt;
 cmake -DCMAKE_BUILD_TYPE=Release . &amp;amp;&amp;amp; make &amp;amp;&amp;amp; make install&lt;br /&gt;
&lt;br /&gt;
==== Troubleshooting ====&lt;br /&gt;
&lt;br /&gt;
For troubleshooting information, see the [[Getting_Started/Build/KDE4/Troubleshooting#Issues_building_kdelibs|kdelibs troubleshooting section]].&lt;br /&gt;
&lt;br /&gt;
=== kdepimlibs ===&lt;br /&gt;
Currently kdebase depends on kdepimlibs so it is required to install it first. These libraries are also shared by other packages such as those within kdepim, kdeutils and kdenetwork.&lt;br /&gt;
&lt;br /&gt;
==== libical ====&lt;br /&gt;
Download libical from http://sourceforge.net/project/showfiles.php?group_id=16077, compile, link and install it.&lt;br /&gt;
 tar xvzf libical-0.41.tar.gz&lt;br /&gt;
 cd libical-0.41&lt;br /&gt;
 ./configure &amp;amp;&amp;amp; make &amp;amp;&amp;amp; make install&lt;br /&gt;
&lt;br /&gt;
==== The Recipe ====&lt;br /&gt;
 cs KDE # [[Getting_Started/Increased_Productivity_in_KDE4_with_Scripts/.bashrc|'cs' is a bash function, click here to learn more]]&lt;br /&gt;
 svn checkout svn://anonsvn.kde.org/home/kde/trunk/KDE/kdepimlibs&lt;br /&gt;
 cd kdepimlibs&lt;br /&gt;
 cmakekde&lt;br /&gt;
&lt;br /&gt;
==== What's Happening ====&lt;br /&gt;
We go into the KDE source directory (line 1), download the source code for kdepimlibs using subversion (line 2) and then go into the new {{path|~/kde/src/KDE/kdepimlibs}} directory (line 3). We then commence the build (line 4). This will leave us in the &amp;lt;tt&amp;gt;kdepimlibs&amp;lt;/tt&amp;gt; build directory after the build is completed.&lt;br /&gt;
&lt;br /&gt;
==== Troubleshooting ====&lt;br /&gt;
&lt;br /&gt;
For troubleshooting information, see the [[Getting_Started/Build/KDE4/Troubleshooting#Issues_building_kdepimlibs|kdepimlibs troubleshooting section]].&lt;br /&gt;
&lt;br /&gt;
=== kdebase ===&lt;br /&gt;
kdebase is divided into three parts:&lt;br /&gt;
* '''apps'''&lt;br /&gt;
:This contains applications like Dolphin or KWrite.&lt;br /&gt;
* '''runtime'''&lt;br /&gt;
:This contains things needed by every application at runtime, like icons. It is a required dependency for each KDE application, so you have to compile and install this.&lt;br /&gt;
* '''workspace'''&lt;br /&gt;
:This contains things specific to the KDE desktop, like Plasma or the window manager. Most stuff here depends on X11. You only need it if you want to build a full KDE desktop.&lt;br /&gt;
&lt;br /&gt;
You can build all of kdebase at once, which is described in the recipe below. If you only want to build kdebase-runtime, which is the only requirement, you can replace &amp;lt;code bash&amp;gt;cd kdebase&amp;lt;/code&amp;gt; with &amp;lt;code bash&amp;gt;cd kdebase/runtime&amp;lt;/code&amp;gt; in the recipe below.&lt;br /&gt;
&lt;br /&gt;
==== The Recipe ====&lt;br /&gt;
 cs KDE # [[Getting_Started/Increased_Productivity_in_KDE4_with_Scripts/.bashrc|'cs' is a bash function, click here to learn more]]&lt;br /&gt;
 svn checkout svn://anonsvn.kde.org/home/kde/trunk/KDE/kdebase&lt;br /&gt;
 cd kdebase&lt;br /&gt;
 cmakekde&lt;br /&gt;
&lt;br /&gt;
==== Troubleshooting ====&lt;br /&gt;
For troubleshooting information, see the [[Getting_Started/Build/KDE4/Troubleshooting#Issues_building_kdebase|kdebase troubleshooting section]].&lt;br /&gt;
&lt;br /&gt;
== Translations ==&lt;br /&gt;
&lt;br /&gt;
Most KDE users are going to install translations before being able to use their desktop properly. Full information is given in the [[Development/Tutorials/Localization/Building_KDE's_l10n_Module|Localisation tutorial]].&lt;br /&gt;
For a single language, the following receipe installs messages and translated documentation:&lt;br /&gt;
&lt;br /&gt;
=== The Recipe ===&lt;br /&gt;
 cs KDE # [[Getting_Started/Increased_Productivity_in_KDE4_with_Scripts/.bashrc|'cs' is a bash function, click here to learn more]]&lt;br /&gt;
 svn checkout -N svn://anonsvn.kde.org/home/kde/trunk/l10n-kde4&lt;br /&gt;
 cd l10n-kde4&lt;br /&gt;
 svn up scripts &amp;lt;language&amp;gt;&lt;br /&gt;
 ./scripts/autogen.sh &amp;lt;language&amp;gt;&lt;br /&gt;
 cd &amp;lt;language&amp;gt;&lt;br /&gt;
 cmakekde&lt;br /&gt;
&lt;br /&gt;
== Running KDE 4 programs ==&lt;br /&gt;
&lt;br /&gt;
You can now run KDE 4 programs (e.g. kwrite) by typing:&lt;br /&gt;
 ssh -X kde-devel@localhost&lt;br /&gt;
 kwrite &lt;br /&gt;
&lt;br /&gt;
=== Troubleshooting ===&lt;br /&gt;
&lt;br /&gt;
For troubleshooting issues see [[Getting_Started/Build/KDE4/Troubleshooting#Running_programs|troubleshooting running programs]].&lt;br /&gt;
&lt;br /&gt;
== Generating local API documentation ==&lt;br /&gt;
&lt;br /&gt;
See the [[Development/Tools/apidox|generating apidox]] page.&lt;br /&gt;
&lt;br /&gt;
== Staying up to date ==&lt;br /&gt;
&lt;br /&gt;
In order to keep the kde4 installation up to date, each of the modules installed should be updated periodically. As Monday is the day for big changes in kdelibs, Tuesday may be the best day to do this. For each module checked out, run &amp;lt;tt&amp;gt;svn up&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;make&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;code bash&amp;gt;&lt;br /&gt;
cs kdesupport # cs is not a typo&lt;br /&gt;
svn up&lt;br /&gt;
cb # cb is not a typo&lt;br /&gt;
make &amp;amp;&amp;amp; make install&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: it is not necessary to run cmakekde for updates.&lt;br /&gt;
&lt;br /&gt;
== Installing a subset of a module ==&lt;br /&gt;
&lt;br /&gt;
Many modules in KDE contain a large number of programs which could take a long time to download and compile. In cases where you want to work only on a particular program or programs in a module, it is possible to download and compile particular folders. In some cases, certain folders are required for any build of the module. This is determined in the CMakeLists.txt file of the module. For example the [http://websvn.kde.org/branches/KDE/4.0/kdegames/CMakeLists.txt?view=markup kdegames CMakeLists.txt file] lists:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
add_subdirectory(libkdegames)&lt;br /&gt;
add_subdirectory(libkmahjongg)&lt;br /&gt;
&lt;br /&gt;
macro_optional_add_subdirectory(doc)&lt;br /&gt;
macro_optional_add_subdirectory(lskat)&lt;br /&gt;
macro_optional_add_subdirectory(katomic)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So, the libkdegames and libkmahjongg directories are required to build any of kdegames. The cmake directory will also usually be required. All the other directories (doc, katomic etc) are optional. They will be built if present on your machine. In this example, we build kmahjongg and kbattleship:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code bash&amp;gt;&lt;br /&gt;
cs KDE&lt;br /&gt;
svn co -N svn://anonsvn.kde.org/home/kde/trunk/KDE/kdegames # The -N switch performs a non-recursive checkout&lt;br /&gt;
cd kdegames&lt;br /&gt;
svn co svn://anonsvn.kde.org/home/kde/trunk/KDE/kdegames/libkdegames # Get required directories&lt;br /&gt;
svn co svn://anonsvn.kde.org/home/kde/trunk/KDE/kdegames/libkmahjongg&lt;br /&gt;
svn co svn://anonsvn.kde.org/home/kde/trunk/KDE/kdegames/cmake&lt;br /&gt;
svn co svn://anonsvn.kde.org/home/kde/trunk/KDE/kdegames/kbattleship # Get optional directories&lt;br /&gt;
svn co svn://anonsvn.kde.org/home/kde/trunk/KDE/kdegames/kmahjongg&lt;br /&gt;
cmakekde &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Success! ==&lt;br /&gt;
&lt;br /&gt;
You are now ready to start building other svn modules in the same fashion as you built kdebase, running and testing KDE4 or writing your own patches and applications.&lt;br /&gt;
&lt;br /&gt;
For further isolation of your development environment change symbolic links, which you will see after executing ls -lh $(kde4-config --localprefix), assuming newly installed kde4-config is called.&lt;br /&gt;
&lt;br /&gt;
See the [[Getting Started/Set up KDE 4 for development|Set up KDE 4 for development]] tutorial for how to start KDE 4 applications 