Files
Artemis/ui/components/AudioPlayer.qml
2024-06-24 18:48:53 +02:00

274 lines
7.8 KiB
QML

import QtQuick
import QtQuick.Window
import QtQuick.Layouts
import QtQuick.Controls
import QtQuick.Controls.Material
import QtMultimedia
Item {
width: 200
height: 80
property bool loop: false
function loadSound(audio_path) {
player.stop()
player.source = audio_path
buttonPlay.icon.color = Material.accent
buttonPlay.enabled = true
buttonLoop.enabled = true
}
function playSound() {
buttonPlay.icon.color = Material.foreground
buttonPause.icon.color = Material.accent
buttonStop.icon.color = Material.accent
buttonPlay.enabled = false
buttonPause.enabled = true
buttonStop.enabled = true
buttonLoop.enabled = true
positionSlider.enabled = player.seekable
player.play()
}
function pauseSound() {
buttonPlay.icon.color = Material.accent
buttonPause.icon.color = Material.foreground
buttonPlay.enabled = true
buttonPause.enabled = false
player.pause()
}
function stopSound() {
buttonPlay.icon.color = Material.accent
buttonPause.icon.color = Material.foreground
buttonStop.icon.color = Material.foreground
buttonLoop.icon.color = Material.foreground
buttonPlay.enabled = true
buttonPause.enabled = false
buttonStop.enabled = false
buttonLoop.enabled = false
loop = false
player.stop()
}
function resetPlayer() {
player.stop()
player.source = ''
loop = false
buttonPlay.icon.color = Material.foreground
buttonPause.icon.color = Material.foreground
buttonStop.icon.color = Material.foreground
buttonLoop.icon.color = Material.foreground
buttonPlay.enabled = false
buttonPause.enabled = false
buttonStop.enabled = false
buttonLoop.enabled = false
positionSlider.enabled = false
}
Window {
id: audioSettingWindow
width: 450
height: 150
maximumHeight: height
maximumWidth: width
minimumHeight: height
minimumWidth: width
modality: Qt.ApplicationModal
flags: Qt.Dialog
title: qsTr("Artemis - Audio Player Settings")
Component.onCompleted: {
x = Screen.width / 2 - width / 2
y = Screen.height / 2 - height / 2
}
Page {
anchors.fill: parent
ColumnLayout {
anchors.fill: parent
anchors.rightMargin: 10
anchors.leftMargin: 10
anchors.bottomMargin: 10
anchors.topMargin: 10
RowLayout {
Layout.fillWidth: true
Label {
text: "Audio Output"
font.pixelSize: 12
clip: true
Layout.fillWidth: true
}
ComboBox {
id: audioOutputComboBox
Layout.preferredWidth: 200
model: mediaDevices.audioOutputs
textRole: "description"
onCurrentIndexChanged: {
audioOutput.device = mediaDevices.audioOutputs[currentIndex]
}
}
}
RowLayout {
Layout.fillWidth: true
Label {
text: "Volume"
font.pixelSize: 12
clip: true
Layout.fillWidth: true
}
Slider {
id: volumeSlider
Layout.preferredHeight: 20
Layout.preferredWidth: 200
value: 0.5
}
}
RowLayout {
Layout.fillWidth: true
Label {
text: "Replay (Loop)"
font.pixelSize: 12
clip: true
Layout.fillWidth: true
}
RoundButton {
id: buttonLoop
icon.color: Material.foreground
icon.source: "qrc:/images/icons/player_loop.svg"
display: AbstractButton.IconOnly
enabled: false
flat: true
onClicked: {
if (loop) {
loop = false
icon.color = Material.foreground
} else {
loop = true
icon.color = Material.accent
}
}
}
}
Item {
Layout.fillHeight: true
}
}
}
}
ColumnLayout {
anchors.fill: parent
spacing: 0
RowLayout {
spacing: 0
Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
RoundButton {
id: buttonPlay
icon.color: Material.foreground
icon.source: "qrc:/images/icons/player_play.svg"
display: AbstractButton.IconOnly
enabled: false
flat: true
onClicked: playSound()
}
Item {
Layout.fillWidth: true
}
RoundButton {
id: buttonPause
icon.color: Material.foreground
icon.source: "qrc:/images/icons/player_pause.svg"
display: AbstractButton.IconOnly
enabled: false
flat: true
onClicked: pauseSound()
}
Item {
Layout.fillWidth: true
}
RoundButton {
id: buttonStop
icon.color: Material.foreground
icon.source: "qrc:/images/icons/player_stop.svg"
display: AbstractButton.IconOnly
enabled: false
flat: true
onClicked: stopSound()
}
Item {
Layout.fillWidth: true
}
RoundButton {
id: buttonSettings
icon.color: Material.foreground
icon.source: "qrc:/images/icons/settings.svg"
display: AbstractButton.IconOnly
enabled: true
flat: true
onClicked: {
audioSettingWindow.show()
}
}
}
RowLayout {
Slider {
id: positionSlider
Layout.preferredHeight: 20
enabled: player.seekable
value: player.duration > 0 ? player.position / player.duration : 0
Layout.fillWidth: true
onMoved: {
player.position = player.duration * positionSlider.position
}
}
}
MediaPlayer {
id: player
audioOutput: audioOutput
onPlaybackStateChanged: {
if (player.playbackState === MediaPlayer.StoppedState) {
if (loop) {
playSound()
} else {
stopSound()
}
}
}
}
AudioOutput {
id: audioOutput
device: mediaDevices.defaultAudioOutput
volume: volumeSlider.value
}
MediaDevices {
id: mediaDevices
}
}
}