diff --git a/lib/QMapControl/src/mapcontrol.cpp b/lib/QMapControl/src/mapcontrol.cpp index 8090c742ee8a356a72c3973ea45c2b9c7617daee..57df98b7d7dee8d76cec73190b4fb34544e36696 100644 --- a/lib/QMapControl/src/mapcontrol.cpp +++ b/lib/QMapControl/src/mapcontrol.cpp @@ -27,7 +27,7 @@ namespace qmapcontrol { MapControl::MapControl(QSize size, MouseMode mousemode) - : size(size), mymousemode(mousemode), scaleVisible(false) + : size(size), mymousemode(mousemode), scaleVisible(false), cursorPosVisible(false) { layermanager = new LayerManager(this, size); screen_middle = QPoint(size.width()/2, size.height()/2); @@ -41,6 +41,9 @@ namespace qmapcontrol this, SLOT(loadingFinished())); this->setMaximumSize(size.width()+1, size.height()+1); + + distanceList<<5000000<<2000000<<1000000<<1000000<<1000000<<100000<<100000<<50000<<50000<<10000<<10000<<10000<<1000<<1000<<500<<200<<100<<50<<25; + } MapControl::~MapControl() @@ -127,6 +130,8 @@ namespace qmapcontrol { QWidget::paintEvent(evnt); QPainter painter(this); + double line; + // painter.translate(150,190); // painter.scale(0.5,0.5); @@ -150,11 +155,8 @@ namespace qmapcontrol // draw scale if (scaleVisible) { - QList distanceList; - distanceList<<5000000<<2000000<<1000000<<1000000<<1000000<<100000<<100000<<50000<<50000<<10000<<10000<<10000<<1000<<1000<<500<<200<<100<<50<<25; if (currentZoom() >= 0 && distanceList.size() > currentZoom()) { - double line; line = distanceList.at( currentZoom() ) / pow(2, 18-currentZoom() ) / 0.597164; // draw the scale @@ -199,12 +201,25 @@ namespace qmapcontrol //qt = painter.transform(); qm = painter.combinedMatrix(); */ - if (mousepressed && mymousemode == Dragging) { QRect rect = QRect(pre_click_px, current_mouse_pos); painter.drawRect(rect); } + + + // Draw the Lat and Lon if needed + if (cursorPosVisible) { + line = distanceList.at( currentZoom() ) / pow(2, 18-currentZoom() ) / 0.597164; + + QString str; + str = QString(tr(" Lat: %1")).arg(currentWorldCoordinate.y()); + painter.drawText(QPoint((int)line+70,size.height()-15), str); + + str = QString(tr(" Lon: %1")).arg(currentWorldCoordinate.x()); + painter.drawText(QPoint((int)line+160,size.height()-15), str); + } + emit viewChanged(currentCoordinate(), currentZoom()); } @@ -256,7 +271,8 @@ namespace qmapcontrol void MapControl::mouseMoveEvent(QMouseEvent* evnt) { - // emit(mouseEvent(evnt)); + emit(mouseEvent(evnt)); + /* // rotating @@ -275,8 +291,13 @@ namespace qmapcontrol } // emit(mouseEventCoordinate(evnt, clickToWorldCoordinate(evnt->pos()))); - update(); - // emit(mouseEventCoordinate(evnt, clickToWorldCoordinate(evnt->pos()))); + currentWorldCoordinate = clickToWorldCoordinate(evnt->pos()); + + emit(mouseMoveCoordinateEvent(currentWorldCoordinate)); + + update(); + + //emit(mouseEventCoordinate(evnt, clickToWorldCoordinate(evnt->pos()))); } QPointF MapControl::clickToWorldCoordinate(QPoint click) @@ -403,6 +424,11 @@ namespace qmapcontrol scaleVisible = show; } + void MapControl::showCoord(bool show) + { + cursorPosVisible = show; + } + void MapControl::resize(const QSize newSize) { this->size = newSize; diff --git a/lib/QMapControl/src/mapcontrol.h b/lib/QMapControl/src/mapcontrol.h index a730770ab43f809b7c43d1da7d0e294a08bffe14..d0d434e1bbe3bdb1a86787b1c149982ddcaf458b 100644 --- a/lib/QMapControl/src/mapcontrol.h +++ b/lib/QMapControl/src/mapcontrol.h @@ -214,6 +214,14 @@ namespace qmapcontrol */ void showScale ( bool show ); + + //! Displays the Lat and Lon within the widget + /*! + * + * @param show true if Lat and Lon should be displayed + */ + void showCoord ( bool show ); + private: LayerManager* layermanager; QPoint screen_middle; // middle of the widget (half size) @@ -223,9 +231,14 @@ namespace qmapcontrol QSize size; // size of the widget + QPointF currentWorldCoordinate; // updated by mouseMove + + QList distanceList; + bool mousepressed; MouseMode mymousemode; bool scaleVisible; + bool cursorPosVisible; bool m_loadingFlag; @@ -244,7 +257,7 @@ namespace qmapcontrol void mouseMoveEvent ( QMouseEvent* evnt ); signals: - // void mouseEvent(const QMouseEvent* evnt); + void mouseEvent(const QMouseEvent* evnt); //! Emitted AFTER a MouseEvent occured /*! @@ -256,6 +269,15 @@ namespace qmapcontrol */ void mouseEventCoordinate ( const QMouseEvent* evnt, const QPointF coordinate ); + //! Emitted on mouse move generating + /*! + * This signals allows to receive the mouse position in the world coordinate. + * It is emitted on mouseMoveEvents. + * setMouseTracking must be set programatically to have this method work. + * @param coordinate the corresponding world coordinate + */ + void mouseMoveCoordinateEvent(const QPointF coordinate); + //! Emitted, after a Rectangular is dragged. /*! * It is possible to select a rectangular area in the map, if the MouseMode is set to Dragging. diff --git a/src/ui/MapWidget.cc b/src/ui/MapWidget.cc index df6e8fd8b954efa8adb0bbf696c3a4232877d118..31ed731edae5b3115eeff43f7c166656432f3439 100644 --- a/src/ui/MapWidget.cc +++ b/src/ui/MapWidget.cc @@ -44,30 +44,26 @@ MapWidget::MapWidget(QWidget *parent) : m_ui(new Ui::MapWidget) { m_ui->setupUi(this); + // Accept focus by clicking or keyboard this->setFocusPolicy(Qt::StrongFocus); // create MapControl mc = new MapControl(QSize(320, 240)); mc->showScale(true); + mc->showCoord(true); mc->enablePersistentCache(); - - //uasIcons = QMap(); - - //QSize(480,640) - // ImageManager::instance()->setProxy("www-cache", 8080); + mc->setMouseTracking(true); // required to update the mouse position for diplay and capture // create MapAdapter to get maps from TileMapAdapter* osmAdapter = new TileMapAdapter("tile.openstreetmap.org", "/%1/%2/%3.png", 256, 0, 17); - //GoogleSatMapAdapter* gSatAdapter = new GoogleSatMapAdapter(); // create a layer with the mapadapter and type MapLayer osmLayer = new Layer("Custom Layer", osmAdapter, Layer::MapLayer); - //Layer* gSatLayer = new Layer("Custom Layer", gSatAdapter, Layer::MapLayer); // add Layer to the MapControl mc->addLayer(osmLayer); - //mc->addLayer(gSatLayer); + mc->setZoom(3); // display the MapControl in the application QHBoxLayout* layout = new QHBoxLayout; @@ -75,40 +71,81 @@ MapWidget::MapWidget(QWidget *parent) : layout->addWidget(mc); setLayout(layout); - // create buttons as controls for zoom + + // create buttons to control the map (zoom, GPS tracking and WP capture) QPushButton* zoomin = new QPushButton(QIcon(":/images/actions/list-add.svg"), "", this); QPushButton* zoomout = new QPushButton(QIcon(":/images/actions/list-remove.svg"), "", this); + createPath = new QPushButton(QIcon(":/images/actions/go-bottom.svg"), "", this); followgps = new QPushButton(QIcon(":/images/actions/system-lock-screen.svg"), "", this); - followgps->setCheckable(true); - // gpsposition = new QLabel(); + zoomin->setMaximumWidth(50); zoomout->setMaximumWidth(50); + createPath->setMaximumWidth(50); followgps->setMaximumWidth(50); - //gpsposition->setFont(QFont("Arial", 10)); - connect(zoomin, SIGNAL(clicked(bool)), - mc, SLOT(zoomIn())); - connect(zoomout, SIGNAL(clicked(bool)), - mc, SLOT(zoomOut())); - // add zoom buttons to the layout of the MapControl + // Set checkable buttons + // TODO: Currently checked buttons are are very difficult to distinguish when checked. + // create a style and the slots to change the background so it is easier to distinguish + followgps->setCheckable(true); + createPath->setCheckable(true); + + + + // add buttons to control the map (zoom, GPS tracking and WP capture) QVBoxLayout* innerlayout = new QVBoxLayout; innerlayout->addWidget(zoomin); innerlayout->addWidget(zoomout); innerlayout->addWidget(followgps); - //innerlayout->addWidget(gpsposition); + innerlayout->addWidget(createPath); mc->setLayout(innerlayout); + + // Connect the required signals-slots + connect(UASManager::instance(), SIGNAL(UASCreated(UASInterface*)), + this, SLOT(addUAS(UASInterface*))); + + connect(mc, SIGNAL(mouseEventCoordinate(const QMouseEvent*, const QPointF)), + this, SLOT(captureMapClick(const QMouseEvent*, const QPointF))); + + connect(createPath, SIGNAL(clicked(bool)), + this, SLOT(createPathButtonClicked())); + + + this->setVisible(false); + + + // Attic (Code that was commented) + // ============================== + //uasIcons = QMap(); + + //QSize(480,640) + // ImageManager::instance()->setProxy("www-cache", 8080); + + //GoogleSatMapAdapter* gSatAdapter = new GoogleSatMapAdapter(); + //Layer* gSatLayer = new Layer("Custom Layer", gSatAdapter, Layer::MapLayer); + //mc->addLayer(gSatLayer); + + // gpsposition = new QLabel(); + //gpsposition->setFont(QFont("Arial", 10)); //GPS_Neo* gm = new GPS_Neo(); //connect(gm, SIGNAL(new_position(float, QPointF)), // this, SLOT(updatePosition(float, QPointF))); //gm->start(); - mc->setZoom(3); +} - connect(UASManager::instance(), SIGNAL(UASCreated(UASInterface*)), this, SLOT(addUAS(UASInterface*))); +void MapWidget::createPathButtonClicked(){ + this->setCursor(createPath->isChecked()? Qt::PointingHandCursor : Qt::ArrowCursor); +} - this->setVisible(false); + +void MapWidget::captureMapClick(const QMouseEvent* event, const QPointF coordinate){ + if (QEvent::MouseButtonRelease == event->type() && createPath->isChecked()){ + qDebug()<< "Click Event"; + qDebug()<< "Lat: " << coordinate.y(); + qDebug()<< "Lon: " << coordinate.x(); + } } MapWidget::~MapWidget() @@ -180,7 +217,7 @@ void MapWidget::updateGlobalPosition(UASInterface* uas, double lat, double lon, // points.append(new Point(8.260378, 50.030345, "Wiesbaden-Mainz-Amoneburg, Dyckerhoffstraße")); // Connect click events of the layer to this object - //connect(osmLayer, SIGNAL(geometryClicked(Geometry*, QPoint)), + // connect(osmLayer, SIGNAL(geometryClicked(Geometry*, QPoint)), // this, SLOT(geometryClicked(Geometry*, QPoint))); // Sets the view to the interesting area diff --git a/src/ui/MapWidget.h b/src/ui/MapWidget.h index f3675e7a56273d58560c2fe7ef85799c582aa747..5718cab40648feec143af3c811317984afa44f41 100644 --- a/src/ui/MapWidget.h +++ b/src/ui/MapWidget.h @@ -60,8 +60,11 @@ protected: void keyPressEvent(QKeyEvent *event); void resizeEvent(QResizeEvent* event); + QPushButton* followgps; + QPushButton* createPath; QLabel* gpsposition; + MapControl* mc; int zoomLevel; int detailZoom; ///< Steps zoomed in further than qMapControl allows @@ -70,13 +73,17 @@ protected: TileMapAdapter* osmAdapter; GoogleSatMapAdapter* gSatAdapter; Layer* osmLayer; - Layer* gSatLayer; + //Layer* gSatLayer; QMap uasIcons; QMap uasTrails; UASInterface* mav; quint64 lastUpdate; + protected slots: + void captureMapClick (const QMouseEvent* event, const QPointF coordinate); + void createPathButtonClicked(); + private: Ui::MapWidget *m_ui; }; diff --git a/src/ui/MapWidget.ui b/src/ui/MapWidget.ui index 8f6635903636914b169db9760040bafa8788034a..e9521cb4a3369b5bf76a6125b26162ba7ea51d55 100644 --- a/src/ui/MapWidget.ui +++ b/src/ui/MapWidget.ui @@ -10,6 +10,12 @@ 300 + + ArrowCursor + + + true + Form