StateEditorController.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of ArmarX.
3  *
4  * Copyright (C) 2011-2016, High Performance Humanoid Technologies (H2T), Karlsruhe Institute of Technology (KIT), all rights reserved.
5  *
6  * ArmarX is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  *
10  * ArmarX is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program. If not, see <http://www.gnu.org/licenses/>.
17  *
18  * @package
19  * @author
20  * @date
21  * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
22  * GNU General Public License
23  */
24 #include "StateEditorController.h"
25 
26 #include <QMenu>
27 #include <QMessageBox>
28 
33 
34 #include "../StatechartViewerPlugin/model/stateinstance/DynamicRemoteState.h"
35 #include "../StatechartViewerPlugin/model/stateinstance/RemoteState.h"
36 #include "../StatechartViewerPlugin/view/StatechartView.h"
37 #include "StateTreeController.h"
40 
41 namespace armarx
42 {
43 
45  StateTreeControllerPtr treeController,
46  Ice::CommunicatorPtr communicator,
47  VariantInfoPtr variantInfo,
48  StatechartProfilePtr currentProfile,
49  QPointer<TipDialog> tipDialog,
50  QObject* parent) :
51  QObject(parent),
52  mainWindow(mainWindow),
53  treeController(treeController),
54  communicator(communicator),
55  variantInfo(variantInfo),
56  currentProfile(currentProfile),
57  tipDialog(tipDialog)
58  {
59  if (mainWindow)
60  {
61  connect(mainWindow->getStateTabWidget(),
62  SIGNAL(currentChanged(int)),
63  this,
64  SLOT(connectToStateTab(int)));
65  }
66  else
67  {
68  ARMARX_ERROR_S << "mainwindow ptr must not be NULL";
69  }
70 
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");
74  setstartstate = menu.addAction("Set as initial State");
75 
76  newEndstate =
77  menu.addAction(QIcon(":/statechart-editor/new-endstate.svg"), "Insert new Endstate");
78  replaceState = menu.addAction("Replace State");
79  openCode = menu.addAction(QIcon(":/icons/cpp.svg"), "Open C++ Code");
80  findStateInTree = menu.addAction(QIcon(":/icons/search.svg"), "Find State in Tree");
81  for (QAction* a : menu.actions())
82  {
83  a->setIconVisibleInMenu(true);
84  }
85  connect(mainWindow->ui->actionEdit_State_Properties,
86  SIGNAL(triggered(bool)),
87  this,
88  SLOT(editSelectedState()));
89  }
90 
91  void
93  const StateDialog& d)
94  {
95  statechartmodel::StatePtr state = stateInstance->getStateClass();
96 
97  if (stateInstance->getParent())
98  {
99  stateInstance->getParent()->renameSubstate(stateInstance->getInstanceName(),
101  }
102 
103  if (state)
104  {
105  // ARMARX_INFO_S << "setting class params";
106  // state->setStateName(d.getStateName());
107 
108  state->setDescription(d.getDescription());
109  state->setOutgoingEvents(d.getOutgoingEvents());
110  state->setInputParameters(d.getInputParams());
111  state->setLocalParameters(d.getLocalParams());
112  state->setOutputParameters(d.getOutputParams());
113  }
114 
115  statechartmodel::RemoteStatePtr remoteState =
116  std::dynamic_pointer_cast<statechartmodel::RemoteState>(stateInstance);
117 
118  if (remoteState)
119  {
120  remoteState->proxyName = d.getProxyName();
121  }
122 
124  std::dynamic_pointer_cast<statechartmodel::EndState>(stateInstance);
125 
126  if (endstate)
127  {
128  endstate->setEventName(d.getStateInstanceName());
129  }
130  }
131 
132  void
134  QPoint mouseScreenPos,
135  QPointF mouseItemPos)
136  {
137  if (!stateInstance)
138  {
139  return;
140  }
141  bool editable = true;
142  if (stateInstance && stateInstance->getStateClass() &&
143  !stateInstance->getStateClass()->isEditable())
144  {
145  editable = false;
146  }
147 
148 
149  statechartmodel::StatePtr parentState = stateInstance->getParent();
150  StateTreeNodePtr node = treeController->getNodeByState(stateInstance->getStateClass());
151  editState->setText("Edit State " + stateInstance->getInstanceName());
152  deleteState->setEnabled(!!parentState && parentState->isEditable());
153  setstartstate->setEnabled(!!parentState && parentState->isEditable());
154 
155  replaceState->setEnabled(editable);
156 
157 
158  openCode->setEnabled(!(!stateInstance->getStateClass() || (node && !node->getCppExists())));
159 
160 
161  newEndstate->setEnabled(!(stateInstance->getType() == eFinalState ||
162  stateInstance->getType() == eDynamicRemoteState) &&
163  stateInstance->getStateClass() &&
164  stateInstance->getStateClass()->isEditable());
165 
166 
167  layoutState->setEnabled(!(stateInstance->getType() == eFinalState ||
168  stateInstance->getType() == eDynamicRemoteState ||
169  !stateInstance->getStateClass() ||
170  stateInstance->getStateClass()->getSubstates().size() <= 1));
171 
172 
173  replaceState->setEnabled(false);
174 
175  QAction* result = menu.exec(mouseScreenPos);
176 
177  if (result == editState)
178  {
179  StateDialog d(stateInstance,
180  communicator,
181  variantInfo,
183  lockRemoteStates && stateInstance->getType() == eRemoteState ? true
184  : false,
185  !editable,
186  tipDialog);
187 
188  if (d.exec() == QDialog::Accepted)
189  {
190  stateDialogAccepted(stateInstance, d);
191  }
192  }
193  else if (result == deleteState)
194  {
195  if (QMessageBox::question(0,
196  "State deletion",
197  "Do you really want to delete state '" +
198  stateInstance->getInstanceName() + "'?",
201  {
202  parentState->removeSubstate(stateInstance);
203  }
204  }
205  else if (result == layoutState)
206  {
208  }
209  else if (result == setstartstate)
210  {
211  parentState->setStartState(stateInstance);
212  }
213  else if (result == newEndstate)
214  {
215  ARMARX_INFO_S << "Inserting endstate";
216  statechartmodel::StatePtr state = stateInstance->getStateClass();
217  int i = 2;
218  const QString newStateNameBase = "MyEndState";
219  QString newStateName = newStateNameBase;
220 
221  while (!state->addEndSubstate(newStateName, newStateName, mouseItemPos))
222  {
223  newStateName = newStateNameBase + "_" + QString::number(i);
224  i++;
225  }
226  }
227  else if (result == openCode && stateInstance->getStateClass())
228  {
229  StateTreeNodePtr node = treeController->getNodeByState(stateInstance->getStateClass());
230  treeController->openStateCPP(node);
231  }
232  else if (result == findStateInTree && stateInstance->getStateClass())
233  {
234  treeController->selectNodeByState(stateInstance->getStateClass());
235  }
236  }
237 
238  void
241  QPoint mouseScreenPos,
242  QPointF mouseItemPos)
243  {
244  ARMARX_DEBUG_S << "pos: " << mouseItemPos;
245  QMenu menu;
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);
251 
252  StateTreeNodePtr node = treeController->getNodeByState(state);
253 
254 
255  if (!transition->destinationState || !transition->destinationState->getStateClass() ||
256  !node || !node->getCppExists() || !transition->sourceState)
257  {
258  if (!node->getCppExists())
259  {
260  enableTransitionCode->setText(enableTransitionCode->text() + " (no parent cpp)");
261  }
262  else if (!transition->sourceState)
263  {
264  enableTransitionCode->setText("Transition code unavailable for initial transition");
265  }
266  else if (transition->destinationState && !transition->destinationState->getStateClass())
267  {
268  enableTransitionCode->setText(enableTransitionCode->text() +
269  " (final or unloaded destination state)");
270  }
271  enableTransitionCode->setEnabled(false);
272  }
273 
274  QAction* detach = menu.addAction("Detach Transition");
275  //QAction* insertPoint = menu.addAction("Insert Support Point");
276  //insertPoint->setEnabled(false);
277 
278  if (!transition->sourceState || !transition->destinationState)
279  {
280  detach->setEnabled(false);
281  }
282 
283  QAction* setSupportPoint{nullptr};
284  std::map<QAction*, int> bendMap;
285 
286  if (transition->sourceState && transition->destinationState)
287  {
288  menu.addSeparator();
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");
300  }
301 
302  QAction* result = menu.exec(mouseScreenPos);
303 
304 
305  if (result == editTransition)
306  {
307  if (transition->destinationState &&
308  transition->destinationState->getType() != eFinalState &&
309  !transition->destinationState->getStateClass())
310  {
311  QMessageBox::warning(mainWindow,
312  "Transition Editing Error",
313  "Transition editing not possible because destination state is "
314  "not loaded - load statechart group of destination state.");
315  }
316  else
317  {
318 
320  transition, state, getRelevantProfiles(), communicator, variantInfo);
321 
322  if (d.exec() == QDialog::Accepted)
323  {
324  state->setTransitionMapping(transition,
328  }
329  }
330  }
331  else if (result == detach)
332  {
333  state->detachTransitionDestination(transition);
334  }
335  // else if(result == insertPoint)
336  // {
337  // state->addSupportPoint(transition, mouseItemPos);
338  // }
339  else if (bendMap.find(result) != bendMap.end())
340  {
341  state->bendTransition(transition, 50, bendMap[result]);
342  }
343  else if (result == setSupportPoint)
344  {
346 
347  if (d.exec() == QDialog::Accepted)
348  {
349  state->bendTransition(transition, d.getU(), d.getV());
350  }
351  }
352  else if (result == enableTransitionCode)
353  {
354  state->setTransitionUserCodeEnabled(transition, result->isChecked());
355  if (result->isChecked())
356  {
357  tipDialog->showMessage(
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");
366  }
367  }
368  }
369 
370  QList<QString>
372  {
373  if (!currentProfile)
374  {
375  return QList<QString>();
376  }
377 
378  QList<QString> result{QString::fromUtf8(currentProfile->getName().c_str())};
379  auto profile = currentProfile;
380 
381  while ((profile = profile->getParent()))
382  {
383  result.push_back(QString::fromUtf8(profile->getName().c_str()));
384  }
385 
386  return result;
387  }
388 
389  void
391  {
395  ->currentStateview()
396  ->getScene()
397  ->selectedItems()
398  .size() > 0)
399  {
400  StateItem* item = dynamic_cast<StateItem*>(*mainWindow->getStateTabWidget()
401  ->currentStateview()
402  ->getScene()
403  ->selectedItems()
404  .begin());
405 
406  if (item)
407  {
408  StateDialog d(item->getStateInstance(),
409  communicator,
410  variantInfo,
412  item->getStateInstance()->getType() == eRemoteState ? true : false,
413  !item->isEditable(),
414  tipDialog);
415  if (d.exec() == QDialog::Accepted)
416  {
418  }
419  }
420  else
421  {
422  TransitionItem* transitionItem =
423  dynamic_cast<TransitionItem*>(*mainWindow->getStateTabWidget()
424  ->currentStateview()
425  ->getScene()
426  ->selectedItems()
427  .begin());
428  item = dynamic_cast<StateItem*>(transitionItem->parentItem());
429  if (transitionItem && item)
430  {
431  TransitionDialog d(transitionItem->getTransition(),
432  item->getStateInstance()->getStateClass(),
434  communicator,
435  variantInfo);
436  if (d.exec() == QDialog::Accepted)
437  {
438  item->getStateInstance()->getStateClass()->setTransitionMapping(
439  transitionItem->getTransition(),
443  }
444  }
445  }
446  }
447  }
448 
449  void
451  {
452  lockRemoteStates = lock;
453  }
454 
455  void
456  StateEditorController::connectToStateTab(int index)
457  {
458  if (index != -1 && mainWindow->getStateTabWidget()->currentStateview() &&
460  {
462  SIGNAL(stateContextMenuRequested(
463  statechartmodel::StateInstancePtr, QPoint, QPointF)),
464  this,
466  Qt::UniqueConnection);
467  connect(
469  SIGNAL(transitionContextMenuRequested(
471  this,
474  Qt::UniqueConnection);
475  connect(mainWindow->ui->actionShow_Subsubstates,
476  SIGNAL(toggled(bool)),
478  SLOT(showSubSubstates(bool)));
479  }
480  }
481 
482 } // namespace armarx
armarx::StatechartView::getScene
StateScene * getScene() const
Definition: StatechartView.h:60
armarx::StateEditorController::editState
QAction * editState
Definition: StateEditorController.h:94
armarx::StateTabWidget::currentStateview
StatechartView * currentStateview() const
Definition: StateTabWidget.cpp:49
armarx::TransitionDialog::getMappingToParentStateLocal
statechartmodel::ParameterMappingList getMappingToParentStateLocal() const
Definition: TransitionDialog.cpp:68
armarx::StateEditorController::editSelectedState
void editSelectedState()
Definition: StateEditorController.cpp:390
armarx::StateEditorController::replaceState
QAction * replaceState
Definition: StateEditorController.h:100
armarx::SetSupportPointDialog::getV
int getV()
Definition: SetSupportPointDialog.cpp:53
armarx::StateEditorController::getRelevantProfiles
QList< QString > getRelevantProfiles() const
Definition: StateEditorController.cpp:371
armarx::StateTreeNodePtr
std::shared_ptr< StateTreeNode > StateTreeNodePtr
Definition: StatechartGroupDefs.h:31
index
uint8_t index
Definition: EtherCATFrame.h:59
armarx::StateDialog::getProxyName
QString getProxyName() const
Definition: StateDialog.cpp:283
armarx::StateEditorController::communicator
Ice::CommunicatorPtr communicator
Definition: StateEditorController.h:88
armarx::statechartmodel::EndStatePtr
std::shared_ptr< EndState > EndStatePtr
Definition: EndState.h:45
armarx::StateItem::getStateInstance
statechartmodel::StateInstancePtr getStateInstance() const
Definition: StateItem.h:66
armarx::StateEditorController::tipDialog
QPointer< TipDialog > tipDialog
Definition: StateEditorController.h:91
StateItem.h
armarx::StateEditorController::StateEditorController
StateEditorController(StatechartEditorMainWindow *mainWindow, StateTreeControllerPtr treeController, Ice::CommunicatorPtr communicator, VariantInfoPtr variantInfo, StatechartProfilePtr currentProfile, QPointer< TipDialog > tipDialog, QObject *parent=0)
Definition: StateEditorController.cpp:44
armarx::StateDialog
Definition: StateDialog.h:51
StateEditorController.h
armarx::StatechartProfilePtr
std::shared_ptr< class StatechartProfile > StatechartProfilePtr
Definition: StatechartContext.h:51
StateDialog.h
armarx::StateEditorController::openCode
QAction * openCode
Definition: StateEditorController.h:101
armarx::statechartmodel::StateInstancePtr
std::shared_ptr< StateInstance > StateInstancePtr
Definition: StateInstance.h:146
armarx::StateEditorController::treeController
StateTreeControllerPtr treeController
Definition: StateEditorController.h:86
IceInternal::Handle<::Ice::Communicator >
armarx::StateDialog::getInputParams
statechartmodel::StateParameterMap getInputParams() const
Definition: StateDialog.cpp:229
armarx::StateEditorController::menu
QMenu menu
Definition: StateEditorController.h:93
armarx::ctrlutil::a
double a(double t, double a0, double j)
Definition: CtrlUtil.h:45
ARMARX_DEBUG_S
#define ARMARX_DEBUG_S
Definition: Logging.h:205
armarx::TransitionDialog
Definition: TransitionDialog.h:42
StateTreeController.h
ARMARX_ERROR_S
#define ARMARX_ERROR_S
Definition: Logging.h:216
armarx::StateEditorController::currentProfile
StatechartProfilePtr currentProfile
Definition: StateEditorController.h:90
armarx::StateEditorController::deleteState
QAction * deleteState
Definition: StateEditorController.h:95
armarx::StateEditorController::findStateInTree
QAction * findStateInTree
Definition: StateEditorController.h:102
armarx::StateEditorController::variantInfo
VariantInfoPtr variantInfo
Definition: StateEditorController.h:89
armarx::StateEditorController::stateDialogAccepted
void stateDialogAccepted(statechartmodel::StateInstancePtr stateInstance, const armarx::StateDialog &d)
Definition: StateEditorController.cpp:92
armarx::StateEditorController::setstartstate
QAction * setstartstate
Definition: StateEditorController.h:97
armarx::StatechartEditorMainWindow::getStateTabWidget
StateTabWidget * getStateTabWidget() const
Definition: StatechartEditorMainWindow.cpp:58
armarx::TransitionItem::getTransition
statechartmodel::TransitionCPtr getTransition() const
Definition: TransitionItem.cpp:603
armarx::TransitionItem
Definition: TransitionItem.h:46
TransitionItem.h
armarx::StateDialog::getStateInstanceName
QString getStateInstanceName() const
Definition: StateDialog.cpp:271
armarx::StateDialog::getDescription
QString getDescription() const
Definition: StateDialog.cpp:289
armarx::StatechartEditorMainWindow
Definition: StatechartEditorMainWindow.h:48
armarx::StateEditorController::newEndstate
QAction * newEndstate
Definition: StateEditorController.h:99
No
Introduction Thank you for taking interest in our work and downloading this software This library implements the algorithm described in the paper R R R Klein Efficient RANSAC for Point Cloud Shape in Computer Graphics No
Definition: ReadMe.txt:21
armarx::TransitionDialog::getMappingToNextStateInput
statechartmodel::ParameterMappingList getMappingToNextStateInput() const
Definition: TransitionDialog.cpp:62
armarx::TransitionDialog::getMappingToParentStateOutput
statechartmodel::ParameterMappingList getMappingToParentStateOutput() const
Definition: TransitionDialog.cpp:74
armarx::SetSupportPointDialog
Definition: SetSupportPointDialog.h:36
armarx::StateDialog::getLocalParams
statechartmodel::StateParameterMap getLocalParams() const
Definition: StateDialog.cpp:243
armarx::StateEditorController::mainWindow
StatechartEditorMainWindow * mainWindow
Definition: StateEditorController.h:85
StateTabWidget.h
GfxTL::Yes
OnOff< true > Yes
Definition: OnOff.h:14
armarx::VariantInfoPtr
std::shared_ptr< VariantInfo > VariantInfoPtr
Definition: VariantInfo.h:39
armarx::statechartmodel::TransitionCPtr
std::shared_ptr< const Transition > TransitionCPtr
Definition: Transition.h:91
armarx::statechartmodel::StatePtr
std::shared_ptr< State > StatePtr
Definition: State.h:48
armarx::StateItem
Definition: StateItem.h:58
armarx::SetSupportPointDialog::getU
int getU()
Definition: SetSupportPointDialog.cpp:47
ARMARX_INFO_S
#define ARMARX_INFO_S
Definition: Logging.h:202
SetSupportPointDialog.h
armarx::statechartmodel::RemoteStatePtr
std::shared_ptr< RemoteState > RemoteStatePtr
Definition: RemoteState.h:47
armarx::StateDialog::getOutgoingEvents
statechartmodel::EventList getOutgoingEvents() const
Definition: StateDialog.cpp:295
armarx::StateEditorController::showTransitionContextMenu
void showTransitionContextMenu(statechartmodel::TransitionCPtr transition, statechartmodel::StatePtr state, QPoint mouseScreenPos, QPointF mouseItemPos)
Definition: StateEditorController.cpp:239
TransitionDialog.h
armarx::StatechartEditorMainWindow::layoutState
void layoutState(statechartmodel::StateInstancePtr instance=statechartmodel::StateInstancePtr())
Definition: StatechartEditorMainWindow.cpp:113
armarx::StateEditorController::setLockRemoteStatesByDefault
void setLockRemoteStatesByDefault(bool lock)
Definition: StateEditorController.cpp:450
armarx::StateDialog::getOutputParams
statechartmodel::StateParameterMap getOutputParams() const
Definition: StateDialog.cpp:257
armarx::StateEditorController::layoutState
QAction * layoutState
Definition: StateEditorController.h:96
armarx
This file offers overloads of toIce() and fromIce() functions for STL container types.
Definition: ArmarXTimeserver.cpp:27
armarx::StateEditorController::lockRemoteStates
bool lockRemoteStates
Definition: StateEditorController.h:92
armarx::StateEditorController::showStateContextMenu
void showStateContextMenu(statechartmodel::StateInstancePtr stateInstance, QPoint mouseScreenPos, QPointF mouseItemPos)
Definition: StateEditorController.cpp:133
RoundRectItem::isEditable
bool isEditable() const
Definition: RoundRectItem.cpp:496
armarx::StateTreeControllerPtr
std::shared_ptr< StateTreeController > StateTreeControllerPtr
Definition: StateEditorController.h:43