ArmarXManagerModel.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 ArmarX::Gui
19 * @author Jan Issac ( jan.issac at gmail dot com)
20 * @date 2012
21 * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
22 * GNU General Public License
23 */
24
25
26#include "ArmarXManagerModel.h"
27
28#include <QFileSystemModel>
29#include <QStandardItem>
30
31#include <Ice/Connection.h>
32
34
37
39
40#define LiveMetaInfoDescriptionString "Live Meta Information"
41
42namespace armarx
43{
45 {
46 connect(this, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(updateItem(QStandardItem*)));
47 }
48
52
54 ArmarXManagerModel::getItem(int row, int column) const
55 {
56 return dynamic_cast<ArmarXManagerItem*>(QStandardItemModel::item(row, column));
57 }
58
61 {
62 CHECK_QT_THREAD(this);
63
65
66 for (int i = 0; i < this->rowCount(); i++)
67 {
68 item = this->getItem(i);
69
70 if (item->getName().compare(name) == 0)
71 {
72 return item;
73 }
74 }
75
76 return nullptr;
77 }
78
81 {
82 // No CHECK_QT_THREAD here: this is called both from the GUI thread (config
83 // dialog accept) and from the component-connect thread (onConnectComponent's
84 // saved-config branch). Asserting the GUI thread made restoring a saved
85 // configuration throw. The sibling getManagerProxyMap(QStringList) overload
86 // carries no such check. Making all model access here truly GUI-thread-safe is
87 // tracked separately (issue #64.8).
88 ManagerPrxMap result;
90 // ARMARX_IMPORTANT << this->rowCount();
91 for (int i = 0; i < this->rowCount(); i++)
92 {
93 item = this->getItem(i);
94 if (!item->getManagerProxy())
95 {
96 try
97 {
98 ARMARX_DEBUG << item->getName().toStdString();
99 auto proxy = getIceManager()->getProxy<ArmarXManagerInterfacePrx>(
100 item->getName().toStdString());
101 ARMARX_DEBUG << item->getName().toStdString() << " done";
102 item->setManagerProxy(ArmarXManagerInterfacePrx::uncheckedCast(proxy));
103 }
104 catch (...)
105 {
107 }
108 }
109 result[item->getName()] = item->getManagerProxy();
110 }
111 return result;
112 }
113
115 ArmarXManagerModel::getManagerProxyMap(const QStringList& managerNames) const
116 {
117 ManagerPrxMap result;
118 // ARMARX_IMPORTANT << this->rowCount();
119 for (auto& name : managerNames)
120 {
121 try
122 {
123 ARMARX_DEBUG << name.toStdString();
124 auto proxy =
125 getIceManager()->getProxy<ArmarXManagerInterfacePrx>(name.toStdString());
126 ARMARX_DEBUG << name.toStdString() << " done";
127 result[name] = proxy;
128 }
129 catch (...)
130 {
132 }
133 }
134
135
136 return result;
137 }
138
139 void
141 const ArmarXManagerItem::ManagerDataMap& managerDataMap,
142 bool deactivateIfMissing)
143 {
144 CHECK_QT_THREAD(this);
145 IceUtil::Time start = IceUtil::Time::now();
146
147 std::map<std::string, std::vector<QString>> offererMap;
148 std::map<std::string, std::vector<QString>> listenerMap;
149 // iterate over all manager items
150 for (int i = 0; i < this->rowCount(); i++)
151 {
152 ArmarXManagerItem* item = this->getItem(i);
153 // ARMARX_DEBUG << deactivateSpam(1, item->getName().toStdString()) << "Checking " << item->getName().toStdString();
154 // ARMARX_INFO << "Checking " << item->getName().toStdString();
155 // for (auto& element : item->getObjects())
156 // {
157 // DependencyMap depMap = element.connectivity.dependencies;
158 // // ARMARX_INFO << "Checking sub item " << element.name.toStdString() << " with " << depMap.size() << " dependencies";
159 // if (depMap.size() > 0)
160 // {
161 // dependenciesMap[toStdString()] = depMap;
162 // }
163 // }
164
165 auto it = managerDataMap.find(item->getName());
166 if (it == managerDataMap.end())
167 {
168 ARMARX_INFO << deactivateSpam(15, item->getName().toStdString()) << "Didnt find "
169 << item->getName().toStdString();
170 if (deactivateIfMissing)
171 {
172 item->setOnline(false);
173 }
174 continue;
175 }
176 else
177 {
178 item->setOnline(it->second.online);
179 }
180
181 item->setConnection(it->second.connection);
182 item->setEndpointStr(it->second.endpointStr);
183 // ARMARX_DEBUG << deactivateSpam(1, item->getName().toStdString()) << "endpoint: " << it->second.endpointStr;
184
185 if (!item->getManagerProxy() && !it->second.proxy)
186 {
187 ARMARX_INFO << "Proxy for " << item->getName().toStdString() << " is null";
188 item->setOnline(false);
189 continue;
190 }
191 if (it->second.proxy)
192 {
193 item->setManagerProxy(it->second.proxy);
194 }
195 item->setAppProperties(it->second.appProperties);
196
197 const ArmarXManagerItem::ObjectMap& updates = it->second.objects;
199 // Iterate the map directly; the old updates.keys().at(j) rebuilt the whole
200 // key list on every iteration - O(n^2) allocations per tick (issue #64.17a).
201 for (auto updateIt = updates.constBegin(); updateIt != updates.constEnd();
202 ++updateIt)
203 {
204 const QString& objName = updateIt.key();
205 const ManagedIceObjectItem& updateItem = updateIt.value();
206 ManagedIceObjectItem& objItem = objects[objName];
207 objItem.connectivity = updateItem.connectivity;
208 objItem.state = updateItem.state;
209 objItem.properties = updateItem.properties;
210 objItem.metaInfoMap = updateItem.metaInfoMap;
211 for (const auto& topic : objItem.connectivity.offeredTopics)
212 {
213 offererMap[topic].push_back(objName);
214 }
215 for (const auto& topic : objItem.connectivity.usedTopics)
216 {
217 listenerMap[topic].push_back(objName);
218 }
219 }
220 }
221 // std::set<std::string> offeredTopics = armarx::getMapKeys(offererMap);
222 // ARMARX_INFO << deactivateSpam(10) << VAROUT(listenerMap) << "\n" << VAROUT(offererMap);
223 // iterate over all manager items
224 for (int i = 0; i < this->rowCount(); i++)
225 {
226 ArmarXManagerItem* item = this->getItem(i);
227 item->setEditable(false);
228
229 QBrush managerBrush;
230
231 if (!item->isOnline())
232 {
233 managerBrush.setStyle(Qt::SolidPattern);
234 managerBrush.setColor(Qt::lightGray);
235 item->clear(false);
236 }
237 else
238 {
239 managerBrush.setColor(Qt::transparent);
240 }
241
242 item->setBackground(managerBrush);
243
244 auto addPropertiesToItem =
245 [](ObjectPropertyInfos const& properties, QStandardItem* item)
246 {
247 if (!properties.empty())
248 {
249 QStandardItem* objectPropertiesItem = new QStandardItem("Properties");
250 objectPropertiesItem->setEditable(false);
251
252 QList<QStandardItem*> objectPropertiesRow;
253
254 for (auto property : properties)
255 {
256 QStandardItem* objectPropertyItem =
257 new QStandardItem(QString("%1 %2: %3")
258 .arg(property.first.c_str())
259 .arg(property.second.constant ? "(constant)" : "")
260 .arg(property.second.value.c_str()));
261 objectPropertyItem->setEditable(!property.second.constant);
262 if (!property.second.constant)
263 {
264 objectPropertyItem->setToolTip(
265 "Double-click to edit this property and to send the updated "
266 "property to the component.");
267 }
268 objectPropertiesRow.append(objectPropertyItem);
269 }
270
271 objectPropertiesItem->appendRows(objectPropertiesRow);
272 item->appendRow(objectPropertiesItem);
273 }
274 };
275
276 if (item->rowCount() == 0 && item->isOnline()) // only when app is coming (back) online
277 {
278 auto applicationItem = new QStandardItem("Application Properties");
279 applicationItem->setData((int)ApplicationRowType::ApplicationProperties,
281 applicationItem->setEditable(false);
282 try
283 {
284
285 auto& properties =
286 item->getAppProperties(); //item->getManagerProxy()->ice_timeout(1000)->getApplicationPropertyInfos();
287 addPropertiesToItem(properties, applicationItem);
288 item->appendRow(applicationItem);
289 }
290 catch (...)
291 {
292 }
293 }
294
296 // iterate over all ManagedIceObjectItems controlled by the manager. keys() is
297 // hoisted out of the loop; calling it per iteration was O(n^2) (issue #64.17a).
298 const QList<QString> objectNames = objects.keys();
299 for (int j = 0; j < objectNames.size(); j++)
300 {
301 const QString& objName = objectNames.at(j);
302
303 ManagedIceObjectItem& objItem = objects[objName];
304 if (!objItem.item)
305 {
306 objItem.item = new QStandardItem(objName);
307 objItem.item->setEditable(false);
308
309 item->appendRow(objItem.item);
310
311 auto& properties = objItem.properties;
312
313 // iterate over all properties and add them as a separate subentry
314
315 addPropertiesToItem(properties, objItem.item);
316
317 QStandardItem* metaInfoItem = new QStandardItem(LiveMetaInfoDescriptionString);
318 metaInfoItem->setEditable(false);
319 for (auto& pair : objItem.metaInfoMap)
320 {
321 auto name = QString::fromStdString(pair.first);
322 // A meta-info value that is not a Variant yields a null handle;
323 // guard the dereference (issue #64.17b).
324 auto variant = VariantPtr::dynamicCast(pair.second);
325 auto value = variant
326 ? QString::fromStdString(variant->getOutputValueOnly())
327 : QString();
328 QStandardItem* infoItem = new QStandardItem(
329 name + ": " + (value.size() > 100 ? (value.left(100) + "...") : value));
330 // Live meta-info rows are display-only. Without this the property
331 // editing delegate would open on them and push a corrupted
332 // property to the live component (see issue #64.7).
333 infoItem->setEditable(false);
334 metaInfoItem->appendRow(infoItem);
335 }
336 objItem.item->appendRow(metaInfoItem);
337
338 DependencyMap depMap = objItem.connectivity.dependencies;
339 DependencyMap::iterator it = depMap.begin();
340
341 // iterate over proxy dependencies
342 while (it != depMap.end())
343 {
344 QStandardItem* depObjItem =
345 new QStandardItem(it->second->getName().c_str());
346 depObjItem->setEditable(false);
347
348 if (it->second->getResolved())
349 {
350 depObjItem->setData(true, (int)UserDataRoles::ResolvedDependency);
351 depObjItem->setBackground(QBrush(QColor(50, 205, 50)));
352 depObjItem->setToolTip("Dependency resolved");
353 }
354 else
355 {
356 depObjItem->setData(false, (int)UserDataRoles::ResolvedDependency);
357 depObjItem->setBackground(QBrush(QColor(255, 106, 106)));
358 depObjItem->setToolTip("Dependency missing");
359 }
360 objItem.item->appendRow(depObjItem);
361
362 ++it;
363 }
364 }
365 else
366 {
367
368 auto endpointItem =
369 findItemByUserData(static_cast<Qt::ItemDataRole>(UserDataRoles::RowType),
371 item);
372 auto endpointText = "Endpoint: " + item->getEndpointStr();
373 if (!endpointItem)
374 {
375 endpointItem = new QStandardItem(endpointText);
376 endpointItem->setEditable(false);
377 endpointItem->setData((int)ApplicationRowType::Endpoint,
379 item->appendRow(endpointItem);
380 }
381 else
382 {
383 endpointItem->setText(endpointText);
384 }
385
386 DependencyMap depMap = objItem.connectivity.dependencies;
387 DependencyMap::iterator it = depMap.begin();
388
389 // iterate over proxy dependencies
390 while (it != depMap.end())
391 {
392 auto depObjItem =
393 findItem(QString::fromStdString(it->second->getName()), objItem.item);
394
395
396 if (depObjItem)
397 {
398 depObjItem->setEditable(false);
399
400 if (it->second->getResolved())
401 {
402 depObjItem->setData(true, (int)UserDataRoles::ResolvedDependency);
403 depObjItem->setBackground(QBrush(QColor(50, 205, 50)));
404 depObjItem->setToolTip("Dependency resolved");
405 }
406 else
407 {
408 depObjItem->setData(false, (int)UserDataRoles::ResolvedDependency);
409 depObjItem->setBackground(QBrush(QColor(255, 106, 106)));
410 depObjItem->setToolTip("Dependency missing");
411 }
412 }
413
414
415 ++it;
416 }
417
418 if (objItem.connectivity.offeredTopics.size() > 0)
419 {
420 auto topicsItem = findItem(QString("Offered Topics"), objItem.item);
421 if (!topicsItem)
422 {
423 topicsItem =
424 new QStandardItem(QString::fromStdString("Offered Topics"));
425 topicsItem->setEditable(false);
426 objItem.item->appendRow(topicsItem);
427 }
428
429 for (const auto& topic : objItem.connectivity.offeredTopics)
430 {
431 auto topicItem = findItem(QString::fromStdString(topic), topicsItem);
432 if (!topicItem)
433 {
434 topicItem = new QStandardItem(QString::fromStdString(topic));
435 topicItem->setEditable(false);
436 topicsItem->appendRow(topicItem);
437 }
438 auto& listeners = listenerMap[topic];
439 syncStringListChildren(topicItem, listeners);
440 // topicItem->removeRows(0, topicItem->rowCount());
441 // for (auto& listener : listeners)
442 // {
443 // QStandardItem* listenerItem = new QStandardItem(("Listener: " + listener));
444 // listenerItem->setEditable(false);
445 // topicItem->appendRow(listenerItem);
446 // }
447 }
448 }
449
450 if (objItem.connectivity.usedTopics.size() > 0)
451 {
452 auto topicsItem = findItem(QString("Used Topics"), objItem.item);
453 if (!topicsItem)
454 {
455 topicsItem = new QStandardItem(QString::fromStdString("Used Topics"));
456 topicsItem->setEditable(false);
457 objItem.item->appendRow(topicsItem);
458 }
459 if (topicsItem)
460 {
461 // QList<QStandardItem*> objectPropertiesRow;
462
463 for (const auto& topic : objItem.connectivity.usedTopics)
464 {
465 auto topicItem =
466 findItem(QString::fromStdString(topic), topicsItem);
467 if (!topicItem)
468 {
469 topicItem = new QStandardItem(QString::fromStdString(topic));
470 topicItem->setEditable(false);
471 topicsItem->appendRow(topicItem);
472 }
473 if (offererMap.count(topic) == 0)
474 {
475 topicItem->setBackground(QBrush(QColor(255, 163, 33)));
476 topicItem->setToolTip(
477 "The topic " + QString::fromStdString(topic) +
478 " is not offered by any listed component - though not all "
479 "components might be listed");
480 }
481 else
482 {
483 topicItem->setBackground(QBrush());
484 auto& offerers = offererMap[topic];
485 syncStringListChildren(topicItem, offerers);
486 // topicItem->removeRows(0, topicItem->rowCount());
487 // for (auto& offerer : offerers)
488 // {
489 // QStandardItem* offererItem = new QStandardItem(("Offerer: " + offerer));
490 // offererItem->setEditable(false);
491 // topicItem->appendRow(offererItem);
492 // }
493 }
494 topicItem->setEditable(false);
495 // objectPropertiesRow.append(topicItem);
496 }
497 }
498 }
499
500 // update meta infos
501 auto metaInfoItem =
502 findItem(QString(LiveMetaInfoDescriptionString), objItem.item);
503 if (metaInfoItem)
504 {
505 metaInfoItem->removeRows(0, metaInfoItem->rowCount());
506 for (auto& pair : objItem.metaInfoMap)
507 {
508 auto name = QString::fromStdString(pair.first);
509 // Guard the dereference as above (issue #64.17b).
510 auto variant = VariantPtr::dynamicCast(pair.second);
511 auto value =
512 variant ? QString::fromStdString(variant->getOutputValueOnly())
513 : QString();
514 QStandardItem* infoItem = new QStandardItem(
515 name + ": " +
516 (value.size() > 100 ? (value.left(100) + "...") : value));
517 // Display-only, as above (issue #64.7).
518 infoItem->setEditable(false);
519 metaInfoItem->appendRow(infoItem);
520 }
521 }
522 }
523
524 objItem.item->setBackground(getBrush(objItem.state));
525 auto stateBool = objItem.state == eManagedIceObjectStarted;
526 // ARMARX_INFO << "Setting objItem: " << objItem.name.toStdString() << " with shown name " << objItem.item->text().toStdString() << " to " << stateBool;
527
528 objItem.item->setToolTip(
529 "Component state: " +
530 QString::fromStdString(
532 objItem.item->setData(stateBool, (int)UserDataRoles::ComponentStarted);
533 }
534 }
535
536 ARMARX_DEBUG_S << "Updating SystemState model took "
537 << (IceUtil::Time::now() - start).toMilliSecondsDouble() << " ms";
538 }
539
540 void
542 {
543 CHECK_QT_THREAD(this);
544 bool found = false;
545 // iterate over all manager items
546 for (int i = 0; i < this->rowCount(); i++)
547 {
548 ArmarXManagerItem* item = this->getItem(i);
549 if (item->getName() == data.name)
550 {
551 found = true;
552 break;
553 }
554 }
555 if (!found)
556 {
557 ARMARX_DEBUG << "Inserting " << data.name.toStdString();
558 this->appendRow(new ArmarXManagerItem(data.name));
559 }
560 updateManagerDetails({{data.name, data}}, false);
561 }
562
563 void
564 ArmarXManagerModel::moveSelectionTo(QItemSelectionModel* selectionModel,
565 ArmarXManagerModel* destinationModel)
566 {
567 CHECK_QT_THREAD(this);
568 swapSelection(this, destinationModel, selectionModel);
569 }
570
571 void
572 ArmarXManagerModel::takeSelectionFrom(QItemSelectionModel* selectionModel,
573 ArmarXManagerModel* sourceModel)
574 {
575 CHECK_QT_THREAD(this);
576 swapSelection(sourceModel, this, selectionModel);
577 }
578
579 void
580 ArmarXManagerModel::swapSelection(ArmarXManagerModel* sourceModel,
581 ArmarXManagerModel* destinationModel,
582 QItemSelectionModel* selectionModel)
583 {
584 CHECK_QT_THREAD(this);
585 QList<QPersistentModelIndex> persistentSelectionModelList =
586 getPersistentModelIndex(selectionModel);
587
588 // swap selections
589 QList<QPersistentModelIndex>::Iterator persistentModelIndexIter;
590 persistentModelIndexIter = persistentSelectionModelList.begin();
591
592 while (persistentModelIndexIter != persistentSelectionModelList.end())
593 {
594 destinationModel->insertRow(destinationModel->rowCount(),
595 sourceModel->takeRow(persistentModelIndexIter->row()));
596
597 ++persistentModelIndexIter;
598 }
599 }
600
601 void
602 ArmarXManagerModel::deleteSelection(QItemSelectionModel* selectionModel)
603 {
604 CHECK_QT_THREAD(this);
605 QList<QPersistentModelIndex> persistentSelectionModelList =
606 getPersistentModelIndex(selectionModel);
607
608 QList<QPersistentModelIndex>::Iterator persistentModelIndexIter;
609 persistentModelIndexIter = persistentSelectionModelList.begin();
610
611 while (persistentModelIndexIter != persistentSelectionModelList.end())
612 {
613 // takeRow() transfers ownership of the row's items to us; delete them
614 // instead of dropping them on the floor (issue #64.16).
615 qDeleteAll(takeRow(persistentModelIndexIter->row()));
616
617 ++persistentModelIndexIter;
618 }
619 }
620
621 QList<QPersistentModelIndex>
622 ArmarXManagerModel::getPersistentModelIndex(QItemSelectionModel* selectionModel)
623 {
624 CHECK_QT_THREAD(this);
625 QModelIndexList selection = selectionModel->selectedRows();
626
627 // populate persistent selection model list
628 QList<QPersistentModelIndex> persistentModelIndex;
629 QModelIndexList::Iterator modelIndexIter;
630 modelIndexIter = selection.begin();
631
632 while (modelIndexIter != selection.end())
633 {
634 persistentModelIndex.append(*modelIndexIter);
635
636 ++modelIndexIter;
637 }
638
639 return persistentModelIndex;
640 }
641
642 QVariant
643 ArmarXManagerModel::headerData(int section, Qt::Orientation orientation, int role) const
644 {
645 CHECK_QT_THREAD(this);
646 if (role == Qt::DisplayRole)
647 {
648 if (orientation == Qt::Horizontal)
649 {
650 switch (section)
651 {
652 case 0:
653 return "Name";
654
655 case 1:
656 return "Object state";
657 }
658 }
659 }
660
661 return QVariant();
662 }
663
664 std::mutex&
666 {
667 return mutex;
668 }
669
670 void
672 {
673 CHECK_QT_THREAD(this);
674 ArmarXManagerItem* managerItem = dynamic_cast<ArmarXManagerItem*>(item);
675
676 if (managerItem)
677 {
678 // std::unique_lock lock(getMutex());
679
680 managerItem->setName(item->text());
681 }
682 }
683
684 QStringList
686 {
687 CHECK_QT_THREAD(this);
688 QStringList managerList;
689
690 for (int i = 0; i < this->rowCount(); i++)
691 {
692 managerList.append(this->getItem(i)->getName());
693 }
694
695 return managerList;
696 }
697
698 bool
700 {
701 return rowCount() == 0;
702 }
703
704 void
705 ArmarXManagerModel::populate(const QStringList& managerList)
706 {
707 CHECK_QT_THREAD(this);
708 // std::unique_lock lock(getMutex());
709
710 this->clear();
711
712 for (int i = 0; i < managerList.size(); i++)
713 {
714 this->appendRow(new ArmarXManagerItem(managerList.at(i)));
715 }
716 }
717
720 {
721 CHECK_QT_THREAD(this);
722 ArmarXManagerModel* modelCopy = new ArmarXManagerModel();
723
724 std::unique_lock lock(getMutex());
725
726 for (int i = 0; i < rowCount(); i++)
727 {
728 ArmarXManagerItem* itemClone = new ArmarXManagerItem(item(i)->text());
729
730 modelCopy->appendRow(itemClone);
731 }
732
733 return modelCopy;
734 }
735
736 void
738 {
739 CHECK_QT_THREAD(this);
740 // std::unique_lock lock(getMutex());
741 // std::unique_lock lockSource(source->getMutex());
742
743 this->clear();
744
745 for (int i = 0; i < source->rowCount(); i++)
746 {
747 ArmarXManagerItem* itemClone = new ArmarXManagerItem(source->item(i)->text());
748
749 appendRow(itemClone);
750 }
751 }
752
753 void
755 {
756 this->iceManager = iceManager;
757 }
758
761 {
762 return iceManager;
763 }
764
765 QBrush
766 ArmarXManagerModel::getBrush(armarx::ManagedIceObjectState state) const
767 {
768 QBrush brush;
769 brush.setStyle(Qt::SolidPattern);
770
771 switch (state)
772 {
773 case armarx::eManagedIceObjectCreated:
774 brush.setColor(QColor(255, 196, 106));
775 break;
776
777 case armarx::eManagedIceObjectInitializing:
778 brush.setColor(QColor(255, 255, 196));
779 break;
780
781 case armarx::eManagedIceObjectInitialized:
782 brush.setColor(QColor(255, 255, 0));
783 break;
784
785 case armarx::eManagedIceObjectInitializationFailed:
786 brush.setColor(QColor(255, 16, 16));
787 break;
788
789 case armarx::eManagedIceObjectStarting:
790 brush.setColor(QColor(128, 196, 255));
791 break;
792
793 case armarx::eManagedIceObjectStarted:
794 brush.setColor(QColor(128, 255, 128));
795 break;
796
797 case armarx::eManagedIceObjectStartingFailed:
798 brush.setColor(QColor(255, 64, 64));
799 break;
800
801 case armarx::eManagedIceObjectExiting:
802 brush.setColor(QColor(225, 225, 225));
803 break;
804
805 case armarx::eManagedIceObjectExited:
806 brush.setColor(QColor(196, 196, 196));
807 break;
808 }
809
810 return brush;
811 }
812
813 QStandardItem*
814 ArmarXManagerModel::findItem(const QString& name, QStandardItem* item)
815 {
816 for (int i = 0; i < item->rowCount(); ++i)
817 {
818 QStandardItem* curItem = item->child(i);
819 if (curItem->text() == name)
820 {
821 return curItem;
822 }
823 }
824 return NULL;
825 }
826
827 QStandardItem*
828 ArmarXManagerModel::findItemByUserData(Qt::ItemDataRole role,
829 const QVariant& data,
830 QStandardItem* item)
831 {
832 for (int i = 0; i < item->rowCount(); ++i)
833 {
834 QStandardItem* curItem = item->child(i);
835 if (curItem->data(role) == data)
836 {
837 return curItem;
838 }
839 }
840 return NULL;
841 }
842
843 void
844 ArmarXManagerModel::syncStringListChildren(QStandardItem* item,
845 const std::vector<QString>& strings)
846 {
847 for (int i = item->rowCount() - 1; i >= 0; i--)
848 {
849 QStandardItem* curItem = item->child(i);
850 if (std::find(strings.begin(), strings.end(), curItem->text()) == strings.end())
851 {
852 item->removeRow(i);
853 }
854 }
855 for (const QString& s : strings)
856 {
857 auto child = findItem(s, item);
858 if (!child)
859 {
860 auto newChild = new QStandardItem(s);
861 newChild->setEditable(false);
862 item->appendRow(newChild);
863 }
864 }
865 }
866
867} // namespace armarx
#define LiveMetaInfoDescriptionString
SpamFilterDataPtr deactivateSpam(SpamFilterDataPtr const &spamFilter, float deactivationDurationSec, const std::string &identifier, bool deactivate)
Definition Logging.cpp:75
#define CHECK_QT_THREAD(qtObject)
Macro to check whether the current function is executed in the thread of the given Qt object.
Definition QtUtil.h:30
void setAppProperties(const ObjectPropertyInfos &properties)
ArmarXManagerInterfacePrx getManagerProxy() const
const ObjectPropertyInfos & getAppProperties() const
void clear(bool clearProxy=true)
Clears the item data.
void setEndpointStr(const QString &endpointStr)
std::map< QString, ManagerData > ManagerDataMap
void setManagerProxy(ArmarXManagerInterfacePrx proxy)
QMap< QString, ManagedIceObjectItem > ObjectMap
void setConnection(Ice::ConnectionPtr connection)
void upsertManagerDetails(const ArmarXManagerItem::ManagerData &data)
QVariant headerData(int section, Qt::Orientation orientation, int role) const override
Returns the data header.
ArmarXManagerModel * clone()
Returns a clone of this ArmarXManagerModel.
void moveSelectionTo(QItemSelectionModel *selectionModel, ArmarXManagerModel *destinationModel)
Takes the specified selected rows via the selection model from this and appends the rows to the given...
void setIceManager(IceManagerPtr iceManager)
QStringList toStringList() const
Returns the model as a string list containing the manager names.
ArmarXManagerItem * getItem(int row, int column=0) const
Returns a requested Model item.
QBrush getBrush(armarx::ManagedIceObjectState state) const
Returns an instance of state dependent brush.
void takeSelectionFrom(QItemSelectionModel *selectionModel, ArmarXManagerModel *sourceModel)
Takes the specified selected rows via the selection model from the source model and appends the rows ...
std::mutex & getMutex()
Returns the access mutex.
ArmarXManagerModel()
Constructs an ArmarXManagerModel.
~ArmarXManagerModel() override
Model destructor.
ArmarXManagerItem * getManagerItemByName(const QString &name)
Returns the requested manager item by its name.
IceManagerPtr getIceManager() const
void updateManagerDetails(const ArmarXManagerItem::ManagerDataMap &managerDataMap, bool deactivateIfMissing=true)
void deleteSelection(QItemSelectionModel *selectionModel)
Deletes the selected set of rows from this model.
void populate(const QStringList &managerList)
Populates this model with the given manager name list.
void updateItem(QStandardItem *item)
void copyFrom(ArmarXManagerModel *source)
Copies the source model content to this one.
ManagedIceObjectConnectivity connectivity
static std::string GetObjectStateAsString(int state)
#define ARMARX_DEBUG_S
The logging level for output that is only interesting while debugging.
Definition Logging.h:203
#define ARMARX_INFO
The normal logging level.
Definition Logging.h:179
#define ARMARX_DEBUG
The logging level for output that is only interesting while debugging.
Definition Logging.h:182
This file offers overloads of toIce() and fromIce() functions for STL container types.
void handleExceptions()
std::map< QString, ArmarXManagerInterfacePrx > ManagerPrxMap
IceUtil::Handle< IceManager > IceManagerPtr
IceManager smart pointer.
Definition ArmarXFwd.h:39