diff --git a/desktop-widgets/command.cpp b/desktop-widgets/command.cpp index adfd32960..fc7478f94 100644 --- a/desktop-widgets/command.cpp +++ b/desktop-widgets/command.cpp @@ -123,4 +123,9 @@ void mergeDiveSites(dive_site *ds, const QVector &sites) execute(new MergeDiveSites(ds, sites)); } +void purgeUnusedDiveSites() +{ + execute(new PurgeUnusedDiveSites); +} + } // namespace Command diff --git a/desktop-widgets/command.h b/desktop-widgets/command.h index 1bcc69089..134bb0147 100644 --- a/desktop-widgets/command.h +++ b/desktop-widgets/command.h @@ -49,6 +49,7 @@ void editDiveSiteLocation(dive_site *ds, location_t value); void editDiveSiteTaxonomy(dive_site *ds, taxonomy_data &value); // value is consumed (i.e. will be erased after call)! void addDiveSite(const QString &name); void mergeDiveSites(dive_site *ds, const QVector &sites); +void purgeUnusedDiveSites(); } // namespace Command diff --git a/desktop-widgets/command_divesite.cpp b/desktop-widgets/command_divesite.cpp index a5dce00d1..3b35ddcc2 100644 --- a/desktop-widgets/command_divesite.cpp +++ b/desktop-widgets/command_divesite.cpp @@ -105,6 +105,31 @@ void DeleteDiveSites::undo() sitesToRemove = std::move(addDiveSites(sitesToAdd)); } +PurgeUnusedDiveSites::PurgeUnusedDiveSites() +{ + setText(tr("purge unused dive sites")); + for (int i = 0; i < dive_site_table.nr; ++i) { + dive_site *ds = dive_site_table.dive_sites[i]; + if (ds->dives.nr == 0) + sitesToRemove.push_back(ds); + } +} + +bool PurgeUnusedDiveSites::workToBeDone() +{ + return !sitesToRemove.empty(); +} + +void PurgeUnusedDiveSites::redo() +{ + sitesToAdd = std::move(removeDiveSites(sitesToRemove)); +} + +void PurgeUnusedDiveSites::undo() +{ + sitesToRemove = std::move(addDiveSites(sitesToAdd)); +} + // Helper function: swap C and Qt string static void swap(char *&c, QString &q) { diff --git a/desktop-widgets/command_divesite.h b/desktop-widgets/command_divesite.h index 58b3aabf5..9661bbffd 100644 --- a/desktop-widgets/command_divesite.h +++ b/desktop-widgets/command_divesite.h @@ -43,6 +43,21 @@ private: std::vector sitesToAdd; }; +class PurgeUnusedDiveSites : public Base { +public: + PurgeUnusedDiveSites(); +private: + bool workToBeDone() override; + void undo() override; + void redo() override; + + // For redo + std::vector sitesToRemove; + + // For undo + std::vector sitesToAdd; +}; + class EditDiveSiteName : public Base { public: EditDiveSiteName(dive_site *ds, const QString &name); diff --git a/desktop-widgets/tab-widgets/TabDiveSite.cpp b/desktop-widgets/tab-widgets/TabDiveSite.cpp index f021f73dc..dc0b6be67 100644 --- a/desktop-widgets/tab-widgets/TabDiveSite.cpp +++ b/desktop-widgets/tab-widgets/TabDiveSite.cpp @@ -69,3 +69,8 @@ void TabDiveSite::diveSiteChanged(struct dive_site *ds, int field) QModelIndex localIdx = model.mapFromSource(globalIdx); ui.diveSites->view()->scrollTo(localIdx); } + +void TabDiveSite::on_purgeUnused_clicked() +{ + Command::purgeUnusedDiveSites(); +} diff --git a/desktop-widgets/tab-widgets/TabDiveSite.h b/desktop-widgets/tab-widgets/TabDiveSite.h index a31b1629d..b9c07ed69 100644 --- a/desktop-widgets/tab-widgets/TabDiveSite.h +++ b/desktop-widgets/tab-widgets/TabDiveSite.h @@ -16,6 +16,7 @@ private slots: void add(); void diveSiteAdded(struct dive_site *, int idx); void diveSiteChanged(struct dive_site *ds, int field); + void on_purgeUnused_clicked(); private: Ui::TabDiveSite ui; DiveSiteSortedModel model; diff --git a/desktop-widgets/tab-widgets/TabDiveSite.ui b/desktop-widgets/tab-widgets/TabDiveSite.ui index 1d52555e3..b536f101a 100644 --- a/desktop-widgets/tab-widgets/TabDiveSite.ui +++ b/desktop-widgets/tab-widgets/TabDiveSite.ui @@ -14,6 +14,13 @@ Dive sites + + + + Purge unused dive sites + + +