24 #include <QDBusAbstractInterface>
25 #include <QDBusPendingCall>
26 #include <QDBusPendingCallWatcher>
27 #include <QDBusPendingReply>
37 DBusTrackList(
const QDBusConnection &conn,
const QString &path,
41 void onTrackAdded(
const QString &
id) { d->
onTrackAdded(
id); }
42 void onTracksAdded(
const QStringList &ids) { d->
onTracksAdded(ids); }
43 void onTrackMoved(
const QString &
id,
const QString &to) {
63 QDBusConnection c(conn);
65 c.connect(service(), path, interface(), QStringLiteral(
"TrackAdded"),
66 this, SLOT(onTrackAdded(QString)));
67 c.connect(service(), path, interface(), QStringLiteral(
"TracksAdded"),
68 this, SLOT(onTracksAdded(QStringList)));
69 c.connect(service(), path, interface(), QStringLiteral(
"TrackRemoved"),
70 this, SLOT(onTrackRemoved(QString)));
71 c.connect(service(), path, interface(), QStringLiteral(
"TrackMoved"),
72 this, SLOT(onTrackMoved(QString,QString)));
73 c.connect(service(), path, interface(), QStringLiteral(
"TrackListReset"),
74 this, SLOT(onTrackListReset()));
76 c.connect(service(), path, interface(), QStringLiteral(
"TrackChanged"),
77 this, SLOT(onTrackChanged(QString)));
80 QDBusMessage msg = QDBusMessage::createMethodCall(
84 QStringLiteral(
"GetAll"));
86 QDBusMessage reply = c.call(msg);
87 if (Q_UNLIKELY(reply.type()) == QDBusMessage::ErrorMessage) {
88 qWarning() <<
"Cannot get tracklist properties:" <<
91 QDBusArgument arg = reply.arguments().first().value<QDBusArgument>();
97 m_canEditTracks(true),
112 qWarning() <<
"Operating on disconnected playlist not supported!";
120 return (index >= 0 && index < m_trackIds.count()) ?
122 QStringLiteral(
"/org/mpris/MediaPlayer2/TrackList/NoTrack");
128 properties.value(QStringLiteral(
"CanEditTracks"),
false).toBool();
137 QDBusPendingCall call =
138 m_proxy->asyncCall(QStringLiteral(
"AddTrack"),
139 uri.toString(),
remotePos(position), makeCurrent);
140 m_indexForNextAddition = position;
141 m_urisForNextAddition = { uri };
150 QStringList urisAsStrings;
151 for (
const QUrl &uri: uris) {
152 urisAsStrings.append(uri.toString());
154 QDBusPendingCall call =
155 m_proxy->asyncCall(QStringLiteral(
"AddTracks"),
157 m_indexForNextAddition = position;
158 m_urisForNextAddition = uris;
166 QDBusPendingCall call =
167 m_proxy->asyncCall(QStringLiteral(
"MoveTrack"),
176 QDBusPendingCall call =
177 m_proxy->asyncCall(QStringLiteral(
"RemoveTrack"),
remotePos(index));
185 QDBusPendingCall call =
186 m_proxy->asyncCall(QStringLiteral(
"GoTo"),
remotePos(index));
194 QDBusPendingCall call = m_proxy->asyncCall(QStringLiteral(
"Reset"));
207 if (ids.count() != m_urisForNextAddition.count()) {
208 qWarning() <<
"Mismatching counters for TrackAdded signal";
211 if (m_indexForNextAddition < 0 || m_indexForNextAddition > m_trackIds.count()) {
212 m_indexForNextAddition = m_trackIds.count();
214 for (
int i = 0; i < m_urisForNextAddition.count(); i++) {
215 const QUrl &uri = m_urisForNextAddition[i];
216 m_tracks.insert(m_indexForNextAddition + i,
Track(uri));
217 m_trackIds.insert(m_indexForNextAddition + i, ids[i]);
220 Q_EMIT q->tracksAdded(m_indexForNextAddition,
221 m_indexForNextAddition + ids.count() - 1);
227 int idIndex = m_trackIds.indexOf(
id);
228 int toIndex = m_trackIds.indexOf(to);
229 m_trackIds.move(idIndex, toIndex);
230 m_tracks.move(idIndex, toIndex);
231 Q_EMIT q->trackMoved(idIndex, toIndex);
237 int idIndex = m_trackIds.indexOf(
id);
238 m_trackIds.remove(idIndex);
239 m_tracks.remove(idIndex);
240 Q_EMIT q->trackRemoved(idIndex);
249 Q_EMIT q->trackListReset();
255 m_currentTrack = m_trackIds.indexOf(
id);
256 Q_EMIT q->currentTrackChanged();
276 return d->m_canEditTracks;
282 return d->m_currentTrack;
289 d->addTrackWithUriAt(uri, position, makeCurrent);
295 d->addTracksWithUriAt(uris, position);
301 d->moveTrack(index, to);
307 d->removeTrack(index);
322 #include "track_list.moc"