SimpleApi.hpp
1 #pragma once
2 #include <Process/GenericProcessFactory.hpp>
3 
4 #include <Control/Widgets.hpp>
5 #include <Engine/Node/CommonWidgets.hpp>
6 #include <Engine/Node/Executor.hpp>
7 #include <Engine/Node/Inspector.hpp>
8 #include <Engine/Node/Layer.hpp>
9 #include <Engine/Node/Process.hpp>
10 
11 #include <score/plugins/qt_interfaces/FactoryInterface_QtInterface.hpp>
12 #include <score/plugins/qt_interfaces/PluginRequirements_QtInterface.hpp>
13 
14 #include <ossia/detail/concepts.hpp>
15 #include <ossia/detail/for_each.hpp>
16 
17 #define make_uuid(text) score::uuids::string_generator::compute((text))
18 #if defined(_MSC_VER)
19 #define uuid_constexpr inline
20 #else
21 #define uuid_constexpr constexpr
22 #endif
23 
24 namespace Control
25 {
26 
27 template <typename Item>
28 concept HasItem = requires { &Item::item; } || requires { Item{}.item(0); }
29  || requires { sizeof(typename Item::Layer); };
30 
31 struct Meta_base : public ossia::safe_nodes::base_metadata
32 {
33  static const constexpr Process::ProcessFlags flags = Process::ProcessFlags(
34  Process::ProcessFlags::SupportsLasting | Process::ProcessFlags::ControlSurface);
35 };
36 
37 template <typename Node>
39 
40 template <typename Node>
41 struct ExecutorFactory final
42  : public Execution::ProcessComponentFactory_T<Executor<Node>>
43 {
44  using Execution::ProcessComponentFactory_T<Executor<Node>>::ProcessComponentFactory_T;
45 };
46 
47 template <typename Node>
48 using LayerFactory = ControlLayerFactory<Node>;
49 
50 template <typename... Nodes>
51 std::vector<score::InterfaceBase*>
52 instantiate_fx(const score::ApplicationContext& ctx, const score::InterfaceKey& key)
53 {
54  std::vector<score::InterfaceBase*> vec;
55  if(key == Execution::ProcessComponentFactory::static_interfaceKey())
56  {
57  (vec.emplace_back(
59  ...);
60  }
61  else if(key == Process::ProcessModelFactory::static_interfaceKey())
62  {
63  (vec.emplace_back(
65  ...);
66  }
67  else if(key == Process::LayerFactory::static_interfaceKey())
68  {
69  ossia::for_each_tagged(boost::mp11::mp_list<Nodes...>{}, [&](auto t) {
70  using type = typename decltype(t)::type;
71  if constexpr(HasItem<type>)
72  {
73  vec.emplace_back((Process::LayerFactory*)new Control::LayerFactory<type>());
74  }
75  });
76  }
77  return vec;
78 }
79 
80 struct Note
81 {
82  uint8_t pitch{};
83  uint8_t vel{};
84  uint8_t chan{};
85 };
86 
87 template <typename T>
91 {
92  static constexpr score::PluginKey static_key() { return T::Metadata::uuid; }
93 
94  constexpr score::PluginKey key() const final override { return static_key(); }
95 
96  score::Version version() const override { return score::Version{1}; }
97 
98  score_generic_plugin() = default;
99  ~score_generic_plugin() override = default;
100 
101  std::vector<score::InterfaceBase*> factories(
102  const score::ApplicationContext& ctx,
103  const score::InterfaceKey& key) const override
104  {
105  return Control::instantiate_fx<T>(ctx, key);
106  }
107 
108  std::vector<score::PluginKey> required() const override { return {}; }
109 };
110 }
Definition: Process/Execution/ProcessComponent.hpp:119
Definition: Process/Execution/ProcessComponent.hpp:102
Definition: score-lib-process/Process/ProcessFactory.hpp:58
Definition: GenericProcessFactory.hpp:15
The ProcessFactory class.
Definition: score-lib-process/Process/ProcessFactory.hpp:35
Definition: UuidKey.hpp:343
Definition: FactoryInterface_QtInterface.hpp:19
Definition: PluginRequirements_QtInterface.hpp:18
Represents the version of a plug-in.
Definition: Version.hpp:13
ProcessFlags
Various settings for processes.
Definition: ProcessFlags.hpp:17
Definition: SimpleApi.hpp:43
Definition: SimpleApi.hpp:32
Definition: SimpleApi.hpp:81
Definition: SimpleApi.hpp:91
Used to access all the application-wide state and structures.
Definition: ApplicationContext.hpp:24