From 38db02d160cd273d8b603087ae5d2cd03bfd724b Mon Sep 17 00:00:00 2001 From: Jofkos Date: Sat, 16 Mar 2024 17:55:00 +0100 Subject: [PATCH 1/3] Allowing to parse date as extended ISO 8601 ISO 8601 parsing is highly flexible. This allows to load data of different origin using different date formats subsequently, without having to adjust the date format string every time when switching back and forth. --- plotjuggler_plugins/DataLoadCSV/dataload_csv.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plotjuggler_plugins/DataLoadCSV/dataload_csv.cpp b/plotjuggler_plugins/DataLoadCSV/dataload_csv.cpp index 872e24d29..6c059a3b9 100644 --- a/plotjuggler_plugins/DataLoadCSV/dataload_csv.cpp +++ b/plotjuggler_plugins/DataLoadCSV/dataload_csv.cpp @@ -530,9 +530,9 @@ bool DataLoadCSV::readDataFromFile(FileLoadInfo* info, PlotDataMapRef& plot_data static QLocale locale_with_comma(QLocale::German); val = locale_with_comma.toDouble(str_trimmed, &is_number); } - if (!is_number && parse_date_format && !format_string.isEmpty()) + if (!is_number && parse_date_format) { - QDateTime ts = QDateTime::fromString(str_trimmed, format_string); + QDateTime ts = !format_string.isEmpty() ? QDateTime::fromString(str_trimmed, format_string) : QDateTime::fromString(str_trimmed, Qt::ISODateWithMs); is_number = ts.isValid(); if (is_number) { From bb463757f986ce682c2a0858ed378328f92e9ac7 Mon Sep 17 00:00:00 2001 From: Jofkos Date: Sun, 31 Mar 2024 16:13:11 +0200 Subject: [PATCH 2/3] Added UI to select ISO 8601 date parsing --- .../DataLoadCSV/dataload_csv.cpp | 35 +++++++++++++++---- .../DataLoadCSV/dataload_csv.ui | 17 +++++++++ 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/plotjuggler_plugins/DataLoadCSV/dataload_csv.cpp b/plotjuggler_plugins/DataLoadCSV/dataload_csv.cpp index 6c059a3b9..72e9e727d 100644 --- a/plotjuggler_plugins/DataLoadCSV/dataload_csv.cpp +++ b/plotjuggler_plugins/DataLoadCSV/dataload_csv.cpp @@ -119,7 +119,19 @@ DataLoadCSV::DataLoadCSV() [this]() { emit _ui->buttonBox->accepted(); }); connect(_ui->checkBoxDateFormat, &QCheckBox::toggled, this, - [this](bool checked) { _ui->lineEditDateFormat->setEnabled(checked); }); + [this](bool checked) { + _ui->radioCustomDate->setEnabled(checked); + _ui->radioIso8601Date->setEnabled(checked); + _ui->lineEditDateFormat->setEnabled(_ui->radioCustomDate->isChecked()); + }); + + connect(_ui->radioCustomDate, &QRadioButton::clicked, this, [this](bool checked){ + _ui->lineEditDateFormat->setEnabled(checked); + }); + + connect(_ui->radioIso8601Date, &QRadioButton::clicked, this, [this](bool checked){ + _ui->lineEditDateFormat->setEnabled(!checked); + }); connect(_ui->dateTimeHelpButton, &QPushButton::clicked, this, [this]() { _dateTime_dialog->show(); }); @@ -490,6 +502,7 @@ bool DataLoadCSV::readDataFromFile(FileLoadInfo* info, PlotDataMapRef& plot_data double prev_time = std::numeric_limits::lowest(); bool parse_date_format = _ui->checkBoxDateFormat->isChecked(); QString format_string = _ui->lineEditDateFormat->text(); + bool parse_iso_8601 = _ui->radioIso8601Date->isChecked(); auto ParseTimestamp = [&](QString str, bool& is_number) { QString str_trimmed = str.trimmed(); @@ -530,9 +543,9 @@ bool DataLoadCSV::readDataFromFile(FileLoadInfo* info, PlotDataMapRef& plot_data static QLocale locale_with_comma(QLocale::German); val = locale_with_comma.toDouble(str_trimmed, &is_number); } - if (!is_number && parse_date_format) + if (!is_number && parse_date_format && (!format_string.isEmpty() || parse_iso_8601)) { - QDateTime ts = !format_string.isEmpty() ? QDateTime::fromString(str_trimmed, format_string) : QDateTime::fromString(str_trimmed, Qt::ISODateWithMs); + QDateTime ts = parse_iso_8601 ? QDateTime::fromString(str_trimmed, Qt::ISODateWithMs) : QDateTime::fromString(str_trimmed, format_string); is_number = ts.isValid(); if (is_number) { @@ -551,9 +564,9 @@ bool DataLoadCSV::readDataFromFile(FileLoadInfo* info, PlotDataMapRef& plot_data static QLocale locale_with_comma(QLocale::German); val = locale_with_comma.toDouble(str_trimmed, &is_number); } - if (!is_number && parse_date_format && !format_string.isEmpty()) + if (!is_number && parse_date_format && (!format_string.isEmpty() || parse_iso_8601)) { - QDateTime ts = QDateTime::fromString(str_trimmed, format_string); + QDateTime ts = parse_iso_8601 ? QDateTime::fromString(str_trimmed, Qt::ISODateWithMs) : QDateTime::fromString(str_trimmed, format_string); is_number = ts.isValid(); if (is_number) { @@ -779,12 +792,16 @@ bool DataLoadCSV::xmlSaveState(QDomDocument& doc, QDomElement& parent_element) c elem.setAttribute("time_axis", _default_time_axis.c_str()); elem.setAttribute("delimiter", _ui->comboBox->currentIndex()); - QString date_format; if (_ui->checkBoxDateFormat->isChecked()) { elem.setAttribute("date_format", _ui->lineEditDateFormat->text()); } + if (_ui->radioIso8601Date->isChecked()) + { + elem.setAttribute("date_format_iso", "ISO8601"); + } + parent_element.appendChild(elem); return true; } @@ -822,5 +839,11 @@ bool DataLoadCSV::xmlLoadState(const QDomElement& parent_element) _ui->checkBoxDateFormat->setChecked(true); _ui->lineEditDateFormat->setText(elem.attribute("date_format")); } + if (elem.hasAttribute("date_format_iso")) + { + _ui->radioIso8601Date->setChecked(true); + } else { + _ui->radioCustomDate->setChecked(true); + } return true; } diff --git a/plotjuggler_plugins/DataLoadCSV/dataload_csv.ui b/plotjuggler_plugins/DataLoadCSV/dataload_csv.ui index ea88253b1..d602740ce 100644 --- a/plotjuggler_plugins/DataLoadCSV/dataload_csv.ui +++ b/plotjuggler_plugins/DataLoadCSV/dataload_csv.ui @@ -131,6 +131,23 @@ + + + + ISO 8601 + + + true + + + + + + + Custom + + + From 1d5ec5a5bf311f361c03c3af56376ab59fefd027 Mon Sep 17 00:00:00 2001 From: Jofkos Date: Sun, 31 Mar 2024 18:25:55 +0200 Subject: [PATCH 3/3] CSV: fixed saving of last settings used --- plotjuggler_plugins/DataLoadCSV/dataload_csv.cpp | 9 ++++++--- plotjuggler_plugins/DataLoadCSV/dataload_csv.ui | 6 ++++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/plotjuggler_plugins/DataLoadCSV/dataload_csv.cpp b/plotjuggler_plugins/DataLoadCSV/dataload_csv.cpp index 72e9e727d..dcdd9d48d 100644 --- a/plotjuggler_plugins/DataLoadCSV/dataload_csv.cpp +++ b/plotjuggler_plugins/DataLoadCSV/dataload_csv.cpp @@ -122,14 +122,14 @@ DataLoadCSV::DataLoadCSV() [this](bool checked) { _ui->radioCustomDate->setEnabled(checked); _ui->radioIso8601Date->setEnabled(checked); - _ui->lineEditDateFormat->setEnabled(_ui->radioCustomDate->isChecked()); + _ui->lineEditDateFormat->setEnabled(checked && _ui->radioCustomDate->isChecked()); }); - connect(_ui->radioCustomDate, &QRadioButton::clicked, this, [this](bool checked){ + connect(_ui->radioCustomDate, &QRadioButton::toggled, this, [this](bool checked){ _ui->lineEditDateFormat->setEnabled(checked); }); - connect(_ui->radioIso8601Date, &QRadioButton::clicked, this, [this](bool checked){ + connect(_ui->radioIso8601Date, &QRadioButton::toggled, this, [this](bool checked){ _ui->lineEditDateFormat->setEnabled(!checked); }); @@ -311,6 +311,8 @@ int DataLoadCSV::launchDialog(QFile& file, std::vector* column_name settings.value("DataLoadCSV.useIndex", false).toBool()); _ui->checkBoxDateFormat->setChecked( settings.value("DataLoadCSV.useDateFormat", false).toBool()); + _ui->radioCustomDate->setChecked( + !settings.value("DataLoadCSV.useISO8601", true).toBool()); _ui->lineEditDateFormat->setText( settings.value("DataLoadCSV.dateFormat", "yyyy-MM-dd hh:mm:ss").toString()); @@ -391,6 +393,7 @@ int DataLoadCSV::launchDialog(QFile& file, std::vector* column_name settings.setValue("DataLoadCSV.geometry", _dialog->saveGeometry()); settings.setValue("DataLoadCSV.useIndex", _ui->radioButtonIndex->isChecked()); settings.setValue("DataLoadCSV.useDateFormat", _ui->checkBoxDateFormat->isChecked()); + settings.setValue("DataLoadCSV.useISO8601", _ui->radioIso8601Date->isChecked()); settings.setValue("DataLoadCSV.dateFormat", _ui->lineEditDateFormat->text()); if (res == QDialog::Rejected) diff --git a/plotjuggler_plugins/DataLoadCSV/dataload_csv.ui b/plotjuggler_plugins/DataLoadCSV/dataload_csv.ui index d602740ce..42ac606e3 100644 --- a/plotjuggler_plugins/DataLoadCSV/dataload_csv.ui +++ b/plotjuggler_plugins/DataLoadCSV/dataload_csv.ui @@ -133,6 +133,9 @@ + + false + ISO 8601 @@ -143,6 +146,9 @@ + + false + Custom