// SPDX-FileCopyrightText: 2021-2024 Devin Lin // SPDX-License-Identifier: LGPL-2.0-or-later import QtQuick import QtQuick.Controls as QQC2 import QtQuick.Layouts import org.kde.kirigami as Kirigami import org.kde.ksvg 1.0 as KSvg import org.kde.plasma.core as PlasmaCore import org.kde.plasma.private.mobileshell as MobileShell import org.kde.plasma.private.mobileshell.quicksettingsplugin as QS /** * Quick settings drawer pulled down from the top (for portrait mode). * For the landscape view quicksettings container, see QuickSettingsPanel. */ MobileShell.BaseItem { id: root required property var actionDrawer /** * The amount of height to add to the panel (increasing the height of the quick settings area). */ property real addedHeight: 0 /** * The maximum amount of added height to snap to the full height of the quick settings panel. */ readonly property real maxAddedHeight: quickSettings.fullHeight - minimizedQuickSettingsHeight // first row is part of minimized height /** * Height of panel when in minimized mode. */ readonly property real minimizedHeight: bottomPadding + topPadding + statusBarProxy.height + minimizedQuickSettingsHeight + mediaControlsWidgetProxy.height + handle.fullHeight /** * Height of just the QuickSettings component in minimized mode. */ readonly property real minimizedQuickSettingsHeight: quickSettings.minimizedRowHeight + Kirigami.Units.gridUnit - Kirigami.Units.largeSpacing /** * Progress of showing the full quick settings view from pinned. */ property real minimizedToFullProgress: 1 property alias quickSettings: quickSettingsProxy.contentItem property alias statusBar: statusBarProxy.contentItem property alias mediaControlsWidget: mediaControlsWidgetProxy.contentItem readonly property double brightnessPressedValue: quickSettings.brightnessPressedValue // we need extra padding if the background side border is enabled topPadding: Kirigami.Units.smallSpacing leftPadding: Kirigami.Units.smallSpacing rightPadding: Kirigami.Units.smallSpacing bottomPadding: Kirigami.Units.smallSpacing * 4 Kirigami.Theme.inherit: false Kirigami.Theme.colorSet: Kirigami.Theme.Window background: Item { opacity: brightnessPressedValue MobileShell.PanelBackground { id: background anchors.fill: parent anchors.bottomMargin: shadow.height panelType: MobileShell.PanelBackground.PanelType.Flat radius: 0 Kirigami.Theme.inherit: false Kirigami.Theme.colorSet: Kirigami.Theme.Window } Rectangle { id: separator anchors.bottom: background.bottom anchors.left: parent.left anchors.right: parent.right antialiasing: true // Only show separator on dark background visible: (Kirigami.ColorUtils.brightnessForColor(background.panelColor)) === Kirigami.ColorUtils.Dark ? 1 : 0 height: 1 color: Kirigami.ColorUtils.tintWithAlpha(Kirigami.Theme.textColor, Kirigami.Theme.backgroundColor, 0.9) } Rectangle { id: shadow anchors.top: background.bottom anchors.left: parent.left anchors.right: parent.right height: Kirigami.Units.largeSpacing opacity: 0.1 gradient: Gradient { orientation: Gradient.Vertical GradientStop { position: 0.0; color: 'black' } GradientStop { position: 1.0; color: 'transparent' } } } } contentItem: Item { id: containerItem implicitHeight: column.implicitHeight // use container item so that our column doesn't get stretched if base item is anchored ColumnLayout { id: column anchors.left: parent.left anchors.right: parent.right anchors.top: parent.top spacing: 0 MobileShell.BaseItem { id: statusBarProxy Layout.fillWidth: true Layout.preferredHeight: MobileShell.Constants.topPanelHeight + Kirigami.Units.gridUnit * 0.8 } MobileShell.BaseItem { id: quickSettingsProxy Layout.preferredHeight: root.minimizedQuickSettingsHeight + root.addedHeight Layout.topMargin: Kirigami.Units.smallSpacing Layout.fillWidth: true height: root.minimizedQuickSettingsHeight + root.addedHeight width: parent.width } MobileShell.BaseItem { id: mediaControlsWidgetProxy property real fullHeight: height + Layout.topMargin Layout.fillWidth: true Layout.topMargin: Kirigami.Units.smallSpacing Layout.leftMargin: Kirigami.Units.largeSpacing Layout.rightMargin: Kirigami.Units.largeSpacing } Handle { id: handle property real fullHeight: height + Layout.topMargin Layout.alignment: Qt.AlignHCenter Layout.topMargin: Kirigami.Units.smallSpacing * 2 opacity: brightnessPressedValue onTapped: { if (root.minimizedToFullProgress < 0.5) { root.actionDrawer.expand(); } else { root.actionDrawer.open(); } } } } } }