27 #include <QMessageBox>
34 #include "../StatechartViewerPlugin/model/stateinstance/DynamicRemoteState.h"
35 #include "../StatechartViewerPlugin/model/stateinstance/RemoteState.h"
36 #include "../StatechartViewerPlugin/view/StatechartView.h"
49 QPointer<TipDialog> tipDialog,
52 mainWindow(mainWindow),
53 treeController(treeController),
54 communicator(communicator),
55 variantInfo(variantInfo),
56 currentProfile(currentProfile),
62 SIGNAL(currentChanged(
int)),
64 SLOT(connectToStateTab(
int)));
71 editState =
menu.addAction(QIcon(
":/icons/accessories-text-editor-6.ico"),
"");
72 deleteState =
menu.addAction(QIcon(
":/icons/delete.ico"),
"Delete State");
73 layoutState =
menu.addAction(QIcon(
":/icons/magic-wand-icon.png"),
"Layout State");
77 menu.addAction(QIcon(
":/statechart-editor/new-endstate.svg"),
"Insert new Endstate");
79 openCode =
menu.addAction(QIcon(
":/icons/cpp.svg"),
"Open C++ Code");
81 for (QAction*
a :
menu.actions())
83 a->setIconVisibleInMenu(
true);
85 connect(
mainWindow->ui->actionEdit_State_Properties,
86 SIGNAL(triggered(
bool)),
97 if (stateInstance->getParent())
99 stateInstance->getParent()->renameSubstate(stateInstance->getInstanceName(),
116 std::dynamic_pointer_cast<statechartmodel::RemoteState>(stateInstance);
124 std::dynamic_pointer_cast<statechartmodel::EndState>(stateInstance);
134 QPoint mouseScreenPos,
135 QPointF mouseItemPos)
141 bool editable =
true;
142 if (stateInstance && stateInstance->getStateClass() &&
143 !stateInstance->getStateClass()->isEditable())
151 editState->setText(
"Edit State " + stateInstance->getInstanceName());
152 deleteState->setEnabled(!!parentState && parentState->isEditable());
153 setstartstate->setEnabled(!!parentState && parentState->isEditable());
158 openCode->setEnabled(!(!stateInstance->getStateClass() || (node && !node->getCppExists())));
161 newEndstate->setEnabled(!(stateInstance->getType() == eFinalState ||
162 stateInstance->getType() == eDynamicRemoteState) &&
163 stateInstance->getStateClass() &&
164 stateInstance->getStateClass()->isEditable());
167 layoutState->setEnabled(!(stateInstance->getType() == eFinalState ||
168 stateInstance->getType() == eDynamicRemoteState ||
169 !stateInstance->getStateClass() ||
170 stateInstance->getStateClass()->getSubstates().size() <= 1));
175 QAction* result =
menu.exec(mouseScreenPos);
188 if (d.exec() == QDialog::Accepted)
195 if (QMessageBox::question(0,
197 "Do you really want to delete state '" +
198 stateInstance->getInstanceName() +
"'?",
202 parentState->removeSubstate(stateInstance);
211 parentState->setStartState(stateInstance);
218 const QString newStateNameBase =
"MyEndState";
219 QString newStateName = newStateNameBase;
221 while (!state->addEndSubstate(newStateName, newStateName, mouseItemPos))
223 newStateName = newStateNameBase +
"_" + QString::number(i);
227 else if (result ==
openCode && stateInstance->getStateClass())
234 treeController->selectNodeByState(stateInstance->getStateClass());
241 QPoint mouseScreenPos,
242 QPointF mouseItemPos)
246 QAction* editTransition =
menu.addAction(
"Edit Transition " + transition->eventName);
247 QAction* enableTransitionCode =
248 menu.addAction(
"Enable Transition Hook for " + transition->eventName);
249 enableTransitionCode->setCheckable(
true);
250 enableTransitionCode->setChecked(transition->transitionUserCode);
255 if (!transition->destinationState || !transition->destinationState->getStateClass() ||
256 !node || !node->getCppExists() || !transition->sourceState)
258 if (!node->getCppExists())
260 enableTransitionCode->setText(enableTransitionCode->text() +
" (no parent cpp)");
262 else if (!transition->sourceState)
264 enableTransitionCode->setText(
"Transition code unavailable for initial transition");
266 else if (transition->destinationState && !transition->destinationState->getStateClass())
268 enableTransitionCode->setText(enableTransitionCode->text() +
269 " (final or unloaded destination state)");
271 enableTransitionCode->setEnabled(
false);
274 QAction* detach =
menu.addAction(
"Detach Transition");
278 if (!transition->sourceState || !transition->destinationState)
280 detach->setEnabled(
false);
283 QAction* setSupportPoint{
nullptr};
284 std::map<QAction*, int> bendMap;
286 if (transition->sourceState && transition->destinationState)
289 bendMap.insert(std::make_pair(
menu.addAction(
"Straighten"), 0));
290 QMenu* bend =
menu.addMenu(
"Bend");
291 bendMap.insert(std::make_pair(bend->addAction(
"Bend Left 10%"), 10));
292 bendMap.insert(std::make_pair(bend->addAction(
"Bend Left 25%"), 25));
293 bendMap.insert(std::make_pair(bend->addAction(
"Bend Left 50%"), 50));
294 bendMap.insert(std::make_pair(bend->addAction(
"Bend Left 100%"), 100));
295 bendMap.insert(std::make_pair(bend->addAction(
"Bend Right 10%"), -10));
296 bendMap.insert(std::make_pair(bend->addAction(
"Bend Right 25%"), -25));
297 bendMap.insert(std::make_pair(bend->addAction(
"Bend Right 50%"), -50));
298 bendMap.insert(std::make_pair(bend->addAction(
"Bend Right 100%"), -100));
299 setSupportPoint =
menu.addAction(
"Set Support Point");
302 QAction* result =
menu.exec(mouseScreenPos);
305 if (result == editTransition)
307 if (transition->destinationState &&
308 transition->destinationState->getType() != eFinalState &&
309 !transition->destinationState->getStateClass())
312 "Transition Editing Error",
313 "Transition editing not possible because destination state is "
314 "not loaded - load statechart group of destination state.");
322 if (d.exec() == QDialog::Accepted)
324 state->setTransitionMapping(transition,
331 else if (result == detach)
333 state->detachTransitionDestination(transition);
339 else if (bendMap.find(result) != bendMap.end())
341 state->bendTransition(transition, 50, bendMap[result]);
343 else if (result == setSupportPoint)
347 if (d.exec() == QDialog::Accepted)
349 state->bendTransition(transition, d.
getU(), d.
getV());
352 else if (result == enableTransitionCode)
354 state->setTransitionUserCodeEnabled(transition, result->isChecked());
355 if (result->isChecked())
358 "Transition functions enable you to execute user code during a transition. "
359 "This is designated for parameter conversion or minor calculations. Do NOT "
360 "execute long running operations in transition functions.\n"
361 "On next saving of the statecharts a pure virtual function will be generated "
362 "in the state of this transition. You need to implement this function. "
363 "Otherwise a compilation error will occur.",
364 "Transition Function",
365 "TransitionFunction");
375 return QList<QString>();
378 QList<QString> result{QString::fromUtf8(
currentProfile->getName().c_str())};
381 while ((profile = profile->getParent()))
383 result.push_back(QString::fromUtf8(profile->getName().c_str()));
415 if (d.exec() == QDialog::Accepted)
428 item =
dynamic_cast<StateItem*
>(transitionItem->parentItem());
429 if (transitionItem && item)
436 if (d.exec() == QDialog::Accepted)
456 StateEditorController::connectToStateTab(
int index)
462 SIGNAL(stateContextMenuRequested(
466 Qt::UniqueConnection);
469 SIGNAL(transitionContextMenuRequested(
474 Qt::UniqueConnection);
475 connect(
mainWindow->ui->actionShow_Subsubstates,
476 SIGNAL(toggled(
bool)),
478 SLOT(showSubSubstates(
bool)));