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
31namespace 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
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
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
The DatafieldRef class is similar to the ChannelRef, but points to a specific Datafield instead of to...
QString getDatafieldValue()
Definition TermNode.cpp:130
void literalClicked(int)
void drawNode(QRectF boundingBox) override
Draws the node.
Definition TermNode.cpp:117
void newValueString(QString newValue)
~TermNode() override
Definition TermNode.cpp:112
void graphicsItemClicked()
Definition TermNode.cpp:275
void checksTableSelectionChanged()
Definition TermNode.cpp:284
void newLiteralValue(bool truthy)
void setTermEvaluationState(TermImplPtr term)
Definition TermNode.cpp:149
void updateValueString(const QString &valueString)
Definition TermNode.cpp:304
void drawEdge(QLineF line) override
Draws an edge to this node.
Definition TermNode.cpp:124
TermNode(TermTreeGraphicsScene *scene, QTableWidget *checksTable, TermImplPtr term, int conditionId, IceManagerPtr manager, ConditionHandlerInterfacePrx handler)
Definition TermNode.cpp:37
void setSize(QSize nodeSize)
Sets size of node.
Definition TreeNode.h:110
virtual void drawEdge(QLineF line)
Draws an edge to this node.
Definition TreeNode.cpp:255
TreeNode(QGraphicsScene *scene, QSize nodeSize=TreeNode::DefaultNodeSize)
Constructs a tree node as part of a Qt visualizable tree.
Definition TreeNode.cpp:36
#define ARMARX_INFO
The normal logging level.
Definition Logging.h:181
This file offers overloads of toIce() and fromIce() functions for STL container types.
IceInternal::Handle< Variant > VariantPtr
Definition Variant.h:41
IceInternal::Handle< TermImpl > TermImplPtr
Typedef of TermImplPtr as IceInternal::Handle<TermImpl> for convenience.
Definition TermImpl.h:41
IceUtil::Handle< IceManager > IceManagerPtr
IceManager smart pointer.
Definition ArmarXFwd.h:39
IceInternal::Handle< DataFieldIdentifier > DataFieldIdentifierPtr
Typedef of DataFieldIdentifierPtr as IceInternal::Handle<DataFieldIdentifier> for convenience.
IceInternal::Handle< LiteralImpl > LiteralImplPtr
Typedef of LiteralImplPtr as IceInternal::Handle<LiteralImpl> for convenience.