mirror of
https://github.com/subsurface/subsurface.git
synced 2024-11-30 22:20:21 +00:00
Add undo/redo commands for importing dive sites
ImportDiveSites adds the provided dive sites to the core dive site table and stores the source data so it can be undone. Signed-off-by: Doug Junkins <junkins@foghead.com>
This commit is contained in:
parent
c38a86bebf
commit
704ff9f82e
4 changed files with 59 additions and 1 deletions
|
@ -120,6 +120,11 @@ void addDiveSite(const QString &name)
|
|||
execute(new AddDiveSite(name));
|
||||
}
|
||||
|
||||
void importDiveSites(struct dive_site_table *sites, const QString &source)
|
||||
{
|
||||
execute(new ImportDiveSites(sites, source));
|
||||
}
|
||||
|
||||
void mergeDiveSites(dive_site *ds, const QVector<dive_site *> &sites)
|
||||
{
|
||||
execute(new MergeDiveSites(ds, sites));
|
||||
|
|
|
@ -48,6 +48,7 @@ void editDiveSiteCountry(dive_site *ds, const QString &value);
|
|||
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 importDiveSites(struct dive_site_table *sites, const QString &source);
|
||||
void mergeDiveSites(dive_site *ds, const QVector<dive_site *> &sites);
|
||||
void purgeUnusedDiveSites();
|
||||
|
||||
|
|
|
@ -100,6 +100,42 @@ void AddDiveSite::undo()
|
|||
sitesToAdd = std::move(removeDiveSites(sitesToRemove));
|
||||
}
|
||||
|
||||
ImportDiveSites::ImportDiveSites(struct dive_site_table *sites, const QString &source)
|
||||
{
|
||||
setText(tr("import dive sites from %1").arg(source));
|
||||
|
||||
for (int i = 0; i < sites->nr; ++i) {
|
||||
struct dive_site *new_ds = sites->dive_sites[i];
|
||||
|
||||
// Don't import dive sites that already exist. Currently we only check for
|
||||
// the same name. We might want to be smarter here and merge dive site data, etc.
|
||||
struct dive_site *old_ds = get_same_dive_site(new_ds);
|
||||
if (old_ds) {
|
||||
free_dive_site(new_ds);
|
||||
continue;
|
||||
}
|
||||
sitesToAdd.emplace_back(new_ds);
|
||||
}
|
||||
|
||||
// All site have been consumed
|
||||
sites->nr = 0;
|
||||
}
|
||||
|
||||
bool ImportDiveSites::workToBeDone()
|
||||
{
|
||||
return !sitesToAdd.empty();
|
||||
}
|
||||
|
||||
void ImportDiveSites::redo()
|
||||
{
|
||||
sitesToRemove = std::move(addDiveSites(sitesToAdd));
|
||||
}
|
||||
|
||||
void ImportDiveSites::undo()
|
||||
{
|
||||
sitesToAdd = std::move(removeDiveSites(sitesToRemove));
|
||||
}
|
||||
|
||||
DeleteDiveSites::DeleteDiveSites(const QVector<dive_site *> &sites) : sitesToRemove(sites.toStdVector())
|
||||
{
|
||||
setText(tr("delete %n dive site(s)", "", sites.size()));
|
||||
|
|
|
@ -21,10 +21,26 @@ private:
|
|||
|
||||
// Note: we only add one dive site. Nevertheless, we use vectors so that we
|
||||
// can reuse the dive site deletion code.
|
||||
// For redo
|
||||
// For undo
|
||||
std::vector<dive_site *> sitesToRemove;
|
||||
|
||||
// For redo
|
||||
std::vector<OwningDiveSitePtr> sitesToAdd;
|
||||
};
|
||||
|
||||
class ImportDiveSites : public Base {
|
||||
public:
|
||||
// Note: the dive site table is consumed after the call it will be empty.
|
||||
ImportDiveSites(struct dive_site_table *sites, const QString &source);
|
||||
private:
|
||||
bool workToBeDone() override;
|
||||
void undo() override;
|
||||
void redo() override;
|
||||
|
||||
// For undo
|
||||
std::vector<dive_site *> sitesToRemove;
|
||||
|
||||
// For redo
|
||||
std::vector<OwningDiveSitePtr> sitesToAdd;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue