mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-08-30 09:46:34 -04:00
Add support for different map types (street/satellite) and different map providers. Support finding real world addresses on the map. Add Maidenhead locator converter. Add Beacons. Allow data sources to be selected by a user. Add context menu to allow setting an object as a target, setting center frequency and adjusting display order.
145 lines
5.1 KiB
C++
145 lines
5.1 KiB
C++
///////////////////////////////////////////////////////////////////////////////////
|
|
// Copyright (C) 2021 Jon Beniston, M7RCE //
|
|
// //
|
|
// This program is free software; you can redistribute it and/or modify //
|
|
// it under the terms of the GNU General Public License as published by //
|
|
// the Free Software Foundation as version 3 of the License, or //
|
|
// (at your option) any later version. //
|
|
// //
|
|
// This program is distributed in the hope that it will be useful, //
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
|
|
// GNU General Public License V3 for more details. //
|
|
// //
|
|
// You should have received a copy of the GNU General Public License //
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
|
///////////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include <QDebug>
|
|
#include <QGeoCoordinate>
|
|
#include <QGeoCodingManager>
|
|
#include <QGeoServiceProvider>
|
|
|
|
#include "util/units.h"
|
|
#include "util/maidenhead.h"
|
|
|
|
#include "mapmaidenheaddialog.h"
|
|
#include "maplocationdialog.h"
|
|
|
|
MapMaidenheadDialog::MapMaidenheadDialog(QWidget* parent) :
|
|
QDialog(parent),
|
|
ui(new Ui::MapMaidenheadDialog)
|
|
{
|
|
ui->setupUi(this);
|
|
}
|
|
|
|
MapMaidenheadDialog::~MapMaidenheadDialog()
|
|
{
|
|
delete ui;
|
|
}
|
|
|
|
void MapMaidenheadDialog::on_address_returnPressed()
|
|
{
|
|
QString address = ui->address->text().trimmed();
|
|
if (!address.isEmpty())
|
|
{
|
|
ui->latAndLong->setText("");
|
|
ui->error->setText("");
|
|
QGeoServiceProvider* geoSrv = new QGeoServiceProvider("osm");
|
|
if (geoSrv != nullptr)
|
|
{
|
|
QLocale qLocaleC(QLocale::C, QLocale::AnyCountry);
|
|
geoSrv->setLocale(qLocaleC);
|
|
QGeoCodeReply *pQGeoCode = geoSrv->geocodingManager()->geocode(address);
|
|
if (pQGeoCode)
|
|
QObject::connect(pQGeoCode, &QGeoCodeReply::finished, this, &MapMaidenheadDialog::geoReply);
|
|
else
|
|
ui->error->setText("GeoCoding failed");
|
|
}
|
|
else
|
|
ui->error->setText("OpenStreetMap Location services not available");
|
|
}
|
|
}
|
|
|
|
void MapMaidenheadDialog::on_latAndLong_returnPressed()
|
|
{
|
|
float latitude, longitude;
|
|
QString coords = ui->latAndLong->text();
|
|
|
|
if (Units::stringToLatitudeAndLongitude(coords, latitude, longitude))
|
|
{
|
|
ui->error->setText("");
|
|
ui->maidenhead->setText(Maidenhead::toMaidenhead(latitude, longitude));
|
|
}
|
|
else
|
|
{
|
|
ui->error->setText("Not a valid latitude and longitude");
|
|
ui->maidenhead->setText("");
|
|
QApplication::beep();
|
|
}
|
|
ui->address->setText("");
|
|
}
|
|
|
|
void MapMaidenheadDialog::on_maidenhead_returnPressed()
|
|
{
|
|
float latitude, longitude;
|
|
QString locator = ui->maidenhead->text();
|
|
|
|
if (Maidenhead::fromMaidenhead(locator, latitude, longitude))
|
|
{
|
|
ui->error->setText("");
|
|
ui->latAndLong->setText(QString("%1,%2").arg(latitude).arg(longitude));
|
|
}
|
|
else
|
|
{
|
|
ui->error->setText("Not a valid Maidenhead locator");
|
|
ui->latAndLong->setText("");
|
|
QApplication::beep();
|
|
}
|
|
ui->address->setText("");
|
|
}
|
|
|
|
void MapMaidenheadDialog::geoReply()
|
|
{
|
|
QGeoCodeReply *pQGeoCode = dynamic_cast<QGeoCodeReply*>(sender());
|
|
|
|
if ((pQGeoCode != nullptr) && (pQGeoCode->error() == QGeoCodeReply::NoError))
|
|
{
|
|
QList<QGeoLocation> qGeoLocs = pQGeoCode->locations();
|
|
if (qGeoLocs.size() == 0)
|
|
{
|
|
ui->error->setText("No location found for address");
|
|
QApplication::beep();
|
|
}
|
|
else
|
|
{
|
|
if (qGeoLocs.size() == 1)
|
|
{
|
|
QGeoCoordinate c = qGeoLocs.at(0).coordinate();
|
|
ui->latAndLong->setText(QString("%1,%2").arg(c.latitude()).arg(c.longitude()));
|
|
ui->maidenhead->setText(Maidenhead::toMaidenhead(c.latitude(), c.longitude()));
|
|
}
|
|
else
|
|
{
|
|
// Show dialog allowing user to select from the results
|
|
MapLocationDialog dialog(qGeoLocs, this);
|
|
if (dialog.exec() == QDialog::Accepted)
|
|
{
|
|
QGeoCoordinate c = dialog.m_selectedLocation.coordinate();
|
|
ui->latAndLong->setText(QString("%1,%2").arg(c.latitude()).arg(c.longitude()));
|
|
ui->maidenhead->setText(Maidenhead::toMaidenhead(c.latitude(), c.longitude()));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
ui->error->setText(QString("GeoCode error: %1").arg(pQGeoCode->error()));
|
|
pQGeoCode->deleteLater();
|
|
}
|
|
|
|
// Use a custom close button, so pressing enter doesn't close the dialog
|
|
void MapMaidenheadDialog::on_close_clicked()
|
|
{
|
|
QDialog::accept();
|
|
}
|