Finished player and beginning of queue

This commit is contained in:
Bart De Vries 2021-03-25 22:25:39 +01:00
parent 5abbd56c88
commit 61d443f0e3
10 changed files with 145 additions and 126 deletions

View File

@ -54,7 +54,7 @@ Kirigami.SwipeListItem {
onClicked: {
model.entry.read = true
pageStack.push(model.entry.enclosure ? "qrc:/PodcastPlayerPage.qml" : "qrc:/EntryPage.qml", {"entry": model.entry})
pageStack.push("qrc:/EntryPage.qml", {"entry": model.entry})
}
actions: [

View File

@ -14,19 +14,19 @@ import org.kde.kirigami 2.12 as Kirigami
import org.kde.alligator 1.0
Kirigami.Page {
Kirigami.ScrollablePage {
id: page
property QtObject entry
title: entry.title
Flickable {
/*Flickable {
anchors.fill: parent
clip: true
contentHeight: text.height
*/
Controls.Label {
width: page.width - 30
id: text
@ -35,8 +35,25 @@ Kirigami.Page {
textFormat: Text.RichText
wrapMode: Text.WordWrap
Layout.fillWidth: true
Layout.fillHeight: true
onLinkActivated: Qt.openUrlExternally(link)
onWidthChanged: entry.adjustedContent(width, font.pixelSize)
}
//}
actions.main: Kirigami.Action {
text: !entry.enclosure ? i18n("Open in Browser") :
entry.enclosure.status === Enclosure.Downloadable ? i18n("Download") :
entry.enclosure.status === Enclosure.Downloading ? i18n("Cancel download") :
i18n("Delete downloaded file")
icon.name: !entry.enclosure ? "globe" :
entry.enclosure.status === Enclosure.Downloadable ? "download" :
entry.enclosure.status === Enclosure.Downloading ? "edit-delete-remove" :
"delete"
onTriggered: {
if(!entry.enclosure) Qt.openUrlExternally(entry.link)
else if(entry.enclosure.status === Enclosure.Downloadable) entry.enclosure.download()
else if(entry.enclosure.status === Enclosure.Downloading) entry.enclosure.cancelDownload()
else entry.enclosure.deleteFile()
}
}
}

View File

@ -14,7 +14,7 @@ import org.kde.kirigami 2.12 as Kirigami
import org.kde.alligator 1.0
Kirigami.ScrollablePage {
title: "Alligator"
title: "Alligator Feed List"
property var lastFeed: ""

View File

@ -75,7 +75,7 @@ Flickable {
// a cover for content underneath the panel
Rectangle {
id: coverUnderneath
color: "#424242" // since background blurs have a dark hue, it doesn't make sense to theme
color: Kirigami.Theme.backgroundColor
anchors.fill: parent
}
@ -87,7 +87,7 @@ Flickable {
anchors.bottom: parent.bottom
anchors.left: parent.left
anchors.right: parent.right
height: mainWindow.height + elisaTheme.mediaPlayerControlHeight
height: root.height + footerLoader.minimizedSize
spacing: 0
MinimizedPlayerControls {

View File

@ -16,9 +16,9 @@ import org.kde.alligator 1.0
Item {
width: parent.width
height: (audio.entry == undefined) ? 0 : (footerrowlayout.height + 3.0 * miniprogressbar.height)
height: (audio.entry == undefined || audio.playerOpen) ? 0 : (footerrowlayout.height + 3.0 * miniprogressbar.height)
//margins.bottom: miniprogressbar.height
visible: audio.entry !== undefined
visible: (audio.entry !== undefined) && !audio.playerOpen
// progress bar for limited width (phones)
Rectangle {
@ -89,7 +89,7 @@ Item {
id: trackClick
anchors.fill: parent
hoverEnabled: true
onClicked: playeroverlay.open()
onClicked: pageStack.layers.push("qrc:/PlayerControls.qml") // playeroverlay.open()
//showPassiveNotification("Ping")
}
}

View File

@ -20,6 +20,9 @@ Kirigami.Page {
clip: true
Layout.margins: 0
Component.onCompleted: audio.playerOpen = true
Component.onDestruction: audio.playerOpen = false
ColumnLayout {
anchors.fill: parent
Kirigami.Icon {

View File

@ -21,122 +21,14 @@ Kirigami.Page {
clip: true
Layout.margins: 0
Kirigami.SwipeNavigator {
anchors.fill: parent
initialIndex: 1
Layout.margins: 0
Kirigami.Page {
id: playpage
property var entry: podcastPlayerPage.entry
Component.onCompleted: audio.entry = entry
icon.name: "media-playback-start"
title: "Play"
ColumnLayout {
anchors.fill: parent
Kirigami.Icon {
source: Fetcher.image(entry.feed.image)
Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter
Layout.preferredWidth: Math.min(parent.width, Kirigami.Units.iconSizes.enormous * 3)
Layout.preferredHeight: Math.min(parent.height - 2*controls.height, Kirigami.Units.iconSizes.enormous * 3)
}
Item {
id: media
implicitHeight: mediaControls.height
Layout.fillWidth: true
Layout.margins: 0
ColumnLayout {
id: mediaControls
implicitHeight: controls.height
anchors.left: parent.left
anchors.right: parent.right
RowLayout {
id: controls
Controls.Label {
text: (Math.floor(audio.position/3600000) < 10 ? "0" : "") + Math.floor(audio.position/3600000) + ":" + (Math.floor(audio.position/60000) % 60 < 10 ? "0" : "") + Math.floor(audio.position/60000) % 60 + ":" + (Math.floor(audio.position/1000) % 60 < 10 ? "0" : "") + Math.floor(audio.position/1000) % 60
padding: Kirigami.Units.gridUnit
}
Controls.Slider {
Layout.fillWidth: true
from: 0
to: audio.duration
value: audio.position
onMoved: audio.seek(value)
}
Controls.Label {
text: (Math.floor(audio.duration/3600000) < 10 ? "0" : "") + Math.floor(audio.duration/3600000) + ":" + (Math.floor(audio.duration/60000) % 60 < 10 ? "0" : "") + Math.floor(audio.duration/60000) % 60 + ":" + (Math.floor(audio.duration/1000) % 60 < 10 ? "0" : "") + Math.floor(audio.duration/1000) % 60
padding: Kirigami.Units.gridUnit
}
}
RowLayout {
Layout.maximumWidth: Number.POSITIVE_INFINITY //TODO ?
Layout.fillWidth: true
Controls.Button {
text: audio.playbackRate + "x"
onClicked: {
if(audio.playbackRate === 2.5)
audio.playbackRate = 1
else
audio.playbackRate = audio.playbackRate + 0.25
}
flat: true
Layout.alignment: Qt.AlignHCenter
implicitWidth: playButton.width
implicitHeight: playButton.height
}
Controls.Button {
icon.name: "media-seek-backward"
icon.height: Kirigami.Units.gridUnit * 2
icon.width: Kirigami.Units.gridUnit * 2
flat: true
Layout.alignment: Qt.AlignHCenter
onClicked: audio.seek(audio.position - 10000)
}
Controls.Button {
id: playButton
icon.name: audio.playbackState === Audio.PlayingState ? "media-playback-pause" : "media-playback-start"
icon.height: Kirigami.Units.gridUnit * 2
icon.width: Kirigami.Units.gridUnit * 2
flat: true
onClicked: audio.playbackState === Audio.PlayingState ? audio.pause() : audio.play()
Layout.alignment: Qt.AlignHCenter
}
Controls.Button {
icon.name: "media-seek-forward"
icon.height: Kirigami.Units.gridUnit * 2
icon.width: Kirigami.Units.gridUnit * 2
flat: true
Layout.alignment: Qt.AlignHCenter
onClicked: audio.seek(audio.position + 10000)
}
Controls.Button {
icon.name: "media-skip-forward"
icon.height: Kirigami.Units.gridUnit * 2
icon.width: Kirigami.Units.gridUnit * 2
flat: true
Layout.alignment: Qt.AlignHCenter
onClicked: console.log("TODO")
}
}
}
}
}
}
EntryPage {
entry: podcastPlayerPage.entry
anchors.fill: parent
icon.name: "help-about"
title: "Info"
}
}
actions.main: Kirigami.Action {
text: !entry.enclosure ? i18n("Open in Browser") :
entry.enclosure.status === Enclosure.Downloadable ? i18n("Download") :

77
src/qml/QueuePage.qml Normal file
View File

@ -0,0 +1,77 @@
/*
SPDX-FileCopyrightText: 2021 (c) Bart De Vries <bart@mogwai.be>
SPDX-License-Identifier: GPL-2.0-or-later
*/
// Includes relevant modules used by the QML
import QtQuick 2.6
import QtQuick.Controls 2.0 as Controls
import QtQuick.Layouts 1.2
import org.kde.kirigami 2.13 as Kirigami
import QtMultimedia 5.15
import org.kde.alligator 1.0
Kirigami.ScrollablePage {
id: queuepage
title: "Alligator Play Queue"
Component {
id: delegateComponent
Kirigami.SwipeListItem {
id: listItem
contentItem: RowLayout {
Kirigami.ListItemDragHandle {
listItem: listItem
listView: mainList
onMoveRequested: listModel.move(oldIndex, newIndex, 1)
}
Controls.Label {
Layout.fillWidth: true
height: Math.max(implicitHeight, Kirigami.Units.iconSizes.smallMedium)
text: model.title
color: listItem.checked || (listItem.pressed && !listItem.checked && !listItem.sectionDelegate) ? listItem.activeTextColor : listItem.textColor
}
}
actions: [
Kirigami.Action {
iconName: "media-playback-start"
text: "Play"
onTriggered: showPassiveNotification(model.title + " Action 1 clicked")
}]
}
}
ListView {
id: mainList
Timer {
id: refreshRequestTimer
interval: 3000
onTriggered: page.refreshing = false
}
model: ListModel {
id: listModel
Component.onCompleted: {
for (var i = 0; i < 200; ++i) {
listModel.append({"title": "Item " + i,
"actions": [{text: "Action 1", icon: "document-decrypt"},
{text: "Action 2", icon: "mail-reply-sender"}]
})
}
}
}
moveDisplaced: Transition {
YAnimator {
duration: Kirigami.Units.longDuration
easing.type: Easing.InOutQuad
}
}
delegate: Kirigami.DelegateRecycler {
width: parent ? parent.width : implicitWidth
sourceComponent: delegateComponent
}
}
}

View File

@ -19,11 +19,25 @@ Kirigami.ApplicationWindow {
title: "Alligator"
property bool playerOpen: false
pageStack.initialPage: feedList
globalDrawer: Kirigami.GlobalDrawer {
isMenu: true
actions: [
Kirigami.Action {
text: i18n("Feed List")
iconName: "rss"
onTriggered: root.pageStack.clear(), root.pageStack.push(feedList)
enabled: pageStack.layers.currentItem.title !== i18n("Feed List")
},
Kirigami.Action {
text: i18n("Podcast Queue")
iconName: "source-playlist"
onTriggered: root.pageStack.clear(), root.pageStack.push(queuelist)
enabled: pageStack.layers.currentItem.title !== i18n("Podcast Queue")
},
Kirigami.Action {
text: i18n("Settings")
iconName: "settings-configure"
@ -54,28 +68,43 @@ Kirigami.ApplicationWindow {
id: feedList
}
QueuePage {
id: queuelist
}
Audio {
id: audio
property var entry
property bool playerOpen: false
source: "gst-pipeline: playbin uri=file://" + entry.enclosure.path + " audio_sink=\"scaletempo ! audioconvert ! audioresample ! autoaudiosink\" video_sink=\"fakevideosink\""
}
/*
Loader {
id: footerLoader
property var minimizedSize: Kirigami.Units.gridUnit * 3.0
anchors.fill: parent
active: true
visible: true
//z: (!item || item.contentY == 0) ? 0 : 999
z: (audio.entry == undefined) ? -1 : 0
active: (audio.entry == undefined) ? false : true
visible: active
z: (!item || item.contentY == 0) ? -1 : 999
sourceComponent: FooterBar {
contentHeight: root.height * 2
focus: true
}
}
*/
//footer: MinimizedPlayerControls { }
footer: MinimizedPlayerControls {}
/*Item {
visible: (audio.entry !== undefined)
height: footerLoader.minimizedSize
}
*/
/*Kirigami.OverlaySheet {
id: playeroverlay

View File

@ -13,6 +13,7 @@
<file alias="MinimizedPlayerControls.qml">qml/MinimizedPlayerControls.qml</file>
<file alias="PlayerControls.qml">qml/PlayerControls.qml</file>
<file alias="FooterBar.qml">qml/FooterBar.qml</file>
<file alias="QueuePage.qml">qml/QueuePage.qml</file>
<file>qtquickcontrols2.conf</file>
</qresource>
</RCC>