matrixion/qml/components/AdaptiveLayout.qml

124 lines
4.3 KiB
QML
Raw Permalink Normal View History

2021-06-06 00:36:08 +03:00
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
2021-06-06 00:36:08 +03:00
// SPDX-License-Identifier: GPL-3.0-or-later
2021-06-13 02:48:11 +03:00
import QtQuick 2.12
import QtQuick.Controls 2.5
2021-06-13 03:48:22 +03:00
import QtQuick.Layouts 1.12
import im.nheko
2021-06-06 00:36:08 +03:00
Container {
//Component.onCompleted: {
// parent.width = Qt.binding(function() { return calculatedWidth; })
//}
id: container
2022-04-16 03:13:01 +03:00
property Component handle: Rectangle {
anchors.right: parent.right
2021-06-06 00:36:08 +03:00
color: Nheko.theme.separator
height: container.height
width: visible ? 1 : 0
2022-04-16 03:13:01 +03:00
z: 3
2021-06-06 00:36:08 +03:00
}
2022-04-16 03:13:01 +03:00
property Component handleToucharea: Item {
2021-06-06 00:36:08 +03:00
id: splitter
property int calculatedWidth: {
if (!visible)
return 0;
else if (container.singlePageMode)
return container.width;
else
return (collapsible && x < minimumWidth) ? collapsedWidth : x;
}
2022-04-16 03:13:01 +03:00
property int collapsedWidth: parent.collapsedWidth
property bool collapsible: parent.collapsible
property int maximumWidth: parent.maximumWidth
property int minimumWidth: parent.minimumWidth
2021-06-06 00:36:08 +03:00
enabled: !container.singlePageMode
height: container.height
width: 1
x: parent.preferredWidth
z: 3
NhekoCursorShape {
2022-04-16 03:13:01 +03:00
cursorShape: Qt.SizeHorCursor
2021-06-13 02:48:11 +03:00
height: parent.height
width: container.splitterGrabMargin * 2
x: -container.splitterGrabMargin
}
2021-06-06 00:36:08 +03:00
DragHandler {
id: dragHandler
enabled: !container.singlePageMode
2022-04-16 03:13:01 +03:00
grabPermissions: PointerHandler.CanTakeOverFromAnything | PointerHandler.ApprovesTakeOverByHandlersOfSameType
margin: container.splitterGrabMargin
2021-06-06 00:36:08 +03:00
xAxis.enabled: true
xAxis.maximum: splitter.maximumWidth
2022-04-16 03:13:01 +03:00
xAxis.minimum: splitter.minimumWidth - 1
yAxis.enabled: false
2021-06-06 00:36:08 +03:00
onActiveChanged: {
if (!active) {
splitter.x = splitter.calculatedWidth;
splitter.parent.preferredWidth = splitter.calculatedWidth;
}
2021-06-06 00:36:08 +03:00
}
}
HoverHandler {
enabled: !container.singlePageMode
margin: container.splitterGrabMargin
}
}
2022-04-16 03:13:01 +03:00
property alias pageIndex: view.currentIndex
property bool singlePageMode: width < 800
property int splitterGrabMargin: Nheko.paddingSmall
2021-06-06 00:36:08 +03:00
contentItem: ListView {
id: view
2022-04-16 03:13:01 +03:00
boundsBehavior: Flickable.StopAtBounds
currentIndex: container.singlePageMode ? container.pageIndex : 0
highlightMoveDuration: container.singlePageMode ? 200 : 0
2021-06-06 00:36:08 +03:00
highlightRangeMode: ListView.StrictlyEnforceRange
interactive: singlePageMode
2022-04-16 03:13:01 +03:00
model: container.contentModel
orientation: ListView.Horizontal
snapMode: ListView.SnapOneItem
2021-06-06 00:36:08 +03:00
}
2022-04-16 03:13:01 +03:00
Component.onCompleted: {
for (var i = 0; i < count - 1; i++) {
let handle_ = handle.createObject(contentChildren[i]);
let split_ = handleToucharea.createObject(contentChildren[i]);
contentChildren[i].width = Qt.binding(function () {
return split_.calculatedWidth;
});
contentChildren[i].splitterWidth = Qt.binding(function () {
return handle_.width;
});
}
contentChildren[count - 1].width = Qt.binding(function () {
if (container.singlePageMode) {
return container.width;
} else {
var w = container.width;
for (var i = 0; i < count - 1; i++) {
if (contentChildren[i].width)
w = w - contentChildren[i].width;
}
return w;
}
});
contentChildren[count - 1].splitterWidth = 0;
for (var i = 0; i < count; i++) {
contentChildren[i].height = Qt.binding(function () {
return container.height;
});
contentChildren[i].children[0].height = Qt.binding(function () {
return container.height;
});
}
}
onSinglePageModeChanged: if (!singlePageMode)
pageIndex = 0
2021-06-06 00:36:08 +03:00
}