Warning, /multimedia/audiotube/src/contents/ui/MinimizedPlayerControls.qml is written in an unsupported language. File is not indexed.
0001 // SPDX-FileCopyrightText: 2020-2022 Devin Lin <devin@kde.org> 0002 // 0003 // SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0004 0005 import QtQuick 2.15 0006 import QtQuick.Controls 2.15 0007 import QtQuick.Layouts 1.15 0008 0009 import QtMultimedia 0010 0011 import org.kde.kirigami 2.19 as Kirigami 0012 import org.kde.ytmusic 1.0 0013 0014 Item { 0015 id: root 0016 z: 2000 0017 0018 required property int progressBarHeight 0019 required property int minimizedPlayerContentHeight 0020 0021 required property VideoInfoExtractor info 0022 required property MediaPlayer audio 0023 required property string thumbnail 0024 0025 readonly property bool isWidescreen: width >= Kirigami.Units.gridUnit * 50 0026 signal requestOpen() 0027 Shortcut { 0028 sequence: "Ctrl+P" 0029 onActivated: root.requestOpen() 0030 } 0031 Rectangle { 0032 id: miniProgressBar 0033 z: 1 0034 anchors.top: parent.top 0035 anchors.left: parent.left 0036 height: root.progressBarHeight 0037 color: Kirigami.Theme.highlightColor 0038 width: parent.width * (audio?.position / audio?.duration) 0039 } 0040 0041 states: [ 0042 State { 0043 when: root.isWidescreen 0044 AnchorChanges { 0045 target: controlButtonBox 0046 anchors.horizontalCenter: root.horizontalCenter 0047 } 0048 }, 0049 State { 0050 when: true // default (fallback) state 0051 AnchorChanges { 0052 target: controlButtonBox 0053 anchors.right: root.right 0054 } 0055 } 0056 ] 0057 0058 Rectangle { 0059 id: trackInfoLayout 0060 0061 anchors { 0062 top: parent.top 0063 left: parent.left 0064 bottom: parent.bottom 0065 0066 right: controlButtonBox.left 0067 rightMargin: Kirigami.Units.largeSpacing 0068 } 0069 0070 color: Qt.rgba(0, 0, 0, trackClick.containsMouse ? 0.1 : trackClick.pressed ? 0.3 : 0) 0071 0072 RowLayout { 0073 anchors.fill: parent 0074 anchors.leftMargin: Kirigami.Units.largeSpacing 0075 spacing: Kirigami.Units.largeSpacing 0076 0077 // track image 0078 Item { 0079 property double imageSize: root.height - Kirigami.Units.largeSpacing * 2 0080 0081 Layout.alignment: Qt.AlignVCenter 0082 Layout.maximumWidth: imageSize 0083 Layout.preferredWidth: imageSize 0084 Layout.maximumHeight: imageSize 0085 Layout.minimumHeight: imageSize 0086 0087 RoundedImage { 0088 id: mainIcon 0089 anchors.fill: parent 0090 visible: !loadingIndicator.visible && source.toString() !== "" 0091 source: root.thumbnail 0092 radius: 5 0093 } 0094 0095 BusyIndicator { 0096 id: loadingIndicator 0097 anchors.centerIn: parent 0098 visible: UserPlaylistModel.loading 0099 Kirigami.Theme.colorSet: Kirigami.Theme.Complementary 0100 Kirigami.Theme.inherit: false 0101 } 0102 } 0103 0104 // track information 0105 ColumnLayout { 0106 Kirigami.Theme.colorSet: Kirigami.Theme.Complementary 0107 Layout.fillWidth: true 0108 Layout.fillHeight: true 0109 0110 Label { 0111 id: mainLabel 0112 text: info.title ? info.title : i18n("No media playing") 0113 textFormat: Text.PlainText 0114 wrapMode: Text.Wrap 0115 Layout.fillWidth: true 0116 horizontalAlignment: Text.AlignLeft 0117 elide: Text.ElideRight 0118 maximumLineCount: 1 0119 // Hardcoded because the footerbar blur always makes a dark-ish 0120 // background, so we don't want to use a color scheme color that 0121 // might also be dark 0122 color: Kirigami.Theme.textColor 0123 font.weight: Font.Bold 0124 } 0125 0126 Label { 0127 id: authorLabel 0128 text: info.artist ? info.artist : info.channel 0129 textFormat: Text.PlainText 0130 wrapMode: Text.Wrap 0131 Layout.fillWidth: true 0132 horizontalAlignment: Text.AlignLeft 0133 elide: Text.ElideRight 0134 maximumLineCount: 1 0135 // Hardcoded because the footerbar blur always makes a dark-ish 0136 // background, so we don't want to use a color scheme color that 0137 // might also be dark 0138 color: Kirigami.Theme.disabledTextColor 0139 } 0140 } 0141 } 0142 MouseArea { 0143 id: trackClick 0144 anchors.fill: parent 0145 hoverEnabled: true 0146 onClicked: root.requestOpen() 0147 } 0148 } 0149 0150 RowLayout { 0151 id: controlButtonBox 0152 0153 anchors.top: parent.top 0154 anchors.bottom: parent.bottom 0155 // horizontal anchors (center or right) are managed by state 0156 // transitions at the root component 0157 0158 spacing: 2 0159 0160 Label { 0161 color: "white" 0162 visible: info.title && root.isWidescreen 0163 text: PlayerUtils.formatTimestamp(audio.position) 0164 Layout.rightMargin: 20 0165 } 0166 0167 Button { 0168 id: skipBackwardButton 0169 implicitHeight: 40 0170 implicitWidth: 40 0171 Layout.fillHeight: !isWidescreen 0172 0173 Kirigami.Theme.colorSet: Kirigami.Theme.Complementary 0174 Kirigami.Theme.inherit: false 0175 0176 enabled: UserPlaylistModel.canSkipBack 0177 onClicked: UserPlaylistModel.previous() 0178 0179 contentItem: Item { 0180 Kirigami.Icon { 0181 anchors.centerIn: parent 0182 source:"media-skip-backward" 0183 color: "white" 0184 width: Kirigami.Units.gridUnit 0185 height: Kirigami.Units.gridUnit 0186 } 0187 } 0188 0189 background: Kirigami.ShadowedRectangle { 0190 corners.topLeftRadius: isWidescreen ? 7 : 0 0191 corners.bottomLeftRadius: isWidescreen ? 7 : 0 0192 0193 color: if (isWidescreen) { 0194 if (parent.down) { 0195 Kirigami.ColorUtils.linearInterpolation(Kirigami.Theme.hoverColor, "transparent", 0.3) 0196 } else if(parent.hovered) { 0197 Kirigami.ColorUtils.linearInterpolation(Kirigami.Theme.hoverColor, "transparent", 0.7) 0198 } else { 0199 Qt.rgba(1, 1, 1, 0.2) 0200 } 0201 } else { 0202 if (parent.down) { 0203 Kirigami.ColorUtils.linearInterpolation(Kirigami.Theme.hoverColor, "transparent", 0.3) 0204 } else if (parent.hovered){ 0205 Kirigami.ColorUtils.linearInterpolation(Kirigami.Theme.hoverColor, "transparent", 0.7) 0206 } else { 0207 "transparent" 0208 } 0209 } 0210 } 0211 } 0212 0213 Button { 0214 id: playPauseButton 0215 implicitHeight: 40 0216 implicitWidth: 60 0217 Layout.fillHeight: !isWidescreen 0218 0219 onClicked: audio.playbackState === MediaPlayer.PlayingState ? audio.pause() : audio.play() 0220 contentItem: Item { 0221 Kirigami.Icon { 0222 anchors.centerIn:parent 0223 source: audio.playbackState === MediaPlayer.PlayingState ? "media-playback-pause" : "media-playback-start" 0224 color: "white" 0225 width: Kirigami.Units.gridUnit 0226 height: Kirigami.Units.gridUnit 0227 } 0228 } 0229 0230 background: Kirigami.ShadowedRectangle { 0231 color: if (isWidescreen) { 0232 if (parent.down) { 0233 Kirigami.ColorUtils.linearInterpolation(Kirigami.Theme.hoverColor, "transparent", 0.3) 0234 } else if (parent.hovered) { 0235 Kirigami.ColorUtils.linearInterpolation(Kirigami.Theme.hoverColor, "transparent", 0.7) 0236 } else { 0237 Qt.rgba(1, 1, 1, 0.2) 0238 } 0239 } else { 0240 if (parent.down) { 0241 Kirigami.ColorUtils.linearInterpolation(Kirigami.Theme.hoverColor, "transparent", 0.3) 0242 } else if (parent.hovered) { 0243 Kirigami.ColorUtils.linearInterpolation(Kirigami.Theme.hoverColor, "transparent", 0.7) 0244 } else { 0245 "transparent" 0246 } 0247 } 0248 0249 } 0250 0251 } 0252 0253 Button { 0254 id: skipForwardButton 0255 implicitHeight: 40 0256 implicitWidth: 40 0257 Layout.fillHeight: !isWidescreen 0258 Layout.rightMargin: isWidescreen ? 0 : 10 0259 Layout.alignment: !Qt.AlignVCenter 0260 0261 Kirigami.Theme.colorSet: Kirigami.Theme.Complementary 0262 Kirigami.Theme.inherit: false 0263 0264 enabled: UserPlaylistModel.canSkip 0265 onClicked: UserPlaylistModel.next() 0266 contentItem: Item { 0267 Kirigami.Icon { 0268 anchors.centerIn: parent 0269 source:"media-skip-forward" 0270 color: "white" 0271 width: Kirigami.Units.gridUnit 0272 height: Kirigami.Units.gridUnit 0273 } 0274 } 0275 background: Kirigami.ShadowedRectangle { 0276 corners.topRightRadius: isWidescreen ? 7 : 0 0277 corners.bottomRightRadius: isWidescreen ? 7 : 0 0278 color: if (isWidescreen) { 0279 if (parent.down) { 0280 Kirigami.ColorUtils.linearInterpolation(Kirigami.Theme.hoverColor, "transparent", 0.3) 0281 } else if (parent.hovered) { 0282 Kirigami.ColorUtils.linearInterpolation(Kirigami.Theme.hoverColor, "transparent", 0.7) 0283 } else { 0284 Qt.rgba(1, 1, 1, 0.2) 0285 } 0286 } else { 0287 if (parent.down) { 0288 Kirigami.ColorUtils.linearInterpolation(Kirigami.Theme.hoverColor, "transparent", 0.3) 0289 } else if(parent.hovered) { 0290 Kirigami.ColorUtils.linearInterpolation(Kirigami.Theme.hoverColor, "transparent", 0.7) 0291 } else { 0292 "transparent" 0293 } 0294 } 0295 } 0296 } 0297 0298 Label { 0299 color: "white" 0300 visible: info.title && root.isWidescreen 0301 text: PlayerUtils.formatTimestamp(audio.duration) 0302 Layout.leftMargin: 20 0303 } 0304 } 0305 }