Warning, /plasma/plasma-mobile/components/mobileshell/qml/volumeosd/VolumeOSD.qml is written in an unsupported language. File is not indexed.
0001 /*
0002 * SPDX-FileCopyrightText: 2014 Martin Klapetek <mklapetek@kde.org>
0003 * SPDX-FileCopyrightText: 2019 Kai Uwe Broulik <kde@broulik.de>
0004 * SPDX-FileCopyrightText: 2021 Devin Lin <espidev@gmail.com>
0005 *
0006 * SPDX-License-Identifier: GPL-2.0-or-later
0007 */
0008
0009 import QtQuick
0010 import QtQuick.Controls as Controls
0011 import QtQuick.Layouts
0012 import QtQuick.Window
0013
0014 import org.kde.kirigami 2.20 as Kirigami
0015 import org.kde.plasma.components 3.0 as PlasmaComponents
0016 import org.kde.plasma.private.nanoshell 2.0 as NanoShell
0017 import org.kde.plasma.private.mobileshell as MobileShell
0018 import org.kde.plasma.private.mobileshell.state as MobileShellState
0019
0020 NanoShell.FullScreenOverlay {
0021 id: window
0022
0023 // used by context menus opened in the applet to not autoclose the osd
0024 property bool suppressActiveClose: false
0025
0026 // whether the applet is showing all devices
0027 property bool showFullApplet: false
0028
0029 visible: false
0030
0031 color: showFullApplet ? Qt.rgba(0, 0, 0, 0.6) : "transparent"
0032 Behavior on color {
0033 ColorAnimation {}
0034 }
0035
0036 function showOverlay() {
0037 if (!window.visible) {
0038 window.showFullApplet = false;
0039 window.showFullScreen();
0040 hideTimer.restart();
0041 } else if (!window.showFullApplet) { // don't autohide applet when the full applet is showing
0042 hideTimer.restart();
0043 }
0044 }
0045
0046 onActiveChanged: {
0047 if (!active && !suppressActiveClose) {
0048 hideTimer.stop();
0049 hideTimer.triggered();
0050 }
0051 }
0052
0053 Timer {
0054 id: hideTimer
0055 interval: 3000
0056 running: false
0057 onTriggered: {
0058 window.close();
0059 window.showFullApplet = false;
0060 }
0061 }
0062
0063 Flickable {
0064 id: flickable
0065 anchors.fill: parent
0066 contentHeight: cards.implicitHeight
0067 boundsBehavior: window.showFullApplet ? Flickable.DragAndOvershootBounds : Flickable.StopAtBounds
0068
0069 pressDelay: 50
0070
0071 MouseArea {
0072 // capture taps behind cards to close
0073 anchors.left: parent.left
0074 anchors.right: parent.right
0075 width: parent.width
0076 height: Math.max(cards.implicitHeight, window.height)
0077 onReleased: {
0078 hideTimer.stop();
0079 hideTimer.triggered();
0080 }
0081
0082 ColumnLayout {
0083 id: cards
0084 width: parent.width
0085 anchors.left: parent.left
0086 anchors.right: parent.right
0087 spacing: 0
0088
0089 // osd card
0090 PopupCard {
0091 id: osd
0092 Layout.topMargin: Kirigami.Units.gridUnit
0093 Layout.alignment: Qt.AlignHCenter
0094
0095 contentItem: RowLayout {
0096 id: containerLayout
0097 spacing: Kirigami.Units.smallSpacing
0098
0099 anchors.leftMargin: Kirigami.Units.smallSpacing * 2
0100 anchors.rightMargin: Kirigami.Units.smallSpacing
0101
0102 PlasmaComponents.ToolButton {
0103 icon.name: !MobileShell.AudioInfo.paSinkModel.preferredSink || MobileShell.AudioInfo.paSinkModel.preferredSink.muted ? "audio-volume-muted" : "audio-volume-high"
0104 text: !MobileShell.AudioInfo.paSinkModel.preferredSink || MobileShell.AudioInfo.paSinkModel.preferredSink.muted ? i18n("Unmute") : i18n("Mute")
0105 display: Controls.AbstractButton.IconOnly
0106 Layout.alignment: Qt.AlignVCenter
0107 Layout.preferredWidth: Kirigami.Units.iconSizes.medium
0108 Layout.preferredHeight: Kirigami.Units.iconSizes.medium
0109 Layout.rightMargin: Kirigami.Units.smallSpacing
0110 onClicked: muteVolume()
0111 }
0112
0113 PlasmaComponents.ProgressBar {
0114 id: volumeSlider
0115 Layout.fillWidth: true
0116 Layout.alignment: Qt.AlignVCenter
0117 Layout.rightMargin: Kirigami.Units.smallSpacing * 2
0118 value: MobileShell.AudioInfo.volumeValue
0119 from: 0
0120 to: MobileShell.AudioInfo.maxVolumePercent
0121 Behavior on value { NumberAnimation { duration: Kirigami.Units.shortDuration } }
0122 }
0123
0124 // Get the width of a three-digit number so we can size the label
0125 // to the maximum width to avoid the progress bar resizing itself
0126 TextMetrics {
0127 id: widestLabelSize
0128 text: i18n("100%")
0129 font: percentageLabel.font
0130 }
0131
0132 Kirigami.Heading {
0133 id: percentageLabel
0134 Layout.preferredWidth: widestLabelSize.width
0135 Layout.alignment: Qt.AlignVCenter
0136 Layout.rightMargin: Kirigami.Units.smallSpacing
0137 level: 3
0138 text: i18nc("Percentage value", "%1%", MobileShell.AudioInfo.volumeValue)
0139
0140 // Display a subtle visual indication that the volume might be
0141 // dangerously high
0142 // ------------------------------------------------
0143 // Keep this in sync with the copies in plasma-pa:ListItemBase.qml
0144 // and plasma-pa:VolumeSlider.qml
0145 color: {
0146 if (MobileShell.AudioInfo.volumeValue <= 100) {
0147 return Kirigami.Theme.textColor
0148 } else if (MobileShell.AudioInfo.volumeValue > 100 && MobileShell.AudioInfo.volumeValue <= 125) {
0149 return Kirigami.Theme.neutralTextColor
0150 } else {
0151 return Kirigami.Theme.negativeTextColor
0152 }
0153 }
0154 }
0155
0156 PlasmaComponents.ToolButton {
0157 icon.name: "configure"
0158 text: i18n("Open audio settings")
0159 visible: opacity !== 0
0160 opacity: showFullApplet ? 1 : 0
0161 display: Controls.AbstractButton.IconOnly
0162 Layout.alignment: Qt.AlignVCenter
0163 Layout.preferredWidth: Kirigami.Units.iconSizes.medium
0164 Layout.preferredHeight: Kirigami.Units.iconSizes.medium
0165 Layout.rightMargin: Kirigami.Units.smallSpacing
0166
0167 Behavior on opacity { NumberAnimation { duration: Kirigami.Units.shortDuration } }
0168
0169 onClicked: {
0170 let coords = mapToItem(flickable, 0, 0);
0171 MobileShellState.ShellDBusClient.openAppLaunchAnimation("audio-volume-high", i18n("Audio Settings"), coords.x, coords.y, Kirigami.Units.iconSizes.medium);
0172 MobileShell.ShellUtil.executeCommand("plasma-open-settings kcm_pulseaudio");
0173 }
0174 }
0175
0176 PlasmaComponents.ToolButton {
0177 icon.name: window.showFullApplet ? "arrow-up" : "arrow-down"
0178 text: i18n("Toggle showing audio streams")
0179 display: Controls.AbstractButton.IconOnly
0180 Layout.alignment: Qt.AlignVCenter
0181 Layout.preferredWidth: Kirigami.Units.iconSizes.medium
0182 Layout.preferredHeight: Kirigami.Units.iconSizes.medium
0183 onClicked: {
0184 window.showFullApplet = !window.showFullApplet
0185 // don't autohide applet when full applet is shown
0186 if (window.showFullApplet) {
0187 hideTimer.stop();
0188 } else {
0189 hideTimer.restart();
0190 }
0191 }
0192 }
0193 }
0194 }
0195
0196 // other applet cards
0197 AudioApplet {
0198 id: applet
0199 Layout.topMargin: Kirigami.Units.gridUnit
0200 Layout.alignment: Qt.AlignHCenter
0201 Layout.preferredWidth: cards.width
0202 opacity: window.showFullApplet ? 1 : 0
0203 visible: opacity !== 0
0204 transform: Translate {
0205 y: window.showFullApplet ? 0 : -Kirigami.Units.gridUnit
0206 Behavior on y { NumberAnimation {} }
0207 }
0208
0209 Behavior on opacity { NumberAnimation {} }
0210 }
0211 }
0212 }
0213 }
0214 }