File indexing completed on 2024-05-05 04:50:33

0001 /*
0002    SPDX-FileCopyrightText: 2016 (c) Matthieu Gallien <matthieu_gallien@yahoo.fr>
0003    SPDX-FileCopyrightText: 2017 (c) Alexander Stippich <a.stippich@gmx.net>
0004 
0005    SPDX-License-Identifier: LGPL-3.0-or-later
0006  */
0007 
0008 #ifndef ABSTRACTMEDIAPROXYMODEL_H
0009 #define ABSTRACTMEDIAPROXYMODEL_H
0010 
0011 #include "elisaLib_export.h"
0012 
0013 #include "elisautils.h"
0014 #include "datatypes.h"
0015 
0016 #include <QSortFilterProxyModel>
0017 #include <QRegularExpression>
0018 #include <QReadWriteLock>
0019 #include <QThreadPool>
0020 #include <QFuture>
0021 #include <QFutureWatcher>
0022 
0023 class MediaPlayListProxyModel;
0024 
0025 class ELISALIB_EXPORT AbstractMediaProxyModel : public QSortFilterProxyModel
0026 {
0027 
0028     Q_OBJECT
0029 
0030     Q_PROPERTY(QString filterText
0031                READ filterText
0032                WRITE setFilterText
0033                NOTIFY filterTextChanged)
0034 
0035     Q_PROPERTY(int filterRating
0036                READ filterRating
0037                WRITE setFilterRating
0038                NOTIFY filterRatingChanged)
0039 
0040     Q_PROPERTY(bool sortedAscending
0041                READ sortedAscending
0042                NOTIFY sortedAscendingChanged)
0043 
0044     Q_PROPERTY(MediaPlayListProxyModel* playList READ playList WRITE setPlayList NOTIFY playListChanged)
0045 
0046 public:
0047 
0048     explicit AbstractMediaProxyModel(QObject *parent = nullptr);
0049 
0050     ~AbstractMediaProxyModel() override;
0051 
0052     [[nodiscard]] QString filterText() const;
0053 
0054     [[nodiscard]] int filterRating() const;
0055 
0056     [[nodiscard]] bool sortedAscending() const;
0057 
0058     [[nodiscard]] MediaPlayListProxyModel* playList() const;
0059 
0060 public Q_SLOTS:
0061 
0062     void setFilterText(const QString &filterText);
0063 
0064     void setFilterRating(int filterRating);
0065 
0066     void sortModel(Qt::SortOrder order);
0067 
0068     void setPlayList(MediaPlayListProxyModel* playList);
0069 
0070     void enqueueToPlayList(const QModelIndex &rootIndex);
0071 
0072     void replaceAndPlayOfPlayList(const QModelIndex &rootIndex);
0073 
0074     void replaceAndPlayOfPlayListFromTrackUrl(const QModelIndex &rootIndex, const QUrl &switchTrackUrl);
0075 
0076     void enqueue(const DataTypes::MusicDataType &newEntry,
0077                  const QString &newEntryTitle,
0078                  ElisaUtils::PlayListEnqueueMode enqueueMode,
0079                  ElisaUtils::PlayListEnqueueTriggerPlay triggerPlay);
0080 
0081     void afterPlaylistEnqueue();
0082 
0083 Q_SIGNALS:
0084 
0085     void filterTextChanged(const QString &filterText);
0086 
0087     void filterRatingChanged(int filterRating);
0088 
0089     void sortedAscendingChanged();
0090 
0091     void playListChanged();
0092 
0093     void entriesToEnqueue(const DataTypes::EntryDataList &newEntries,
0094                           ElisaUtils::PlayListEnqueueMode enqueueMode,
0095                           ElisaUtils::PlayListEnqueueTriggerPlay triggerPlay);
0096 
0097     void switchToTrackUrl(const QUrl &url, ElisaUtils::PlayListEnqueueTriggerPlay triggerPlay);
0098 
0099 protected:
0100 
0101     [[nodiscard]] bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override = 0;
0102 
0103     void disconnectPlayList();
0104 
0105     void connectPlayList();
0106 
0107     QString mFilterText;
0108 
0109     int mFilterRating = 0;
0110 
0111     QRegularExpression mFilterExpression;
0112 
0113     QReadWriteLock mDataLock;
0114 
0115     QThreadPool mThreadPool;
0116 
0117     MediaPlayListProxyModel* mPlayList = nullptr;
0118 
0119     QFutureWatcher<void> mEnqueueWatcher;
0120 
0121     QUrl mEnqueueWatcherTrackUrl;
0122 
0123 
0124 private:
0125 
0126     QFuture<void> genericEnqueueToPlayList(const QModelIndex &rootIndex,
0127                                   ElisaUtils::PlayListEnqueueMode enqueueMode,
0128                                   ElisaUtils::PlayListEnqueueTriggerPlay triggerPlay);
0129 
0130 };
0131 
0132 #endif // ABSTRACTMEDIAPROXYMODEL_H