fixed project file and reset on connection change
[libxmms2client-qt.git] / playlist.cpp
blob0f53e6860b998b8beb7fdac3fbca0f361e81c78e
1 //
2 // C++ Implementation: playlist
3 //
4 // Author: Oliver Groß <z.o.gross@gmx.de>, (C) 2008
5 //
6 // Copyright: See COPYING file that comes with this distribution
7 //
8 #include "common.h"
9 #include "playlist.h"
10 #include "client.h"
12 namespace XmmsQt {
13 QPlaylist::QPlaylist(QClient * parent) : QObject(parent), m_Connection(0) {
14 connect(parent, SIGNAL(connectionChanged(xmmsc_connection_t *)),
15 this, SLOT(setConnection(xmmsc_connection_t *)));
18 QPlaylist::~QPlaylist() {
21 void QPlaylist::loadedCallback(xmmsc_result_t * result, void * instance) {
22 if (instance) {
23 static_cast<QPlaylist *>(instance)->reset();
25 xmmsc_result_unref(result);
28 void QPlaylist::changedCallback(xmmsc_result_t * result, void * instance) {
29 if (instance) {
30 QPlaylist * playlist = static_cast<QPlaylist *>(instance);
31 xmms_playlist_changed_actions_t type;
32 xmmsc_result_get_dict_entry_uint(result, "type", (quint32 *)(&type));
34 switch (type) {
35 case XMMS_PLAYLIST_CHANGED_ADD:
37 quint32 id;
39 xmmsc_result_get_dict_entry_uint(result, "id", &id);
41 emit playlist->entryAppended(id);
43 break;
44 case XMMS_PLAYLIST_CHANGED_INSERT:
46 quint32 position, id;
48 xmmsc_result_get_dict_entry_uint(result, "position", &position);
49 xmmsc_result_get_dict_entry_uint(result, "id", &id);
50 emit playlist->entryInserted(id, position);
52 break;
53 case XMMS_PLAYLIST_CHANGED_UPDATE:
55 quint32 position, id;
57 xmmsc_result_get_dict_entry_uint(result, "position", &position);
58 xmmsc_result_get_dict_entry_uint(result, "id", &id);
59 emit playlist->entryUpdated(id, position);
61 break;
62 case XMMS_PLAYLIST_CHANGED_REMOVE:
64 quint32 position;
66 xmmsc_result_get_dict_entry_uint(result, "position", &position);
67 emit playlist->entryRemoved(position);
69 break;
70 case XMMS_PLAYLIST_CHANGED_MOVE:
72 quint32 from, to;
74 xmmsc_result_get_dict_entry_uint(result, "position", &from);
75 xmmsc_result_get_dict_entry_uint(result, "newposition", &from);
76 emit playlist->entryMoved(from, to);
78 break;
79 case XMMS_PLAYLIST_CHANGED_SORT:
80 case XMMS_PLAYLIST_CHANGED_SHUFFLE:
81 case XMMS_PLAYLIST_CHANGED_CLEAR:
82 playlist->reset();
83 break;
84 default:
85 break;
88 xmmsc_result_unref(result);
91 void QPlaylist::fillIDListCallback(xmmsc_result_t * result, void * instance) {
92 if (instance) {
93 QPlaylist * playlist = static_cast<QPlaylist *>(instance);
95 quint32 buffer;
97 for (xmmsc_result_t * i = result; xmmsc_result_list_valid(i); xmmsc_result_list_next(i)) {
98 xmmsc_result_get_uint(i, &buffer);
99 playlist->m_IDList << buffer;
102 emit playlist->reseted();
104 xmmsc_result_unref(result);
107 void QPlaylist::currentPosCallback(xmmsc_result_t * result, void * instance) {
108 if (instance) {
109 quint32 position;
111 xmmsc_result_get_uint(result, &position);
112 emit static_cast<QPlaylist *>(instance)->currentChanged(position);
114 xmmsc_result_unref(result);
117 void QPlaylist::setConnection(xmmsc_connection_t * connection) {
118 if (m_Connection == connection)
119 return;
121 //disconnect
122 if (m_Connection) {
123 disconnectNotifierUnref(xmmsc_broadcast_playlist_loaded(m_Connection));
124 disconnectNotifierUnref(xmmsc_broadcast_playlist_changed(m_Connection));
125 disconnectNotifierUnref(xmmsc_broadcast_playlist_current_pos(m_Connection));
128 m_Connection = connection;
130 //connect
131 if (m_Connection) {
132 connectNotifierUnref(xmmsc_broadcast_playlist_loaded(m_Connection), loadedCallback, this);
133 connectNotifierUnref(xmmsc_broadcast_playlist_changed(m_Connection), changedCallback, this);
134 connectNotifierUnref(xmmsc_broadcast_playlist_current_pos(m_Connection), currentPosCallback, this);
137 reset();
140 void QPlaylist::reset() {
141 m_IDList.clear();
142 if (m_Connection)
143 connectNotifierUnref(xmmsc_playlist_list_entries(m_Connection, "default"), fillIDListCallback, this);
146 void QPlaylist::append(quint32 id) {
147 xmmsc_result_unref(xmmsc_playlist_add_id(m_Connection, "Default", id));
150 void QPlaylist::append(QString url) {
151 xmmsc_result_unref(xmmsc_playlist_add_url(m_Connection, "Default", url.toAscii().data()));
154 void QPlaylist::append(QStringList urls) {
155 foreach(QString i, urls)
156 append(i);
159 void QPlaylist::append(QList<quint32> ids) {
160 foreach(quint32 i, ids)
161 append(i);
164 void QPlaylist::appendRecursive(QString directory) {
165 xmmsc_result_unref(xmmsc_playlist_radd(m_Connection, "Default", directory.toAscii().data()));
168 void QPlaylist::insert(quint32 id, quint32 position) {
169 xmmsc_result_unref(xmmsc_playlist_insert_id(m_Connection, "Default", position, id));
172 void QPlaylist::insert(QString url, quint32 position) {
173 xmmsc_result_unref(xmmsc_playlist_insert_url(m_Connection, "Default", position, url.toAscii().data()));
176 void QPlaylist::insert(QList<quint32> ids, quint32 position) {
177 if (ids.count() == 0)
178 return;
180 QList<quint32>::iterator i = ids.end();
181 do {
182 i--;
183 insert(*i, position);
185 while (i != ids.begin());
188 void QPlaylist::insert(QStringList urls, quint32 position) {
189 if (urls.count() == 0)
190 return;
192 QStringList::iterator i = urls.end();
193 do {
194 i--;
195 insert(*i, position);
197 while (i != urls.begin());
200 void QPlaylist::remove(quint32 position) {
201 xmmsc_result_unref(xmmsc_playlist_remove_entry(m_Connection, "Default", position));
204 void QPlaylist::move(quint32 from, quint32 to) {
205 xmmsc_result_unref(xmmsc_playlist_move_entry(m_Connection, "Default", from, to));
208 void QPlaylist::clear() {
209 xmmsc_result_unref(xmmsc_playlist_clear(m_Connection, "Default"));
212 /* void QPlaylist::sort(QStringList properties) {
213 xmmsc_result_unref(xmmsc_playlist_sort(m_Connection, "Default"));
216 void QPlaylist::randomize() {
217 xmmsc_result_unref(xmmsc_playlist_shuffle(m_Connection, "Default"));
220 void QPlaylist::setNext(quint32 position) {
221 xmmsc_result_unref(xmmsc_playlist_set_next(m_Connection, position));