summaryrefslogtreecommitdiffstats
path: root/desktop-widgets
diff options
context:
space:
mode:
Diffstat (limited to 'desktop-widgets')
-rw-r--r--desktop-widgets/command_divelist.cpp56
-rw-r--r--desktop-widgets/command_divelist.h27
-rw-r--r--desktop-widgets/command_edit.cpp6
-rw-r--r--desktop-widgets/command_private.cpp7
-rw-r--r--desktop-widgets/command_private.h2
5 files changed, 30 insertions, 68 deletions
diff --git a/desktop-widgets/command_divelist.cpp b/desktop-widgets/command_divelist.cpp
index 26708e07d..5a318e8a3 100644
--- a/desktop-widgets/command_divelist.cpp
+++ b/desktop-widgets/command_divelist.cpp
@@ -21,17 +21,10 @@ namespace Command {
// set and that the trips are added before they are used!
DiveToAdd DiveListBase::removeDive(struct dive *d, std::vector<OwningTripPtr> &tripsToAdd)
{
- // If the dive to be removed is selected, we will inform the frontend
- // later via a signal that the dive changed.
- if (d->selected)
- selectionChanged = true;
-
// If the dive was the current dive, reset the current dive. The calling
// command is responsible of finding a new dive.
- if (d == current_dive) {
- selectionChanged = true; // Should have been set above, as current dive is always selected.
+ if (d == current_dive)
current_dive = nullptr;
- }
// remove dive from trip and site - if this is the last dive in the trip
// remove the whole trip.
@@ -81,11 +74,6 @@ dive *DiveListBase::addDive(DiveToAdd &d)
add_to_dive_table(&dive_table, idx, res); // Return ownership to backend
invalidate_dive_cache(res); // Ensure that dive is written in git_save()
- // If the dive to be removed is selected, we will inform the frontend
- // later via a signal that the dive changed.
- if (res->selected)
- selectionChanged = true;
-
return res;
}
@@ -363,26 +351,14 @@ static void moveDivesBetweenTrips(DivesToTrip &dives)
void DiveListBase::initWork()
{
- selectionChanged = false;
}
void DiveListBase::finishWork()
{
- if (selectionChanged) // If the selection changed -> tell the frontend
- emit diveListNotifier.selectionChanged();
for (dive_site *ds: sitesCountChanged)
emit diveListNotifier.diveSiteDiveCountChanged(ds);
}
-// Rese the selection to the dives of the "selection" vector and send the appropriate signals.
-// Set the current dive to "currentDive". "currentDive" must be an element of "selection" (or
-// null if "seletion" is empty).
-void DiveListBase::restoreSelection(const std::vector<dive *> &selection, dive *currentDive)
-{
- // If anything changed (selection or current dive), send a final signal.
- selectionChanged |= setSelection(selection, currentDive);
-}
-
void DiveListBase::undo()
{
auto marker = diveListNotifier.enterCommand();
@@ -452,7 +428,7 @@ void AddDive::redoit()
sort_trip_table(&trip_table); // Though unlikely, adding a dive may reorder trips
// Select the newly added dive
- restoreSelection(divesAndSitesToRemove.dives, divesAndSitesToRemove.dives[0]);
+ setSelection(divesAndSitesToRemove.dives, divesAndSitesToRemove.dives[0]);
// Exit from edit mode, but don't recalculate dive list
// TODO: Remove edit mode
@@ -466,7 +442,7 @@ void AddDive::undoit()
sort_trip_table(&trip_table); // Though unlikely, removing a dive may reorder trips
// ...and restore the selection
- restoreSelection(selection, currentDive);
+ setSelection(selection, currentDive);
// Exit from edit mode, but don't recalculate dive list
// TODO: Remove edit mode
@@ -529,7 +505,7 @@ void ImportDives::redoit()
divesToAdd = removeDives(divesAndSitesToRemove);
// Select the newly added dives
- restoreSelection(divesAndSitesToRemoveNew.dives, divesAndSitesToRemoveNew.dives.back());
+ setSelection(divesAndSitesToRemoveNew.dives, divesAndSitesToRemoveNew.dives.back());
// Remember dives and sites to remove
divesAndSitesToRemove = std::move(divesAndSitesToRemoveNew);
@@ -547,7 +523,7 @@ void ImportDives::undoit()
divesAndSitesToRemove = std::move(divesAndSitesToRemoveNew);
// ...and restore the selection
- restoreSelection(selection, currentDive);
+ setSelection(selection, currentDive);
}
DeleteDive::DeleteDive(const QVector<struct dive*> &divesToDeleteIn)
@@ -568,7 +544,7 @@ void DeleteDive::undoit()
// Select all re-added dives and make the first one current
dive *currentDive = !divesToDelete.dives.empty() ? divesToDelete.dives[0] : nullptr;
- restoreSelection(divesToDelete.dives, currentDive);
+ setSelection(divesToDelete.dives, currentDive);
}
void DeleteDive::redoit()
@@ -583,9 +559,9 @@ void DeleteDive::redoit()
newCurrent = find_next_visible_dive(when);
}
if (newCurrent)
- restoreSelection(std::vector<dive *>{ newCurrent }, newCurrent);
+ setSelection(std::vector<dive *>{ newCurrent }, newCurrent);
else
- restoreSelection(std::vector<dive *>(), nullptr);
+ setSelection(std::vector<dive *>(), nullptr);
}
@@ -615,7 +591,7 @@ void ShiftTime::redoit()
emit diveListNotifier.divesChanged(diveList, DiveField::DATETIME);
// Select the changed dives
- restoreSelection(diveList.toStdVector(), diveList[0]);
+ setSelection(diveList.toStdVector(), diveList[0]);
// Negate the time-shift so that the next call does the reverse
timeChanged = -timeChanged;
@@ -647,7 +623,7 @@ void RenumberDives::undoit()
dives.reserve(divesToRenumber.size());
for (const QPair<dive *, int> &item: divesToRenumber)
dives.push_back(item.first);
- restoreSelection(dives, dives[0]);
+ setSelection(dives, dives[0]);
}
bool RenumberDives::workToBeDone()
@@ -676,7 +652,7 @@ void TripBase::redoit()
dives.reserve(divesToMove.divesToMove.size());
for (const DiveToTrip &item: divesToMove.divesToMove)
dives.push_back(item.dive);
- restoreSelection(dives, dives[0]);
+ setSelection(dives, dives[0]);
}
void TripBase::undoit()
@@ -799,7 +775,7 @@ void SplitDivesBase::redoit()
unsplitDive = removeDives(diveToSplit);
// Select split dives and make first dive current
- restoreSelection(divesToUnsplit.dives, divesToUnsplit.dives[0]);
+ setSelection(divesToUnsplit.dives, divesToUnsplit.dives[0]);
}
void SplitDivesBase::undoit()
@@ -809,7 +785,7 @@ void SplitDivesBase::undoit()
splitDives = removeDives(divesToUnsplit);
// Select unsplit dive and make it current
- restoreSelection(diveToSplit.dives, diveToSplit.dives[0] );
+ setSelection(diveToSplit.dives, diveToSplit.dives[0] );
}
static std::array<dive *, 2> doSplitDives(const dive *d, duration_t time)
@@ -883,7 +859,7 @@ void DiveComputerBase::redoit()
diveToRemove = std::move(addedDive);
// Select added dive and make it current
- restoreSelection(diveToRemove.dives, diveToRemove.dives[0]);
+ setSelection(diveToRemove.dives, diveToRemove.dives[0]);
// Update the profile to show the first dive computer
dc_number = dc_nr_after;
@@ -1006,7 +982,7 @@ void MergeDives::redoit()
unmergedDives = removeDives(divesToMerge);
// Select merged dive and make it current
- restoreSelection(diveToUnmerge.dives, diveToUnmerge.dives[0]);
+ setSelection(diveToUnmerge.dives, diveToUnmerge.dives[0]);
}
void MergeDives::undoit()
@@ -1016,7 +992,7 @@ void MergeDives::undoit()
renumberDives(divesToRenumber);
// Select unmerged dives and make first one current
- restoreSelection(divesToMerge.dives, divesToMerge.dives[0]);
+ setSelection(divesToMerge.dives, divesToMerge.dives[0]);
}
} // namespace Command
diff --git a/desktop-widgets/command_divelist.h b/desktop-widgets/command_divelist.h
index 152c7365b..20d031f54 100644
--- a/desktop-widgets/command_divelist.h
+++ b/desktop-widgets/command_divelist.h
@@ -49,17 +49,13 @@ struct DivesToTrip
std::vector<OwningTripPtr> tripsToAdd;
};
-// All divelist commands derive from a common base class, which has a flag
-// for when then selection changed. In such a case, in the redo() and undo()
-// methods a signal will be sent. The base-class implements redo() and undo(),
-// which resets the flag and sends a signal. Derived classes implement the
-// virtual methods redoit() and undoit() [Yes, the names could be more expressive].
-// Moreover, the class implements helper methods, which set the selectionChanged
-// flag accordingly.
+// All divelist commands derive from a common base class. It keeps track
+// of dive site counts that may have changed.
+// Derived classes implement the virtual methods redoit() and undoit()
+// [Yes, the names could be more expressive].
class DiveListBase : public Base {
protected:
- // These are helper functions to add / remove dive from the C-core structures,
- // which set the selectionChanged flag if the added / removed dive was selected.
+ // These are helper functions to add / remove dive from the C-core structures.
DiveToAdd removeDive(struct dive *d, std::vector<OwningTripPtr> &tripsToAdd);
dive *addDive(DiveToAdd &d);
DivesAndTripsToAdd removeDives(DivesAndSitesToRemove &divesAndSitesToDelete);
@@ -68,20 +64,11 @@ protected:
// Register dive sites where counts changed so that we can signal the frontend later.
void diveSiteCountChanged(struct dive_site *ds);
- // Set the selection to a given state. Set the selectionChanged flag if anything changed.
- void restoreSelection(const std::vector<dive *> &selection, dive *currentDive);
-
- // Commands set this flag if the selection changed on first execution.
- // Only then, a new the divelist will be scanned again after the command.
- // If this flag is set on first execution, a selectionChanged signal will
- // be sent.
- bool selectionChanged;
-
private:
// Keep track of dive sites where the number of dives changed
std::vector<dive_site *> sitesCountChanged;
- void initWork(); // reset selectionChanged flag
- void finishWork(); // emit signals if selection or dive site counts changed
+ void initWork();
+ void finishWork(); // update dive site counts
void undo() override;
void redo() override;
virtual void redoit() = 0;
diff --git a/desktop-widgets/command_edit.cpp b/desktop-widgets/command_edit.cpp
index 5112043d2..df22552e7 100644
--- a/desktop-widgets/command_edit.cpp
+++ b/desktop-widgets/command_edit.cpp
@@ -99,8 +99,7 @@ void EditBase<T>::undo()
DiveField id = fieldId();
emit diveListNotifier.divesChanged(QVector<dive *>::fromStdVector(dives), id);
- if (setSelection(selectedDives, current))
- emit diveListNotifier.selectionChanged(); // If the selection changed -> tell the frontend
+ setSelection(selectedDives, current);
}
// We have to manually instantiate the constructors of the EditBase class,
@@ -539,8 +538,7 @@ void EditTagsBase::undo()
DiveField id = fieldId();
emit diveListNotifier.divesChanged(QVector<dive *>::fromStdVector(dives), id);
- if (setSelection(selectedDives, current))
- emit diveListNotifier.selectionChanged(); // If the selection changed -> tell the frontend
+ setSelection(selectedDives, current);
}
// Undo and redo do the same as just the stored value is exchanged
diff --git a/desktop-widgets/command_private.cpp b/desktop-widgets/command_private.cpp
index 6dac645b5..0dfd5eea4 100644
--- a/desktop-widgets/command_private.cpp
+++ b/desktop-widgets/command_private.cpp
@@ -42,7 +42,7 @@ static void setClosestCurrentDive(timestamp_t when, const std::vector<dive *> &s
// Reset the selection to the dives of the "selection" vector and send the appropriate signals.
// Set the current dive to "currentDive". "currentDive" must be an element of "selection" (or
// null if "seletion" is empty). Return true if the selection or current dive changed.
-bool setSelection(const std::vector<dive *> &selection, dive *currentDive)
+void setSelection(const std::vector<dive *> &selection, dive *currentDive)
{
// To do so, generate vectors of dives to be selected and deselected.
// We send signals batched by trip, so keep track of trip/dive pairs.
@@ -102,8 +102,9 @@ bool setSelection(const std::vector<dive *> &selection, dive *currentDive)
emit diveListNotifier.currentDiveChanged();
}
- // return true if selection of current dive changed
- return selectionChanged || currentDiveChanged;
+ // If the selection changed -> tell the frontend
+ if (selectionChanged || currentDiveChanged)
+ emit diveListNotifier.selectionChanged();
}
// Turn current selection into a vector.
diff --git a/desktop-widgets/command_private.h b/desktop-widgets/command_private.h
index 6981b6e57..280654a93 100644
--- a/desktop-widgets/command_private.h
+++ b/desktop-widgets/command_private.h
@@ -15,7 +15,7 @@ namespace Command {
// Reset the selection to the dives of the "selection" vector and send the appropriate signals.
// Set the current dive to "currentDive". "currentDive" must be an element of "selection" (or
// null if "seletion" is empty). Return true if the selection or current dive changed.
-bool setSelection(const std::vector<dive *> &selection, dive *currentDive);
+void setSelection(const std::vector<dive *> &selection, dive *currentDive);
// Get currently selectd dives
std::vector<dive *> getDiveSelection();