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 }