Revision control

Copy as Markdown

// Copyright (C) 2023 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
import QtQuick
import QtQuick.Layouts
import QtMultimedia
import Config
Item {
id: root
implicitHeight: 100
required property MediaPlayer mediaPlayer
readonly property int mediaPlayerState: root.mediaPlayer.playbackState
property bool isPlaylistShuffled: false
property bool isPlaylistLooped: false
property bool isPlaylistVisible: false
property url playlistIcon: !root.isPlaylistVisible ? ControlImages.iconSource("Playlist_Icon") : ControlImages.iconSource("Playlist_Active", false)
property url shuffleIcon: !root.isPlaylistShuffled ? ControlImages.iconSource("Shuffle_Icon") : ControlImages.iconSource("Shuffle_Active", false)
property alias volume: audio.volume
property alias playbackRate: rate.playbackRate
property alias playlistButton: playlistButton
property alias menuButton: menuButton
signal playNextFile()
signal playPreviousFile()
function changeLoopMode() {
if (root.mediaPlayer.loops === 1 && !root.isPlaylistLooped) {
root.mediaPlayer.loops = MediaPlayer.Infinite
} else if (root.mediaPlayer.loops === MediaPlayer.Infinite) {
root.mediaPlayer.loops = 1
root.isPlaylistLooped = true
} else {
root.mediaPlayer.loops = 1
root.isPlaylistLooped = false
}
}
Item {
anchors.fill: root
RowLayout {
id: playerButtons
anchors.fill: parent
spacing: Screen.primaryOrientation === Qt.LandscapeOrientation ? 5 : 1
Item {
CustomButton {
id: menuButton
icon.source: ControlImages.iconSource("Menu_Icon")
visible: Config.isMobileTarget
anchors.centerIn: parent
}
Layout.fillWidth: true
Layout.minimumWidth: 40
Layout.maximumWidth: 95
}
PlaybackRateControl {
id: rate
Layout.fillHeight: true
Layout.fillWidth: true
}
Item {
Layout.fillWidth: true
}
RowLayout {
id: controlButtons
spacing: Screen.primaryOrientation === Qt.LandscapeOrientation ? 25 : 1
Layout.alignment: Qt.AlignHCenter
Layout.fillWidth: true
CustomButton {
id: shuffleButton
icon.source: root.shuffleIcon
visible: Screen.primaryOrientation === Qt.LandscapeOrientation
onClicked: root.isPlaylistShuffled = !root.isPlaylistShuffled
}
CustomButton {
id: previousButton
icon.source: ControlImages.iconSource("Previous_Icon")
onClicked: root.playPreviousFile()
}
CustomButton {
id: playButton
icon.source: ControlImages.iconSource("Play_Icon", false)
onClicked: root.mediaPlayer.play()
}
CustomButton {
id: pausedButton
icon.source: ControlImages.iconSource("Stop_Icon", false)
onClicked: root.mediaPlayer.pause()
}
CustomButton {
id: nextButton
icon.source: ControlImages.iconSource("Next_Icon")
onClicked: root.playNextFile()
}
CustomButton {
id: loopButton
icon.source: ControlImages.iconSource("Loop_Icon")
visible: Screen.primaryOrientation === Qt.LandscapeOrientation
onClicked: root.changeLoopMode()
states: [
State {
name: "noActiveLooping"
when: root.mediaPlayer.loops === 1 && !root.isPlaylistLooped
PropertyChanges {
loopButton.icon.source: ControlImages.iconSource("Loop_Icon")
}
},
State {
name: "singleLoop"
when: root.mediaPlayer.loops === MediaPlayer.Infinite
PropertyChanges {
loopButton.icon.source: ControlImages.iconSource("Single_Loop", false)
}
},
State {
name: "playlistLoop"
when: root.isPlaylistLooped
PropertyChanges {
loopButton.icon.source: ControlImages.iconSource("Loop_Playlist", false)
}
}
]
}
}
Item {
Layout.fillWidth: true
}
AudioControl {
id: audio
Layout.fillHeight: true
Layout.fillWidth: true
}
Item {
Layout.fillWidth: true
Layout.minimumWidth:40
Layout.maximumWidth: 95
CustomButton {
id: playlistButton
anchors.centerIn: parent
icon.source: root.playlistIcon
}
}
}
}
states: [
State {
name: "playing"
when: root.mediaPlayerState == MediaPlayer.PlayingState
PropertyChanges {
playButton.visible: false
}
PropertyChanges {
pausedButton.visible: true
}
},
State {
name: "paused"
when: root.mediaPlayerState == MediaPlayer.PausedState || root.mediaPlayerState == MediaPlayer.StoppedState
PropertyChanges {
playButton.visible: true
}
PropertyChanges {
pausedButton.visible: false
}
}
]
}