00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "plasma.h"
00021 #include "datacontainer.h"
00022 #include "datacontainer_p.h"
00023
00024 #include <QVariant>
00025
00026 #include <KDebug>
00027
00028 namespace Plasma
00029 {
00030
00031 DataContainer::DataContainer(QObject* parent)
00032 : QObject(parent),
00033 d(new Private())
00034 {
00035 }
00036
00037 DataContainer::~DataContainer()
00038 {
00039 delete d;
00040 }
00041
00042 const DataEngine::Data DataContainer::data() const
00043 {
00044 return d->data;
00045 }
00046
00047 void DataContainer::setData(const QString& key, const QVariant& value)
00048 {
00049 if (value.isNull() || !value.isValid()) {
00050 d->data.remove(key);
00051 } else {
00052 d->data[key] = value;
00053 }
00054
00055 d->dirty = true;
00056 d->updateTs.start();
00057 }
00058
00059 void DataContainer::clearData()
00060 {
00061 if (d->data.count() < 1) {
00062
00063 return;
00064 }
00065
00066 d->data.clear();
00067 d->dirty = true;
00068 d->updateTs.start();
00069 }
00070
00071 void DataContainer::checkForUpdate()
00072 {
00073 if (d->dirty) {
00074 emit dataUpdated(objectName(), d->data);
00075
00076 foreach (SignalRelay* relay, d->relays) {
00077 relay->checkQueueing();
00078 }
00079
00080 d->dirty = false;
00081 }
00082 }
00083
00084 int DataContainer::timeSinceLastUpdate() const
00085 {
00086
00087
00088 return d->updateTs.elapsed();
00089 }
00090
00091 bool DataContainer::hasUpdates() const
00092 {
00093 if (d->cached) {
00094
00095 d->cached = false;
00096 return true;
00097 }
00098 return d->dirty;
00099 }
00100
00101 void DataContainer::setNeedsUpdate(bool update)
00102 {
00103 d->cached = update;
00104 }
00105
00106 void DataContainer::checkUsage()
00107 {
00108 if (d->relays.count() < 1 &&
00109 receivers(SIGNAL(dataUpdated(QString, Plasma::DataEngine::Data))) < 1) {
00110
00111 emit unused(objectName());
00112 }
00113 }
00114
00115 void DataContainer::connectVisualization(QObject* visualization, uint updateInterval, Plasma::IntervalAlignment alignment)
00116 {
00117
00118 QMap<QObject *, SignalRelay *>::iterator objIt = d->relayObjects.find(visualization);
00119 bool connected = objIt != d->relayObjects.end();
00120 if (connected) {
00121
00122
00123 SignalRelay *relay = objIt.value();
00124 if (relay) {
00125
00126 disconnect(relay, SIGNAL(dataUpdated(QString,Plasma::DataEngine::Data)),
00127 visualization, SLOT(dataUpdated(QString,Plasma::DataEngine::Data)));
00128
00129 if (relay->isUnused()) {
00130 d->relays.remove(relay->m_interval);
00131 delete relay;
00132 }
00133
00134 } else if (updateInterval < 1) {
00135
00136
00137
00138
00139 return;
00140 } else {
00141 disconnect(this, SIGNAL(dataUpdated(QString,Plasma::DataEngine::Data)),
00142 visualization, SLOT(dataUpdated(QString,Plasma::DataEngine::Data)));
00143 }
00144 }
00145
00146 if (!connected) {
00147 connect(visualization, SIGNAL(destroyed(QObject*)),
00148 this, SLOT(disconnectVisualization(QObject*)));
00149 }
00150
00151 d->relayObjects[visualization] = 0;
00152
00153 if (updateInterval < 1) {
00154
00155 connect(this, SIGNAL(dataUpdated(QString,Plasma::DataEngine::Data)),
00156 visualization, SLOT(dataUpdated(QString,Plasma::DataEngine::Data)));
00157 } else {
00158
00159 connect(d->signalRelay(this, visualization, updateInterval, alignment),
00160 SIGNAL(dataUpdated(QString,Plasma::DataEngine::Data)),
00161 visualization, SLOT(dataUpdated(QString,Plasma::DataEngine::Data)));
00162 }
00163 }
00164
00165 void DataContainer::disconnectVisualization(QObject* visualization)
00166 {
00167 QMap<QObject *, SignalRelay *>::iterator objIt = d->relayObjects.find(visualization);
00168
00169 if (objIt == d->relayObjects.end() || !objIt.value()) {
00170
00171 disconnect(this, SIGNAL(dataUpdated(QString,Plasma::DataEngine::Data)),
00172 visualization, SLOT(dataUpdated(QString,Plasma::DataEngine::Data)));
00173 } else {
00174 SignalRelay *relay = objIt.value();
00175 disconnect(relay, SIGNAL(dataUpdated(QString,Plasma::DataEngine::Data)),
00176 visualization, SLOT(dataUpdated(QString,Plasma::DataEngine::Data)));
00177
00178 if (relay->isUnused()) {
00179 d->relays.remove(relay->m_interval);
00180 delete relay;
00181 }
00182
00183 }
00184
00185 d->relayObjects.erase(objIt);
00186 checkUsage();
00187 }
00188
00189 }
00190
00191 #include "datacontainer.moc"
00192 #include "datacontainer_p.moc"
00193