Warning, /multimedia/elisa/src/qml/ContentView.qml is written in an unsupported language. File is not indexed.

0001 /*
0002    SPDX-FileCopyrightText: 2016 (c) Matthieu Gallien <matthieu_gallien@yahoo.fr>
0003 
0004    SPDX-License-Identifier: LGPL-3.0-or-later
0005  */
0006 
0007 import QtQuick 2.7
0008 import QtQuick.Controls 2.2
0009 import QtQuick.Layouts 1.2
0010 import QtQuick.Window 2.2
0011 import org.kde.elisa 1.0
0012 import org.kde.kirigami 2.8 as Kirigami
0013 
0014 import "mobile"
0015 
0016 RowLayout {
0017     id: contentViewContainer
0018     spacing: 0
0019 
0020     property bool showPlaylist
0021     property bool showExpandedFilterView
0022     property Kirigami.ContextDrawer playlistDrawer
0023     property alias initialIndex: viewManager.initialIndex
0024 
0025     property alias sidebar: mobileSidebar.item
0026     property Loader activeSidebarLoader: Kirigami.Settings.isMobile ? mobileSidebar : desktopSidebar
0027 
0028     function goBack() {
0029         viewManager.goBack()
0030     }
0031 
0032     function openArtist(name) {
0033         viewManager.openArtistView(name)
0034     }
0035 
0036     function openAlbum(album, artist, image, albumID) {
0037         image = !image ? elisaTheme.defaultAlbumImage : image;
0038         viewManager.openAlbumView(album, artist, albumID, image);
0039     }
0040 
0041     function openNowPlaying() {
0042         viewManager.openNowPlaying();
0043     }
0044 
0045     function openViewCommon(viewDelegate, viewProperties, expectedDepth) {
0046         if (expectedDepth === 1) {
0047             // HACK: workaround for https://bugreports.qt.io/browse/QTBUG-117720
0048             const operation = StackView.ReplaceTransition
0049             browseStackView.replace(null, viewDelegate, viewProperties, operation)
0050             updateSidebarIndex()
0051         } else {
0052             browseStackView.push(viewDelegate, viewProperties)
0053         }
0054     }
0055 
0056     function updateSidebarIndex() {
0057         // Sometimes the sidebar loads after the page is pushed
0058         if (activeSidebarLoader.status === Loader.Ready) {
0059             activeSidebarLoader.item.viewIndex = pageProxyModel.mapRowFromSource(viewManager.viewIndex)
0060         }
0061     }
0062 
0063     ViewManager {
0064         id: viewManager
0065 
0066         viewsData: viewsData
0067         initialFilesViewPath: ElisaApplication.initialFilesViewPath
0068 
0069         onOpenGridView: configurationData => {
0070             openViewCommon(dataGridView, {
0071                 filterType: configurationData.filterType,
0072                 mainTitle: configurationData.mainTitle,
0073                 secondaryTitle: configurationData.secondaryTitle,
0074                 image: configurationData.imageUrl,
0075                 modelType: configurationData.dataType,
0076                 realModel: configurationData.model,
0077                 proxyModel: configurationData.associatedProxyModel,
0078                 defaultIcon: configurationData.viewDefaultIcon,
0079                 showRating: configurationData.viewShowRating,
0080                 delegateDisplaySecondaryText: configurationData.viewDelegateDisplaySecondaryText,
0081                 filter: configurationData.dataFilter,
0082                 isSubPage: configurationData.expectedDepth > 1,
0083                 sortRole: configurationData.sortRole,
0084                 sortRoles: configurationData.sortRoles,
0085                 sortRoleNames: configurationData.sortRoleNames,
0086                 sortOrder: configurationData.sortOrder,
0087                 sortOrderNames: configurationData.sortOrderNames,
0088                 viewManager: viewManager,
0089                 opacity: 1,
0090             }, configurationData.expectedDepth)
0091         }
0092 
0093         onOpenListView: configurationData => {
0094             openViewCommon(dataListView, {
0095                 filterType: configurationData.filterType,
0096                 isSubPage: configurationData.expectedDepth > 1,
0097                 mainTitle: configurationData.mainTitle,
0098                 secondaryTitle: configurationData.secondaryTitle,
0099                 filter: configurationData.dataFilter,
0100                 image: configurationData.imageUrl,
0101                 modelType: configurationData.dataType,
0102                 realModel: configurationData.model,
0103                 proxyModel: configurationData.associatedProxyModel,
0104                 sortRole: configurationData.sortRole,
0105                 sortOrder: configurationData.sortOrder,
0106                 displaySingleAlbum: configurationData.displaySingleAlbum,
0107                 showSection: configurationData.showDiscHeaders,
0108                 radioCase: configurationData.radioCase,
0109                 sortRole: configurationData.sortRole,
0110                 sortRoles: configurationData.sortRoles,
0111                 sortRoleNames: configurationData.sortRoleNames,
0112                 sortOrder: configurationData.sortOrder,
0113                 sortOrderNames: configurationData.sortOrderNames,
0114                 viewManager: viewManager,
0115                 opacity: 1,
0116             }, configurationData.expectedDepth)
0117         }
0118 
0119         onSwitchContextView: (expectedDepth, mainTitle, imageUrl) => {
0120             openViewCommon(albumContext, {opacity: 1}, expectedDepth)
0121         }
0122 
0123         onPopOneView: {
0124             if (browseStackView.depth > 1) {
0125                 browseStackView.pop()
0126             }
0127         }
0128     }
0129 
0130     ViewsModel {
0131         id: pageModel
0132 
0133         viewsData: viewsData
0134     }
0135 
0136     ViewsProxyModel {
0137         id: pageProxyModel
0138 
0139         sourceModel: pageModel
0140         embeddedCategory: Kirigami.Settings.isMobile ? ElisaUtils.Unknown : ElisaApplication.embeddedView
0141 
0142         onEmbeddedCategoryChanged: updateSidebarIndex()
0143     }
0144 
0145     ViewsListData {
0146         id: viewsData
0147 
0148         manager: ElisaApplication.musicManager
0149         database: ElisaApplication.musicManager.viewDatabase
0150         embeddedCategory: Kirigami.Settings.isMobile ? ElisaUtils.Unknown : ElisaApplication.embeddedView
0151     }
0152 
0153     // sidebar used on desktop
0154     Loader {
0155         id: desktopSidebar
0156         active: !Kirigami.Settings.isMobile
0157         Layout.fillHeight: true
0158 
0159         sourceComponent: ViewSelector {
0160             model: pageProxyModel
0161             viewIndex: model.mapRowFromSource(viewManager.viewIndex)
0162             onSwitchView: viewIndex => viewManager.openView(model.mapRowToSource(viewIndex))
0163         }
0164     }
0165 
0166     // sidebar used on mobile
0167     Loader {
0168         id: mobileSidebar
0169         active: Kirigami.Settings.isMobile
0170 
0171         sourceComponent: MobileSidebar {
0172             model: pageProxyModel
0173             viewIndex: model.mapRowFromSource(viewManager.viewIndex)
0174             onSwitchView: viewIndex => viewManager.openView(model.mapRowToSource(viewIndex))
0175         }
0176     }
0177 
0178     Kirigami.Separator {
0179         id: viewSelectorSeparatorItem
0180         visible: !Kirigami.Settings.isMobile
0181         Layout.fillHeight: true
0182     }
0183 
0184     FocusScope {
0185         id: mainContentView
0186 
0187         focus: true
0188 
0189         Layout.fillHeight: true
0190         Layout.fillWidth: true
0191 
0192         MouseArea {
0193             anchors.fill: parent
0194             acceptedButtons: Qt.BackButton
0195             onClicked: goBack()
0196         }
0197 
0198         StackView {
0199             id: browseStackView
0200 
0201             anchors.fill: parent
0202 
0203             clip: true
0204 
0205             popEnter: Transition {
0206                 OpacityAnimator {
0207                     from: 0.0
0208                     to: 1.0
0209                     duration: Kirigami.Units.longDuration
0210                 }
0211             }
0212 
0213             popExit: Transition {
0214                 OpacityAnimator {
0215                     from: 1.0
0216                     to: 0.0
0217                     duration: Kirigami.Units.longDuration
0218                 }
0219             }
0220 
0221             pushEnter: Transition {
0222                 OpacityAnimator {
0223                     from: 0.0
0224                     to: 1.0
0225                     duration: Kirigami.Units.longDuration
0226                 }
0227             }
0228 
0229             pushExit: Transition {
0230                 OpacityAnimator {
0231                     from: 1.0
0232                     to: 0.0
0233                     duration: Kirigami.Units.longDuration
0234                 }
0235             }
0236 
0237             replaceEnter: Transition {
0238                 OpacityAnimator {
0239                     from: 0.0
0240                     to: 1.0
0241                     duration: Kirigami.Units.longDuration
0242                 }
0243             }
0244 
0245             replaceExit: Transition {
0246                 OpacityAnimator {
0247                     from: 1.0
0248                     to: 0.0
0249                     duration: Kirigami.Units.longDuration
0250                 }
0251             }
0252         }
0253     }
0254 
0255     Kirigami.Separator {
0256         id: playListSeparatorItem
0257         visible: playList.width > 0
0258         Layout.fillHeight: true
0259     }
0260 
0261     // playlist right sidebar
0262     MediaPlayListView {
0263         id: playList
0264         Layout.preferredWidth: 0
0265         Layout.fillWidth: false
0266         Layout.fillHeight: true
0267         enabled: Layout.preferredWidth !== 0 // Avoid taking keyboard focus when not visible
0268 
0269         states: [
0270             State {
0271                 name: "playlistVisible"
0272                 when: mainWindow.isWideScreen && contentViewContainer.showPlaylist
0273                 PropertyChanges {
0274                     target: playList
0275                     Layout.preferredWidth: contentViewContainer.width * 0.28
0276                 }
0277             }
0278         ]
0279 
0280         transitions: Transition {
0281             NumberAnimation {
0282                 property: "Layout.preferredWidth"
0283                 easing.type: Easing.InOutQuad
0284                 duration: Kirigami.Units.longDuration
0285             }
0286         }
0287     }
0288 
0289     Component {
0290         id: dataGridView
0291 
0292         DataGridView {
0293             expandedFilterView: showExpandedFilterView
0294         }
0295     }
0296 
0297     Component {
0298         id: dataListView
0299 
0300         DataListView {
0301             expandedFilterView: showExpandedFilterView
0302         }
0303     }
0304 
0305     Component {
0306         id: albumContext
0307 
0308         ContextView {
0309             databaseId: ElisaApplication.manageHeaderBar.databaseId
0310             trackType: ElisaApplication.manageHeaderBar.trackType
0311             songTitle: ElisaApplication.manageHeaderBar.title
0312             artistName: ElisaApplication.manageHeaderBar.artist !== undefined ? ElisaApplication.manageHeaderBar.artist : ''
0313             albumName: ElisaApplication.manageHeaderBar.album
0314             albumArtUrl: ElisaApplication.manageHeaderBar.image
0315             fileUrl: ElisaApplication.manageHeaderBar.fileUrl
0316             albumId: ElisaApplication.manageHeaderBar.albumId
0317             albumArtist: ElisaApplication.manageHeaderBar.albumArtist !== undefined ? ElisaApplication.manageHeaderBar.albumArtist : ''
0318             onOpenArtist: contentViewContainer.openArtist(artistName)
0319             onOpenAlbum: contentViewContainer.openAlbum(albumName, albumArtist, albumArtUrl, albumId)
0320         }
0321     }
0322 }