1 /*
2 * Copyright 2012, 2013 Thomas Schöps
3 * Copyright 2012-2020 Kai Pastor
4 *
5 * This file is part of OpenOrienteering.
6 *
7 * OpenOrienteering is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * OpenOrienteering is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with OpenOrienteering. If not, see <http://www.gnu.org/licenses/>.
19 */
20
21
22 #include "template_image_open_dialog.h"
23
24 #include <Qt>
25 #include <QtGlobal>
26 #include <QAbstractButton>
27 #include <QByteArray>
28 #include <QDialog>
29 #include <QHBoxLayout>
30 #include <QIcon>
31 #include <QImage>
32 #include <QIntValidator>
33 #include <QLabel>
34 #include <QLatin1String>
35 #include <QLineEdit>
36 #include <QPushButton>
37 #include <QRadioButton>
38 #include <QVBoxLayout>
39
40 #include "core/map.h"
41 #include "gui/util_gui.h"
42 #include "templates/template_image.h"
43
44
45 namespace OpenOrienteering {
46
TemplateImageOpenDialog(TemplateImage * templ,QWidget * parent)47 TemplateImageOpenDialog::TemplateImageOpenDialog(TemplateImage* templ, QWidget* parent)
48 : QDialog(parent, Qt::WindowSystemMenuHint | Qt::WindowTitleHint), templ(templ)
49 {
50 setWindowTitle(tr("Opening %1").arg(templ->getTemplateFilename()));
51
52 QLabel* size_label = new QLabel(QLatin1String("<b>") + tr("Image size:") + QLatin1String("</b> ")
53 + QString::number(templ->getImage().width()) + QLatin1String(" x ")
54 + QString::number(templ->getImage().height()));
55 QLabel* desc_label = new QLabel(tr("Specify how to position or scale the image:"));
56
57 bool use_meters_per_pixel;
58 double meters_per_pixel;
59 double dpi;
60 double scale;
61 templ->getMap()->getImageTemplateDefaults(use_meters_per_pixel, meters_per_pixel, dpi, scale);
62
63 auto georef_source = templ->availableGeoreferencing().effective.transform.source;
64 auto const georef_radio_enabled = !georef_source.isEmpty();
65
66 // Georeferencing source translations which already existed in this context
67 // and need to be preserved here, until moved to a different file.
68 // Now the source strings come from TemplateImage and from GDAL (driver names).
69 Q_UNUSED(QT_TR_NOOP("World file"))
70 Q_UNUSED(QT_TR_NOOP("GeoTIFF"))
71 Q_UNUSED(QT_TR_NOOP("no georeferencing information"))
72 // GDAL's GeoTIFF driver reports itself as "GTiff".
73 if (georef_source == "GTiff")
74 georef_source = "GeoTIFF";
75
76 georef_radio = new QRadioButton(tr("Georeferenced (%1)").arg(tr(georef_source)));
77 georef_radio->setEnabled(georef_radio_enabled);
78
79 mpp_radio = new QRadioButton(tr("Meters per pixel:"));
80 mpp_edit = new QLineEdit((meters_per_pixel > 0) ? QString::number(meters_per_pixel) : QString{});
81 mpp_edit->setValidator(new DoubleValidator(0, 999999, mpp_edit));
82
83 dpi_radio = new QRadioButton(tr("Scanned with"));
84 dpi_edit = new QLineEdit((dpi > 0) ? QString::number(dpi) : QString{});
85 dpi_edit->setValidator(new DoubleValidator(1, 999999, dpi_edit));
86 QLabel* dpi_label = new QLabel(tr("dpi"));
87
88 QLabel* scale_label = new QLabel(tr("Template scale: 1 :"));
89 scale_edit = new QLineEdit((scale > 0) ? QString::number(scale) : QString{});
90 scale_edit->setValidator(new QIntValidator(1, 999999, scale_edit));
91
92 if (georef_radio->isEnabled())
93 georef_radio->setChecked(true);
94 else if (use_meters_per_pixel)
95 mpp_radio->setChecked(true);
96 else
97 dpi_radio->setChecked(true);
98
99 auto mpp_layout = new QHBoxLayout();
100 mpp_layout->addWidget(mpp_radio);
101 mpp_layout->addWidget(mpp_edit);
102 mpp_layout->addStretch(1);
103 auto dpi_layout = new QHBoxLayout();
104 dpi_layout->addWidget(dpi_radio);
105 dpi_layout->addWidget(dpi_edit);
106 dpi_layout->addWidget(dpi_label);
107 dpi_layout->addStretch(1);
108 auto scale_layout = new QHBoxLayout();
109 scale_layout->addSpacing(16);
110 scale_layout->addWidget(scale_label);
111 scale_layout->addWidget(scale_edit);
112 scale_layout->addStretch(1);
113
114 auto cancel_button = new QPushButton(tr("Cancel"));
115 open_button = new QPushButton(QIcon(QString::fromLatin1(":/images/arrow-right.png")), tr("Open"));
116 open_button->setDefault(true);
117
118 auto buttons_layout = new QHBoxLayout();
119 buttons_layout->addWidget(cancel_button);
120 buttons_layout->addStretch(1);
121 buttons_layout->addWidget(open_button);
122
123 auto layout = new QVBoxLayout();
124 layout->addWidget(size_label);
125 layout->addSpacing(16);
126 layout->addWidget(desc_label);
127 layout->addWidget(georef_radio);
128 layout->addLayout(mpp_layout);
129 layout->addLayout(dpi_layout);
130 layout->addLayout(scale_layout);
131 layout->addSpacing(16);
132 layout->addLayout(buttons_layout);
133 setLayout(layout);
134
135 connect(mpp_edit, &QLineEdit::textEdited, this, &TemplateImageOpenDialog::setOpenEnabled);
136 connect(dpi_edit, &QLineEdit::textEdited, this, &TemplateImageOpenDialog::setOpenEnabled);
137 connect(scale_edit, &QLineEdit::textEdited, this, &TemplateImageOpenDialog::setOpenEnabled);
138 connect(cancel_button, &QAbstractButton::clicked, this, &QDialog::reject);
139 connect(open_button, &QAbstractButton::clicked, this, &TemplateImageOpenDialog::doAccept);
140 connect(georef_radio, &QAbstractButton::clicked, this, &TemplateImageOpenDialog::radioClicked);
141 connect(mpp_radio, &QAbstractButton::clicked, this, &TemplateImageOpenDialog::radioClicked);
142 connect(dpi_radio, &QAbstractButton::clicked, this, &TemplateImageOpenDialog::radioClicked);
143
144 radioClicked();
145 }
146
getMpp() const147 double TemplateImageOpenDialog::getMpp() const
148 {
149 if (mpp_radio->isChecked())
150 return mpp_edit->text().toDouble();
151
152 double dpi = dpi_edit->text().toDouble(); // dots/pixels per inch(on map)
153 double ipd = 1.0 / dpi; // inch(on map) per pixel
154 double mpd = ipd * 0.0254; // meters(on map) per pixel
155 double mpp = mpd * scale_edit->text().toDouble(); // meters(in reality) per pixel
156 return mpp;
157 }
158
isGeorefRadioChecked() const159 bool TemplateImageOpenDialog::isGeorefRadioChecked() const
160 {
161 return georef_radio->isChecked();
162 }
163
radioClicked()164 void TemplateImageOpenDialog::radioClicked()
165 {
166 bool mpp_checked = mpp_radio->isChecked();
167 bool dpi_checked = dpi_radio->isChecked();
168 dpi_edit->setEnabled(dpi_checked);
169 scale_edit->setEnabled(dpi_checked);
170 mpp_edit->setEnabled(mpp_checked);
171 setOpenEnabled();
172 }
173
setOpenEnabled()174 void TemplateImageOpenDialog::setOpenEnabled()
175 {
176 if (mpp_radio->isChecked())
177 open_button->setEnabled(!mpp_edit->text().isEmpty());
178 else if (dpi_radio->isChecked())
179 open_button->setEnabled(!scale_edit->text().isEmpty() && !dpi_edit->text().isEmpty());
180 else //if (georef_radio->isChecked())
181 open_button->setEnabled(true);
182 }
183
doAccept()184 void TemplateImageOpenDialog::doAccept()
185 {
186 templ->getMap()->setImageTemplateDefaults(mpp_radio->isChecked(), mpp_edit->text().toDouble(), dpi_edit->text().toDouble(), scale_edit->text().toDouble());
187 accept();
188 }
189
190
191 } // namespace OpenOrienteering
192