diff --git a/data_models/db_model.qml b/data_models/db_model.qml index e6a5ff9..32ec107 100644 --- a/data_models/db_model.qml +++ b/data_models/db_model.qml @@ -1,7 +1,8 @@ + import QtQuick 2.10 import QtQuick.Controls 2.10 import QtQuick.Layouts 1.3 Item { } diff --git a/services/web/YouTube.qml b/services/web/YouTube.qml index 31ada39..e5686f2 100644 --- a/services/web/YouTube.qml +++ b/services/web/YouTube.qml @@ -1,281 +1,283 @@ import QtQuick 2.10 import QtQuick.Controls 2.10 import QtQuick.Layouts 1.3 import "../../view_models" import "../../view_models/BabeTable" import org.kde.kirigami 2.2 as Kirigami import org.kde.mauikit 1.0 as Maui Maui.Page { id: youtubeViewRoot property var searchRes : [] clip: true property alias viewer : youtubeViewer property int openVideo : 0 headBar.visible: false Connections { target: youtube onQueryResultsReady: { searchRes = res; populate(searchRes) youtubeTable.forceActiveFocus() if(openVideo > 0) { console.log("trying to open video") watchVideo(youtubeTable.model.get(openVideo-1)) openVideo = 0 } } } /*this is for playing the track sin the background without showing the actual video*/ Loader { id: youtubePlayer source: isAndroid ? "qrc:/services/web/YoutubePlayer_A.qml" : "qrc:/services/web/YoutubePlayer.qml" } Maui.Dialog { id: configPopup parent: parent margins: Maui.Style.contentMargins widthHint: 0.9 heightHint: 0.9 maxHeight: 200 maxWidth: 300 defaultButtons: false + GridLayout { anchors.fill: parent columns: 1 rows: 6 clip: true Item { Layout.column: 1 Layout.row: 1 Layout.fillWidth: true Layout.fillHeight: true } Label { text: qsTr("Custom API Key") verticalAlignment: Qt.AlignVCenter elide: Text.ElideRight font.pointSize: Maui.Style.fontSizes.default Layout.column: 1 Layout.row: 2 Layout.fillWidth: true } TextField { Layout.column: 1 Layout.row: 3 Layout.fillWidth: true text: Maui.FM.loadSettings("YOUTUBEKEY", "BABE", youtube.getKey()) } Label { text: qsTr("Search results") verticalAlignment: Qt.AlignVCenter elide: Text.ElideRight font.pointSize: Maui.Style.fontSizes.default Layout.column: 1 Layout.row: 4 Layout.fillWidth: true } SpinBox { Layout.alignment: Qt.AlignRight Layout.column: 1 Layout.row: 5 Layout.fillWidth: true from: 1 to: 50 value: Maui.FM.loadSettings("YOUTUBELIMIT", "BABE", 25) editable: true onValueChanged: { Maui.FM.saveSettings("YOUTUBELIMIT", value, "BABE") } } Item { Layout.column: 1 Layout.row: 6 Layout.fillWidth: true Layout.fillHeight: true } } } StackView { id: stackView anchors.fill: parent focus: true pushEnter: Transition { PropertyAnimation { property: "opacity" from: 0 to:1 duration: 200 } } pushExit: Transition { PropertyAnimation { property: "opacity" from: 1 to:0 duration: 200 } } popEnter: Transition { PropertyAnimation { property: "opacity" from: 0 to:1 duration: 200 } } popExit: Transition { PropertyAnimation { property: "opacity" from: 1 to:0 duration: 200 } } initialItem: BabeTable { id: youtubeTable trackNumberVisible: false headBar.visible: false - holder.emoji: "qrc:/assets/Astronaut.png" + holder.visible: count === 0 + holder.emoji: "qrc:/assets/dialog-information.svg" holder.isMask: false holder.title : "No Results!" holder.body: "Try with another query" holder.emojiSize: Maui.Style.iconSizes.huge coverArtVisible: true model: ListModel{} onRowClicked: { watchVideo(youtubeTable.model.get(index)) } onQuickPlayTrack: { playTrack(youtubeTable.model.get(index).url) } } YoutubeViewer { id: youtubeViewer } } footBar.leftContent: ToolButton { id: menuBtn icon.name: "application-menu" onClicked: configPopup.open() } footBar.rightContent: ToolButton { icon.name: "edit-clear" onClicked: clearSearch() } footBar.middleContent: Maui.TextField { id: searchInput Layout.fillWidth: true placeholderText: qsTr("Search videos...") wrapMode: TextEdit.Wrap onAccepted: runSearch(searchInput.text) } function watchVideo(track) { if(track && track.url) { var url = track.url if(url && url.length > 0) { youtubeViewer.currentYt = track youtubeViewer.webView.url = url+"?autoplay=1" stackView.push(youtubeViewer) } } } function playTrack(url) { if(url && url.length > 0) { var newURL = url.replace("embed/", "watch?v=") console.log(newURL) youtubePlayer.item.url = newURL+"?autoplay=1+&vq=tiny" youtubePlayer.item.runJavaScript("document.title", function(result) { console.log(result); }); } } function runSearch(searchTxt) { if(searchTxt) if(searchTxt !== youtubeTable.title) { youtubeTable.title = searchTxt youtube.getQuery(searchTxt, Maui.FM.loadSettings("YOUTUBELIMIT", "BABE", 25)) } } function clearSearch() { searchInput.clear() youtubeTable.listView.model.clear() youtubeTable.title = "" searchRes = [] } function populate(tracks) { youtubeTable.model.clear() for(var i in tracks) youtubeTable.model.append(tracks[i]) } } diff --git a/widgets/FoldersView.qml b/widgets/FoldersView.qml index 997d6d1..73ee351 100644 --- a/widgets/FoldersView.qml +++ b/widgets/FoldersView.qml @@ -1,82 +1,83 @@ import QtQuick 2.0 import QtQuick.Controls 2.10 import org.kde.mauikit 1.0 as Maui import "../view_models/BabeTable" import "../db/Queries.js" as Q Item { id: control property alias list : _filterList property alias listModel : _filterList.model property var tracks : [] property string currentFolder : "" Maui.GridBrowser { id: browser anchors.fill: parent showEmblem: false model: ListModel {} itemWidth: itemSize * 1.2 itemHeight: itemSize * 1.2 onItemClicked: { var item = browser.model.get(index) _filterList.title= item.label currentFolder = item.path filter() _listDialog.open() } } Maui.Holder { anchors.fill: parent visible: !browser.count emoji: "qrc:/assets/dialog-information.svg" isMask: false title : "No Folders!" body: "Add new music to your sources to browse by folders" emojiSize: Maui.Style.iconSizes.huge } Maui.Dialog { id: _listDialog parent: parent maxHeight: maxWidth maxWidth: Maui.Style.unit * 600 defaultButtons: false page.padding: 0 + BabeTable { id: _filterList anchors.fill: parent coverArtVisible: true holder.emoji: "qrc:/assets/MusicCloud.png" holder.isMask: false holder.title : "No Tracks!" holder.body: "This source folder seems to be empty!" holder.emojiSize: Maui.Style.iconSizes.huge } } Component.onCompleted: populate() function populate() { browser.model.clear() var folders = vvave.sourceFolders(); if(folders.length > 0) for(var i in folders) browser.model.append(folders[i]) } function filter() { var where = "source = \""+currentFolder+"\"" _filterList.list.query = (Q.GET.tracksWhere_.arg(where)) } } diff --git a/widgets/MainPlaylist/MainPlaylist.qml b/widgets/MainPlaylist/MainPlaylist.qml index 4280c22..b66346e 100644 --- a/widgets/MainPlaylist/MainPlaylist.qml +++ b/widgets/MainPlaylist/MainPlaylist.qml @@ -1,229 +1,229 @@ import QtQuick 2.12 import QtQuick.Controls 2.12 import QtQuick.Layouts 1.12 import QtGraphicalEffects 1.0 import org.kde.kirigami 2.2 as Kirigami import org.kde.mauikit 1.0 as Maui import "../../utils/Player.js" as Player import "../../db/Queries.js" as Q import "../../utils" import "../../widgets" import "../../view_models" import "../../view_models/BabeTable" Maui.Page { id: control property alias list : table.list property alias listModel: table.listModel property alias listView : table.listView property alias table: table property alias menu : playlistMenu property alias contextMenu: table.contextMenu signal coverDoubleClicked(var tracks) signal coverPressed(var tracks) focus: true headBar.visible: false PlaylistMenu { id: playlistMenu onClearOut: Player.clearOutPlaylist() onClean: Player.cleanPlaylist() onSaveToClicked: table.saveList() } footer: AlbumsRoll { id: _albumsRoll width: table.width position: ToolBar.Footer } BabeTable { id: table anchors.fill: parent focus: true headBar.visible: false footBar.visible: false coverArtVisible: true holder.emoji: "qrc:/assets/dialog-information.svg" holder.isMask: false holder.title : "Meh!" holder.body: "Start putting together your playlist!" holder.emojiSize: Maui.Style.iconSizes.huge listView.header: Rectangle { visible: root.sync Kirigami.Theme.inherit: false Kirigami.Theme.colorSet:Kirigami.Theme.Complementary z: table.z + 999 width: table.width height: visible ? Maui.Style.rowHeightAlt : 0 color: Kirigami.Theme.backgroundColor RowLayout { anchors.fill: parent anchors.leftMargin: Maui.Style.space.small Label { Layout.fillWidth: true Layout.fillHeight: true anchors.margins: Maui.Style.space.small text: qsTr("Syncing to ") + root.syncPlaylist } ToolButton { Layout.fillHeight: true icon.name: "dialog-close" onClicked: { root.sync = false root.syncPlaylist = "" } } } } delegate: TableDelegate { id: delegate width: listView.width number : false coverArt : true showEmblem: false onPressAndHold: if(Kirigami.Settings.isMobile && table.allowMenu) table.openItemMenu(index) - onRightClicked: if(allowMenu) openItemMenu(index) + onRightClicked: if(table.allowMenu) table.openItemMenu(index) sameAlbum: { if(coverArt) { if(list.get(index-1)) { if(list.get(index-1).album === album && list.get(index-1).artist === artist) true else false }else false }else false } ToolButton { Layout.fillHeight: true Layout.preferredWidth: implicitWidth visible: (Kirigami.Settings.isMobile ? true : delegate.hovered) icon.name: "edit-clear" onClicked: { if(index === currentTrackIndex) player.stop() list.remove(index) } opacity: delegate.hovered ? 0.8 : 0.6 } onClicked: { table.currentIndex = index if(Kirigami.Settings.isMobile) control.play(index) } onDoubleClicked: { table.currentIndex = index if(!Kirigami.Settings.isMobile) control.play(index) } } onArtworkDoubleClicked: contextMenu.babeIt(index) property int startContentY Component.onCompleted: { var lastplaylist = Maui.FM.loadSettings("LASTPLAYLIST", "PLAYLIST", []) var n = lastplaylist.length if(n>0) { for(var i = 0; i < n; i++) { var where = "url = \""+lastplaylist[i]+"\"" var query = Q.GET.tracksWhere_.arg(where) table.list.appendQuery(query); } }else { where = "fav = 1" query = Q.GET.tracksWhere_.arg(where) table.list.appendQuery(query); } // if(autoplay) // Player.playAt(0) } } // function goFocusMode() // { // if(focusMode) // { // if(isMobile) // { // root.width = screenWidth // root.height= screenHeight // }else // { // cover.y = 0 // root.maximumWidth = screenWidth // root.minimumWidth = columnWidth // root.maximumHeight = screenHeight // root.minimumHeight = columnWidth // root.width = columnWidth // root.height = 700 // } // }else // { // if(isMobile) // { // }else // { // root.maximumWidth = columnWidth // root.minimumWidth = columnWidth // root.maximumHeight = columnWidth // root.minimumHeight = columnWidth // // root.footer.visible = false // // mainlistContext.visible = false // } // } // focusMode = !focusMode // } function play(index) { prevTrackIndex = currentTrackIndex Player.playAt(index) } }