Plasma/libplasma2: Difference between revisions
< Plasma
(update scriptengine tasks) |
|||
(38 intermediate revisions by 6 users not shown) | |||
Line 3: | Line 3: | ||
This page is dedicated to planning of the libplasma2. | This page is dedicated to planning of the libplasma2. | ||
libplasma2 will be binary and source incompatible with the current libplasma. This means that we can fix some issues that are currently present in plasma's design. | libplasma2 will be binary and source incompatible with the current libplasma. This means that we can fix some issues that are currently present in plasma's design. Any changes that affect the source compatibility must be documented [[Plasma/PortingTolibplasma2|here]] | ||
Enter the issues you wish fixed in the following form: | Enter the issues you wish fixed in the following form: | ||
Line 21: | Line 21: | ||
| http://mail.kde.org/pipermail/plasma-devel/2010-October | | http://mail.kde.org/pipermail/plasma-devel/2010-October | ||
|- | |- | ||
|} | |||
= General TODOs = | |||
{| class="sortable" border="1" cellpadding="4" cellspacing="0" style="border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;" | |||
|- style="background: #ececec; white-space:nowrap;" | |||
! Status !! Name !! Summary !! Developer | |||
{{FeatureProjectDone | |||
| Fix plasmoidpackagetest | |||
| plasmoidpackagetest currently does not build due to missing KIO, etc. API. Port away from KIO and friends to Qt equivalents and get it pass again. | |||
|[email protected]|foodev | |||
}} | |||
{{FeatureProjectTodo | |||
| Signing | |||
| Integrate Signing classes with Package; put Signing class in a thread, potentially make it private API. Current is in staging directory. | |||
|[email protected]|aseigo | |||
}} | |||
|} | |} | ||
Line 41: | Line 61: | ||
}} | }} | ||
{{ | {{FeatureProjectDone | ||
| [[Plasma/libplasma2/dataengineconsumerapi |DataEngineConsumer public API]] | | [[Plasma/libplasma2/dataengineconsumerapi |DataEngineConsumer public API]] | ||
| Right now it is a bit too easy to make mistakes with using DataEngines outside of the normal consumers (Applet, Wallpaper, etc.). This is because DataEngineManager exposes the reference counting details as public API. | | Right now it is a bit too easy to make mistakes with using DataEngines outside of the normal consumers (Applet, Wallpaper, etc.). This is because DataEngineManager exposes the reference counting details as public API. | ||
| | |aseigo@kde.org|aseigo | ||
}} | }} | ||
{{ | {{FeatureProjectDone | ||
| [[Plasma/libplasma2/refactorpackageclasses |Refactor Package* Classes]] | | [[Plasma/libplasma2/refactorpackageclasses |Refactor Package* Classes]] | ||
| PackageMetaData is a relatively thin and inefficient wrapper around KDesktopFile. It's used rarely and doesn't serve a clear purpose. PackageStructure is a relatively static class that combines both a method for getting new packages as well as a description of the underlying package. | | PackageMetaData is a relatively thin and inefficient wrapper around KDesktopFile. It's used rarely and doesn't serve a clear purpose. PackageStructure is a relatively static class that combines both a method for getting new packages as well as a description of the underlying package. | ||
| | |aseigo@kde.org|aseigo | ||
}} | }} | ||
{{ | {{FeatureProjectDone | ||
| [[Plasma/libplasma2/asyncstructureinstallpackage |PackageStructure::installPackage should be async]] | | [[Plasma/libplasma2/asyncstructureinstallpackage |PackageStructure::installPackage should be async]] | ||
| Package::installPackage is current synchronous, which prevents running it in another thread, doing user interaction (e.g. to confirm other dependencies to download) or taking additional actions such as downloads. | | Package::installPackage is current synchronous, which prevents running it in another thread, doing user interaction (e.g. to confirm other dependencies to download) or taking additional actions such as downloads. | ||
| | |sebas@kde.org|Sebastian Kügler | ||
}} | }} | ||
{{FeatureProjectTodo | {{FeatureProjectTodo | ||
| [[Plasma/libplasma2/ | | [[Plasma/libplasma2/dataengineimplicitlyshared |Make DataEngine implicitly shared]] | ||
| | | We pass DataEngines around as pointers, which makes them vulnerable to all the usual pointer-related issues: crashes, accidental deletions, etc. | ||
|[email protected]|Jhon Doe | |[email protected]|Jhon Doe | ||
}} | }} | ||
{{FeatureProjectTodo | {{FeatureProjectTodo | ||
| [[Plasma/libplasma2/ | | [[Plasma/libplasma2/outofprocessdataengines |Out of process DataEngines]] | ||
| | | Out of process DataEngines | ||
|[email protected]|Jhon Doe | |[email protected]|Jhon Doe | ||
}} | }} | ||
{{ | {{FeatureProjectDone | ||
| [[Plasma/libplasma2/modellikedataengines |More model-like dataengines]] | | [[Plasma/libplasma2/modellikedataengines |More model-like dataengines]] | ||
| Many dataengines return data as series of items: like rss, microblog and tasks, and they do in different ways, rss has a list of Data in a single key, microblog has an item per key, tasks has an item per source. | | Many dataengines return data as series of items: like rss, microblog and tasks, and they do in different ways, rss has a list of Data in a single key, microblog has an item per key, tasks has an item per source. | ||
Line 114: | Line 122: | ||
}} | }} | ||
{{ | {{FeatureProjectDone | ||
| [[Plasma/libplasma2/wallpaperdrophandling | Wallpaper drop handling]] | | [[Plasma/libplasma2/wallpaperdrophandling | Wallpaper drop handling]] | ||
| We now have two ways to note that a URL has been added to a wallpaper via external means: urlDropped(KUrl) and setUrls(KUrl::List). | | We now have two ways to note that a URL has been added to a wallpaper via external means: urlDropped(KUrl) and setUrls(KUrl::List). | ||
Line 120: | Line 128: | ||
}} | }} | ||
{{ | {{FeatureProjectDone | ||
| [[Plasma/libplasma2/appletdestroyed | Applet::appletDestroyed signal poorly named]] | | [[Plasma/libplasma2/appletdestroyed | Applet::appletDestroyed signal poorly named]] | ||
| appletDestroyed is emitted in ~Applet, but this can happen even if it isn't "destroyed" but just deleted. Despite its name, appletDestroyed has nothing to do with Applet::destroy() and Applet::destroyed() | | appletDestroyed is emitted in ~Applet, but this can happen even if it isn't "destroyed" but just deleted. Despite its name, appletDestroyed has nothing to do with Applet::destroy() and Applet::destroyed() | ||
| | |kok3rs@kde.org|Antonis Tsiapaliokas | ||
}} | }} | ||
{{ | {{FeatureProjectDone | ||
| [[Plasma/libplasma2/svgsetimagepath | Svg::setImagePath is not virtual]] | | [[Plasma/libplasma2/svgsetimagepath | Svg::setImagePath is not virtual]] | ||
| FrameSvg (and potentially other subclasses of Svg) need to take action when the image path is changed. setImagePath is not virtual nor does it call any internal virtuals. This has resulted in a necessary but unfortunate hack in Svg::setImagePath specifically for FrameSvg. | | FrameSvg (and potentially other subclasses of Svg) need to take action when the image path is changed. setImagePath is not virtual nor does it call any internal virtuals. This has resulted in a necessary but unfortunate hack in Svg::setImagePath specifically for FrameSvg. | ||
| | |aseigo@kde.org|Aaron Seigo | ||
}} | }} | ||
{{ | {{FeatureProjectDone | ||
| [[Plasma/libplasma2/mergeextendersetgroupmethods | Merge ExtenderItem::setGroup methods]] | | [[Plasma/libplasma2/mergeextendersetgroupmethods | Merge ExtenderItem::setGroup methods]] | ||
| There are multiple setGroup methods in ExtenderItem, which could be merged into one method with suitable default parameters. | | There are multiple setGroup methods in ExtenderItem, which could be merged into one method with suitable default parameters. | ||
Line 138: | Line 146: | ||
}} | }} | ||
{{ | {{FeatureProjectDone | ||
| [[Plasma/libplasma2/findcachemethods | Merge Theme::findInCache methods]] | | [[Plasma/libplasma2/findcachemethods | Merge Theme::findInCache methods]] | ||
| There are multiple findInCache methods in Theme, which could be merged into one method with suitable default parameters. | | There are multiple findInCache methods in Theme, which could be merged into one method with suitable default parameters. | ||
Line 144: | Line 152: | ||
}} | }} | ||
{{ | {{FeatureProjectDone | ||
| [[Plasma/libplasma2/dialognotconstgraphicswidget | Dialog::graphicsWidget() is not const]] | | [[Plasma/libplasma2/dialognotconstgraphicswidget | Dialog::graphicsWidget() is not const]] | ||
| As a simple getter, graphicsWidget() should be const. | | As a simple getter, graphicsWidget() should be const. | ||
Line 150: | Line 158: | ||
}} | }} | ||
{{ | {{FeatureProjectDone | ||
| [[Plasma/libplasma2/wallpaperprotecteddatamember |Wallpaper has a protected data member]] | | [[Plasma/libplasma2/wallpaperprotecteddatamember |Wallpaper has a protected data member]] | ||
| QList<QAction*> contextActions is not in the dptr. | | QList<QAction*> contextActions is not in the dptr. | ||
| | |aseigo@kde.org|Aaron Seigo | ||
}} | }} | ||
{{ | {{FeatureProjectDone | ||
| [[Plasma/libplasma2/abstracttoolusevirtuals |Use virtuals instead of slots in AbstractToolBox]] | | [[Plasma/libplasma2/abstracttoolusevirtuals |Use virtuals instead of slots in AbstractToolBox]] | ||
| There are three slots in AbstractToolBox that really ought to be virtuals: restore, save and reposition. They are currently QMetaObject::invoke()'d instead. | | There are three slots in AbstractToolBox that really ought to be virtuals: restore, save and reposition. They are currently QMetaObject::invoke()'d instead. | ||
Line 162: | Line 170: | ||
}} | }} | ||
{{ | {{FeatureProjectDone | ||
| [[Plasma/libplasma2/duplicatedisbusy |isBusy Q_PROPERTY duplicate in Applet]] | | [[Plasma/libplasma2/duplicatedisbusy |isBusy Q_PROPERTY duplicate in Applet]] | ||
| There are two "busy" Q_PROPERTY entries defined in Applet: isBusy and busy. The latter is the correct frm. | | There are two "busy" Q_PROPERTY entries defined in Applet: isBusy and busy. The latter is the correct frm. | ||
Line 174: | Line 182: | ||
}} | }} | ||
{{ | {{FeatureProjectDone | ||
| [[Plasma/libplasma2/fullyqualifiedtype |Applet::messageButtonPressed should pass the fully qualified type]] | | [[Plasma/libplasma2/fullyqualifiedtype |Applet::messageButtonPressed should pass the fully qualified type]] | ||
| Applet has a signal void messageButtonPressed(const MessageButton button). Since moc does a string comparison in connect, trying to connect it to a slot that takes "Plasma::MessageButton" will not work because "MessageButton" nq "Plasma::MessageButton" | | Applet has a signal void messageButtonPressed(const MessageButton button). Since moc does a string comparison in connect, trying to connect it to a slot that takes "Plasma::MessageButton" will not work because "MessageButton" nq "Plasma::MessageButton" | ||
| | |aseigo@kde.org|Aaron Seigo | ||
}} | }} | ||
{{ | {{FeatureProjectDone | ||
| [[Plasma/libplasma2/abstractrunnermimedata |AbstractRunner::mimeDataForMatch]] | | [[Plasma/libplasma2/abstractrunnermimedata |AbstractRunner::mimeDataForMatch]] | ||
| mimeDataForMatch is a slot due to BC. | | mimeDataForMatch is a slot due to BC. | ||
Line 186: | Line 194: | ||
}} | }} | ||
{{ | {{FeatureProjectDone | ||
| [[Plasma/libplasma2/setwallpaperpath |Add const setWallpaperPath]] | | [[Plasma/libplasma2/setwallpaperpath |Add const setWallpaperPath]] | ||
| Add a function to Plasma::Wallpaper as virtual setWallpaperPath(const KUrl &url) | | Add a function to Plasma::Wallpaper as virtual setWallpaperPath(const KUrl &url) | ||
| | |terietor@gmail.com|Giorgos Tsiapaliokas | ||
}} | }} | ||
{{ | {{FeatureProjectDone | ||
| [[Plasma/libplasma2/privateun-install |un/installPackage should be private]] | | [[Plasma/libplasma2/privateun-install |un/installPackage should be private]] | ||
| Both methods are static members of the public API, though all install/uninstall calls should be done through PackageStructure | | Both methods are static members of the public API, though all install/uninstall calls should be done through PackageStructure | ||
| | |sebas@kde.org|Sebastian Kügler | ||
}} | }} | ||
{{ | {{FeatureProjectDone | ||
| [[Plasma/libplasma2/removecontextinfo |Remove context info classes]] | | [[Plasma/libplasma2/removecontextinfo |Remove context info classes]] | ||
| The classes are unused, and are not working. All data they provide can be accessible via data engines | | The classes are unused, and are not working. All data they provide can be accessible via data engines | ||
Line 204: | Line 212: | ||
}} | }} | ||
|} | |} | ||
Line 217: | Line 220: | ||
! Status !! Name !! Summary !! Developer | ! Status !! Name !! Summary !! Developer | ||
{{ | {{FeatureProjectDone | ||
| [[Plasma/libplasma2/migratetoqtcomponents | Migrate widgets to QtComponents, drop current libplasma widgets]] | | [[Plasma/libplasma2/migratetoqtcomponents | Migrate widgets to QtComponents, drop current libplasma widgets]] | ||
| QML allows faster UI creation compared to old widgets, Scene-graph doesn't support QGraphicsWidget | | QML allows faster UI creation compared to old widgets, Scene-graph doesn't support QGraphicsWidget | ||
| | |mart@kde.org|Marco Martin | ||
}} | }} | ||
{{ | {{FeatureProjectDone | ||
| [[Plasma/libplasma2/coronscenebookeeper | Port Corona away from QGV]] | | [[Plasma/libplasma2/coronscenebookeeper | Port Corona away from QGV]] | ||
| Change Corona from a QGraphicsScene to being a (singleton) scene bookeeper, In Scene-graph there is an 1:1 association scene:view | | Change Corona from a QGraphicsScene to being a (singleton) scene bookeeper, In Scene-graph there is an 1:1 association scene:view | ||
| | |mart@kde.org|Marco Martin | ||
}} | }} | ||
{{ | {{FeatureProjectDone | ||
| [[Plasma/libplasma2/appletsansgraphicsitem|Applet no more a GraphicsItem]] | | [[Plasma/libplasma2/appletsansgraphicsitem|Applet no more a GraphicsItem]] | ||
| Right now Applet is a QGraphicsWidget that can optionally include a QML root element (with its declarative engine), mixing QGraphicsWidgets and QDeclarativeItems, nd maybe creatng unneded items. | | Right now Applet is a QGraphicsWidget that can optionally include a QML root element (with its declarative engine), mixing QGraphicsWidgets and QDeclarativeItems, nd maybe creatng unneded items. | ||
| | |mart@kde.org|Marco Martin | ||
}} | |||
{{FeatureProjectDone | |||
| A shell that is based on scene graph | |||
| Write a single shell based on scene graph. | |||
|[email protected]|Marco Martin | |||
}} | |||
{{FeatureProjectDone | |||
| Port QML scriptengine to qml2 | |||
| The QML scriptengine should create the QQuickItems corresponding to containments and applets, parsing the qml in their packages | |||
|[email protected]|Marco Martin | |||
}} | |||
{{FeatureProjectDone | |||
| Port QML scriptengine away from QScriptEngine | |||
| QML2 doesn't have QScriptEngine. It must either use only the declarative engine (means everything is qobject) or use directly V8 | |||
|[email protected]|Marco Martin | |||
}} | }} | ||
{{ | {{FeatureProjectDone | ||
| [[Plasma/libplasma2/libplasmanographicsbakends|libplasma not depending on graphics backends]] | | [[Plasma/libplasma2/libplasmanographicsbakends|libplasma not depending on graphics backends]] | ||
| The above issue suggests that libplasma could not depend anymore neither from QGraphicsView or SceneGraph. | | The above issue suggests that libplasma could not depend anymore neither from QGraphicsView or SceneGraph. |
Latest revision as of 23:36, 29 January 2014
Summary
This page is dedicated to planning of the libplasma2.
libplasma2 will be binary and source incompatible with the current libplasma. This means that we can fix some issues that are currently present in plasma's design. Any changes that affect the source compatibility must be documented here
Enter the issues you wish fixed in the following form:
Idea: | Change libplasma2 |
---|---|
Summary: | We have a chance to change stuff now |
Proposed solution: | We change things |
Discussion: | http://mail.kde.org/pipermail/plasma-devel/2010-October |
General TODOs
Status | Name | Summary | Developer |
---|---|---|---|
DONE | Fix plasmoidpackagetest | plasmoidpackagetest currently does not build due to missing KIO, etc. API. Port away from KIO and friends to Qt equivalents and get it pass again. | <[email protected]>
|
TODO | Signing | Integrate Signing classes with Package; put Signing class in a thread, potentially make it private API. Current is in staging directory. | <[email protected]>
|
Design Issues
Status | Name | Summary | Developer |
---|---|---|---|
DONE | ServiceJob is autostarted | ServiceJob is connected to a zero timer in Service::startOperationCall. If exec() is called on the job and it doesn't finish immediately, then the event loop will be start and the timer will fire causing start() to be called a second time. | <[email protected]>
|
TODO | Fewer friend classes | Look at all friend relationships and see how many can be removed now due to evolution of libplasma itself or clever new approaches to the old problem. Public API clarity and cleanliness must not be sacrificed, however. Internal ugliness is better than external ugliness. | <[email protected]>
|
DONE | DataEngineConsumer public API | Right now it is a bit too easy to make mistakes with using DataEngines outside of the normal consumers (Applet, Wallpaper, etc.). This is because DataEngineManager exposes the reference counting details as public API. | <[email protected]>
|
DONE | Refactor Package* Classes | PackageMetaData is a relatively thin and inefficient wrapper around KDesktopFile. It's used rarely and doesn't serve a clear purpose. PackageStructure is a relatively static class that combines both a method for getting new packages as well as a description of the underlying package. | <[email protected]>
|
DONE | PackageStructure::installPackage should be async | Package::installPackage is current synchronous, which prevents running it in another thread, doing user interaction (e.g. to confirm other dependencies to download) or taking additional actions such as downloads. | <[email protected]>
|
TODO | Make DataEngine implicitly shared | We pass DataEngines around as pointers, which makes them vulnerable to all the usual pointer-related issues: crashes, accidental deletions, etc. | <[email protected]>
|
TODO | Out of process DataEngines | Out of process DataEngines | <[email protected]>
|
DONE | More model-like dataengines | Many dataengines return data as series of items: like rss, microblog and tasks, and they do in different ways, rss has a list of Data in a single key, microblog has an item per key, tasks has an item per source. | <[email protected]>
|
TODO | Lazy dataengine evaluation | The problem with the current DE implementation (QVariants) is that data is kept in memory even if the user didn't request it. (for example, some engine could keep a pixmap ready for a data item, although the applet only wants the title. | <[email protected]>
|
API Issues
Status | Name | Summary | Developer |
---|---|---|---|
DONE | Remove unimplemented virtual methods | In various places there are virtual methods which were re-implemented, but then later had the implementation removed, but for binary compatibility reasons the method itself has to remain. | <[email protected]>
|
DONE | [mM]imetype -> [mM]imeType | Everywhere else in KDE/Qt API it is "MimeType" | <[email protected]>
|
DONE | Wallpaper drop handling | We now have two ways to note that a URL has been added to a wallpaper via external means: urlDropped(KUrl) and setUrls(KUrl::List). | <[email protected]>
|
DONE | Applet::appletDestroyed signal poorly named | appletDestroyed is emitted in ~Applet, but this can happen even if it isn't "destroyed" but just deleted. Despite its name, appletDestroyed has nothing to do with Applet::destroy() and Applet::destroyed() | <[email protected]>
|
DONE | Svg::setImagePath is not virtual | FrameSvg (and potentially other subclasses of Svg) need to take action when the image path is changed. setImagePath is not virtual nor does it call any internal virtuals. This has resulted in a necessary but unfortunate hack in Svg::setImagePath specifically for FrameSvg. | <[email protected]>
|
DONE | Merge ExtenderItem::setGroup methods | There are multiple setGroup methods in ExtenderItem, which could be merged into one method with suitable default parameters. | <[email protected]>
|
DONE | Merge Theme::findInCache methods | There are multiple findInCache methods in Theme, which could be merged into one method with suitable default parameters. | <[email protected]>
|
DONE | Dialog::graphicsWidget() is not const | As a simple getter, graphicsWidget() should be const. | <[email protected]>
|
DONE | Wallpaper has a protected data member | QList<QAction*> contextActions is not in the dptr. | <[email protected]>
|
DONE | Use virtuals instead of slots in AbstractToolBox | There are three slots in AbstractToolBox that really ought to be virtuals: restore, save and reposition. They are currently QMetaObject::invoke()'d instead. | <[email protected]>
|
DONE | isBusy Q_PROPERTY duplicate in Applet | There are two "busy" Q_PROPERTY entries defined in Applet: isBusy and busy. The latter is the correct frm. | <[email protected]>
|
DONE | Applet::geometryChanged() superfluous now | QGraphicsWidget has a geometryChanged() signal now, it is only kept in Applet to preserve binary compatibility. | <[email protected]>
|
DONE | Applet::messageButtonPressed should pass the fully qualified type | Applet has a signal void messageButtonPressed(const MessageButton button). Since moc does a string comparison in connect, trying to connect it to a slot that takes "Plasma::MessageButton" will not work because "MessageButton" nq "Plasma::MessageButton" | <[email protected]>
|
DONE | AbstractRunner::mimeDataForMatch | mimeDataForMatch is a slot due to BC. | <[email protected]>
|
DONE | Add const setWallpaperPath | Add a function to Plasma::Wallpaper as virtual setWallpaperPath(const KUrl &url) | <[email protected]>
|
DONE | un/installPackage should be private | Both methods are static members of the public API, though all install/uninstall calls should be done through PackageStructure | <[email protected]>
|
DONE | Remove context info classes | The classes are unused, and are not working. All data they provide can be accessible via data engines | <[email protected]>
|
QGraphicsView vs QML2
Status | Name | Summary | Developer |
---|---|---|---|
DONE | Migrate widgets to QtComponents, drop current libplasma widgets | QML allows faster UI creation compared to old widgets, Scene-graph doesn't support QGraphicsWidget | <[email protected]>
|
DONE | Port Corona away from QGV | Change Corona from a QGraphicsScene to being a (singleton) scene bookeeper, In Scene-graph there is an 1:1 association scene:view | <[email protected]>
|
DONE | Applet no more a GraphicsItem | Right now Applet is a QGraphicsWidget that can optionally include a QML root element (with its declarative engine), mixing QGraphicsWidgets and QDeclarativeItems, nd maybe creatng unneded items. | <[email protected]>
|
DONE | A shell that is based on scene graph | Write a single shell based on scene graph. | <[email protected]>
|
DONE | Port QML scriptengine to qml2 | The QML scriptengine should create the QQuickItems corresponding to containments and applets, parsing the qml in their packages | <[email protected]>
|
DONE | Port QML scriptengine away from QScriptEngine | QML2 doesn't have QScriptEngine. It must either use only the declarative engine (means everything is qobject) or use directly V8 | <[email protected]>
|
DONE | libplasma not depending on graphics backends | The above issue suggests that libplasma could not depend anymore neither from QGraphicsView or SceneGraph. | <[email protected]>
|