source: subversion/applications/editors/merkaartor/GotoDialog.cpp @ 13736

Last change on this file since 13736 was 13422, checked in by Łukasz Jernaś, 11 years ago

FIX : Implement dynamic UI translation (fixes #1432)

File size: 6.8 KB
Line 
1//
2// C++ Implementation: GotoDialog
3//
4// Description:
5//
6//
7// Author: Chris Browet <cbro@semperpax.com>, (C) 2008
8//
9// Copyright: See COPYING file that comes with this distribution
10//
11//
12#include "GotoDialog.h"
13
14#include <QMessageBox>
15
16#include "Preferences/MerkaartorPreferences.h"
17
18#include "NameFinder/namefinderwidget.h"
19
20GotoDialog::GotoDialog(const Projection& aProj, QWidget *parent)
21        :QDialog(parent), theProjection(aProj)
22{
23        setupUi(this);
24
25        CoordBox B = theProjection.viewport();
26        int OsmZoom = int((log((360.0 / intToAng(B.latDiff()))) / log(2.0)) + 1);
27        OsmZoom = qMin(OsmZoom, 18);
28        OsmZoom = qMax(OsmZoom, 1);
29
30        int idx = 0;
31        int selIdx = -1;
32        double dist = 6372.795;
33        double d;
34        QMap<QString, CoordBox> Bookmarks = M_PREFS->getBookmarks();
35        QMapIterator<QString, CoordBox> i(Bookmarks);
36        while (i.hasNext()) {
37                i.next();
38
39                coordBookmark->addItem(i.key());
40                CoordBox C = i.value();
41                if ((d = C.center().distanceFrom(B.center())) < dist) {
42                        dist = d;
43                        selIdx = idx;
44                }
45                ++idx;
46        }
47        coordBookmark->setCurrentIndex(selIdx);
48       
49        searchWidget = new NameFinder::NameFinderWidget(this);
50        connect(searchWidget, SIGNAL(selectionChanged()), this, SLOT(searchWidget_selectionChanged()));
51        connect(searchWidget, SIGNAL(doubleClicked()), this, SLOT(searchWidget_doubleClicked()));
52        verticalLayout_4->addWidget(searchWidget);
53
54        coordOSM->setText( QString("http://www.openstreetmap.org/?lat=%1&lon=%2&zoom=%3")
55                .arg(QString::number(intToAng(B.center().lat()), 'f', 4))
56                .arg(QString::number(intToAng(B.center().lon()), 'f', 4))
57                .arg(QString::number(OsmZoom))
58                );
59        coordOsmApi->setText( QString("http://www.openstreetmap.org/api/0.5/map?bbox=%1,%2,%3,%4")
60                .arg(QString::number(intToAng(B.bottomLeft().lon()), 'f', 4))
61                .arg(QString::number(intToAng(B.bottomLeft().lat()), 'f', 4))
62                .arg(QString::number(intToAng(B.topRight().lon()), 'f', 4))
63                .arg(QString::number(intToAng(B.topRight().lat()), 'f', 4))
64                );
65        coordOsmXApi->setText( QString("http://xapi.openstreetmap.org/api/0.5/*[bbox=%1,%2,%3,%4]")
66                .arg(QString::number(intToAng(B.bottomLeft().lon()), 'f', 4))
67                .arg(QString::number(intToAng(B.bottomLeft().lat()), 'f', 4))
68                .arg(QString::number(intToAng(B.topRight().lon()), 'f', 4))
69                .arg(QString::number(intToAng(B.topRight().lat()), 'f', 4))
70                );
71        coordCoord->setText( QString("%1, %2, %3, %4")
72                .arg(QString::number(intToAng(B.bottomLeft().lon()), 'f', 4))
73                .arg(QString::number(intToAng(B.bottomLeft().lat()), 'f', 4))
74                .arg(QString::number(intToAng(B.topRight().lon()), 'f', 4))
75                .arg(QString::number(intToAng(B.topRight().lat()), 'f', 4))
76                );
77        coordSpan->setText( QString("%1, %2, %3, %4")
78                .arg(QString::number(intToAng(B.center().lat()), 'f', 4))
79                .arg(QString::number(intToAng(B.center().lon()), 'f', 4))
80                .arg(QString::number(intToAng(B.latDiff()), 'f', 4))
81                .arg(QString::number(intToAng(B.lonDiff()), 'f', 4))
82                );
83
84        resize(1,1);
85}
86
87void GotoDialog::on_searchButton_clicked()
88{
89                QString searchString = NameFinderEdit->text();
90                searchWidget->search(searchString);
91}
92void GotoDialog::on_buttonBox_clicked(QAbstractButton * button)
93{
94        if (buttonBox->buttonRole(button) == QDialogButtonBox::AcceptRole) {
95                if (rbBookmark->isChecked()) {
96                        theNewViewport = M_PREFS->getBookmarks()[coordBookmark->currentText()];
97                } else
98                if (rbOSM->isChecked()) {
99                        QUrl url = QUrl(coordOSM->text()); 
100                        if (!url.isValid()) {
101                                QMessageBox::warning(this, QApplication::translate("GotoDialog", "Invalid OSM url"),
102                                        QApplication::translate("GotoDialog", "The specified url is invalid!"));
103                                return;
104                        }
105                        double lat = url.queryItemValue("lat").toDouble(); 
106                        double lon = url.queryItemValue("lon").toDouble(); 
107                        if (lat == 0.0 || lon == 0.0) {
108                                QMessageBox::warning(this, QApplication::translate("GotoDialog", "Invalid OSM url"),
109                                        QApplication::translate("GotoDialog", "The specified url is invalid!"));
110                                return;
111                        }
112                        int zoom = url.queryItemValue("zoom").toInt();
113
114                        if (zoom < 1 || zoom > 18) // use default when not in bounds
115                                zoom = 15;
116
117                        /* term to calculate the angle from the zoom-value */
118                        double zoomLat = 360.0 / (double)(1 << zoom);
119                        double zoomLon = zoomLat / fabs(cos(angToRad(lat)));
120                        /* the following line is equal to the line above. (just for explanation) */
121                        //double zoomLon = zoomLat / aParent->view()->projection().latAnglePerM() * aParent->view()->projection().lonAnglePerM(angToRad(lat));
122
123                        /* the OSM link contains the coordinates from the middle of the visible map so we have to add and sub zoomLon/zoomLat */
124                        theNewViewport = CoordBox(Coord(angToInt(lat-zoomLat), angToInt(lon-zoomLon)), Coord(angToInt(lat+zoomLat), angToInt(lon+zoomLon)));
125                } else
126                if (rbCoord->isChecked()) {
127                        QStringList tokens = coordCoord->text().split(",");
128                        if (tokens.size() < 4) {
129                                QMessageBox::warning(this, QApplication::translate("GotoDialog", "Invalid Coordinates format"),
130                                        QApplication::translate("GotoDialog", "Coordinates must be: '<left lon>, <bottom lat>, <right lon>, <top lat>'"));
131                                return;
132                        }
133                        theNewViewport = CoordBox(Coord(angToInt(tokens[1].toDouble()), angToInt(tokens[0].toDouble())), Coord(angToInt(tokens[3].toDouble()), angToInt(tokens[2].toDouble())));
134                } else
135                if (rbSpan->isChecked()) {
136                        QStringList tokens = coordSpan->text().split(",");
137                        if (tokens.size() < 4) {
138                                QMessageBox::warning(this, QApplication::translate("GotoDialog", "Invalid Coordinates format"),
139                                        QApplication::translate("GotoDialog", "Coordinates must be: '<center lat>, <center lon>, <span lat>, <span lon>'"));
140                                return;
141                        }
142                        theNewViewport = CoordBox(
143                                                                Coord(
144                                                                        angToInt(tokens[0].toDouble() - tokens[2].toDouble() / 2),
145                                                                        angToInt(tokens[1].toDouble() - tokens[3].toDouble() / 2)),
146                                                                Coord(
147                                                                        angToInt(tokens[0].toDouble() + tokens[2].toDouble() / 2),
148                                                                        angToInt(tokens[1].toDouble() + tokens[3].toDouble() / 2))
149                                                                );
150                }
151                accept();
152        }
153}
154
155void GotoDialog::searchWidget_selectionChanged()
156{
157        QPointF centerPoint = searchWidget->selectedCoords();
158        int zoom = searchWidget->selectedZoom();
159        // The API doesn't like request for too large bounding boxes so reset to a default
160        if (zoom < 15)
161                zoom = 15;
162        coordOSM->setText( QString("http://www.openstreetmap.org/?lat=%1&lon=%2&zoom=%3")
163                .arg(QString::number(centerPoint.x(), 'f', 4))
164                .arg(QString::number(centerPoint.y(), 'f', 4))
165                .arg(QString::number(zoom))
166                );
167        rbOSM->setChecked(true);
168       
169}
170
171void GotoDialog::on_NameFinderEdit_textChanged(const QString & text)
172{
173    if (!text.isEmpty()) {
174                searchButton->setDefault(true);
175    } else {
176                searchButton->setDefault(false);
177                buttonBox->button(QDialogButtonBox::Ok)->setDefault(true);
178    }
179}
180
181void GotoDialog::searchWidget_doubleClicked()
182{
183    buttonBox->button(QDialogButtonBox::Ok)->click();
184}
185
186void GotoDialog::changeEvent(QEvent * event)
187{
188        if (event->type() == QEvent::LanguageChange)
189                retranslateUi(this);
190}
191
Note: See TracBrowser for help on using the repository browser.