diff options
-rw-r--r-- | desktop-widgets/command.cpp | 68 | ||||
-rw-r--r-- | desktop-widgets/command.h | 30 | ||||
-rw-r--r-- | desktop-widgets/command_base.h | 6 | ||||
-rw-r--r-- | desktop-widgets/command_edit.cpp | 20 | ||||
-rw-r--r-- | desktop-widgets/command_edit.h | 30 |
5 files changed, 87 insertions, 67 deletions
diff --git a/desktop-widgets/command.cpp b/desktop-widgets/command.cpp index df1ae299d..4bbd5e059 100644 --- a/desktop-widgets/command.cpp +++ b/desktop-widgets/command.cpp @@ -145,80 +145,88 @@ void purgeUnusedDiveSites() execute(new PurgeUnusedDiveSites); } +// Execute an edit-command and return number of edited dives +static int execute_edit(EditDivesBase *cmd) +{ + int res = cmd->numDives(); + execute(cmd); + return res; +} + // Dive editing related commands -void editNotes(const QString &newValue, bool currentDiveOnly) +int editNotes(const QString &newValue, bool currentDiveOnly) { - execute(new EditNotes(newValue, currentDiveOnly)); + return execute_edit(new EditNotes(newValue, currentDiveOnly)); } -void editMode(int index, int newValue, bool currentDiveOnly) +int editMode(int index, int newValue, bool currentDiveOnly) { - execute(new EditMode(index, newValue, currentDiveOnly)); + return execute_edit(new EditMode(index, newValue, currentDiveOnly)); } -void editSuit(const QString &newValue, bool currentDiveOnly) +int editSuit(const QString &newValue, bool currentDiveOnly) { - execute(new EditSuit(newValue, currentDiveOnly)); + return execute_edit(new EditSuit(newValue, currentDiveOnly)); } -void editRating(int newValue, bool currentDiveOnly) +int editRating(int newValue, bool currentDiveOnly) { - execute(new EditRating(newValue, currentDiveOnly)); + return execute_edit(new EditRating(newValue, currentDiveOnly)); } -void editVisibility(int newValue, bool currentDiveOnly) +int editVisibility(int newValue, bool currentDiveOnly) { - execute(new EditVisibility(newValue, currentDiveOnly)); + return execute_edit(new EditVisibility(newValue, currentDiveOnly)); } -void editAirTemp(int newValue, bool currentDiveOnly) +int editAirTemp(int newValue, bool currentDiveOnly) { - execute(new EditAirTemp(newValue, currentDiveOnly)); + return execute_edit(new EditAirTemp(newValue, currentDiveOnly)); } -void editWaterTemp(int newValue, bool currentDiveOnly) +int editWaterTemp(int newValue, bool currentDiveOnly) { - execute(new EditWaterTemp(newValue, currentDiveOnly)); + return execute_edit(new EditWaterTemp(newValue, currentDiveOnly)); } -void editAtmPress(int newValue, bool currentDiveOnly) +int editAtmPress(int newValue, bool currentDiveOnly) { - execute(new EditAtmPress(newValue, currentDiveOnly)); + return execute_edit(new EditAtmPress(newValue, currentDiveOnly)); } -void editDepth(int newValue, bool currentDiveOnly) +int editDepth(int newValue, bool currentDiveOnly) { - execute(new EditDepth(newValue, currentDiveOnly)); + return execute_edit(new EditDepth(newValue, currentDiveOnly)); } -void editDuration(int newValue, bool currentDiveOnly) +int editDuration(int newValue, bool currentDiveOnly) { - execute(new EditDuration(newValue, currentDiveOnly)); + return execute_edit(new EditDuration(newValue, currentDiveOnly)); } -void editDiveSite(struct dive_site *newValue, bool currentDiveOnly) +int editDiveSite(struct dive_site *newValue, bool currentDiveOnly) { - execute(new EditDiveSite(newValue, currentDiveOnly)); + return execute_edit(new EditDiveSite(newValue, currentDiveOnly)); } -void editDiveSiteNew(const QString &newName, bool currentDiveOnly) +int editDiveSiteNew(const QString &newName, bool currentDiveOnly) { - execute(new EditDiveSiteNew(newName, currentDiveOnly)); + return execute_edit(new EditDiveSiteNew(newName, currentDiveOnly)); } -void editTags(const QStringList &newList, bool currentDiveOnly) +int editTags(const QStringList &newList, bool currentDiveOnly) { - execute(new EditTags(newList, currentDiveOnly)); + return execute_edit(new EditTags(newList, currentDiveOnly)); } -void editBuddies(const QStringList &newList, bool currentDiveOnly) +int editBuddies(const QStringList &newList, bool currentDiveOnly) { - execute(new EditBuddies(newList, currentDiveOnly)); + return execute_edit(new EditBuddies(newList, currentDiveOnly)); } -void editDiveMaster(const QStringList &newList, bool currentDiveOnly) +int editDiveMaster(const QStringList &newList, bool currentDiveOnly) { - execute(new EditDiveMaster(newList, currentDiveOnly)); + return execute_edit(new EditDiveMaster(newList, currentDiveOnly)); } void pasteDives(const dive *d, dive_components what) diff --git a/desktop-widgets/command.h b/desktop-widgets/command.h index 497c59a9a..6fbd6bab5 100644 --- a/desktop-widgets/command.h +++ b/desktop-widgets/command.h @@ -56,21 +56,21 @@ void purgeUnusedDiveSites(); // 4) Dive editing related commands -void editNotes(const QString &newValue, bool currentDiveOnly); -void editSuit(const QString &newValue, bool currentDiveOnly); -void editMode(int index, int newValue, bool currentDiveOnly); -void editRating(int newValue, bool currentDiveOnly); -void editVisibility(int newValue, bool currentDiveOnly); -void editAirTemp(int newValue, bool currentDiveOnly); -void editWaterTemp(int newValue, bool currentDiveOnly); -void editAtmPress(int newValue, bool currentDiveOnly); -void editDepth(int newValue, bool currentDiveOnly); -void editDuration(int newValue, bool currentDiveOnly); -void editDiveSite(struct dive_site *newValue, bool currentDiveOnly); -void editDiveSiteNew(const QString &newName, bool currentDiveOnly); -void editTags(const QStringList &newList, bool currentDiveOnly); -void editBuddies(const QStringList &newList, bool currentDiveOnly); -void editDiveMaster(const QStringList &newList, bool currentDiveOnly); +int editNotes(const QString &newValue, bool currentDiveOnly); +int editSuit(const QString &newValue, bool currentDiveOnly); +int editMode(int index, int newValue, bool currentDiveOnly); +int editRating(int newValue, bool currentDiveOnly); +int editVisibility(int newValue, bool currentDiveOnly); +int editAirTemp(int newValue, bool currentDiveOnly); +int editWaterTemp(int newValue, bool currentDiveOnly); +int editAtmPress(int newValue, bool currentDiveOnly); +int editDepth(int newValue, bool currentDiveOnly); +int editDuration(int newValue, bool currentDiveOnly); +int editDiveSite(struct dive_site *newValue, bool currentDiveOnly); +int editDiveSiteNew(const QString &newName, bool currentDiveOnly); +int editTags(const QStringList &newList, bool currentDiveOnly); +int editBuddies(const QStringList &newList, bool currentDiveOnly); +int editDiveMaster(const QStringList &newList, bool currentDiveOnly); void pasteDives(const dive *d, dive_components what); // 4) Trip editing commands diff --git a/desktop-widgets/command_base.h b/desktop-widgets/command_base.h index 26744dc87..cf8f248d2 100644 --- a/desktop-widgets/command_base.h +++ b/desktop-widgets/command_base.h @@ -166,9 +166,9 @@ public: virtual bool workToBeDone() = 0; }; -// Put a command on the undoStack, but test whether there is something to be done -// beforehand by calling the workToBeDone() function. If nothing is to be done, -// the command will be deleted. +// Put a command on the undoStack (and take ownership), but test whether there +// is something to be done beforehand by calling the workToBeDone() function. +// If nothing is to be done, the command will be deleted. void execute(Base *cmd); } // namespace Command diff --git a/desktop-widgets/command_edit.cpp b/desktop-widgets/command_edit.cpp index ff0bd871a..2c9d56ba5 100644 --- a/desktop-widgets/command_edit.cpp +++ b/desktop-widgets/command_edit.cpp @@ -25,15 +25,25 @@ static std::vector<dive *> getDives(bool currentDiveOnly) return res; } -template<typename T> -EditBase<T>::EditBase(T newValue, bool currentDiveOnly) : - value(std::move(newValue)), +EditDivesBase::EditDivesBase(bool currentDiveOnly) : dives(getDives(currentDiveOnly)), selectedDives(getDiveSelection()), current(current_dive) { } +int EditDivesBase::numDives() const +{ + return dives.size(); +} + +template<typename T> +EditBase<T>::EditBase(T newValue, bool currentDiveOnly) : + EditDivesBase(currentDiveOnly), + value(std::move(newValue)) +{ +} + // This is quite hackish: we can't use virtual functions in the constructor and // therefore can't initialize the list of dives [the values of the dives are // accessed by virtual functions]. Therefore, we (mis)use the fact that workToBeDone() @@ -439,9 +449,7 @@ DiveField EditMode::fieldId() const // ***** Tag based commands ***** EditTagsBase::EditTagsBase(const QStringList &newListIn, bool currentDiveOnly) : - dives(getDives(currentDiveOnly)), - selectedDives(getDiveSelection()), - current(current_dive), + EditDivesBase(currentDiveOnly), newList(newListIn) { } diff --git a/desktop-widgets/command_edit.h b/desktop-widgets/command_edit.h index a1050d65e..13f1e3bbf 100644 --- a/desktop-widgets/command_edit.h +++ b/desktop-widgets/command_edit.h @@ -23,8 +23,23 @@ // We put everything in a namespace, so that we can shorten names without polluting the global namespace namespace Command { +// Base class for commands that have a list of dives. +// This is used for extracting the number of dives and show a +// warning message when multiple dives are edited. +class EditDivesBase : public Base { +protected: + EditDivesBase(bool currentDiveOnly); + std::vector<dive *> dives; // Dives to be edited. + + // On undo, we set the selection and current dive at the time of the operation. + std::vector<dive *> selectedDives; + struct dive *current; +public: + int numDives() const; +}; + template <typename T> -class EditBase : public Base { +class EditBase : public EditDivesBase { protected: T value; // Value to be set T old; // Previous value @@ -33,10 +48,6 @@ protected: void redo() override; bool workToBeDone() override; - std::vector<dive *> dives; // Dives to be edited. - // On undo, we set the selection and current dive at the time of the operation. - std::vector<dive *> selectedDives; - struct dive *current; public: EditBase(T newValue, bool currentDiveOnly); @@ -166,16 +177,9 @@ public: // Fields that work with tag-lists (tags, buddies, divemasters) work differently and therefore // have their own base class. In this case, it's not a template, as all these lists are base // on strings. -class EditTagsBase : public Base { +class EditTagsBase : public EditDivesBase { bool workToBeDone() override; - // Dives to be edited. For historical reasons, the *last* entry was - // the active dive when the user initialized the action. This dive - // will be made the current dive on redo / undo. - std::vector<dive *> dives; - // On undo, we set the selection and current dive at the time of the operation. - std::vector<dive *> selectedDives; - struct dive *current; QStringList newList; // Temporary until initialized public: EditTagsBase(const QStringList &newList, bool currentDiveOnly); |