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