QML and Plasma -> progress()
Marco Martin
notmart at gmail.com
Thu Sep 16 15:11:42 CEST 2010
Hi all,
the status of an AppletScript for writing plasmoids in pure QML is progressing
rather well, i thought to write a detailed status report/documentation before
significative design problems go too far in the implementation, be patient, is
really long, but it can be used as a basis for a future documentation.
* It is now possible to have packages that specify a main qml file, just like
js plasmoids.
* Plasma widgets are binded in the QML language, with the Plasma.* prefix
* QGraphicsLayouts are binded in plasma bindings themselves, it is not going
to be in Qt sadly (but QGraphicsWidget subclasses are starting to work pretty
well with anchors/positioners as well)
* Plasma::Svg and FrameSvg are implemented as QDeclarativeItem subclasses
binded as Svg and FrameSvg. in the future plasma widgets are going to be
reimplemented in QML probably, those will be the classes for theming
To use QML in Plasma there are 2 ways:
* Plasma::QMLWidget -> i a qgraphicswidget that loads a qml file in it, and
keeps the context/engine/etc, it shortens an otherwise long and repetitive
task of loding qml files with eventiual parse error management, to be used in
c++ plasmoids, where complex logic is needed.
* QML AppletScript: to write applets completely in QML, (uses a QMLWidget
internally)
* only pure qml applets will have access to the "plasmoid" object? (or, the
plasmoid object could be registered from QMLWidget, only when it is actually
descendent of an Applet, but it would have to be in libplasma, instead of in
workspace/runtime)
* Package: as in js bindings the package name resolution is accessible from
plasmoid.file()
* Theme: defining a Plasma.Theme{} element in qml will obtain an object with
the Plasma colors as properties -> should be an object always registered to
the root context instead? maybe by QMLWidget itself so it is always
accessible?
* DataEngine: a Plasma.DataSource{} object can be defined in QML, this
connects to a single dataengine source, das the source, dataengine and
interval properties. its Data property is a QDeclarativePropertyMap, that maps
perfectly DataEngine::Data (but is a qobject, so it can notify all properties
that change) to access the time of the tiime dataengine one can do:
dataSource.data.time .
This can be used from both qml plasmoids or outside. I'm not completely
sure it's the right approach, alternatively in the dataUpdated of the
AppletScript QDeclarativePropertyMaps named as something like
dataengine+source could be assigned to the root context, connections would be
done in the oncomplete{} slot of qml items. uhm... in the end i think i'll
leave the DataSource approach.
* Service: still to be defined, if Plasma.DataSource is the right way to go,
it could have a service() method that would essentially call serviceForSource,
then bindings for kconfig would be needed, but this part is still fggy to me.
* Something else forgotten?
Here is the status of the support to Applet properties and methods:
== Methods that the ql applets should be able to reimplement: ==
* paintInterface -> no, no access to qpainters here (and was quickly becoming
deprecated anyways)
* constraintsEvent -> formfactor, location, immutable and currentActivity
become notifying properties -> property binding
* dataUpdated: DataSource qml item: alternative is to set a
QDeclarativePropertyMap on dataupdated -> but would be good to use it also in
c++ plasmoids
* configChanged() -> qml applet reimplements configChanged() function in root
Item
* popupEvent() -> qml applet reimplements popupEvent() function in the root
Item
== Plasmoid functions/properties ==
Unique "plasmoid" oject registered in the root context
shamelessy copied from the js bindings has the following stuff:
--properties (AppletInterface):
* aspectRatioMode
* formFactor NORIFY formFactorChanged()
* location NOTIFY locationChanged()
* currentActivity NOTIFY contextChanged()
* shouldConserveResources
* activeConfig
* busy
* backgroundHints
* immutable NOTIFY immutableChanged()
* userConfiguring
* apiVersion CONSTANT
* rect
* size
--properties (PopupAplletInterface):
* popupIcon -> needs QIcon bindings for QML
* passivePopup
* popupWidget -> is it useful there?
Should all properties that are not CONSTANT have a NOTIFY signal? that is
needed for qml property binding.
--methods (AppletInterface):
* void setFailedToLaunch(bool failed, const QString &reason = QString())
* void setConfigurationRequired(bool needsConfiguring, const QString &reason =
QString())
* void setAction(const QString &name, const QString &text,
const QString &icon = QString(), const QString &shortcut =
QString());
* void removeAction(const QString &name);
* void resize(qreal w, qreal h);
* void setMinimumSize(qreal w, qreal h);
* void setPreferredSize(qreal w, qreal h);
* QVariant readConfig(const QString &entry) const;
* void writeConfig(const QString &entry, const QVariant &value);
* QString file(const QString &fileType); -> qml already can read files only
from subdirectories of the main script, i still prefer package even tough
could package return paths unreadable from QML?
* QString file(const QString &fileType, const QString &filePath);
* QObject *findChild(const QString &name) const -> useless?
* Plasma::Extender *extender() const; -> won't be possible to do much with
extenders: to set extenderitems in QML should be possible to have qml items
out of the root object i think (and only a single root is possible)
--methods (PopupAppletInterface slots):
* void setPopupIconByName(const QString &name);
* void togglePopup();
* void hidePopup();
* void showPopup();
Cheers,
Marco Martin
More information about the Plasma-devel
mailing list