dialog_select_ros_topics.cpp
Go to the documentation of this file.
1 #include <QFile>
2 #include <QTextStream>
3 #include <QSettings>
4 #include <QFileInfo>
5 #include <QDir>
6 #include <QFileDialog>
7 #include <QTableWidget>
8 #include <QTableWidgetItem>
9 #include <QHeaderView>
10 #include <QDebug>
11 #include <QMessageBox>
12 #include <QAbstractItemView>
13 #include <set>
15 #include "ui_dialog_select_ros_topics.h"
16 
17 DialogSelectRosTopics::DialogSelectRosTopics(const std::vector<std::pair<QString, QString>>& topic_list,
18  const PJ::RosParserConfig& config, QWidget* parent)
19  : QDialog(parent)
20  , ui(new Ui::dialogSelectRosTopics)
21  , _default_selected_topics(config.topics)
22  , _select_all(QKeySequence(Qt::CTRL + Qt::Key_A), this)
23  , _deselect_all(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_A), this)
24 {
25  auto flags = this->windowFlags();
26  this->setWindowFlags(flags | Qt::WindowStaysOnTopHint);
27 
28  ui->setupUi(this);
29 
30  ui->spinBoxArraySize->setValue(config.max_array_size);
31  ui->checkBoxTimestamp->setChecked(config.use_header_stamp);
32  ui->checkBoxStringBoolean->setChecked(config.boolean_strings_to_number);
33  ui->checkBoxStringSuffix->setChecked(config.remove_suffix_from_strings);
34 
35  if (config.discard_large_arrays)
36  {
37  ui->radioMaxDiscard->setChecked(true);
38  }
39  else
40  {
41  ui->radioMaxClamp->setChecked(true);
42  }
43 
44  QStringList labels;
45  labels.push_back("Topic name");
46  labels.push_back("Datatype");
47 
48  ui->listRosTopics->setHorizontalHeaderLabels(labels);
49  ui->listRosTopics->verticalHeader()->setVisible(false);
50 
51  updateTopicList(topic_list);
52 
53  if (ui->listRosTopics->rowCount() == 1)
54  {
55  ui->listRosTopics->selectRow(0);
56  }
57  ui->listRosTopics->setFocus();
58 
59  _select_all.setContext(Qt::WindowShortcut);
60  _deselect_all.setContext(Qt::WindowShortcut);
61 
62  connect(&_select_all, &QShortcut::activated, ui->listRosTopics, [this]() {
63  for (int row = 0; row < ui->listRosTopics->rowCount(); row++)
64  {
65  if (!ui->listRosTopics->isRowHidden(row) && !ui->listRosTopics->item(row, 0)->isSelected())
66  {
67  ui->listRosTopics->selectRow(row);
68  }
69  }
70  });
71 
72  connect(&_deselect_all, &QShortcut::activated, ui->listRosTopics, &QAbstractItemView::clearSelection);
73 
74  on_spinBoxArraySize_valueChanged(ui->spinBoxArraySize->value());
75 
76  QSettings settings;
77  restoreGeometry(settings.value("DialogSelectRosTopics.geometry").toByteArray());
78 
79 }
80 
81 void DialogSelectRosTopics::updateTopicList(std::vector<std::pair<QString, QString>> topic_list)
82 {
83  std::set<QString> newly_added;
84 
85  // add if not present
86  for (const auto& it : topic_list)
87  {
88  const QString& topic_name = it.first;
89  const QString& type_name = it.second;
90 
91  bool found = false;
92  for (int r = 0; r < ui->listRosTopics->rowCount(); r++)
93  {
94  const QTableWidgetItem* item = ui->listRosTopics->item(r, 0);
95  if (item->text() == topic_name)
96  {
97  found = true;
98  break;
99  }
100  }
101 
102  if (!found)
103  {
104  int new_row = ui->listRosTopics->rowCount();
105  ui->listRosTopics->setRowCount(new_row + 1);
106 
107  // order IS important, don't change it
108  ui->listRosTopics->setItem(new_row, 1, new QTableWidgetItem(type_name));
109  ui->listRosTopics->setItem(new_row, 0, new QTableWidgetItem(topic_name));
110  newly_added.insert(topic_name);
111  }
112  }
113 
114  if (newly_added.size() > 1)
115  {
116  ui->listRosTopics->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
117  ui->listRosTopics->horizontalHeader()->setSectionResizeMode(1, QHeaderView::ResizeToContents);
118  ui->listRosTopics->sortByColumn(0, Qt::AscendingOrder);
119  }
120 
121  QModelIndexList selection = ui->listRosTopics->selectionModel()->selectedRows();
122 
123  for (int row = 0; row < ui->listRosTopics->rowCount(); row++)
124  {
125  const QTableWidgetItem* item = ui->listRosTopics->item(row, 0);
126  QString topic_name = item->text();
127 
128  if (newly_added.count(topic_name) && _default_selected_topics.contains(topic_name))
129  {
130  bool selected = false;
131  for (const auto& selected_item : selection)
132  {
133  if (selected_item.row() == row)
134  {
135  selected = true;
136  break;
137  }
138  }
139  if (!selected)
140  {
141  ui->listRosTopics->selectRow(row);
142  }
143  }
144  }
145 }
146 
148 {
149  QSettings settings;
150  settings.setValue("DialogSelectRosTopics.geometry", saveGeometry());
151  delete ui;
152 }
153 
155 {
156  PJ::RosParserConfig config;
157  config.topics = _topic_list;
158  config.max_array_size = ui->spinBoxArraySize->value();
159  config.use_header_stamp = ui->checkBoxTimestamp->isChecked();
160  config.discard_large_arrays = ui->radioMaxDiscard->isChecked();
161  config.boolean_strings_to_number = ui->checkBoxStringBoolean->isChecked();
162  config.remove_suffix_from_strings = ui->checkBoxStringSuffix->isChecked();
163  return config;
164 }
165 
166 
168 {
169  QModelIndexList selected_indexes = ui->listRosTopics->selectionModel()->selectedIndexes();
170  QString selected_topics;
171 
172  foreach (QModelIndex index, selected_indexes)
173  {
174  if (index.column() == 0)
175  {
176  _topic_list.push_back(index.data(Qt::DisplayRole).toString());
177  selected_topics.append(_topic_list.back()).append(" ");
178  }
179  }
180 }
181 
183 {
184  QModelIndexList indexes = ui->listRosTopics->selectionModel()->selectedIndexes();
185 
186  ui->buttonBox->setEnabled(indexes.size() > 0);
187 }
188 
190 {
191  QMessageBox msgBox;
192  msgBox.setWindowTitle("Help");
193  msgBox.setText("Maximum Size of Arrays:\n\n"
194  "If the size of an Arrays is larger than this maximum value, the entire array is skipped.\n\n"
195  "This parameter is used to prevent the user from loading HUGE arrays, "
196  "such as images, pointclouds, maps, etc.\n"
197  "The term 'array' refers to the array in a message field,\n\n"
198  " See http://wiki.ros.org/msg.\n\n"
199  "This is NOT about the duration of a time series!\n\n"
200  "MOTIVATION: pretend that a user tries to load a RGB image, which probably contains "
201  "a few millions pixels.\n"
202  "Plotjuggler would naively create a single time series for each pixel of the image! "
203  "That makes no sense, of course, and it would probably freeze your system.\n");
204  msgBox.exec();
205 }
206 
208 {
209  QStringList spaced_items = search_string.split(' ');
210 
211  for (int row = 0; row < ui->listRosTopics->rowCount(); row++)
212  {
213  auto item = ui->listRosTopics->item(row, 0);
214  QString name = item->text();
215  int pos = 0;
216  bool toHide = false;
217 
218  for (const auto& item : spaced_items)
219  {
220  if (!name.contains(item))
221  {
222  toHide = true;
223  break;
224  }
225  }
226  ui->listRosTopics->setRowHidden(row, toHide);
227  }
228 }
229 
231 {
232 }
PJ::RosParserConfig::use_header_stamp
bool use_header_stamp
Definition: parser_configuration.h:18
DialogSelectRosTopics::on_buttonBox_accepted
void on_buttonBox_accepted()
Definition: dialog_select_ros_topics.cpp:167
value
index
std::size_t index
DialogSelectRosTopics::on_listRosTopics_itemSelectionChanged
void on_listRosTopics_itemSelectionChanged()
Definition: dialog_select_ros_topics.cpp:182
PJ::RosParserConfig
Definition: parser_configuration.h:14
DialogSelectRosTopics::_select_all
QShortcut _select_all
Definition: dialog_select_ros_topics.h:52
type_name
std::string type_name(lua_State *L, type t)
dialog_select_ros_topics.h
DialogSelectRosTopics::DialogSelectRosTopics
DialogSelectRosTopics(const std::vector< std::pair< QString, QString >> &topic_list, const PJ::RosParserConfig &default_info, QWidget *parent=nullptr)
Definition: dialog_select_ros_topics.cpp:17
DialogSelectRosTopics::on_maximumSizeHelp_pressed
void on_maximumSizeHelp_pressed()
Definition: dialog_select_ros_topics.cpp:189
DialogSelectRosTopics::_deselect_all
QShortcut _deselect_all
Definition: dialog_select_ros_topics.h:53
DialogSelectRosTopics::updateTopicList
void updateTopicList(std::vector< std::pair< QString, QString >> topic_list)
Definition: dialog_select_ros_topics.cpp:81
Ui
DialogSelectRosTopics::~DialogSelectRosTopics
~DialogSelectRosTopics() override
Definition: dialog_select_ros_topics.cpp:147
DialogSelectRosTopics::_default_selected_topics
QStringList _default_selected_topics
Definition: dialog_select_ros_topics.h:50
it
iterator it
PJ::RosParserConfig::discard_large_arrays
bool discard_large_arrays
Definition: parser_configuration.h:19
DialogSelectRosTopics::_topic_list
QStringList _topic_list
Definition: dialog_select_ros_topics.h:49
PJ::RosParserConfig::boolean_strings_to_number
bool boolean_strings_to_number
Definition: parser_configuration.h:20
PJ::RosParserConfig::max_array_size
unsigned max_array_size
Definition: parser_configuration.h:17
DialogSelectRosTopics::getResult
PJ::RosParserConfig getResult() const
Definition: dialog_select_ros_topics.cpp:154
DialogSelectRosTopics::on_spinBoxArraySize_valueChanged
void on_spinBoxArraySize_valueChanged(int value)
Definition: dialog_select_ros_topics.cpp:230
arg_id_kind::name
@ name
DialogSelectRosTopics::ui
Ui::dialogSelectRosTopics * ui
Definition: dialog_select_ros_topics.h:55
PJ::RosParserConfig::topics
QStringList topics
Definition: parser_configuration.h:16
DialogSelectRosTopics::on_lineEditFilter_textChanged
void on_lineEditFilter_textChanged(const QString &search_string)
Definition: dialog_select_ros_topics.cpp:207
PJ::RosParserConfig::remove_suffix_from_strings
bool remove_suffix_from_strings
Definition: parser_configuration.h:21


plotjuggler_ros
Author(s): Davide Faconti
autogenerated on Wed Feb 21 2024 03:22:55