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

0001 /*
0002    SPDX-FileCopyrightText: 2016 (c) Matthieu Gallien <matthieu_gallien@yahoo.fr>
0003    SPDX-FileCopyrightText: 2018 (c) Alexander Stippich <a.stippich@gmx.net>
0004 
0005    SPDX-License-Identifier: LGPL-3.0-or-later
0006  */
0007 
0008 #ifndef FILEBROWSERPROXYMODEL_H
0009 #define FILEBROWSERPROXYMODEL_H
0010 
0011 #include "elisaLib_export.h"
0012 
0013 #include "filescanner.h"
0014 #include "elisautils.h"
0015 
0016 #include <KDirSortFilterProxyModel>
0017 #include <KJob>
0018 #include <KIO/ListJob>
0019 #include <KIO/UDSEntry>
0020 
0021 #include <QMimeDatabase>
0022 #include <QRegularExpression>
0023 
0024 #include <queue>
0025 #include <memory>
0026 
0027 class MediaPlayListProxyModel;
0028 
0029 class ELISALIB_EXPORT FileBrowserProxyModel : public KDirSortFilterProxyModel
0030 {
0031     Q_OBJECT
0032 
0033     Q_PROPERTY(QString filterText
0034                READ filterText
0035                WRITE setFilterText
0036                NOTIFY filterTextChanged)
0037 
0038     Q_PROPERTY(int filterRating
0039                READ filterRating
0040                WRITE setFilterRating
0041                NOTIFY filterRatingChanged)
0042 
0043     Q_PROPERTY(bool sortedAscending
0044                READ sortedAscending
0045                NOTIFY sortedAscendingChanged)
0046 
0047     Q_PROPERTY(MediaPlayListProxyModel* playList READ playList WRITE setPlayList NOTIFY playListChanged)
0048 
0049 public:
0050 
0051     explicit FileBrowserProxyModel(QObject *parent = nullptr);
0052 
0053     ~FileBrowserProxyModel() override;
0054 
0055     [[nodiscard]] QString filterText() const;
0056 
0057     [[nodiscard]] int filterRating() const;
0058 
0059     [[nodiscard]] bool sortedAscending() const;
0060 
0061     [[nodiscard]] MediaPlayListProxyModel* playList() const;
0062 
0063     void setSourceModel(QAbstractItemModel *sourceModel) override;
0064 
0065 public Q_SLOTS:
0066 
0067     void enqueueToPlayList(const QModelIndex &rootIndex);
0068 
0069     void replaceAndPlayOfPlayList(const QModelIndex &rootIndex);
0070 
0071     void enqueue(const DataTypes::MusicDataType &newEntry,
0072                  const QString &newEntryTitle,
0073                  ElisaUtils::PlayListEnqueueMode enqueueMode,
0074                  ElisaUtils::PlayListEnqueueTriggerPlay triggerPlay);
0075 
0076     void setFilterText(const QString &filterText);
0077 
0078     void setFilterRating(int filterRating);
0079 
0080     void setPlayList(MediaPlayListProxyModel* playList);
0081 
0082     void sortModel(Qt::SortOrder order);
0083 
0084 Q_SIGNALS:
0085 
0086     void entriesToEnqueue(const DataTypes::EntryDataList &newEntries,
0087                           ElisaUtils::PlayListEnqueueMode enqueueMode,
0088                           ElisaUtils::PlayListEnqueueTriggerPlay triggerPlay);
0089 
0090     void filterTextChanged(const QString &filterText);
0091 
0092     void filterRatingChanged();
0093 
0094     void sortedAscendingChanged();
0095 
0096     void playListChanged();
0097 
0098 protected:
0099 
0100 private Q_SLOTS:
0101 
0102     void listRecursiveResult(KJob *job);
0103 
0104     void listRecursiveNewEntries(KIO::Job *job, const KIO::UDSEntryList &list);
0105 
0106 private:
0107 
0108     void genericEnqueueToPlayList(const QModelIndex &rootIndex,
0109                                   ElisaUtils::PlayListEnqueueMode enqueueMode,
0110                                   ElisaUtils::PlayListEnqueueTriggerPlay triggerPlay);
0111 
0112     void disconnectPlayList();
0113 
0114     void connectPlayList();
0115 
0116     void recursiveEnqueue();
0117 
0118     QString mFilterText;
0119 
0120     QRegularExpression mFilterExpression;
0121 
0122     MediaPlayListProxyModel* mPlayList = nullptr;
0123 
0124     bool mFilterRating = false;
0125 
0126     QMimeDatabase mMimeDatabase;
0127 
0128     bool mEnqueueInProgress = false;
0129 
0130     std::queue<std::tuple<QUrl, bool>> mPendingEntries;
0131 
0132     DataTypes::EntryDataList mAllData;
0133 
0134     ElisaUtils::PlayListEnqueueMode mEnqueueMode;
0135 
0136     ElisaUtils::PlayListEnqueueTriggerPlay mTriggerPlay;
0137 
0138     QUrl mCurentUrl;
0139 
0140     KIO::Job *mCurrentJob = nullptr;
0141 
0142 };
0143 
0144 #endif // FILEBROWSERPROXYMODEL_H