TermNode.cpp
Go to the documentation of this file.
1 /*
2 * This file is part of ArmarX.
3 *
4 * ArmarX is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 *
8 * ArmarX is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 * @package ArmarX::Gui::TermNode
17 * @author Kai Welke ( welke at kit dot edu)
18 * @date
19 * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
20 * GNU General Public License
21 */
22 
23 #include "TermNode.h"
24 
28 
30 
31 namespace armarx
32 {
33  const QSize TermNode::LiteralNodeSize(50, 50);
34  const QSize TermNode::ExpressionNodeSize(30, 30);
35  const QSize TermNode::ConditionRootNodeSize(50, 50);
36 
38  QTableWidget* checksTable,
39  TermImplPtr term,
40  int conditionId,
41  IceManagerPtr manager,
42  ConditionHandlerInterfacePrx handler) :
43  TreeNode(scene), conditionId(conditionId), manager(manager), handler(handler)
44  {
45  this->term = term;
46  this->checksTable = checksTable;
47  this->scene = scene;
48 
49  graphicsItem = new TermNodeGraphicsItem(scene, this);
50 
51  // set size
52  switch (term->getType())
53  {
54  case eConditionRoot:
55  {
56  setSize(ConditionRootNodeSize);
57  graphicsItem->setPixmap(QPixmap(":/icons/arrow-right.png"));
58 
59  break;
60  }
61 
62  case eOperation:
63  {
64  setSize(ExpressionNodeSize);
65  graphicsItem->setText(
66  OperationPtr::dynamicCast(term)->getOperationString().c_str());
67  break;
68  }
69 
70  case eLiteral:
71  {
72  setSize(LiteralNodeSize);
73  graphicsItem->setPixmap(QPixmap(":/icons/wave.png"));
74 
75  break;
76  }
77 
78  default:
79  break;
80  }
81 
82  // set tooltip
83  std::stringstream ss;
84  ss << term;
85  graphicsItem->setToolTip(ss.str().c_str());
86 
87  // set color
88  if (term->getValue())
89  {
90  graphicsItem->setColor(Qt::green);
91  }
92  else
93  {
94  graphicsItem->setColor(Qt::red);
95  }
96 
97 
98  // add to scene
99  scene->addItem(graphicsItem);
100  graphicsItem->hide();
101 
102  // update checks table for each literal
103  if (checksTable && (term->getType() == eLiteral))
104  {
105  updateChecksTable(term);
106  }
107 
108  connect(this, SIGNAL(newValueString(QString)), this, SLOT(updateValueString(QString)));
109  connect(this, SIGNAL(newLiteralValue(bool)), this, SLOT(setTermEvaluationState(bool)));
110  }
111 
113  {
114  }
115 
116  void
117  TermNode::drawNode(QRectF boundingBox)
118  {
119  graphicsItem->setRect(boundingBox);
120  graphicsItem->show();
121  }
122 
123  void
124  TermNode::drawEdge(QLineF line)
125  {
126  TreeNode::drawEdge(line);
127  }
128 
129  QString
131  {
132  std::unique_lock lock(dataMutex);
133 
134  try
135  {
136 
137  VariantPtr var = VariantPtr::dynamicCast(curDatafield->getDataField());
138  auto valueString = var->getOutputValueOnly();
139  return QString::fromStdString(valueString);
140  }
141  catch (std::exception& e)
142  {
143  }
144 
145  return "Retrieval Failed";
146  }
147 
148  void
150  {
151  setTermEvaluationState(term->getValue());
152  }
153 
154  void
156  {
157  std::unique_lock lock(dataMutex);
158 
159  if (truthy)
160  {
161  QTableWidgetItem* item = new QTableWidgetItem("true");
162  item->setBackground(Qt::green);
163  checksTable->setItem(literalRow, eStateCol, item);
164  graphicsItem->setColor(Qt::green);
165  }
166  else
167  {
168  QTableWidgetItem* item = new QTableWidgetItem("false");
169  item->setBackground(Qt::red);
170  checksTable->setItem(literalRow, eStateCol, item);
171  graphicsItem->setColor(Qt::red);
172  }
173  }
174 
175  void
176  TermNode::updateChecksTable(TermImplPtr term)
177  {
178  std::unique_lock lock(dataMutex);
179 
180  LiteralImplPtr literal = LiteralImplPtr::dynamicCast(term);
181  CheckConfiguration config = literal->getCheckConfiguration();
182 
183  // insert new row
184  checksTable->insertRow(checksTable->rowCount());
185  literalRow = checksTable->rowCount() - 1;
186 
187  // set datafield value
188  DataFieldIdentifierPtr dataFieldIdentifier =
189  DataFieldIdentifierPtr::dynamicCast(config.dataFieldIdentifier);
190 
191  if (dataFieldIdentifier)
192  {
193  literaldatafieldName = dataFieldIdentifier->getIdentifierStr().c_str();
194  checksTable->setItem(
195  literalRow,
197  new QTableWidgetItem(dataFieldIdentifier->getIdentifierStr().c_str()));
198  ObserverInterfacePrx prx =
199  manager->getProxy<ObserverInterfacePrx>(dataFieldIdentifier->getObserverName());
200 
201  try
202  {
203  if (prx->existsChannel(dataFieldIdentifier->channelName))
204  {
205  curDatafield = new DatafieldRef(
206  prx, dataFieldIdentifier->channelName, dataFieldIdentifier->datafieldName);
207  }
208  }
209  catch (std::exception& e)
210  {
211  ARMARX_INFO << e.what();
212  }
213  }
214  else
215  {
216  curDatafield = NULL;
217  checksTable->setItem(literalRow, eDataFieldCol, new QTableWidgetItem("NULL"));
218  literaldatafieldName = "";
219  }
220 
221  ARMARX_INFO << "updating " << dataFieldIdentifier->getIdentifierStr();
222 
223  // set check type value
224  checksTable->setItem(
225  literalRow, eCheckTypeCol, new QTableWidgetItem(config.checkName.c_str()));
226 
227  // set check parameters
228  ParameterList::iterator iter = config.checkParameters.begin();
229  std::stringstream parameters;
230 
231  while (iter != config.checkParameters.end())
232  {
233  VariantPtr var = VariantPtr::dynamicCast(*iter);
234  parameters << var << ", ";
235  iter++;
236  }
237 
238  checksTable->setItem(
239  literalRow, eParametersCol, new QTableWidgetItem(parameters.str().c_str()));
240 
241  // set check state
243 
244  // connections
245  // from graphicsitem to table
246  connect(graphicsItem, SIGNAL(nodeActivated()), this, SLOT(graphicsItemClicked()));
247  connect(this, SIGNAL(literalClicked(int)), checksTable, SLOT(selectRow(int)));
248 
249  // from table to graphicsitem
250  connect(
251  checksTable, SIGNAL(itemSelectionChanged()), this, SLOT(checksTableSelectionChanged()));
252 
253  // proper size
254  checksTable->resizeColumnsToContents();
255  }
256 
257  void
259  {
260  bool truthy = false;
261  {
262  std::unique_lock lock(dataMutex);
263  truthy = curDatafield && literaldatafieldName ==
264  curDatafield->getDataFieldIdentifier()->getIdentifierStr();
265  }
266 
267  if (truthy)
268  {
269  auto valueString = getDatafieldValue();
270  emit newValueString(valueString);
271  }
272  }
273 
274  void
276  {
277  if (term->getType() == eLiteral)
278  {
279  emit literalClicked(literalRow);
280  }
281  }
282 
283  void
285  {
286  QList<QTableWidgetItem*> selectedItems = checksTable->selectedItems();
287 
288  int size = selectedItems.size();
289 
290  if (size > 0)
291  {
292  QTableWidgetItem* widget = selectedItems.front();
293  int row = checksTable->row(widget);
294 
295  if (row == literalRow)
296  {
297  scene->resetActivation();
298  graphicsItem->activateNodeSilent();
299  }
300  }
301  }
302 
303  void
304  TermNode::updateValueString(const QString& valueString)
305  {
306  std::unique_lock lock(dataMutex);
307  checksTable->setItem(literalRow, eCurrentValueCol, new QTableWidgetItem(valueString));
308  }
309 
310 } // namespace armarx
LiteralImpl.h
armarx::TermNode::literalClicked
void literalClicked(int)
armarx::TermNode::eDataFieldCol
@ eDataFieldCol
Definition: TermNode.h:59
TermNode.h
armarx::TermNode::updateValueString
void updateValueString(const QString &valueString)
Definition: TermNode.cpp:304
armarx::TermNode::setTermEvaluationState
void setTermEvaluationState(TermImplPtr term)
Definition: TermNode.cpp:149
armarx::TermNodeGraphicsItem
Definition: TermNodeGraphicsItem.h:33
armarx::TermNode::eStateCol
@ eStateCol
Definition: TermNode.h:62
armarx::TermNodeGraphicsItem::activateNodeSilent
void activateNodeSilent()
Definition: TermNodeGraphicsItem.cpp:138
armarx::TermTreeGraphicsScene::resetActivation
void resetActivation()
Definition: TermTreeGraphicsScene.h:44
armarx::TermNodeGraphicsItem::setPixmap
void setPixmap(const QPixmap &pixmap)
Definition: TermNodeGraphicsItem.cpp:67
armarx::TermNode::timerEventRun
void timerEventRun()
Definition: TermNode.cpp:258
IceInternal::Handle< TermImpl >
armarx::TermNode::drawEdge
void drawEdge(QLineF line) override
Draws an edge to this node.
Definition: TermNode.cpp:124
armarx::TermNode::drawNode
void drawNode(QRectF boundingBox) override
Draws the node.
Definition: TermNode.cpp:117
armarx::VariantPtr
IceInternal::Handle< Variant > VariantPtr
Definition: Variant.h:41
armarx::TermNode::~TermNode
~TermNode() override
Definition: TermNode.cpp:112
armarx::TermNode::checksTableSelectionChanged
void checksTableSelectionChanged()
Definition: TermNode.cpp:284
armarx::TermNode::eParametersCol
@ eParametersCol
Definition: TermNode.h:61
armarx::TermTreeGraphicsScene
Definition: TermTreeGraphicsScene.h:33
armarx::TermNode::graphicsItemClicked
void graphicsItemClicked()
Definition: TermNode.cpp:275
armarx::TermNode::eCurrentValueCol
@ eCurrentValueCol
Definition: TermNode.h:63
armarx::TermNodeGraphicsItem::setText
void setText(const QString &text)
Definition: TermNodeGraphicsItem.cpp:51
armarx::red
QColor red()
Definition: StyleSheets.h:78
ConditionRoot.h
armarx::TreeNode::drawEdge
virtual void drawEdge(QLineF line)
Draws an edge to this node.
Definition: TreeNode.cpp:255
armarx::VariantType::DatafieldRef
const VariantTypeId DatafieldRef
Definition: DatafieldRef.h:197
Operations.h
ARMARX_INFO
#define ARMARX_INFO
Definition: Logging.h:181
armarx::TermNodeGraphicsItem::setColor
void setColor(const QColor &penColor)
Definition: TermNodeGraphicsItem.cpp:59
armarx::TermNode::TermNode
TermNode(TermTreeGraphicsScene *scene, QTableWidget *checksTable, TermImplPtr term, int conditionId, IceManagerPtr manager, ConditionHandlerInterfacePrx handler)
Definition: TermNode.cpp:37
IceUtil::Handle< IceManager >
TermNodeGraphicsItem.h
armarx::TermNode::newValueString
void newValueString(QString newValue)
armarx::TermNode::getDatafieldValue
QString getDatafieldValue()
Definition: TermNode.cpp:130
armarx::TreeNode::setSize
void setSize(QSize nodeSize)
Sets size of node.
Definition: TreeNode.h:110
armarx
This file offers overloads of toIce() and fromIce() functions for STL container types.
Definition: ArmarXTimeserver.cpp:27
armarx::TermNodeGraphicsItem::setRect
void setRect(QRectF boundingBox)
Definition: TermNodeGraphicsItem.cpp:42
armarx::green
QColor green()
Definition: StyleSheets.h:72
armarx::TermNode::newLiteralValue
void newLiteralValue(bool truthy)
armarx::TreeNode
Definition: TreeNode.h:43
armarx::TermNode::eCheckTypeCol
@ eCheckTypeCol
Definition: TermNode.h:60