diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 1e7abb5e..a9dce018 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -75,7 +75,8 @@ ecm_add_qml_module(audiotube URI org.kde.audiotube contents/ui/HomePage.qml contents/ui/BentoCard.qml contents/ui/HeroCard.qml - contents/ui/ExplorePage.qml + contents/ui/ExplorePage.qml + contents/ui/MoodPage.qml contents/ui/components/ActionButton.qml contents/ui/components/DoubleActionButton.qml RESOURCES diff --git a/src/contents/ui/ExplorePage.qml b/src/contents/ui/ExplorePage.qml index d4645a7b..27cd0142 100644 --- a/src/contents/ui/ExplorePage.qml +++ b/src/contents/ui/ExplorePage.qml @@ -29,12 +29,12 @@ Kirigami.ScrollablePage { onOpenSong: (videoId) => applicationWindow().play(videoId) onOpenPlaylist: (playlistId) => applicationWindow().playPlaylist(playlistId) onOpenAlbum: (browseId) => { - root.Kirigami.PageStack.push(Qt.createComponent('org.kde.audiotube', 'AlbumPage.qml'), { + root.Kirigami.PageStack.push(Qt.createComponent('org.kde.audiotube', 'AlbumPage'), { browseId: browseId }) } onOpenArtist: (browseId, radioId, shuffleId) => { - root.Kirigami.PageStack.push(Qt.createComponent('org.kde.audiotube', 'ArtistsPage.qml'), { + root.Kirigami.PageStack.push(Qt.createComponent('org.kde.audiotube', 'ArtistsPage'), { browseId: browseId }) } @@ -42,11 +42,10 @@ Kirigami.ScrollablePage { applicationWindow().play(videoId) } onOpenMood: (title, params) => { - // TODO - //root.Kirigami.PageStack.push(Qt.createComponent('org.kde.audiotube', 'MoodPage.qml'), { - // moodTitle: title, - // moodParams: params - //}) + root.Kirigami.PageStack.push(Qt.createComponent('org.kde.audiotube', 'MoodPage'), { + moodTitle: title, + moodParams: params + }) } } diff --git a/src/contents/ui/HomePage.qml b/src/contents/ui/HomePage.qml index 6a7e6b38..4d54ef03 100644 --- a/src/contents/ui/HomePage.qml +++ b/src/contents/ui/HomePage.qml @@ -29,12 +29,12 @@ Kirigami.ScrollablePage { onOpenSong: (videoId) => applicationWindow().play(videoId) onOpenPlaylist: (playlistId) => applicationWindow().playPlaylist(playlistId) onOpenAlbum: (browseId) => { - root.Kirigami.PageStack.push(Qt.createComponent('org.kde.audiotube', 'AlbumPage.qml'), { + root.Kirigami.PageStack.push(Qt.createComponent('org.kde.audiotube', 'AlbumPage'), { browseId: browseId }) } onOpenArtist: (browseId, radioId, shuffleId) => { - root.Kirigami.PageStack.push(Qt.createComponent('org.kde.audiotube', 'ArtistsPage.qml'), { + root.Kirigami.PageStack.push(Qt.createComponent('org.kde.audiotube', 'ArtistsPage'), { browseId: browseId }) } diff --git a/src/contents/ui/MoodPage.qml b/src/contents/ui/MoodPage.qml new file mode 100644 index 00000000..f9e0282b --- /dev/null +++ b/src/contents/ui/MoodPage.qml @@ -0,0 +1,58 @@ +// SPDX-FileCopyrightText: 2026 Tanveer Ahmed Mansuri +// +// SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL + +import QtQuick +import QtQuick.Controls as Controls +import QtQuick.Layouts +import org.kde.kirigami as Kirigami +import org.kde.audiotube +import QtQml + +Kirigami.ScrollablePage { + id: root + title: moodTitle + objectName: "moodPage" + + required property string moodTitle + required property string moodParams + + MoodPlaylistsModel { + id: moodModel + params: root.moodParams + title: root.moodTitle + onOpenPlaylist: (browseId) => applicationWindow().playPlaylist(browseId) + } + + GridView { + id: grid + + model: moodModel + + leftMargin: Kirigami.Units.gridUnit + rightMargin: Kirigami.Units.gridUnit + topMargin: Kirigami.Units.gridUnit + bottomMargin: Kirigami.Units.gridUnit + + readonly property int viewWidth: grid.width - Kirigami.Units.gridUnit * 2 + readonly property int columns: Math.max(Math.floor(viewWidth / (180 + Kirigami.Units.gridUnit)), 2) + + cellWidth: Math.floor(viewWidth / columns); + cellHeight: 180 + Kirigami.Units.gridUnit + + reuseItems: true + activeFocusOnTab: true + keyNavigationEnabled: true + + delegate: BentoCard { + width: 180 + height: 180 + + required property int itemCount + required property string author + + artistsDisplayString: itemCount ? i18ncp("song count", "%1 song", "%1 songs", itemCount) : (author || "") + onClicked: moodModel.triggerItem(index) + } + } +} diff --git a/src/exploremodel.cpp b/src/exploremodel.cpp index 59960fe2..7db25deb 100644 --- a/src/exploremodel.cpp +++ b/src/exploremodel.cpp @@ -100,6 +100,7 @@ QVariant MoodPlaylistsModel::data(const QModelIndex &index, int role) const { return QString(); case ItemCount: return QString::fromStdString(arg.item_count); case Author: return arg.author ? QString::fromStdString(*arg.author) : QString(); + case Artists: return QString(); } } return {}; @@ -113,7 +114,8 @@ QHash MoodPlaylistsModel::roleNames() const { {VideoId, "videoId"}, // mapped to browseId for playlists {ThumbnailUrl, "thumbnailUrl"}, {ItemCount, "itemCount"}, - {Author, "author"} + {Author, "author"}, + {Artists, "artists"}, }; }