diff options
Diffstat (limited to 'widgets/Box.qml')
| -rw-r--r-- | widgets/Box.qml | 90 |
1 files changed, 80 insertions, 10 deletions
diff --git a/widgets/Box.qml b/widgets/Box.qml index c0d7f06..536469e 100644 --- a/widgets/Box.qml +++ b/widgets/Box.qml @@ -1,16 +1,86 @@ import "root:/config" -import QtQuick.Layouts +import QtQuick + +Rectangle { + id: root -GridLayout { property bool vertical: false - property real spacing: Appearance.spacing.small 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 + + color: "transparent" + + implicitWidth: childrenRect.width + paddingX + implicitHeight: childrenRect.height + paddingY + + 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; + } + + onChildrenChanged: { + for (const child of children) { + child.x = Qt.binding(() => paddingLeft); + child.y = Qt.binding(() => paddingTop); + } + } + + 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 - flow: vertical ? GridLayout.TopToBottom : GridLayout.LeftToRight - uniformCellWidths: homogenous && vertical - uniformCellHeights: homogenous && !vertical - rows: vertical ? -1 : 1 - columns: vertical ? 1 : -1 - rowSpacing: spacing - columnSpacing: spacing + NumberAnimation { + duration: Appearance.anim.durations.normal + easing.type: Easing.BezierSpline + easing.bezierCurve: Appearance.anim.curves.emphasized + } + } } |