swift
listobserver.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (C) 2017 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
5 
6 #ifndef SWIFT_MISC_SHAREDSTATE_LISTOBSERVER_H
7 #define SWIFT_MISC_SHAREDSTATE_LISTOBSERVER_H
8 
9 #include <QMutex>
10 #include <QObject>
11 
14 #include "misc/swiftmiscexport.h"
15 #include "misc/variantlist.h"
16 
18 {
23  class SWIFT_MISC_EXPORT CGenericListObserver : public QObject
24  {
25  Q_OBJECT
26 
27  protected:
29  CGenericListObserver(QObject *parent) : QObject(parent) {}
30 
32  virtual void initialize(IDataLink *);
33 
35  void setFilter(const CVariant &filter);
36 
38  CVariantList allValues() const;
39 
41  int cleanValues();
42 
43  private:
44  void reconstruct();
45  void handleEvent(const CVariant &param);
46  virtual void onGenericElementAdded(const CVariant &value) = 0;
47  virtual void onGenericElementsReplaced(const CVariantList &values) = 0;
48 
49  QSharedPointer<CActiveObserver> m_observer = CActiveObserver::create(this, &CGenericListObserver::handleEvent);
50  CDataLinkConnectionWatcher *m_watcher = nullptr;
51  mutable QMutex m_listMutex;
52  CVariantList m_list;
53  };
54 
61  template <typename T, typename U = CAnyMatch>
63  {
64  protected:
66  CListObserver(QObject *parent) : CGenericListObserver(parent) {}
67 
68  public:
70  virtual void initialize(IDataLink *dataLink) override
71  {
73  if (std::is_same_v<U, CAnyMatch>) { setFilter({}); }
74  }
75 
77  void setFilter(const U &filter) { CGenericListObserver::setFilter(CVariant::from(filter)); }
78 
80  T allValues() const { return CVariant::from(CGenericListObserver::allValues()).template to<T>(); }
81 
83  virtual void onElementAdded(const typename T::value_type &value) = 0;
84 
86  virtual void onElementsReplaced(const T &values) = 0;
87 
88  private:
89  virtual void onGenericElementAdded(const CVariant &value) override final
90  {
91  onElementAdded(value.to<typename T::value_type>());
92  }
93  virtual void onGenericElementsReplaced(const CVariantList &values) override final
94  {
95  onElementsReplaced(values.to<T>());
96  }
97  };
98 } // namespace swift::misc::shared_state
99 
100 #endif // SWIFT_MISC_SHAREDSTATE_LISTOBSERVER_H
Wrapper around QVariant which provides transparent access to CValueObject methods of the contained ob...
Definition: variant.h:66
static CVariant from(T &&value)
Synonym for fromValue().
Definition: variant.h:147
Value object encapsulating a list of variants.
Definition: variantlist.h:29
static auto create(T *parent, F eventHandler)
Factory method.
Non-template base class for CListObserver.
Definition: listobserver.h:24
void setFilter(const CVariant &filter)
Set list filter as variant.
CGenericListObserver(QObject *parent)
Constructor.
Definition: listobserver.h:29
virtual void initialize(IDataLink *)
Subscribe using the given transport mechanism.
CVariantList allValues() const
Get filtered list value as variant list.
Base class for an object that shares state with a corresponding CListMutator subclass object.
Definition: listobserver.h:63
virtual void onElementsReplaced(const T &values)=0
Called when the whole list is updated wholesale.
CListObserver(QObject *parent)
Constructor.
Definition: listobserver.h:66
void setFilter(const U &filter)
Set filter to choose list elements.
Definition: listobserver.h:77
virtual void onElementAdded(const typename T::value_type &value)=0
Called when an element matching the filter is added to the list.
T allValues() const
Get list value containing all elements matching the filter.
Definition: listobserver.h:80
virtual void initialize(IDataLink *dataLink)
Subscribe using the given transport mechanism.
Definition: listobserver.h:70
Utilities for sharing state between multiple objects.
Definition: application.h:48
#define SWIFT_MISC_EXPORT
Export a class or function from the library.