PeriDyno 1.2.1
Loading...
Searching...
No Matches
WParameterDataNode.cpp
Go to the documentation of this file.
2#include <SceneGraph.h>
3
4std::map<std::string, WParameterDataNode::FieldWidgetMeta> WParameterDataNode::sFieldWidgetMeta{};
5
7 //:table(nullptr)
8{
9 FieldWidgetMeta WRealWidgetMeta
10 {
11 &typeid(float),
13 };
14
15 FieldWidgetMeta WVector3FieldWidgetMeta
16 {
17 &typeid(dyno::Vec3f),
19 };
20
21 FieldWidgetMeta WVector3dFieldWidgetMeta
22 {
23 &typeid(dyno::Vec3d),
25 };
26
27 FieldWidgetMeta WVector3iFieldWidgetMeta
28 {
29 &typeid(dyno::Vec3i),
31 };
32
33 FieldWidgetMeta WVector3uFieldWidgetMeta
34 {
35 &typeid(dyno::Vec3u),
37 };
38
39 FieldWidgetMeta WBoolFieldWidgetMeta
40 {
41 &typeid(bool),
43 };
44
45 FieldWidgetMeta WIntegerFieldWidgetMeta
46 {
47 &typeid(int),
49 };
50
51 FieldWidgetMeta WUIntegerFieldWidgetMeta
52 {
53 &typeid(dyno::uint),
55 };
56
57 FieldWidgetMeta WEnumFieldWidgetMeta
58 {
59 &typeid(dyno::PEnum),
61 };
62
63 FieldWidgetMeta WColorWidgetMeta
64 {
65 &typeid(dyno::Color),
67 };
68
69 FieldWidgetMeta WFileWidgetMeta
70 {
71 &typeid(dyno::FilePath),
73 };
74
75 registerWidget(WRealWidgetMeta);
76 registerWidget(WVector3FieldWidgetMeta);
77 registerWidget(WVector3dFieldWidgetMeta);
78 registerWidget(WVector3iFieldWidgetMeta);
79 registerWidget(WVector3uFieldWidgetMeta);
80 registerWidget(WBoolFieldWidgetMeta);
81 registerWidget(WIntegerFieldWidgetMeta);
82 registerWidget(WUIntegerFieldWidgetMeta);
83 registerWidget(WEnumFieldWidgetMeta);
84 registerWidget(WColorWidgetMeta);
85 registerWidget(WFileWidgetMeta);
86}
87
91
92void WParameterDataNode::setNode(std::shared_ptr<dyno::Node> node)
93{
94 mNode = node;
95 layoutAboutToBeChanged().emit();
96 layoutChanged().emit();
97}
98
99void WParameterDataNode::setModule(std::shared_ptr<dyno::Module> module)
100{
101 mModule = module;
102 layoutAboutToBeChanged().emit();
103 layoutChanged().emit();
104}
105
106int WParameterDataNode::columnCount(const Wt::WModelIndex& parent) const
107{
108 return 2;
109}
110
111int WParameterDataNode::rowCount(const Wt::WModelIndex& parent) const
112{
113 if (mNode != 0)
114 {
115 return mNode->getModuleList().size();
116 }
117 return 0;
118}
119
120Wt::cpp17::any WParameterDataNode::data(const Wt::WModelIndex& index, Wt::ItemDataRole role) const
121{
122 if (mNode != 0 && index.isValid())
123 {
124 auto mod = mNode->getModuleList();
125 auto iter = mod.begin();
126 std::advance(iter, index.row());
127
128 if (role == Wt::ItemDataRole::Display || role == Wt::ItemDataRole::ToolTip)
129 {
130 if (index.column() == 0)
131 {
132 return (*iter)->getName();
133 }
134 if (index.column() == 1)
135 {
136 return (*iter)->getModuleType();
137 }
138 }
139 else if (role == Wt::ItemDataRole::Decoration)
140 {
141 if (index.column() == 0)
142 {
143 return std::string("icons/module.png");
144 }
145 }
146 }
147 return Wt::cpp17::any();
148}
149
150Wt::cpp17::any WParameterDataNode::headerData(int section, Wt::Orientation orientation, Wt::ItemDataRole role) const
151{
152 if (orientation == Wt::Orientation::Horizontal && role == Wt::ItemDataRole::Display) {
153 switch (section) {
154 case 0:
155 return std::string("Module");
156 case 1:
157 return std::string("Type");
158 default:
159 return Wt::cpp17::any();
160 }
161 }
162 else
163 return Wt::cpp17::any();
164}
165
166void WParameterDataNode::createParameterPanel(Wt::WContainerWidget* parameterWidget)
167{
168 parameterWidget->setMargin(0);
169 //parameterWidget->setStyleClass("scrollable-content");
170 auto layout = parameterWidget->setLayout(std::make_unique<Wt::WVBoxLayout>());
171 layout->setContentsMargins(0, 0, 0, 0);
172
173 auto controlPanel = layout->addWidget(std::make_unique<Wt::WPanel>());
174 controlPanel->setTitle("Control Variables");
175 controlPanel->setCollapsible(true);
176 controlPanel->setStyleClass("scrollable-content");
177 controlPanel->setMargin(0);
178 auto controlTable = controlPanel->setCentralWidget(std::make_unique<Wt::WTable>());
179
180 auto statePanel = layout->addWidget(std::make_unique<Wt::WPanel>());
181 statePanel->setTitle("State Variables");
182 statePanel->setCollapsible(true);
183 statePanel->setStyleClass("scrollable-content");
184 //statePanel->setHeight(200);
185 statePanel->setMargin(0);
186 auto stateTable = statePanel->setCentralWidget(std::make_unique<Wt::WTable>());
187
188 std::vector<dyno::FBase*>& fields = mNode->getAllFields();
189 int a = 0;
190 for (dyno::FBase* var : fields)
191 {
192 if (var != nullptr)
193 {
194 if (var->getFieldType() == dyno::FieldTypeEnum::Param)
195 {
196 if (var->getClassName() == std::string("FVar"))
197 {
198 std::string template_name = var->getTemplateName();
199 addScalarFieldWidget(controlTable, var->getObjectName(), var);
200 }
201 }
202 else if (var->getFieldType() == dyno::FieldTypeEnum::State)
203 {
204 addStateFieldWidget(stateTable, var);
205 }
206 }
207 }
208 controlTable->setMargin(10);
209}
210
212{
213 auto table = panel->setCentralWidget(std::make_unique<Wt::WTable>());
214 std::vector<dyno::FBase*>& fields = mModule->getAllFields();
215 int a = 0;
216 for (dyno::FBase* var : fields)
217 {
218 if (var != nullptr)
219 {
220 if (var->getFieldType() == dyno::FieldTypeEnum::Param)
221 {
222 if (var->getClassName() == std::string("FVar"))
223 {
224 std::string template_name = var->getTemplateName();
225 addScalarFieldWidget(table, var->getObjectName(), var);
226 }
227 }
228 else if (var->getFieldType() == dyno::FieldTypeEnum::State)
229 {
230 Wt::log("info") << var->getDescription();
231 }
232 }
233 }
234 table->setMargin(10);
235}
236
238 sFieldWidgetMeta[meta.type->name()] = meta;
239 return 0;
240}
241
243{
244 if (sFieldWidgetMeta.count(name))
245 return &sFieldWidgetMeta.at(name);
246 return nullptr;
247}
248
250{
251 Wt::WContainerWidget* fw = nullptr;
252 std::string template_name = field->getTemplateName();
253 auto reg = getRegistedWidget(template_name);
254
255 if (reg) {
256 fw = reg->constructor(field);
257 }
258
259 return fw;
260}
261
263{
264 changeValue_.emit(1);
265}
266
267void WParameterDataNode::castToDerived(Wt::WContainerWidget* fw)
268{
269
270 if (WRealFieldWidget* realWidget = dynamic_cast<WRealFieldWidget*>(fw))
271 {
272 realWidget->changeValue().connect(this, &WParameterDataNode::emit);
273 }
274 else if (WVector3FieldWidget* vec3fWidget = dynamic_cast<WVector3FieldWidget*>(fw))
275 {
276 vec3fWidget->changeValue().connect(this, &WParameterDataNode::emit);
277 }
278 else if (WVector3iFieldWidget* vec3iWidget = dynamic_cast<WVector3iFieldWidget*>(fw))
279 {
280 vec3iWidget->changeValue().connect(this, &WParameterDataNode::emit);
281 }
282 else if (WBoolFieldWidget* boolWidget = dynamic_cast<WBoolFieldWidget*>(fw))
283 {
284 boolWidget->changeValue().connect(this, &WParameterDataNode::emit);
285 }
286 else if (WIntegerFieldWidget* intWidget = dynamic_cast<WIntegerFieldWidget*>(fw))
287 {
288 intWidget->changeValue().connect(this, &WParameterDataNode::emit);
289 }
290 else if (WUIntegerFieldWidget* intuWidget = dynamic_cast<WUIntegerFieldWidget*>(fw))
291 {
292 intuWidget->changeValue().connect(this, &WParameterDataNode::emit);
293 }
294 else if (WEnumFieldWidget* enumWidget = dynamic_cast<WEnumFieldWidget*>(fw))
295 {
296 enumWidget->changeValue().connect(this, &WParameterDataNode::emit);
297 }
298 else if (WColorWidget* colorWidget = dynamic_cast<WColorWidget*>(fw))
299 {
300 colorWidget->changeValue().connect(this, &WParameterDataNode::emit);
301 }
302 else if (WFileWidget* fileWidget = dynamic_cast<WFileWidget*>(fw))
303 {
304 fileWidget->changeValue().connect(this, &WParameterDataNode::emit);
305 }
306 else
307 {
308 Wt::log("info") << "Error with dynamic_cast!";
309 }
310
311}
312
313void WParameterDataNode::addScalarFieldWidget(Wt::WTable* table, std::string label, dyno::FBase* field, int labelWidth, int widgetWidth)
314{
315 Wt::WContainerWidget* fw = createFieldWidget(field);
316 castToDerived(fw);
317 if (fw)
318 {
319 std::unique_ptr<Wt::WContainerWidget> mWidget(fw);
320 if (fw != nullptr) {
321 int row = table->rowCount();
322 auto cell0 = table->elementAt(row, 0);
323 auto cell1 = table->elementAt(row, 1);
324
325 cell0->addNew<Wt::WText>(label);
326 cell0->setContentAlignment(Wt::AlignmentFlag::Middle);
327 cell0->setWidth(labelWidth);
328
329 cell1->setContentAlignment(Wt::AlignmentFlag::Middle);
330 cell1->setWidth(widgetWidth);
331
332 cell1->addWidget(std::unique_ptr<Wt::WContainerWidget>(std::move(mWidget)));
333 }
334 }
335}
336
338{
339 auto fw = new WStateFieldWidget(field);
340 //castToDerived(fw);
341 fw->changeValue().connect(this, &WParameterDataNode::emit);
342 if (fw)
343 {
344 std::unique_ptr<Wt::WContainerWidget> mWidget(fw);
345 if (fw != nullptr) {
346 int row = table->rowCount();
347 auto cell0 = table->elementAt(row, 0);
348 auto cell1 = table->elementAt(row, 1);
349
350 cell0->addNew<Wt::WText>(field->getObjectName());
351 cell0->setContentAlignment(Wt::AlignmentFlag::Middle);
352 cell0->setWidth(150);
353
354 cell1->setContentAlignment(Wt::AlignmentFlag::Middle);
355 cell1->setWidth(300);
356
357 cell1->addWidget(std::unique_ptr<Wt::WContainerWidget>(std::move(mWidget)));
358 }
359 }
360}
static Wt::WContainerWidget * WBoolFieldWidgetConstructor(dyno::FBase *field)
static Wt::WContainerWidget * WColorWidgetConstructor(dyno::FBase *field)
static Wt::WContainerWidget * WEnumFieldWidgetConstructor(dyno::FBase *field)
static Wt::WContainerWidget * WFileWidgetConstructor(dyno::FBase *field)
Definition WFileWidget.h:21
static Wt::WContainerWidget * WIntegerFieldWidgetConstructor(dyno::FBase *field)
std::shared_ptr< dyno::Node > mNode
static FieldWidgetMeta * getRegistedWidget(const std::string &)
static std::map< std::string, FieldWidgetMeta > sFieldWidgetMeta
void addScalarFieldWidget(Wt::WTable *table, std::string label, dyno::FBase *field, int labelWidth=150, int widgetWidth=300)
static int registerWidget(const FieldWidgetMeta &meta)
virtual int rowCount(const Wt::WModelIndex &parent=Wt::WModelIndex()) const
std::shared_ptr< dyno::Module > mModule
void setModule(std::shared_ptr< dyno::Module > module)
void setNode(std::shared_ptr< dyno::Node > node)
void createParameterPanel(Wt::WContainerWidget *parameterWidget)
Wt::Signal< int > changeValue_
void createParameterPanelModule(Wt::WPanel *panel)
void addStateFieldWidget(Wt::WTable *table, dyno::FBase *field)
void castToDerived(Wt::WContainerWidget *fw)
virtual Wt::cpp17::any data(const Wt::WModelIndex &index, Wt::ItemDataRole role=Wt::ItemDataRole::Display) const
virtual Wt::cpp17::any headerData(int section, Wt::Orientation orientation=Wt::Orientation::Horizontal, Wt::ItemDataRole role=Wt::ItemDataRole::Display) const
virtual int columnCount(const Wt::WModelIndex &parent=Wt::WModelIndex()) const
Wt::WContainerWidget * createFieldWidget(dyno::FBase *field)
static Wt::WContainerWidget * WRealFieldWidgetConstructor(dyno::FBase *field)
static Wt::WContainerWidget * WUIntegerFieldWidgetConstructor(dyno::FBase *field)
static Wt::WContainerWidget * WVector3FieldWidgetConstructor(dyno::FBase *field)
static Wt::WContainerWidget * WVector3iFieldWidgetConstructor(dyno::FBase *field)
std::string getObjectName()
Definition FBase.h:64
virtual const std::string getTemplateName()
Definition FBase.h:61
Vector< uint, 3 > Vec3u
Definition Vector3D.h:96
Vector< int, 3 > Vec3i
Definition Vector3D.h:95
Vector< double, 3 > Vec3d
Definition Vector3D.h:94
Vector< float, 3 > Vec3f
Definition Vector3D.h:93
@ Param
Definition FBase.h:34
@ State
Definition FBase.h:35
unsigned int uint
Definition VkProgram.h:14