diff --git a/dataengines/mpris2/multiplexer.h b/dataengines/mpris2/multiplexer.h --- a/dataengines/mpris2/multiplexer.h +++ b/dataengines/mpris2/multiplexer.h @@ -46,6 +46,7 @@ void playerUpdated(const QString &name, const Plasma::DataEngine::Data &data); private: + void evaluatePlayer(PlayerContainer *container); void setBestActive(); void replaceData(const Plasma::DataEngine::Data &data); diff --git a/dataengines/mpris2/multiplexer.cpp b/dataengines/mpris2/multiplexer.cpp --- a/dataengines/mpris2/multiplexer.cpp +++ b/dataengines/mpris2/multiplexer.cpp @@ -36,38 +36,62 @@ setObjectName(sourceName); } -void Multiplexer::addPlayer(PlayerContainer *container) +void Multiplexer::evaluatePlayer(PlayerContainer *container) { bool makeActive = m_activeName.isEmpty(); - if (container->data().value(QStringLiteral("PlaybackStatus")) == QLatin1String("Playing")) { - m_playing.insert(container->objectName(), container); - if (!makeActive && - data().value(QStringLiteral("PlaybackStatus")) != QLatin1String("Playing")) { + const QString name = container->objectName(); + const QString containerPlaybackStatus = container->data().value(QStringLiteral("PlaybackStatus")).toString(); + const QString multiplexerPlaybackStatus = data().value(QStringLiteral("PlaybackStatus")).toString(); + + m_playing.remove(name); + m_paused.remove(name); + m_stopped.remove(name); + + if (containerPlaybackStatus == QLatin1String("Playing")) { + m_playing.insert(name, container); + if (!makeActive && multiplexerPlaybackStatus != QLatin1String("Playing")) { makeActive = true; } - } else if (container->data().value(QStringLiteral("PlaybackStatus")) == QLatin1String("Paused")) { - m_paused.insert(container->objectName(), container); - if (!makeActive && - data().value(QStringLiteral("PlaybackStatus")) != QLatin1String("Playing") && - data().value(QStringLiteral("PlaybackStatus")) != QLatin1String("Paused")) { + } else if (containerPlaybackStatus == QLatin1String("Paused")) { + m_paused.insert(name, container); + if (!makeActive + && multiplexerPlaybackStatus != QLatin1String("Playing") + && multiplexerPlaybackStatus != QLatin1String("Paused")) { makeActive = true; } } else { - m_stopped.insert(container->objectName(), container); + m_stopped.insert(name, container); } - connect(container, &Plasma::DataContainer::dataUpdated, - this, &Multiplexer::playerUpdated); + if (m_activeName == name) { + bool isPaused = containerPlaybackStatus == QLatin1String("Paused"); + bool isStopped = !isPaused && containerPlaybackStatus != QLatin1String("Playing"); + if (isPaused && !m_playing.isEmpty()) { + setBestActive(); + } else if (isStopped && (!m_playing.isEmpty() || !m_paused.isEmpty())) { + setBestActive(); + } else { + makeActive = true; + } + } if (makeActive) { - m_activeName = container->objectName(); + m_activeName = name; replaceData(container->data()); checkForUpdate(); emit activePlayerChanged(container); } } +void Multiplexer::addPlayer(PlayerContainer *container) +{ + evaluatePlayer(container); + + connect(container, &Plasma::DataContainer::dataUpdated, + this, &Multiplexer::playerUpdated); +} + void Multiplexer::removePlayer(const QString &name) { PlayerContainer *container = m_playing.take(name); @@ -100,93 +124,38 @@ void Multiplexer::playerUpdated(const QString &name, const Plasma::DataEngine::Data &newData) { - if (newData.value(QStringLiteral("PlaybackStatus")) == QLatin1String("Playing")) { - if (!m_playing.contains(name)) { - PlayerContainer *container = m_paused.take(name); - if (!container) { - container = m_stopped.take(name); - } - Q_ASSERT(container); - m_playing.insert(name, container); - } - if (m_activeName != name && - data().value(QStringLiteral("PlaybackStatus")) != QLatin1String("Playing")) { - m_activeName = name; - replaceData(newData); - checkForUpdate(); - emit activePlayerChanged(activePlayer()); - return; - } - } else if (newData.value(QStringLiteral("PlaybackStatus")) == QLatin1String("Paused")) { - if (!m_paused.contains(name)) { - PlayerContainer *container = m_playing.take(name); - if (!container) { - container = m_stopped.take(name); - } - Q_ASSERT(container); - m_paused.insert(name, container); - } - if (m_activeName != name && - data().value(QStringLiteral("PlaybackStatus")) != QLatin1String("Playing") && - data().value(QStringLiteral("PlaybackStatus")) != QLatin1String("Paused")) { - m_activeName = name; - replaceData(newData); - checkForUpdate(); - emit activePlayerChanged(activePlayer()); - return; - } - } else { - if (!m_stopped.contains(name)) { - PlayerContainer *container = m_playing.take(name); - if (!container) { - container = m_paused.take(name); - } - Q_ASSERT(container); - m_stopped.insert(name, container); - } - } - - if (m_activeName == name) { - bool isPaused = newData.value(QStringLiteral("PlaybackStatus")) == QLatin1String("Paused"); - bool isStopped = !isPaused && newData.value(QStringLiteral("PlaybackStatus")) != QLatin1String("Playing"); - if (isPaused && !m_playing.isEmpty()) { - setBestActive(); - } else if (isStopped && (!m_playing.isEmpty() || !m_paused.isEmpty())) { - setBestActive(); - } else { - replaceData(newData); - checkForUpdate(); - } - } + Q_UNUSED(name); + Q_UNUSED(newData); + evaluatePlayer(qobject_cast(sender())); } void Multiplexer::setBestActive() { - QHash::const_iterator it = m_playing.constBegin(); + PlayerContainer *container = nullptr; + + auto it = m_playing.constBegin(); if (it != m_playing.constEnd()) { - m_activeName = it.key(); - replaceData(it.value()->data()); - emit activePlayerChanged(it.value()); + container = *it; } else { it = m_paused.constBegin(); if (it != m_paused.constEnd()) { - m_activeName = it.key(); - replaceData(it.value()->data()); - emit activePlayerChanged(it.value()); + container = *it; } else { it = m_stopped.constBegin(); if (it != m_stopped.constEnd()) { - m_activeName = it.key(); - replaceData(it.value()->data()); - emit activePlayerChanged(it.value()); - } else { - m_activeName = QString(); - removeAllData(); - emit activePlayerChanged(nullptr); + container = *it; } } } - checkForUpdate(); + + if (container) { + m_activeName = container->objectName(); + replaceData(container->data()); + checkForUpdate(); + } else { + m_activeName.clear(); + removeAllData(); + } } void Multiplexer::replaceData(const Plasma::DataEngine::Data &data)