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 }
void updateTopicList(std::vector< std::pair< QString, QString >> topic_list)
void on_lineEditFilter_textChanged(const QString &search_string)
void on_spinBoxArraySize_valueChanged(int value)
std::string type_name(lua_State *L, type t)
iterator it
std::size_t index
Ui::dialogSelectRosTopics * ui
DialogSelectRosTopics(const std::vector< std::pair< QString, QString >> &topic_list, const PJ::RosParserConfig &default_info, QWidget *parent=nullptr)
PJ::RosParserConfig getResult() const
QCXXHighlighter::QCXXHighlighter(QTextDocument *document) m_highlightRul append))({ QRegularExpression(R"(#[a-zA-Z_]+)"), "Preprocessor" })


plotjuggler_ros
Author(s): Davide Faconti
autogenerated on Fri Jun 23 2023 02:28:03