aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Doug Junkins <junkins@foghead.com>2019-05-04 20:46:42 -0700
committerGravatar bstoeger <32835590+bstoeger@users.noreply.github.com>2019-05-06 10:48:44 +0200
commit98b3a326bd952c616843694821a48e0c029db699 (patch)
tree45038f420e6a8490ed75ddfe92ae0faa7ed1d006
parent704ff9f82e35699dcd5ba260cda798195b0860a5 (diff)
downloadsubsurface-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.md1
-rw-r--r--core/divelist.c2
-rw-r--r--core/divelist.h1
-rw-r--r--desktop-widgets/mainwindow.cpp44
-rw-r--r--desktop-widgets/mainwindow.h2
-rw-r--r--desktop-widgets/mainwindow.ui12
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>&amp;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 &amp;from divelogs.de</string>