YARP
Yet Another Robot Platform
 
Loading...
Searching...
No Matches
propertiestable.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2006-2021 Istituto Italiano di Tecnologia (IIT)
3 * SPDX-License-Identifier: LGPL-2.1-or-later
4 */
5
6#include "propertiestable.h"
7#include <QDebug>
8
9
10PropertiesTable::PropertiesTable(Manager *manager,QWidget *parent) :
11 QWidget(parent),
12 currentApplication(nullptr),
13 currentModule(nullptr),
14 appName(nullptr),
15 appDescr(nullptr),
16 appVersion(nullptr),
17 appAuthors(nullptr),
18 appPrefix(nullptr),
19 modName(nullptr),
20 modNode(nullptr),
21 modStdio(nullptr),
22 modWorkDir(nullptr),
23 modPrefix(nullptr),
24 modDeployer(nullptr),
25 modParams(nullptr),
26 manager(manager),
27 nodeCombo(nullptr),
28 deployerCombo(nullptr)
29{
30 auto* lay = new QHBoxLayout(this);
31 propertiesTab = new QTabWidget(this);
32 appProperties = new QTreeWidget(this);
33 moduleProperties = new QTreeWidget(this);
34 moduleDescription = new QTreeWidget(this);
35
36 paramsSignalMapper = new QSignalMapper(this);
37 connect(paramsSignalMapper, SIGNAL(mapped(QWidget*)),
38 this, SLOT(onComboChanged(QWidget*)));
39
40 appProperties->setHeaderLabels(QStringList() << "Property" << "Value");
41 moduleProperties->setHeaderLabels(QStringList() << "Property" << "Value");
42 moduleDescription->setHeaderLabels(QStringList() << "Item" << "Value");
43 lay->addWidget(propertiesTab);
44 setLayout(lay);
45 lay->setMargin(0);
46
47 propertiesTab->addTab(appProperties,"Application Properties");
48}
49
51{
52 if(!propertiesTab){
53 return;
54 }
55 currentModule = nullptr;
56 currentApplication = application;
57 disconnect(appProperties,SIGNAL(itemChanged(QTreeWidgetItem*,int)),this,SLOT(onAppItemChanged(QTreeWidgetItem*,int)));
58 disconnect(appProperties,SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)),this,SLOT(onAppItemDoubleClicked(QTreeWidgetItem*,int)));
59 appProperties->show();
60 moduleProperties->hide();
61 moduleDescription->hide();
62
63 propertiesTab->clear();
64 propertiesTab->addTab(appProperties,"Application Properties");
65 appProperties->clear();
66 if(appProperties->topLevelItemCount() <=0){
67 appName = new QTreeWidgetItem(appProperties,QStringList() << "Name" << application->getName());
68 appDescr = new QTreeWidgetItem(appProperties,QStringList() << "Description" << application->getDescription());
69 appVersion = new QTreeWidgetItem(appProperties,QStringList() << "Version" << application->getVersion());
70 appPrefix = new QTreeWidgetItem(appProperties,QStringList() << "Prefix" << application->getPrefix());
71
72 QString authors;
73 for(int i=0;i<application->authorCount();i++){
74 authors = QString("%1%2;").arg(authors).arg(application->getAuthorAt(i).getName());
75 }
76 appAuthors = new QTreeWidgetItem(appProperties,QStringList() << "Authors" << authors);
77
78 appProperties->addTopLevelItem(appName);
79 appProperties->addTopLevelItem(appDescr);
80 appProperties->addTopLevelItem(appPrefix);
81 appProperties->addTopLevelItem(appVersion);
82 appProperties->addTopLevelItem(appAuthors);
83
84 }
85 connect(appProperties,SIGNAL(itemChanged(QTreeWidgetItem*,int)),this,SLOT(onAppItemChanged(QTreeWidgetItem*,int)));
86 connect(appProperties,SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)),this,SLOT(onAppItemDoubleClicked(QTreeWidgetItem*,int)));
87}
88
89
91{
92 modules.clear();
93 disconnect(moduleProperties,SIGNAL(itemChanged(QTreeWidgetItem*,int)),this,SLOT(onModItemChanged(QTreeWidgetItem*,int)));
94 disconnect(moduleProperties,SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)),this,SLOT(onModItemDoubleClicked(QTreeWidgetItem*,int)));
95
96 currentApplication = nullptr;
97 currentModule = mod;
98 propertiesTab->clear();
99 propertiesTab->addTab(moduleProperties,"Module Properties");
100 propertiesTab->addTab(moduleDescription,"Description");
101 moduleProperties->clear();
102 moduleDescription->clear();
103
104 appProperties->hide();
105 moduleProperties->show();
106 moduleDescription->show();
107
108 modName = new QTreeWidgetItem(moduleProperties,QStringList() << "Name" << mod->getInnerModule()->getName());
109 modNode = new QTreeWidgetItem(moduleProperties,QStringList() << "Node");
110 modStdio = new QTreeWidgetItem(moduleProperties,QStringList() << "Stdio" << mod->getInnerModule()->getStdio());
111 modWorkDir = new QTreeWidgetItem(moduleProperties,QStringList() << "Workdir" << mod->getInnerModule()->getWorkDir());
112 modPrefix = new QTreeWidgetItem(moduleProperties,QStringList() << "Prefix" << mod->getInnerModule()->getBasePrefix());
113 modDeployer = new QTreeWidgetItem(moduleProperties,QStringList() << "Deployer");
114 modParams = new QTreeWidgetItem(moduleProperties,QStringList() << "Parameters" << mod->getInnerModule()->getParam());
115
116 lastPrefix = mod->getInnerModule()->getBasePrefix();
117
118 modStdio->setFlags(modStdio->flags() | Qt::ItemIsEditable);
119 modWorkDir->setFlags(modWorkDir->flags() | Qt::ItemIsEditable);
120 modPrefix->setFlags(modPrefix->flags() | Qt::ItemIsEditable);
121
122 moduleProperties->addTopLevelItem(modName);
123 moduleProperties->addTopLevelItem(modNode);
124 moduleProperties->addTopLevelItem(modStdio);
125 moduleProperties->addTopLevelItem(modWorkDir);
126 moduleProperties->addTopLevelItem(modPrefix);
127 moduleProperties->addTopLevelItem(modDeployer);
128 moduleProperties->addTopLevelItem(modParams);
129
130 if(deployerCombo){
131 delete deployerCombo;
132 deployerCombo = nullptr;
133 }
134
135 if(nodeCombo){
136 delete nodeCombo;
137 nodeCombo = nullptr;
138 }
139 deployerCombo = new QComboBox();
140 nodeCombo = new QComboBox();
141
142 deployerCombo->setEditable(true);
143 nodeCombo->setEditable(true);
144
145 if(compareString(mod->getInnerModule()->getBroker(),"yarpdev")){
146 deployerCombo->addItem("yarpdev");
147 }else{
148 deployerCombo->addItem("local");
149 deployerCombo->addItem("yarprun");
150 }
151
152 if(strlen(mod->getInnerModule()->getBroker())){
153 deployerCombo->setCurrentText(mod->getInnerModule()->getBroker());
154 }else if(compareString(mod->getInnerModule()->getHost(),"localhost")){
155 deployerCombo->setCurrentText("local");
156 }
157 if(mod->getInnerModule()->getNeedDeployer()){
158 deployerCombo->setEditable(false);
159 }
160
161
162 nodeCombo->addItem(mod->getInnerModule()->getHost());
163 if(QString(mod->getInnerModule()->getHost()) != "localhost"){
164 nodeCombo->addItem("localhost");
165 }
166 ResourcePContainer resources = manager->getKnowledgeBase()->getResources();
167 for(auto& resource : resources) {
168 auto* comp = dynamic_cast<Computer*>(resource);
169 if(comp && !compareString(comp->getName(), "localhost")){
170 nodeCombo->addItem(comp->getName());
171 }
172 }
173 connect(nodeCombo, SIGNAL(editTextChanged(QString)), paramsSignalMapper, SLOT(map()));
174 connect(nodeCombo, SIGNAL(currentIndexChanged(int)), paramsSignalMapper, SLOT(map()));
175 paramsSignalMapper->setMapping(nodeCombo,nodeCombo);
176
177 connect(deployerCombo, SIGNAL(editTextChanged(QString)), paramsSignalMapper, SLOT(map()));
178 connect(deployerCombo, SIGNAL(currentIndexChanged(int)), paramsSignalMapper, SLOT(map()));
179 paramsSignalMapper->setMapping(deployerCombo,deployerCombo);
180
181
182
183
184 /*****************************/
185 // Populate parameters
186 for(int i=0;i<mod->getInnerModule()->argumentCount();i++){
188 QTreeWidgetItem *it = new QTreeWidgetItem(modParams,QStringList() << a.getParam());
189 auto* paramCombo = new QComboBox();
190 paramCombo->setEditable(true);
191 paramCombo->addItem(a.getValue());
192 if(strcmp(a.getDefault(),a.getValue()) != 0 ){
193 paramCombo->addItem(a.getDefault());
194 }
195 moduleProperties->setItemWidget(it,1,paramCombo);
196 connect(paramCombo, SIGNAL(editTextChanged(QString)), paramsSignalMapper, SLOT(map()));
197 connect(paramCombo, SIGNAL(currentIndexChanged(int)), paramsSignalMapper, SLOT(map()));
198 paramsSignalMapper->setMapping(paramCombo,paramCombo);
199 }
200 /*****************************/
201
202 moduleProperties->setItemWidget(modDeployer,1,deployerCombo);
203 moduleProperties->setItemWidget(modNode,1,nodeCombo);
204 modParams->setExpanded(true);
205
206
207 QTreeWidgetItem *nameItem = new QTreeWidgetItem(moduleDescription,QStringList() << "Name" << mod->getInnerModule()->getName());
208 QTreeWidgetItem *versionItem = new QTreeWidgetItem(moduleDescription,QStringList() << "Version" << mod->getInnerModule()->getVersion());
209 QTreeWidgetItem *descriptionItem = new QTreeWidgetItem(moduleDescription,QStringList() << "Description" << mod->getInnerModule()->getDescription());
210 QTreeWidgetItem *parametersItem = new QTreeWidgetItem(moduleDescription,QStringList() << "Parameters");
211 for(int i=0;i<mod->getInnerModule()->argumentCount();i++){
213 QTreeWidgetItem *it = new QTreeWidgetItem(parametersItem,QStringList() << a.getParam() << a.getDescription());
214 Q_UNUSED(it);
215
216 }
217
218 QTreeWidgetItem *authorsItem = new QTreeWidgetItem(moduleDescription,QStringList() << "Authors" );
219 for(int i=0;i<mod->getInnerModule()->authorCount();i++){
220 Author a = mod->getInnerModule()->getAuthorAt(i);
221 QTreeWidgetItem *it = new QTreeWidgetItem(authorsItem,QStringList() << a.getName() << a.getEmail());
222 Q_UNUSED(it);
223 }
224
225 QTreeWidgetItem *inputsItem = new QTreeWidgetItem(moduleDescription,QStringList() << "Inputs" );
226 for(int i=0;i<mod->getInnerModule()->inputCount();i++){
227 InputData a = mod->getInnerModule()->getInputAt(i);
228
229 QTreeWidgetItem *type = new QTreeWidgetItem(inputsItem,QStringList() << "Type" << a.getName());
230 QTreeWidgetItem *port = new QTreeWidgetItem(type,QStringList() << "Port" << a.getPort());
231 QTreeWidgetItem *desc = new QTreeWidgetItem(type,QStringList() << "Description" << a.getDescription());
232 QTreeWidgetItem *req = new QTreeWidgetItem(type,QStringList() << "Required" << (a.isRequired() ? "yes" : "no"));
233 Q_UNUSED(port);
234 Q_UNUSED(desc);
235 Q_UNUSED(req);
236 }
237
238 QTreeWidgetItem *outputsItem = new QTreeWidgetItem(moduleDescription,QStringList() << "Outputs" );
239 for(int i=0;i<mod->getInnerModule()->outputCount();i++){
240 OutputData a = mod->getInnerModule()->getOutputAt(i); //TODO controllare
241
242 QTreeWidgetItem *type = new QTreeWidgetItem(outputsItem,QStringList() << "Type" << a.getName());
243 QTreeWidgetItem *port = new QTreeWidgetItem(type,QStringList() << "Port" << a.getPort());
244 QTreeWidgetItem *desc = new QTreeWidgetItem(type,QStringList() << "Description" << a.getDescription());
245 Q_UNUSED(port);
246 Q_UNUSED(desc);
247 }
248
249 moduleDescription->addTopLevelItem(nameItem);
250 moduleDescription->addTopLevelItem(versionItem);
251 moduleDescription->addTopLevelItem(descriptionItem);
252 moduleDescription->addTopLevelItem(parametersItem);
253 moduleDescription->addTopLevelItem(authorsItem);
254 moduleDescription->addTopLevelItem(inputsItem);
255 moduleDescription->addTopLevelItem(outputsItem);
256
257 connect(moduleProperties,SIGNAL(itemChanged(QTreeWidgetItem*,int)),this,SLOT(onModItemChanged(QTreeWidgetItem*,int)));
258 connect(moduleProperties,SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)),this,SLOT(onModItemDoubleClicked(QTreeWidgetItem*,int)));
259
260}
261
262void PropertiesTable::onAppItemChanged(QTreeWidgetItem *it,int col)
263{
264 Qt::ItemFlags tmp = it->flags();
265 if (!(tmp & Qt::ItemIsEditable)) {
266 return;
267 }
268
269 if(currentApplication){
270 currentApplication->setDescription(appDescr->text(1).toLatin1().data());
271 currentApplication->setVersion(appVersion->text(1).toLatin1().data());
272 currentApplication->setPrefix(appPrefix->text(1).toLatin1().data());
273 //manager->getKnowledgeBase()->setApplicationPrefix(currentApplication, appPrefix->text(1).toLatin1().data(), false);
274 }
275
276
277
278 emit modified();
279}
280
282void PropertiesTable::onAppItemDoubleClicked(QTreeWidgetItem *it,int col)
283{
284 Qt::ItemFlags tmp = it->flags();
285 if (appProperties->indexOfTopLevelItem(it) > 0 && col == 1) {
286 it->setFlags(tmp | Qt::ItemIsEditable);
287 } else if (tmp & Qt::ItemIsEditable) {
288 it->setFlags(tmp ^ Qt::ItemIsEditable);
289 }
290}
291
292void PropertiesTable::onModItemChanged(QTreeWidgetItem *it,int col)
293{
294 Qt::ItemFlags tmp = it->flags();
295 if (!(tmp & Qt::ItemIsEditable)) {
296 return;
297 }
298
299
300 if(currentModule){
301 currentModule->getInnerModule()->setStdio(modStdio->text(1).toLatin1().data());
302 currentModule->getInnerModule()->setWorkDir(modWorkDir->text(1).toLatin1().data());
303 if(lastPrefix != modPrefix->text(1)){
304 currentModule->getInnerModule()->setBasePrefix(modPrefix->text(1).toLatin1().data());
305
306 std::string strPrefix;
307 Application* application = manager->getKnowledgeBase()->getApplication();
308 if(application) {
309 strPrefix = std::string(application->getPrefix()) + std::string(modPrefix->text(1).toLatin1().data());
310 for(int j=0; j<currentModule->getInnerModule()->outputCount(); j++){
311 OutputData *output = &currentModule->getInnerModule()->getOutputAt(j);
312
313 for(int i=0; i<application->connectionCount(); i++){
314 Connection con = application->getConnectionAt(i);
315 //std::string strOldFrom = con.from();
316 Connection updatedCon = con;
317 if(con.getCorOutputData()){
318 if(con.getCorOutputData() == output){
319 std::string strFrom = strPrefix + std::string(output->getPort());
320// updatedCon.setFrom(strFrom.c_str());
321// manager->getKnowledgeBase()->updateConnectionOfApplication(application,
322// con, updatedCon);
323
324 for(int k=0;k<currentModule->oPorts.count();k++){
325 for(int h=0; h<currentModule->oPorts.at(k)->getArrows()->count();h++){
326 Arrow *a = currentModule->oPorts.at(k)->getArrows()->at(h);
327 if( a->getTo() == updatedCon.to()){
328 a->updateConnectionFrom(QString(strFrom.c_str()));
329 }
330 }
331 }
332 }
333 }
334 }
335 }
336
337 for(int j=0; j<currentModule->getInnerModule()->inputCount(); j++){
338 InputData *input = &currentModule->getInnerModule()->getInputAt(j);
339 for(int i=0; i<application->connectionCount(); i++){
340 Connection con = application->getConnectionAt(i);
341 Connection updatedCon = con;
342 if(con.getCorInputData()){
343 if(con.getCorInputData() == input){
344 std::string strTo = strPrefix + std::string(input->getPort());
345// updatedCon.setTo(strTo.c_str());
346// manager->getKnowledgeBase()->updateConnectionOfApplication(application,
347// con, updatedCon);
348
349 for(int k=0;k<currentModule->iPorts.count();k++){
350 for(int h=0; h<currentModule->iPorts.at(k)->getArrows()->count();h++){
351 Arrow *a = currentModule->iPorts.at(k)->getArrows()->at(h);
352 if(a->getFrom() == updatedCon.from() ){
353 a->updateConnectionTo(QString(strTo.c_str()));
354 }
355 }
356 }
357 }
358 }
359 }
360 }
361 }
362 manager->getKnowledgeBase()->setModulePrefix(currentModule->getInnerModule(), strPrefix.c_str(), false);
363 }
364
365 for(int i=0;i<modules.count();i++){
366 Module *module = modules.at(i)->getInnerModule();
367 if(!strcmp(module->getName(),currentModule->getInnerModule()->getName())){
368 module->setStdio(currentModule->getInnerModule()->getStdio());
369 module->setWorkDir(currentModule->getInnerModule()->getWorkDir());
370 }
371 }
372 }
373 emit modified();
374}
375
377void PropertiesTable::onModItemDoubleClicked(QTreeWidgetItem *it,int col)
378{
379 Qt::ItemFlags tmp = it->flags();
380 if ((moduleProperties->indexOfTopLevelItem(it) == 2 || moduleProperties->indexOfTopLevelItem(it) == 3 ||
381 moduleProperties->indexOfTopLevelItem(it) == 4) && col == 1) {
382 it->setFlags(tmp | Qt::ItemIsEditable);
383 } else if (tmp & Qt::ItemIsEditable) {
384 it->setFlags(tmp ^ Qt::ItemIsEditable);
385 }
386}
387
388void PropertiesTable::onComboChanged(QWidget *combo)
389{
390 if(combo == deployerCombo){
391 if(currentModule){
392 currentModule->getInnerModule()->setBroker(((QComboBox*)combo)->currentText().toLatin1().data());
393 }
394 emit modified();
395 return;
396 }
397 if(combo == nodeCombo){
398
399 if(currentModule){
400 currentModule->getInnerModule()->setHost(((QComboBox*)combo)->currentText().toLatin1().data());
401 }
402 emit modified();
403 return;
404 }
405
406 QString params;
407 for(int i=0; i<modParams->childCount();i++){
408 QTreeWidgetItem *c = modParams->child(i);
409 QComboBox *combo = ((QComboBox*)moduleProperties->itemWidget(c,1));
410 if(!combo->currentText().isEmpty()){
411 params = params + QString("--%1 %2 ").arg(c->text(0).toLatin1().data())
412 .arg(combo->currentText());
413 }
414 }
415 modParams->setText(1,params);
416 if(currentModule){
417 currentModule->getInnerModule()->setParam(params.toLatin1().data());
418 for(int i=0;i<modules.count();i++){
419 Module *module = modules.at(i)->getInnerModule();
420 if(!strcmp(module->getName(),currentModule->getInnerModule()->getName())){
421 module->setParam(currentModule->getInnerModule()->getParam());
422 module->setHost(currentModule->getInnerModule()->getHost());
423 module->setBroker(currentModule->getInnerModule()->getBroker());
424 }
425 }
426 }
427 emit modified();
428}
429
431{
432 modules.append(mod);
433}
int SIGNAL(int pid, int signum)
Definition arrow.h:106
void updateConnectionTo(QString to)
Definition arrow.cpp:191
QString getFrom()
Definition arrow.cpp:278
QString getTo()
Definition arrow.cpp:283
void updateConnectionFrom(QString from)
Definition arrow.cpp:171
QList< PortItem * > oPorts
Definition moduleitem.h:52
QList< PortItem * > iPorts
Definition moduleitem.h:51
Module * getInnerModule()
void addModules(ModuleItem *)
void showApplicationTab(Application *application)
PropertiesTable(Manager *manager, QWidget *parent=0)
void showModuleTab(ModuleItem *it)
Class Application.
void setVersion(const char *szVersion)
void setDescription(const char *szDesc)
const char * getDescription()
Author & getAuthorAt(int index)
Connection & getConnectionAt(int index)
void setPrefix(const char *szPrefix)
Class Argument.
Definition module.h:46
const char * getDefault()
Definition module.h:63
const char * getValue()
Definition module.h:65
const char * getDescription()
Definition module.h:66
const char * getParam()
Definition module.h:64
const char * getName()
Definition module.h:31
const char * getEmail()
Definition module.h:32
Class Connection.
Definition application.h:56
OutputData * getCorOutputData()
InputData * getCorInputData()
Class InputData.
Definition data.h:21
const char * getName()
Definition data.h:34
const char * getDescription()
Definition data.h:44
const char * getPort()
Definition data.h:36
bool setModulePrefix(Module *module, const char *szPrefix, bool updateBasePrefix=true)
Definition kbase.cpp:467
Application * getApplication()
Definition kbase.h:84
const ResourcePContainer & getResources(Application *parent=nullptr)
Definition kbase.cpp:261
Class Manager.
Definition manager.h:20
KnowledgeBase * getKnowledgeBase()
Definition manager.h:103
Class Module.
Definition module.h:99
void setStdio(const char *szStdio)
Definition module.h:119
Argument & getArgumentAt(int index)
Definition module.h:147
void setWorkDir(const char *szWDir)
Definition module.h:118
void setHost(const char *szHost)
Definition module.h:113
const char * getBroker()
Definition module.h:139
const char * getBasePrefix()
Definition module.h:142
const char * getWorkDir()
Definition module.h:137
InputData & getInputAt(int index)
Definition module.h:151
const char * getDescription()
Definition module.h:130
bool setParam(const char *szParam)
Definition module.cpp:254
void setBasePrefix(const char *szPrefix)
Definition module.h:123
Author & getAuthorAt(int index)
Definition module.h:157
OutputData & getOutputAt(int index)
Definition module.h:149
const char * getParam()
Definition module.h:135
void setBroker(const char *szBroker)
Definition module.h:120
const char * getHost()
Definition module.h:131
const char * getStdio()
Definition module.h:138
const char * getName()
Definition module.h:128
const char * getVersion()
Definition module.h:129
const char * getDescription()
Definition data.h:87
const char * getPort()
Definition data.h:83
const char * getName()
Definition data.h:81
bool compareString(const char *szFirst, const char *szSecond)
Definition utility.cpp:326
std::vector< GenericResource * > ResourcePContainer
Definition resource.h:58