Rumba C++ SDK
NodeDelegateVirtualPlug.h
Go to the documentation of this file.
1 /*
2 
3  *
4  ***
5  *****
6  ********************* Mercenaries Engineering SARL
7  ***************** Copyright (C) 2022
8  *************
9  ********* http://www.mercenaries-engineering.com
10  ***********
11  **** ****
12  ** **
13 
14 */
15 
16 #pragma once
17 
18 #include "Array.h"
19 #include "Node.h"
20 #include "NodeDelegateRumba.h"
21 #include "Plug.h"
22 #include "Value.h"
23 
24 #include <string>
25 
26 #include <rapidjson/document.h>
27 
28 namespace maquina
29 {
30 
33 {
34  typedef std::function<void(const maquina::Plug&)> plug_callback;
35 
36  VirtualAttribute(const std::string& name_, const maquina::Value& default_value_, const maquina::Value& plug_creation_value_, const std::string& description_,
37  const plug_callback& plug_added_ = plug_callback(), const plug_callback& plug_removed_ = plug_callback())
38  : name(name_)
39  , value_type(default_value_.type_name())
41  , default_value(default_value_)
42  , plug_creation_value(plug_creation_value_)
43  , plug_added(plug_added_)
44  , plug_removed(plug_removed_)
45  {
46  }
47 
48  std::string name, value_type;
49  std::shared_ptr<maquina::AttributeDescriptor> description;
51  std::function<void(const maquina::Plug&)> plug_added, plug_removed;
52 };
53 
54 class DescBuild;
55 
58 class MAQUINA_EXPORT VirtualAttributesStore : public std::enable_shared_from_this<VirtualAttributesStore>
59 {
60 public:
61  typedef std::shared_ptr<std::vector<VirtualAttribute>> Attributes;
62  typedef std::shared_ptr<const std::vector<VirtualAttribute>> AttributesConst;
63 
64 public:
66  bool needsRebuild() const;
67  void reset();
68  Attributes& attributes() const;
69  std::shared_ptr<class AttributeDescriptor> description() const;
70 
71 protected:
72  void _addAttribute(const std::string& name, const maquina::Value& default_value, const maquina::Value& plug_creation_value,
73  const VirtualAttribute::plug_callback& plug_added, const VirtualAttribute::plug_callback& plug_removed, const std::string& description) const;
74  void _addAttribute(const std::string& name, const maquina::Value& default_value,
75  const VirtualAttribute::plug_callback& plug_added, const VirtualAttribute::plug_callback& plug_removed, const std::string& description) const;
76  void _addAttribute(const std::string& name, const std::string& display_name, const maquina::Value& default_value, const maquina::Value& plug_creation_value,
77  const VirtualAttribute::plug_callback& plug_added, const VirtualAttribute::plug_callback& plug_removed, const std::string& description, DescBuild& desc_build) const;
78  void _addAttribute(const std::string& name, const std::string& display_name, const maquina::Value& default_value,
79  const VirtualAttribute::plug_callback& plug_added, const VirtualAttribute::plug_callback& plug_removed, const std::string& description, DescBuild& desc_build) const;
80  void _sortAttributes() const;
81  void _setDescription(std::shared_ptr<class AttributeDescriptor> d) const;
82 
83 private:
84  mutable Attributes _attributes;
85  mutable std::shared_ptr<class AttributeDescriptor> _description;
86 };
87 
90 {
91 public:
92  VirtualAttributeNodeDelegate(const maquina::Node& node, const std::shared_ptr<const VirtualAttributesStore> attribute_store);
93 
94  std::shared_ptr<class AttributeDescriptor> description() const override;
95  virtual int attribute_count() const override;
96  virtual std::shared_ptr<maquina::NodeDelegate::AttributeDelegate> attribute(const maquina::StringView& name) override;
97  std::shared_ptr<maquina::NodeDelegate::AttributeDelegate> concreteAttribute(const maquina::StringView& name);
98  virtual std::shared_ptr<AttributeIteratorDelegate> _attributes_begin() override;
99  virtual std::shared_ptr<AttributeIteratorDelegate> _attributes_end() override;
100 
101 protected:
102  std::shared_ptr<const VirtualAttributesStore> _attribute_store;
103 };
104 
106 class MAQUINA_EXPORT VirtualPlugAttributeDelegate : public maquina::NodeDelegate::AttributeDelegate, public std::enable_shared_from_this<VirtualPlugAttributeDelegate>
107 {
108 public:
109  VirtualPlugAttributeDelegate(const std::shared_ptr<VirtualAttributeNodeDelegate> parent, const VirtualAttribute& attrib);
110  virtual std::shared_ptr<maquina::NodeDelegate> owner() override;
111  virtual std::string name() const override;
112  virtual bool is_mutable() const override;
113  virtual bool is_visible() const override;
114  virtual bool is_animable() const override;
115  virtual bool accepts_overrides() const override;
116  virtual bool is_overridden() const override;
117  virtual void add_override() override;
118  virtual void remove_override() override;
119  virtual maquina::Value value(const maquina::QueryContext& qc=maquina::QueryContext::at_current_frame) const override;
120  virtual maquina::StringView type_name() const override;
121  virtual bool is_plug() const override;
122  virtual maquina::Plug plug() const override;
123  virtual std::shared_ptr<AttributeDescriptor> description() const override;
124  virtual bool has_node_delegate() const override;
125  virtual std::shared_ptr<maquina::NodeDelegate> node_delegate() override;
126  virtual void set_value(const maquina::Value& value, const maquina::ModificationContext& mc = maquina::ModificationContext::undoable) override;
127 
128  std::shared_ptr<maquina::NodeDelegate::Observer> create_observer(const std::function<void()>& function, bool in_interactive = true) override;
129 
130 private:
131  std::shared_ptr<VirtualAttributeNodeDelegate> _owner;
132  VirtualAttribute _attrib;
133 };
134 
155 {
156 public:
157  DescBuild(const maquina::Node& n);
158  void addPlug(const std::string& plug_name, const std::string& display_name);
159  void addPlugs(const maquina::Array& plugs, const std::string& parent_path);
160  void setRefreshPlug(const std::string& plug_name);
161  std::string closeDescription();
162 
163 private:
164  void _collectGroups(rapidjson::Value& parent, const std::string& parent_path, const std::string& parent_pointer);
165  rapidjson::Value& _createGroup(const std::string& name, rapidjson::Value& parent, const std::string& parent_path, const std::string& parent_pointer);
166  rapidjson::Value& _getGroup(const std::string& name);
167  void _addPlug(const std::string& name, rapidjson::Value& parent);
168 
169 private:
170  rapidjson::Document document;
171  std::map<std::string, std::string> group_path_to_pointer;
172 };
173 
174 }
std::shared_ptr< std::vector< VirtualAttribute > > Attributes
Definition: NodeDelegateVirtualPlug.h:61
std::shared_ptr< const VirtualAttributesStore > _attribute_store
Definition: NodeDelegateVirtualPlug.h:102
std::function< void(const maquina::Plug &)> plug_removed
Definition: NodeDelegateVirtualPlug.h:51
std::shared_ptr< const std::vector< VirtualAttribute > > AttributesConst
Definition: NodeDelegateVirtualPlug.h:62
Definition: NodeDelegateVirtualPlug.h:58
std::function< void(const maquina::Plug &)> plug_callback
Definition: NodeDelegateVirtualPlug.h:34
std::function< void(const maquina::Plug &)> plug_added
Definition: NodeDelegateVirtualPlug.h:51
VirtualAttribute(const std::string &name_, const maquina::Value &default_value_, const maquina::Value &plug_creation_value_, const std::string &description_, const plug_callback &plug_added_=plug_callback(), const plug_callback &plug_removed_=plug_callback())
Definition: NodeDelegateVirtualPlug.h:36
This version of the SDK is unstable, i-e, it may change with no warning.
Definition: AddCurveAction.h:20
Definition: ModificationContext.h:21
A node delegate for nodes with virtual attributes.
Definition: NodeDelegateVirtualPlug.h:89
An attribute delegate for a virtual attribute.
Definition: NodeDelegateVirtualPlug.h:106
MAQUINA_EXPORT Value default_value(const maquina::StringView &type_name)
Return the default value of a type.
static const ModificationContext undoable
A static instance of ModificationContext to set undoable values but do not require to be done in a la...
Definition: ModificationContext.h:52
Definition: NodeDelegateRumba.h:32
maquina::Value default_value
Definition: NodeDelegateVirtualPlug.h:50
maquina::Value plug_creation_value
Definition: NodeDelegateVirtualPlug.h:50
An array of values.
Definition: Array.h:26
MAQUINA_EXPORT std::wstring parent_path(const wchar_t *file)
Return a file parent path.
std::shared_ptr< maquina::AttributeDescriptor > description
Definition: NodeDelegateVirtualPlug.h:49
#define MAQUINA_EXPORT
Definition: Export.h:31
A node attribute delegate.
Definition: NodeDelegate.h:216
A node plug.
Definition: Plug.h:59
std::string name
Definition: NodeDelegateVirtualPlug.h:48
Virtual Attributes are shown in a node&#39;s UI, but may not be backed by an actual plug. The plug is created when the value is set (plug is considered overwritten).
Definition: NodeDelegateVirtualPlug.h:32
Definition: NodeDelegateVirtualPlug.h:154
std::string value_type
Definition: NodeDelegateVirtualPlug.h:48
static const QueryContext at_current_frame
Query at the current frame.
Definition: QueryContext.h:36
MAQUINA_EXPORT std::optional< Node > document(const std::string &path, bool comparable=false)
Return the document node associated to that file path.
Definition: QueryContext.h:22
static MAQUINA_EXPORT std::shared_ptr< AttributeDescriptor > get_descriptor(const std::string &desc)
Base class of all Rumba nodes.
Definition: Node.h:37
Base class of all Rumba values.
Definition: Value.h:34