introduce interval alignment, so it is possible to align a time interval to the minute or hour (we can add arbitrary ones to the mix should we choose; e.g. "every 10 mins" or whatever..but there needs to be good use cases =)
this is needed by clocks, as the obvious example, since "once a minute" isn't enough: it needs to be once a minute *on* the minute svn path=/trunk/KDE/kdebase/workspace/libs/plasma/; revision=711737
This commit is contained in:
parent
705e4d9148
commit
e15c950bc3
@ -16,6 +16,7 @@
|
|||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "plasma.h"
|
||||||
#include "datacontainer.h"
|
#include "datacontainer.h"
|
||||||
#include "datacontainer_p.h"
|
#include "datacontainer_p.h"
|
||||||
|
|
||||||
@ -76,11 +77,6 @@ void DataContainer::checkForUpdate()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QObject* DataContainer::signalRelay(QObject *visualization, uint updateInterval) const
|
|
||||||
{
|
|
||||||
return d->signalRelay(this, visualization, updateInterval);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DataContainer::checkUsage()
|
void DataContainer::checkUsage()
|
||||||
{
|
{
|
||||||
if (d->relays.count() < 1 &&
|
if (d->relays.count() < 1 &&
|
||||||
@ -90,7 +86,7 @@ void DataContainer::checkUsage()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DataContainer::connectVisualization(QObject* visualization, uint updateInterval)
|
void DataContainer::connectVisualization(QObject* visualization, uint updateInterval, Plasma::IntervalAlignment alignment)
|
||||||
{
|
{
|
||||||
// kDebug() << "connecting visualization" << (void*)visualization << "at interval of" << updateInterval;
|
// kDebug() << "connecting visualization" << (void*)visualization << "at interval of" << updateInterval;
|
||||||
QMap<QObject *, SignalRelay *>::iterator objIt = d->relayObjects.find(visualization);
|
QMap<QObject *, SignalRelay *>::iterator objIt = d->relayObjects.find(visualization);
|
||||||
@ -105,7 +101,7 @@ void DataContainer::connectVisualization(QObject* visualization, uint updateInte
|
|||||||
visualization, SLOT(updated(QString,Plasma::DataEngine::Data)));
|
visualization, SLOT(updated(QString,Plasma::DataEngine::Data)));
|
||||||
|
|
||||||
if (relay->isUnused()) {
|
if (relay->isUnused()) {
|
||||||
d->relays.erase(d->relays.find(relay->interval));
|
d->relays.erase(d->relays.find(relay->m_interval));
|
||||||
delete relay;
|
delete relay;
|
||||||
}
|
}
|
||||||
// kDebug() << " already connected, but to a relay";
|
// kDebug() << " already connected, but to a relay";
|
||||||
@ -134,7 +130,7 @@ void DataContainer::connectVisualization(QObject* visualization, uint updateInte
|
|||||||
visualization, SLOT(updated(QString,Plasma::DataEngine::Data)));
|
visualization, SLOT(updated(QString,Plasma::DataEngine::Data)));
|
||||||
} else {
|
} else {
|
||||||
// kDebug() << " connecting to a relay";
|
// kDebug() << " connecting to a relay";
|
||||||
connect(signalRelay(visualization, updateInterval),
|
connect(d->signalRelay(this, visualization, updateInterval, alignment),
|
||||||
SIGNAL(updated(QString,Plasma::DataEngine::Data)),
|
SIGNAL(updated(QString,Plasma::DataEngine::Data)),
|
||||||
visualization, SLOT(updated(QString,Plasma::DataEngine::Data)));
|
visualization, SLOT(updated(QString,Plasma::DataEngine::Data)));
|
||||||
}
|
}
|
||||||
@ -154,7 +150,7 @@ void DataContainer::disconnectVisualization(QObject* visualization)
|
|||||||
visualization, SLOT(updated(QString,Plasma::DataEngine::Data)));
|
visualization, SLOT(updated(QString,Plasma::DataEngine::Data)));
|
||||||
|
|
||||||
if (relay->isUnused()) {
|
if (relay->isUnused()) {
|
||||||
d->relays.erase(d->relays.find(relay->interval));
|
d->relays.erase(d->relays.find(relay->m_interval));
|
||||||
delete relay;
|
delete relay;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -80,12 +80,6 @@ class PLASMA_EXPORT DataContainer : public QObject
|
|||||||
**/
|
**/
|
||||||
void checkForUpdate();
|
void checkForUpdate();
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns a QObject that can be used to relay the updated() signal
|
|
||||||
* at a given timing frequency independantly.
|
|
||||||
**/
|
|
||||||
QObject* signalRelay(QObject *visualization, uint updateInterval) const;
|
|
||||||
|
|
||||||
public Q_SLOTS:
|
public Q_SLOTS:
|
||||||
/**
|
/**
|
||||||
* Check if the DataContainer is still in use.
|
* Check if the DataContainer is still in use.
|
||||||
@ -101,7 +95,7 @@ class PLASMA_EXPORT DataContainer : public QObject
|
|||||||
* @param visualization the object to connect to this DataContainer
|
* @param visualization the object to connect to this DataContainer
|
||||||
* @param updateInterval the time in milliseconds between updates
|
* @param updateInterval the time in milliseconds between updates
|
||||||
**/
|
**/
|
||||||
void connectVisualization(QObject* visualization, uint updateInterval);
|
void connectVisualization(QObject* visualization, uint updateInterval, Plasma::IntervalAlignment alignment);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Disconnects an object from this DataContainer.
|
* Disconnects an object from this DataContainer.
|
||||||
|
@ -33,7 +33,8 @@ public:
|
|||||||
: dirty(false)
|
: dirty(false)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
QObject* signalRelay(const DataContainer* dc, QObject *visualization, uint updateInterval);
|
QObject* signalRelay(const DataContainer* dc, QObject *visualization,
|
||||||
|
uint updateInterval, Plasma::IntervalAlignment align);
|
||||||
|
|
||||||
DataEngine::Data data;
|
DataEngine::Data data;
|
||||||
QMap<QObject *, SignalRelay *> relayObjects;
|
QMap<QObject *, SignalRelay *> relayObjects;
|
||||||
@ -46,13 +47,15 @@ class SignalRelay : public QObject
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SignalRelay(DataContainer* parent, DataContainer::Private *data, uint ival)
|
SignalRelay(DataContainer* parent, DataContainer::Private *data, uint ival, Plasma::IntervalAlignment align)
|
||||||
: QObject(parent),
|
: QObject(parent),
|
||||||
dc(parent),
|
dc(parent),
|
||||||
d(data),
|
d(data),
|
||||||
interval(ival)
|
m_interval(ival),
|
||||||
|
m_align(align),
|
||||||
|
m_resetTimer(false)
|
||||||
{
|
{
|
||||||
startTimer(interval);
|
m_timerId = startTimer(m_interval);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isUnused()
|
bool isUnused()
|
||||||
@ -60,9 +63,38 @@ public:
|
|||||||
return receivers(SIGNAL(updated(QString,Plasma::DataEngine::Data))) < 1;
|
return receivers(SIGNAL(updated(QString,Plasma::DataEngine::Data))) < 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void checkAlignment()
|
||||||
|
{
|
||||||
|
int newTime = 0;
|
||||||
|
|
||||||
|
QTime t = QTime::currentTime();
|
||||||
|
if (m_align == Plasma::AlignToMinute) {
|
||||||
|
int seconds = t.second();
|
||||||
|
if (seconds > 2) {
|
||||||
|
newTime = ((60 - seconds) * 1000) + 500;
|
||||||
|
}
|
||||||
|
} else if (m_align == Plasma::AlignToHour) {
|
||||||
|
int minutes = t.minute();
|
||||||
|
int seconds = t.second();
|
||||||
|
if (minutes > 1 || seconds > 10) {
|
||||||
|
newTime = ((60 - minutes) * 1000 * 60) +
|
||||||
|
((60 - seconds) * 1000) + 500;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newTime) {
|
||||||
|
killTimer(m_timerId);
|
||||||
|
m_timerId = startTimer(newTime);
|
||||||
|
m_resetTimer = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
DataContainer *dc;
|
DataContainer *dc;
|
||||||
DataContainer::Private *d;
|
DataContainer::Private *d;
|
||||||
uint interval;
|
uint m_interval;
|
||||||
|
Plasma::IntervalAlignment m_align;
|
||||||
|
int m_timerId;
|
||||||
|
bool m_resetTimer;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void updated(const QString&, const Plasma::DataEngine::Data&);
|
void updated(const QString&, const Plasma::DataEngine::Data&);
|
||||||
@ -70,19 +102,29 @@ signals:
|
|||||||
protected:
|
protected:
|
||||||
void timerEvent(QTimerEvent *event)
|
void timerEvent(QTimerEvent *event)
|
||||||
{
|
{
|
||||||
|
if (m_resetTimer) {
|
||||||
|
killTimer(m_timerId);
|
||||||
|
m_timerId = startTimer(m_interval);
|
||||||
|
m_resetTimer = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_align != Plasma::NoAlignment) {
|
||||||
|
checkAlignment();
|
||||||
|
}
|
||||||
|
|
||||||
emit dc->requestUpdate(dc->objectName());
|
emit dc->requestUpdate(dc->objectName());
|
||||||
emit updated(dc->objectName(), d->data);
|
emit updated(dc->objectName(), d->data);
|
||||||
event->accept();
|
event->accept();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
QObject* DataContainer::Private::signalRelay(const DataContainer* dc, QObject *visualization, uint updateInterval)
|
QObject* DataContainer::Private::signalRelay(const DataContainer* dc, QObject *visualization, uint updateInterval, Plasma::IntervalAlignment align)
|
||||||
{
|
{
|
||||||
QMap<uint, SignalRelay *>::const_iterator relayIt = relays.find(updateInterval);
|
QMap<uint, SignalRelay *>::const_iterator relayIt = relays.find(updateInterval);
|
||||||
SignalRelay *relay = 0;
|
SignalRelay *relay = 0;
|
||||||
|
|
||||||
if (relayIt == relays.end()) {
|
if (relayIt == relays.end()) {
|
||||||
relay = new SignalRelay(const_cast<DataContainer*>(dc), this, updateInterval);
|
relay = new SignalRelay(const_cast<DataContainer*>(dc), this, updateInterval, align);
|
||||||
relays[updateInterval] = relay;
|
relays[updateInterval] = relay;
|
||||||
} else {
|
} else {
|
||||||
relay = relayIt.value();
|
relay = relayIt.value();
|
||||||
|
@ -86,7 +86,7 @@ class DataEngine::Private
|
|||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
void connectSource(DataContainer* s, QObject* visualization, uint updateInterval)
|
void connectSource(DataContainer* s, QObject* visualization, uint updateInterval, Plasma::IntervalAlignment align)
|
||||||
{
|
{
|
||||||
if (updateInterval > 0) {
|
if (updateInterval > 0) {
|
||||||
// never more frequently than allowed, never more than 20 times per second
|
// never more frequently than allowed, never more than 20 times per second
|
||||||
@ -97,7 +97,7 @@ class DataEngine::Private
|
|||||||
updateInterval = updateInterval - (updateInterval % 50);
|
updateInterval = updateInterval - (updateInterval % 50);
|
||||||
}
|
}
|
||||||
|
|
||||||
s->connectVisualization(visualization, updateInterval);
|
s->connectVisualization(visualization, updateInterval, align);
|
||||||
|
|
||||||
QMetaObject::invokeMethod(visualization, "updated",
|
QMetaObject::invokeMethod(visualization, "updated",
|
||||||
Q_ARG(QString, s->objectName()),
|
Q_ARG(QString, s->objectName()),
|
||||||
@ -174,7 +174,8 @@ QStringList DataEngine::sources() const
|
|||||||
return d->sources.keys();
|
return d->sources.keys();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DataEngine::connectSource(const QString& source, QObject* visualization, uint updateInterval) const
|
void DataEngine::connectSource(const QString& source, QObject* visualization,
|
||||||
|
uint updateInterval, Plasma::IntervalAlignment intervalAlignment) const
|
||||||
{
|
{
|
||||||
DataContainer* s = d->requestSource(source);
|
DataContainer* s = d->requestSource(source);
|
||||||
|
|
||||||
@ -182,13 +183,14 @@ void DataEngine::connectSource(const QString& source, QObject* visualization, ui
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
d->connectSource(s, visualization, updateInterval);
|
d->connectSource(s, visualization, updateInterval, intervalAlignment);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DataEngine::connectAllSources(QObject* visualization, uint updateInterval) const
|
void DataEngine::connectAllSources(QObject* visualization, uint updateInterval,
|
||||||
|
Plasma::IntervalAlignment intervalAlignment) const
|
||||||
{
|
{
|
||||||
foreach (DataContainer* s, d->sources) {
|
foreach (DataContainer* s, d->sources) {
|
||||||
d->connectSource(s, visualization, updateInterval);
|
d->connectSource(s, visualization, updateInterval, intervalAlignment);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
#include <kgenericfactory.h>
|
#include <kgenericfactory.h>
|
||||||
|
|
||||||
#include <plasma/plasma_export.h>
|
#include <plasma/plasma_export.h>
|
||||||
|
#include <plasma/plasma.h>
|
||||||
|
|
||||||
namespace Plasma
|
namespace Plasma
|
||||||
{
|
{
|
||||||
@ -94,8 +95,11 @@ class PLASMA_EXPORT DataEngine : public QObject
|
|||||||
* periodic updates from this source. This value is
|
* periodic updates from this source. This value is
|
||||||
* per-visualization and can be handy for items that require
|
* per-visualization and can be handy for items that require
|
||||||
* constant updates such as scrolling graphs or clocks.
|
* constant updates such as scrolling graphs or clocks.
|
||||||
|
* @param intervalAlignedTo the number of ms to aling the interval to
|
||||||
**/
|
**/
|
||||||
Q_INVOKABLE void connectSource(const QString& source, QObject* visualization, uint updateInterval = 0) const;
|
Q_INVOKABLE void connectSource(const QString& source, QObject* visualization,
|
||||||
|
uint updateInterval = 0,
|
||||||
|
Plasma::IntervalAlignment intervalAlignment = NoAlignment) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Connects all sources to an object for data updates. The object must
|
* Connects all sources to an object for data updates. The object must
|
||||||
@ -118,7 +122,8 @@ class PLASMA_EXPORT DataEngine : public QObject
|
|||||||
* per-visualization and can be handy for items that require
|
* per-visualization and can be handy for items that require
|
||||||
* constant updates such as scrolling graphs or clocks.
|
* constant updates such as scrolling graphs or clocks.
|
||||||
**/
|
**/
|
||||||
Q_INVOKABLE void connectAllSources(QObject* viualization, uint updateInterval = 0) const;
|
Q_INVOKABLE void connectAllSources(QObject* viualization, uint updateInterval = 0,
|
||||||
|
Plasma::IntervalAlignment intervalAlignment = NoAlignment) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Disconnects a source to an object that was receiving data updates.
|
* Disconnects a source to an object that was receiving data updates.
|
||||||
|
8
plasma.h
8
plasma.h
@ -86,6 +86,14 @@ enum ZoomLevel { DesktopZoom = 0 /**< Normal desktop usage, plasmoids are painte
|
|||||||
OverviewZoom /**< Groups become icons themselves */
|
OverviewZoom /**< Groups become icons themselves */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Possible timing alignments
|
||||||
|
**/
|
||||||
|
enum IntervalAlignment { NoAlignment = 0,
|
||||||
|
AlignToMinute,
|
||||||
|
AlignToHour };
|
||||||
|
|
||||||
|
|
||||||
enum ItemTypes { AppletType = QGraphicsItem::UserType + 1,
|
enum ItemTypes { AppletType = QGraphicsItem::UserType + 1,
|
||||||
LineEditType = QGraphicsItem::UserType + 2
|
LineEditType = QGraphicsItem::UserType + 2
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user