• Skip to content
  • Skip to link menu
KDE 4.0 API Reference
  • KDE API Reference
  • API Reference
  • Sitemap
  • Contact Us
 

libplasma

datacontainer.cpp

Go to the documentation of this file.
00001 /*
00002  *   Copyright 2006-2007 Aaron Seigo <aseigo@kde.org>
00003  *
00004  *   This program is free software; you can redistribute it and/or modify
00005  *   it under the terms of the GNU Library General Public License as
00006  *   published by the Free Software Foundation; either version 2, or
00007  *   (at your option) any later version.
00008  *
00009  *   This program is distributed in the hope that it will be useful,
00010  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012  *   GNU General Public License for more details
00013  *
00014  *   You should have received a copy of the GNU Library General Public
00015  *   License along with this program; if not, write to the
00016  *   Free Software Foundation, Inc.,
00017  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
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         // avoid an update if we don't have any data anyways
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     //FIXME: we still assume it's been <24h
00087     //and ignore possible daylight savings changes
00088     return d->updateTs.elapsed();
00089 }
00090 
00091 bool DataContainer::hasUpdates() const
00092 {
00093     if (d->cached) {
00094         //some signalrelay needs us to pretend we did an update
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         // DO NOT CALL ANYTHING AFTER THIS LINE AS IT MAY GET DELETED!
00111         emit unused(objectName());
00112     }
00113 }
00114 
00115 void DataContainer::connectVisualization(QObject* visualization, uint updateInterval, Plasma::IntervalAlignment alignment)
00116 {
00117 //    kDebug() << "connecting visualization" << (void*)visualization << "at interval of" << updateInterval;
00118     QMap<QObject *, SignalRelay *>::iterator objIt = d->relayObjects.find(visualization);
00119     bool connected = objIt != d->relayObjects.end();
00120     if (connected) {
00121         // this visualization is already connected. just adjust the update
00122         // frequency if necessary
00123         SignalRelay *relay = objIt.value();
00124         if (relay) {
00125             // connected to a relay
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 //            kDebug() << "     already connected, but to a relay";
00134         } else if (updateInterval < 1) {
00135             // the visualization was connected already, but not to a relay
00136             // and it still doesn't want to connect to a relay, so we have
00137             // nothing to do!
00138             //kDebug() << "     already connected, nothing to do";
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*)));//, Qt::QueuedConnection);
00149     }
00150 
00151     d->relayObjects[visualization] = 0;
00152 
00153     if (updateInterval < 1) {
00154 //        kDebug() << "    connecting directly";
00155         connect(this, SIGNAL(dataUpdated(QString,Plasma::DataEngine::Data)),
00156                 visualization, SLOT(dataUpdated(QString,Plasma::DataEngine::Data)));
00157     } else {
00158 //        kDebug() << "    connecting to a relay";
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         // it is connected directly to the DataContainer itself
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 } // Plasma namespace
00190 
00191 #include "datacontainer.moc"
00192 #include "datacontainer_p.moc"
00193 

libplasma

Skip menu "libplasma"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

API Reference

Skip menu "API Reference"
  • KWin
  •   KWin Libraries
  • Libraries
  •   libkworkspace
  •   libplasma
  • Plasma
  •   Animators
  •   Applets
  •   Engines
  • Solid Modules
Generated for API Reference by doxygen 1.5.4
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal