File indexing completed on 2024-03-24 04:51:47
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