You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							170 lines
						
					
					
						
							6.5 KiB
						
					
					
				
			
		
		
	
	
							170 lines
						
					
					
						
							6.5 KiB
						
					
					
				#include "tools/cabana/settings.h"
 | 
						|
 | 
						|
#include <QAbstractButton>
 | 
						|
#include <QDialogButtonBox>
 | 
						|
#include <QDir>
 | 
						|
#include <QFileDialog>
 | 
						|
#include <QFormLayout>
 | 
						|
#include <QPushButton>
 | 
						|
#include <QSettings>
 | 
						|
#include <QStandardPaths>
 | 
						|
 | 
						|
#include "tools/cabana/util.h"
 | 
						|
 | 
						|
Settings settings;
 | 
						|
 | 
						|
Settings::Settings() {
 | 
						|
  load();
 | 
						|
}
 | 
						|
 | 
						|
void Settings::save() {
 | 
						|
  QSettings s("settings", QSettings::IniFormat);
 | 
						|
  s.setValue("fps", fps);
 | 
						|
  s.setValue("max_cached_minutes", max_cached_minutes);
 | 
						|
  s.setValue("chart_height", chart_height);
 | 
						|
  s.setValue("chart_range", chart_range);
 | 
						|
  s.setValue("chart_column_count", chart_column_count);
 | 
						|
  s.setValue("last_dir", last_dir);
 | 
						|
  s.setValue("last_route_dir", last_route_dir);
 | 
						|
  s.setValue("window_state", window_state);
 | 
						|
  s.setValue("geometry", geometry);
 | 
						|
  s.setValue("video_splitter_state", video_splitter_state);
 | 
						|
  s.setValue("recent_files", recent_files);
 | 
						|
  s.setValue("message_header_state_v3", message_header_state);
 | 
						|
  s.setValue("chart_series_type", chart_series_type);
 | 
						|
  s.setValue("theme", theme);
 | 
						|
  s.setValue("sparkline_range", sparkline_range);
 | 
						|
  s.setValue("multiple_lines_bytes", multiple_lines_bytes);
 | 
						|
  s.setValue("log_livestream", log_livestream);
 | 
						|
  s.setValue("log_path", log_path);
 | 
						|
  s.setValue("drag_direction", drag_direction);
 | 
						|
  s.setValue("suppress_defined_signals", suppress_defined_signals);
 | 
						|
}
 | 
						|
 | 
						|
void Settings::load() {
 | 
						|
  QSettings s("settings", QSettings::IniFormat);
 | 
						|
  fps = s.value("fps", 10).toInt();
 | 
						|
  max_cached_minutes = s.value("max_cached_minutes", 30).toInt();
 | 
						|
  chart_height = s.value("chart_height", 200).toInt();
 | 
						|
  chart_range = s.value("chart_range", 3 * 60).toInt();
 | 
						|
  chart_column_count = s.value("chart_column_count", 1).toInt();
 | 
						|
  last_dir = s.value("last_dir", QDir::homePath()).toString();
 | 
						|
  last_route_dir = s.value("last_route_dir", QDir::homePath()).toString();
 | 
						|
  window_state = s.value("window_state").toByteArray();
 | 
						|
  geometry = s.value("geometry").toByteArray();
 | 
						|
  video_splitter_state = s.value("video_splitter_state").toByteArray();
 | 
						|
  recent_files = s.value("recent_files").toStringList();
 | 
						|
  message_header_state = s.value("message_header_state_v3").toByteArray();
 | 
						|
  chart_series_type = s.value("chart_series_type", 0).toInt();
 | 
						|
  theme = s.value("theme", 0).toInt();
 | 
						|
  sparkline_range = s.value("sparkline_range", 15).toInt();
 | 
						|
  multiple_lines_bytes = s.value("multiple_lines_bytes", true).toBool();
 | 
						|
  log_livestream = s.value("log_livestream", true).toBool();
 | 
						|
  log_path = s.value("log_path").toString();
 | 
						|
  drag_direction = (Settings::DragDirection)s.value("drag_direction", 0).toInt();
 | 
						|
  suppress_defined_signals = s.value("suppress_defined_signals", false).toBool();
 | 
						|
  if (log_path.isEmpty()) {
 | 
						|
    log_path = QStandardPaths::writableLocation(QStandardPaths::HomeLocation) + "/cabana_live_stream/";
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
// SettingsDlg
 | 
						|
 | 
						|
SettingsDlg::SettingsDlg(QWidget *parent) : QDialog(parent) {
 | 
						|
  setWindowTitle(tr("Settings"));
 | 
						|
  QVBoxLayout *main_layout = new QVBoxLayout(this);
 | 
						|
  QGroupBox *groupbox = new QGroupBox("General");
 | 
						|
  QFormLayout *form_layout = new QFormLayout(groupbox);
 | 
						|
 | 
						|
  theme = new QComboBox(this);
 | 
						|
  theme->setToolTip(tr("You may need to restart cabana after changes theme"));
 | 
						|
  theme->addItems({tr("Automatic"), tr("Light"), tr("Dark")});
 | 
						|
  theme->setCurrentIndex(settings.theme);
 | 
						|
  form_layout->addRow(tr("Color Theme"), theme);
 | 
						|
 | 
						|
  fps = new QSpinBox(this);
 | 
						|
  fps->setRange(10, 100);
 | 
						|
  fps->setSingleStep(10);
 | 
						|
  fps->setValue(settings.fps);
 | 
						|
  form_layout->addRow("FPS", fps);
 | 
						|
 | 
						|
  cached_minutes = new QSpinBox(this);
 | 
						|
  cached_minutes->setRange(5, 60);
 | 
						|
  cached_minutes->setSingleStep(1);
 | 
						|
  cached_minutes->setValue(settings.max_cached_minutes);
 | 
						|
  form_layout->addRow(tr("Max Cached Minutes"), cached_minutes);
 | 
						|
  main_layout->addWidget(groupbox);
 | 
						|
 | 
						|
  groupbox = new QGroupBox("New Signal Settings");
 | 
						|
  form_layout = new QFormLayout(groupbox);
 | 
						|
  drag_direction = new QComboBox(this);
 | 
						|
  drag_direction->addItems({tr("MSB First"), tr("LSB First"), tr("Always Little Endian"), tr("Always Big Endian")});
 | 
						|
  drag_direction->setCurrentIndex(settings.drag_direction);
 | 
						|
  form_layout->addRow(tr("Drag Direction"), drag_direction);
 | 
						|
  main_layout->addWidget(groupbox);
 | 
						|
 | 
						|
  groupbox = new QGroupBox("Chart");
 | 
						|
  form_layout = new QFormLayout(groupbox);
 | 
						|
  chart_series_type = new QComboBox(this);
 | 
						|
  chart_series_type->addItems({tr("Line"), tr("Step Line"), tr("Scatter")});
 | 
						|
  chart_series_type->setCurrentIndex(settings.chart_series_type);
 | 
						|
  form_layout->addRow(tr("Chart Default Series Type"), chart_series_type);
 | 
						|
 | 
						|
  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->addWidget(groupbox);
 | 
						|
 | 
						|
  log_livestream = new QGroupBox(tr("Enable live stream logging"), this);
 | 
						|
  log_livestream->setCheckable(true);
 | 
						|
  QHBoxLayout *path_layout = new QHBoxLayout(log_livestream);
 | 
						|
  path_layout->addWidget(log_path = new QLineEdit(settings.log_path, this));
 | 
						|
  log_path->setReadOnly(true);
 | 
						|
  auto browse_btn = new QPushButton(tr("B&rowse..."));
 | 
						|
  path_layout->addWidget(browse_btn);
 | 
						|
  main_layout->addWidget(log_livestream);
 | 
						|
 | 
						|
 | 
						|
  auto buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel | QDialogButtonBox::Apply);
 | 
						|
  main_layout->addWidget(buttonBox);
 | 
						|
  main_layout->addStretch(1);
 | 
						|
 | 
						|
  QObject::connect(browse_btn, &QPushButton::clicked, [this]() {
 | 
						|
    QString fn = QFileDialog::getExistingDirectory(
 | 
						|
        this, tr("Log File Location"),
 | 
						|
        QStandardPaths::writableLocation(QStandardPaths::HomeLocation),
 | 
						|
        QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
 | 
						|
    if (!fn.isEmpty()) {
 | 
						|
      log_path->setText(fn);
 | 
						|
    }
 | 
						|
  });
 | 
						|
  QObject::connect(buttonBox, &QDialogButtonBox::clicked, [=](QAbstractButton *button) {
 | 
						|
    auto role = buttonBox->buttonRole(button);
 | 
						|
    if (role == QDialogButtonBox::AcceptRole) {
 | 
						|
      save();
 | 
						|
      accept();
 | 
						|
    } else if (role == QDialogButtonBox::ApplyRole) {
 | 
						|
      save();
 | 
						|
    } else if (role == QDialogButtonBox::RejectRole) {
 | 
						|
      reject();
 | 
						|
    }
 | 
						|
  });
 | 
						|
}
 | 
						|
 | 
						|
void SettingsDlg::save() {
 | 
						|
  settings.fps = fps->value();
 | 
						|
  if (std::exchange(settings.theme, theme->currentIndex()) != settings.theme) {
 | 
						|
    // set theme before emit changed
 | 
						|
    utils::setTheme(settings.theme);
 | 
						|
  }
 | 
						|
  settings.max_cached_minutes = cached_minutes->value();
 | 
						|
  settings.chart_series_type = chart_series_type->currentIndex();
 | 
						|
  settings.chart_height = chart_height->value();
 | 
						|
  settings.log_livestream = log_livestream->isChecked();
 | 
						|
  settings.log_path = log_path->text();
 | 
						|
  settings.drag_direction = (Settings::DragDirection)drag_direction->currentIndex();
 | 
						|
  settings.save();
 | 
						|
  emit settings.changed();
 | 
						|
}
 | 
						|
 |