Skip to content

Commit bf7d846

Browse files
committed
add new CenterWidget, make sure msg_id is always valid
1 parent 445837e commit bf7d846

9 files changed

+80
-86
lines changed

tools/cabana/binaryview.cc

+4-6
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ void BinaryView::addShortcuts() {
107107
QObject::connect(shortcut_plot_c, &QShortcut::activated, shortcut_plot, &QShortcut::activated);
108108
QObject::connect(shortcut_plot, &QShortcut::activated, [=]{
109109
if (hovered_sig != nullptr) {
110-
emit showChart(*model->msg_id, hovered_sig, true, false);
110+
emit showChart(model->msg_id, hovered_sig, true, false);
111111
}
112112
});
113113
}
@@ -218,8 +218,6 @@ void BinaryView::setMessage(const MessageId &message_id) {
218218
}
219219

220220
void BinaryView::refresh() {
221-
if (!model->msg_id) return;
222-
223221
clearSelection();
224222
anchor_index = QModelIndex();
225223
resize_sig = nullptr;
@@ -253,7 +251,7 @@ std::tuple<int, int, bool> BinaryView::getSelection(QModelIndex index) {
253251
void BinaryViewModel::refresh() {
254252
beginResetModel();
255253
items.clear();
256-
if (auto dbc_msg = dbc()->msg(*msg_id)) {
254+
if (auto dbc_msg = dbc()->msg(msg_id)) {
257255
row_count = dbc_msg->size;
258256
items.resize(row_count * column_count);
259257
for (auto sig : dbc_msg->getSignals()) {
@@ -272,7 +270,7 @@ void BinaryViewModel::refresh() {
272270
}
273271
}
274272
} else {
275-
row_count = can->lastMessage(*msg_id).dat.size();
273+
row_count = can->lastMessage(msg_id).dat.size();
276274
items.resize(row_count * column_count);
277275
}
278276
endResetModel();
@@ -281,7 +279,7 @@ void BinaryViewModel::refresh() {
281279

282280
void BinaryViewModel::updateState() {
283281
auto prev_items = items;
284-
const auto &last_msg = can->lastMessage(*msg_id);
282+
const auto &last_msg = can->lastMessage(msg_id);
285283
const auto &binary = last_msg.dat;
286284

287285
// data size may changed.

tools/cabana/binaryview.h

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
#pragma once
22

3-
#include <optional>
4-
53
#include <QApplication>
64
#include <QList>
75
#include <QSet>
@@ -50,7 +48,7 @@ class BinaryViewModel : public QAbstractTableModel {
5048
};
5149
std::vector<Item> items;
5250

53-
std::optional<MessageId> msg_id;
51+
MessageId msg_id;
5452
int row_count = 0;
5553
const int column_count = 9;
5654
};

tools/cabana/detailwidget.cc

+43-43
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@
1010
// DetailWidget
1111

1212
DetailWidget::DetailWidget(ChartsWidget *charts, QWidget *parent) : charts(charts), QWidget(parent) {
13-
QWidget *main_widget = new QWidget(this);
14-
QVBoxLayout *main_layout = new QVBoxLayout(main_widget);
13+
QVBoxLayout *main_layout = new QVBoxLayout(this);
1514
main_layout->setContentsMargins(0, 0, 0, 0);
1615

1716
// tabbar
@@ -65,10 +64,6 @@ DetailWidget::DetailWidget(ChartsWidget *charts, QWidget *parent) : charts(chart
6564
tab_widget->addTab(history_log = new LogsWidget(this), utils::icon("stopwatch"), "&Logs");
6665
main_layout->addWidget(tab_widget);
6766

68-
stacked_layout = new QStackedLayout(this);
69-
stacked_layout->addWidget(new WelcomeWidget(this));
70-
stacked_layout->addWidget(main_widget);
71-
7267
QObject::connect(binary_view, &BinaryView::resizeSignal, signal_view->model, &SignalModel::resizeSignal);
7368
QObject::connect(binary_view, &BinaryView::addSignal, signal_view->model, &SignalModel::addSignal);
7469
QObject::connect(binary_view, &BinaryView::signalHovered, signal_view, &SignalView::signalHovered);
@@ -109,20 +104,8 @@ void DetailWidget::showTabBarContextMenu(const QPoint &pt) {
109104
}
110105
}
111106

112-
void DetailWidget::removeAll() {
113-
msg_id = std::nullopt;
114-
stacked_layout->setCurrentIndex(0);
115-
tabbar->blockSignals(true);
116-
while (tabbar->count() > 0) {
117-
tabbar->removeTab(0);
118-
}
119-
tabbar->blockSignals(false);
120-
}
121-
122107
void DetailWidget::setMessage(const MessageId &message_id) {
123-
if (message_id == msg_id) return;
124-
125-
msg_id = message_id;
108+
if (std::exchange(msg_id, message_id) == message_id) return;
126109

127110
tabbar->blockSignals(true);
128111
int index = tabbar->count() - 1;
@@ -138,24 +121,18 @@ void DetailWidget::setMessage(const MessageId &message_id) {
138121
tabbar->blockSignals(false);
139122

140123
setUpdatesEnabled(false);
141-
142-
signal_view->setMessage(*msg_id);
143-
binary_view->setMessage(*msg_id);
144-
history_log->setMessage(*msg_id);
145-
146-
stacked_layout->setCurrentIndex(1);
124+
signal_view->setMessage(msg_id);
125+
binary_view->setMessage(msg_id);
126+
history_log->setMessage(msg_id);
147127
refresh();
148-
149128
setUpdatesEnabled(true);
150129
}
151130

152131
void DetailWidget::refresh() {
153-
if (!msg_id) return;
154-
155132
QStringList warnings;
156-
auto msg = dbc()->msg(*msg_id);
133+
auto msg = dbc()->msg(msg_id);
157134
if (msg) {
158-
if (msg->size != can->lastMessage(*msg_id).dat.size()) {
135+
if (msg->size != can->lastMessage(msg_id).dat.size()) {
159136
warnings.push_back(tr("Message size (%1) is incorrect.").arg(msg->size));
160137
}
161138
for (auto s : binary_view->getOverlappingSignals()) {
@@ -165,7 +142,7 @@ void DetailWidget::refresh() {
165142
warnings.push_back(tr("Drag-Select in binary view to create new signal."));
166143
}
167144
remove_msg_act->setEnabled(msg != nullptr);
168-
name_label->setText(msgName(*msg_id));
145+
name_label->setText(msgName(msg_id));
169146

170147
if (!warnings.isEmpty()) {
171148
warning_label->setText(warnings.join('\n'));
@@ -176,7 +153,7 @@ void DetailWidget::refresh() {
176153

177154
void DetailWidget::updateState(const QHash<MessageId, CanData> *msgs) {
178155
time_label->setText(QString::number(can->currentSec(), 'f', 3));
179-
if (!msg_id || (msgs && !msgs->contains(*msg_id)))
156+
if ((msgs && !msgs->contains(msg_id)))
180157
return;
181158

182159
if (tab_widget->currentIndex() == 0)
@@ -186,17 +163,16 @@ void DetailWidget::updateState(const QHash<MessageId, CanData> *msgs) {
186163
}
187164

188165
void DetailWidget::editMsg() {
189-
MessageId id = *msg_id;
190-
auto msg = dbc()->msg(id);
191-
int size = msg ? msg->size : can->lastMessage(id).dat.size();
192-
EditMessageDialog dlg(id, msgName(id), size, this);
166+
auto msg = dbc()->msg(msg_id);
167+
int size = msg ? msg->size : can->lastMessage(msg_id).dat.size();
168+
EditMessageDialog dlg(msg_id, msgName(msg_id), size, this);
193169
if (dlg.exec()) {
194-
UndoStack::push(new EditMsgCommand(*msg_id, dlg.name_edit->text(), dlg.size_spin->value()));
170+
UndoStack::push(new EditMsgCommand(msg_id, dlg.name_edit->text(), dlg.size_spin->value()));
195171
}
196172
}
197173

198174
void DetailWidget::removeMsg() {
199-
UndoStack::push(new RemoveMsgCommand(*msg_id));
175+
UndoStack::push(new RemoveMsgCommand(msg_id));
200176
}
201177

202178
// EditMessageDialog
@@ -242,10 +218,33 @@ void EditMessageDialog::validateName(const QString &text) {
242218
btn_box->button(QDialogButtonBox::Ok)->setEnabled(valid);
243219
}
244220

245-
// WelcomeWidget
221+
// CenterWidget
246222

247-
WelcomeWidget::WelcomeWidget(QWidget *parent) : QWidget(parent) {
223+
CenterWidget::CenterWidget(ChartsWidget *charts, QWidget *parent) : charts(charts), QWidget(parent) {
248224
QVBoxLayout *main_layout = new QVBoxLayout(this);
225+
main_layout->addWidget(welcome_widget = createWelcomeWidget());
226+
}
227+
228+
void CenterWidget::setMessage(const MessageId &msg_id) {
229+
if (!detail_widget) {
230+
delete welcome_widget;
231+
welcome_widget = nullptr;
232+
layout()->addWidget(detail_widget = new DetailWidget(charts, this));
233+
}
234+
detail_widget->setMessage(msg_id);
235+
}
236+
237+
void CenterWidget::clear() {
238+
delete detail_widget;
239+
detail_widget = nullptr;
240+
if (!welcome_widget) {
241+
layout()->addWidget(welcome_widget = createWelcomeWidget());
242+
}
243+
}
244+
245+
QWidget *CenterWidget::createWelcomeWidget() {
246+
QWidget *w = new QWidget(this);
247+
QVBoxLayout *main_layout = new QVBoxLayout(w);
249248
main_layout->addStretch(0);
250249
QLabel *logo = new QLabel("CABANA");
251250
logo->setAlignment(Qt::AlignCenter);
@@ -270,7 +269,8 @@ WelcomeWidget::WelcomeWidget(QWidget *parent) : QWidget(parent) {
270269
main_layout->addLayout(newShortcutRow("WhatsThis", "Shift+F1"));
271270
main_layout->addStretch(0);
272271

273-
setStyleSheet("QLabel{color:darkGray;}");
274-
setBackgroundRole(QPalette::Base);
275-
setAutoFillBackground(true);
272+
w->setStyleSheet("QLabel{color:darkGray;}");
273+
w->setBackgroundRole(QPalette::Base);
274+
w->setAutoFillBackground(true);
275+
return w;
276276
}

tools/cabana/detailwidget.h

+15-9
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
#include <QDialogButtonBox>
44
#include <QSplitter>
5-
#include <QStackedLayout>
65
#include <QTabWidget>
76
#include <QToolBar>
87

@@ -24,19 +23,13 @@ class EditMessageDialog : public QDialog {
2423
QSpinBox *size_spin;
2524
};
2625

27-
class WelcomeWidget : public QWidget {
28-
public:
29-
WelcomeWidget(QWidget *parent);
30-
};
31-
3226
class DetailWidget : public QWidget {
3327
Q_OBJECT
3428

3529
public:
3630
DetailWidget(ChartsWidget *charts, QWidget *parent);
3731
void setMessage(const MessageId &message_id);
3832
void refresh();
39-
void removeAll();
4033
QSize minimumSizeHint() const override { return binary_view->minimumSizeHint(); }
4134

4235
private:
@@ -45,7 +38,7 @@ class DetailWidget : public QWidget {
4538
void removeMsg();
4639
void updateState(const QHash<MessageId, CanData> * msgs = nullptr);
4740

48-
std::optional<MessageId> msg_id;
41+
MessageId msg_id;
4942
QLabel *time_label, *warning_icon, *warning_label;
5043
ElidedLabel *name_label;
5144
QWidget *warning_widget;
@@ -57,5 +50,18 @@ class DetailWidget : public QWidget {
5750
SignalView *signal_view;
5851
ChartsWidget *charts;
5952
QSplitter *splitter;
60-
QStackedLayout *stacked_layout;
53+
};
54+
55+
class CenterWidget : public QWidget {
56+
Q_OBJECT
57+
public:
58+
CenterWidget(ChartsWidget* charts, QWidget *parent);
59+
void setMessage(const MessageId &msg_id);
60+
void clear();
61+
62+
private:
63+
QWidget *createWelcomeWidget();
64+
DetailWidget *detail_widget = nullptr;
65+
QWidget *welcome_widget = nullptr;
66+
ChartsWidget *charts;
6167
};

tools/cabana/historylog.cc

+11-15
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ void HistoryLogModel::setMessage(const MessageId &message_id) {
3030
void HistoryLogModel::refresh(bool fetch_message) {
3131
beginResetModel();
3232
sigs.clear();
33-
if (auto dbc_msg = dbc()->msg(*msg_id)) {
33+
if (auto dbc_msg = dbc()->msg(msg_id)) {
3434
sigs = dbc_msg->getSignals();
3535
}
3636
last_fetch_time = 0;
@@ -81,17 +81,15 @@ void HistoryLogModel::setFilter(int sig_idx, const QString &value, std::function
8181
}
8282

8383
void HistoryLogModel::updateState() {
84-
if (msg_id) {
85-
uint64_t current_time = (can->lastMessage(*msg_id).ts + can->routeStartTime()) * 1e9 + 1;
86-
auto new_msgs = dynamic_mode ? fetchData(current_time, last_fetch_time) : fetchData(0);
87-
if (!new_msgs.empty()) {
88-
beginInsertRows({}, 0, new_msgs.size() - 1);
89-
messages.insert(messages.begin(), std::move_iterator(new_msgs.begin()), std::move_iterator(new_msgs.end()));
90-
endInsertRows();
91-
}
92-
has_more_data = new_msgs.size() >= batch_size;
93-
last_fetch_time = current_time;
84+
uint64_t current_time = (can->lastMessage(msg_id).ts + can->routeStartTime()) * 1e9 + 1;
85+
auto new_msgs = dynamic_mode ? fetchData(current_time, last_fetch_time) : fetchData(0);
86+
if (!new_msgs.empty()) {
87+
beginInsertRows({}, 0, new_msgs.size() - 1);
88+
messages.insert(messages.begin(), std::move_iterator(new_msgs.begin()), std::move_iterator(new_msgs.end()));
89+
endInsertRows();
9490
}
91+
has_more_data = new_msgs.size() >= batch_size;
92+
last_fetch_time = current_time;
9593
}
9694

9795
void HistoryLogModel::fetchMore(const QModelIndex &parent) {
@@ -113,7 +111,7 @@ std::deque<HistoryLogModel::Message> HistoryLogModel::fetchData(InputIt first, I
113111
for (auto it = first; it != last && (*it)->mono_time > min_time; ++it) {
114112
if ((*it)->which == cereal::Event::Which::CAN) {
115113
for (const auto &c : (*it)->event.getCan()) {
116-
if (msg_id->address == c.getAddress() && msg_id->source == c.getSrc()) {
114+
if (msg_id.address == c.getAddress() && msg_id.source == c.getSrc()) {
117115
const auto dat = c.getDat();
118116
for (int i = 0; i < sigs.size(); ++i) {
119117
values[i] = get_raw_value((uint8_t *)dat.begin(), dat.size(), *sigs[i]);
@@ -138,7 +136,7 @@ template std::deque<HistoryLogModel::Message> HistoryLogModel::fetchData<>(std::
138136

139137
std::deque<HistoryLogModel::Message> HistoryLogModel::fetchData(uint64_t from_time, uint64_t min_time) {
140138
auto events = can->events();
141-
const auto freq = can->lastMessage(*msg_id).freq;
139+
const auto freq = can->lastMessage(msg_id).freq;
142140
const bool update_colors = !display_signals_mode || sigs.empty();
143141

144142
if (dynamic_mode) {
@@ -250,8 +248,6 @@ void LogsWidget::setMessage(const MessageId &message_id) {
250248
}
251249

252250
void LogsWidget::refresh() {
253-
if (!model->msg_id) return;
254-
255251
model->setFilter(0, "", nullptr);
256252
model->refresh(isVisible());
257253
bool has_signal = model->sigs.size();

tools/cabana/historylog.h

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
#pragma once
22

33
#include <deque>
4-
#include <optional>
5-
64
#include <QCheckBox>
75
#include <QComboBox>
86
#include <QHeaderView>
@@ -55,7 +53,7 @@ public slots:
5553
std::deque<HistoryLogModel::Message> fetchData(InputIt first, InputIt last, uint64_t min_time);
5654
std::deque<Message> fetchData(uint64_t from_time, uint64_t min_time = 0);
5755

58-
std::optional<MessageId> msg_id;
56+
MessageId msg_id;
5957
ChangeTracker hex_colors;
6058
bool has_more_data = true;
6159
const int batch_size = 50;

tools/cabana/mainwin.cc

+4-4
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ void qLogMessageHandler(QtMsgType type, const QMessageLogContext &context, const
2727

2828
MainWindow::MainWindow() : QMainWindow() {
2929
createDockWindows();
30-
detail_widget = new DetailWidget(charts_widget, this);
31-
setCentralWidget(detail_widget);
30+
center_widget = new CenterWidget(charts_widget, this);
31+
setCentralWidget(center_widget);
3232
createActions();
3333
createStatusBar();
3434
createShortcuts();
@@ -60,7 +60,7 @@ MainWindow::MainWindow() : QMainWindow() {
6060

6161
QObject::connect(this, &MainWindow::showMessage, statusBar(), &QStatusBar::showMessage);
6262
QObject::connect(this, &MainWindow::updateProgressBar, this, &MainWindow::updateDownloadProgress);
63-
QObject::connect(messages_widget, &MessagesWidget::msgSelectionChanged, detail_widget, &DetailWidget::setMessage);
63+
QObject::connect(messages_widget, &MessagesWidget::msgSelectionChanged, center_widget, &CenterWidget::setMessage);
6464
QObject::connect(charts_widget, &ChartsWidget::dock, this, &MainWindow::dockCharts);
6565
QObject::connect(can, &AbstractStream::streamStarted, this, &MainWindow::loadDBCFromFingerprint);
6666
QObject::connect(dbc(), &DBCManager::DBCFileChanged, this, &MainWindow::DBCFileChanged);
@@ -198,7 +198,7 @@ void MainWindow::DBCFileChanged() {
198198
void MainWindow::openRoute() {
199199
OpenRouteDialog dlg(this);
200200
if (dlg.exec()) {
201-
detail_widget->removeAll();
201+
center_widget->clear();
202202
charts_widget->removeAll();
203203
statusBar()->showMessage(tr("Route %1 loaded").arg(can->routeName()), 2000);
204204
} else if (dlg.failedToLoad()) {

tools/cabana/mainwin.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public slots:
5959
VideoWidget *video_widget = nullptr;
6060
QDockWidget *video_dock;
6161
MessagesWidget *messages_widget;
62-
DetailWidget *detail_widget;
62+
CenterWidget *center_widget;
6363
ChartsWidget *charts_widget;
6464
QWidget *floating_window = nullptr;
6565
QVBoxLayout *charts_layout;

0 commit comments

Comments
 (0)