Skip to content

Commit 113de45

Browse files
committed
fix: don't render big vectors in tree viewer, show summary instead
1 parent 9fa7f67 commit 113de45

2 files changed

Lines changed: 49 additions & 14 deletions

File tree

gui/include/dsr/gui/viewers/tree_viewer/tree_viewer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ namespace DSR
5757
std::map<uint64_t, std::map<std::string, QTreeWidgetItem*>> attributes_map;
5858
void createGraph();
5959
void create_attribute_widgets(QTreeWidgetItem* parent, Node* node);
60-
void create_attribute_widget(QTreeWidgetItem* parent, Node* node, std::string key, Attribute value);
60+
void create_attribute_widget(QTreeWidgetItem* parent, Node* node, const std::string &key, const Attribute &value);
6161
void update_attribute_widgets(Node* node);
6262

6363
signals:

gui/viewers/tree_viewer/tree_viewer.cpp

Lines changed: 48 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,26 @@
55
#include <dsr/gui/viewers/graph_viewer/graph_edge.h>
66
#include <dsr/gui/viewers/tree_viewer/tree_viewer.h>
77
#include <qdebug.h>
8+
#include <vector>
89

910
using namespace DSR ;
1011

12+
namespace
13+
{
14+
constexpr std::size_t max_vector_spinboxes = 32;
15+
16+
QString summarize_float_vector(const std::vector<float> &values)
17+
{
18+
if(values.empty())
19+
return "vector<float>[0]";
20+
21+
return QString("vector<float>[%1] first=%2 last=%3")
22+
.arg(values.size())
23+
.arg(values.front(), 0, 'g', 6)
24+
.arg(values.back(), 0, 'g', 6);
25+
}
26+
}
27+
1128
TreeViewer::TreeViewer(std::shared_ptr<DSR::DSRGraph> G_, QWidget *parent) : QTreeWidget(parent)
1229
{
1330
qRegisterMetaType<std::int32_t>("std::int32_t");
@@ -167,7 +184,7 @@ void TreeViewer::node_change_SLOT(int value, uint64_t id, const std::string &typ
167184

168185
void TreeViewer::create_attribute_widgets(QTreeWidgetItem* parent, Node* node)
169186
{
170-
for (auto[key, value] : node->attrs()) {
187+
for (const auto &[key, value] : node->attrs()) {
171188
// check if attribute widget already exists
172189
if(attributes_map.count(node->id()) > 0 and attributes_map[node->id()].count(key) > 0)
173190
continue;
@@ -176,7 +193,7 @@ void TreeViewer::create_attribute_widgets(QTreeWidgetItem* parent, Node* node)
176193

177194
}
178195

179-
void TreeViewer::create_attribute_widget(QTreeWidgetItem* parent, Node* node, std::string key, Attribute value)
196+
void TreeViewer::create_attribute_widget(QTreeWidgetItem* parent, Node* node, const std::string &key, const Attribute &value)
180197
{
181198
QTreeWidgetItem* q_attr = new QTreeWidgetItem(parent);
182199
attributes_map[node->id()][key] = q_attr;
@@ -208,20 +225,30 @@ void TreeViewer::create_attribute_widget(QTreeWidgetItem* parent, Node* node, st
208225
}
209226
break;
210227
case 3: {
211-
QWidget* widget = new QWidget();
212-
QHBoxLayout* layout = new QHBoxLayout;
213-
widget->setLayout(layout);
214-
if (!value.float_vec().empty()) {
215-
for (std::size_t i = 0; i<value.float_vec().size(); ++i) {
228+
const auto &float_vec = value.float_vec();
229+
if(float_vec.size() > max_vector_spinboxes)
230+
{
231+
QLineEdit* ledit = new QLineEdit(summarize_float_vector(float_vec));
232+
ledit->setReadOnly(true);
233+
this->setItemWidget(q_attr, 1, ledit);
234+
}
235+
else
236+
{
237+
QWidget* widget = new QWidget();
238+
QHBoxLayout* layout = new QHBoxLayout;
239+
widget->setLayout(layout);
240+
if (!float_vec.empty()) {
241+
for (std::size_t i = 0; i<float_vec.size(); ++i) {
216242
QDoubleSpinBox* spin = new QDoubleSpinBox();
217243
spin->setReadOnly(true);
218244
spin->setMinimum(-1000000);
219245
spin->setMaximum(1000000);
220-
spin->setValue(value.float_vec()[i]);
246+
spin->setValue(float_vec[i]);
221247
layout->addWidget(spin);
222-
}
223-
this->setItemWidget(q_attr, 1, widget);
224-
}
248+
}
249+
this->setItemWidget(q_attr, 1, widget);
250+
}
251+
}
225252
}
226253
break;
227254
case 4: {
@@ -252,7 +279,7 @@ void TreeViewer::create_attribute_widget(QTreeWidgetItem* parent, Node* node, st
252279

253280
void TreeViewer::update_attribute_widgets(Node* node)
254281
{
255-
for (auto[key, value] : node->attrs()) {
282+
for (const auto &[key, value] : node->attrs()) {
256283
QTreeWidgetItem* q_attr = attributes_map[node->id()][key];
257284
if(not q_attr) {
258285
create_attribute_widget(tree_map[node->id()], node, key, value);
@@ -278,14 +305,22 @@ void TreeViewer::update_attribute_widgets(Node* node)
278305
}
279306
break;
280307
case 3: {
308+
const auto &float_vec = value.float_vec();
309+
if(QLineEdit *ledit = qobject_cast<QLineEdit *>(this->itemWidget(q_attr, 1)); ledit != nullptr)
310+
{
311+
ledit->setText(summarize_float_vector(float_vec));
312+
break;
313+
}
281314
QWidget *widget = qobject_cast<QWidget *>(this->itemWidget(q_attr, 1));
282315
if (!widget) {
283316
qDebug() << __PRETTY_FUNCTION__ << " Skip Attribute " << key.data() << " widget doesn't exist " << "\n";
284317
continue;
285318
}
286319
int count = 0;
287320
for (auto spin : widget->findChildren<QDoubleSpinBox *>()) {
288-
spin->setValue(value.float_vec()[count]);
321+
if(static_cast<std::size_t>(count) >= float_vec.size())
322+
break;
323+
spin->setValue(float_vec[count]);
289324
count++;
290325
}
291326
}

0 commit comments

Comments
 (0)