Warning, /plasma/plasma-mobile/components/mobileshell/qml/widgets/mediacontrols/MediaControlsWidget.qml is written in an unsupported language. File is not indexed.
0001 // SPDX-FileCopyrightText: 2021-2023 Devin Lin <devin@kde.org> 0002 // SPDX-FileCopyrightText: 2016 Kai Uwe Broulik <kde@privat.broulik.de> 0003 // SPDX-License-Identifier: LGPL-2.0-or-later 0004 0005 import QtQuick 0006 import QtQuick.Layouts 0007 import QtQuick.Controls as QQC2 0008 0009 import org.kde.kirigami as Kirigami 0010 0011 import org.kde.plasma.private.mobileshell as MobileShell 0012 import org.kde.plasma.private.mobileshell.state as MobileShellState 0013 import org.kde.plasma.components 3.0 as PlasmaComponents3 0014 0015 import org.kde.plasma.private.mpris as Mpris 0016 0017 /** 0018 * Embeddable component that provides MPRIS control. 0019 */ 0020 Item { 0021 id: root 0022 visible: sourceRepeater.count > 0 0023 0024 readonly property real padding: Kirigami.Units.gridUnit 0025 readonly property real contentHeight: Kirigami.Units.gridUnit * 2 0026 implicitHeight: visible ? padding * 2 + contentHeight : 0 0027 0028 MediaControlsSource { 0029 id: mpris2Source 0030 } 0031 0032 // page indicator 0033 RowLayout { 0034 z: 1 0035 visible: view.count > 1 0036 spacing: Kirigami.Units.smallSpacing 0037 anchors.bottomMargin: Kirigami.Units.smallSpacing 0038 anchors.bottom: view.bottom 0039 anchors.horizontalCenter: parent.horizontalCenter 0040 0041 Repeater { 0042 model: view.count 0043 delegate: Rectangle { 0044 width: Kirigami.Units.smallSpacing 0045 height: Kirigami.Units.smallSpacing 0046 radius: width / 2 0047 color: Qt.rgba(255, 255, 255, view.currentIndex == model.index ? 1 : 0.5) 0048 } 0049 } 0050 } 0051 0052 // list of app media widgets 0053 QQC2.SwipeView { 0054 id: view 0055 clip: true 0056 0057 anchors.fill: parent 0058 0059 Repeater { 0060 id: sourceRepeater 0061 model: mpris2Source.mpris2Model 0062 0063 delegate: Loader { 0064 id: delegate 0065 // NOTE: model is PlayerContainer from KMpris in plasma-workspace 0066 0067 asynchronous: true 0068 0069 function getTrackName() { 0070 console.log('track name: ' + model.title); 0071 if (model.title) { 0072 return model.title; 0073 } 0074 // if no track title is given, print out the file name 0075 if (!model.url) { 0076 return ""; 0077 } 0078 const lastSlashPos = model.url.lastIndexOf('/') 0079 if (lastSlashPos < 0) { 0080 return "" 0081 } 0082 const lastUrlPart = model.url.substring(lastSlashPos + 1); 0083 return decodeURIComponent(lastUrlPart); 0084 } 0085 0086 sourceComponent: MouseArea { 0087 id: mouseArea 0088 implicitHeight: playerItem.implicitHeight 0089 implicitWidth: playerItem.implicitWidth 0090 0091 onClicked: { 0092 MobileShell.AppLaunch.launchOrActivateApp(model.desktopEntry + ".desktop"); 0093 MobileShellState.ShellDBusClient.closeActionDrawer(); 0094 } 0095 0096 MobileShell.BaseItem { 0097 id: playerItem 0098 anchors.fill: parent 0099 0100 padding: root.padding 0101 implicitHeight: root.contentHeight + root.padding * 2 0102 implicitWidth: root.width 0103 0104 background: BlurredBackground { 0105 darken: mouseArea.pressed 0106 imageSource: model.artUrl 0107 } 0108 0109 contentItem: Item { 0110 Kirigami.Theme.colorSet: Kirigami.Theme.Complementary 0111 Kirigami.Theme.inherit: false 0112 width: playerItem.width - playerItem.leftPadding - playerItem.rightPadding 0113 0114 RowLayout { 0115 id: controlsRow 0116 width: parent.width 0117 height: parent.height 0118 spacing: 0 0119 0120 enabled: model.canControl 0121 0122 Image { 0123 id: albumArt 0124 Layout.preferredWidth: height 0125 Layout.fillHeight: true 0126 asynchronous: true 0127 fillMode: Image.PreserveAspectFit 0128 source: model.artUrl 0129 sourceSize.height: height 0130 visible: status === Image.Loading || status === Image.Ready 0131 } 0132 0133 ColumnLayout { 0134 Layout.leftMargin: albumArt.visible ? Kirigami.Units.gridUnit : 0 0135 Layout.fillWidth: true 0136 spacing: Kirigami.Units.smallSpacing 0137 0138 // media track name text 0139 MobileShell.MarqueeLabel { 0140 id: trackLabel 0141 Layout.fillWidth: true 0142 0143 inputText: model.track || i18n("No media playing"); 0144 textFormat: Text.PlainText 0145 font.pointSize: Kirigami.Theme.defaultFont.pointSize 0146 color: "white" 0147 } 0148 0149 // media artist name text 0150 MobileShell.MarqueeLabel { 0151 id: artistLabel 0152 Layout.fillWidth: true 0153 0154 // if no artist is given, show player name instead 0155 inputText: model.artist || model.identity || "" 0156 textFormat: Text.PlainText 0157 font.pointSize: Kirigami.Theme.defaultFont.pointSize * 0.9 0158 opacity: 0.9 0159 color: "white" 0160 } 0161 } 0162 0163 PlasmaComponents3.ToolButton { 0164 Layout.fillHeight: true 0165 Layout.preferredWidth: height 0166 0167 enabled: model.canGoPrevious 0168 icon.name: LayoutMirroring.enabled ? "media-skip-forward" : "media-skip-backward" 0169 icon.width: Kirigami.Units.iconSizes.small 0170 icon.height: Kirigami.Units.iconSizes.small 0171 onClicked: { 0172 mpris2Source.setIndex(model.index); 0173 mpris2Source.goPrevious(); 0174 } 0175 visible: model.canGoPrevious || model.canGoNext 0176 Accessible.name: i18nd("plasma_lookandfeel_org.kde.lookandfeel", "Previous track") 0177 } 0178 0179 PlasmaComponents3.ToolButton { 0180 Layout.fillHeight: true 0181 Layout.preferredWidth: height 0182 0183 icon.name: (model.playbackStatus === Mpris.PlaybackStatus.Playing) ? "media-playback-pause" : "media-playback-start" 0184 icon.width: Kirigami.Units.iconSizes.small 0185 icon.height: Kirigami.Units.iconSizes.small 0186 onClicked: { 0187 mpris2Source.setIndex(model.index); 0188 mpris2Source.playPause(); 0189 } 0190 Accessible.name: i18nd("plasma_lookandfeel_org.kde.lookandfeel", "Play or Pause media") 0191 } 0192 0193 PlasmaComponents3.ToolButton { 0194 Layout.fillHeight: true 0195 Layout.preferredWidth: height 0196 0197 enabled: model.canGoNext 0198 icon.name: LayoutMirroring.enabled ? "media-skip-backward" : "media-skip-forward" 0199 icon.width: Kirigami.Units.iconSizes.small 0200 icon.height: Kirigami.Units.iconSizes.small 0201 onClicked: { 0202 mpris2Source.setIndex(model.index); 0203 mpris2Source.goNext(); 0204 } 0205 visible: model.canGoPrevious || model.canGoNext 0206 Accessible.name: i18nd("plasma_lookandfeel_org.kde.lookandfeel", "Next track") 0207 } 0208 } 0209 } 0210 } 0211 } 0212 } 0213 } 0214 } 0215 }