diff --git a/datacontainer.cpp b/datacontainer.cpp index 7b3e9464b..d6b36dcce 100644 --- a/datacontainer.cpp +++ b/datacontainer.cpp @@ -174,6 +174,18 @@ void DataContainer::checkForUpdate() } } +void DataContainer::forceImmediateUpdate() +{ + if (d->dirty) { + d->dirty = false; + emit dataUpdated(objectName(), d->data); + } + + foreach (SignalRelay *relay, d->relays) { + relay->forceImmediateUpdate(); + } +} + uint DataContainer::timeSinceLastUpdate() const { //FIXME: we still assume it's been <24h diff --git a/datacontainer.h b/datacontainer.h index 435e6bbf4..746a957d1 100644 --- a/datacontainer.h +++ b/datacontainer.h @@ -131,6 +131,12 @@ class PLASMA_EXPORT DataContainer : public QObject **/ void disconnectVisualization(QObject *visualization); + /** + * Forces immediate update signals to all visualizations + * @since 4.4 + */ + void forceImmediateUpdate(); + Q_SIGNALS: /** * Emitted when the data has been updated, allowing visualizations to diff --git a/dataengine.cpp b/dataengine.cpp index 65fe352cc..a61c5f835 100644 --- a/dataengine.cpp +++ b/dataengine.cpp @@ -400,6 +400,13 @@ void DataEngine::updateAllSources() scheduleSourcesUpdated(); } +void DataEngine::forceImmediateUpdateOfAllVisualizations() +{ + foreach (DataContainer *source, d->sources) { + source->forceImmediateUpdate(); + } +} + void DataEngine::setIcon(const QString &icon) { d->icon = icon; diff --git a/dataengine.h b/dataengine.h index e8c448e9b..1a60c2aba 100644 --- a/dataengine.h +++ b/dataengine.h @@ -443,6 +443,18 @@ class PLASMA_EXPORT DataEngine : public QObject */ void updateAllSources(); + /** + * Forces an immediate update to all connected sources, even those with + * timeouts that haven't yet expired. This should _only_ be used when + * there was no data available, e.g. due to network non-availability, + * and then it becomes available. Normal changes in data values due to + * calls to updateSource or in the natural progression of the monitored + * object (e.g. CPU heat) should not result in a call to this method! + * + * @since 4.4 + */ + void forceImmediateUpdateOfAllVisualizations(); + private: friend class DataEnginePrivate; friend class DataEngineScript; diff --git a/private/datacontainer_p.cpp b/private/datacontainer_p.cpp index af48719eb..d3551dc33 100644 --- a/private/datacontainer_p.cpp +++ b/private/datacontainer_p.cpp @@ -77,7 +77,7 @@ int SignalRelay::receiverCount() const return receivers(SIGNAL(dataUpdated(QString,Plasma::DataEngine::Data))); } -bool SignalRelay::isUnused() +bool SignalRelay::isUnused() const { return receivers(SIGNAL(dataUpdated(QString,Plasma::DataEngine::Data))) < 1; } @@ -129,6 +129,12 @@ void SignalRelay::checkQueueing() } } +void SignalRelay::forceImmediateUpdate() +{ + emit dataUpdated(dc->objectName(), d->data); + m_queued = false; +} + void SignalRelay::timerEvent(QTimerEvent *event) { if (event->timerId() != m_timerId) { diff --git a/private/datacontainer_p.h b/private/datacontainer_p.h index 416d01e85..63ac68461 100644 --- a/private/datacontainer_p.h +++ b/private/datacontainer_p.h @@ -58,10 +58,11 @@ public: uint ival, Plasma::IntervalAlignment align, bool immediateUpdate); int receiverCount() const; - bool isUnused(); + bool isUnused() const; void checkAlignment(); void checkQueueing(); + void forceImmediateUpdate(); DataContainer *dc; DataContainerPrivate *d;