File indexing completed on 2024-04-21 04:49:02

0001 /*
0002    SPDX-FileCopyrightText: 2018 (c) Matthieu Gallien <matthieu_gallien@yahoo.fr>
0003 
0004    SPDX-License-Identifier: LGPL-3.0-or-later
0005  */
0006 
0007 #ifndef VIEWMANAGER_H
0008 #define VIEWMANAGER_H
0009 
0010 #include "elisaLib_export.h"
0011 
0012 #include "config-upnp-qt.h"
0013 
0014 #include "elisautils.h"
0015 #include "datatypes.h"
0016 
0017 #include <QObject>
0018 #include <QUrl>
0019 #include <Qt>
0020 
0021 #include <memory>
0022 
0023 class ViewManagerPrivate;
0024 class ViewParameters;
0025 class ViewsListData;
0026 class ViewConfigurationData;
0027 
0028 class ELISALIB_EXPORT ViewManager : public QObject
0029 {
0030     Q_OBJECT
0031 
0032     Q_PROPERTY(int viewIndex
0033                READ viewIndex
0034                NOTIFY viewIndexChanged)
0035 
0036     Q_PROPERTY(int initialIndex
0037                READ initialIndex
0038                WRITE setInitialIndex
0039                NOTIFY initialIndexChanged)
0040 
0041     Q_PROPERTY(QString initialFilesViewPath
0042                READ initialFilesViewPath
0043                WRITE setInitialFilesViewPath
0044                NOTIFY initialFilesViewPathChanged)
0045 
0046     Q_PROPERTY(ViewsListData* viewsData READ viewsData WRITE setViewsData NOTIFY viewsDataChanged)
0047 
0048 public:
0049 
0050     enum AlbumCardinality {
0051         SingleAlbum = true,
0052         MultipleAlbum = false,
0053     };
0054 
0055     Q_ENUM(AlbumCardinality)
0056 
0057     enum AlbumViewStyle {
0058         NoDiscHeaders,
0059         DiscHeaders,
0060     };
0061 
0062     Q_ENUM(AlbumViewStyle)
0063 
0064     enum RadioSpecificStyle {
0065         IsTrack,
0066         IsRadio,
0067     };
0068 
0069     Q_ENUM(RadioSpecificStyle)
0070 
0071     enum DelegateUseSecondaryText {
0072         DelegateWithSecondaryText = true,
0073         DelegateWithoutSecondaryText = false,
0074     };
0075 
0076     Q_ENUM(DelegateUseSecondaryText)
0077 
0078     enum ViewCanBeRated {
0079         ViewShowRating = true,
0080         ViewHideRating = false,
0081     };
0082 
0083     Q_ENUM(ViewCanBeRated)
0084 
0085     enum ViewPresentationType {
0086         ContextView,
0087         GridView,
0088         ListView,
0089         UnknownViewPresentation,
0090     };
0091 
0092     Q_ENUM(ViewPresentationType)
0093 
0094     enum ModelType {
0095         GenericDataModel,
0096         FileBrowserModel,
0097         UnknownModelType,
0098     };
0099 
0100     Q_ENUM(ModelType)
0101 
0102     explicit ViewManager(QObject *parent = nullptr);
0103 
0104     ~ViewManager() override;
0105 
0106     [[nodiscard]] int viewIndex() const;
0107 
0108     [[nodiscard]] int initialIndex() const;
0109 
0110     [[nodiscard]] QString initialFilesViewPath() const;
0111 
0112     [[nodiscard]] ViewsListData* viewsData() const;
0113 
0114 Q_SIGNALS:
0115 
0116     void openGridView(ViewConfigurationData *configurationData);
0117 
0118     void openListView(ViewConfigurationData *configurationData);
0119 
0120     void switchContextView(int expectedDepth, const QString &mainTitle, const QUrl &imageUrl);
0121 
0122     void popOneView();
0123 
0124     void viewIndexChanged();
0125 
0126     void initialIndexChanged();
0127 
0128     void viewsDataChanged();
0129 
0130     void initialFilesViewPathChanged();
0131 
0132 public Q_SLOTS:
0133 
0134     void openView(int viewIndex);
0135 
0136     void openChildView(const DataTypes::MusicDataType &fullData);
0137 
0138     void openAlbumView(const QString &title, const QString &artist, qulonglong databaseId, const QUrl &albumCoverUrl);
0139 
0140     void openArtistView(const QString &artist);
0141 
0142     void openNowPlaying();
0143 
0144     void goBack();
0145 
0146     void setViewsData(ViewsListData* viewsData);
0147 
0148     void sortOrderChanged(Qt::SortOrder sortOrder);
0149 
0150     void sortRoleChanged(int sortRole);
0151 
0152     void setInitialIndex(int newIndex);
0153 
0154     void setInitialFilesViewPath(const QString &initialPath);
0155 
0156 private Q_SLOTS:
0157 
0158     void openInitialView();
0159 
0160 private:
0161 
0162     void openViewFromData(const ViewParameters &viewParamaters);
0163 
0164     void applyFilter(ViewParameters &nextViewParameters,
0165                      QString title, const ViewParameters &lastView) const;
0166 
0167     [[nodiscard]] QString buildViewId() const;
0168 
0169     QStringList::iterator findViewPreference(QStringList &list, const QString &viewId) const;
0170 
0171     bool viewHasDefaultSortRole(const ElisaUtils::FilterType filterType) const;
0172 
0173     [[nodiscard]] Qt::SortOrder computePreferredSortOrder(Qt::SortOrder initialValue, ElisaUtils::FilterType filterType) const;
0174 
0175     [[nodiscard]] int computePreferredSortRole(int initialValue, ElisaUtils::FilterType filterType) const;
0176 
0177 private:
0178 
0179     std::unique_ptr<ViewManagerPrivate> d;
0180 
0181     bool isSameView(const ViewParameters &currentView, const ViewParameters &otherView) const;
0182 };
0183 
0184 #endif // VIEWMANAGER_H