Dont set coordinates when two or more dives are selected

If a trip is selected (or for other reasons more than one dive), this
would change the GPS coordinates of the whole selection which almost
certainly isn't what the user wanted.
Instead, only allow changes of the coordinates on the globe if exactly one
dive is selected.

[Dirk Hohndel: massively rewritten and extended - but I didn't want to
               simply "steal" the commit from Tomaz...
	       This now maintains the "zoom out mode" for dives without
	       GPS coordinates and deals with edits of multiple dives that
	       are initiated the "normal way" by starting to edit other
	       data as well.]

Signed-off-by: Tomaz Canabrava <tomaz.canabrava@intel.com>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
Tomaz Canabrava 2014-05-01 14:47:52 -03:00 committed by Dirk Hohndel
parent 7f3b487c77
commit 4243fcb915
3 changed files with 37 additions and 21 deletions

View file

@ -3,9 +3,10 @@
#include "kmessagewidget.h"
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "../dive.h"
#include "../divelist.h"
#include "../helpers.h"
#include "dive.h"
#include "divelist.h"
#include "helpers.h"
#include "display.h"
#include <QDebug>
#include <QTimer>
@ -203,15 +204,24 @@ void GlobeGPS::reload()
void GlobeGPS::centerOn(dive *dive)
{
// dive has changed, if we had the 'editingDive', hide it.
if (messageWidget->isVisible() && (!dive || dive_has_gps_location(dive)))
if (messageWidget->isVisible()
&& (!dive || dive_has_gps_location(dive) || amount_selected != 1 ))
messageWidget->hide();
editingDiveLocation = false;
if (!dive)
return;
qreal longitude = dive->longitude.udeg / 1000000.0;
qreal latitude = dive->latitude.udeg / 1000000.0;
if (!longitude || !latitude || MainWindow::instance()->information()->isEditing()) {
prepareForGetDiveCoordinates();
if ((!dive_has_gps_location(dive) || MainWindow::instance()->information()->isEditing())
&& amount_selected == 1) {
prepareForGetDiveCoordinates(dive);
return;
}
if (!dive_has_gps_location(dive)) {
zoomOutForNoGPS();
return;
}
@ -239,7 +249,21 @@ void GlobeGPS::fixZoom()
setZoom(currentZoomLevel, Marble::Linear);
}
void GlobeGPS::prepareForGetDiveCoordinates()
void GlobeGPS::zoomOutForNoGPS()
{
// this is called if the dive has no GPS location.
// zoom out quite a bit to show the globe and remember that the next time
// we show a dive with GPS location we need to zoom in again
if(fixZoomTimer->isActive())
fixZoomTimer->stop();
setZoom(1200, Marble::Automatic);
if (!needResetZoom) {
needResetZoom = true;
currentZoomLevel = zoom();
}
}
void GlobeGPS::prepareForGetDiveCoordinates(struct dive *dive)
{
if (!messageWidget->isVisible()) {
messageWidget->setMessageType(KMessageWidget::Warning);
@ -247,18 +271,8 @@ void GlobeGPS::prepareForGetDiveCoordinates()
messageWidget->setWordWrap(true);
messageWidget->animatedShow();
editingDiveLocation = true;
// if the dive has no GPS location, zoom out quite a bit to show the globe
// and remember that the next time we show a dive with GPS location we need
// to zoom in again
if (!dive_has_gps_location(current_dive)) {
if(fixZoomTimer->isActive())
fixZoomTimer->stop();
setZoom(1200, Marble::Automatic);
if (!needResetZoom) {
needResetZoom = true;
currentZoomLevel = zoom();
}
}
if (!dive_has_gps_location(dive))
zoomOutForNoGPS();
}
}

View file

@ -40,7 +40,8 @@ slots:
void changeDiveGeoPosition(qreal lon, qreal lat, GeoDataCoordinates::Unit);
void mouseClicked(qreal lon, qreal lat, GeoDataCoordinates::Unit);
void fixZoom();
void prepareForGetDiveCoordinates();
void zoomOutForNoGPS();
void prepareForGetDiveCoordinates(struct dive *dive);
};
#else // NO_MARBLE

View file

@ -251,7 +251,8 @@ void MainTab::enableEdition(EditMode newEditMode)
return;
}
MainWindow::instance()->dive_list()->setEnabled(false);
MainWindow::instance()->globe()->prepareForGetDiveCoordinates();
if (amount_selected == 1)
MainWindow::instance()->globe()->prepareForGetDiveCoordinates(current_dive);
// We may be editing one or more dives here. backup everything.
notesBackup.clear();
if (MainWindow::instance() && MainWindow::instance()->dive_list()->selectedTrips().count() == 1) {