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;
149 int currentIndex() const;
155 bool setCurrent(int index);
166 void setSelected(PlayListItem *item, bool selected = true);
172 void setSelected(const QList<PlayListTrack *> &tracks, bool selected = true);
178 void setSelected(const QList<PlayListItem *> &items, bool selected = true);
185 void setSelectedLines(int firstLine, int lastLine, bool selected = true);
190 bool next();
195 bool previous();
199 int lineCount() const;
203 PlayListItem *itemAtLine(int lineIndex) const;
207 PlayListTrack *trackAtLine(int lineIndex) const;
213 QList<PlayListItem *> itemsAtLines(int pos, int count = -1) const;
217 int findLine(PlayListItem *item) const;
221 int findLine(int trackIndex) const;
225 int subIndexOfLine(int lineIndex) const;
229 int trackIndexAtLine(int lineIndex) const;
233 bool alternateColor(int lineIndex) const;
237 int linesPerGroup() const;
241 void moveTracks(int from, int to);
245 const QList<PlayListTrack *> &queuedTracks() const;
249 bool isEmptyQueue()const;
253 int queueSize() const;
257 bool isStopAfter(const PlayListItem *track) const;
266 QList<int> selectedLines() const;
272 void setSelectedLine(int line, bool selected = true);
276 QList<int> selectedTrackIndexes() const;
280 QList<PlayListTrack *> selectedTracks() const;
284 QList<PlayListTrack *> tracks() const;
288 int firstSelectedUpper(int trackIndex);
292 int firstSelectedLower(int trackIndex);
296 qint64 totalDuration() const;
300 void loadPlaylist(const QString& f_name);
306 void loadPlaylist(const QString &fmt, const QByteArray &data);
310 void savePlaylist(const QString& f_name);
314 bool isLoaderRunning() const;
318 bool contains(const QString &url);
337
341 PlayListTrack *findTrack(int trackIndex) const;
346 QList<PlayListItem *> findTracks(const QString &str) const;
351 {
352 STRUCTURE = 0x01,
353 SELECTION = 0x02,
354 QUEUE = 0x04,
355 CURRENT = 0x08,
356 STOP_AFTER = 0x10,
357 METADATA = 0x20
358 };
359
360signals:
365 void listChanged(int flags);
370 void tracksAdded(const QList<PlayListTrack *> &tracks);
375 void nameChanged(const QString &name);
383 void scrollToRequest(int trackIndex);
389 void sortingByColumnFinished(int column, bool reverted);
394
395public slots:
404 void addTracks(const QList<PlayListTrack *> &tracks);
409 void addPath(const QString &path);
414 void addPaths(const QStringList &paths);
418 void insertTrack(int index, PlayListTrack *track);
422 void insertTracks(int index, const QList<PlayListTrack *> &tracks);
427 void insertJson(int index, const QByteArray &json);
433 void insertPath(int index, const QString &path);
439 void insertPaths(int index, const QStringList &paths);
445 void insertUrls(int index, const QList<QUrl> &urls);
449 void clear();
465 void removeTrack(int i);
473 void removeTracks(const QList<PlayListItem *> &items);
477 void removeTracks(const QList<PlayListTrack *> &tracks);
485 void selectAll();
490 void showDetails(QWidget *parent = nullptr);
495 void showDetailsForCurrent(QWidget *parent = nullptr);
503 void scrollTo(int trackIndex);
523 void sortByColumn(int column);
543 void refresh();
560
561private:
565 int topmostInSelection(int);
569 int bottommostInSelection(int);
574 void removeSelection(bool inverted = false);
575
576 int removeTrackInternal(int i);
577
578private slots:
582 void preparePlayState();
586 void prepareForShufflePlaying(bool yes);
591 void prepareGroups(bool enabled);
592
593 void onTaskFinished();
594
595 void updateMetaData(const QStringList &paths);
596
597 void startCoverLoader();
598 void setCover(const QString &path, const QImage &img);
599 void insertTracksInternal(PlayListTrack *before, const QList<PlayListTrack *> &tracks);
600
601private:
602 PlayListTrack *m_current_track = nullptr;
603 PlayListTrack *m_stop_track = nullptr;
604 int m_current = -1;
605 PlayState* m_play_state;
606 qint64 m_total_duration = 0;
607 FileLoader *m_loader;
608 CoverLoader *m_coverLoder;
609 QString m_name;
610 PlayListContainer *m_container;
611 QmmpUiSettings *m_ui_settings;
612 PlayListTask *m_task;
613 QSet<QString> m_uniquePaths;
614};
615
616Q_DECLARE_METATYPE(PlayListModel::SortMode)
617
618#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:323
@ ALBUMARTIST
Definition playlistmodel.h:328
@ TITLE
Definition playlistmodel.h:324
@ DATE
Definition playlistmodel.h:331
@ TRACK
Definition playlistmodel.h:332
@ DISCNUMBER
Definition playlistmodel.h:326
@ FILE_CREATION_DATE
Definition playlistmodel.h:333
@ GROUP
Definition playlistmodel.h:335
@ ARTIST
Definition playlistmodel.h:327
@ PATH_AND_FILENAME
Definition playlistmodel.h:330
@ ALBUM
Definition playlistmodel.h:325
@ FILENAME
Definition playlistmodel.h:329
@ FILE_MODIFICATION_DATE
Definition playlistmodel.h:334
int indexOf(PlayListItem *item) const
void sortByColumn(int column)
PlayListTrack * trackAtLine(int lineIndex) 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(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
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)
int firstSelectedLower(int trackIndex)
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:351
@ METADATA
Definition playlistmodel.h:357
@ QUEUE
Definition playlistmodel.h:354
@ SELECTION
Definition playlistmodel.h:353
@ CURRENT
Definition playlistmodel.h:355
@ STRUCTURE
Definition playlistmodel.h:352
@ STOP_AFTER
Definition playlistmodel.h:356
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()
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)
int firstSelectedUpper(int trackIndex)
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