Qmmp
Loading...
Searching...
No Matches
playlistmodel.h
1/***************************************************************************
2 * Copyright (C) 2006-2025 by Ilya Kotov *
3 * forkotov02@ya.ru *
4 * *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
9 * *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
14 * *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
19 ***************************************************************************/
20#ifndef PLAYLISTMODEL_H
21#define PLAYLISTMODEL_H
22
23#include <QObject>
24#include <QString>
25#include <QStringList>
26#include <QMap>
27#include <QQueue>
28#include <QPointer>
29#include <QVector>
30#include <QUrl>
31#include <QSet>
32#include "playlistitem.h"
33#include "playlisttrack.h"
34#include "playlistgroup.h"
35#include "coverloader_p.h"
36#include "qmmpui_export.h"
37
38class FileLoader;
39class PlayState;
40class PlayListFormat;
41class PlayListModel;
42class PlayListContainer;
43class QmmpUiSettings;
44class PlayListTask;
45
51{
55 inline int count()const
56 {
57 return bottom - top + 1;
58 }
59 int top = 1;
60 int bottom = -1;
61};
62
87class QMMPUI_EXPORT PlayListModel : public QObject
88{
89 Q_OBJECT
90public:
96 explicit PlayListModel(const QString &name, QObject *parent = nullptr);
104 QString name() const;
108 void setName(const QString &name);
112 int groupCount() const;
116 int trackCount() const;
120 bool isEmpty() const;
124 int columnCount() const;
137 int indexOf(PlayListItem *item) const;
141 PlayListTrack *track(int index) const;
145 PlayListGroup *group(int index) const;
153 QList<PlayListGroup *> groups() const;
157 int currentIndex() const;
163 bool setCurrent(int index);
174 void setSelected(PlayListItem *item, bool selected = true);
180 void setSelected(const QList<PlayListTrack *> &tracks, bool selected = true);
186 void setSelected(const QList<PlayListItem *> &items, bool selected = true);
193 void setSelectedLines(int firstLine, int lastLine, bool selected = true);
198 bool next();
203 bool previous();
207 int lineCount() const;
211 PlayListItem *itemAtLine(int lineIndex) const;
215 PlayListTrack *trackAtLine(int lineIndex) const;
221 QList<PlayListItem *> itemsAtLines(int pos, int count = -1) const;
225 int findLine(const PlayListItem *item) const;
229 int findLine(int trackIndex) const;
233 int subIndexOfLine(int lineIndex) const;
237 int trackIndexAtLine(int lineIndex) const;
241 bool alternateColor(int lineIndex) const;
245 int linesPerGroup() const;
249 void moveTracks(int from, int to);
253 const QList<PlayListTrack *> &queuedTracks() const;
257 bool isEmptyQueue()const;
261 int queueSize() const;
265 bool isStopAfter(const PlayListItem *track) const;
274 QList<int> selectedLines() const;
280 void setSelectedLine(int line, bool selected = true);
284 QList<int> selectedTrackIndexes() const;
288 QList<PlayListTrack *> selectedTracks() const;
292 QList<PlayListTrack *> tracks() const;
296 int firstSelectedLine() const;
300 int lastSelectedLine() const;
304 qint64 totalDuration() const;
308 void loadPlaylist(const QString& f_name);
314 void loadPlaylist(const QString &fmt, const QByteArray &data);
318 void savePlaylist(const QString &f_name);
322 bool isLoaderRunning() const;
326 bool contains(const QString &url);
345
349 PlayListTrack *findTrack(int trackIndex) const;
354 QList<PlayListItem *> findTracks(const QString &str) const;
359 {
360 STRUCTURE = 0x01,
361 SELECTION = 0x02,
362 QUEUE = 0x04,
363 CURRENT = 0x08,
364 STOP_AFTER = 0x10,
365 METADATA = 0x20
366 };
367
368signals:
373 void listChanged(int flags);
378 void tracksAdded(const QList<PlayListTrack *> &tracks);
383 void nameChanged(const QString &name);
391 void scrollToRequest(int trackIndex);
397 void sortingByColumnFinished(int column, bool reverted);
402
403public slots:
412 void addTracks(const QList<PlayListTrack *> &tracks);
417 void addPath(const QString &path);
422 void addPaths(const QStringList &paths);
426 void insertTrack(int index, PlayListTrack *track);
430 void insertTracks(int index, const QList<PlayListTrack *> &tracks);
435 void insertJson(int index, const QByteArray &json);
441 void insertPath(int index, const QString &path);
447 void insertPaths(int index, const QStringList &paths);
453 void insertUrls(int index, const QList<QUrl> &urls);
457 void clear();
473 void removeTrack(int i);
481 void removeTracks(const QList<PlayListItem *> &items);
485 void removeTracks(const QList<PlayListTrack *> &tracks);
493 void selectAll();
498 void showDetails(QWidget *parent = nullptr);
503 void showDetailsForCurrent(QWidget *parent = nullptr);
511 void scrollTo(int trackIndex);
531 void sortByColumn(int column);
551 void refresh();
568
569private:
573 int topmostInSelection(int);
577 int bottommostInSelection(int);
582 void removeSelection(bool inverted = false);
583
584 int removeTrackInternal(int i);
585
586private slots:
590 void preparePlayState();
594 void prepareForShufflePlaying(bool yes);
599 void prepareGroups(bool enabled);
600
601 void onTaskFinished();
602
603 void updateMetaData(const QStringList &paths);
604
605 void startCoverLoader();
606 void setCover(const QString &path, const QImage &img);
607 void insertTracksInternal(PlayListTrack *before, const QList<PlayListTrack *> &tracks);
608
609private:
610 PlayListTrack *m_current_track = nullptr;
611 PlayListTrack *m_stop_track = nullptr;
612 int m_current = -1;
613 PlayState* m_play_state;
614 qint64 m_total_duration = 0;
615 FileLoader *m_loader;
616 CoverLoader *m_coverLoder;
617 QString m_name;
618 PlayListContainer *m_container;
619 QmmpUiSettings *m_ui_settings;
620 PlayListTask *m_task;
621 QSet<QString> m_uniquePaths;
622};
623
624Q_DECLARE_METATYPE(PlayListModel::SortMode)
625
626#endif
Abstract interface for playlist formats.
Definition playlistformat.h:43
The PlayListTrack class provides a group for use with the PlayListModel class.
Definition playlistgroup.h:37
The PlayListItem class provides an item for use with the PlayListModel class.
Definition playlistitem.h:33
The PlayListModel class provides a data model for the playlist.
Definition playlistmodel.h:88
int trackCount() const
SortMode
Definition playlistmodel.h:331
@ ALBUMARTIST
Definition playlistmodel.h:336
@ TITLE
Definition playlistmodel.h:332
@ DATE
Definition playlistmodel.h:339
@ TRACK
Definition playlistmodel.h:340
@ DISCNUMBER
Definition playlistmodel.h:334
@ FILE_CREATION_DATE
Definition playlistmodel.h:341
@ GROUP
Definition playlistmodel.h:343
@ ARTIST
Definition playlistmodel.h:335
@ PATH_AND_FILENAME
Definition playlistmodel.h:338
@ ALBUM
Definition playlistmodel.h:333
@ FILENAME
Definition playlistmodel.h:337
@ FILE_MODIFICATION_DATE
Definition playlistmodel.h:342
int indexOf(PlayListItem *item) const
void sortByColumn(int column)
PlayListTrack * trackAtLine(int lineIndex) const
int firstSelectedLine() const
void scrollToRequest(int trackIndex)
void removeUnselected()
void addTracks(const QList< PlayListTrack * > &tracks)
void removeDuplicates()
void sortSelection(PlayListModel::SortMode mode)
void insertPaths(int index, const QStringList &paths)
void scrollTo(int trackIndex)
void sort(PlayListModel::SortMode mode)
void nameChanged(const QString &name)
void showDetailsForCurrent(QWidget *parent=nullptr)
void setSelected(const QList< PlayListTrack * > &tracks, bool selected=true)
qint64 totalDuration() const
void insertPath(int index, const QString &path)
SimpleSelection getSelection(int trackIndex)
void savePlaylist(const QString &f_name)
int findLine(const PlayListItem *item) const
void showDetails(QWidget *parent=nullptr)
QList< PlayListItem * > findTracks(const QString &str) const
int currentIndex() const
PlayListModel(const QString &name, QObject *parent=nullptr)
void loadPlaylist(const QString &fmt, const QByteArray &data)
QList< int > selectedTrackIndexes() const
const QList< PlayListTrack * > & queuedTracks() const
PlayListTrack * track(int index) const
void insertTracks(int index, const QList< PlayListTrack * > &tracks)
void removeInvalidTracks()
void removeTrack(PlayListTrack *track)
void insertJson(int index, const QByteArray &json)
PlayListGroup * group(int index) const
void currentTrackRemoved()
void updateMetaData()
PlayListTrack * findTrack(int trackIndex) const
int lastSelectedLine() const
void moveTracks(int from, int to)
void clearQueue()
bool alternateColor(int lineIndex) const
void randomizeList()
void setQueued(PlayListTrack *t)
void tracksAdded(const QList< PlayListTrack * > &tracks)
void removeTracks(const QList< PlayListItem * > &items)
QString name() const
int lineCount() const
void removeTrack(int i)
void removeTracks(const QList< PlayListTrack * > &tracks)
QList< int > selectedLines() const
PlayListTrack * currentTrack() const
QList< PlayListItem * > itemsAtLines(int pos, int count=-1) const
void setSelected(PlayListItem *item, bool selected=true)
void addTrack(PlayListTrack *track)
void loaderFinished()
UpdateFlags
Definition playlistmodel.h:359
@ METADATA
Definition playlistmodel.h:365
@ QUEUE
Definition playlistmodel.h:362
@ SELECTION
Definition playlistmodel.h:361
@ CURRENT
Definition playlistmodel.h:363
@ STRUCTURE
Definition playlistmodel.h:360
@ STOP_AFTER
Definition playlistmodel.h:364
bool setCurrent(int index)
int queueSize() const
void setName(const QString &name)
int groupCount() const
void addPath(const QString &path)
void listChanged(int flags)
void sortingByColumnFinished(int column, bool reverted)
void selectAll()
bool isLoaderRunning() const
int trackIndexAtLine(int lineIndex) const
void insertTrack(int index, PlayListTrack *track)
void loadPlaylist(const QString &f_name)
int linesPerGroup() const
QList< PlayListTrack * > tracks() const
void clearSelection()
void insertUrls(int index, const QList< QUrl > &urls)
int subIndexOfLine(int lineIndex) const
PlayListItem * itemAtLine(int lineIndex) const
bool isStopAfter(const PlayListItem *track) const
void addPaths(const QStringList &paths)
bool isEmptyQueue() const
bool setCurrent(PlayListTrack *track)
void rebuildGroups()
int columnCount() const
void stopAfterSelected()
bool contains(const QString &url)
void invertSelection()
QList< PlayListGroup * > groups() const
bool isEmpty() const
int findLine(int trackIndex) const
QList< PlayListTrack * > selectedTracks() const
void doCurrentVisibleRequest()
PlayListTrack * nextTrack() const
void setSelectedLines(int firstLine, int lastLine, bool selected=true)
PlayListGroup * group(const PlayListTrack *track) const
void reverseList()
void setSelected(const QList< PlayListItem * > &items, bool selected=true)
void addToQueue()
void setSelectedLine(int line, bool selected=true)
void removeSelected()
The PlayListTrack class provides a track for use with the PlayListModel class.
Definition playlisttrack.h:37
The QmmpUiSettings class provides access to global libqmmpui library settings.
Definition qmmpuisettings.h:36
Helper class that keeps track of a view's selected items.
Definition playlistmodel.h:51
int count() const
Definition playlistmodel.h:55
int bottom
Definition playlistmodel.h:60
int top
Definition playlistmodel.h:59