-
Notifications
You must be signed in to change notification settings - Fork 69
Expand file tree
/
Copy pathmainwindow.cpp
More file actions
127 lines (102 loc) · 4.08 KB
/
mainwindow.cpp
File metadata and controls
127 lines (102 loc) · 4.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/***************************************************************************
* QGeoView is a Qt / C ++ widget for visualizing geographic data.
* Copyright (C) 2018-2025 Andrey Yaroshenko.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either 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 for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, see https://www.gnu.org/licenses.
****************************************************************************/
#include "mainwindow.h"
#include <QGeoView/QGVLayerBing.h>
#include <QGeoView/QGVLayerGoogle.h>
#include <QGeoView/QGVLayerOSM.h>
#include <helpers.h>
#include <QButtonGroup>
#include <QHBoxLayout>
#include <QLineEdit>
#include <QRadioButton>
#include <QVBoxLayout>
MainWindow::MainWindow()
{
setWindowTitle("QGeoView Samples - background");
setCentralWidget(new QWidget());
centralWidget()->setLayout(new QVBoxLayout());
Helpers::setupCachedNetworkAccessManager(this);
mMap = new QGVMap(this);
centralWidget()->layout()->addWidget(mMap);
// Options list
centralWidget()->layout()->addWidget(createOptionsList());
// Show whole world
auto target = mMap->getProjection()->boundaryGeoRect();
mMap->cameraTo(QGVCameraActions(mMap).scaleTo(target));
}
MainWindow::~MainWindow()
{
}
QGroupBox* MainWindow::createOptionsList()
{
const QString customURI =
"https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/tile/${z}/${y}/${x}";
const QList<QPair<QString, QGVLayer*>> layers = {
{ "GOOGLE_SATELLITE", new QGVLayerGoogle(QGV::TilesType::Satellite) },
{ "GOOGLE_HYBRID", new QGVLayerGoogle(QGV::TilesType::Hybrid) },
{ "GOOGLE_SCHEMA", new QGVLayerGoogle(QGV::TilesType::Schema) },
{ "BING_SATELLITE", new QGVLayerBing(QGV::TilesType::Satellite) },
{ "BING_HYBRID", new QGVLayerBing(QGV::TilesType::Hybrid) },
{ "BING_SCHEMA", new QGVLayerBing(QGV::TilesType::Schema) },
{ "CUSTOM_OSM", new QGVLayerOSM(customURI) },
{ "OSM", new QGVLayerOSM() },
};
QGroupBox* groupBox = new QGroupBox(tr("Background maps"));
groupBox->setLayout(new QVBoxLayout);
QButtonGroup* group = new QButtonGroup(this);
QRadioButton* radioButton;
for (auto pair : layers) {
auto name = pair.first;
auto layer = pair.second;
layer->hide();
mMap->addItem(layer);
radioButton = new QRadioButton(name);
group->addButton(radioButton);
connect(radioButton, &QRadioButton::clicked, this, [layer, layers](const bool checked) {
if (!checked)
return;
for (auto pair : layers) {
auto layer = pair.second;
layer->hide();
}
layer->show();
});
if (name == "CUSTOM_OSM") {
auto* widget = new QWidget();
widget->setLayout(new QHBoxLayout);
#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)
widget->layout()->setContentsMargins(QMargins{ 0, 0, 0, 0 });
#else
widget->layout()->setMargin(0);
#endif
widget->layout()->addWidget(radioButton);
auto* urlEditor = new QLineEdit();
urlEditor->setText(customURI);
connect(urlEditor, &QLineEdit::textChanged, this, [layer](const QString& text) {
dynamic_cast<QGVLayerOSM*>(layer)->setUrl(text);
});
widget->layout()->addWidget(urlEditor);
groupBox->layout()->addWidget(widget);
} else {
groupBox->layout()->addWidget(radioButton);
}
}
// Last map will be default
radioButton->click();
return groupBox;
}