GapsPage.qml Example File
examples/native/scalability/rounding/GapsPage.qml
import QtQuick 1.1
import Qt.labs.components.native 1.0
Page {
id: gaps
Column {
id: col1
spacing: 20
width: parent.width
anchors {
top: parent.top
left: parent.left
right: parent.right
margins: 15
}
Text {
width: parent.width
text: "The first row demonstrates the effect of not rounding the spacing values between each item"
wrapMode: Text.WordWrap;
color: "white"
font.pixelSize: 15
}
Text {
width: parent.width
text: "The second row illustrates how to evenly distribute a number of items so that the spacing between them is the exact same number of pixels, and any rounding errors are shared into the margins."
wrapMode: Text.WordWrap;
color: "white"
font.pixelSize: 15
}
Text {
width: parent.width
text: "Drag the slider to resize the container. Look at the gap sizes as they approach zero. The second row always looks consistent, although there is a variable margin at the edge."
wrapMode: Text.WordWrap;
color: "white"
font.pixelSize: 15
}
}
Column {
id: col2
width: slider.value
anchors {
left: parent.left
top: col1.bottom
bottom: slider.top
margins: 20
}
spacing: 20
Loader {
width: parent.width
sourceComponent: rounder
Component.onCompleted: item.evenlyDistributed = false
}
Loader {
width: parent.width
sourceComponent: rounder
Component.onCompleted: item.evenlyDistributed = true
}
}
Slider {
id: slider
anchors {
left: parent.left
right: parent.right
bottom: parent.bottom
}
maximumValue : col1.width
minimumValue : 30
value: maximumValue
}
Component {
id: rounder
Item {
id: container
property bool evenlyDistributed: true
height: 30
function layoutChildren() {
if (parent == null || parent.width == 0 || parent.height == 0 || children.length == 0)
return;
var remainingSpace = width
var spacingNotRounded = remainingSpace
var childrenRemaining = children.length - 1
for (var p = 0; p < childrenRemaining; p++) {
spacingNotRounded -= children[p].width
}
spacingNotRounded /= (childrenRemaining + 1)
var spacing = evenlyDistributed ? Math.floor(spacingNotRounded) : spacingNotRounded
var totalRoundingError = (spacingNotRounded - spacing) * (childrenRemaining + 1)
var curPos = Math.floor(totalRoundingError / 2.0)
for (var q = 0; q < childrenRemaining; q++) {
var nextChild = children[q]
curPos += spacing
nextChild.x = curPos
curPos += nextChild.width
}
}
Repeater {
Rectangle {
anchors.verticalCenter: parent.verticalCenter
radius: height / 9
width: 10 * (2 + index)
height: parent.height
color: "white"
}
model: 6
}
Component.onCompleted: container.layoutChildren()
onParentChanged: container.layoutChildren()
onChildrenChanged: container.layoutChildren()
onWidthChanged: container.layoutChildren()
onHeightChanged: container.layoutChildren()
}
}
}