nosignal-shell/modules/nexus/common/StackPage.qml
2026-06-05 19:22:09 +10:00

122 lines
3 KiB
QML

import QtQuick
import QtQuick.Controls
import Caelestia.Config
import qs.components
import qs.modules.nexus
StackView {
id: root
required property NexusState nState
default property list<Component> pages
readonly property int animMovement: Tokens.padding.extraExtraLarge * 2
function openSubPage(idx: int, immediate: bool): void {
const page = pages[idx];
if (page) {
push(page, {
nState
}, immediate ? StackView.Immediate : StackView.PushTransition);
} else {
console.warn(logCat, "Attempted to open invalid sub-page index", idx);
nState.closeSubPage();
}
}
clip: busy
Component.onCompleted: {
openSubPage(0, true);
for (const page of nState.subPageIdxStack)
openSubPage(page, true);
}
pushEnter: Transition {
SequentialAnimation {
PropertyAction {
property: "opacity"
value: 0
}
PauseAnimation {
duration: Tokens.anim.durations.expressiveDefaultEffects
}
ParallelAnimation {
Anim {
property: "opacity"
to: 1
type: Anim.SlowEffects
}
Anim {
property: "x"
from: root.animMovement
to: 0
type: Anim.SlowEffects
}
}
}
}
pushExit: Transition {
Anim {
property: "opacity"
to: 0
type: Anim.DefaultEffects
}
}
popEnter: Transition {
SequentialAnimation {
PropertyAction {
property: "opacity"
value: 0
}
PauseAnimation {
duration: Tokens.anim.durations.expressiveDefaultEffects
}
ParallelAnimation {
Anim {
property: "opacity"
to: 1
type: Anim.SlowEffects
}
Anim {
property: "x"
from: -root.animMovement
to: 0
type: Anim.SlowEffects
}
}
}
}
popExit: Transition {
Anim {
property: "opacity"
to: 0
type: Anim.DefaultEffects
}
}
LoggingCategory {
id: logCat
name: "caelestia.nexus"
defaultLogLevel: LoggingCategory.Info
}
Connections {
function onSubPageOpened(idx: int): void {
root.openSubPage(idx, false);
}
function onSubPageClosed(): void {
if (root.depth < root.nState.subPageIdxStack.length) {
console.log(logCat, "Attempted to close page while depth < stack depth. Ignoring.");
return;
}
root.pop();
}
target: root.nState
}
}