[Marble-devel] Review Request 124550: QML delegate for displaying search results on top of the map

Dennis Nienhüser dennis at nienhueser.de
Fri Jul 31 14:03:51 UTC 2015


-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://git.reviewboard.kde.org/r/124550/
-----------------------------------------------------------

Review request for Marble.


Repository: marble


Description
-------

Currently we have no (good, easy) way to place a QML item on top of the map and have it stick to a certain geo position. The approach in this patch is taken from the marble-touch app: Any QML code can be assigned to the new placemarkDelegate property of the Search. Similar to a delegate of e.g. a ListView, for any item in the model a QML object is then instantiated from that QML delegate component prototype. Context properties (e.g. index, name, longitude, latitude) are queried from the model and assigned to each instantiated item, and the C++ part takes care of setting the screen position and the visibility of each QML placemark instance.

The QML part e.g. looks like this

    SearchBackend {
        ...
        placemarkDelegate: Image {
            transformOrigin: Item.Bottom
            source: "qrc:/ic_place_black_18dp.png"

            MouseArea {
                anchors.fill: parent
                onClicked: console.log("Clicked on result (" + index + ") " + name + " at (" + longitude.toFixed(6) + ", " + latitude.toFixed(6) + ")")
            }
        }
    }
    
and the maintenance (creation, position+visibility updates, deletion) of the items happens behind the scenes in C++. The result you get is something like this: http://nienhueser.de/marble/android-placemark-delegate.png
![Search result placemark delegates](http://nienhueser.de/marble/android-placemark-delegate.png)

As the delegate code is in QML and context properties are directly available, any sort of interaction can be done very easily. It's not perfect though: Since all rendering is done outside of Marble's rendering, the QML delegates are always rendered on top of every other map items, including float items. For Marble Maps this should be OK though.

You can see a similar thing when starting bin/marble-touch from latest master. The search activity there uses the same approach to display search results and start routing from them (routing is not yet ported in there). The weather activity is quite interesting as well: It uses QML delegates to replace the C++ rendering of a whole plugin layer (weather items) with custom QML delegates.

I don't intend to push the code as-is, rather see it as a base for discussion and possibly further work on top of it.


Diffs
-----

  data/android/drawable-xxxhdpi/ic_place_black_18dp.png PRE-CREATION 
  src/apps/marble-maps/MarbleMaps.qrc d027af9 
  src/apps/marble-maps/Search.qml 896f266 
  src/lib/marble/declarative/SearchBackend.h b041de3 
  src/lib/marble/declarative/SearchBackend.cpp 5c80cc3 

Diff: https://git.reviewboard.kde.org/r/124550/diff/


Testing
-------

Tested on the Nexus 4 and Desktop


Thanks,

Dennis Nienhüser

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.kde.org/pipermail/marble-devel/attachments/20150731/e637861f/attachment.html>


More information about the Marble-devel mailing list