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
910using 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+
1128TreeViewer::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
168185void 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
253280void 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