ApplicationWindow {
id: root
+ Item {
+ id: bluetooth
+ property bool connected: false
+ property string state
+
+ property string artist
+ property string title
+ property int duration: 0
+ property int position: 0
+ property int pos_offset: 0
+
+ function disableBluetooth() {
+ bluetooth.artist = ''
+ bluetooth.title = ''
+ bluetooth.duration = 0
+ bluetooth.position = 0
+ bluetooth.pos_offset = 0
+ bluetooth.connected = false
+ }
+ }
+
+ Connections {
+ target: dbus
+
+ onStopPlayback: {
+ player.stop()
+ playlist.clear()
+ playlistmodel.setSource(playlist)
+ playlistview.visible = false
+ }
+
+ onProcessPlaylistUpdate: {
+ playlist.clear()
+ playlist.addItems(mediaFiles)
+
+ playlistmodel.setSource(playlist)
+ playlistview.visible = bluetooth.connected == false
+ }
+
+ onProcessPlaylistHide: {
+ playlistview.visible = false
+ player.stop()
+ }
+
+ onProcessPlaylistShow: {
+ playlistview.visible = true
+ bluetooth.disableBluetooth()
+ }
+
+ onDisplayBluetoothMetadata: {
+ if (avrcp_artist)
+ bluetooth.artist = avrcp_artist
+ if (avrcp_title)
+ bluetooth.title = avrcp_title
+ bluetooth.duration = avrcp_duration
+ bluetooth.pos_offset = 0
+ }
+
+ onUpdatePlayerStatus: {
+ bluetooth.connected = true
+ bluetooth.state = status
+ }
+
+ onUpdatePosition: {
+ slider.value = current_position
+ bluetooth.position = current_position
+ }
+ }
+
MediaPlayer {
id: player
audioRole: MediaPlayer.MusicRole
autoLoad: true
playlist: playlist
+
+ property bool is_bluetooth: false
function time2str(value) {
return Qt.formatTime(new Date(value), 'mm:ss')
}
onPositionChanged: slider.value = player.position
}
+ Timer {
+ id: timer
+ interval: 250
+ running: (bluetooth.connected && bluetooth.state == "playing")
+ repeat: true
+ onTriggered: {
+ bluetooth.position = dbus.getCurrentPosition() - bluetooth.pos_offset
+ slider.value = bluetooth.position
+ }
+ }
+
Playlist {
id: playlist
playbackMode: random.checked ? Playlist.Random : loop.checked ? Playlist.Loop : Playlist.Sequential
Layout.preferredHeight: 1080
clip: true
Image {
+ id: albumart
anchors.left: parent.left
anchors.right: parent.right
anchors.bottom: parent.bottom
height: sourceSize.height * width / sourceSize.width
fillMode: Image.PreserveAspectCrop
source: player.metaData.coverArtImage ? player.metaData.coverArtImage : ''
+ visible: bluetooth.connected == false
}
Item {
spacing: 20
ToggleButton {
id: random
+ visible: bluetooth.connected == false
offImage: './images/AGL_MediaPlayer_Shuffle_Inactive.svg'
onImage: './images/AGL_MediaPlayer_Shuffle_Active.svg'
}
ToggleButton {
id: loop
+ visible: bluetooth.connected == false
offImage: './images/AGL_MediaPlayer_Loop_Inactive.svg'
onImage: './images/AGL_MediaPlayer_Loop_Active.svg'
}
Label {
id: title
Layout.alignment: Layout.Center
- text: player.metaData.title ? player.metaData.title : ''
+ text: bluetooth.title ? bluetooth.title : (player.metaData.title ? player.metaData.title : '')
horizontalAlignment: Label.AlignHCenter
verticalAlignment: Label.AlignVCenter
}
Label {
- id: artist
Layout.alignment: Layout.Center
- text: player.metaData.contributingArtist ? player.metaData.contributingArtist : ''
+ text: bluetooth.artist ? bluetooth.artist : (player.metaData.contributingArtist ? player.metaData.contributingArtist : '')
horizontalAlignment: Label.AlignHCenter
verticalAlignment: Label.AlignVCenter
font.pixelSize: title.font.pixelSize * 0.6
Slider {
id: slider
Layout.fillWidth: true
- to: player.duration
+ to: bluetooth.connected ? bluetooth.duration : player.duration
+ enabled: bluetooth.connected == false
+ function getPosition() {
+ if (bluetooth.connected && bluetooth.position) {
+ return player.time2str(bluetooth.position)
+ }
+ return player.time2str(player.position)
+ }
Label {
id: position
anchors.left: parent.left
anchors.bottom: parent.top
font.pixelSize: 32
- text: player.time2str(player.position)
+ text: slider.getPosition()
}
Label {
id: duration
anchors.right: parent.right
anchors.bottom: parent.top
font.pixelSize: 32
- text: player.time2str(player.duration)
+ text: bluetooth.connected ? player.time2str(bluetooth.duration) : player.time2str(player.duration)
}
onPressedChanged: player.seek(value)
}
// }
Item { Layout.fillWidth: true }
ImageButton {
+ id: previous
offImage: './images/AGL_MediaPlayer_BackArrow.svg'
- onClicked: playlist.previous()
+ onClicked: {
+ if (bluetooth.connected) {
+ bluetooth.pos_offset = dbus.getCurrentPosition()
+ dbus.processQMLEvent("Previous")
+ } else {
+ playlist.previous()
+ }
+ }
}
ImageButton {
id: play
offImage: './images/AGL_MediaPlayer_Player_Play.svg'
- onClicked: player.play()
+ onClicked: {
+ if (bluetooth.connected) {
+ dbus.processQMLEvent("Play")
+ } else {
+ player.play()
+ }
+ }
states: [
State {
when: player.playbackState === MediaPlayer.PlayingState
offImage: './images/AGL_MediaPlayer_Player_Pause.svg'
onClicked: player.pause()
}
+ },
+ State {
+ when: bluetooth.connected && bluetooth.state == "playing"
+ PropertyChanges {
+ target: play
+ offImage: './images/AGL_MediaPlayer_Player_Pause.svg'
+ onClicked: dbus.processQMLEvent("Pause")
+ }
}
+
]
}
ImageButton {
+ id: forward
offImage: './images/AGL_MediaPlayer_ForwardArrow.svg'
- onClicked: playlist.next()
+ onClicked: {
+ if (bluetooth.connected) {
+ dbus.processQMLEvent("Next")
+ } else {
+ playlist.next()
+ }
+ }
}
Item { Layout.fillWidth: true }
Layout.fillWidth: true
Layout.fillHeight: true
Layout.preferredHeight: 407
+
+ PlaylistWithMetadata {
+ id: playlistmodel
+ source: playlist
+ }
+
ListView {
anchors.fill: parent
+ id: playlistview
clip: true
header: Label {
x: 50
text: 'PLAYLIST'
opacity: 0.5
}
- model: PlaylistWithMetadata {
- source: playlist
- }
+ model: playlistmodel
currentIndex: playlist.currentIndex
delegate: MouseArea {