Browse Source

Finished scaffolding the graphical addition of WP via the MapWidget. Added the possibility to display the latitude and longitude of the cursor as a property of QMapControl. Major reorganization of the MapWidget constructor

QGC4.4
Mariano Lizarraga 15 years ago
parent
commit
2f1114329f
  1. 42
      lib/QMapControl/src/mapcontrol.cpp
  2. 24
      lib/QMapControl/src/mapcontrol.h
  3. 81
      src/ui/MapWidget.cc
  4. 9
      src/ui/MapWidget.h
  5. 6
      src/ui/MapWidget.ui

42
lib/QMapControl/src/mapcontrol.cpp

@ -27,7 +27,7 @@ @@ -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 @@ -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 @@ -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 @@ -150,11 +155,8 @@ namespace qmapcontrol
// draw scale
if (scaleVisible)
{
QList<double> 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 @@ -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 @@ -256,7 +271,8 @@ namespace qmapcontrol
void MapControl::mouseMoveEvent(QMouseEvent* evnt)
{
// emit(mouseEvent(evnt));
emit(mouseEvent(evnt));
/*
// rotating
@ -275,8 +291,13 @@ namespace qmapcontrol @@ -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 @@ -403,6 +424,11 @@ namespace qmapcontrol
scaleVisible = show;
}
void MapControl::showCoord(bool show)
{
cursorPosVisible = show;
}
void MapControl::resize(const QSize newSize)
{
this->size = newSize;

24
lib/QMapControl/src/mapcontrol.h

@ -214,6 +214,14 @@ namespace qmapcontrol @@ -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 @@ -223,9 +231,14 @@ namespace qmapcontrol
QSize size; // size of the widget
QPointF currentWorldCoordinate; // updated by mouseMove
QList<double> distanceList;
bool mousepressed;
MouseMode mymousemode;
bool scaleVisible;
bool cursorPosVisible;
bool m_loadingFlag;
@ -244,7 +257,7 @@ namespace qmapcontrol @@ -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 @@ -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.

81
src/ui/MapWidget.cc

@ -44,30 +44,26 @@ MapWidget::MapWidget(QWidget *parent) : @@ -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<int, CirclePoint*>();
//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) : @@ -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<int, CirclePoint*>();
//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, @@ -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

9
src/ui/MapWidget.h

@ -60,8 +60,11 @@ protected: @@ -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: @@ -70,13 +73,17 @@ protected:
TileMapAdapter* osmAdapter;
GoogleSatMapAdapter* gSatAdapter;
Layer* osmLayer;
Layer* gSatLayer;
//Layer* gSatLayer;
QMap<int, CirclePoint*> uasIcons;
QMap<int, LineString*> uasTrails;
UASInterface* mav;
quint64 lastUpdate;
protected slots:
void captureMapClick (const QMouseEvent* event, const QPointF coordinate);
void createPathButtonClicked();
private:
Ui::MapWidget *m_ui;
};

6
src/ui/MapWidget.ui

@ -10,6 +10,12 @@ @@ -10,6 +10,12 @@
<height>300</height>
</rect>
</property>
<property name="cursor">
<cursorShape>ArrowCursor</cursorShape>
</property>
<property name="mouseTracking">
<bool>true</bool>
</property>
<property name="windowTitle">
<string>Form</string>
</property>

Loading…
Cancel
Save