dialog_mcap.cpp
Go to the documentation of this file.
1 #include "dialog_mcap.h"
2 #include "ui_dialog_mcap.h"
3 
4 #include <QSettings>
5 #include <QDialogButtonBox>
6 #include <QPushButton>
7 #include <QElapsedTimer>
8 
9 #include <mcap/reader.hpp>
10 
11 const QString DialogMCAP::prefix = "DialogLoadMCAP::";
12 
14  const std::unordered_map<int, mcap::ChannelPtr>& channels,
15  const std::unordered_map<int, mcap::SchemaPtr>& schemas,
16  const std::unordered_map<uint16_t, uint64_t>& messages_count_by_channelID,
17  std::optional<mcap::LoadParams> default_parameters, QWidget* parent)
18  : QDialog(parent)
19  , ui(new Ui::dialog_mcap)
20  , _select_all(QKeySequence(Qt::CTRL + Qt::Key_A), this)
21  , _deselect_all(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_A), this)
22 {
23  ui->setupUi(this);
24 
25  if (messages_count_by_channelID.empty())
26  {
27  ui->tableWidget->horizontalHeader()->hideSection(3);
28  }
29 
30  _select_all.setContext(Qt::WindowShortcut);
31  _deselect_all.setContext(Qt::WindowShortcut);
32 
33  connect(&_select_all, &QShortcut::activated, ui->tableWidget, [this]() {
34  for (int row = 0; row < ui->tableWidget->rowCount(); row++)
35  {
36  if (!ui->tableWidget->isRowHidden(row) &&
37  !ui->tableWidget->item(row, 0)->isSelected())
38  {
39  ui->tableWidget->selectRow(row);
40  }
41  }
42  });
43 
44  connect(&_deselect_all, &QShortcut::activated, ui->tableWidget,
45  &QAbstractItemView::clearSelection);
46 
47  ui->tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
48  ui->tableWidget->horizontalHeader()->setSectionResizeMode(
49  1, QHeaderView::ResizeToContents);
50  ui->tableWidget->horizontalHeader()->setSectionResizeMode(
51  2, QHeaderView::ResizeToContents);
52  ui->tableWidget->horizontalHeader()->setSectionResizeMode(
53  3, QHeaderView::ResizeToContents);
54 
55  ui->tableWidget->setRowCount(channels.size());
56 
57  QSettings settings;
58  restoreGeometry(settings.value(prefix + "geometry").toByteArray());
59 
60  mcap::LoadParams params;
61  if (!default_parameters)
62  {
63  params.selected_topics = settings.value(prefix + "selected").toStringList();
64  params.clamp_large_arrays = settings.value(prefix + "clamp", true).toBool();
65  params.max_array_size = settings.value(prefix + "max_array", 500).toInt();
66  params.use_timestamp = settings.value(prefix + "use_timestamp", false).toBool();
67  params.use_mcap_log_time =
68  settings.value(prefix + "use_mcap_log_time", false).toBool();
69  params.sorted_column = settings.value(prefix + "sorted_column", 0).toInt();
70  }
71  else
72  {
73  params = *default_parameters;
74  }
75 
76  if (params.clamp_large_arrays)
77  {
78  ui->radioClamp->setChecked(true);
79  }
80  else
81  {
82  ui->radioSkip->setChecked(true);
83  }
84  ui->spinBox->setValue(params.max_array_size);
85  ui->checkBoxUseTimestamp->setChecked(params.use_timestamp);
86  if (params.use_mcap_log_time)
87  {
88  ui->radioLogTime->setChecked(true);
89  }
90  else
91  {
92  ui->radioPubTime->setChecked(true);
93  }
94 
95  int row = 0;
96  ui->tableWidget->setFocusPolicy(Qt::NoFocus);
97  const int columns_count = ui->tableWidget->columnCount();
98 
99  for (const auto& [id, channel] : channels)
100  {
101  auto topic = QString::fromStdString(channel->topic);
102  auto const& schema = schemas.at(channel->schemaId);
103 
104  ui->tableWidget->setItem(row, 0, new QTableWidgetItem(topic));
105  ui->tableWidget->setItem(row, 1,
106  new QTableWidgetItem(QString::fromStdString(schema->name)));
107  ui->tableWidget->setItem(
108  row, 2, new QTableWidgetItem(QString::fromStdString(schema->encoding)));
109 
110  auto count_it = messages_count_by_channelID.find(id);
111  int message_count =
112  (count_it != messages_count_by_channelID.end()) ? count_it->second : 0;
113  ui->tableWidget->setItem(row, 3,
114  new QTableWidgetItem(QString::number(message_count)));
115 
116  for (int col = 0; col < columns_count; ++col)
117  {
118  QTableWidgetItem* it = ui->tableWidget->item(row, col);
119  if (message_count == 0)
120  {
121  it->setFlags(it->flags() & ~(Qt::ItemIsEnabled | Qt::ItemIsSelectable));
122  it->setForeground(QBrush(Qt::gray));
123  }
124  }
125  if (message_count != 0 && params.selected_topics.contains(topic))
126  {
127  ui->tableWidget->selectRow(row);
128  }
129  row++;
130  }
131  auto sort_order = (params.sorted_column >= columns_count) ?
132  Qt::SortOrder::DescendingOrder :
133  Qt::SortOrder::AscendingOrder;
134  auto sort_count = params.sorted_column % columns_count;
135  ui->tableWidget->sortByColumn(sort_count, sort_order);
136 }
137 
139 {
140  delete ui;
141 }
142 
144 {
145  mcap::LoadParams params;
146  params.max_array_size = ui->spinBox->value();
147  params.clamp_large_arrays = ui->radioClamp->isChecked();
148  params.use_timestamp = ui->checkBoxUseTimestamp->isChecked();
149  params.use_mcap_log_time = ui->radioLogTime->isChecked();
150 
151  QItemSelectionModel* select = ui->tableWidget->selectionModel();
152  QStringList selected_topics;
153  for (QModelIndex index : select->selectedRows())
154  {
155  params.selected_topics.push_back(ui->tableWidget->item(index.row(), 0)->text());
156  }
157  return params;
158 }
159 
161 {
162  bool enabled = !ui->tableWidget->selectionModel()->selectedRows().empty();
163  ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(enabled);
164 }
165 
167 {
168  QSettings settings;
169  settings.setValue(prefix + "geometry", saveGeometry());
170 
171  bool clamp_checked = ui->radioClamp->isChecked();
172  int max_array = ui->spinBox->value();
173  bool use_timestamp = ui->checkBoxUseTimestamp->isChecked();
174  bool use_mcap_log_time = ui->radioLogTime->isChecked();
175  int sort_column = ui->tableWidget->horizontalHeader()->sortIndicatorSection();
176  Qt::SortOrder sortOrder = ui->tableWidget->horizontalHeader()->sortIndicatorOrder();
177  // apply an offsert to descending order
178  sort_column += (sortOrder == Qt::DescendingOrder) ? ui->tableWidget->columnCount() : 0;
179 
180  settings.setValue(prefix + "clamp", clamp_checked);
181  settings.setValue(prefix + "max_array", max_array);
182  settings.setValue(prefix + "use_timestamp", use_timestamp);
183  settings.setValue(prefix + "use_mcap_log_time", use_mcap_log_time);
184  settings.setValue(prefix + "sorted_column", sort_column);
185 
186  QItemSelectionModel* select = ui->tableWidget->selectionModel();
187  QStringList selected_topics;
188  for (QModelIndex index : select->selectedRows())
189  {
190  selected_topics.push_back(ui->tableWidget->item(index.row(), 0)->text());
191  }
192  settings.setValue(prefix + "selected", selected_topics);
193 
194  QDialog::accept();
195 }
mcap::LoadParams::sorted_column
int sorted_column
Definition: dataload_params.h:15
DialogMCAP::~DialogMCAP
~DialogMCAP()
Definition: dialog_mcap.cpp:138
mcap::LoadParams
Definition: dataload_params.h:8
dialog_mcap.h
DialogMCAP::ui
Ui::dialog_mcap * ui
Definition: dialog_mcap.h:44
mcap::LoadParams::max_array_size
unsigned max_array_size
Definition: dataload_params.h:11
mcap::LoadParams::clamp_large_arrays
bool clamp_large_arrays
Definition: dataload_params.h:12
start_test_publisher.topic
topic
Definition: start_test_publisher.py:31
Ui
Definition: cheatsheet_dialog.h:6
DialogMCAP::DialogMCAP
DialogMCAP(const std::unordered_map< int, mcap::ChannelPtr > &channels, const std::unordered_map< int, mcap::SchemaPtr > &schemas, const std::unordered_map< uint16_t, uint64_t > &messages_count_by_channelID, std::optional< mcap::LoadParams > default_parameters, QWidget *parent=nullptr)
Definition: dialog_mcap.cpp:13
DialogMCAP::accept
void accept() override
Definition: dialog_mcap.cpp:166
DialogMCAP::_deselect_all
QShortcut _deselect_all
Definition: dialog_mcap.h:49
DialogMCAP::getParams
mcap::LoadParams getParams() const
Definition: dialog_mcap.cpp:143
DialogMCAP::prefix
static const QString prefix
Definition: dialog_mcap.h:46
mcap::LoadParams::selected_topics
QStringList selected_topics
Definition: dataload_params.h:10
DialogMCAP::_select_all
QShortcut _select_all
Definition: dialog_mcap.h:48
mcap::LoadParams::use_timestamp
bool use_timestamp
Definition: dataload_params.h:13
DialogMCAP::on_tableWidget_itemSelectionChanged
void on_tableWidget_itemSelectionChanged()
Definition: dialog_mcap.cpp:160
mcap::LoadParams::use_mcap_log_time
bool use_mcap_log_time
Definition: dataload_params.h:14


plotjuggler
Author(s): Davide Faconti
autogenerated on Mon May 26 2025 02:22:36