6 #include <SimoxUtility/algorithm/string.h>
8 #include <RobotAPI/interface/armem/actions.h>
22 TreeWidget::initWidget()
26 columns.insert(
int(Columns::KEY),
"Key");
27 columns.insert(
int(Columns::SIZE),
"#");
28 columns.insert(
int(Columns::TYPE),
"Type");
29 columns.insert(
int(Columns::LEVEL),
"Level");
30 columns.insert(
int(Columns::ID),
"Memory ID");
31 setColumnCount(columns.size());
32 setHeaderLabels(columns);
34 header()->setMinimumSectionSize(25);
35 header()->resizeSection(
int(Columns::KEY), 250);
36 header()->resizeSection(
int(Columns::SIZE), 40);
37 header()->setTextElideMode(Qt::TextElideMode::ElideRight);
41 connect(
this, &QTreeWidget::currentItemChanged,
this, &This::handleSelection);
50 setContextMenuPolicy(Qt::CustomContextMenu);
52 this, &QTreeWidget::customContextMenuRequested,
this, &This::prepareTreeContextMenu);
56 TreeWidget::initBuilders()
58 memoryBuilder.setExpand(
true);
59 memoryBuilder.setMakeItemFn([
this](
const std::string& name,
const wm::Memory*
memory)
60 {
return makeItem(name, *
memory); });
61 memoryBuilder.setUpdateItemFn(
62 [
this](
const std::string&,
const wm::Memory*
memory, QTreeWidgetItem* memoryItem)
64 updateContainerItem(*
memory, memoryItem);
67 updateChildren(*
memory, memoryItem);
72 auto nameFn = [](
const auto& element) {
return element.name(); };
74 coreSegmentBuilder.setExpand(
true);
75 coreSegmentBuilder.setNameFn(nameFn,
int(Columns::KEY));
76 coreSegmentBuilder.setMakeItemFn([
this](
const wm::CoreSegment& coreSeg)
77 {
return makeItem(coreSeg.name(), coreSeg); });
78 coreSegmentBuilder.setUpdateItemFn(
79 [
this](
const wm::CoreSegment& coreSeg, QTreeWidgetItem* coreSegItem)
81 updateContainerItem(coreSeg, coreSegItem);
82 updateChildren(coreSeg, coreSegItem);
86 provSegmentBuilder.setExpand(
true);
87 provSegmentBuilder.setNameFn(nameFn,
int(Columns::KEY));
88 provSegmentBuilder.setMakeItemFn([
this](
const wm::ProviderSegment& provSeg)
89 {
return makeItem(provSeg.name(), provSeg); });
90 provSegmentBuilder.setUpdateItemFn(
91 [
this](
const wm::ProviderSegment& provSeg, QTreeWidgetItem* provSegItem)
93 updateContainerItem(provSeg, provSegItem);
94 updateChildren(provSeg, provSegItem);
99 entityBuilder.setNameFn(nameFn,
int(Columns::KEY));
100 entityBuilder.setMakeItemFn([
this](
const wm::Entity& entity)
101 {
return makeItem(entity.name(), entity); });
102 entityBuilder.setUpdateItemFn(
103 [
this](
const wm::Entity& entity, QTreeWidgetItem* entityItem)
105 updateContainerItem(entity, entityItem);
106 updateChildren(entity, entityItem);
110 snapshotBuilder.setMakeItemFn(
116 Qt::ItemDataRole::UserRole,
117 QVariant(
static_cast<qlonglong
>(snapshot.time().toMicroSecondsSinceEpoch())));
120 snapshotBuilder.setCompareFn(
124 static_cast<qlonglong
>(snapshot.time().toMicroSecondsSinceEpoch()),
125 item->data(
int(Columns::KEY), Qt::ItemDataRole::UserRole).toLongLong());
127 snapshotBuilder.setUpdateItemFn(
130 updateContainerItem(snapshot, snapshotItem);
131 updateChildren(snapshot, snapshotItem);
135 instanceBuilder.setMakeItemFn(
138 QTreeWidgetItem* item = makeItem(
"", instance);
141 instanceBuilder.setCompareFn(
144 instanceBuilder.setUpdateItemFn(
147 updateItemItem(instance, instanceItem);
148 updateChildren(instance, instanceItem);
157 handleSelections =
false;
158 updateChildren(
memory,
this);
159 handleSelections =
true;
166 handleSelections =
false;
167 updateChildren(memories,
this);
168 handleSelections =
true;
172 std::optional<MemoryID>
179 TreeWidget::handleSelection()
181 if (!handleSelections)
185 QTreeWidgetItem* item = this->currentItem();
191 MemoryID id(item->data(
int(Columns::ID), Qt::UserRole).toString().toStdString());
194 if (!_selectedID ||
id != *_selectedID)
198 const std::string levelName =
199 item->data(
int(Columns::LEVEL), Qt::UserRole).toString().toStdString();
230 template <
class ContainerT>
232 makeIteratorFn(
const ContainerT& container)
234 return [&container](
auto&& elementFn) { container.forEachChild(elementFn); };
238 TreeWidget::updateChildren(
const armem::wm::Memory& memory, QTreeWidget* tree)
240 updateChildren(std::map<std::string, const armem::wm::Memory*>{{memory.name(), &memory}},
245 TreeWidget::updateChildren(
const std::map<std::string, const armem::wm::Memory*>& memories,
248 memoryBuilder.updateTree(tree, memories);
252 TreeWidget::updateChildren(
const armem::wm::Memory& memory, QTreeWidgetItem* memoryItem)
254 coreSegmentBuilder.updateTreeWithIterator(memoryItem, makeIteratorFn(memory));
258 TreeWidget::updateChildren(
const armem::wm::CoreSegment& coreSeg, QTreeWidgetItem* coreSegItem)
260 provSegmentBuilder.updateTreeWithIterator(coreSegItem, makeIteratorFn(coreSeg));
264 TreeWidget::updateChildren(
const armem::wm::ProviderSegment& provSeg,
265 QTreeWidgetItem* provSegItem)
267 entityBuilder.updateTreeWithIterator(provSegItem, makeIteratorFn(provSeg));
271 TreeWidget::updateChildren(
const armem::wm::Entity& entity, QTreeWidgetItem* entityItem)
273 snapshotBuilder.updateTreeWithIterator(entityItem, makeIteratorFn(entity));
278 QTreeWidgetItem* snapshotItem)
280 instanceBuilder.updateTreeWithIterator(snapshotItem, makeIteratorFn(snapshot));
286 (void)
data, (
void)dataItem;
290 TreeWidget::prepareTreeContextMenu(
const QPoint& pos)
292 const QTreeWidgetItem* item = this->itemAt(pos);
298 MemoryID memoryID(item->data(
int(Columns::ID), Qt::UserRole).toString().toStdString());
302 template <
class MemoryItemT>
304 TreeWidget::makeItem(
const std::string& key,
const MemoryItemT& memoryItem)
307 return makeItem(memoryItem.getKeyString(), MemoryItemT::getLevelName(), memoryItem.id());
311 TreeWidget::makeItem(
const std::string& key,
const std::string& levelName,
const MemoryID&
id)
314 columns.insert(
int(Columns::KEY), QString::fromStdString(key));
315 columns.insert(
int(Columns::SIZE),
"");
316 columns.insert(
int(Columns::TYPE),
"");
317 columns.insert(
int(Columns::LEVEL),
318 QString::fromStdString(simox::alg::capitalize_words(levelName)));
319 columns.insert(
int(Columns::ID), QString::fromStdString(
id.
str()));
321 QTreeWidgetItem* item =
new QTreeWidgetItem(columns);
322 item->setData(
int(Columns::LEVEL), Qt::UserRole, QString::fromStdString(levelName));
323 item->setData(
int(Columns::ID), Qt::UserRole, QString::fromStdString(
id.
str()));
324 item->setTextAlignment(
int(Columns::SIZE), Qt::AlignRight);
329 TreeWidget::updateItemItem(
const armem::base::detail::MemoryItem& level, QTreeWidgetItem* item)
331 (void)level, (
void)item;
334 template <
class ContainerT>
336 TreeWidget::updateContainerItem(
const ContainerT& container, QTreeWidgetItem* item)
338 updateItemItem(container, item);
339 item->setText(
int(Columns::SIZE), QString::number(container.size()));
342 if constexpr (std::is_base_of_v<base::detail::AronTyped, ContainerT>)
344 const base::detail::AronTyped&
cast =
345 static_cast<const base::detail::AronTyped&
>(container);
346 std::string typeName;
349 typeName =
cast.aronType()->getFullName();
354 typeName =
"(no Aron type)";
356 item->setText(
int(Columns::TYPE), QString::fromStdString(typeName));