File indexing completed on 2024-05-19 04:48:28

0001 #pragma once
0002 
0003 #include <QObject>
0004 #include <QVariant>
0005 #include <QQmlParserStatus>
0006 
0007 class TracksModel;
0008 class Player;
0009 class Playlist : public QObject, public QQmlParserStatus
0010 {
0011     Q_INTERFACES(QQmlParserStatus)
0012     Q_OBJECT
0013 
0014     Q_PROPERTY(TracksModel *model WRITE setModel READ model NOTIFY modelChanged)
0015     Q_PROPERTY(QVariantMap currentTrack READ currentTrack NOTIFY currentTrackChanged FINAL)
0016     Q_PROPERTY(int currentIndex READ currentIndex NOTIFY currentIndexChanged FINAL)
0017 
0018     Q_PROPERTY(PlayMode playMode READ playMode WRITE setPlayMode NOTIFY playModeChanged)
0019 
0020     Q_PROPERTY(RepeatMode repeatMode READ repeatMode WRITE setRepeatMode NOTIFY repeatModeChanged)
0021 
0022     Q_PROPERTY(bool autoResume READ autoResume WRITE setAutoResume NOTIFY autoResumeChanged)
0023 
0024 public:
0025     enum PlayMode : uint_fast8_t
0026     {
0027         Normal,
0028         Shuffle,
0029     };
0030     Q_ENUM(PlayMode)
0031 
0032     enum RepeatMode : uint_fast8_t
0033     {
0034         NoRepeat,
0035         RepeatOnce,
0036         Repeat
0037     };
0038     Q_ENUM(RepeatMode)
0039 
0040     explicit Playlist(QObject *parent = nullptr);
0041     TracksModel *model() const;
0042 
0043     QVariantMap currentTrack() const;
0044 
0045     int currentIndex() const;
0046     PlayMode playMode() const;
0047 
0048     RepeatMode repeatMode() const;
0049 
0050     bool autoResume() const;
0051 
0052     void classBegin() override final;
0053     void componentComplete() override final;
0054 
0055 private:
0056     TracksModel *m_model = nullptr;
0057     Player *m_player = nullptr;
0058     QVariantMap m_currentTrack;
0059     int m_currentIndex = -1;
0060 
0061     PlayMode m_playMode = PlayMode::Normal;
0062     RepeatMode m_repeatMode = RepeatMode::NoRepeat;
0063     uint m_repeatFlag = 0;
0064 
0065     bool m_autoResume;
0066 
0067 public Q_SLOTS:
0068     bool canGoNext() const;
0069     bool canGoPrevious() const;
0070     bool canPlay() const;
0071 
0072     void next();
0073     void previous();
0074     void play(int index);
0075     void clear();
0076 
0077     void save();
0078     void loadLastPlaylist();
0079 
0080     void append(const QVariantMap &track);
0081     void insert(const QStringList &urls, const int &index);
0082 
0083     void setModel(TracksModel *model);
0084     void setCurrentIndex(int index);
0085     void changeCurrentIndex(int index);
0086 
0087     void setPlayMode(Playlist::PlayMode playMode);
0088 
0089     void shuffleRange(int start, int stop);
0090 
0091     void move(int from, int to);
0092     void remove(int index);
0093 
0094     void setRepeatMode(RepeatMode repeatMode);
0095 
0096     void setAutoResume(bool autoResume);
0097 
0098 Q_SIGNALS:
0099     void canPlayChanged();
0100     void modelChanged(TracksModel *model);
0101     void currentTrackChanged(QVariantMap currentTrack);
0102     void currentIndexChanged(int currentIndex);
0103     void missingFile(QVariantMap track);
0104     void playModeChanged(Playlist::PlayMode playMode);
0105     void repeatModeChanged(RepeatMode repeatMode);
0106     void autoResumeChanged(bool autoResume);
0107 };