aboutsummaryrefslogtreecommitdiffstats
path: root/src/declarative/util/qdeclarativelistcompositor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/declarative/util/qdeclarativelistcompositor.cpp')
-rw-r--r--src/declarative/util/qdeclarativelistcompositor.cpp78
1 files changed, 62 insertions, 16 deletions
diff --git a/src/declarative/util/qdeclarativelistcompositor.cpp b/src/declarative/util/qdeclarativelistcompositor.cpp
index b081549e59..6fba99fb99 100644
--- a/src/declarative/util/qdeclarativelistcompositor.cpp
+++ b/src/declarative/util/qdeclarativelistcompositor.cpp
@@ -521,7 +521,7 @@ void QDeclarativeListCompositor::move(int from, int to, int count)
Q_ASSERT(qt_verifyIntegrity(ranges, absoluteCount, internalCount));
}
-bool QDeclarativeListCompositor::merge(int from, int to)
+int QDeclarativeListCompositor::merge(int from, int to)
{
int internalIndex = 0;
int internalFrom = 0;
@@ -544,8 +544,10 @@ bool QDeclarativeListCompositor::merge(int from, int to)
internalFrom = internalIndex;
if (range->internal())
internalFrom += relativeFrom;
- relativeTo -= from - relativeFrom;
- internalIndex -= 1;
+ if (from > to)
+ relativeTo -= to - relativeFrom;
+ else
+ relativeTo -= from - relativeFrom;
break;
}
if (range->internal())
@@ -575,16 +577,44 @@ bool QDeclarativeListCompositor::merge(int from, int to)
if (fromRange == ranges.end()
|| toRange == ranges.end()
- || fromRange->list
- || !toRange->list
- || toRange->internal()) {
- return false;
+ || (!fromRange->internal() && !toRange->internal())
+ || (fromRange->list && toRange->list)) {
+ return -1;
+ } else if (fromRange->internal() && toRange->internal()) {
+ if (!mergeInternalData(internalFrom, internalTo))
+ return -1;
+ } else if (fromRange->internal()) {
+ if (!mergeInternalData(internalTo, toRange->list, toRange->index + relativeTo))
+ return -1;
+ } else if (toRange->internal()) {
+ if (!mergeInternalData(internalTo, fromRange->list, fromRange->index + relativeFrom))
+ return -1;
}
- fromRange->count -= 1;
+ void *toList = fromRange->list;
+ int toIndex = fromRange->index + relativeFrom;
- if (fromRange->count == 0)
- ranges.erase(fromRange);
+ fromRange->count -= 1;
+ int removeFrom = fromRange->index + relativeFrom;
+ if (relativeFrom > 0) {
+ int splitOffset = relativeFrom;
+ if (fromRange->list)
+ splitOffset += 1;
+ if (splitOffset < fromRange->count) {
+ fromRange = insert(fromRange, QDeclarativeCompositeRange(
+ fromRange->list, fromRange->index, relativeFrom, fromRange->flags & ~Append));
+ fromRange->index += splitOffset;
+ fromRange->count -= splitOffset;
+ } else {
+ fromRange->index += relativeFrom;
+ }
+ } else if (fromRange->list) {
+ fromRange->index += 1;
+ }
+ if (fromRange->prepend()) {
+ fromRange = insert(fromRange, QDeclarativeCompositeRange(
+ fromRange->list, removeFrom, 1, Null | Prepend));
+ }
if (relativeTo > 0) {
toRange = ++ranges.insert(toRange, QDeclarativeCompositeRange(
@@ -595,19 +625,25 @@ bool QDeclarativeListCompositor::merge(int from, int to)
if (toRange->count == 1 && !toRange->append()) {
toRange->flags |= Internal;
+ if (!toRange->list) {
+ toRange->list = toList;
+ toRange->index = toIndex;
+ }
} else {
- toRange = ++ranges.insert(toRange, QDeclarativeCompositeRange(
- toRange->list, toRange->index, 1, (toRange->flags | Internal) & ~Append));
+ if (toRange->list) {
+ toRange = ++ranges.insert(toRange, QDeclarativeCompositeRange(
+ toRange->list, toRange->index, 1, (toRange->flags | Internal) & ~Append));
+ } else {
+ toRange = ++ranges.insert(toRange, QDeclarativeCompositeRange(
+ toList, toIndex, 1, Internal));
+ }
toRange->index += 1;
toRange->count -= 1;
}
- if (internalFrom != internalTo)
- moveInternalData(internalFrom, internalTo, 1);
-
absoluteCount -= 1;
- return true;
+ return internalTo;
}
void QDeclarativeListCompositor::clear()
@@ -985,6 +1021,16 @@ void QDeclarativeListCompositor::listItemsChanged(void *list, int start, int end
}
}
+bool QDeclarativeListCompositor::mergeInternalData(int, int)
+{
+ return false;
+}
+
+bool QDeclarativeListCompositor::mergeInternalData(int, void *, int)
+{
+ return false;
+}
+
void QDeclarativeListCompositor::compress()
{
}