GenericProcessFactory.hpp
1 #pragma once
2 #include <Process/ProcessFactory.hpp>
3 
5 #include <score/tools/SafeCast.hpp>
6 
7 namespace Process
8 {
9 struct default_t
10 {
11 };
12 
13 template <typename Model_T>
15 {
16 public:
17  virtual ~ProcessFactory_T() = default;
18 
19  UuidKey<Process::ProcessModel> concreteKey() const noexcept override
20  {
22  }
23  QString prettyName() const noexcept override
24  {
26  }
27  QString category() const noexcept override
28  {
30  }
31  Descriptor descriptor(QString) const noexcept override
32  {
34  }
35  ProcessFlags flags() const noexcept override
36  {
38  }
39 
40  Model_T* make(
41  const TimeVal& duration, const QString& data, const Id<Process::ProcessModel>& id,
42  const score::DocumentContext& ctx, QObject* parent) final override;
43 
44  Model_T* load(
45  const VisitorVariant& vis, const score::DocumentContext& ctx,
46  QObject* parent) final override;
47 };
48 
49 template <typename Model_T>
51  const TimeVal& duration, const QString& data, const Id<Process::ProcessModel>& id,
52  const score::DocumentContext& ctx, QObject* parent)
53 {
54  if constexpr(std::is_constructible_v<
55  Model_T, TimeVal, QString, Id<Process::ProcessModel>, QObject*>)
56  return new Model_T{duration, data, id, parent};
57  else if constexpr(std::is_constructible_v<
59  const score::DocumentContext&, QObject*>)
60  return new Model_T{duration, id, ctx, parent};
61  else
62  return new Model_T{duration, id, parent};
63 }
64 
65 template <typename Model_T>
66 Model_T* ProcessFactory_T<Model_T>::load(
67  const VisitorVariant& vis, const score::DocumentContext& ctx, QObject* parent)
68 {
69  return score::deserialize_dyn(vis, [&](auto&& deserializer) {
70  if constexpr(std::is_constructible_v<
71  Model_T, decltype(deserializer), const score::DocumentContext&,
72  QObject*>)
73  return new Model_T{deserializer, ctx, parent};
74  else
75  return new Model_T{deserializer, parent};
76  });
77 }
78 
79 template <
80  typename Model_T, typename LayerPresenter_T, typename LayerView_T,
81  typename HeaderDelegate_T = default_t>
83 {
84 public:
85  virtual ~LayerFactory_T() = default;
86 
87 private:
88  UuidKey<Process::ProcessModel> concreteKey() const noexcept override
89  {
91  }
92 
93  std::optional<double> recommendedHeight() const noexcept override
94  {
95  if constexpr(bool(LayerPresenter_T::recommendedHeight))
96  {
97  return LayerPresenter_T::recommendedHeight;
98  }
99  return LayerFactory::recommendedHeight();
100  }
101 
102  LayerView_T* makeLayerView(
103  const Process::ProcessModel& viewmodel, const Process::Context& context,
104  QGraphicsItem* parent) const final override
105  {
106  if constexpr(std::is_constructible_v<
107  LayerView_T, const Model_T&, const Process::Context&,
108  QGraphicsItem*>)
109  return new LayerView_T{safe_cast<const Model_T&>(viewmodel), context, parent};
110  else if constexpr(std::is_constructible_v<
111  LayerView_T, const Model_T&, QGraphicsItem*>)
112  return new LayerView_T{safe_cast<const Model_T&>(viewmodel), parent};
113  else
114  return new LayerView_T{parent};
115  }
116 
117  LayerPresenter_T* makeLayerPresenter(
119  const Process::Context& context, QObject* parent) const final override
120  {
121  return new LayerPresenter_T{
122  safe_cast<const Model_T&>(lm), safe_cast<LayerView_T*>(v), context, parent};
123  }
124 
125  bool matches(const UuidKey<Process::ProcessModel>& p) const override
126  {
128  }
129 
130  HeaderDelegate* makeHeaderDelegate(
131  const ProcessModel& model, const Process::Context& ctx,
132  QGraphicsItem* parent) const override
133  {
134  if constexpr(std::is_same_v<HeaderDelegate_T, default_t>)
135  return LayerFactory::makeHeaderDelegate(model, ctx, parent);
136  else
137  return new HeaderDelegate_T{model, ctx};
138  }
139 };
140 
141 template <typename Model_T>
143  : // final :
144  public Process::LayerFactory
145 {
146 public:
147  virtual ~LayerFactory_T() = default;
148 
149 private:
150  UuidKey<Process::ProcessModel> concreteKey() const noexcept override
151  {
153  }
154 
155  bool matches(const UuidKey<Process::ProcessModel>& p) const override
156  {
158  }
159 };
160 
161 template <typename Model_T>
164 }
Definition: HeaderDelegate.hpp:16
Definition: GenericProcessFactory.hpp:83
Definition: score-lib-process/Process/ProcessFactory.hpp:58
Definition: LayerView.hpp:21
Definition: GenericProcessFactory.hpp:15
The ProcessFactory class.
Definition: score-lib-process/Process/ProcessFactory.hpp:35
The Process class.
Definition: score-lib-process/Process/Process.hpp:61
The id_base_t class.
Definition: Identifier.hpp:57
Base classes and tools to implement processes and layers.
Definition: JSONVisitor.hpp:1324
ProcessFlags
Various settings for processes.
Definition: ProcessFlags.hpp:17
Static metadata implementation.
Definition: lib/score/tools/Metadata.hpp:36
Definition: ProcessContext.hpp:12
Definition: score-lib-process/Process/ProcessMetadata.hpp:36
Definition: GenericProcessFactory.hpp:10
Definition: TimeValue.hpp:21
The VisitorVariant struct.
Definition: VisitorInterface.hpp:26
Definition: ObjectMatches.hpp:6
Definition: DocumentContext.hpp:18