diff --git a/src/backend/datasources/DatasetHandler.cpp b/src/backend/datasources/DatasetHandler.cpp index fbf6f9ff9..d1612bc3f 100644 --- a/src/backend/datasources/DatasetHandler.cpp +++ b/src/backend/datasources/DatasetHandler.cpp @@ -1,273 +1,269 @@ /*************************************************************************** -File : MQTTTopic.cpp +File : DatasetHandler.cpp Project : LabPlot Description : Processes a dataset's metadata file -------------------------------------------------------------------- Copyright : (C) 2019 Kovacs Ferencz (kferike98@gmail.com) ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, * * Boston, MA 02110-1301 USA * * * ***************************************************************************/ +#include "backend/datasources/filters/AsciiFilter.h" #include "backend/datasources/DatasetHandler.h" -#include "QJsonDocument" -#include "QJsonArray" -#include "QJsonObject" -#include "QJsonValue" -#include "QFile" -#include "backend/datasources/filters/AsciiFilter.h" -#include -#include "QMessageBox" -#include "KLocalizedString" -#include "QStandardPaths" -#include "QDir" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include DatasetHandler::DatasetHandler(const QString& name, bool loading) : Spreadsheet(name, loading), - m_filter(new AsciiFilter()), - m_document(new QJsonDocument()), - m_downloadManager(new QNetworkAccessManager()) -{ + m_filter(new AsciiFilter), + m_document(new QJsonDocument), + m_downloadManager(new QNetworkAccessManager) { connect(m_downloadManager, &QNetworkAccessManager::finished, this, &DatasetHandler::downloadFinished); connect(this, &DatasetHandler::downloadCompleted, this, &DatasetHandler::processDataset); } -DatasetHandler::~DatasetHandler(){ +DatasetHandler::~DatasetHandler() { delete m_document; delete m_downloadManager; delete m_filter; } void DatasetHandler::processMetadata(const QString& path) { qDebug("Start processing dataset..."); loadJsonDocument(path); m_containingDir = path.left(path.lastIndexOf(QDir::separator())); qDebug() << m_containingDir; if(!m_document->isEmpty()) { configureFilter(); configureSpreadsheet(); prepareForDataset(); } } void DatasetHandler::loadJsonDocument(const QString& path) { qDebug("Load Json document for metadata"); QFile file(path); if (file.open(QIODevice::ReadOnly)) { m_document = new QJsonDocument(QJsonDocument::fromJson(file.readAll())); file.close(); } else { qDebug("Couldn't open dataset category file"); } } void DatasetHandler::markMetadataAsInvalid() { m_invalidMetadataFile = true; QMessageBox::critical(0, "Invalid metadata file", "The metadata file for the choosen dataset is invalid!"); } void DatasetHandler::configureFilter() { qDebug("Configure filter"); if(m_document->isObject()) { QJsonObject jsonObject = m_document->object(); if(jsonObject.contains("separator")) m_filter->setSeparatingCharacter( jsonObject.value("separator").toString()); else markMetadataAsInvalid(); if(jsonObject.contains("comment_character")) m_filter->setCommentCharacter(jsonObject.value("comment_character").toString()); else markMetadataAsInvalid(); if(jsonObject.contains("create_index_column")) m_filter->setCreateIndexEnabled(jsonObject.value("create_index_column").toBool()); else markMetadataAsInvalid(); if(jsonObject.contains("skip_empty_parts")) m_filter->setSkipEmptyParts(jsonObject.value("skip_empty_parts").toBool()); else markMetadataAsInvalid(); if(jsonObject.contains("simplify_whitespaces")) m_filter->setSimplifyWhitespacesEnabled(jsonObject.value("simplify_whitespaces").toBool()); else markMetadataAsInvalid(); if(jsonObject.contains("remove_quotes")) m_filter->setRemoveQuotesEnabled(jsonObject.value("remove_quotes").toBool()); else markMetadataAsInvalid(); if(jsonObject.contains("use_first_row_for_vectorname")) m_filter->setHeaderEnabled(jsonObject.value("use_first_row_for_vectorname").toBool()); else markMetadataAsInvalid(); if(jsonObject.contains("number_format")) m_filter->setNumberFormat(QLocale::Language(jsonObject.value("number_format").toInt())); else markMetadataAsInvalid(); if(jsonObject.contains("DateTime_format")) m_filter->setDateTimeFormat(jsonObject.value("DateTime_format").toString()); else markMetadataAsInvalid(); } else { markMetadataAsInvalid(); } } void DatasetHandler::configureSpreadsheet() { qDebug("Conf spreadsheet"); if(m_document->isObject()) { - QJsonObject jsonObject = m_document->object(); + const QJsonObject& jsonObject = m_document->object(); if(jsonObject.contains("name")) setName( jsonObject.value("name").toString()); else markMetadataAsInvalid(); if(jsonObject.contains("description")) setComment(jsonObject.value("description").toString()); } else { markMetadataAsInvalid(); } } void DatasetHandler::prepareForDataset() { qDebug("Start downloading dataset"); if(m_document->isObject()) { - QJsonObject jsonObject = m_document->object(); + const QJsonObject& jsonObject = m_document->object(); if(jsonObject.contains("download")) { - QString url = jsonObject.value("download").toString(); - QUrl downloadUrl = QUrl::fromEncoded(url.toLocal8Bit()); + const QString& url = jsonObject.value("download").toString(); + const QUrl downloadUrl = QUrl::fromEncoded(url.toLocal8Bit()); doDownload(url); } else { QMessageBox::critical(0, i18n("Invalid metadata file"), i18n("There is no download URL present in the metadata file!")); } } else { markMetadataAsInvalid(); } } -void DatasetHandler::doDownload(const QUrl &url) -{ +void DatasetHandler::doDownload(const QUrl& url) { qDebug("Download request"); QNetworkRequest request(url); - QNetworkReply *reply = m_downloadManager->get(request); - - m_currentDownload = reply; + m_currentDownload = m_downloadManager->get(request); } -void DatasetHandler::downloadFinished(QNetworkReply *reply) -{ +void DatasetHandler::downloadFinished(QNetworkReply* reply) { qDebug("Download finished"); - QUrl url = reply->url(); + const QUrl& url = reply->url(); if (reply->error()) { qDebug("Download of %s failed: %s\n", url.toEncoded().constData(), qPrintable(reply->errorString())); } else { if (isHttpRedirect(reply)) { qDebug("Request was redirected.\n"); } else { QString filename = saveFileName(url); if (saveToDisk(filename, reply)) { qDebug("Download of %s succeeded (saved to %s)\n", url.toEncoded().constData(), qPrintable(filename)); m_fileName = filename; emit downloadCompleted(); } } } m_currentDownload = nullptr; reply->deleteLater(); } -bool DatasetHandler::isHttpRedirect(QNetworkReply *reply) -{ - int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); +bool DatasetHandler::isHttpRedirect(QNetworkReply* reply) { + const int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); + // TODO enum/defines for status codes ? return statusCode == 301 || statusCode == 302 || statusCode == 303 || statusCode == 305 || statusCode == 307 || statusCode == 308; } -QString DatasetHandler::saveFileName(const QUrl &url) -{ - QString path = url.path(); +QString DatasetHandler::saveFileName(const QUrl& url) { + const QString path = url.path(); QString basename = QFileInfo(path).fileName(); if (basename.isEmpty()) basename = "download"; QString fileName = m_containingDir + QDir::separator() + basename; - if (QFile::exists(fileName)) { + if (QFile::exists(fileName)) { // already exists, don't overwrite int i = 0; fileName += '.'; while (QFile::exists(fileName + QString::number(i))) ++i; fileName += QString::number(i); } return fileName; } -bool DatasetHandler::saveToDisk(const QString &filename, QIODevice *data) { +bool DatasetHandler::saveToDisk(const QString& filename, QIODevice* data) { QFile file(filename); if (!file.open(QIODevice::WriteOnly)) { qDebug("Could not open %s for writing: %s\n", qPrintable(filename), qPrintable(file.errorString())); return false; } file.write(data->readAll()); file.close(); return true; } void DatasetHandler::processDataset() { m_filter->readDataFromFile(m_fileName, this); configureColumns(); } void DatasetHandler::configureColumns() { if(m_document->isObject()) { - QJsonObject jsonObject = m_document->object(); + const QJsonObject jsonObject = m_document->object(); int index = 0; - while(jsonObject.contains(i18n("column_description_%1", index)) && index < columnCount()) { + const int columnsCount = columnCount(); + while(jsonObject.contains(i18n("column_description_%1", index)) && (index < columnsCount)) { column(index)->setComment(jsonObject.value(i18n("column_description_%1", index)).toString()); - index++; + ++index; } } else { qDebug("Invalid Json document"); } } diff --git a/src/backend/datasources/DatasetHandler.h b/src/backend/datasources/DatasetHandler.h index e0814c1cf..c1656e7e0 100644 --- a/src/backend/datasources/DatasetHandler.h +++ b/src/backend/datasources/DatasetHandler.h @@ -1,75 +1,75 @@ /*************************************************************************** File : DatasetHandler.h Project : LabPlot Description : Processes a dataset's metadata file -------------------------------------------------------------------- Copyright : (C) 2019 Kovacs Ferencz (kferike98@gmail.com) ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, * * Boston, MA 02110-1301 USA * * * ***************************************************************************/ #ifndef DATASETHANDLER_H #define DATASETHANDLER_H -#include "QString" +#include #include "backend/spreadsheet/Spreadsheet.h" class QJsonDocument; class AsciiFilter; class QNetworkAccessManager; class QNetworkReply; class DatasetHandler : public Spreadsheet { Q_OBJECT public: DatasetHandler(const QString& name, bool loading = false); ~DatasetHandler() override; void processMetadata(const QString& path); private: AsciiFilter* m_filter; QJsonDocument* m_document; QNetworkAccessManager* m_downloadManager; QNetworkReply* m_currentDownload; QString m_fileName; bool m_invalidMetadataFile{false}; QString m_containingDir; void loadJsonDocument(const QString& path); void configureFilter(); void configureSpreadsheet(); void prepareForDataset(); void processDataset(); void doDownload(const QUrl &url); bool isHttpRedirect(QNetworkReply *reply); QString saveFileName(const QUrl &url); bool saveToDisk(const QString &filename, QIODevice *data); void markMetadataAsInvalid(); void configureColumns(); private slots: void downloadFinished(QNetworkReply *reply); signals: void downloadCompleted(); }; #endif // DATASETHANDLER_H diff --git a/src/kdefrontend/datasources/DatasetMetadataManagerDialog.cpp b/src/kdefrontend/datasources/DatasetMetadataManagerDialog.cpp index 84f465d22..e0a2df43b 100644 --- a/src/kdefrontend/datasources/DatasetMetadataManagerDialog.cpp +++ b/src/kdefrontend/datasources/DatasetMetadataManagerDialog.cpp @@ -1,90 +1,92 @@ /*************************************************************************** File : DatasetMetadataManagerDialog.cpp Project : LabPlot -Description : dialog for managing a metadata file of a dataset +Description : Dialog for managing a metadata file of a dataset -------------------------------------------------------------------- Copyright : (C) 2019 Ferencz Kovacs (kferike98@gmail.com) ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, * * Boston, MA 02110-1301 USA * * * ***************************************************************************/ -#include "DatasetMetadataManagerDialog.h" -#include "DatasetMetadataManagerWidget.h" -#include "KLocalizedString" -#include "QDialogButtonBox" -#include "KConfigGroup" -#include "KSharedConfig" -#include "KWindowConfig" -#include "QWindow" -#include "QPushButton" +#include "src/kdefrontend/datasources/DatasetMetadataManagerDialog.h" +#include "src/kdefrontend/datasources/DatasetMetadataManagerWidget.h" + +#include +#include +#include +#include +#include +#include +#include DatasetMetadataManagerDialog::DatasetMetadataManagerDialog(QWidget* parent, const QMap>>& datasetMap) : QDialog(parent), - m_mainWidget(new DatasetMetadataManagerWidget(this, datasetMap)) -{ + m_mainWidget(new DatasetMetadataManagerWidget(this, datasetMap)), + m_buttonBox(nullptr), + m_okButton(nullptr) { connect(m_mainWidget, &DatasetMetadataManagerWidget::checkOk, this, &DatasetMetadataManagerDialog::checkOkButton); setWindowTitle(i18nc("@title:window", "Dataset metadata manager")); m_buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); - okButton = m_buttonBox->button(QDialogButtonBox::Ok); - okButton->setEnabled(false); + m_okButton = m_buttonBox->button(QDialogButtonBox::Ok); + m_okButton->setEnabled(false); QVBoxLayout* layout = new QVBoxLayout(this); layout->addWidget(m_mainWidget); layout->addWidget(m_buttonBox); connect(m_buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); connect(m_buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); //restore saved settings if available create(); // ensure there's a window created KConfigGroup conf(KSharedConfig::openConfig(), "DatasetMetadataManagerDialog"); if (conf.exists()) { KWindowConfig::restoreWindowSize(windowHandle(), conf); resize(windowHandle()->size()); // workaround for QTBUG-40584 } else resize(QSize(0, 0).expandedTo(minimumSize())); checkOkButton(); } DatasetMetadataManagerDialog::~DatasetMetadataManagerDialog() { //save current settings KConfigGroup conf(KSharedConfig::openConfig(), "DatasetMetadataManagerDialog"); KWindowConfig::saveWindowSize(windowHandle(), conf); } void DatasetMetadataManagerDialog::checkOkButton() { bool enable = m_mainWidget->checkDataValidity(); - okButton->setEnabled(enable); + m_okButton->setEnabled(enable); } -void DatasetMetadataManagerDialog::updateDocument(const QString &fileName) { +void DatasetMetadataManagerDialog::updateDocument(const QString& fileName) { m_mainWidget->updateDocument(fileName); } void DatasetMetadataManagerDialog::createNewMetadata(const QString& dirPath) { m_mainWidget->createNewMetadata(dirPath); } -QString DatasetMetadataManagerDialog::getMetadataFilePath() { +QString DatasetMetadataManagerDialog::getMetadataFilePath() const { return m_mainWidget->getMetadataFilePath(); } diff --git a/src/kdefrontend/datasources/DatasetMetadataManagerDialog.h b/src/kdefrontend/datasources/DatasetMetadataManagerDialog.h index 9b552ffc9..cf1a681cf 100644 --- a/src/kdefrontend/datasources/DatasetMetadataManagerDialog.h +++ b/src/kdefrontend/datasources/DatasetMetadataManagerDialog.h @@ -1,56 +1,56 @@ /*************************************************************************** -File : DatasetMetadataManagerDialog.cpp +File : DatasetMetadataManagerDialog.h Project : LabPlot -Description : dialog for managing a metadata file of a dataset +Description : Dialog for managing a metadata file of a dataset -------------------------------------------------------------------- Copyright : (C) 2019 Ferencz Kovacs (kferike98@gmail.com) ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, * * Boston, MA 02110-1301 USA * * * ***************************************************************************/ #ifndef DATASETMETADATAMANAGERDIALOG_H #define DATASETMETADATAMANAGERDIALOG_H #include class QDialogButtonBox; class DatasetMetadataManagerWidget; class DatasetMetadataManagerDialog : public QDialog { Q_OBJECT public: explicit DatasetMetadataManagerDialog(QWidget*, const QMap>>&); - ~DatasetMetadataManagerDialog() override; + virtual ~DatasetMetadataManagerDialog() override; void updateDocument(const QString& fileName); void createNewMetadata(const QString& dirPath); - QString getMetadataFilePath(); + QString getMetadataFilePath() const; private: DatasetMetadataManagerWidget* m_mainWidget; QDialogButtonBox* m_buttonBox; - QPushButton* okButton{nullptr}; + QPushButton* m_okButton; protected slots: void checkOkButton(); }; #endif // DATASETMETADATAMANAGERDIALOG_H diff --git a/src/kdefrontend/datasources/DatasetMetadataManagerWidget.cpp b/src/kdefrontend/datasources/DatasetMetadataManagerWidget.cpp index 3c67ed547..a8f2c3075 100644 --- a/src/kdefrontend/datasources/DatasetMetadataManagerWidget.cpp +++ b/src/kdefrontend/datasources/DatasetMetadataManagerWidget.cpp @@ -1,484 +1,489 @@ /*************************************************************************** File : DatasetMetadataManagerWidget.cpp Project : LabPlot Description : widget for managing a metadata file of a dataset -------------------------------------------------------------------- Copyright : (C) 2019 Ferencz Kovacs (kferike98@gmail.com) ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, * * Boston, MA 02110-1301 USA * * * ***************************************************************************/ -#include "DatasetMetadataManagerWidget.h" -#include "QMap" -#include "QStringList" -#include "QMapIterator" #include "backend/datasources/filters/AsciiFilter.h" -#include "QRegExpValidator" -#include "QRegExp" -#include "QUrl" -#include "QTcpSocket" -#include "QJsonDocument" -#include "QJsonArray" -#include "QJsonObject" -#include "QJsonValue" -#include "QFile" -#include "QDir" -#include "KConfigGroup" -#include "KSharedConfig" -#include "QHBoxLayout" +#include "src/kdefrontend/datasources/DatasetMetadataManagerWidget.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include DatasetMetadataManagerWidget::DatasetMetadataManagerWidget(QWidget* parent, const QMap>>& datasetMap) : QWidget(parent) { - ui.setupUi(this); initCategories(datasetMap); initSubcategories(datasetMap); initDatasets(datasetMap); ui.cbSeparatingCharacter->addItems(AsciiFilter::separatorCharacters()); ui.cbCommentCharacter->addItems(AsciiFilter::commentCharacters()); ui.cbNumberFormat->addItems(AbstractFileFilter::numberFormats()); ui.cbDateTimeFormat->addItems(AbstractColumn::dateTimeFormats()); connect(ui.leDatasetName, &QLineEdit::textChanged, [this] { emit checkOk(); }); connect(ui.leDownloadURL, &QLineEdit::textChanged, [this] { emit checkOk(); }); connect(ui.teDescription, &QTextEdit::textChanged, [this] { emit checkOk(); }); connect(ui.leFileName, &QLineEdit::textChanged, [this] { emit checkOk(); }); connect(ui.cbSubcategory, &QComboBox::currentTextChanged, [this] { emit checkOk(); }); connect(ui.cbCategory, &QComboBox::currentTextChanged, this, &DatasetMetadataManagerWidget::updateSubcategories); connect(ui.bNewColumn, &QPushButton::clicked, this, &DatasetMetadataManagerWidget::addColumnDescription); connect(ui.bDelete, &QPushButton::clicked, this, &DatasetMetadataManagerWidget::removeColumnDescription); loadSettings(); } DatasetMetadataManagerWidget::~DatasetMetadataManagerWidget() { KConfigGroup conf(KSharedConfig::openConfig(), "DatasetMetadataManagerWidget"); //filter settings conf.writeEntry("Separator", ui.cbSeparatingCharacter->currentText()); conf.writeEntry("CommentChar", ui.cbCommentCharacter->currentText()); conf.writeEntry("NumberFormat", ui.cbNumberFormat->currentIndex()); conf.writeEntry("DateTimeFormat", ui.cbDateTimeFormat->currentText()); conf.writeEntry("create_index_column", ui.chbCreateIndex->isChecked()); conf.writeEntry("skip_empty_parts", ui.chbSkipEmptyParts->isChecked()); conf.writeEntry("simplify_whitespaces", ui.chbSimplifyWhitespaces->isChecked()); conf.writeEntry("remove_quotes", ui.chbRemoveQuotes->isChecked()); conf.writeEntry("use_first_row_for_vectorname", ui.chbHeader->isChecked()); - } void DatasetMetadataManagerWidget::loadSettings() { KConfigGroup conf(KSharedConfig::openConfig(), "DatasetMetadataManagerWidget"); ui.cbCommentCharacter->setCurrentItem(conf.readEntry("CommentChar", "#")); ui.cbSeparatingCharacter->setCurrentItem(conf.readEntry("Separator", "auto")); ui.cbNumberFormat->setCurrentIndex(conf.readEntry("NumberFormat", (int)QLocale::AnyLanguage)); ui.cbDateTimeFormat->setCurrentItem(conf.readEntry("DateTimeFormat", "yyyy-MM-dd hh:mm:ss.zzz")); ui.chbCreateIndex->setChecked(conf.readEntry("create_index_column", false)); ui.chbSimplifyWhitespaces->setChecked(conf.readEntry("simplify_whitespaces", true)); ui.chbRemoveQuotes->setChecked(conf.readEntry("remove_quotes", false)); ui.chbSkipEmptyParts->setChecked(conf.readEntry("skip_empty_parts", false)); ui.chbHeader->setChecked(conf.readEntry("use_first_row_for_vectorname", true)); } void DatasetMetadataManagerWidget::initCategories(const QMap>>& datasetMap) { - m_categoryList = datasetMap.keys(); + m_categoryList = datasetMap.keys(); ui.cbCategory->addItems(m_categoryList); } void DatasetMetadataManagerWidget::initSubcategories(const QMap>>& datasetMap) { - for(auto i = datasetMap.begin(); i != datasetMap.end(); ++i) { + for(auto i = datasetMap.begin(); i != datasetMap.end(); ++i) { m_subcategoryMap[i.key()] = i.value().keys(); } QString selectedCategory = ui.cbCategory->currentText(); - ui.cbSubcategory->addItems(m_subcategoryMap[selectedCategory]); + if (m_subcategoryMap.contains(selectedCategory)) + ui.cbSubcategory->addItems(m_subcategoryMap[selectedCategory]); } void DatasetMetadataManagerWidget::initDatasets(const QMap>>& datasetMap) { for(auto category = datasetMap.begin(); category != datasetMap.end(); ++category) { - for(auto subcategory = category.value().begin(); subcategory != category.value().end(); ++subcategory) { + const QMap>& category_ = category.value(); + + for(auto subcategory = category_.begin(); subcategory != category_.end(); ++subcategory) { m_datasetMap[subcategory.key()] = subcategory.value().toList(); m_datasetList.append(subcategory.value().toList()); } } } bool DatasetMetadataManagerWidget::checkFileName() { - QString fileName = ui.leFileName->text(); - QRegularExpression re("^[\\w\\d-]+$"); - QRegularExpressionMatch match = re.match(fileName); + const QString fileName = ui.leFileName->text(); + const QRegularExpression re("^[\\w\\d-]+$"); + const QRegularExpressionMatch match = re.match(fileName); bool hasMatch = match.hasMatch(); qDebug() << hasMatch; if(!hasMatch || fileName.isEmpty()) { qDebug("File name invalid"); QPalette palette; - palette.setColor(QPalette::Base,Qt::red); - palette.setColor(QPalette::Text,Qt::black); + palette.setColor(QPalette::Base, Qt::red); + palette.setColor(QPalette::Text, Qt::black); ui.leFileName->setPalette(palette); ui.leFileName->setToolTip("Invalid name for a file (it can contain:digits, letters, -, _)"); } else { qDebug("File name valid"); QPalette palette; - palette.setColor(QPalette::Base,Qt::white); - palette.setColor(QPalette::Text,Qt::black); + palette.setColor(QPalette::Base, Qt::white); + palette.setColor(QPalette::Text, Qt::black); ui.leFileName->setPalette(palette); ui.leFileName->setToolTip(""); } bool found = false; if(m_datasetList.contains(fileName)) { qDebug("There already is a metadata file with this name"); QPalette palette; - palette.setColor(QPalette::Base,Qt::red); - palette.setColor(QPalette::Text,Qt::black); + palette.setColor(QPalette::Base, Qt::red); + palette.setColor(QPalette::Text, Qt::black); ui.leFileName->setPalette(palette); ui.leFileName->setToolTip("There already is a dataset metadata file with this name!"); found = true; } else { qDebug("Dataset metadata file name is unique"); if(hasMatch) { QPalette palette; - palette.setColor(QPalette::Base,Qt::white); + palette.setColor(QPalette::Base, Qt::white); palette.setColor(QPalette::Text,Qt::black); ui.leFileName->setPalette(palette); ui.leFileName->setToolTip(""); } } return hasMatch && !found; } bool DatasetMetadataManagerWidget::urlExists() { - if(!QUrl(ui.leDownloadURL->text()).isValid() || ui.leDownloadURL->text().isEmpty()) { + const bool urlExists_ = (QUrl(ui.leDownloadURL->text()).isValid()) && !ui.leDownloadURL->text().isEmpty(); + if(!urlExists_){ QPalette palette; - palette.setColor(QPalette::Base,Qt::red); - palette.setColor(QPalette::Text,Qt::black); + palette.setColor(QPalette::Base, Qt::red); + palette.setColor(QPalette::Text, Qt::black); ui.leDownloadURL->setPalette(palette); ui.leDownloadURL->setToolTip("The URL is invalid!"); } else { QPalette palette; - palette.setColor(QPalette::Base,Qt::white); - palette.setColor(QPalette::Text,Qt::black); + palette.setColor(QPalette::Base, Qt::white); + palette.setColor(QPalette::Text, Qt::black); ui.leDownloadURL->setPalette(palette); ui.leDownloadURL->setToolTip(""); - return true; } - return false; + return urlExists_; } bool DatasetMetadataManagerWidget::checkDatasetName() { - bool longNameOk = !ui.leDatasetName->text().isEmpty(); - if(!longNameOk) { + const bool longNameOk = !ui.leDatasetName->text().isEmpty(); + if(!longNameOk) { QPalette palette; - palette.setColor(QPalette::Base,Qt::red); - palette.setColor(QPalette::Text,Qt::black); + palette.setColor(QPalette::Base, Qt::red); + palette.setColor(QPalette::Text, Qt::black); ui.leDatasetName->setPalette(palette); ui.leDatasetName->setToolTip("Please fill this out!"); } else { QPalette palette; - palette.setColor(QPalette::Base,Qt::white); - palette.setColor(QPalette::Text,Qt::black); + palette.setColor(QPalette::Base, Qt::white); + palette.setColor(QPalette::Text, Qt::black); ui.leDatasetName->setPalette(palette); - ui.leDatasetName->setToolTip(""); + ui.leDatasetName->setToolTip(""); } - return longNameOk; + return longNameOk; } bool DatasetMetadataManagerWidget::checkDescription() { - bool descriptionOk = !ui.teDescription->toPlainText().isEmpty(); - if(!descriptionOk) { + const bool descriptionOk = !ui.teDescription->toPlainText().isEmpty(); + if(!descriptionOk) { QPalette palette; - palette.setColor(QPalette::Base,Qt::red); - palette.setColor(QPalette::Text,Qt::black); + palette.setColor(QPalette::Base, Qt::red); + palette.setColor(QPalette::Text, Qt::black); ui.teDescription->setPalette(palette); ui.teDescription->setToolTip("Please fill this out!"); } else { QPalette palette; - palette.setColor(QPalette::Base,Qt::white); - palette.setColor(QPalette::Text,Qt::black); + palette.setColor(QPalette::Base, Qt::white); + palette.setColor(QPalette::Text, Qt::black); ui.teDescription->setPalette(palette); ui.teDescription->setToolTip(""); } return descriptionOk; } bool DatasetMetadataManagerWidget::checkCategories(QComboBox* comboBox) { - QString fileName = comboBox->currentText(); - QRegularExpression re("^[\\w\\d]+$"); - QRegularExpressionMatch match = re.match(fileName); - bool hasMatch = match.hasMatch(); + const QString fileName = comboBox->currentText(); + const QRegularExpression re("^[\\w\\d]+$"); + const QRegularExpressionMatch match = re.match(fileName); + const bool hasMatch = match.hasMatch(); qDebug() << hasMatch; if(!hasMatch || fileName.isEmpty()) { qDebug("categoty/subcategory name invalid"); QPalette palette; palette.setColor(QPalette::Base,Qt::red); palette.setColor(QPalette::Text,Qt::black); comboBox->setPalette(palette); comboBox->setToolTip("Invalid or empty name for a category/subcategory (only digits and letters)"); } else { qDebug("categoty/subcategory name valid"); QPalette palette; palette.setColor(QPalette::Base,Qt::white); palette.setColor(QPalette::Text,Qt::black); comboBox->setPalette(palette); comboBox->setToolTip(""); } return hasMatch; } void DatasetMetadataManagerWidget::enableDatasetSettings(bool enable) { ui.leFileName->setEnabled(enable); ui.leFileName->setReadOnly(!enable); ui.leDatasetName->setEnabled(enable); ui.leDatasetName->setReadOnly(!enable); ui.leDownloadURL->setEnabled(enable); ui.leDownloadURL->setReadOnly(!enable); ui.teDescription->setEnabled(enable); ui.teDescription->setReadOnly(!enable); ui.gbColumnDescriptions->setEnabled(enable); ui.gbFilter->setEnabled(enable); } bool DatasetMetadataManagerWidget::checkDataValidity() { - bool fileNameOK = checkFileName(); - bool urlOk = urlExists(); - bool longNameOk = checkDatasetName(); - bool descriptionOk = checkDescription(); - bool categoryOk = checkCategories(ui.cbCategory); - bool subcategoryOk = checkCategories(ui.cbSubcategory); + const bool fileNameOK = checkFileName(); + const bool urlOk = urlExists(); + const bool longNameOk = checkDatasetName(); + const bool descriptionOk = checkDescription(); + const bool categoryOk = checkCategories(ui.cbCategory); + const bool subcategoryOk = checkCategories(ui.cbSubcategory); enableDatasetSettings(categoryOk && subcategoryOk); return fileNameOK && urlOk && longNameOk && descriptionOk && subcategoryOk && categoryOk; } void DatasetMetadataManagerWidget::updateSubcategories(const QString& category) { ui.cbSubcategory->clear(); if(m_categoryList.contains(category)) { ui.cbSubcategory->addItems(m_subcategoryMap[category]); } emit checkOk(); } void DatasetMetadataManagerWidget::updateDocument(const QString& fileName) { qDebug() << "updating: " << fileName; QFile file(fileName); if (file.open(QIODevice::ReadWrite)) { QJsonDocument document = QJsonDocument::fromJson(file.readAll()); //qDebug() <currentText()) == 0) { foundCategory = true; QJsonValueRef subcategoryArrayRef = currentCategory.find("subcategories").value(); QJsonArray subcategoryArray = subcategoryArrayRef.toArray(); qDebug() << "subcategoryArray: " << subcategoryArray.toVariantList(); bool subcategoryFound = false; for(int j = 0; j < subcategoryArray.size(); ++j) { QJsonValueRef subcategoryRef = subcategoryArray[j]; QJsonObject currentSubcategory = subcategoryRef.toObject(); QString subcategoryName = currentSubcategory.value("subcategory_name").toString(); qDebug() << "Subcat name: " << subcategoryName; if(subcategoryName.compare(ui.cbSubcategory->currentText()) == 0) { subcategoryFound = true; QJsonValueRef datasetsRef = currentSubcategory.find("datasets").value(); QJsonArray datasets = datasetsRef.toArray(); qDebug() <<"Datasets content: " << datasets.toVariantList(); datasets.append(QJsonValue(ui.leFileName->text())); datasetsRef = datasets; subcategoryRef = currentSubcategory; subcategoryArrayRef = subcategoryArray; categoryRef = currentCategory; categoryArrayRef = categoryArray; - document.setObject(RootObject); + document.setObject(rootObject); break; } } if(!subcategoryFound) { qDebug() << "Subcat not found"; QJsonObject newSubcategory; newSubcategory.insert("subcategory_name", ui.cbSubcategory->currentText()); QJsonArray datasets; datasets.append(QJsonValue(ui.leFileName->text())); newSubcategory.insert("datasets", datasets); subcategoryArray.append(newSubcategory); subcategoryArrayRef = subcategoryArray; categoryRef = currentCategory; categoryArrayRef = categoryArray; - document.setObject(RootObject); + document.setObject(rootObject); } break; } } if(!foundCategory) { qDebug() << "Cat not found"; QJsonObject newCategory; newCategory.insert("category_name", ui.cbCategory->currentText()); QJsonArray subcategoryArray; QJsonObject newSubcategory; newSubcategory.insert("subcategory_name", ui.cbSubcategory->currentText()); QJsonArray datasets; datasets.append(QJsonValue(ui.leFileName->text())); newSubcategory.insert("datasets", datasets); subcategoryArray.append(newSubcategory); newCategory.insert("subcategories", subcategoryArray); categoryArray.append(newCategory); categoryArrayRef = categoryArray; - document.setObject(RootObject); + document.setObject(rootObject); } qDebug() <currentText() + QDir::separator(); - - if(!QDir(path).exists()) { - qDebug() <currentText()); - } - - if(!QDir(path + ui.cbSubcategory->currentText()).exists()) { - qDebug() <currentText(); - QDir(path).mkdir(ui.cbSubcategory->currentText()); - } - - path = path + ui.cbSubcategory->currentText() + QDir::separator(); - m_metadataFilePath = path + ui.leFileName->text() + ".json"; - qDebug() << "Creating " << m_metadataFilePath; - - QFile file(m_metadataFilePath); - if (file.open(QIODevice::WriteOnly | QIODevice::Truncate)) { - QJsonObject rootObject; - - rootObject.insert("name", ui.leDatasetName->text()); - rootObject.insert("download", ui.leDownloadURL->text()); - rootObject.insert("description", ui.teDescription->toPlainText()); - rootObject.insert("separator", ui.cbSeparatingCharacter->currentText()); - rootObject.insert("comment_character", ui.cbCommentCharacter->currentText()); - rootObject.insert("DateTime_format", ui.cbDateTimeFormat->currentText()); - rootObject.insert("number_format", ui.cbNumberFormat->currentIndex()); - rootObject.insert("create_index_column", ui.chbCreateIndex->isChecked()); - rootObject.insert("skip_empty_parts", ui.chbSkipEmptyParts->isChecked()); - rootObject.insert("simplify_whitespaces", ui.chbSimplifyWhitespaces->isChecked()); - rootObject.insert("remove_quotes", ui.chbRemoveQuotes->isChecked()); - rootObject.insert("use_first_row_for_vectorname", ui.chbHeader->isChecked()); - - for(int i = 0; i < m_columnDescriptions.size(); i++) { - rootObject.insert(i18n("column_description_%1", i), m_columnDescriptions[i]); - } - - QJsonDocument document; - document.setObject(rootObject); - qDebug() <currentText() + QDir::separator(); + + if(!QDir(path).exists()) { + qDebug() <currentText()); + } + + if(!QDir(path + ui.cbSubcategory->currentText()).exists()) { + qDebug() <currentText(); + QDir(path).mkdir(ui.cbSubcategory->currentText()); + } + + path = path + ui.cbSubcategory->currentText() + QDir::separator(); + m_metadataFilePath = path + ui.leFileName->text() + ".json"; + qDebug() << "Creating " << m_metadataFilePath; + + QFile file(m_metadataFilePath); + if (file.open(QIODevice::WriteOnly | QIODevice::Truncate)) { + QJsonObject rootObject; + + rootObject.insert("name", ui.leDatasetName->text()); + rootObject.insert("download", ui.leDownloadURL->text()); + rootObject.insert("description", ui.teDescription->toPlainText()); + rootObject.insert("separator", ui.cbSeparatingCharacter->currentText()); + rootObject.insert("comment_character", ui.cbCommentCharacter->currentText()); + rootObject.insert("DateTime_format", ui.cbDateTimeFormat->currentText()); + rootObject.insert("number_format", ui.cbNumberFormat->currentIndex()); + rootObject.insert("create_index_column", ui.chbCreateIndex->isChecked()); + rootObject.insert("skip_empty_parts", ui.chbSkipEmptyParts->isChecked()); + rootObject.insert("simplify_whitespaces", ui.chbSimplifyWhitespaces->isChecked()); + rootObject.insert("remove_quotes", ui.chbRemoveQuotes->isChecked()); + rootObject.insert("use_first_row_for_vectorname", ui.chbHeader->isChecked()); + + for(int i = 0; i < m_columnDescriptions.size(); ++i) { + rootObject.insert(i18n("column_description_%1", i), m_columnDescriptions[i]); + } + + QJsonDocument document; + document.setObject(rootObject); + qDebug() <setText(i18n("Description for column %1", m_columnDescriptions.size() + 1)); QLineEdit* lineEdit = new QLineEdit; int layoutIndex = m_columnDescriptions.size() + 1; qDebug() << "Layout index " << layoutIndex; ui.columnLayout->addWidget(label, layoutIndex, 0); ui.columnLayout->addWidget(lineEdit, layoutIndex, 1, 1, -1); connect(lineEdit, &QLineEdit::textChanged, [this, layoutIndex] (const QString& text) { m_columnDescriptions[layoutIndex - 1] = text; qDebug() << m_columnDescriptions; }); m_columnDescriptions.append(""); } void DatasetMetadataManagerWidget::removeColumnDescription() { - int index = ui.columnLayout->count() - 1; + const int index = ui.columnLayout->count() - 1; QLayoutItem *item; - if ((item = ui.columnLayout->takeAt(index)) != 0) { + if ((item = ui.columnLayout->takeAt(index)) != nullptr) { delete item->widget(); delete item; } - if ((item = ui.columnLayout->takeAt(index - 1)) != 0){ + if ((item = ui.columnLayout->takeAt(index - 1)) != nullptr){ delete item->widget(); delete item; } m_columnDescriptions.removeLast(); } -QString DatasetMetadataManagerWidget::getMetadataFilePath() { +QString DatasetMetadataManagerWidget::getMetadataFilePath() const { return m_metadataFilePath; } diff --git a/src/kdefrontend/datasources/DatasetMetadataManagerWidget.h b/src/kdefrontend/datasources/DatasetMetadataManagerWidget.h index 55ea65f5c..c8c9977c4 100644 --- a/src/kdefrontend/datasources/DatasetMetadataManagerWidget.h +++ b/src/kdefrontend/datasources/DatasetMetadataManagerWidget.h @@ -1,76 +1,75 @@ /*************************************************************************** -File : DatasetMetadataManagerWidget.cpp +File : DatasetMetadataManagerWidget.h Project : LabPlot Description : widget for managing a metadata file of a dataset -------------------------------------------------------------------- Copyright : (C) 2019 Ferencz Kovacs (kferike98@gmail.com) ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, * * Boston, MA 02110-1301 USA * * * ***************************************************************************/ #ifndef DATASETMETADATAMANAGERWIDGET_H #define DATASETMETADATAMANAGERWIDGET_H #include "ui_datasetmetadatamanagerwidget.h" - class DatasetMetadataManagerWidget : public QWidget { Q_OBJECT public: explicit DatasetMetadataManagerWidget(QWidget*, const QMap>>&); - ~DatasetMetadataManagerWidget() override; + virtual ~DatasetMetadataManagerWidget() override; bool checkDataValidity(); void updateDocument(const QString& fileName); void createNewMetadata(const QString& dirPath); - QString getMetadataFilePath(); + QString getMetadataFilePath() const; private: Ui::DatasetMetadataManagerWidget ui; QStringList m_categoryList; QMap m_subcategoryMap; QMap m_datasetMap; - QStringList m_columnDescriptions; - QString m_metadataFilePath; - QStringList m_datasetList; + QStringList m_columnDescriptions; + QString m_metadataFilePath; + QStringList m_datasetList; void initCategories(const QMap>>&); void initSubcategories(const QMap>>&); void initDatasets(const QMap>>&); bool checkFileName(); - bool urlExists(); - bool checkDatasetName(); - bool checkDescription(); - bool checkCategories(QComboBox* comboBox); - void loadSettings(); - void enableDatasetSettings(bool); + bool urlExists(); + bool checkDatasetName(); + bool checkDescription(); + bool checkCategories(QComboBox*); + void loadSettings(); + void enableDatasetSettings(bool); private slots: void updateSubcategories(const QString&); - void addColumnDescription(); - void removeColumnDescription(); + void addColumnDescription(); + void removeColumnDescription(); signals: void checkOk(); }; #endif // DATASETMETADATAMANAGERWIDGET_H