1 #include "MosaicFindTool.h"
4 #include <QDoubleValidator>
5 #include <QGraphicsEllipseItem>
6 #include <QGraphicsScene>
11 #include <QMessageBox>
12 #include <QPushButton>
15 #include "FindSpotGraphicsItem.h"
16 #include "MosaicGraphicsView.h"
17 #include "MosaicSceneWidget.h"
18 #include "Projection.h"
19 #include "TProjection.h"
20 #include "PvlKeyword.h"
21 #include "PvlObject.h"
40 void MosaicFindTool::getUserGroundPoint() {
45 QValidator::State validLat =
47 if(validLat != QValidator::Acceptable) {
48 QMessageBox::warning(getWidget(),
"Error",
49 "Latitude value must be in the range -90 to 90",
50 QMessageBox::Ok, QMessageBox::NoButton, QMessageBox::NoButton);
56 QValidator::State validLon =
58 if(validLon != QValidator::Acceptable) {
59 QMessageBox::warning(getWidget(),
"Error",
60 "Longitude value must be a double",
61 QMessageBox::Ok, QMessageBox::NoButton, QMessageBox::NoButton);
65 double lat = IString(latitude.toStdString()).ToDouble();
66 double lon = IString(longitude.toStdString()).ToDouble();
68 Projection *projection = getWidget()->getProjection();
72 TProjection *tproj = (TProjection *) projection;
73 if (tproj->SetGround(lat, lon)) {
74 QPointF scenePos(projection->XCoord(), -1 * projection->YCoord());
75 QRectF sceneRect(getWidget()->getView()->sceneRect());
77 if (sceneRect.contains(scenePos)) {
78 if(p_findSpot != NULL) {
82 p_findSpot =
new FindSpotGraphicsItem(scenePos, getWidget());
84 getWidget()->getScene()->addItem(p_findSpot);
85 getWidget()->getView()->centerOn(scenePos);
88 QString message =
"Lat/Lon not within this view.";
89 QMessageBox::information(getWidget(),
"Point Not Found",
90 message, QMessageBox::Ok);
107 p_action->setIcon(
getIcon(
"find.png"));
108 p_action->setToolTip(
"Find (f)");
109 p_action->setShortcut(Qt::Key_F);
111 "<b>Function:</b> Find a specific latitude/longitude on the mosaic "
113 "This tool allows you to type in a latitude and longitude, in the "
114 "projection's native units, and that point will be centered and given "
115 "a red dot on the mosaic scene. Alternatively, you can <b>click</b> on "
116 "the mosaic scene and it will give you the latitude and longitude values "
117 "along with drawing the red dot."
118 "<p><b>Shortcut:</b> f</p> ";
119 p_action->setWhatsThis(text);
126 p_latLineEdit->setValidator(
new QDoubleValidator(-90.0, 90.0, 99,
this));
131 QLabel *latLabel =
new QLabel(
"Latitude");
132 QLabel *lonLabel =
new QLabel(
"Longitude");
135 QPushButton *okButton =
new QPushButton(
"Go to Point");
136 connect(okButton, SIGNAL(clicked()),
this, SLOT(getUserGroundPoint()));
138 QPushButton *clearButton =
new QPushButton(
"Clear Point");
139 connect(clearButton, SIGNAL(clicked()),
this, SLOT(clearPoint()));
142 QHBoxLayout *actionLayout =
new QHBoxLayout();
143 actionLayout->addWidget(latLabel);
145 actionLayout->addWidget(lonLabel);
147 actionLayout->addWidget(okButton);
148 actionLayout->addWidget(clearButton);
149 actionLayout->addStretch(1);
150 actionLayout->setMargin(0);
153 toolBarWidget->setLayout(actionLayout);
155 return toolBarWidget;
170 PvlObject MosaicFindTool::toPvl()
const {
181 void MosaicFindTool::fromPvl(
const PvlObject &obj) {
184 if(
toBool(obj[
"Visible"][0])) {
185 getUserGroundPoint();
190 QString MosaicFindTool::projectPvlObjectName()
const {
191 return "MosaicFindTool";
209 void MosaicFindTool::mouseButtonRelease(QPointF mouseLoc, Qt::MouseButton s) {
213 if(s == Qt::LeftButton) {
214 Projection *proj = getWidget()->getProjection();
219 if (tproj && getWidget()->getView()->sceneRect().contains(mouseLoc)) {
221 if (p_findSpot != NULL) {
225 p_findSpot =
new FindSpotGraphicsItem(mouseLoc, getWidget());
227 getWidget()->getScene()->addItem(p_findSpot);
242 void MosaicFindTool::clearPoint() {
243 if(p_findSpot != NULL) {
244 getWidget()->getScene()->removeItem(p_findSpot);