// SPDX-FileCopyrightText: 2021-2024 Devin Lin // SPDX-License-Identifier: LGPL-2.0-or-later import QtQuick 2.15 import QtQuick.Controls 2.15 import QtQuick.Layouts import QtQuick.Window 2.2 import org.kde.plasma.private.mobileshell as MobileShell import org.kde.plasma.components 3.0 as PlasmaComponents import org.kde.kirigami as Kirigami import org.kde.plasma.private.mobileshell.quicksettingsplugin as QS /** * Root element that contains all the ActionDrawer's contents, and is anchored to the screen. */ Item { id: root required property var actionDrawer // pinned position (disabled when openToPinnedMode is false) readonly property real minimizedQuickSettingsOffset: quickSettingsDrawer.minimizedHeight // fully open position readonly property real maximizedQuickSettingsOffset: minimizedQuickSettingsOffset + quickSettingsDrawer.maxAddedHeight property alias quickSettings: quickSettingsDrawer.quickSettings property alias statusBar: quickSettingsDrawer.statusBar property alias mediaControlsWidget: quickSettingsDrawer.mediaControlsWidget Kirigami.Theme.colorSet: Kirigami.Theme.View Kirigami.Theme.inherit: false function applyMinMax(val) { return Math.max(0, Math.min(1, val)); } MobileShell.QuickSettingsDrawer { id: quickSettingsDrawer // physically move the drawer when between closed <-> pinned mode readonly property real offsetHeight: actionDrawer.openToPinnedMode ? minimizedQuickSettingsOffset : maximizedQuickSettingsOffset anchors { topMargin: Math.min(root.actionDrawer.offsetResistance - offsetHeight, 0) top: parent.top left: parent.left right: parent.right } actionDrawer: root.actionDrawer // opacity and move animation (disabled when openToPinnedMode is false) property real offsetDist: actionDrawer.offsetResistance - minimizedQuickSettingsOffset property real totalOffsetDist: maximizedQuickSettingsOffset - minimizedQuickSettingsOffset minimizedToFullProgress: actionDrawer.openToPinnedMode ? (actionDrawer.opened ? applyMinMax(offsetDist / totalOffsetDist) : 0) : 1 // this drawer opens in two stages when pinned mode is enabled: // --- // stage 1: the transform effect is used, the drawer physically moves down to the pinned mode // stage 2: the rectangle increases height to reveal content, but the content stays still // when pinned mode is disabled, only stage 1 happens // increase height of drawer when between pinned mode <-> maximized mode addedHeight: { if (!actionDrawer.openToPinnedMode) { // if pinned mode disabled, just go to full height return Math.max(maximizedQuickSettingsOffset - minimizedQuickSettingsOffset, root.actionDrawer.offsetResistance - minimizedQuickSettingsOffset) } else if (!actionDrawer.opened) { return Math.max(0, root.actionDrawer.offsetResistance - minimizedQuickSettingsOffset) } else { return Math.max(0, root.actionDrawer.offsetResistance - minimizedQuickSettingsOffset) } } } }