PeriDyno 1.2.1
Loading...
Searching...
No Matches
WtModuleFlowWidget.cpp
Go to the documentation of this file.
2
3
4WtModuleFlowWidget::WtModuleFlowWidget(std::shared_ptr<dyno::SceneGraph> scene)
5 : WtFlowWidget(scene)
6{
7 this->mouseWentDown().connect(this, &WtModuleFlowWidget::onMouseWentDown);
8 this->mouseMoved().connect(this, &WtModuleFlowWidget::onMouseMove);
9 this->mouseWentUp().connect(this, &WtModuleFlowWidget::onMouseWentUp);
10}
11
13
14void WtModuleFlowWidget::onMouseWentDown(const Wt::WMouseEvent& event)
15{
16 if (mNode == nullptr)
17 return;
18
19 isDragging = true;
20 mLastMousePos = Wt::WPointF(event.widget().x, event.widget().y);
21 mLastDelta = Wt::WPointF(0, 0);
22 if (!checkMouseInAllRect(Wt::WPointF(event.widget().x, event.widget().y)))
23 {
24 selectType = -1;
25 selectedNum = 0;
26 canMoveNode = false;
27 update();
28 }
29 if (selectType > 0)
30 {
31 auto origin = moduleMap[selectedNum]->flowNodeData().getNodeOrigin();
32 mTranslateNode = Wt::WPointF(origin.x(), origin.y());
34 {
35 drawLineFlag = true;
36
37 // change module
38 if (moduleMap.find(selectedNum) != moduleMap.end())
39 {
40 mOutModule = moduleMap.find(selectedNum)->second->getModule();
41 }
42
43
44 /* if (outPoint.portType == PortType::In)
45 {
46 auto existConnection = moduleMap[selectedNum]->getIndexConnection(outPoint.portIndex);
47 if (existConnection != nullptr)
48 {
49 auto outNode = existConnection->getNode(PortType::Out);
50 for (auto it = mScene->begin(); it != mScene->end(); it++)
51 {
52 auto m = it.get();
53 auto node = moduleMap[m->objectId()];
54 auto outPortIndex = existConnection->getPortIndex(PortType::Out);
55 auto exportPortsData = outNode->flowNodeData().getPointsData();
56 connectionPointData exportPointData;
57 for (auto point : exportPortsData)
58 {
59 if (point.portIndex == outPortIndex)
60 {
61 exportPointData = point;
62 break;
63 }
64 }
65
66 if (node == outNode)
67 {
68 for (auto it = sceneConnections.begin(); it != sceneConnections.end(); )
69 {
70 if (it->exportNode == mOutNode && it->inportNode == m && it->inPoint.portIndex == outPoint.portIndex && it->outPoint.portIndex == exportPointData.portIndex)
71 {
72 it = sceneConnections.erase(it);
73 }
74 else
75 {
76 ++it;
77 }
78 }
79
80 disconnect(m, mOutNode, outPoint, exportPointData, nodeMap[selectedNum], outNode);
81 sourcePoint = getPortPosition(outNode->flowNodeData().getNodeOrigin(), exportPointData);
82
83 }
84 }
85
86 }
87 }*/
88 }
89 else
90 {
91 selectType = 2;
92 }
93 }
94}
95
96void WtModuleFlowWidget::onMouseMove(const Wt::WMouseEvent& event)
97{
98 if (mNode == nullptr)
99 return;
100
101 sinkPoint = Wt::WPointF(event.widget().x / mZoomFactor - mTranslate.x(), event.widget().y / mZoomFactor - mTranslate.y());
102
103 if (isDragging && selectType < 0)
104 {
105 Wt::WPointF delta = Wt::WPointF(event.dragDelta().x, event.dragDelta().y);
106 mTranslate = Wt::WPointF(mTranslate.x() + delta.x() - mLastDelta.x(), mTranslate.y() + delta.y() - mLastDelta.y());
107 update();
108 mLastDelta = delta;
109 }
110 else if (isDragging && selectType > 0)
111 {
112 Wt::WPointF delta = Wt::WPointF(event.dragDelta().x, event.dragDelta().y);
113 mTranslateNode = Wt::WPointF(mTranslateNode.x() + delta.x() - mLastDelta.x(), mTranslateNode.y() + delta.y() - mLastDelta.y());
114 update();
115 mLastDelta = delta;
116 }
117 else
118 {
119 auto mlist = mNode->getModuleList();
120 auto mousePoint = Wt::WPointF(event.widget().x, event.widget().y);
121 for (const auto& module : mlist)
122 {
123 if (moduleMap.find(module->objectId()) != moduleMap.end())
124 {
125 auto m = moduleMap[module->objectId()];
126 auto moduleData = m->flowNodeData();
127 if (checkMouseInRect(mousePoint, moduleData) && selectType != 2)
128 {
129 selectType = 1;
130 //connectionOutNode = node;
131 selectedNum = module->objectId();
132 canMoveNode = true;
133 update();
134 break;
135 }
136 }
137
138 }
139 }
140}
141
142void WtModuleFlowWidget::onMouseWentUp(const Wt::WMouseEvent& event)
143{
144 if (mNode == nullptr)
145 return;
146
147 isDragging = false;
148 mLastDelta = Wt::WPointF(0, 0);
149 Wt::WPointF mouseWentUpPosition = Wt::WPointF(event.widget().x, event.widget().y);
150 if (selectType > 0)
151 {
152 auto node = moduleMap[selectedNum];
153 auto nodeData = node->flowNodeData();
154
156
157 Wt::WPointF mousePoint = Wt::WPointF(event.widget().x, event.widget().y);
158 if (!checkMouseInAllRect(mousePoint) && selectType == 2)
159 {
160 selectType = -1;
161 selectedNum = 0;
162 canMoveNode = false;
163 update();
164 _updateCanvas.emit();
165 }
166 }
167 else
168 {
169 _selectNodeSignal.emit(-1);
170 }
171
172 drawLineFlag = false;
173 update();
174}
175
177{
178 if (mNode == nullptr)
179 return;
180
181 return;
182}
183
184void WtModuleFlowWidget::setNode(std::shared_ptr<dyno::Node> node)
185{
186 mNode = node;
187 update();
188}
189
194
195void WtModuleFlowWidget::moveModule(WtNode& n, const Wt::WPointF& newLocation)
196{
197 WtModuleWidget* mw = dynamic_cast<WtModuleWidget*>(n.nodeDataModel());
198
199 auto m = mw == nullptr ? nullptr : mw->getModule();
200
201 if (m != nullptr)
202 {
203 m->setBlockCoord(newLocation.x(), newLocation.y());
204 }
205}
206
207void WtModuleFlowWidget::paintEvent(Wt::WPaintDevice* paintDevice)
208{
209 Wt::WPainter painter(paintDevice);
210 painter.scale(mZoomFactor, mZoomFactor);
211 painter.translate(mTranslate);
212
213 if (mNode != nullptr)
214 {
215 if (reorderFlag)
216 {
218 mModuleFlowScene->reorderAllModules();
219 reorderFlag = false;
220 }
221
223 moduleMap = mModuleFlowScene->getNodeMap();
224 }
225
226 if (isDragging && selectType > 0 && !drawLineFlag)
227 {
228 auto node = moduleMap[selectedNum];
230 }
231
232 if (drawLineFlag)
233 {
234 //drawSketchLine(&painter, sourcePoint, sinkPoint);
235 }
236}
237
238bool WtModuleFlowWidget::checkMouseInAllRect(Wt::WPointF mousePoint)
239{
240 auto mlist = mNode->getModuleList();
241 for (const auto& module : mlist)
242 {
243 if (moduleMap.find(module->objectId()) != moduleMap.end())
244 {
245 auto m = moduleMap[module->objectId()];
246 auto moduleData = m->flowNodeData();
247 if (checkMouseInRect(mousePoint, moduleData))
248 {
249 selectedNum = module->objectId();
250 canMoveNode = true;
251 return true;
252 }
253 }
254 return false;
255 }
256}
@ out
Wt::Signal _updateCanvas
WtFlowWidget(std::shared_ptr< dyno::SceneGraph > scene)
Wt::WPointF mTranslateNode
Wt::WPointF mLastDelta
bool checkMouseInRect(Wt::WPointF mousePoint, WtFlowNodeData nodeData)
Wt::WPointF sinkPoint
Wt::Signal< int > _selectNodeSignal
Wt::WPointF mLastMousePos
double mZoomFactor
Wt::WPointF mTranslate
bool checkMouseInPoints(Wt::WPointF mousePoint, WtFlowNodeData nodeData, PortState portState)
bool checkMouseInAllRect(Wt::WPointF mousePoint)
void onKeyWentDown() override
void onMouseMove(const Wt::WMouseEvent &event) override
WtModuleFlowScene * mModuleFlowScene
WtModuleFlowWidget(std::shared_ptr< dyno::SceneGraph > scene)
std::map< dyno::ObjectId, WtNode * > moduleMap
void moveModule(WtNode &n, const Wt::WPointF &newLocation)
void setNode(std::shared_ptr< dyno::Node > node)
std::shared_ptr< dyno::Node > mNode
void onMouseWentDown(const Wt::WMouseEvent &event) override
std::shared_ptr< dyno::Module > mOutModule
void onMouseWentUp(const Wt::WMouseEvent &event) override
void paintEvent(Wt::WPaintDevice *paintDevice)
std::shared_ptr< Module > getModule()
WtNodeDataModel * nodeDataModel() const
Definition WtNode.cpp:727