[Qt-qml] Tile map widget

Eduardo Fleury eduardo.fleury at openbossa.org
Thu Sep 30 05:50:19 CEST 2010


On Wed, Sep 29, 2010 at 5:42 PM, Cornelius Hald <hald at icandy.de> wrote:

> Thats a pity...
>
> > Alternative solutions are to either 1) handle mouse events yourself,
> > or 2) use both a map widget _and_ a flickable widget, the latter being
> > used to feed the former with the geometry to be drawn.
>
> I'm currently looking at option 1) but reimplementing the whole kinetic
> scrolling is a bit of a pain :)
>
>
Yep, and besides being a pain, it's code to be maintained. If tomorrow
Flickable gets updated and its kinetic scrolling becomes super snappy, or
some new cool feature is added, you won't get it, and worse, the map thing
will have a (potentially) different scrolling behavior than other parts of
the application that happen to use ListView or Flickable.



> How do you think option 2) could work? I probably can't create a
> flickable in 1:1 map size.


I haven't gone deep into this idea but one idea is to have a Flickable
without anything inside it, but set "contentHeight" and "contentWidth" to
the scrollable size of the map, in the given zoom scale. Then behind it put
the map widget, which I'm assuming will have offsetX and offsetY properties
to define which part of the map should be drawn at a given moment. These two
could then be put together in a wrapper QML item with bindings.

Something like:

------- 8< -------
MapWidget.qml

Item {
    id: root

    MapTiles {
        id: map
        anchors.fill: parent
        xOffset: flickable.contentX
        yOffset: flickable.contentY
    }

    Flickable {
        id: flickable
        anchors.fill: parent
        contentWidth: map.mapWidth   // Size in pixels needed to show the
whole map w/ current scale
        contentHeight: map.mapHeight
    }
}

------- >8 -------

 In the above example:
- MapWidget would be the widget/viewport you use in your application. Could
have a size of, 400x400 pixels for instance.
- MapTiles would be a C++ component able to contact map servers, do tiling,
etc, etc.
  It would provide the size of the current map in the current scale through
the read-only properties mapWidth and mapHeight.
  For instance, the map could be 2000x2000 pixels in 1:1 scale, 1000x1000
pixels in 1:2 scale and so forth. This is used to limit the amount one can
flick the map around.
  It would also use the properties xOffset and yOffset to define which parts
of the map will be drawn. For instance, a 2000x2000 map when centered would
provide offset values of 800x800, which given the size of MapTiles, would
cause the map section (x: 800, y:800, width: 400, height: 400) to be drawn
by MapTiles.

Does that make sense?

BR,
Eduardo

-- 
Eduardo M. Fleury
OpenBossa - INdT
http://eduardofleury.com/
http://www.openbossa.org/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.qt.nokia.com/pipermail/qt-qml/attachments/20100930/496ef50c/attachment.html 


More information about the Qt-qml mailing list