diff options
author | Tomaz Canabrava <tomaz.canabrava@intel.com> | 2015-07-16 18:47:57 -0300 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2015-07-16 18:34:22 -0700 |
commit | 0a473b3a2af6cab57f1fc0f360aff7e2dfeca133 (patch) | |
tree | fd9fa236a8d5d7c493311bbfa0efdac17788f60b | |
parent | 56240cff5ba2e8b762d3ba85cf62aafdc874d693 (diff) | |
download | subsurface-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.cpp | 12 | ||||
-rw-r--r-- | qt-ui/globe.h | 2 | ||||
-rw-r--r-- | qt-ui/maintab.cpp | 8 | ||||
-rw-r--r-- | qt-ui/modeldelegates.cpp | 11 |
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 |