#include "tools/cabana/mainwin.h" #include #include #include #include #include #include #include MainWindow::MainWindow() : QWidget() { QVBoxLayout *main_layout = new QVBoxLayout(this); QHBoxLayout *h_layout = new QHBoxLayout(); main_layout->addLayout(h_layout); QSplitter *splitter = new QSplitter(Qt::Horizontal, this); messages_widget = new MessagesWidget(this); splitter->addWidget(messages_widget); detail_widget = new DetailWidget(this); splitter->addWidget(detail_widget); splitter->setSizes({100, 500}); h_layout->addWidget(splitter); // right widgets QWidget *right_container = new QWidget(this); right_container->setFixedWidth(640); r_layout = new QVBoxLayout(right_container); QPushButton *settings_btn = new QPushButton("Settings"); r_layout->addWidget(settings_btn, 0, Qt::AlignRight); video_widget = new VideoWidget(this); r_layout->addWidget(video_widget, 0, Qt::AlignTop); charts_widget = new ChartsWidget(this); r_layout->addWidget(charts_widget); h_layout->addWidget(right_container); QObject::connect(messages_widget, &MessagesWidget::msgSelectionChanged, detail_widget, &DetailWidget::setMessage); QObject::connect(detail_widget, &DetailWidget::showChart, charts_widget, &ChartsWidget::addChart); QObject::connect(charts_widget, &ChartsWidget::dock, this, &MainWindow::dockCharts); QObject::connect(settings_btn, &QPushButton::clicked, this, &MainWindow::setOption); } void MainWindow::dockCharts(bool dock) { charts_widget->setUpdatesEnabled(false); if (dock && floating_window) { floating_window->removeEventFilter(charts_widget); r_layout->addWidget(charts_widget); floating_window->deleteLater(); floating_window = nullptr; } else if (!dock && !floating_window) { floating_window = new QWidget(nullptr); floating_window->setLayout(new QVBoxLayout()); floating_window->layout()->addWidget(charts_widget); floating_window->installEventFilter(charts_widget); floating_window->setMinimumSize(QGuiApplication::primaryScreen()->size() / 2); floating_window->showMaximized(); } charts_widget->setUpdatesEnabled(true); } void MainWindow::closeEvent(QCloseEvent *event) { if (floating_window) floating_window->deleteLater(); QWidget::closeEvent(event); } void MainWindow::setOption() { SettingsDlg dlg(this); dlg.exec(); } // SettingsDlg SettingsDlg::SettingsDlg(QWidget *parent) : QDialog(parent) { setWindowTitle(tr("Settings")); QVBoxLayout *main_layout = new QVBoxLayout(this); QFormLayout *form_layout = new QFormLayout(); fps = new QSpinBox(this); fps->setRange(10, 100); fps->setSingleStep(10); fps->setValue(settings.fps); form_layout->addRow("FPS", fps); log_size = new QSpinBox(this); log_size->setRange(50, 500); log_size->setSingleStep(10); log_size->setValue(settings.can_msg_log_size); form_layout->addRow(tr("Log size"), log_size); cached_segment = new QSpinBox(this); cached_segment->setRange(3, 60); cached_segment->setSingleStep(1); cached_segment->setValue(settings.cached_segment_limit); form_layout->addRow(tr("Cached segments limit"), cached_segment); chart_height = new QSpinBox(this); chart_height->setRange(100, 500); chart_height->setSingleStep(10); chart_height->setValue(settings.chart_height); form_layout->addRow(tr("Chart height"), chart_height); main_layout->addLayout(form_layout); auto buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); main_layout->addWidget(buttonBox); setFixedWidth(360); connect(buttonBox, &QDialogButtonBox::accepted, this, &SettingsDlg::save); connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); } void SettingsDlg::save() { settings.fps = fps->value(); settings.can_msg_log_size = log_size->value(); settings.cached_segment_limit = cached_segment->value(); settings.chart_height = chart_height->value(); settings.save(); accept(); }