PeriDyno 1.0.0
Loading...
Searching...
No Matches
WSampleWidget.cpp
Go to the documentation of this file.
1#include "WSampleWidget.h"
2
3#include <Wt/WPushButton.h>
4#include <Wt/WGridLayout.h>
5#include <Wt/WVBoxLayout.h>
6#include <Wt/WImage.h>
7#include <Wt/WLabel.h>
8#include <Wt/WCssDecorationStyle.h>
9
10#include <Platform.h>
11
12#define DECLARE_PERIDYNO_SAMPLE(NAME) \
13 class NAME : public Sample { \
14 public:\
15 std::string name() const {return #NAME;};\
16 std::string thumbnail() const {return std::string("samples/") + #NAME + ".jpg";};\
17 std::string source() const {return getAssetPath() + std::string("python_web_sample/") + #NAME + ".py";};\
18 };
19
20DECLARE_PERIDYNO_SAMPLE(CPD_ClothDrop)
21DECLARE_PERIDYNO_SAMPLE(CPD_ClothOnTable)
22DECLARE_PERIDYNO_SAMPLE(CPD_ClothOverBall_1)
23DECLARE_PERIDYNO_SAMPLE(CPD_ClothOverBall_3)
24DECLARE_PERIDYNO_SAMPLE(CPD_ClothOverBall_6)
25DECLARE_PERIDYNO_SAMPLE(CPD_RealTimeCloth_v1)
26DECLARE_PERIDYNO_SAMPLE(CPD_RealTimeCloth_v2)
27DECLARE_PERIDYNO_SAMPLE(GL_ClothWithCollision)
28
29DECLARE_PERIDYNO_SAMPLE(DualParticle_4Box)
30DECLARE_PERIDYNO_SAMPLE(DualParticle_CollidingFish)
31DECLARE_PERIDYNO_SAMPLE(DualParticle_Fountain)
32DECLARE_PERIDYNO_SAMPLE(DualParticle_Jets)
33
34DECLARE_PERIDYNO_SAMPLE(GL_CapillaryWave)
35DECLARE_PERIDYNO_SAMPLE(GL_GranularMedia)
37DECLARE_PERIDYNO_SAMPLE(GL_OceanPatch)
39
41
43DECLARE_PERIDYNO_SAMPLE(GL_Elasticity)
44DECLARE_PERIDYNO_SAMPLE(GL_Plasticity_Error)
45
46DECLARE_PERIDYNO_SAMPLE(GL_BoxStack)
48DECLARE_PERIDYNO_SAMPLE(GL_CollisionDetectionIn3D)
49DECLARE_PERIDYNO_SAMPLE(GL_CollisionMask)
50DECLARE_PERIDYNO_SAMPLE(GL_FixedJoint)
51
52DECLARE_PERIDYNO_SAMPLE(GL_Semi_Barricade)
53DECLARE_PERIDYNO_SAMPLE(Qt_WaterPouring)
54
55DECLARE_PERIDYNO_SAMPLE(GL_GhostSPH_Error)
56DECLARE_PERIDYNO_SAMPLE(GL_ParticleEmitter)
57DECLARE_PERIDYNO_SAMPLE(GL_ParticleFluid)
58DECLARE_PERIDYNO_SAMPLE(GL_SemiImplicitDensitySolver)
59DECLARE_PERIDYNO_SAMPLE(GL_ViscosityFish)
60
62
64{
65private:
67 {
68 samples.push_back(new CPD_ClothDrop);
69 samples.push_back(new CPD_ClothOnTable);
70 samples.push_back(new CPD_ClothOverBall_1);
71 samples.push_back(new CPD_ClothOverBall_3);
72 samples.push_back(new CPD_ClothOverBall_6);
73 samples.push_back(new CPD_RealTimeCloth_v1);
74 samples.push_back(new CPD_RealTimeCloth_v2);
75 samples.push_back(new GL_ClothWithCollision);
76
77 samples.push_back(new DualParticle_4Box);
78 samples.push_back(new DualParticle_CollidingFish);
79 samples.push_back(new DualParticle_Fountain);
80 samples.push_back(new DualParticle_Jets);
81
82 samples.push_back(new GL_CapillaryWave);
83 samples.push_back(new GL_GranularMedia);
84 samples.push_back(new GL_Ocean);
85 samples.push_back(new GL_OceanPatch);
86 samples.push_back(new GL_Terrain);
87
88 samples.push_back(new Qt_GLTF);
89
90 samples.push_back(new GL_Cloth);
91 samples.push_back(new GL_Elasticity);
92 samples.push_back(new GL_Plasticity_Error);
93
94 samples.push_back(new GL_BoxStack);
95 samples.push_back(new GL_Bricks);
96 samples.push_back(new GL_CollisionDetectionIn3D);
97 samples.push_back(new GL_CollisionMask);
98 samples.push_back(new GL_FixedJoint);
99
100 samples.push_back(new GL_Semi_Barricade);
101 samples.push_back(new Qt_WaterPouring);
102
103 samples.push_back(new GL_GhostSPH_Error);
104 samples.push_back(new GL_ParticleEmitter);
105 samples.push_back(new GL_ParticleFluid);
106 samples.push_back(new GL_SemiImplicitDensitySolver);
107 samples.push_back(new GL_ViscosityFish);
108
109 samples.push_back(new GL_GlfwGUI);
110 //samples.push_back(new DrySand);
111 //samples.push_back(new Elasticity);
112 //samples.push_back(new Fracture);
113 //samples.push_back(new HyperElasticity);
114 //samples.push_back(new MultiFluid);
115 //samples.push_back(new Plasticity);
116 //samples.push_back(new Rod);
117 //samples.push_back(new SFI);
118 //samples.push_back(new SingleFluid);
119 //samples.push_back(new SWE);
120 //samples.push_back(new ViscoPlasticity);
121 //samples.push_back(new WetSand);
122 }
123
124public:
126 {
127 static SampleStore* instance = new SampleStore;
128 return instance;
129 }
130
131 std::vector<Sample*>& getSamples()
132 {
133 return samples;
134 }
135
137 {
138 return samples[idx];
139 }
140
141 void addSample(Sample* sample)
142 {
143 samples.push_back(sample);
144 }
145
146private:
147 std::vector<Sample*> samples;
148};
149
150Wt::WContainerWidget* _createItem(Sample* sample)
151{
152 Wt::WContainerWidget* container = new Wt::WContainerWidget;
153 auto layout = container->setLayout(std::make_unique<Wt::WVBoxLayout>());
154
155 // image
156 auto image = layout->addWidget(std::make_unique<Wt::WImage>(sample->thumbnail()), 0, Wt::AlignmentFlag::Center);
157 image->resize(120, 120);
158 // label
159 auto label = layout->addWidget(std::make_unique<Wt::WLabel>(sample->name()), 0, Wt::AlignmentFlag::Center);
160 // description as tooltip
161 container->setToolTip(sample->description());
162
163 Wt::WCssDecorationStyle style0 = container->decorationStyle();
164 Wt::WCssDecorationStyle style1 = container->decorationStyle();
165 style0.setBackgroundColor(Wt::WColor(200, 200, 200));
166 style0.setForegroundColor(Wt::WColor(50, 50, 50));
167
168 container->setStyleClass("sample-item");
169 image->setStyleClass("sample-item");
170
171 container->mouseWentOver().connect([=]() {
172 container->setDecorationStyle(style0);
173 });
174
175 container->mouseWentOut().connect([=]() {
176 container->setDecorationStyle(style1);
177 });
178
179 return container;
180}
181
183{
184 this->setHeight(Wt::WLength("100%"));
185 this->setOverflow(Wt::Overflow::Auto);
186
187 auto container = std::make_unique<Wt::WContainerWidget>();
188 auto gridLayout = std::make_unique<Wt::WGridLayout>();
189
190 int row = 0;
191 int col = 0;
192
193 for (auto sample : SampleStore::getInstance()->getSamples())
194 {
195 auto item = _createItem(sample);
196 //this->addWidget(std::unique_ptr<Wt::WContainerWidget>(item));
197 gridLayout->addWidget(std::unique_ptr<Wt::WContainerWidget>(item), row, col);
198
199 item->clicked().connect([=]()
200 {
201 m_signal.emit(sample);
202 });
203
204 col++;
205 if (col == 4)
206 {
207 col = 0;
208 row++;
209 }
210 }
211 container->setLayout(std::move(gridLayout));
212 this->addWidget(std::move(container));
213}
214
215Wt::Signal<Sample*>& WSampleWidget::clicked()
216{
217 return m_signal;
218}
Wt::WContainerWidget * _createItem(Sample *sample)
#define DECLARE_PERIDYNO_SAMPLE(NAME)
virtual std::string description() const
virtual std::string name() const =0
virtual std::string thumbnail() const
Sample * getSample(int idx)
std::vector< Sample * > & getSamples()
static SampleStore * getInstance()
std::vector< Sample * > samples
void addSample(Sample *sample)
Wt::Signal< Sample * > & clicked()
Wt::Signal< Sample * > m_signal