feat(StatusStackModal): Component to replace nested StausModals (#733)
This commit is contained in:
parent
9f3aa21834
commit
2a64ba455b
|
@ -0,0 +1,80 @@
|
||||||
|
import QtQuick 2.14
|
||||||
|
import QtQuick.Layouts 1.14
|
||||||
|
|
||||||
|
StackLayout {
|
||||||
|
id: root
|
||||||
|
|
||||||
|
property int previousIndex: 0
|
||||||
|
property int duration: 300
|
||||||
|
|
||||||
|
property var items: children
|
||||||
|
|
||||||
|
readonly property var previousItem: items[previousIndex]
|
||||||
|
readonly property var currentItem: items[currentIndex]
|
||||||
|
|
||||||
|
clip: true
|
||||||
|
|
||||||
|
Component.onCompleted: {
|
||||||
|
previousIndex = currentIndex
|
||||||
|
|
||||||
|
for(var i = 1; i < count; ++i) {
|
||||||
|
children[i].opacity = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Component {
|
||||||
|
id: crossFader
|
||||||
|
|
||||||
|
ParallelAnimation {
|
||||||
|
property Item fadeOutTarget
|
||||||
|
property Item fadeInTarget
|
||||||
|
readonly property bool direct: previousIndex < currentIndex
|
||||||
|
|
||||||
|
NumberAnimation {
|
||||||
|
target: fadeOutTarget
|
||||||
|
property: "opacity"
|
||||||
|
to: 0
|
||||||
|
duration: root.duration
|
||||||
|
}
|
||||||
|
|
||||||
|
NumberAnimation {
|
||||||
|
target: fadeInTarget
|
||||||
|
property: "opacity"
|
||||||
|
to: 1
|
||||||
|
duration: root.duration
|
||||||
|
}
|
||||||
|
|
||||||
|
NumberAnimation {
|
||||||
|
target: fadeOutTarget
|
||||||
|
property: "x"
|
||||||
|
from: 0
|
||||||
|
to: direct ? -root.width : root.width
|
||||||
|
duration: root.duration
|
||||||
|
}
|
||||||
|
|
||||||
|
NumberAnimation {
|
||||||
|
target: fadeInTarget
|
||||||
|
property: "x"
|
||||||
|
from: direct ? root.width : -root.width
|
||||||
|
to: 0
|
||||||
|
duration: root.duration
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onCurrentIndexChanged: {
|
||||||
|
items = root.children;
|
||||||
|
|
||||||
|
if (previousItem && currentItem && (previousItem != currentItem)) {
|
||||||
|
previousItem.visible = true;
|
||||||
|
currentItem.visible = true;
|
||||||
|
var crossFaderAnim = crossFader.createObject(parent,
|
||||||
|
{
|
||||||
|
fadeOutTarget: previousItem,
|
||||||
|
fadeInTarget: currentItem
|
||||||
|
});
|
||||||
|
crossFaderAnim.restart();
|
||||||
|
}
|
||||||
|
previousIndex = currentIndex;
|
||||||
|
}
|
||||||
|
}
|
|
@ -9,3 +9,4 @@ StatusImageSettings 0.1 StatusImageSettings.qml
|
||||||
StatusModalHeaderSettings 0.1 StatusModalHeaderSettings.qml
|
StatusModalHeaderSettings 0.1 StatusModalHeaderSettings.qml
|
||||||
StatusTooltipSettings 0.1 StatusTooltipSettings.qml
|
StatusTooltipSettings 0.1 StatusTooltipSettings.qml
|
||||||
StatusAppNavBarFilterModel 0.1 StatusAppNavBarFilterModel.qml
|
StatusAppNavBarFilterModel 0.1 StatusAppNavBarFilterModel.qml
|
||||||
|
StatusAnimatedStack 0.1 StatusAnimatedStack.qml
|
||||||
|
|
|
@ -199,6 +199,7 @@ QC.Popup {
|
||||||
parent: QC.Overlay.overlay
|
parent: QC.Overlay.overlay
|
||||||
|
|
||||||
width: 480
|
width: 480
|
||||||
|
// implicitHeight: headerImpl.implicitHeight + contentItem.implicitHeight + footerImpl.implicitHeight
|
||||||
|
|
||||||
padding: 0
|
padding: 0
|
||||||
topPadding: padding + headerImpl.implicitHeight
|
topPadding: padding + headerImpl.implicitHeight
|
||||||
|
@ -214,7 +215,6 @@ QC.Popup {
|
||||||
color: Theme.palette.backdropColor
|
color: Theme.palette.backdropColor
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
background: Rectangle {
|
background: Rectangle {
|
||||||
color: Theme.palette.statusModal.backgroundColor
|
color: Theme.palette.statusModal.backgroundColor
|
||||||
radius: 8
|
radius: 8
|
||||||
|
@ -245,7 +245,7 @@ QC.Popup {
|
||||||
anchors.top: parent.top
|
anchors.top: parent.top
|
||||||
anchors.topMargin: hasFloatingButtons ? -18 - height : 0
|
anchors.topMargin: hasFloatingButtons ? -18 - height : 0
|
||||||
width: visible ? parent.width : 0
|
width: visible ? parent.width : 0
|
||||||
active: showAdvancedHeader
|
active: statusModal.showAdvancedHeader
|
||||||
}
|
}
|
||||||
|
|
||||||
Spares.StatusModalFooter {
|
Spares.StatusModalFooter {
|
||||||
|
@ -259,7 +259,7 @@ QC.Popup {
|
||||||
id: advancedFooter
|
id: advancedFooter
|
||||||
anchors.bottom: parent.bottom
|
anchors.bottom: parent.bottom
|
||||||
width: visible ? parent.width : 0
|
width: visible ? parent.width : 0
|
||||||
active: showAdvancedFooter
|
active: statusModal.showAdvancedFooter
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,109 @@
|
||||||
|
import QtQuick 2.14
|
||||||
|
import QtQuick.Layouts 1.14
|
||||||
|
|
||||||
|
import StatusQ.Core 0.1
|
||||||
|
import StatusQ.Core.Theme 0.1
|
||||||
|
import StatusQ.Controls 0.1
|
||||||
|
|
||||||
|
StatusModal {
|
||||||
|
id: root
|
||||||
|
|
||||||
|
/*
|
||||||
|
stackItems
|
||||||
|
Attached properties:
|
||||||
|
canGoNext
|
||||||
|
|
||||||
|
replaceItem
|
||||||
|
Attached properties:
|
||||||
|
title
|
||||||
|
acceptButton
|
||||||
|
*/
|
||||||
|
|
||||||
|
property string stackTitle: qsTr("StackModal")
|
||||||
|
|
||||||
|
property alias stackItems: stackLayout.children
|
||||||
|
property alias currentIndex: stackLayout.currentIndex
|
||||||
|
property alias replaceItem: replaceLoader.sourceComponent
|
||||||
|
|
||||||
|
readonly property int itemsCount: stackLayout.children.length
|
||||||
|
readonly property var currentItem: stackLayout.currentItem
|
||||||
|
|
||||||
|
property Item nextButton: StatusButton {
|
||||||
|
text: qsTr("Next")
|
||||||
|
enabled: !!currentItem && (typeof(currentItem.canGoNext) == "undefined" || currentItem.canGoNext)
|
||||||
|
onClicked: currentIndex++
|
||||||
|
}
|
||||||
|
|
||||||
|
property Item finishButton: StatusButton {
|
||||||
|
text: qsTr("Finish")
|
||||||
|
onClicked: root.close()
|
||||||
|
}
|
||||||
|
|
||||||
|
function replace(item) { replaceItem = item; }
|
||||||
|
|
||||||
|
function updateRightButtons() {
|
||||||
|
if (replaceItem) {
|
||||||
|
nextButton.visible = false;
|
||||||
|
finishButton.visible = false;
|
||||||
|
} else if (currentIndex < itemsCount - 1) {
|
||||||
|
nextButton.visible = true;
|
||||||
|
finishButton.visible = false;
|
||||||
|
} else {
|
||||||
|
nextButton.visible = false;
|
||||||
|
finishButton.visible = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onCurrentIndexChanged: updateRightButtons()
|
||||||
|
onReplaceItemChanged: updateRightButtons()
|
||||||
|
|
||||||
|
width: 640
|
||||||
|
height: Math.max(implicitHeight, replaceLoader.implicitHeight)
|
||||||
|
padding: 16
|
||||||
|
|
||||||
|
header.title: replaceLoader.item && typeof(replaceLoader.item.title) != "undefined"
|
||||||
|
? replaceLoader.item.title : stackTitle
|
||||||
|
|
||||||
|
leftButtons: StatusRoundButton {
|
||||||
|
id: backButton
|
||||||
|
icon.name: "arrow-right"
|
||||||
|
icon.width: 20
|
||||||
|
icon.height: 16
|
||||||
|
rotation: 180
|
||||||
|
visible: replaceItem || stackLayout.currentIndex > 0
|
||||||
|
onClicked: {
|
||||||
|
if (replaceItem)
|
||||||
|
replaceItem = null;
|
||||||
|
else
|
||||||
|
stackLayout.currentIndex--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rightButtons: [ nextButton, finishButton ]
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: content
|
||||||
|
anchors.fill: parent
|
||||||
|
implicitWidth: stackLayout.implicitWidth
|
||||||
|
implicitHeight: stackLayout.implicitHeight
|
||||||
|
clip: true
|
||||||
|
|
||||||
|
StatusAnimatedStack {
|
||||||
|
id: stackLayout
|
||||||
|
anchors.fill: parent
|
||||||
|
visible: !replaceItem
|
||||||
|
}
|
||||||
|
|
||||||
|
Loader {
|
||||||
|
id: replaceLoader
|
||||||
|
anchors.fill: parent
|
||||||
|
visible: item
|
||||||
|
onItemChanged: {
|
||||||
|
root.rightButtons = item ? item.rightButtons : [ nextButton, finishButton ]
|
||||||
|
if (!item && root.itemsCount == 0) {
|
||||||
|
root.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -6,6 +6,7 @@ StatusMenuItem 0.1 StatusMenuItem.qml
|
||||||
StatusMenuItemDelegate 0.1 StatusMenuItemDelegate.qml
|
StatusMenuItemDelegate 0.1 StatusMenuItemDelegate.qml
|
||||||
StatusMenuHeadline 0.1 StatusMenuHeadline.qml
|
StatusMenuHeadline 0.1 StatusMenuHeadline.qml
|
||||||
StatusModal 0.1 StatusModal.qml
|
StatusModal 0.1 StatusModal.qml
|
||||||
|
StatusStackModal 0.1 StatusStackModal.qml
|
||||||
StatusSearchPopup 0.1 StatusSearchPopup.qml
|
StatusSearchPopup 0.1 StatusSearchPopup.qml
|
||||||
StatusModalDivider 0.1 StatusModalDivider.qml
|
StatusModalDivider 0.1 StatusModalDivider.qml
|
||||||
StatusSearchPopupMenuItem 0.1 StatusSearchPopupMenuItem.qml
|
StatusSearchPopupMenuItem 0.1 StatusSearchPopupMenuItem.qml
|
||||||
|
|
Loading…
Reference in New Issue