diff --git a/autotests/viewmanagertest.cpp b/autotests/viewmanagertest.cpp --- a/autotests/viewmanagertest.cpp +++ b/autotests/viewmanagertest.cpp @@ -38,25 +38,6 @@ qRegisterMetaType("ElisaUtils::FilterType"); } - void closeAllViewsTest() - { - ViewManager viewManager; - - QSignalSpy openGridViewSpy(&viewManager, &ViewManager::openGridView); - QSignalSpy openListViewSpy(&viewManager, &ViewManager::openListView); - QSignalSpy switchFilesBrowserViewSpy(&viewManager, &ViewManager::switchFilesBrowserView); - QSignalSpy switchOffAllViewsSpy(&viewManager, &ViewManager::switchOffAllViews); - QSignalSpy popOneViewSpy(&viewManager, &ViewManager::popOneView); - - viewManager.closeAllViews(); - - QCOMPARE(openGridViewSpy.count(), 0); - QCOMPARE(openListViewSpy.count(), 0); - QCOMPARE(switchFilesBrowserViewSpy.count(), 0); - QCOMPARE(switchOffAllViewsSpy.count(), 1); - QCOMPARE(popOneViewSpy.count(), 0); - } - void openAlbumViewTest() { ViewManager viewManager; diff --git a/src/models/viewsmodel.cpp b/src/models/viewsmodel.cpp --- a/src/models/viewsmodel.cpp +++ b/src/models/viewsmodel.cpp @@ -36,21 +36,21 @@ ViewsModelPrivate() { - mTypes = {ViewManager::NoViews, ViewManager::RecentlyPlayedTracks, + mTypes = {ViewManager::Context, ViewManager::RecentlyPlayedTracks, ViewManager::FrequentlyPlayedTracks, ViewManager::AllAlbums, ViewManager::AllArtists, ViewManager::AllTracks, ViewManager::AllGenres, ViewManager::FilesBrowser}; - mNames = {{ViewManager::NoViews, {i18nc("Title of the view of the playlist", "Now Playing")}}, + mNames = {{ViewManager::Context, {i18nc("Title of the view of the playlist", "Now Playing")}}, {ViewManager::RecentlyPlayedTracks, {i18nc("Title of the view of recently played tracks", "Recently Played")}}, {ViewManager::FrequentlyPlayedTracks, {i18nc("Title of the view of frequently played tracks", "Frequently Played")}}, {ViewManager::AllAlbums, {i18nc("Title of the view of all albums", "Albums")}}, {ViewManager::AllArtists, {i18nc("Title of the view of all artists", "Artists")}}, {ViewManager::AllTracks, {i18nc("Title of the view of all tracks", "Tracks")}}, {ViewManager::AllGenres, {i18nc("Title of the view of all genres", "Genres")}}, {ViewManager::FilesBrowser, {i18nc("Title of the file browser view", "Files")}}}; - mIcons = {{ViewManager::NoViews, QUrl{QStringLiteral("image://icon/view-media-lyrics")}}, + mIcons = {{ViewManager::Context, QUrl{QStringLiteral("image://icon/view-media-lyrics")}}, {ViewManager::RecentlyPlayedTracks, QUrl{QStringLiteral("image://icon/media-playlist-play")}}, {ViewManager::FrequentlyPlayedTracks, QUrl{QStringLiteral("image://icon/amarok_playcount")}}, {ViewManager::AllAlbums, QUrl{QStringLiteral("image://icon/view-media-album-cover")}}, @@ -151,7 +151,7 @@ { switch(type) { - case ViewManager::NoViews: + case ViewManager::Context: return 0; case ViewManager::RecentlyPlayedTracks: return 1; diff --git a/src/qml/ApplicationMenu.qml b/src/qml/ApplicationMenu.qml --- a/src/qml/ApplicationMenu.qml +++ b/src/qml/ApplicationMenu.qml @@ -63,7 +63,7 @@ text: contentView.showPlaylist ? i18nc("Hide playlist", "Hide Playlist") : i18nc("Show playlist", "Show Playlist") iconName: "view-media-playlist" onTriggered: contentView.showPlaylist = !contentView.showPlaylist - enabled: contentView.currentViewIndex != 0 + visible: togglePlaylistAction.text !== "" } MenuSeparator { diff --git a/src/qml/BaseTheme.qml b/src/qml/BaseTheme.qml --- a/src/qml/BaseTheme.qml +++ b/src/qml/BaseTheme.qml @@ -27,6 +27,7 @@ property string defaultAlbumImage: 'image://icon/media-optical-audio' property string defaultArtistImage: 'image://icon/view-media-artist' property string defaultBackgroundImage: 'qrc:///background.png' + property string nowPlayingIcon: 'image://icon/view-media-lyrics' property string artistIcon: 'image://icon/view-media-artist' property string albumIcon: 'image://icon/view-media-album-cover' property string albumCoverIcon: 'image://icon/media-optical-audio' diff --git a/src/qml/ContentView.qml b/src/qml/ContentView.qml --- a/src/qml/ContentView.qml +++ b/src/qml/ContentView.qml @@ -125,6 +125,22 @@ }) } + onSwitchContextView: { + listViews.setCurrentIndex(pageModel.indexFromViewType(viewType)) + + while(browseStackView.depth > expectedDepth) { + browseStackView.pop() + } + + browseStackView.push(albumContext, { + viewType: viewType, + mainTitle: mainTitle, + image: imageUrl, + opacity: 0, + }) + } + + onPopOneView: { if (browseStackView.depth > 2) { browseStackView.pop() } @@ -194,11 +210,6 @@ Layout.fillHeight: true - Layout.minimumWidth: 0 - Layout.maximumWidth: 0 - Layout.preferredWidth: 0 - - visible: Layout.minimumWidth != 0 MouseArea { @@ -302,75 +313,13 @@ onDisplayError: messageNotification.showNotification(errorText) } - - Rectangle { - id: viewSeparatorItem - - Layout.fillHeight: true - - width: 1 - - color: myPalette.mid - } - - Loader { - id: albumContext - - active: Layout.minimumWidth != 0 - - sourceComponent: ContextView { - - anchors.fill: parent - - databaseId: elisa.manageHeaderBar.databaseId - title: elisa.manageHeaderBar.title - artistName: elisa.manageHeaderBar.artist - albumName: elisa.manageHeaderBar.album - albumArtUrl: elisa.manageHeaderBar.image - fileUrl: elisa.manageHeaderBar.fileName - } - - Layout.fillHeight: true - - Layout.minimumWidth: 0 - Layout.maximumWidth: 0 - Layout.preferredWidth: 0 - - visible: Layout.minimumWidth != 0 - } } } states: [ - State { - name: 'playList' - when: listViews.currentIndex === 0 - PropertyChanges { - target: mainContentView - Layout.minimumWidth: 0 - Layout.maximumWidth: 0 - Layout.preferredWidth: 0 - } - PropertyChanges { - target: firstViewSeparatorItem - Layout.minimumWidth: 0 - Layout.maximumWidth: 0 - Layout.preferredWidth: 0 - } - PropertyChanges { - target: viewSeparatorItem - visible: true - } - PropertyChanges { - target: albumContext - Layout.minimumWidth: contentZone.width * 3 / 5 - 2 - 3.5 * elisaTheme.layoutHorizontalMargin - Layout.maximumWidth: contentZone.width * 3 / 5 - 2 - 3.5 * elisaTheme.layoutHorizontalMargin - Layout.preferredWidth: contentZone.width * 3 / 5 - 2 - 3.5 * elisaTheme.layoutHorizontalMargin - } - }, State { name: "browsingViewsNoPlaylist" - when: listViews.currentIndex !== 0 && contentViewContainer.showPlaylist !== true + when: contentViewContainer.showPlaylist === false extend: "browsingViews" PropertyChanges { target: mainContentView @@ -387,7 +336,7 @@ }, State { name: 'browsingViews' - when: listViews.currentIndex !== 0 + when: contentViewContainer.showPlaylist === true PropertyChanges { target: mainContentView Layout.minimumWidth: contentZone.width * 0.66 @@ -400,16 +349,6 @@ Layout.maximumWidth: 1 Layout.preferredWidth: 1 } - PropertyChanges { - target: viewSeparatorItem - visible: false - } - PropertyChanges { - target: albumContext - Layout.minimumWidth: 0 - Layout.maximumWidth: 0 - Layout.preferredWidth: 0 - } } ] transitions: Transition { @@ -444,4 +383,19 @@ StackView.onActivated: viewManager.viewIsLoaded(viewType) } } + + Component { + id: albumContext + + ContextView { + StackView.onActivated: viewManager.viewIsLoaded(viewType) + + databaseId: elisa.manageHeaderBar.databaseId + title: elisa.manageHeaderBar.title + artistName: elisa.manageHeaderBar.artist + albumName: elisa.manageHeaderBar.album + albumArtUrl: elisa.manageHeaderBar.image + fileUrl: elisa.manageHeaderBar.fileName + } + } } diff --git a/src/qml/ContextView.qml b/src/qml/ContextView.qml --- a/src/qml/ContextView.qml +++ b/src/qml/ContextView.qml @@ -27,6 +27,7 @@ FocusScope { id: topItem + property var viewType property int databaseId: 0 property alias title: titleLabel.text property string albumName: '' @@ -55,6 +56,24 @@ HeaderFooterToolbar { type: "header" contentItems: [ + Image { + id: mainIcon + source: elisaTheme.nowPlayingIcon + + height: viewTitle.height + width: height + sourceSize.height: height + sourceSize.width: width + + fillMode: Image.PreserveAspectFit + asynchronous: true + + Layout.alignment: Qt.AlignVCenter | Qt.AlignLeft + }, + Item { + id: spacer + width: elisaTheme.layoutHorizontalMargin + }, LabelWithToolTip { id: viewTitle Layout.fillWidth: true diff --git a/src/viewmanager.h b/src/viewmanager.h --- a/src/viewmanager.h +++ b/src/viewmanager.h @@ -31,7 +31,6 @@ public: enum ViewsType { - NoViews, AllAlbums, OneAlbum, AllArtists, @@ -44,7 +43,8 @@ OneAlbumFromArtistAndGenre, FrequentlyPlayedTracks, RecentlyPlayedTracks, - FilesBrowser + FilesBrowser, + Context }; Q_ENUM(ViewsType) @@ -85,14 +85,15 @@ void switchFilesBrowserView(ViewManager::ViewsType viewType, int expectedDepth, const QString &mainTitle, const QUrl &imageUrl); + void switchContextView(ViewManager::ViewsType viewType, int expectedDepth, + const QString &mainTitle, const QUrl &imageUrl); + void switchOffAllViews(ViewManager::ViewsType viewType); void popOneView(); public Q_SLOTS: - void closeAllViews(); - void openParentView(ViewManager::ViewsType viewType, const QString &mainTitle, const QUrl &mainImage); void openChildView(const QString &innerMainTitle, const QString & innerSecondaryTitle, @@ -119,6 +120,8 @@ void openFilesBrowser(const QString &mainTitle, const QUrl &imageUrl); + void openContextView(const QString &mainTitle, const QUrl &imageUrl); + void openOneAlbum(const QString &albumTitle, const QString &albumAuthor, const QUrl &albumCover, qulonglong albumDatabaseId, ViewManager::AlbumViewStyle albumDiscHeader); @@ -146,6 +149,8 @@ void filesBrowserViewIsLoaded(); + void contextViewIsLoaded(); + QString mCurrentAlbumTitle; QString mCurrentAlbumAuthor; QString mCurrentArtistName; @@ -157,8 +162,8 @@ QString mTargetGenreName; QUrl mTargetImageUrl; qulonglong mTargetDatabaseId = 0; - ViewsType mTargetView = ViewsType::NoViews; - ViewsType mCurrentView = ViewsType::NoViews; + ViewsType mTargetView = ViewsType::Context; + ViewsType mCurrentView = ViewsType::Context; ViewManager::AlbumViewStyle mAlbumDiscHeader = ViewManager::NoDiscHeaders; }; diff --git a/src/viewmanager.cpp b/src/viewmanager.cpp --- a/src/viewmanager.cpp +++ b/src/viewmanager.cpp @@ -23,20 +23,10 @@ { } -void ViewManager::closeAllViews() -{ - mCurrentView = ViewsType::NoViews; - mTargetView = ViewsType::NoViews; - Q_EMIT switchOffAllViews(mTargetView); -} - void ViewManager::openParentView(ViewManager::ViewsType viewType, const QString &mainTitle, const QUrl &mainImage) { switch(viewType) { - case NoViews: - closeAllViews(); - break; case RecentlyPlayedTracks: openRecentlyPlayedTracks(mainTitle, mainImage); break; @@ -58,6 +48,9 @@ case FilesBrowser: openFilesBrowser(mainTitle, mainImage); break; + case Context: + openContextView(mainTitle, mainImage); + break; case OneAlbum: case OneArtist: case OneAlbumFromArtist: @@ -135,7 +128,8 @@ case ViewsType::FilesBrowser: filesBrowserViewIsLoaded(); break; - case ViewsType::NoViews: + case ViewsType::Context: + contextViewIsLoaded(); break; } } @@ -291,6 +285,15 @@ } } +void ViewManager::openContextView(const QString &mainTitle, const QUrl &imageUrl) +{ + mTargetView = ViewsType::Context; + if (mCurrentView != mTargetView) { + Q_EMIT switchContextView(mTargetView, 1, mainTitle, imageUrl); + } + +} + void ViewManager::recentlyPlayedTracksIsLoaded() { mCurrentView = ViewsType::RecentlyPlayedTracks; @@ -375,6 +378,11 @@ mCurrentView = ViewsType::FilesBrowser; } +void ViewManager::contextViewIsLoaded() +{ + mCurrentView = ViewsType::Context; +} + void ViewManager::goBack() { Q_EMIT popOneView();