File indexing completed on 2024-04-28 08:41:12

0001 /*
0002    SPDX-FileCopyrightText: 2020 (c) Matthieu Gallien <matthieu_gallien@yahoo.fr>
0003 
0004    SPDX-License-Identifier: LGPL-3.0-or-later
0005  */
0006 
0007 #ifndef VIEWSLISTDATA_H
0008 #define VIEWSLISTDATA_H
0009 
0010 #include "elisaLib_export.h"
0011 
0012 #include <QObject>
0013 
0014 #include "viewmanager.h"
0015 #include "datatypes.h"
0016 #include "elisautils.h"
0017 
0018 #include <memory>
0019 
0020 class QUrl;
0021 class QString;
0022 class MusicListenersManager;
0023 class DatabaseInterface;
0024 class ViewsListDataPrivate;
0025 
0026 class ViewParameters
0027 {
0028 public:
0029     ViewParameters() = default;
0030 
0031     ViewParameters(QString mainTitle,
0032                    QUrl mainImage,
0033                    ViewManager::ViewPresentationType viewPresentationType)
0034         : mMainTitle(std::move(mainTitle))
0035         , mMainImage(std::move(mainImage))
0036         , mViewPresentationType(viewPresentationType)
0037         , mIsValid(true)
0038     {
0039     }
0040 
0041     ViewParameters(QString mainTitle,
0042                    QUrl mainImage,
0043                    ViewManager::ViewPresentationType viewPresentationType,
0044                    ViewManager::ModelType modelType)
0045         : mMainTitle(std::move(mainTitle))
0046         , mMainImage(std::move(mainImage))
0047         , mViewPresentationType(viewPresentationType)
0048         , mModelType(modelType)
0049         , mIsValid(true)
0050     {
0051     }
0052 
0053     ViewParameters(QString mainTitle,
0054                    QUrl mainImage,
0055                    ViewManager::ViewPresentationType viewPresentationType,
0056                    ViewManager::ModelType modelType,
0057                    ElisaUtils::FilterType filterType,
0058                    ElisaUtils::PlayListEntryType dataType,
0059                    int sortRole, QVector<int> sortRoles, QVector<QString> sortRoleNames,
0060                    Qt::SortOrder sortOrder, QVector<QString> sortOrderNames,
0061                    QUrl fallbackItemIcon,
0062                    ViewManager::DelegateUseSecondaryText showSecondaryTextOnDelegates,
0063                    ViewManager::ViewCanBeRated viewCanBeRated)
0064         : mMainTitle(std::move(mainTitle))
0065         , mMainImage(std::move(mainImage))
0066         , mViewPresentationType(viewPresentationType)
0067         , mModelType(modelType)
0068         , mFilterType(filterType)
0069         , mDataType(dataType)
0070         , mFallbackItemIcon(std::move(fallbackItemIcon))
0071         , mShowSecondaryTextOnDelegates(showSecondaryTextOnDelegates)
0072         , mViewCanBeRated(viewCanBeRated)
0073         , mSortRole(sortRole)
0074         , mSortRoles(std::move(sortRoles))
0075         , mSortRoleNames(std::move(sortRoleNames))
0076         , mSortOrder(sortOrder)
0077         , mSortOrderNames(std::move(sortOrderNames))
0078         , mIsValid(true)
0079     {
0080     }
0081 
0082     ViewParameters(QString mainTitle,
0083                    QUrl mainImage,
0084                    ViewManager::ViewPresentationType viewPresentationType,
0085                    ViewManager::ModelType modelType,
0086                    ElisaUtils::FilterType filterType,
0087                    ElisaUtils::PlayListEntryType dataType,
0088                    QUrl fallbackItemIcon,
0089                    ViewManager::DelegateUseSecondaryText showSecondaryTextOnDelegates,
0090                    ViewManager::ViewCanBeRated viewCanBeRated,
0091                    QUrl pathFilter)
0092         : mMainTitle(std::move(mainTitle))
0093         , mMainImage(std::move(mainImage))
0094         , mViewPresentationType(viewPresentationType)
0095         , mModelType(modelType)
0096         , mFilterType(filterType)
0097         , mDataType(dataType)
0098         , mFallbackItemIcon(std::move(fallbackItemIcon))
0099         , mShowSecondaryTextOnDelegates(showSecondaryTextOnDelegates)
0100         , mViewCanBeRated(viewCanBeRated)
0101         , mDataFilter{{DataTypes::FilePathRole, std::move(pathFilter)}}
0102         , mIsValid(true)
0103     {
0104     }
0105 
0106     ViewParameters(QString mainTitle,
0107                    QUrl mainImage,
0108                    ViewManager::ViewPresentationType viewPresentationType,
0109                    ViewManager::ModelType modelType,
0110                    ElisaUtils::FilterType filterType,
0111                    ElisaUtils::PlayListEntryType dataType,
0112                    int sortRole, QVector<int> sortRoles, QVector<QString> sortRoleNames,
0113                    Qt::SortOrder sortOrder, QVector<QString> sortOrderNames,
0114                    ViewManager::AlbumCardinality albumCardinality,
0115                    ViewManager::AlbumViewStyle albumViewStyle,
0116                    ViewManager::RadioSpecificStyle radioSpecificStyle)
0117         : mMainTitle(std::move(mainTitle))
0118         , mMainImage(std::move(mainImage))
0119         , mViewPresentationType(viewPresentationType)
0120         , mModelType(modelType)
0121         , mFilterType(filterType)
0122         , mDataType(dataType)
0123         , mSortRole(sortRole)
0124         , mSortRoles(std::move(sortRoles))
0125         , mSortRoleNames(std::move(sortRoleNames))
0126         , mSortOrder(sortOrder)
0127         , mSortOrderNames(std::move(sortOrderNames))
0128         , mAlbumCardinality(albumCardinality)
0129         , mAlbumViewStyle(albumViewStyle)
0130         , mRadioSpecificStyle(radioSpecificStyle)
0131         , mIsValid(true)
0132     {
0133     }
0134 
0135     ViewParameters(QString mainTitle,
0136                    QUrl mainImage,
0137                    ViewManager::ViewPresentationType viewPresentationType,
0138                    ViewManager::ModelType modelType,
0139                    ElisaUtils::FilterType filterType,
0140                    qulonglong databaseId,
0141                    ElisaUtils::PlayListEntryType dataType,
0142                    ElisaUtils::PlayListEntryType entryType,
0143                    QUrl fallbackItemIcon,
0144                    ViewManager::DelegateUseSecondaryText showSecondaryTextOnDelegates,
0145                    ViewManager::ViewCanBeRated viewCanBeRated)
0146         : mMainTitle(std::move(mainTitle))
0147         , mMainImage(std::move(mainImage))
0148         , mViewPresentationType(viewPresentationType)
0149         , mModelType(modelType)
0150         , mFilterType(filterType)
0151         , mDataType(dataType)
0152         , mEntryType(entryType)
0153         , mFallbackItemIcon(std::move(fallbackItemIcon))
0154         , mShowSecondaryTextOnDelegates(showSecondaryTextOnDelegates)
0155         , mViewCanBeRated(viewCanBeRated)
0156         , mIsValid(true)
0157     {
0158         mDataFilter = {{DataTypes::DatabaseIdRole, databaseId}};
0159     }
0160 
0161     ViewParameters(QString mainTitle,
0162                    QUrl mainImage,
0163                    ViewManager::ViewPresentationType viewPresentationType,
0164                    ViewManager::ModelType modelType,
0165                    ElisaUtils::FilterType filterType,
0166                    qulonglong databaseId,
0167                    ElisaUtils::PlayListEntryType dataType,
0168                    ElisaUtils::PlayListEntryType entryType,
0169                    int sortRole, QVector<int> sortRoles, QVector<QString> sortRoleNames,
0170                    Qt::SortOrder sortOrder, QVector<QString> sortOrderNames,
0171                    ViewManager::AlbumCardinality albumCardinality,
0172                    ViewManager::AlbumViewStyle albumViewStyle,
0173                    ViewManager::RadioSpecificStyle radioSpecificStyle)
0174         : mMainTitle(std::move(mainTitle))
0175         , mMainImage(std::move(mainImage))
0176         , mViewPresentationType(viewPresentationType)
0177         , mModelType(modelType)
0178         , mFilterType(filterType)
0179         , mDataType(dataType)
0180         , mEntryType(entryType)
0181         , mSortRole(sortRole)
0182         , mSortRoles(std::move(sortRoles))
0183         , mSortRoleNames(std::move(sortRoleNames))
0184         , mSortOrder(sortOrder)
0185         , mSortOrderNames(std::move(sortOrderNames))
0186         , mAlbumCardinality(albumCardinality)
0187         , mAlbumViewStyle(albumViewStyle)
0188         , mRadioSpecificStyle(radioSpecificStyle)
0189         , mIsValid(true)
0190     {
0191         mDataFilter = {{DataTypes::DatabaseIdRole, databaseId}};
0192     }
0193 
0194     bool operator==(const ViewParameters &other) const {
0195         return mMainTitle == other.mMainTitle && mMainImage == other.mMainImage &&
0196                 mSecondaryTitle == other.mSecondaryTitle && mViewPresentationType == other.mViewPresentationType &&
0197                 mModelType == other.mModelType && mFilterType == other.mFilterType &&
0198                 mDataType == other.mDataType && mFallbackItemIcon == other.mFallbackItemIcon &&
0199                 mShowSecondaryTextOnDelegates == other.mShowSecondaryTextOnDelegates && mViewCanBeRated == other.mViewCanBeRated &&
0200                 mSortRole == other.mSortRole && mSortRoles == other.mSortRoles && mSortRoleNames == other.mSortRoleNames &&
0201                 mSortOrder == other.mSortOrder && mSortOrderNames == other.mSortOrderNames &&
0202                 mAlbumCardinality == other.mAlbumCardinality && mAlbumViewStyle == other.mAlbumViewStyle &&
0203                 mRadioSpecificStyle == other.mRadioSpecificStyle && mDepth == other.mDepth &&
0204                 mDataFilter == other.mDataFilter;
0205     }
0206 
0207     bool operator!=(const ViewParameters &other) const {
0208         return mMainTitle != other.mMainTitle || mMainImage != other.mMainImage ||
0209                 mSecondaryTitle != other.mSecondaryTitle || mViewPresentationType != other.mViewPresentationType ||
0210                 mModelType != other.mModelType || mFilterType != other.mFilterType ||
0211                 mDataType != other.mDataType || mFallbackItemIcon != other.mFallbackItemIcon ||
0212                 mShowSecondaryTextOnDelegates != other.mShowSecondaryTextOnDelegates || mViewCanBeRated != other.mViewCanBeRated ||
0213                 mSortRole != other.mSortRole || mSortRoles != other.mSortRoles || mSortRoleNames != other.mSortRoleNames ||
0214                 mSortOrder != other.mSortOrder || mSortOrderNames != other.mSortOrderNames ||
0215                 mAlbumCardinality != other.mAlbumCardinality || mAlbumViewStyle != other.mAlbumViewStyle ||
0216                 mRadioSpecificStyle != other.mRadioSpecificStyle || mDepth != other.mDepth ||
0217                 mDataFilter != other.mDataFilter;
0218     }
0219 
0220     QString mMainTitle;
0221 
0222     QString mSecondaryTitle;
0223 
0224     QUrl mMainImage;
0225 
0226     ViewManager::ViewPresentationType mViewPresentationType = ViewManager::UnknownViewPresentation;
0227 
0228     ViewManager::ModelType mModelType = ViewManager::UnknownModelType;
0229 
0230     ElisaUtils::FilterType mFilterType = ElisaUtils::UnknownFilter;
0231 
0232     ElisaUtils::PlayListEntryType mDataType = ElisaUtils::Unknown;
0233 
0234     ElisaUtils::PlayListEntryType mEntryType = ElisaUtils::Unknown;
0235 
0236     QUrl mFallbackItemIcon;
0237 
0238     ViewManager::DelegateUseSecondaryText mShowSecondaryTextOnDelegates = ViewManager::DelegateWithSecondaryText;
0239 
0240     ViewManager::ViewCanBeRated mViewCanBeRated = ViewManager::ViewHideRating;
0241 
0242     int mSortRole = Qt::DisplayRole;
0243 
0244     QVector<int> mSortRoles = {Qt::DisplayRole};
0245 
0246     QVector<QString> mSortRoleNames = {QString{}};
0247 
0248     Qt::SortOrder mSortOrder = Qt::AscendingOrder;
0249 
0250     QVector<QString> mSortOrderNames = {QStringLiteral("A-Z"), QStringLiteral("Z-A")};
0251 
0252     ViewManager::AlbumCardinality mAlbumCardinality = ViewManager::MultipleAlbum;
0253 
0254     ViewManager::AlbumViewStyle mAlbumViewStyle = ViewManager::NoDiscHeaders;
0255 
0256     ViewManager::RadioSpecificStyle mRadioSpecificStyle = ViewManager::IsTrack;
0257 
0258     int mDepth = 1;
0259 
0260     DataTypes::MusicDataType mDataFilter;
0261 
0262     bool mUseSecondTitle = false;
0263 
0264     bool mIsValid = false;
0265 };
0266 
0267 class ELISALIB_EXPORT ViewsListData : public QObject
0268 {
0269     Q_OBJECT
0270 
0271     Q_PROPERTY(ElisaUtils::PlayListEntryType embeddedCategory
0272                READ embeddedCategory
0273                WRITE setEmbeddedCategory
0274                NOTIFY embeddedCategoryChanged)
0275 
0276     Q_PROPERTY(MusicListenersManager* manager
0277                READ manager
0278                WRITE setManager
0279                NOTIFY managerChanged)
0280 
0281     Q_PROPERTY(DatabaseInterface* database
0282                READ database
0283                WRITE setDatabase
0284                NOTIFY databaseChanged)
0285 
0286 public:
0287     explicit ViewsListData(QObject *parent = nullptr);
0288 
0289     ~ViewsListData() override;
0290 
0291     [[nodiscard]] int count() const;
0292 
0293     [[nodiscard]] bool isEmpty() const;
0294 
0295     [[nodiscard]] const ViewParameters& viewParameters(int index) const;
0296 
0297     [[nodiscard]] const QString& title(int index) const;
0298 
0299     [[nodiscard]] const QUrl& iconUrl(int index) const;
0300 
0301     [[nodiscard]] const QString& secondTitle(int index) const;
0302 
0303     [[nodiscard]] bool useSecondTitle(int index) const;
0304 
0305     [[nodiscard]] qulonglong databaseId(int index) const;
0306 
0307     [[nodiscard]] bool defaultEntry(int index) const;
0308 
0309     [[nodiscard]] ElisaUtils::PlayListEntryType dataType(int index) const;
0310 
0311     [[nodiscard]] ElisaUtils::PlayListEntryType embeddedCategory() const;
0312 
0313     [[nodiscard]] MusicListenersManager* manager() const;
0314 
0315     [[nodiscard]] DatabaseInterface* database() const;
0316 
0317 Q_SIGNALS:
0318 
0319     void embeddedCategoryChanged();
0320 
0321     void managerChanged();
0322 
0323     void databaseChanged();
0324 
0325     void needData(ElisaUtils::PlayListEntryType dataType);
0326 
0327     void dataAboutToBeAdded(int startIndex, int endIndex);
0328 
0329     void dataAdded();
0330 
0331     void dataAboutToBeRemoved(int startIndex, int endIndex);
0332 
0333     void dataRemoved();
0334 
0335     void dataModified(int index);
0336 
0337     void dataAboutToBeReset();
0338 
0339     void dataReset();
0340 
0341 public Q_SLOTS:
0342 
0343     void setEmbeddedCategory(ElisaUtils::PlayListEntryType aEmbeddedView);
0344 
0345     void setManager(MusicListenersManager *aManager);
0346 
0347     void setDatabase(DatabaseInterface *aDatabase);
0348 
0349     void genresAdded(const DataTypes::ListGenreDataType &newData);
0350 
0351     void artistsAdded(const DataTypes::ListArtistDataType &newData);
0352 
0353     void artistRemoved(qulonglong removedDatabaseId);
0354 
0355     void albumsAdded(const DataTypes::ListAlbumDataType &newData);
0356 
0357     void albumRemoved(qulonglong removedDatabaseId);
0358 
0359     void albumModified(const DataTypes::AlbumDataType &modifiedAlbum);
0360 
0361     void cleanedDatabase();
0362 
0363 private:
0364 
0365     void clearEmbeddedItems();
0366 
0367     void refreshEmbeddedCategory();
0368 
0369     std::unique_ptr<ViewsListDataPrivate> d;
0370 };
0371 
0372 #endif // VIEWSLISTDATA_H