summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Tomaz Canabrava <tomaz.canabrava@intel.com>2015-07-16 18:47:57 -0300
committerGravatar Dirk Hohndel <dirk@hohndel.org>2015-07-16 18:34:22 -0700
commit0a473b3a2af6cab57f1fc0f360aff7e2dfeca133 (patch)
treefd9fa236a8d5d7c493311bbfa0efdac17788f60b
parent56240cff5ba2e8b762d3ba85cf62aafdc874d693 (diff)
downloadsubsurface-0a473b3a2af6cab57f1fc0f360aff7e2dfeca133.tar.gz
Fix mouse interaction with the Location List
paint methods should be used only to paint, not to trigger other widget behaviours ( we could got ourselves into a bad recursion bug from that ). Also, enabled mouse tracking to correctly track the mouse movement inside the widget. Signed-off-by: Tomaz Canabrava <tomaz.canabrava@intel.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r--qt-ui/globe.cpp12
-rw-r--r--qt-ui/globe.h2
-rw-r--r--qt-ui/maintab.cpp8
-rw-r--r--qt-ui/modeldelegates.cpp11
4 files changed, 21 insertions, 12 deletions
diff --git a/qt-ui/globe.cpp b/qt-ui/globe.cpp
index e74e4d107..066fdc217 100644
--- a/qt-ui/globe.cpp
+++ b/qt-ui/globe.cpp
@@ -373,6 +373,15 @@ void GlobeGPS::resizeEvent(QResizeEvent *event)
messageWidget->setGeometry(5, 5, size - 10, 0);
messageWidget->setMaximumHeight(500);
}
+
+void GlobeGPS::centerOnIndex(const QModelIndex& idx)
+{
+ struct dive_site *ds = get_dive_site_by_uuid(idx.model()->index(idx.row(), 0).data().toInt());
+ if (!ds || !dive_site_has_gps_location(ds))
+ MainWindow::instance()->globe()->centerOnDiveSite(&displayed_dive_site);
+ else
+ MainWindow::instance()->globe()->centerOnDiveSite(ds);
+}
#else
GlobeGPS::GlobeGPS(QWidget *parent)
@@ -398,4 +407,7 @@ void GlobeGPS::endGetDiveCoordinates()
void GlobeGPS::reload()
{
}
+void GlobeGPS::centerOnIndex(const QModelIndex& idx)
+{
+}
#endif
diff --git a/qt-ui/globe.h b/qt-ui/globe.h
index 5b34b052d..e8be53b5e 100644
--- a/qt-ui/globe.h
+++ b/qt-ui/globe.h
@@ -52,6 +52,7 @@ slots:
void prepareForGetDiveCoordinates();
void endGetDiveCoordinates();
void centerOnDiveSite(struct dive_site *ds);
+ void centerOnIndex(const QModelIndex& idx);
};
#else // NO_MARBLE
@@ -65,6 +66,7 @@ public:
void reload();
void repopulateLabels();
void centerOnDiveSite(uint32_t uuid);
+ void centerOnIndex(const QModelIndex& idx);
void centerOnCurrentDive();
bool eventFilter(QObject *, QEvent *);
public
diff --git a/qt-ui/maintab.cpp b/qt-ui/maintab.cpp
index 4920fab4b..fd78a10d7 100644
--- a/qt-ui/maintab.cpp
+++ b/qt-ui/maintab.cpp
@@ -67,7 +67,7 @@ MainTab::MainTab(QWidget *parent) : QTabWidget(parent),
completer->setCompletionColumn(LocationInformationModel::NAME);
completer->setCaseSensitivity(Qt::CaseInsensitive);
completerListview->setItemDelegate(new LocationFilterDelegate());
-
+ completerListview->setMouseTracking(true);
locationManagementEditHelper = new LocationManagementEditHelper();
connect(locationManagementEditHelper, &LocationManagementEditHelper::setLineEditText,
ui.location, &QLineEdit::setText);
@@ -453,6 +453,12 @@ void MainTab::showLocation()
void MainTab::updateDiveInfo(bool clear)
{
+ // I don't like this code here - but globe() wasn't initialized on the constructor.
+ {
+ QListView *completerListview = qobject_cast<QListView*>(ui.location->completer()->popup());
+ connect(completerListview, SIGNAL(entered(QModelIndex)), MainWindow::instance()->globe(), SLOT(centerOnIndex(QModelIndex)), Qt::UniqueConnection);
+ }
+
EditMode rememberEM = editMode;
// don't execute this while adding / planning a dive
if (editMode == ADD || editMode == MANUALLY_ADDED_DIVE || MainWindow::instance()->graphics()->isPlanner())
diff --git a/qt-ui/modeldelegates.cpp b/qt-ui/modeldelegates.cpp
index 404d329fc..848c66fa8 100644
--- a/qt-ui/modeldelegates.cpp
+++ b/qt-ui/modeldelegates.cpp
@@ -540,17 +540,6 @@ void LocationFilterDelegate::paint(QPainter *painter, const QStyleOptionViewItem
free( (void*) gpsCoords);
}
-#ifndef NO_MARBLE
- if ((option.state & QStyle::State_HasFocus)) {
- // show either the GPS location of the currently focused dive site or
- // the gps data for the displayed dive site (even if that has no GPS -> zoom out)
- if (dive_site_has_gps_location(ds))
- MainWindow::instance()->globe()->centerOnDiveSite(ds);
- else
- MainWindow::instance()->globe()->centerOnDiveSite(&displayed_dive_site);
- }
-#endif
-
if (dive_site_has_gps_location(ds) && dive_site_has_gps_location(&displayed_dive_site)) {
// so we are showing a completion and both the current dive site and the completion
// have a GPS fix... so let's show the distance