2 #include "ui_dialog_mcap.h"
5 #include <QDialogButtonBox>
7 #include <QElapsedTimer>
9 #include <mcap/reader.hpp>
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)
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)
25 if (messages_count_by_channelID.empty())
27 ui->tableWidget->horizontalHeader()->hideSection(3);
33 connect(&
_select_all, &QShortcut::activated,
ui->tableWidget, [
this]() {
34 for (int row = 0; row < ui->tableWidget->rowCount(); row++)
36 if (!ui->tableWidget->isRowHidden(row) &&
37 !ui->tableWidget->item(row, 0)->isSelected())
39 ui->tableWidget->selectRow(row);
44 connect(&_deselect_all, &QShortcut::activated, ui->tableWidget,
45 &QAbstractItemView::clearSelection);
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);
55 ui->tableWidget->setRowCount(channels.size());
58 restoreGeometry(settings.value(prefix +
"geometry").toByteArray());
61 if (!default_parameters)
63 params.
selected_topics = settings.value(prefix +
"selected").toStringList();
65 params.
max_array_size = settings.value(prefix +
"max_array", 500).toInt();
66 params.
use_timestamp = settings.value(prefix +
"use_timestamp",
false).toBool();
68 settings.value(prefix +
"use_mcap_log_time",
false).toBool();
69 params.
sorted_column = settings.value(prefix +
"sorted_column", 0).toInt();
73 params = *default_parameters;
78 ui->radioClamp->setChecked(
true);
82 ui->radioSkip->setChecked(
true);
88 ui->radioLogTime->setChecked(
true);
92 ui->radioPubTime->setChecked(
true);
96 ui->tableWidget->setFocusPolicy(Qt::NoFocus);
97 const int columns_count = ui->tableWidget->columnCount();
99 for (
const auto& [
id, channel] : channels)
101 auto topic = QString::fromStdString(channel->topic);
102 auto const& schema = schemas.at(channel->schemaId);
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)));
110 auto count_it = messages_count_by_channelID.find(
id);
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)));
116 for (
int col = 0; col < columns_count; ++col)
118 QTableWidgetItem* it = ui->tableWidget->item(row, col);
119 if (message_count == 0)
121 it->setFlags(it->flags() & ~(Qt::ItemIsEnabled | Qt::ItemIsSelectable));
122 it->setForeground(QBrush(Qt::gray));
127 ui->tableWidget->selectRow(row);
132 Qt::SortOrder::DescendingOrder :
133 Qt::SortOrder::AscendingOrder;
135 ui->tableWidget->sortByColumn(sort_count, sort_order);
151 QItemSelectionModel* select =
ui->tableWidget->selectionModel();
152 QStringList selected_topics;
153 for (QModelIndex index : select->selectedRows())
162 bool enabled = !
ui->tableWidget->selectionModel()->selectedRows().empty();
163 ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(enabled);
169 settings.setValue(
prefix +
"geometry", saveGeometry());
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();
178 sort_column += (sortOrder == Qt::DescendingOrder) ?
ui->tableWidget->columnCount() : 0;
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);
186 QItemSelectionModel* select =
ui->tableWidget->selectionModel();
187 QStringList selected_topics;
188 for (QModelIndex index : select->selectedRows())
190 selected_topics.push_back(
ui->tableWidget->item(index.row(), 0)->text());
192 settings.setValue(
prefix +
"selected", selected_topics);