diff options
author | Mitch Curtis <mitch.curtis@qt.io> | 2024-05-09 14:58:05 +0800 |
---|---|---|
committer | Mitch Curtis <mitch.curtis@qt.io> | 2024-05-10 14:45:41 +0800 |
commit | e11637d28f33d5e4c4d1d09fd23ef4364151d625 (patch) | |
tree | d44280f9dc2f7df446d86ee94710f813325358bd /tests | |
parent | a5edb49c8fe8ae72aaaf7fed3a3f27b3d78ea9cd (diff) |
SplitView: fix resized item jumping in size when an item is hidden
The logic that handles the item to the left of the handle being resized
incorrectly used a hidden handle as the leftEdge. This would cause the
item to get more space than it should because it thought it had more
space to consume.
Before the fix, leftEdge is 10 and accumulated is 0, so:
// 390 400 0 10
const qreal rightStop = size - accumulated - pressedHandleSize;
// 110 10 110
qreal leftStop = qMax(leftEdge, pressedHandlePos);
// 110 110 110 390
const qreal newHandlePos = qBound(leftStop, pressedHandlePos, rightStop);
// 100 110 10
const qreal newItemSize = newHandlePos - leftEdge;
After the fix, leftEdge is 60 and accumulated is 0, so:
// 390 400 0 10
const qreal rightStop = size - accumulated - pressedHandleSize;
// 110 60 110
qreal leftStop = qMax(leftEdge, pressedHandlePos);
// 110 110 110 390
const qreal newHandlePos = qBound(leftStop, pressedHandlePos, rightStop);
// 50 110 60
const qreal newItemSize = newHandlePos - leftEdge;
Fixes: QTBUG-125049
Pick-to: 6.5 6.7
Change-Id: I3cdf57693c71c1f367780eda0ff6794fea02d546
Reviewed-by: Kaj Grönholm <kaj.gronholm@qt.io>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/quickcontrols/controls/data/tst_splitview.qml | 99 |
1 files changed, 91 insertions, 8 deletions
diff --git a/tests/auto/quickcontrols/controls/data/tst_splitview.qml b/tests/auto/quickcontrols/controls/data/tst_splitview.qml index 3bcf9a53c6..aed303689a 100644 --- a/tests/auto/quickcontrols/controls/data/tst_splitview.qml +++ b/tests/auto/quickcontrols/controls/data/tst_splitview.qml @@ -74,20 +74,19 @@ TestCase { // Note that the indices mentioned here account for handles; they do not // match the indices reported by QQuickSplitView's logging categories. compare(item.x, expectedGeometry.x, "Mismatch in actual vs expected x value of " - + itemType + " at index " + typeSpecificIndex + context) + + itemType + " " + item + " at index " + typeSpecificIndex + context) compare(item.y, expectedGeometry.y, "Mismatch in actual vs expected y value of " - + itemType + " at index " + typeSpecificIndex + context) + + itemType + " " + item + " at index " + typeSpecificIndex + context) compare(item.width, expectedGeometry.width, "Mismatch in actual vs expected width value of " - + itemType + " at index " + typeSpecificIndex + context) + + itemType + " " + item + " at index " + typeSpecificIndex + context) compare(item.height, expectedGeometry.height, "Mismatch in actual vs expected height value of " - + itemType + " at index " + typeSpecificIndex + context) + + itemType + " " + item + " at index " + typeSpecificIndex + context) } } property real defaultHorizontalHandleWidth: 10 property real defaultVerticalHandleHeight: 10 - Component { id: signalSpyComponent SignalSpy {} @@ -96,14 +95,14 @@ TestCase { Component { id: handleComponent Rectangle { - objectName: "handle" + objectName: `handle ${x},${y} ${width}x${height} visible: ${visible}` implicitWidth: defaultHorizontalHandleWidth implicitHeight: defaultVerticalHandleHeight color: "#444" Text { - objectName: "handleText_" + text - text: parent.x + "," + parent.y + " " + parent.width + "x" + parent.height + objectName: text + "_Text" + text: parent.objectName color: "white" anchors.centerIn: parent rotation: 90 @@ -2678,4 +2677,88 @@ TestCase { verify(!firstHandle.SplitHandle.pressed) compare(firstItem.width, 125) } + + Component { + id: hiddenItemComponent + + SplitView { + anchors.fill: parent + handle: handleComponent + orientation: Qt.Horizontal + + component SplitItem: Rectangle { + objectName: labelText + + SplitView.preferredWidth: 50 + SplitView.fillHeight: true + + required property string labelText + + Text { + anchors.fill: parent + wrapMode: Text.Wrap + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + text: `${parent.labelText} - width: ${parent.width.toFixed(2)}` + } + } + + SplitItem { + color: "blue" + labelText: "View 1" + } + SplitItem { + color: "red" + labelText: "View 2 (hidden)" + visible: false + } + SplitItem { + color: "purple" + labelText: "View 3" + } + SplitItem { + color: "yellow" + labelText: "View 4" + } + } + } + + function test_resizeHiddenItem() { + let control = createTemporaryObject(hiddenItemComponent, testCase) + verify(control) + + const standardItemWidth = 50 + let expectedGeometries = [ + // First item. + { x: 0, y: 0, width: standardItemWidth, height: control.height }, + // First handle. + { x: standardItemWidth, y: 0, width: defaultHorizontalHandleWidth, height: control.height }, + // The second item and its handle are hidden. + { hidden: true }, + { hidden: true }, + // Third item. + { x: standardItemWidth + defaultHorizontalHandleWidth, y: 0, width: standardItemWidth, height: control.height }, + // Third handle. + { x: (standardItemWidth * 2) + defaultHorizontalHandleWidth, y: 0, width: defaultHorizontalHandleWidth, height: control.height }, + // Fourth item. + { x: (standardItemWidth * 2) + (defaultHorizontalHandleWidth * 2), y: 0, + width: control.width - (standardItemWidth * 2) - (defaultHorizontalHandleWidth * 2), height: control.height } + ] + compareSizes(control, expectedGeometries, "before dragging handle") + + // Drag the third handle to the right. + let handles = findHandles(control) + let thirdHandle = handles[2] + // The third (index 4 here) item should get one pixel bigger, and the fourth one pixel smaller. + ++expectedGeometries[4].width + ++expectedGeometries[5].x // handle + ++expectedGeometries[6].x + --expectedGeometries[6].width + // Use individual events rather than mouseDrag because that will move it past the drag threshold, + // which we don't want, since we only want to move by 1 pixel. + mousePress(thirdHandle) + mouseMove(thirdHandle, thirdHandle.width / 2 + 1, thirdHandle.height / 2, 16) + mouseRelease(thirdHandle) + compareSizes(control, expectedGeometries, "after dragging handle") + } } |