X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=app%2FMediaPlayer.qml;h=c338af980d3894220db35e75791b14b72ad2a581;hb=refs%2Ftags%2Fguppy_6.99.1;hp=570af0fe904917c23374e5a903abcdc1b610b263;hpb=343b678105e68faf8c89a15f1a77a6c1d9b78600;p=apps%2Fmediaplayer.git diff --git a/app/MediaPlayer.qml b/app/MediaPlayer.qml index 570af0f..c338af9 100644 --- a/app/MediaPlayer.qml +++ b/app/MediaPlayer.qml @@ -17,33 +17,85 @@ import QtQuick 2.6 import QtQuick.Layouts 1.1 import QtQuick.Controls 2.0 -import QtMultimedia 5.6 import AGL.Demo.Controls 1.0 -import MediaPlayer 1.0 ApplicationWindow { id: root - MediaPlayer { + width: container.width * container.scale + height: container.height * container.scale + + Item { id: player - audioRole: MediaPlayer.MusicRole - autoLoad: true - playlist: playlist + + property string title: "" + property string album: "" + property string artist: "" + + property bool av_connected: false + + property int duration: 0 + property int position: 0 + + property string cover_art: "" + property string status: "stopped" + function time2str(value) { return Qt.formatTime(new Date(value), 'mm:ss') } - onPositionChanged: slider.value = player.position } - Playlist { - id: playlist - playbackMode: random.checked ? Playlist.Random : loop.checked ? Playlist.Loop : Playlist.Sequential + Connections { + target: mediaplayer + + onMetadataChanged: { + var track = metadata.track + + if ('status' in metadata) { + player.status = metadata.status + } + + if ('connected' in metadata) { + player.av_connected = metadata.connected + } + + if ('position' in metadata) { + player.position = metadata.position + } + + if (track) { + if ('image' in track) { + player.cover_art = track.image + } + + player.title = track.title + player.album = track.album + player.artist = track.artist + player.duration = track.duration + + if ('index' in track) { + playlistview.currentIndex = track.index + } + } + } + } - Component.onCompleted: { - playlist.addItems(mediaFiles) + Timer { + id: timer + interval: 250 + running: player.av_connected && player.status == "playing" + repeat: true + onTriggered: { + player.position = player.position + 250 } } + Item { + id: container + anchors.centerIn: parent + width: 1080 + height: 1487 + scale: screenInfo.scale_factor() ColumnLayout { anchors.fill: parent @@ -53,12 +105,14 @@ ApplicationWindow { 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 : '' + source: player.cover_art ? player.cover_art : '' + visible: player.av_connected === false } Item { @@ -80,15 +134,18 @@ ApplicationWindow { Layout.fillHeight: true Row { spacing: 20 - ToggleButton { - id: random - offImage: './images/AGL_MediaPlayer_Shuffle_Inactive.svg' - onImage: './images/AGL_MediaPlayer_Shuffle_Active.svg' - } + //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: player.av_connected === false offImage: './images/AGL_MediaPlayer_Loop_Inactive.svg' onImage: './images/AGL_MediaPlayer_Loop_Active.svg' + onClicked: { mediaplayer.loop(checked) } } } ColumnLayout { @@ -96,14 +153,13 @@ ApplicationWindow { Label { id: title Layout.alignment: Layout.Center - text: player.metaData.title ? player.metaData.title : '' + text: player.title horizontalAlignment: Label.AlignHCenter verticalAlignment: Label.AlignVCenter } Label { - id: artist Layout.alignment: Layout.Center - text: player.metaData.author ? player.metaData.author : '' + text: player.artist horizontalAlignment: Label.AlignHCenter verticalAlignment: Label.AlignVCenter font.pixelSize: title.font.pixelSize * 0.6 @@ -114,6 +170,8 @@ ApplicationWindow { id: slider Layout.fillWidth: true to: player.duration + enabled: player.av_connected === false + value: player.position Label { id: position anchors.left: parent.left @@ -128,7 +186,7 @@ ApplicationWindow { font.pixelSize: 32 text: player.time2str(player.duration) } - onPressedChanged: player.seek(value) + onPressedChanged: mediaplayer.seek(value) } RowLayout { Layout.fillHeight: true @@ -140,36 +198,53 @@ ApplicationWindow { // } Item { Layout.fillWidth: true } ImageButton { + id: previous offImage: './images/AGL_MediaPlayer_BackArrow.svg' - onClicked: playlist.previous() + onClicked: { + mediaplayer.previous() + } } ImageButton { id: play - offImage: './images/AGL_MediaPlayer_Player_Play.svg' - onClicked: player.play() states: [ State { - when: player.playbackState === MediaPlayer.PlayingState + when: player.status == "playing" PropertyChanges { target: play offImage: './images/AGL_MediaPlayer_Player_Pause.svg' - onClicked: player.pause() + onClicked: { + player.status = "stopped" + mediaplayer.pause() + } + } + }, + State { + when: player.status != "playing" + PropertyChanges { + target: play + offImage: './images/AGL_MediaPlayer_Player_Play.svg' + onClicked: mediaplayer.play() } } ] } ImageButton { + id: forward offImage: './images/AGL_MediaPlayer_ForwardArrow.svg' - onClicked: playlist.next() + onClicked: { + mediaplayer.next() + } } Item { Layout.fillWidth: true } -// Image { -// source: './images/AGL_MediaPlayer_Bluetooth_Inactive.svg' -// } -// Image { -// source: './images/AGL_MediaPlayer_Radio_Inactive.svg' -// } + + ToggleButton { + visible: true + enabled: false + checked: player.av_connected + offImage: './images/AGL_MediaPlayer_Bluetooth_Inactive.svg' + onImage: './images/AGL_MediaPlayer_Bluetooth_Active.svg' + } } } } @@ -178,18 +253,19 @@ ApplicationWindow { Layout.fillWidth: true Layout.fillHeight: true Layout.preferredHeight: 407 + ListView { anchors.fill: parent + id: playlistview + visible: player.av_connected === false clip: true header: Label { x: 50 text: 'PLAYLIST' opacity: 0.5 } - model: PlaylistWithMetadata { - source: playlist - } - currentIndex: playlist.currentIndex + model: MediaplayerModel + currentIndex: -1 delegate: MouseArea { id: delegate @@ -199,12 +275,6 @@ ApplicationWindow { anchors.fill: parent anchors.leftMargin: 50 anchors.rightMargin: 50 - Image { - source: model.coverArt - fillMode: Image.PreserveAspectFit - Layout.preferredWidth: delegate.height - Layout.preferredHeight: delegate.height - } ColumnLayout { Layout.fillWidth: true Label { @@ -214,19 +284,18 @@ ApplicationWindow { Label { Layout.fillWidth: true text: model.artist - color: '#66FF99' + color: '#00ADDC' font.pixelSize: 32 } } - Label { - text: player.time2str(model.duration) - color: '#66FF99' - font.pixelSize: 32 - } + //Label { + // text: player.time2str(model.duration) + // color: '#00ADDC' + // font.pixelSize: 32 + //} } onClicked: { - playlist.currentIndex = model.index - player.play() + mediaplayer.picktrack(playlistview.model[index].index) } } @@ -238,3 +307,4 @@ ApplicationWindow { } } } +}