diff options
author | Doug Junkins <junkins@foghead.com> | 2019-05-04 20:46:42 -0700 |
---|---|---|
committer | bstoeger <32835590+bstoeger@users.noreply.github.com> | 2019-05-06 10:48:44 +0200 |
commit | 98b3a326bd952c616843694821a48e0c029db699 (patch) | |
tree | 45038f420e6a8490ed75ddfe92ae0faa7ed1d006 | |
parent | 704ff9f82e35699dcd5ba260cda798195b0860a5 (diff) | |
download | subsurface-98b3a326bd952c616843694821a48e0c029db699.tar.gz |
Add "Import dive sites" menu to mainwindow
Adds "Import->Import dive sites" menu to mainwindow.cpp and adds the
on_actionImportDiveSites_triggered() method to prompt for the filename
to import from. The files are parsed and then any dive and trip data is
cleared before opening a dialog box to select which sites are to be
imported.
Signed-off-by: Doug Junkins <junkins@foghead.com>
-rw-r--r-- | CHANGELOG.md | 1 | ||||
-rw-r--r-- | core/divelist.c | 2 | ||||
-rw-r--r-- | core/divelist.h | 1 | ||||
-rw-r--r-- | desktop-widgets/mainwindow.cpp | 44 | ||||
-rw-r--r-- | desktop-widgets/mainwindow.h | 2 | ||||
-rw-r--r-- | desktop-widgets/mainwindow.ui | 12 |
6 files changed, 61 insertions, 1 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b3930ac7..74fefffd0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- Desktop: Add import dive site menu option and site selection dialog - Core: fix bug in get_distance() to correctly compute spherical distance - Desktop: For videos, add save data export as subtitle file - Desktop: make dive sites 1st class citizens with their own dive site table diff --git a/core/divelist.c b/core/divelist.c index 010ef244a..fb9ee5c13 100644 --- a/core/divelist.c +++ b/core/divelist.c @@ -1292,7 +1292,7 @@ void clear_table(struct dive_table *table) table->nr = 0; } -static void clear_trip_table(struct trip_table *table) +void clear_trip_table(struct trip_table *table) { for (int i = 0; i < table->nr; i++) free_trip(table->trips[i]); diff --git a/core/divelist.h b/core/divelist.h index ae71040c4..86f40941f 100644 --- a/core/divelist.h +++ b/core/divelist.h @@ -69,6 +69,7 @@ void report_datafile_version(int version); int get_dive_id_closest_to(timestamp_t when); void clear_dive_file_data(); void clear_table(struct dive_table *table); +void clear_trip_table(struct trip_table *table); typedef enum {PO2VAL, SINGLE_EXP, SINGLE_SLOPE, DAILY_EXP, DAILY_SLOPE, NO_COLUMNS} cns_table_headers; diff --git a/desktop-widgets/mainwindow.cpp b/desktop-widgets/mainwindow.cpp index 9ff6808c5..18571e3b8 100644 --- a/desktop-widgets/mainwindow.cpp +++ b/desktop-widgets/mainwindow.cpp @@ -43,6 +43,7 @@ #include "desktop-widgets/divelistview.h" #include "desktop-widgets/divelogexportdialog.h" #include "desktop-widgets/divelogimportdialog.h" +#include "desktop-widgets/divesiteimportdialog.h" #include "desktop-widgets/diveplanner.h" #include "desktop-widgets/downloadfromdivecomputer.h" #include "desktop-widgets/findmovedimagesdialog.h" @@ -1338,6 +1339,18 @@ QString MainWindow::filter_import() return f; } +QString MainWindow::filter_import_dive_sites() +{ + QString f = tr("Dive site files") + + " (*.ssrf" + " *.xml" + ");;"; + + f += tr("All files") + " (*.*)"; + + return f; +} + bool MainWindow::askSaveChanges() { QMessageBox response(this); @@ -1748,6 +1761,37 @@ void MainWindow::on_actionImportDiveLog_triggered() } } +void MainWindow::on_actionImportDiveSites_triggered() +{ + QStringList fileNames = QFileDialog::getOpenFileNames(this, tr("Open dive site file"), lastUsedDir(), filter_import_dive_sites()); + + if (fileNames.isEmpty()) + return; + updateLastUsedDir(QFileInfo(fileNames[0]).dir().path()); + + struct dive_table table = { 0 }; + struct trip_table trips = { 0 }; + struct dive_site_table sites = { 0 }; + + for (const QString &s: fileNames) { + QByteArray fileNamePtr = QFile::encodeName(s); + parse_file(fileNamePtr.data(), &table, &trips, &sites); + } + // The imported dive sites still have pointers to imported dives - remove them + for (int i = 0; i < sites.nr; ++i) + sites.dive_sites[i]->dives.nr = 0; + + // Now we can clear the imported dives and trips. + clear_table(&table); + clear_trip_table(&trips); + + QString source = fileNames.size() == 1 ? fileNames[0] : tr("multiple files"); + + // sites table will be cleared by DivesiteImportDialog constructor + DivesiteImportDialog divesiteImport(sites, source, this); + divesiteImport.exec(); +} + void MainWindow::editCurrentDive() { if (!current_dive) diff --git a/desktop-widgets/mainwindow.h b/desktop-widgets/mainwindow.h index 252a95b98..805900a74 100644 --- a/desktop-widgets/mainwindow.h +++ b/desktop-widgets/mainwindow.h @@ -139,6 +139,7 @@ slots: void initialUiSetup(); void on_actionImportDiveLog_triggered(); + void on_actionImportDiveSites_triggered(); /* TODO: Move those slots below to it's own class */ void on_actionExport_triggered(); @@ -192,6 +193,7 @@ private: CurrentState stateBeforeEdit; QString filter_open(); QString filter_import(); + QString filter_import_dive_sites(); static MainWindow *m_Instance; QString displayedFilename(QString fullFilename); bool askSaveChanges(); diff --git a/desktop-widgets/mainwindow.ui b/desktop-widgets/mainwindow.ui index 3548280e8..07886b18e 100644 --- a/desktop-widgets/mainwindow.ui +++ b/desktop-widgets/mainwindow.ui @@ -130,6 +130,7 @@ </property> <addaction name="actionDownloadDC"/> <addaction name="actionImportDiveLog"/> + <addaction name="actionImportDiveSites"/> <addaction name="actionDivelogs_de"/> </widget> <widget class="QMenu" name="menu_Edit"> @@ -381,6 +382,17 @@ <string notr="true">Ctrl+I</string> </property> </action> + <action name="actionImportDiveSites"> + <property name="text"> + <string>&Import dive sites</string> + </property> + <property name="toolTip"> + <string>Import dive sites from other users</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+J</string> + </property> + </action> <action name="actionDivelogs_de"> <property name="text"> <string>Import &from divelogs.de</string> |