diff options
-rw-r--r-- | core/divelist.c | 40 | ||||
-rw-r--r-- | core/divelist.h | 11 | ||||
-rw-r--r-- | desktop-widgets/command.cpp | 6 | ||||
-rw-r--r-- | desktop-widgets/command.h | 4 | ||||
-rw-r--r-- | desktop-widgets/command_divelist.cpp | 7 | ||||
-rw-r--r-- | desktop-widgets/command_divelist.h | 4 | ||||
-rw-r--r-- | desktop-widgets/divelogimportdialog.cpp | 2 | ||||
-rw-r--r-- | desktop-widgets/downloadfromdivecomputer.cpp | 7 | ||||
-rw-r--r-- | desktop-widgets/mainwindow.cpp | 2 | ||||
-rw-r--r-- | desktop-widgets/subsurfacewebservices.cpp | 2 | ||||
-rw-r--r-- | mobile-widgets/qmlmanager.cpp | 2 | ||||
-rw-r--r-- | qt-models/diveimportedmodel.cpp | 4 | ||||
-rw-r--r-- | tests/testmerge.cpp | 8 | ||||
-rw-r--r-- | tests/testrenumber.cpp | 4 |
14 files changed, 51 insertions, 52 deletions
diff --git a/core/divelist.c b/core/divelist.c index bab581eec..a1e6c08bc 100644 --- a/core/divelist.c +++ b/core/divelist.c @@ -1570,9 +1570,7 @@ static bool merge_dive_tables(struct dive_table *dives_from, struct dive_table * /* Merge the dives of the trip "from" and the dive_table "dives_from" into the trip "to" * and dive_table "dives_to". If "prefer_imported" is true, dive data of "from" takes * precedence */ -void add_imported_dives(struct dive_table *import_table, struct trip_table *import_trip_table, - bool prefer_imported, bool downloaded, bool merge_all_trips, - bool add_to_new_trip) +void add_imported_dives(struct dive_table *import_table, struct trip_table *import_trip_table, int flags) { int i, idx; struct dive_table dives_to_add = { 0 }; @@ -1581,8 +1579,7 @@ void add_imported_dives(struct dive_table *import_table, struct trip_table *impo /* Process imported dives and generate lists of dives * to-be-added and to-be-removed */ - process_imported_dives(import_table, import_trip_table, - prefer_imported, downloaded, merge_all_trips, add_to_new_trip, + process_imported_dives(import_table, import_trip_table, flags, &dives_to_add, &dives_to_remove, &trips_to_add); /* Add new dives to trip, so that trips don't get deleted @@ -1672,16 +1669,19 @@ bool try_to_merge_trip(struct dive_trip *trip_import, struct dive_table *import_ * *not* be part of the trip. The caller has to add them to the trip. * * The lists are generated by merging dives if possible. This is - * performed trip-wise. If "prefer_imported" is true, data of the - * new dives are prioritized in such a case. If "merge_all_trips" is - * true, all overlapping trips will be merged, not only non-autogenerated - * trips. If "downloaded" is true, only the divecomputer of the first dive - * will be considered, as it is assumed that all dives come from - * the same computer. If "add_to_new_trip" is true, dives that are not - * assigned to a trip will be added to a newly generated trip. + * performed trip-wise. Finer control on merging is provided by + * the "flags" parameter: + * - If IMPORT_PREFER_IMPORTED is set, data of the new dives are + * prioritized on merging. + * - If IMPORT_MERGE_ALL_TRIPS is set, all overlapping trips will + * be merged, not only non-autogenerated trips. + * - If IMPORT_IS_DOWNLOADED is true, only the divecomputer of the + * first dive will be considered, as it is assumed that all dives + * come from the same computer. + * - If IMPORT_ADD_TO_NEW_TRIP is true, dives that are not assigned + * to a trip will be added to a newly generated trip. */ -void process_imported_dives(struct dive_table *import_table, struct trip_table *import_trip_table, - bool prefer_imported, bool downloaded, bool merge_all_trips, bool add_to_new_trip, +void process_imported_dives(struct dive_table *import_table, struct trip_table *import_trip_table, int flags, /* output parameters: */ struct dive_table *dives_to_add, struct dive_table *dives_to_remove, struct trip_table *trips_to_add) @@ -1721,7 +1721,7 @@ void process_imported_dives(struct dive_table *import_table, struct trip_table * /* check if we need a nickname for the divecomputer for newly downloaded dives; * since we know they all came from the same divecomputer we just check for the * first one */ - if (downloaded) + if (flags & IMPORT_IS_DOWNLOADED) set_dc_nickname(import_table->dives[0]); else /* they aren't downloaded, so record / check all new ones */ @@ -1734,7 +1734,7 @@ void process_imported_dives(struct dive_table *import_table, struct trip_table * /* Autogroup tripless dives if desired by user. But don't autogroup * if tripless dives should be added to a new trip. */ - if (!add_to_new_trip) + if (!(flags & IMPORT_ADD_TO_NEW_TRIP)) autogroup_dives(import_table, import_trip_table); preexisting = dive_table.nr; /* Remember old size for renumbering */ @@ -1745,8 +1745,8 @@ void process_imported_dives(struct dive_table *import_table, struct trip_table * */ for (i = 0; i < import_trip_table->nr; i++) { trip_import = import_trip_table->trips[i]; - if (merge_all_trips || trip_import->autogen) { - if (try_to_merge_trip(trip_import, import_table, prefer_imported, dives_to_add, dives_to_remove, + if ((flags & IMPORT_MERGE_ALL_TRIPS) || trip_import->autogen) { + if (try_to_merge_trip(trip_import, import_table, flags & IMPORT_PREFER_IMPORTED, dives_to_add, dives_to_remove, &sequence_changed, &start_renumbering_at)) continue; } @@ -1769,7 +1769,7 @@ void process_imported_dives(struct dive_table *import_table, struct trip_table * } import_trip_table->nr = 0; /* All trips were consumed */ - if (add_to_new_trip && import_table->nr > 0) { + if ((flags & IMPORT_ADD_TO_NEW_TRIP) && import_table->nr > 0) { /* Create a new trip for unassigned dives, if desired. */ new_trip = create_trip_from_dive(import_table->dives[0]); insert_trip(new_trip, trips_to_add); @@ -1787,7 +1787,7 @@ void process_imported_dives(struct dive_table *import_table, struct trip_table * /* The remaining dives in import_table are those that don't belong to * a trip and the caller does not want them to be associated to a * new trip. Merge them into the global table. */ - sequence_changed |= merge_dive_tables(import_table, NULL, &dive_table, prefer_imported, NULL, + sequence_changed |= merge_dive_tables(import_table, NULL, &dive_table, flags & IMPORT_PREFER_IMPORTED, NULL, dives_to_add, dives_to_remove, &start_renumbering_at); } diff --git a/core/divelist.h b/core/divelist.h index 5c1667314..ae36de9db 100644 --- a/core/divelist.h +++ b/core/divelist.h @@ -18,10 +18,13 @@ extern int init_decompression(struct deco_state *ds, struct dive *dive); /* divelist core logic functions */ extern void process_loaded_dives(); -extern void add_imported_dives(struct dive_table *import_table, struct trip_table *import_trip_table, - bool prefer_imported, bool downloaded, bool merge_all_trips, bool add_to_new_trip); -extern void process_imported_dives(struct dive_table *import_table, struct trip_table *import_trip_table, - bool prefer_imported, bool downloaded, bool merge_all_trips, bool add_to_new_trip, +/* flags for process_imported_dives() */ +#define IMPORT_PREFER_IMPORTED (1 << 0) +#define IMPORT_IS_DOWNLOADED (1 << 1) +#define IMPORT_MERGE_ALL_TRIPS (1 << 2) +#define IMPORT_ADD_TO_NEW_TRIP (1 << 3) +extern void add_imported_dives(struct dive_table *import_table, struct trip_table *import_trip_table, int flags); +extern void process_imported_dives(struct dive_table *import_table, struct trip_table *import_trip_table, int flags, struct dive_table *dives_to_add, struct dive_table *dives_to_remove, struct trip_table *trips_to_add); extern char *get_dive_gas_string(const struct dive *dive); diff --git a/desktop-widgets/command.cpp b/desktop-widgets/command.cpp index e297f70d0..84f21265d 100644 --- a/desktop-widgets/command.cpp +++ b/desktop-widgets/command.cpp @@ -11,11 +11,9 @@ void addDive(dive *d, bool autogroup, bool newNumber) execute(new AddDive(d, autogroup, newNumber)); } -void importDives(struct dive_table *dives, struct trip_table *trips, - bool prefer_imported, bool downloaded, bool merge_all_trips, - bool add_to_new_trip, const QString &source) +void importDives(struct dive_table *dives, struct trip_table *trips, int flags, const QString &source) { - execute(new ImportDives(dives, trips, prefer_imported, downloaded, merge_all_trips, add_to_new_trip, source)); + execute(new ImportDives(dives, trips, flags, source)); } void deleteDive(const QVector<struct dive*> &divesToDelete) diff --git a/desktop-widgets/command.h b/desktop-widgets/command.h index cbc416e23..d527fff3b 100644 --- a/desktop-widgets/command.h +++ b/desktop-widgets/command.h @@ -21,9 +21,7 @@ void addDive(dive *d, bool autogroup, bool newNumber); // If d->dive_trip is nul // distance are added to a trip. dive d is consumed (the structure is reset)! // If newNumber is true, the dive is assigned a new number, depending on the // insertion position. -void importDives(struct dive_table *dives, struct trip_table *trips, - bool prefer_imported, bool downloaded, bool merge_all_trips, - bool add_to_new_trip, const QString &source); +void importDives(struct dive_table *dives, struct trip_table *trips, int flags, const QString &source); void deleteDive(const QVector<struct dive*> &divesToDelete); void shiftTime(const QVector<dive *> &changedDives, int amount); void renumberDives(const QVector<QPair<dive *, int>> &divesToRenumber); diff --git a/desktop-widgets/command_divelist.cpp b/desktop-widgets/command_divelist.cpp index e7edaaa54..cf8feed0b 100644 --- a/desktop-widgets/command_divelist.cpp +++ b/desktop-widgets/command_divelist.cpp @@ -552,17 +552,14 @@ void AddDive::undoit() MainWindow::instance()->refreshDisplay(false); } -ImportDives::ImportDives(struct dive_table *dives, struct trip_table *trips, - bool prefer_imported, bool downloaded, bool merge_all_trips, - bool add_to_new_trip, const QString &source) +ImportDives::ImportDives(struct dive_table *dives, struct trip_table *trips, int flags, const QString &source) { setText(tr("import %n dive(s) from %1", "", dives->nr).arg(source)); struct dive_table dives_to_add = { 0 }; struct dive_table dives_to_remove = { 0 }; struct trip_table trips_to_add = { 0 }; - process_imported_dives(dives, trips, prefer_imported, downloaded, merge_all_trips, - add_to_new_trip, &dives_to_add, &dives_to_remove, &trips_to_add); + process_imported_dives(dives, trips, flags, &dives_to_add, &dives_to_remove, &trips_to_add); // Add trips to the divesToAdd.trips structure divesToAdd.trips.reserve(trips_to_add.nr); diff --git a/desktop-widgets/command_divelist.h b/desktop-widgets/command_divelist.h index b823da7e7..6cf7f48ab 100644 --- a/desktop-widgets/command_divelist.h +++ b/desktop-widgets/command_divelist.h @@ -98,9 +98,7 @@ private: class ImportDives : public DiveListBase { public: // Note: dives and trips are consumed - after the call they will be empty. - ImportDives(struct dive_table *dives, struct trip_table *trips, - bool prefer_imported, bool downloaded, bool merge_all_trips, - bool add_to_new_trip, const QString &source); + ImportDives(struct dive_table *dives, struct trip_table *trips, int flags, const QString &source); private: void undoit() override; void redoit() override; diff --git a/desktop-widgets/divelogimportdialog.cpp b/desktop-widgets/divelogimportdialog.cpp index 869fb9d25..6965da06c 100644 --- a/desktop-widgets/divelogimportdialog.cpp +++ b/desktop-widgets/divelogimportdialog.cpp @@ -1012,7 +1012,7 @@ void DiveLogImportDialog::on_buttonBox_accepted() } QString source = fileNames.size() == 1 ? fileNames[0] : tr("multiple files"); - Command::importDives(&table, &trips, false, false, true, false, source); + Command::importDives(&table, &trips, IMPORT_MERGE_ALL_TRIPS, source); } TagDragDelegate::TagDragDelegate(QObject *parent) : QStyledItemDelegate(parent) diff --git a/desktop-widgets/downloadfromdivecomputer.cpp b/desktop-widgets/downloadfromdivecomputer.cpp index 3376d5c39..2bad04d1c 100644 --- a/desktop-widgets/downloadfromdivecomputer.cpp +++ b/desktop-widgets/downloadfromdivecomputer.cpp @@ -516,7 +516,12 @@ void DownloadFromDCWidget::on_ok_clicked() if (table->nr > 0) { auto data = thread.data(); - Command::importDives(table, nullptr, preferDownloaded(), true, false, ui.createNewTrip->isChecked(), data->devName()); + int flags = IMPORT_IS_DOWNLOADED; + if (preferDownloaded()) + flags |= IMPORT_IS_DOWNLOADED; + if (ui.createNewTrip->isChecked()) + flags |= IMPORT_ADD_TO_NEW_TRIP; + Command::importDives(table, nullptr, flags, data->devName()); } if (ostcFirmwareCheck && currentState == DONE) diff --git a/desktop-widgets/mainwindow.cpp b/desktop-widgets/mainwindow.cpp index 18b1bd5fa..2fd7232a6 100644 --- a/desktop-widgets/mainwindow.cpp +++ b/desktop-widgets/mainwindow.cpp @@ -1716,7 +1716,7 @@ void MainWindow::importFiles(const QStringList fileNames) parse_file(fileNamePtr.data(), &table, &trips); } QString source = fileNames.size() == 1 ? fileNames[0] : tr("multiple files"); - Command::importDives(&table, &trips, false, false, true, false, source); + Command::importDives(&table, &trips, IMPORT_MERGE_ALL_TRIPS, source); } void MainWindow::loadFiles(const QStringList fileNames) diff --git a/desktop-widgets/subsurfacewebservices.cpp b/desktop-widgets/subsurfacewebservices.cpp index 9dac4dab3..65166b33f 100644 --- a/desktop-widgets/subsurfacewebservices.cpp +++ b/desktop-widgets/subsurfacewebservices.cpp @@ -772,7 +772,7 @@ void DivelogsDeWebServices::buttonClicked(QAbstractButton *button) struct dive_table table = { 0 }; struct trip_table trips = { 0 }; parse_file(QFile::encodeName(zipFile.fileName()), &table, &trips); - Command::importDives(&table, &trips, false, false, true, false, QStringLiteral("divelogs.de")); + Command::importDives(&table, &trips, IMPORT_MERGE_ALL_TRIPS, QStringLiteral("divelogs.de")); /* store last entered user/pass in config */ QSettings s; diff --git a/mobile-widgets/qmlmanager.cpp b/mobile-widgets/qmlmanager.cpp index cc5072a63..570ab0c67 100644 --- a/mobile-widgets/qmlmanager.cpp +++ b/mobile-widgets/qmlmanager.cpp @@ -341,7 +341,7 @@ void QMLManager::mergeLocalRepo() struct dive_table table = { 0 }; struct trip_table trips = { 0 }; parse_file(filename, &table, &trips); - add_imported_dives(&table, &trips, false, false, true, false); + add_imported_dives(&table, &trips, IMPORT_MERGE_ALL_TRIPS); } void QMLManager::copyAppLogToClipboard() diff --git a/qt-models/diveimportedmodel.cpp b/qt-models/diveimportedmodel.cpp index 59fe9b12b..2001f031e 100644 --- a/qt-models/diveimportedmodel.cpp +++ b/qt-models/diveimportedmodel.cpp @@ -157,8 +157,8 @@ void DiveImportedModel::recordDives() delete_dive_from_table(diveTable, j); } - // TODO: Might want to let the user select "add_to_new_trip" - add_imported_dives(diveTable, nullptr, true, true, false, false); + // TODO: Might want to let the user select IMPORT_ADD_TO_NEW_TRIP + add_imported_dives(diveTable, nullptr, IMPORT_PREFER_IMPORTED | IMPORT_IS_DOWNLOADED); } QHash<int, QByteArray> DiveImportedModel::roleNames() const { diff --git a/tests/testmerge.cpp b/tests/testmerge.cpp index dc5ab5a2d..7b1e84149 100644 --- a/tests/testmerge.cpp +++ b/tests/testmerge.cpp @@ -24,9 +24,9 @@ void TestMerge::testMergeEmpty() struct dive_table table = { 0 }; struct trip_table trips = { 0 }; QCOMPARE(parse_file(SUBSURFACE_TEST_DATA "/dives/test47.xml", &table, &trips), 0); - add_imported_dives(&table, &trips, false, false, true, false); + add_imported_dives(&table, &trips, IMPORT_MERGE_ALL_TRIPS); QCOMPARE(parse_file(SUBSURFACE_TEST_DATA "/dives/test48.xml", &table, &trips), 0); - add_imported_dives(&table, &trips, false, false, true, false); + add_imported_dives(&table, &trips, IMPORT_MERGE_ALL_TRIPS); QCOMPARE(save_dives("./testmerge47+48.ssrf"), 0); QFile org(SUBSURFACE_TEST_DATA "/dives/test47+48.xml"); org.open(QFile::ReadOnly); @@ -49,9 +49,9 @@ void TestMerge::testMergeBackwards() struct dive_table table = { 0 }; struct trip_table trips = { 0 }; QCOMPARE(parse_file(SUBSURFACE_TEST_DATA "/dives/test48.xml", &table, &trips), 0); - add_imported_dives(&table, &trips, false, false, true, false); + add_imported_dives(&table, &trips, IMPORT_MERGE_ALL_TRIPS); QCOMPARE(parse_file(SUBSURFACE_TEST_DATA "/dives/test47.xml", &table, &trips), 0); - add_imported_dives(&table, &trips, false, false, true, false); + add_imported_dives(&table, &trips, IMPORT_MERGE_ALL_TRIPS); QCOMPARE(save_dives("./testmerge47+48.ssrf"), 0); QFile org(SUBSURFACE_TEST_DATA "/dives/test47+48.xml"); org.open(QFile::ReadOnly); diff --git a/tests/testrenumber.cpp b/tests/testrenumber.cpp index e7589fc0a..0b766f3cb 100644 --- a/tests/testrenumber.cpp +++ b/tests/testrenumber.cpp @@ -16,7 +16,7 @@ void TestRenumber::testMerge() struct dive_table table = { 0 }; struct trip_table trips = { 0 }; QCOMPARE(parse_file(SUBSURFACE_TEST_DATA "/dives/test47b.xml", &table, &trip_table), 0); - add_imported_dives(&table, &trips, false, false, true, false); + add_imported_dives(&table, &trips, IMPORT_MERGE_ALL_TRIPS); QCOMPARE(dive_table.nr, 1); QCOMPARE(unsaved_changes(), 1); mark_divelist_changed(false); @@ -27,7 +27,7 @@ void TestRenumber::testMergeAndAppend() struct dive_table table = { 0 }; struct trip_table trips = { 0 }; QCOMPARE(parse_file(SUBSURFACE_TEST_DATA "/dives/test47c.xml", &table, &trip_table), 0); - add_imported_dives(&table, &trips, false, false, true, false); + add_imported_dives(&table, &trips, IMPORT_MERGE_ALL_TRIPS); QCOMPARE(dive_table.nr, 2); QCOMPARE(unsaved_changes(), 1); struct dive *d = get_dive(1); |