101 lines
2.9 KiB
QML
101 lines
2.9 KiB
QML
import "root:/config"
|
|
import QtQuick
|
|
import QtQuick.Layouts
|
|
|
|
Rectangle {
|
|
id: root
|
|
|
|
default property alias children: layout.children
|
|
|
|
property bool vertical: false
|
|
property bool homogenous: false
|
|
property bool animated: false
|
|
property int spacing: Appearance.spacing.small
|
|
property var padding: 0
|
|
|
|
readonly property int paddingTop: getRealPadding().top
|
|
readonly property int paddingRight: getRealPadding().right
|
|
readonly property int paddingBottom: getRealPadding().bottom
|
|
readonly property int paddingLeft: getRealPadding().left
|
|
readonly property int paddingX: getRealPadding().x
|
|
readonly property int paddingY: getRealPadding().y
|
|
|
|
function getRealPadding() {
|
|
const pad = {};
|
|
|
|
if (Array.isArray(padding)) {
|
|
if (padding.length === 2) {
|
|
pad.top = pad.bottom = padding[0];
|
|
pad.left = pad.right = padding[1];
|
|
} else if (padding.length === 3) {
|
|
pad.top = padding[0];
|
|
pad.left = pad.right = padding[1];
|
|
pad.bottom = padding[2];
|
|
} else if (padding.length === 4) {
|
|
pad.top = padding[0];
|
|
pad.right = padding[1];
|
|
pad.bottom = padding[2];
|
|
pad.left = padding[3];
|
|
}
|
|
} else {
|
|
pad.top = pad.bottom = pad.left = pad.right = padding;
|
|
}
|
|
|
|
pad.x = pad.left + pad.right;
|
|
pad.y = pad.top + pad.bottom;
|
|
|
|
return pad;
|
|
}
|
|
|
|
function childAt(x: real, y: real): Item {
|
|
return layout.childAt(x, y);
|
|
}
|
|
|
|
color: "transparent"
|
|
|
|
implicitWidth: layout.implicitWidth + paddingX
|
|
implicitHeight: layout.implicitHeight + paddingY
|
|
|
|
GridLayout {
|
|
id: layout
|
|
|
|
x: root.paddingLeft
|
|
y: root.paddingTop
|
|
|
|
flow: root.vertical ? GridLayout.TopToBottom : GridLayout.LeftToRight
|
|
uniformCellWidths: root.homogenous || root.vertical
|
|
uniformCellHeights: root.homogenous || !root.vertical
|
|
rows: root.vertical ? -1 : 1
|
|
columns: root.vertical ? 1 : -1
|
|
rowSpacing: root.spacing
|
|
columnSpacing: root.spacing
|
|
}
|
|
|
|
Behavior on color {
|
|
ColorAnimation {
|
|
duration: Appearance.anim.durations.normal
|
|
easing.type: Easing.BezierSpline
|
|
easing.bezierCurve: Appearance.anim.curves.standard
|
|
}
|
|
}
|
|
|
|
Behavior on implicitWidth {
|
|
enabled: root.animated
|
|
|
|
NumberAnimation {
|
|
duration: Appearance.anim.durations.normal
|
|
easing.type: Easing.BezierSpline
|
|
easing.bezierCurve: Appearance.anim.curves.emphasized
|
|
}
|
|
}
|
|
|
|
Behavior on implicitHeight {
|
|
enabled: root.animated
|
|
|
|
NumberAnimation {
|
|
duration: Appearance.anim.durations.normal
|
|
easing.type: Easing.BezierSpline
|
|
easing.bezierCurve: Appearance.anim.curves.emphasized
|
|
}
|
|
}
|
|
}
|