This series of patches makes the Location Management somewhat workable, a few crashes that I'll iron out today ( unless someone iron it out for me first. :P )
From 8248f0887556c74bd741b9286a851cd910e0317a Mon Sep 17 00:00:00 2001 From: Tomaz Canabrava <[email protected]> Date: Mon, 1 Jun 2015 16:58:23 -0300 Subject: [PATCH 4/4] Create a new DiveSite when user clicks on add
Also reorganized a bit of the code, and renamed a few misleading methods. Signed-off-by: Tomaz Canabrava <[email protected]> --- qt-models/divelocationmodel.cpp | 10 ++++++++++ qt-models/divelocationmodel.h | 2 ++ qt-ui/locationinformation.cpp | 8 ++++---- qt-ui/locationinformation.h | 4 ++-- qt-ui/maintab.cpp | 12 ++++++++---- qt-ui/maintab.ui | 24 ++++++++++++++---------- qt-ui/mainwindow.cpp | 6 +++--- 7 files changed, 43 insertions(+), 23 deletions(-) diff --git a/qt-models/divelocationmodel.cpp b/qt-models/divelocationmodel.cpp index c335f70..4b67755 100644 --- a/qt-models/divelocationmodel.cpp +++ b/qt-models/divelocationmodel.cpp @@ -49,3 +49,13 @@ void LocationInformationModel::update() endInsertRows(); } } + +int32_t LocationInformationModel::addDiveSite(const QString& name, int lon, int lat) +{ + degrees_t latitude { .udeg = lat }; + degrees_t longitude{ .udeg = lon }; + + int32_t uuid = create_dive_site_with_gps(name.toUtf8().data(), latitude, longitude); + update(); + return uuid; +} diff --git a/qt-models/divelocationmodel.h b/qt-models/divelocationmodel.h index 9238c4b..9d30adf 100644 --- a/qt-models/divelocationmodel.h +++ b/qt-models/divelocationmodel.h @@ -10,6 +10,8 @@ public: static LocationInformationModel *instance(); int rowCount(const QModelIndex &parent = QModelIndex()) const; QVariant data(const QModelIndex &index = QModelIndex(), int role = Qt::DisplayRole) const; + int32_t addDiveSite(const QString& name, int lat = 0, int lon = 0); + public slots: void update(); private: diff --git a/qt-ui/locationinformation.cpp b/qt-ui/locationinformation.cpp index 699b80d..b6c4f7f 100644 --- a/qt-ui/locationinformation.cpp +++ b/qt-ui/locationinformation.cpp @@ -34,16 +34,16 @@ LocationInformationWidget::LocationInformationWidget(QWidget *parent) : QGroupBo connect(this, SIGNAL(stopFilterDiveSite()), MultiFilterSortModel::instance(), SLOT(stopFilterDiveSite())); } -void LocationInformationWidget::setCurrentDiveSite(int dive_nr) +void LocationInformationWidget::setCurrentDiveSiteByIndex(int dive_nr) { currentDs = get_dive_site(dive_nr); if (currentDs) - setLocationId(currentDs->uuid); + setCurrentDiveSiteByUuid(currentDs->uuid); else - setLocationId(displayed_dive.dive_site_uuid); + setCurrentDiveSiteByUuid(displayed_dive.dive_site_uuid); } -void LocationInformationWidget::setLocationId(uint32_t uuid) +void LocationInformationWidget::setCurrentDiveSiteByUuid(uint32_t uuid) { currentDs = get_dive_site_by_uuid(uuid); if(!currentDs) diff --git a/qt-ui/locationinformation.h b/qt-ui/locationinformation.h index 2a34512..0dcae9d 100644 --- a/qt-ui/locationinformation.h +++ b/qt-ui/locationinformation.h @@ -15,13 +15,13 @@ protected: public slots: void acceptChanges(); void rejectChanges(); - void setLocationId(uint32_t uuid); + void setCurrentDiveSiteByUuid(uint32_t uuid); void updateGpsCoordinates(void); void markChangedWidget(QWidget *w); void enableEdition(); void resetState(); void resetPallete(); - void setCurrentDiveSite(int dive_nr); + void setCurrentDiveSiteByIndex(int dive_nr); void on_diveSiteCoordinates_textChanged(const QString& text); void on_diveSiteDescription_textChanged(const QString& text); void on_diveSiteName_textChanged(const QString& text); diff --git a/qt-ui/maintab.cpp b/qt-ui/maintab.cpp index 2ecfb6c..cc09ed7 100644 --- a/qt-ui/maintab.cpp +++ b/qt-ui/maintab.cpp @@ -21,6 +21,8 @@ #include "divepicturemodel.h" #include "divecomputerextradatamodel.h" #include "divelocationmodel.h" +#include "divesite.h" + #if defined(FBSUPPORT) #include "socialnetworks.h" #endif @@ -55,7 +57,7 @@ MainTab::MainTab(QWidget *parent) : QTabWidget(parent), ui.extraData->setModel(extraDataModel); closeMessage(); - connect(ui.manageDiveSite, SIGNAL(clicked()), this, SLOT(prepareDiveSiteEdit())); + connect(ui.addDiveSite, SIGNAL(clicked()), this, SLOT(prepareDiveSiteEdit())); QAction *action = new QAction(tr("Apply changes"), this); connect(action, SIGNAL(triggered(bool)), this, SLOT(acceptChanges())); @@ -231,17 +233,19 @@ void MainTab::setCurrentLocationIndex() void MainTab::enableGeoLookupEdition() { ui.waitingSpinner->stop(); - ui.manageDiveSite->show(); + ui.addDiveSite->show(); } void MainTab::disableGeoLookupEdition() { ui.waitingSpinner->start(); - ui.manageDiveSite->hide(); + ui.addDiveSite->hide(); } void MainTab::prepareDiveSiteEdit() { - emit requestDiveSiteEdit(displayed_dive.dive_site_uuid); + uint32_t dive_site_uuid = LocationInformationModel::instance()->addDiveSite(tr("Unnamed")); + displayed_dive.dive_site_uuid = dive_site_uuid; + emit requestDiveSiteEdit(dive_site_uuid); } void MainTab::toggleTriggeredColumn() diff --git a/qt-ui/maintab.ui b/qt-ui/maintab.ui index 07c4d9f..d681fbd 100644 --- a/qt-ui/maintab.ui +++ b/qt-ui/maintab.ui @@ -55,8 +55,8 @@ <rect> <x>0</x> <y>0</y> - <width>447</width> - <height>766</height> + <width>445</width> + <height>760</height> </rect> </property> <layout class="QVBoxLayout" name="verticalLayout_3"> @@ -196,9 +196,13 @@ </widget> </item> <item> - <widget class="QPushButton" name="manageDiveSite"> + <widget class="QToolButton" name="addDiveSite"> <property name="text"> - <string>manage</string> + <string>...</string> + </property> + <property name="icon"> + <iconset resource="../subsurface.qrc"> + <normaloff>:/plus</normaloff>:/plus</iconset> </property> </widget> </item> @@ -535,8 +539,8 @@ <rect> <x>0</x> <y>0</y> - <width>447</width> - <height>756</height> + <width>445</width> + <height>754</height> </rect> </property> <layout class="QGridLayout" name="equipmentTabScrollAreaLayout"> @@ -630,8 +634,8 @@ <rect> <x>0</x> <y>0</y> - <width>447</width> - <height>756</height> + <width>445</width> + <height>754</height> </rect> </property> <layout class="QGridLayout" name="diveInfoScrollAreaLayout"> @@ -971,8 +975,8 @@ <rect> <x>0</x> <y>0</y> - <width>447</width> - <height>756</height> + <width>445</width> + <height>754</height> </rect> </property> <layout class="QHBoxLayout" name="horizontalLayout"> diff --git a/qt-ui/mainwindow.cpp b/qt-ui/mainwindow.cpp index f588944..b0456f4 100644 --- a/qt-ui/mainwindow.cpp +++ b/qt-ui/mainwindow.cpp @@ -216,7 +216,7 @@ void MainWindow::on_actionManage_dive_sites_triggered() { } void MainWindow::enableDiveSiteEdit(uint32_t id) { - locationInformationWidget()->setLocationId(displayed_dive.dive_site_uuid); + locationInformationWidget()->setCurrentDiveSiteByUuid(id); setApplicationState("EditDiveSite"); } @@ -419,7 +419,7 @@ void MainWindow::cleanUpEmpty() information()->updateDiveInfo(true); graphics()->setEmptyState(); dive_list()->reload(DiveTripModel::TREE); - locationInformationWidget()->setLocationId(0); + locationInformationWidget()->setCurrentDiveSiteByUuid(0); globe()->reload(); if (!existing_filename) setTitle(MWTF_DEFAULT); @@ -647,7 +647,7 @@ void MainWindow::setupForAddAndPlan(const char *model) // setup the dive cylinders DivePlannerPointsModel::instance()->clear(); DivePlannerPointsModel::instance()->setupCylinders(); - locationInformationWidget()->setLocationId(0); + locationInformationWidget()->setCurrentDiveSiteByUuid(0); } void MainWindow::on_actionReplanDive_triggered() -- 2.4.2
From f97d2fa6e2af3a7b100ccd048cc55c3764de9ad5 Mon Sep 17 00:00:00 2001 From: Tomaz Canabrava <[email protected]> Date: Mon, 1 Jun 2015 16:29:38 -0300 Subject: [PATCH 3/4] Manage Dive Site from the MainMenu Trigger the ManageDiveSite from the MainMenu. Signed-off-by: Tomaz Canabrava <[email protected]> --- qt-ui/mainwindow.cpp | 4 ++++ qt-ui/mainwindow.h | 1 + qt-ui/mainwindow.ui | 10 ++++++++-- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/qt-ui/mainwindow.cpp b/qt-ui/mainwindow.cpp index 8630cfb..f588944 100644 --- a/qt-ui/mainwindow.cpp +++ b/qt-ui/mainwindow.cpp @@ -211,6 +211,10 @@ LocationInformationWidget *MainWindow::locationInformationWidget() { return qobject_cast<LocationInformationWidget*>(applicationState["EditDiveSite"].topLeft); } +void MainWindow::on_actionManage_dive_sites_triggered() { + enableDiveSiteEdit(displayed_dive.dive_site_uuid); +} + void MainWindow::enableDiveSiteEdit(uint32_t id) { locationInformationWidget()->setLocationId(displayed_dive.dive_site_uuid); setApplicationState("EditDiveSite"); diff --git a/qt-ui/mainwindow.h b/qt-ui/mainwindow.h index a9686dc..ea09ca5 100644 --- a/qt-ui/mainwindow.h +++ b/qt-ui/mainwindow.h @@ -138,6 +138,7 @@ slots: void on_actionDivePlanner_triggered(); void on_actionReplanDive_triggered(); void on_action_Check_for_Updates_triggered(); + void on_actionManage_dive_sites_triggered(); void current_dive_changed(int divenr); void initialUiSetup(); diff --git a/qt-ui/mainwindow.ui b/qt-ui/mainwindow.ui index e097b6b..28be048 100644 --- a/qt-ui/mainwindow.ui +++ b/qt-ui/mainwindow.ui @@ -99,6 +99,7 @@ <addaction name="actionEditDive"/> <addaction name="actionDivePlanner"/> <addaction name="actionReplanDive"/> + <addaction name="actionManage_dive_sites"/> <addaction name="copy"/> <addaction name="paste"/> <addaction name="separator"/> @@ -718,12 +719,17 @@ </action> <action name="actionCloudstorageopen"> <property name="text"> - <string>Cloud storage open</string> + <string>C&loud storage open</string> </property> </action> <action name="actionCloudstoragesave"> <property name="text"> - <string>Cloud storage save</string> + <string>Clo&ud storage save</string> + </property> + </action> + <action name="actionManage_dive_sites"> + <property name="text"> + <string>Manage dive sites</string> </property> </action> </widget> -- 2.4.2
From 8cafda62e0f6b431e319e39dadd2a0fb0c37ef56 Mon Sep 17 00:00:00 2001 From: Tomaz Canabrava <[email protected]> Date: Mon, 1 Jun 2015 15:47:25 -0300 Subject: [PATCH 2/4] Add a timeout (500ms) to GeoLoccation discovery GeoLocation discovery would hang if on an incorrectly configured proxy - this way we will finish as soon as it tries to get everything. I also need to see what to do with the dive sites if it fails to find any ( maybe add them brute-forcing stuff? ) Signed-off-by: Tomaz Canabrava <[email protected]> --- divesitehelpers.cpp | 39 ++++++++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/divesitehelpers.cpp b/divesitehelpers.cpp index 8564ce2..51b99f8 100644 --- a/divesitehelpers.cpp +++ b/divesitehelpers.cpp @@ -16,6 +16,7 @@ #include <QNetworkAccessManager> #include <QUrlQuery> #include <QEventLoop> +#include <QTimer> struct GeoLookupInfo { degrees_t lat; @@ -46,21 +47,45 @@ void ReverseGeoLookupThread::run() { QString apiCall("http://open.mapquestapi.com/nominatim/v1/reverse.php?format=json&accept-language=%1&lat=%2&lon=%3"); Q_FOREACH (const GeoLookupInfo& info, geo_lookup_data ) { request.setUrl(apiCall.arg(uiLanguage(NULL)).arg(info.lat.udeg / 1000000.0).arg(info.lon.udeg / 1000000.0)); + QNetworkReply *reply = rgl->get(request); - QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); + QTimer timer; + timer.setSingleShot(true); + + QEventLoop loop; + connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit())); + connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); + timer.start(500); // 30 secs. timeout loop.exec(); - QJsonParseError errorObject; - QJsonDocument jsonDoc = QJsonDocument::fromJson(reply->readAll(), &errorObject); - if (errorObject.error != QJsonParseError::NoError) { - qDebug() << errorObject.errorString(); - } else { + + if(timer.isActive()) { + timer.stop(); + if(reply->error() > 0) + goto clear_reply; + + int v = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); + if (v < 200 || v >= 300) + goto clear_reply; + + QJsonParseError errorObject; + QJsonDocument jsonDoc = QJsonDocument::fromJson(reply->readAll(), &errorObject); + if (errorObject.error != QJsonParseError::NoError) + goto clear_reply; + QJsonObject obj = jsonDoc.object(); QJsonObject address = obj.value("address").toObject(); - qDebug() << "found country:" << address.value("country").toString(); + struct dive_site *ds = get_dive_site_by_uuid(info.uuid); ds->notes = add_to_string(ds->notes, "countrytag: %s", address.value("country").toString().toUtf8().data()); + + } else { + disconnect(reply, SIGNAL(finished()), &loop, SLOT(quit())); + reply->abort(); } + clear_reply: + // UNCOISO + qDebug() << "Clearing one Reply"; reply->deleteLater(); } rgl->deleteLater(); -- 2.4.2
From 4beef3e9a3be7d9f83c8b73f3feeb432f444a4ec Mon Sep 17 00:00:00 2001 From: Tomaz Canabrava <[email protected]> Date: Mon, 1 Jun 2015 15:45:58 -0300 Subject: [PATCH 1/4] Depend on libgit23 on build.sh Since Subsurface master now have the hability to use remote git repositories for storing files, and the current libgit master is the one that have this hability - use it when building with build.sh Signed-off-by: Tomaz Canabrava <[email protected]> --- scripts/build.sh | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/scripts/build.sh b/scripts/build.sh index f4db551..787f4cf 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -40,7 +40,10 @@ if [ ! -d libgit2 ] ; then fi fi cd libgit2 -git checkout v0.22.0 + +#latest working master with correct capabilities for subsurface. +git checkout be5fda75879f7ed8 -B v0.23 + mkdir -p build cd build cmake -DCMAKE_INSTALL_PREFIX=$INSTALL_ROOT -DCMAKE_BUILD_TYPE=Release -DBUILD_CLAR=OFF .. @@ -116,7 +119,7 @@ cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=$INSTALL_ROOT .. \ -DLIBDIVECOMPUTER_INCLUDE_DIR=$INSTALL_ROOT/include \ -DLIBDIVECOMPUTER_LIBRARIES=$INSTALL_ROOT/lib/libdivecomputer.a \ -DMARBLE_INCLUDE_DIR=$INSTALL_ROOT/include \ - -DMARBLE_LIBRARIES=$INSTALL_ROOT/lib/libssrfmarblewidget.$SH_LIB_EXT - + -DMARBLE_LIBRARIES=$INSTALL_ROOT/lib/libssrfmarblewidget.$SH_LIB_EXT \ + -DUSE_LIBGIT23_API=true make -j4 make install -- 2.4.2
_______________________________________________ subsurface mailing list [email protected] http://lists.subsurface-divelog.org/cgi-bin/mailman/listinfo/subsurface
