diff --git a/src/asciireadersettings.cpp b/src/asciireadersettings.cpp --- a/src/asciireadersettings.cpp +++ b/src/asciireadersettings.cpp @@ -1,5 +1,5 @@ /* - Copyright © 2016 Hasan Yavuz Özderya + Copyright © 2017 Hasan Yavuz Özderya This file is part of serialplot. @@ -17,20 +17,35 @@ along with serialplot. If not, see . */ +#include +#include + #include "utils.h" #include "setting_defines.h" #include "asciireadersettings.h" #include "ui_asciireadersettings.h" -#include - AsciiReaderSettings::AsciiReaderSettings(QWidget *parent) : QWidget(parent), ui(new Ui::AsciiReaderSettings) { ui->setupUi(this); + auto validator = new QRegularExpressionValidator(QRegularExpression("[^\\d]?"), this); + ui->leDelimiter->setValidator(validator); + + connect(ui->rbComma, &QAbstractButton::toggled, + this, &AsciiReaderSettings::delimiterToggled); + connect(ui->rbSpace, &QAbstractButton::toggled, + this, &AsciiReaderSettings::delimiterToggled); + connect(ui->rbTab, &QAbstractButton::toggled, + this, &AsciiReaderSettings::delimiterToggled); + connect(ui->rbOtherDelimiter, &QAbstractButton::toggled, + this, &AsciiReaderSettings::delimiterToggled); + connect(ui->leDelimiter, &QLineEdit::textChanged, + this, &AsciiReaderSettings::customDelimiterChanged); + // Note: if directly connected we get a runtime warning on incompatible signal arguments connect(ui->spNumOfChannels, SELECT::OVERLOAD_OF(&QSpinBox::valueChanged), [this](int value) @@ -44,11 +59,51 @@ AsciiReaderSettings::~AsciiReaderSetting delete ui; } -unsigned AsciiReaderSettings::numOfChannels() +unsigned AsciiReaderSettings::numOfChannels() const { return ui->spNumOfChannels->value(); } +QChar AsciiReaderSettings::delimiter() const +{ + if (ui->rbComma->isChecked()) + { + return QChar(','); + } + else if (ui->rbSpace->isChecked()) + { + return QChar(' '); + } + else if (ui->rbTab->isChecked()) + { + return QChar('\t'); + } + else // rbOther + { + auto t = ui->leDelimiter->text(); + return t.isEmpty() ? QChar() : t.at(0); + } +} + +void AsciiReaderSettings::delimiterToggled(bool checked) +{ + if (!checked) return; + + auto d = delimiter(); + if (!d.isNull()) + { + emit delimiterChanged(d); + } +} + +void AsciiReaderSettings::customDelimiterChanged(const QString text) +{ + if (ui->rbOtherDelimiter->isChecked()) + { + if (!text.isEmpty()) emit delimiterChanged(text.at(0)); + } +} + void AsciiReaderSettings::saveSettings(QSettings* settings) { settings->beginGroup(SettingGroup_ASCII); @@ -58,6 +113,25 @@ void AsciiReaderSettings::saveSettings(Q if (numOfChannelsSetting == "0") numOfChannelsSetting = "auto"; settings->setValue(SG_ASCII_NumOfChannels, numOfChannelsSetting); + // save delimiter + QString delimiterS; + if (ui->rbOtherDelimiter->isChecked()) + { + delimiterS = "other"; + } + else if (ui->rbTab->isChecked()) + { + // Note: \t is not correctly loaded + delimiterS = "TAB"; + } + else + { + delimiterS = delimiter(); + } + + settings->setValue(SG_ASCII_Delimiter, delimiterS); + settings->setValue(SG_ASCII_CustomDelimiter, ui->leDelimiter->text()); + settings->endGroup(); } @@ -83,5 +157,26 @@ void AsciiReaderSettings::loadSettings(Q } } + // load delimiter + auto delimiterS = settings->value(SG_ASCII_Delimiter, delimiter()).toString(); + auto customDelimiter = settings->value(SG_ASCII_CustomDelimiter, delimiter()).toString(); + if (!customDelimiter.isEmpty()) ui->leDelimiter->setText(customDelimiter); + if (delimiterS == ",") + { + ui->rbComma->setChecked(true); + } + else if (delimiterS == " ") + { + ui->rbSpace->setChecked(true); + } + else if (delimiterS == "TAB") + { + ui->rbTab->setChecked(true); + } + else + { + ui->rbOtherDelimiter->setChecked(true); + } + settings->endGroup(); }