mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
undo: implement ApplyGPSFixes undo command
This gets a list of dives with GPS fixes and 1) Adds new dive sites if the dive hasn't a dive site set 2) Edits the location of the dive site Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
parent
89047b3541
commit
93bdaa9bb5
4 changed files with 81 additions and 1 deletions
|
@ -145,6 +145,11 @@ void purgeUnusedDiveSites()
|
||||||
execute(new PurgeUnusedDiveSites);
|
execute(new PurgeUnusedDiveSites);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void applyGPSFixes(const std::vector<DiveAndLocation> &fixes)
|
||||||
|
{
|
||||||
|
execute(new ApplyGPSFixes(fixes));
|
||||||
|
}
|
||||||
|
|
||||||
// Execute an edit-command and return number of edited dives
|
// Execute an edit-command and return number of edited dives
|
||||||
static int execute_edit(EditDivesBase *cmd)
|
static int execute_edit(EditDivesBase *cmd)
|
||||||
{
|
{
|
||||||
|
|
|
@ -5,6 +5,9 @@
|
||||||
#include "core/dive.h"
|
#include "core/dive.h"
|
||||||
#include <QVector>
|
#include <QVector>
|
||||||
#include <QAction>
|
#include <QAction>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
struct DiveAndLocation;
|
||||||
|
|
||||||
// We put everything in a namespace, so that we can shorten names without polluting the global namespace
|
// We put everything in a namespace, so that we can shorten names without polluting the global namespace
|
||||||
namespace Command {
|
namespace Command {
|
||||||
|
@ -41,6 +44,7 @@ void splitDiveComputer(dive *d, int dc_num);
|
||||||
void moveDiveComputerToFront(dive *d, int dc_num);
|
void moveDiveComputerToFront(dive *d, int dc_num);
|
||||||
void deleteDiveComputer(dive *d, int dc_num);
|
void deleteDiveComputer(dive *d, int dc_num);
|
||||||
void mergeDives(const QVector <dive *> &dives);
|
void mergeDives(const QVector <dive *> &dives);
|
||||||
|
void applyGPSFixes(const std::vector<DiveAndLocation> &fixes);
|
||||||
|
|
||||||
// 3) Dive-site related commands
|
// 3) Dive-site related commands
|
||||||
|
|
||||||
|
|
|
@ -391,4 +391,51 @@ void MergeDiveSites::undo()
|
||||||
emit diveListNotifier.divesChanged(divesChanged, DiveField::DIVESITE);
|
emit diveListNotifier.divesChanged(divesChanged, DiveField::DIVESITE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ApplyGPSFixes::ApplyGPSFixes(const std::vector<DiveAndLocation> &fixes)
|
||||||
|
{
|
||||||
|
setText(tr("apply GPS fixes"));
|
||||||
|
|
||||||
|
for (const DiveAndLocation &dl: fixes) {
|
||||||
|
struct dive_site *ds = dl.d->dive_site;
|
||||||
|
if (ds) {
|
||||||
|
// Arbitrary choice: if we find multiple fixes for the same dive, we use the first one.
|
||||||
|
if (std::find_if(siteLocations.begin(), siteLocations.end(),
|
||||||
|
[ds] (const SiteAndLocation &sl) { return sl.ds == ds; }) == siteLocations.end()) {
|
||||||
|
siteLocations.push_back({ ds, dl.location });
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ds = create_dive_site(qPrintable(dl.name), &dive_site_table);
|
||||||
|
ds->location = dl.location;
|
||||||
|
add_dive_to_dive_site(dl.d, ds);
|
||||||
|
dl.d->dive_site = nullptr; // This will be set on redo()
|
||||||
|
sitesToAdd.emplace_back(ds);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ApplyGPSFixes::workToBeDone()
|
||||||
|
{
|
||||||
|
return !sitesToAdd.empty() || !siteLocations.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ApplyGPSFixes::editDiveSites()
|
||||||
|
{
|
||||||
|
for (SiteAndLocation &sl: siteLocations) {
|
||||||
|
std::swap(sl.location, sl.ds->location);
|
||||||
|
emit diveListNotifier.diveSiteChanged(sl.ds, LocationInformationModel::LOCATION); // Inform frontend of changed dive site.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ApplyGPSFixes::redo()
|
||||||
|
{
|
||||||
|
sitesToRemove = addDiveSites(sitesToAdd);
|
||||||
|
editDiveSites();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ApplyGPSFixes::undo()
|
||||||
|
{
|
||||||
|
sitesToAdd = removeDiveSites(sitesToRemove);
|
||||||
|
editDiveSites();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Command
|
} // namespace Command
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#define COMMAND_DIVESITE_H
|
#define COMMAND_DIVESITE_H
|
||||||
|
|
||||||
#include "command_base.h"
|
#include "command_base.h"
|
||||||
|
#include "core/gpslocation.h"
|
||||||
|
|
||||||
#include <QVector>
|
#include <QVector>
|
||||||
|
|
||||||
|
@ -110,7 +111,6 @@ private:
|
||||||
QString value; // Value to be set
|
QString value; // Value to be set
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class EditDiveSiteCountry : public Base {
|
class EditDiveSiteCountry : public Base {
|
||||||
public:
|
public:
|
||||||
EditDiveSiteCountry(dive_site *ds, const QString &country);
|
EditDiveSiteCountry(dive_site *ds, const QString &country);
|
||||||
|
@ -165,6 +165,30 @@ private:
|
||||||
std::vector<OwningDiveSitePtr> sitesToAdd;
|
std::vector<OwningDiveSitePtr> sitesToAdd;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class ApplyGPSFixes : public Base {
|
||||||
|
public:
|
||||||
|
// Note: the dive site table is consumed after the call it will be empty.
|
||||||
|
ApplyGPSFixes(const std::vector<DiveAndLocation> &fixes);
|
||||||
|
private:
|
||||||
|
bool workToBeDone() override;
|
||||||
|
void undo() override;
|
||||||
|
void redo() override;
|
||||||
|
|
||||||
|
// For undo
|
||||||
|
std::vector<dive_site *> sitesToRemove;
|
||||||
|
|
||||||
|
// For redo
|
||||||
|
std::vector<OwningDiveSitePtr> sitesToAdd;
|
||||||
|
|
||||||
|
// For redo and undo
|
||||||
|
struct SiteAndLocation {
|
||||||
|
dive_site *ds;
|
||||||
|
location_t location;
|
||||||
|
};
|
||||||
|
std::vector<SiteAndLocation> siteLocations;
|
||||||
|
void editDiveSites();
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace Command
|
} // namespace Command
|
||||||
|
|
||||||
#endif // COMMAND_DIVESITE_H
|
#endif // COMMAND_DIVESITE_H
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue