summaryrefslogtreecommitdiffstats
path: root/src/imports/multimedia/qdeclarativeplaylist_p.h
blob: 50869e4222a23d5225c57d0fd4a86b5e813dbd2f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 3 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL3 included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 3 requirements
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/

#ifndef QDECLARATIVEPLAYLIST_P_H
#define QDECLARATIVEPLAYLIST_P_H

//
//  W A R N I N G
//  -------------
//
// This file is not part of the Qt API.  It exists for the convenience
// of other Qt classes.  This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//

#include <QtCore/QAbstractListModel>
#include <QtQml/qqmlparserstatus.h>
#include <QtQml/qqml.h>

#include <qmediaplaylist.h>

QT_BEGIN_NAMESPACE

class QDeclarativePlaylistItem : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QUrl source READ source WRITE setSource)

public:
    QDeclarativePlaylistItem(QObject *parent = 0);

    QUrl source() const;
    void setSource(const QUrl &source);

private:
    QUrl m_source;
};

class QDeclarativePlaylist : public QAbstractListModel, public QQmlParserStatus
{
    Q_OBJECT
    Q_PROPERTY(PlaybackMode playbackMode READ playbackMode WRITE setPlaybackMode NOTIFY playbackModeChanged)
    Q_PROPERTY(QUrl currentItemSource READ currentItemSource NOTIFY currentItemSourceChanged)
    Q_PROPERTY(int currentIndex READ currentIndex WRITE setCurrentIndex NOTIFY currentIndexChanged)
    Q_PROPERTY(int itemCount READ itemCount NOTIFY itemCountChanged)
    Q_PROPERTY(bool readOnly READ readOnly NOTIFY readOnlyChanged)
    Q_PROPERTY(Error error READ error NOTIFY errorChanged)
    Q_PROPERTY(QString errorString READ errorString NOTIFY errorChanged)
    Q_PROPERTY(QQmlListProperty<QDeclarativePlaylistItem> items READ items DESIGNABLE false)
    Q_ENUMS(PlaybackMode)
    Q_ENUMS(Error)
    Q_INTERFACES(QQmlParserStatus)
    Q_CLASSINFO("DefaultProperty", "items")

public:
    enum PlaybackMode
    {
        CurrentItemOnce = QMediaPlaylist::CurrentItemOnce,
        CurrentItemInLoop = QMediaPlaylist::CurrentItemInLoop,
        Sequential = QMediaPlaylist::Sequential,
        Loop = QMediaPlaylist::Loop,
        Random = QMediaPlaylist::Random
    };
    enum Error
    {
        NoError = QMediaPlaylist::NoError,
        FormatError = QMediaPlaylist::FormatError,
        FormatNotSupportedError = QMediaPlaylist::FormatNotSupportedError,
        NetworkError = QMediaPlaylist::NetworkError,
        AccessDeniedError = QMediaPlaylist::AccessDeniedError
    };
    enum Roles
    {
        SourceRole = Qt::UserRole + 1
    };

    QDeclarativePlaylist(QObject *parent = 0);
    ~QDeclarativePlaylist();

    PlaybackMode playbackMode() const;
    void setPlaybackMode(PlaybackMode playbackMode);
    QUrl currentItemSource() const;
    int currentIndex() const;
    void setCurrentIndex(int currentIndex);
    int itemCount() const;
    bool readOnly() const;
    Error error() const;
    QString errorString() const;
    QMediaPlaylist *mediaPlaylist() const { return m_playlist; }

    int rowCount(const QModelIndex &parent = QModelIndex()) const;
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
    QHash<int, QByteArray> roleNames() const;

    void classBegin();
    void componentComplete();

    QQmlListProperty<QDeclarativePlaylistItem> items() {
        return QQmlListProperty<QDeclarativePlaylistItem>(
            this, 0, item_append, item_count, 0, item_clear);
    }
    static void item_append(QQmlListProperty<QDeclarativePlaylistItem> *list,
                            QDeclarativePlaylistItem* item) {
        static_cast<QDeclarativePlaylist*>(list->object)->addItem(item->source());
    }
    static int item_count(QQmlListProperty<QDeclarativePlaylistItem> *list) {
        return static_cast<QDeclarativePlaylist*>(list->object)->itemCount();
    }
    static void item_clear(QQmlListProperty<QDeclarativePlaylistItem> *list) {
        static_cast<QDeclarativePlaylist*>(list->object)->clear();
    }

public Q_SLOTS:
    QUrl itemSource(int index);
    int nextIndex(int steps = 1);
    int previousIndex(int steps = 1);
    void next();
    void previous();
    void shuffle();
    void load(const QUrl &location, const QString &format = QString());
    bool save(const QUrl &location, const QString &format = QString());
    bool addItem(const QUrl &source);
    bool addItems(const QList<QUrl> &sources);
    bool insertItem(int index, const QUrl &source);
    bool insertItems(int index, const QList<QUrl> &sources);
    bool moveItem(int from, int to);
    bool removeItem(int index);
    bool removeItems(int start, int end);
    bool clear();

Q_SIGNALS:
    void playbackModeChanged();
    void currentItemSourceChanged();
    void currentIndexChanged();
    void itemCountChanged();
    void readOnlyChanged();
    void errorChanged();

    void itemAboutToBeInserted(int start, int end);
    void itemInserted(int start, int end);
    void itemAboutToBeRemoved(int start, int end);
    void itemRemoved(int start, int end);
    void itemChanged(int start, int end);
    void loaded();
    void loadFailed();

    void error(QDeclarativePlaylist::Error error, const QString &errorString);

private Q_SLOTS:
    void _q_mediaAboutToBeInserted(int start, int end);
    void _q_mediaInserted(int start, int end);
    void _q_mediaAboutToBeRemoved(int start, int end);
    void _q_mediaRemoved(int start, int end);
    void _q_mediaChanged(int start, int end);
    void _q_loadFailed();

private:
    Q_DISABLE_COPY(QDeclarativePlaylist)

    QMediaPlaylist *m_playlist;
    QString m_errorString;
    QMediaPlaylist::Error m_error;
    bool m_readOnly;
};

QT_END_NAMESPACE

QML_DECLARE_TYPE(QT_PREPEND_NAMESPACE(QDeclarativePlaylistItem))
QML_DECLARE_TYPE(QT_PREPEND_NAMESPACE(QDeclarativePlaylist))

#endif