summaryrefslogtreecommitdiffstats
path: root/core/qthelper.h
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2018-06-30 21:32:14 +0200
committerGravatar Dirk Hohndel <dirk@hohndel.org>2018-07-13 17:07:42 -0700
commit9efb56e2d43161d952efb444d1f13d87bfdd45b5 (patch)
tree6acecf55e52cea217b79d8632ab4c760ddc50070 /core/qthelper.h
parent0aaa1bf3862901933ed68c15a38fed9dc4c621a4 (diff)
downloadsubsurface-9efb56e2d43161d952efb444d1f13d87bfdd45b5.tar.gz
Dive pictures: don't update all images on drag&drop to profile
Gracefully handle drag & drop to the profile, which changes the offset of the pictures. To do this, keep the pictures in the DivePictureModel and the ProfileWidget2 sorted by offset and re-arrange if needed to keep the list sorted. This needs some code reshuffling. Introduce a helper-function that moves ranges in arrays. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'core/qthelper.h')
-rw-r--r--core/qthelper.h26
1 files changed, 26 insertions, 0 deletions
diff --git a/core/qthelper.h b/core/qthelper.h
index a2decd527..e1517991c 100644
--- a/core/qthelper.h
+++ b/core/qthelper.h
@@ -88,6 +88,32 @@ QString getUserAgent();
#define TITLE_OR_TEXT(_t, _m) _t, _m
#endif
+// Move a range in a vector to a different position.
+// The parameters are given according to the usual STL-semantics:
+// v: a container with STL-like random access iterator via std::begin(...)
+// rangeBegin: index of first element
+// rangeEnd: index one *past* last element
+// destination: index to element before which the range will be moved
+// Owing to std::begin() magic, this function works with STL-like containers:
+// QVector<int> v{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
+// moveInVector(v, 1, 4, 6);
+// as well as with C-style arrays:
+// int array[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
+// moveInVector(array, 1, 4, 6);
+// Both calls will have the following effect:
+// Before: 0 1 2 3 4 5 6 7 8 9
+// After: 0 4 5 1 2 3 6 7 8 9
+// No sanitizing of the input arguments is performed.
+template <typename Vector>
+void moveInVector(Vector &v, int rangeBegin, int rangeEnd, int destination)
+{
+ auto it = std::begin(v);
+ if (destination > rangeEnd)
+ std::rotate(it + rangeBegin, it + rangeEnd, it + destination);
+ else if (destination < rangeBegin)
+ std::rotate(it + destination, it + rangeBegin, it + rangeEnd);
+}
+
#endif
// 3) Functions visible to C and C++