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 }