Plasma

datacontainer.h
1 /*
2  SPDX-FileCopyrightText: 2006-2007 Aaron Seigo <[email protected]>
3 
4  SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6 
7 #ifndef PLASMA_DATACONTAINER_H
8 #define PLASMA_DATACONTAINER_H
9 
10 #include <QHash>
11 #include <QObject>
12 #include <QTimer>
13 
14 #include <KJob>
15 #include <plasma/dataengine.h>
16 #include <plasma/plasma_export.h>
17 
18 class QAbstractItemModel;
19 
20 namespace Plasma
21 {
22 class DataContainerPrivate;
23 
24 /**
25  * @class DataContainer plasma/datacontainer.h <Plasma/DataContainer>
26  *
27  * @brief A set of data exported via a DataEngine
28  *
29  * Plasma::DataContainer wraps the data exported by a DataEngine
30  * implementation, providing a generic wrapper for the data.
31  *
32  * A DataContainer may have zero or more associated pieces of data which
33  * are keyed by strings. The data itself is stored as QVariants. This allows
34  * easy and flexible retrieval of the information associated with this object
35  * without writing DataContainer or DataEngine specific code in visualizations.
36  *
37  * If you are creating your own DataContainer objects (and are passing them to
38  * DataEngine::addSource()), you normally just need to listen to the
39  * updateRequested() signal (as well as any other methods you might have of
40  * being notified of new data) and call setData() to actually update the data.
41  * Then you need to either trigger the scheduleSourcesUpdated signal of the
42  * parent DataEngine or call checkForUpdate() on the DataContainer.
43  *
44  * You also need to set a suitable name for the source with setObjectName().
45  * See DataEngine::addSource() for more information.
46  *
47  * Note that there is normally no need to subclass DataContainer, except as
48  * a way of encapsulating the data retrieval for a source, since all notifications
49  * are done via signals rather than virtual methods.
50  **/
51 class PLASMA_EXPORT DataContainer : public QObject
52 {
53  friend class DataEngine;
54  friend class DataEnginePrivate;
55  Q_OBJECT
56 
57 public:
58  /**
59  * Constructs a default DataContainer that has no name or data
60  * associated with it
61  **/
62  explicit DataContainer(QObject *parent = nullptr);
63  ~DataContainer() override;
64 
65  /**
66  * Returns the data for this DataContainer
67  **/
68  const DataEngine::Data data() const;
69 
70  /**
71  * Set a value for a key.
72  *
73  * This also marks this source as needing to signal an update.
74  *
75  * If you call setData() directly on a DataContainer, you need to
76  * either trigger the scheduleSourcesUpdated() slot for the
77  * data engine it belongs to or call checkForUpdate() on the
78  * DataContainer.
79  *
80  * @param key a string used as the key for the data
81  * @param value a QVariant holding the actual data. If a invalid
82  * QVariant is passed in and the key currently exists in the
83  * data, then the data entry is removed
84  **/
85  void setData(const QString &key, const QVariant &value);
86 
87  /**
88  * Removes all data currently associated with this source
89  *
90  * If you call removeAllData() on a DataContainer, you need to
91  * either trigger the scheduleSourcesUpdated() slot for the
92  * data engine it belongs to or call checkForUpdate() on the
93  * DataContainer.
94  **/
95  void removeAllData();
96 
97  /**
98  * Associates a model with this DataContainer. Use this for data
99  * that is intended to be a long list of items.
100  *
101  * The ownership of the model is transferred to the DataContainer,
102  * so the model will be deleted when a new one is set or when the
103  * DataContainer itself is deleted, so it will be deleted when there won't be any
104  * visualization associated to this source.
105  *
106  * Normally you should set the model from DataEngine::setModel instead from here.
107  *
108  * @param model the model that will be associated with this DataContainer
109  */
110  void setModel(QAbstractItemModel *model);
111 
112  /**
113  * @return the model owned by this DataSource
114  */
115  QAbstractItemModel *model();
116 
117  /**
118  * @return true if the visualization is currently connected
119  */
120  bool visualizationIsConnected(QObject *visualization) const;
121 
122  /**
123  * Connects an object to this DataContainer.
124  *
125  * May be called repeatedly for the same visualization without
126  * side effects
127  *
128  * @param visualization the object to connect to this DataContainer
129  * @param pollingInterval the time in milliseconds between updates
130  * @param alignment the clock position to align updates to
131  **/
132  void connectVisualization(QObject *visualization, uint pollingInterval, Plasma::Types::IntervalAlignment alignment);
133 
134  /**
135  * sets this data container to be automatically stored.
136  * @param whether this data container should be stored
137  * @since 4.6
138  */
139  void setStorageEnabled(bool store);
140 
141  /**
142  * @return true if the data container has been marked for storage
143  * @since 4.6
144  */
145  bool isStorageEnabled() const;
146 
147  /**
148  * @return true if the data container has been updated, but not stored
149  */
150  bool needsToBeStored() const;
151 
152  /**
153  * sets that the data container needs to be stored or not.
154  * @param whether the data container needs to be stored
155  */
156  void setNeedsToBeStored(bool store);
157 
158  /**
159  * @return the DataEngine that the DataContainer is
160  * a child of.
161  */
162  DataEngine *getDataEngine();
163 
164  /**
165  * @return true if one or more visualizations is connected to this DataContainer
166  */
167  bool isUsed() const;
168 
169 public Q_SLOTS:
170  /**
171  * Disconnects an object from this DataContainer.
172  *
173  * Note that if this source was created by DataEngine::sourceRequestEvent(),
174  * it will be deleted by DataEngine once control returns to the event loop.
175  **/
176  void disconnectVisualization(QObject *visualization);
177 
178  /**
179  * Forces immediate update signals to all visualizations
180  * @since 4.4
181  */
182  void forceImmediateUpdate();
183 
184 Q_SIGNALS:
185  /**
186  * Emitted when the data has been updated, allowing visualizations to
187  * reflect the new data.
188  *
189  * Note that you should not normally emit this directly. Instead, use
190  * checkForUpdate() or the DataEngine::scheduleSourcesUpdated() slot.
191  *
192  * @param source the objectName() of the DataContainer (and hence the name
193  * of the source) that updated its data
194  * @param data the updated data
195  **/
196  void dataUpdated(const QString &source, const Plasma::DataEngine::Data &data);
197 
198  /**
199  * A new model has been associated to this source,
200  * visualizations can safely use it as long they are connected to this source.
201  *
202  * @param source the objectName() of the DataContainer (and hence the name
203  * of the source) that owns the model
204  * @param model the QAbstractItemModel instance
205  */
206  void modelChanged(const QString &source, QAbstractItemModel *model);
207 
208  /**
209  * Emitted when the last visualization is disconnected.
210  *
211  * Note that if this source was created by DataEngine::sourceRequestEvent(),
212  * it will be deleted by DataEngine once control returns to the event loop
213  * after this signal is emitted.
214  *
215  * @param source the name of the source that became unused
216  **/
217  void becameUnused(const QString &source);
218 
219  /**
220  * Emitted when an update is requested.
221  *
222  * If a polling interval was passed connectVisualization(), this signal
223  * will be emitted every time the interval expires.
224  *
225  * Note that if you create your own DataContainer (and pass it to
226  * DataEngine::addSource()), you will need to listen to this signal
227  * and refresh the data when it is triggered.
228  *
229  * @param source the datacontainer the update was requested for. Useful
230  * for classes that update the data for several containers.
231  **/
232  void updateRequested(DataContainer *source);
233 
234 protected:
235  /**
236  * Checks whether any data has changed and, if so, emits dataUpdated().
237  **/
238  void checkForUpdate();
239 
240  /**
241  * Returns how long ago, in msecs, that the data in this container was last updated.
242  *
243  * This is used by DataEngine to compress updates that happen more quickly than the
244  * minimum polling interval by calling setNeedsUpdate() instead of calling
245  * updateSourceEvent() immediately.
246  **/
247  uint timeSinceLastUpdate() const;
248 
249  /**
250  * Indicates that the data should be treated as dirty the next time hasUpdates() is called.
251  *
252  * This is needed for the case where updateRequested() is triggered but we don't want to
253  * update the data immediately because it has just been updated. The second request won't
254  * be fulfilled in this case, because we never updated the data and so never called
255  * checkForUpdate(). So we claim it needs an update anyway.
256  **/
257  void setNeedsUpdate(bool update = true);
258 
259 protected Q_SLOTS:
260  /**
261  * @reimp from QObject
262  */
263  void timerEvent(QTimerEvent *event) override;
264 
265 private:
266  friend class SignalRelay;
267  friend class DataContainerPrivate;
268  friend class DataEngineManager;
269  DataContainerPrivate *const d;
270 
271  Q_PRIVATE_SLOT(d, void storeJobFinished(KJob *job))
272  Q_PRIVATE_SLOT(d, void populateFromStoredData(KJob *job))
273  Q_PRIVATE_SLOT(d, void retrieve())
274 };
275 
276 } // Plasma namespace
277 
278 #endif // multiple inclusion guard
Data provider for plasmoids (Plasma plugins)
Definition: dataengine.h:50
Namespace for everything in libplasma.
Definition: datamodel.cpp:14
A set of data exported via a DataEngine.
Definition: datacontainer.h:51
IntervalAlignment
Possible timing alignments.
Definition: plasma.h:223
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Thu Mar 23 2023 04:18:17 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.