diff options
Diffstat (limited to 'examples/map3d/tileview.cpp')
-rw-r--r-- | examples/map3d/tileview.cpp | 254 |
1 files changed, 254 insertions, 0 deletions
diff --git a/examples/map3d/tileview.cpp b/examples/map3d/tileview.cpp new file mode 100644 index 00000000..48ddd9ff --- /dev/null +++ b/examples/map3d/tileview.cpp @@ -0,0 +1,254 @@ +#include "tileview.h" + +#include "tilecache.h" +#include "tile.h" +#include "cameradata.h" +#include "mapitem.h" + +#include "qgeocoordinate.h" + +#include "qgeoserviceprovider.h" +#include "qgeomappingmanager.h" + +#include <qglscenenode.h> +#include <qglbuilder.h> +#include <qgeometrydata.h> + +#include <QApplication> +#include <QKeyEvent> +#include <QTimer> + +#include <QColor> + +#include <QPropertyAnimation> + +#include <cmath> + +#include <QDebug> + +TileView::TileView(TileCache *tileCache, QWidget *parent) : + QGLView(parent), + tileCache_(tileCache) +{ + serviceProvider_ = new QGeoServiceProvider("nokia"); + map_ = new Map(tileCache, this); + map_->setMappingManager(serviceProvider_->mappingManager()); + map_->setAutoUpdate(false); + + connect(map_, + SIGNAL(updateRequired()), + this, + SLOT(update())); + + setCamera(map_->glCamera()); + + +// MapItem *item1 = new MapItem; +// item1->setCoordinate(QGeoCoordinate(-27, 153)); +// item1->setSize(QSizeF(128, 128)); +// item1->setZoom(5); +// map_->addMapItem(item1); + +// MapItem *item2 = new MapItem; +// item2->setCoordinate(QGeoCoordinate(-27, 153)); +// item2->setSize(QSizeF(128, 128)); +// item2->setAnchor(QPointF(128, 128)); +// item2->setZoom(5); +// map_->addMapItem(item2); + +// MapItem *item3 = new MapItem; +// item3->setCoordinate(QGeoCoordinate(-27, 153)); +// item3->setSize(QSizeF(256.0, 256.0)); +// item3->setAnchor(QPointF(-256.0, -256.0)); +// item3->setZoom(6); +// map_->addMapItem(item3); +} + +TileView::~TileView() +{ + delete serviceProvider_; +} + +Map* TileView::map() +{ + return map_; +} + +void TileView::closeEvent(QCloseEvent *) +{ + qApp->quit(); +} + +void TileView::paintGL(QGLPainter *painter) +{ + map_->paintGL(painter); +// QGLSceneNode *node = map_->sceneNodeForRendering(); +// if (node) { +// node->draw(painter); +// map_->sceneNodeRenderingDone(); +// } +} + +void TileView::showEvent(QShowEvent *) +{ + updateAspectRatio(); +} + +void TileView::resizeEvent(QResizeEvent *event) +{ + QGLView::resizeEvent(event); + updateAspectRatio(); +} + +void TileView::updateAspectRatio() +{ + map_->resize(width(), height()); +} + +void TileView::enterEvent(QEvent *) +{ + setFocus(); + grabKeyboard(); +} + +void TileView::leaveEvent(QEvent *) +{ + releaseKeyboard(); +} + +void TileView::keyPressEvent(QKeyEvent *e) +{ + CameraData cameraData = map_->cameraData(); + if (e->key() == Qt::Key_Left) { + if (e->modifiers() & Qt::ShiftModifier) { + QGeoCoordinate coord = cameraData.center(); + coord.setLongitude(coord.longitude() - 1); + cameraData.setCenter(coord); + } else { + cameraData.setBearing(cameraData.bearing() - 5.0); + } + } else if (e->key() == Qt::Key_Right) { + if (e->modifiers() & Qt::ShiftModifier) { + QGeoCoordinate coord = cameraData.center(); + coord.setLongitude(coord.longitude() + 1); + cameraData.setCenter(coord); + } else { + cameraData.setBearing(cameraData.bearing() + 5.0); + } + } else if (e->key() == Qt::Key_Up) { + if (e->modifiers() & Qt::ShiftModifier) { + QGeoCoordinate coord = cameraData.center(); + coord.setLatitude(coord.latitude() + 1); + cameraData.setCenter(coord); + } else { + cameraData.setTilt(cameraData.tilt() - 5.0); + } + } else if (e->key() == Qt::Key_Down) { + if (e->modifiers() & Qt::ShiftModifier) { + QGeoCoordinate coord = cameraData.center(); + coord.setLatitude(coord.latitude() - 1); + cameraData.setCenter(coord); + } else { + cameraData.setTilt(cameraData.tilt() + 5.0); + } + } else if (e->key() == Qt::Key_Plus) { + if (e->modifiers() & Qt::ShiftModifier) { + cameraData.setDistance(cameraData.distance() / 2.0); + cameraData.setZoomLevel(cameraData.zoomLevel() + 1); + map_->setCameraData(cameraData); + if (!map_->autoUpdate()) + map_->update(); + } else { + cameraData.setDistance(cameraData.distance() / 1.1); + } + } else if (e->key() == Qt::Key_Minus) { + if (e->modifiers() & Qt::ShiftModifier) { + if (cameraData.zoomLevel() != 1) + cameraData.setZoomLevel(cameraData.zoomLevel() - 1); + cameraData.setDistance(cameraData.distance() * 2.0); + map_->setCameraData(cameraData); + if (!map_->autoUpdate()) + map_->update(); + } else { + cameraData.setDistance(cameraData.distance() * 1.1); + } + } else if (e->key() == Qt::Key_U) { + map_->setCameraData(cameraData); + if (!map_->autoUpdate()) + map_->update(); + } + map_->setCameraData(cameraData); + update(); +} + +void TileView::wheelEvent(QWheelEvent *e) +{ + CameraData cameraData = map_->cameraData(); + if (e->delta() > 0) { + if (e->modifiers() & Qt::ShiftModifier) { + cameraData.setDistance(cameraData.distance() / 2.0); + cameraData.setZoomLevel(cameraData.zoomLevel() + 1); + map_->setCameraData(cameraData); + if (!map_->autoUpdate()) + map_->update(); + } else { + cameraData.setDistance(cameraData.distance() / 1.1); + } + } else { + if (e->modifiers() & Qt::ShiftModifier) { + if (cameraData.zoomLevel() != 1) + cameraData.setZoomLevel(cameraData.zoomLevel() - 1); + cameraData.setDistance(cameraData.distance() * 2.0); + map_->setCameraData(cameraData); + if (!map_->autoUpdate()) + map_->update(); + } else { + cameraData.setDistance(cameraData.distance() * 1.1); + } + } + map_->setCameraData(cameraData); + update(); + + e->accept(); +} + +void TileView::mousePressEvent(QMouseEvent *e) +{ + switch (e->button()) { + case Qt::LeftButton: + mousePos_ = e->pos(); +// QGeoCoordinate coord = map_->screenPositionToCoordinate(mousePos_); +// qDebug() << __FUNCTION__ +// << "mousePos " << mousePos_ +// << " -> coord " << coord +// << " -> screen " << map_->coordinateToScreenPosition(coord); + break; + default: + break; + } + e->accept(); +} + +void TileView::mouseReleaseEvent(QMouseEvent *) +{ +} + +void TileView::mouseMoveEvent(QMouseEvent *e) +{ + CameraData cameraData = map_->cameraData(); + + if ((e->buttons() & Qt::LeftButton) == Qt::LeftButton) + { + // Pixel pan support?! + QPoint delta = (mousePos_ - e->pos()) / 50; + + QGeoCoordinate coord = cameraData.center(); + coord.setLatitude(coord.latitude() + delta.y()); + coord.setLongitude(coord.longitude() - delta.x()); + cameraData.setCenter(coord); + + map_->setCameraData(cameraData); + update(); + } + e->accept(); +} |