During this week Akademy 2023 is going on in Thessaloniki, Greece. It’s always awesome, to see many old friends and getting together with that amazing hacker community which is KDE.
There, me and Niccolรฒ gave a talk about what;s happening in Plasma 6 and what will change, Noccolรฒ on more visual things, about some changes we are cooking on the UI and on the visual themes. Here you can find a recording of the talk (alongside all the others of the day)
I talked more about the work I’ve bein doing in the Plasma shell during the last couple of months: code rafactors and how the API for writing plasmoids will change.
There were many things we were not quite happy about and now with the major release is the occasion for streamlining many things.
Now, It’s very important those changes are are well communicated, and easy to do for developes, because there are *a lot* of 3rd party plasmoids on the KDE store, which people are using and enjoying.
Let’s go trough the most important changes:
Dataengines
Dataengines were an API designed in early KDE 4 times, especially one of for our first offereings of Plasmoid API which was the pure JavaScript API, which existed long before the QML existed.
But now in a QML world, their API doesn’t really fit, instead is a much better fit having a QML extension which offers classes with all the needed properties, data models and signals that provide access to the needed data, such as tasks, notifications etc.
Dataengines are now deprecated and moved into a separed library, called “plasma5support” which will be still available for the time being, but consider porting away from it as we plan to eventually drop it.
Base Plasmoid API
The way plasmoids are declared in QML changed a bit: we used to have a magical “plasmoid” context property available from anywhere. This was an instance of a QQuickItem which was both the item where all the plasmoid contents were *and* a wrapper for some of the api for the central plasmoid object: the C++ class Plasma::Applet.
Now the access to plasmoid is an attahced property, the (uppercase) “Plasmoid”, which is directly the access to the instance of the central Plasma::Applet, without an in-between wrapper anymore.
The central QQuickItem is now called “PlasmoidItem”, and must be the root item of the plasmoid, just alike ApplicationWindow is for applications.
PlasmoidItem will have the purely graphical properties, such as the “compactRepresentation” or “fullRepresentation”
Here is a very minimal example of a plasmoid main file under plasma6:
import org.kde.plasma.plasmoid 2.0
PlasmoidItem {
Plasmoid.title: i18n("hello")
fullRepresentation: Item {....}
}
Actions
Plasmoids can export actions to their right mouse button menu, such as “mute” for the mixer plasmoid and so on.
In Plasma 5 we had an imperative API to add those actions, which was again coming from that old pure JS API, which really looked a bit out of tune in QML. In Plasma 6 the API has been replaced with a completely declarative API, in this form:
PlasmoidItem {
Plasmoid.contextualActions: [
PlasmaCore.Action {
text: i18n("Foo")
icon.name: "back"
onTriggered: {...}
},
PlasmaCore.Action {
...
}
]
}
PlasmaCore.Action is actually a binding to QAction (not the internal QML action type), so that it can be shared between C++ and QML easily
SVG theming
Plasma Themes don’t really have changed for now (and you can expect any old theme from the store to keep working), but the C++ and QML API for them has been moved to a standalone framework called KSvg. Plasma Svgs have quite some interesting features over the pure QtSvg API, such as disk caching of the rendered images, stylesheet recoloring to system colors and the 9 patch rectangular stretched images of FrameSvg.
Some applications were interested in using that, but couldn’t due to the long dependency chain of plasma-framework, so now they can be used as a much more manageable compact framework, offering both the usual C++, QPainter based api and QML bindings.
import org.kde.ksvg 1.0 as KSvg
FrameSvg {
imagePath: "widgets/background"
}
Kirigami all the way down
Designing Kirigami in the beginning we lifted two concept from the Plasma API (which again we couldn’t use directly due to the dependency chain) Theme and Units
Theme gives access to the named system colors, and Units to standard spacing and animation durations.
Over the years the Kirigami version got way more advanced then the Plasma version, and having this code duplication didn’t make much more sense, to in Plasma6 whenever referring to a named color or an unit, the Kirigami version should be used, as the Plasma version is going away.
import org.kde.kirigami 2.20 as Kirigami
RowLayout {
spacing: Kirigami.Units.smallSpacing
Rectangle {
color: Kirigami.Theme.backgroundColor
bordere.color: Kirigami.Theme.textColor
}
}