diff --git a/GUI/View/Import/SpecularDataImportWidget.cpp b/GUI/View/Import/SpecularDataImportWidget.cpp index ff52e7115e41ff3e3bc4dd1efe035b684243e251..25a7b3b5ba2ca3b5efc6b2603efae3b46ad2a779 100644 --- a/GUI/View/Import/SpecularDataImportWidget.cpp +++ b/GUI/View/Import/SpecularDataImportWidget.cpp @@ -17,17 +17,14 @@ #include "GUI/Model/Device/InstrumentItems.h" #include "GUI/Model/Project/ProjectDocument.h" #include "GUI/Support/IO/AbstractDataLoaderResultModel.h" -#include "GUI/Support/IO/DataLoaders1D.h" #include "GUI/View/Loaders/DataLoaderUtil.h" -#include "GUI/View/Tool/Globals.h" +#include "GUI/View/Loaders/QREDataLoader.h" #include "GUI/View/Widget/StyledToolbar.h" #include "GUI/View/PlotSpecular/SpecularDataCanvas.h" -#include "ui_SpecularDataImportWidget.h" #include <QAction> SpecularDataImportWidget::SpecularDataImportWidget(QWidget* parent) : DataAccessWidget(parent) - , m_ui(new Ui::SpecularDataImportWidget) , m_loader(nullptr) { setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); @@ -56,6 +53,30 @@ SpecularDataImportWidget::SpecularDataImportWidget(QWidget* parent) auto* import_settings_vbox = new QVBoxLayout; import_settings_widget->setLayout(import_settings_vbox); + m_properties_widget = new QWidget; // to be populated later + import_settings_vbox->addWidget(m_properties_widget); + + m_warn_widget = new QWidget; + import_settings_vbox->addWidget(m_warn_widget); + + auto* warn_vbox = new QVBoxLayout; + m_warn_widget->setLayout(warn_vbox); + + auto* warn_row = new QHBoxLayout; + warn_vbox->addLayout(warn_row); + + auto* warn_icon = new QLabel; + warn_row->addWidget(warn_icon); + warn_icon->setFixedSize(20, 20); + warn_icon->setPixmap(QPixmap(":/images/warning_16x16.png")); + + auto* warn_label = new QLabel; + warn_row->addWidget(warn_label); + warn_label->setText("The file import issued warnings:"); + + m_warn_list = new QListWidget; + import_settings_vbox->addWidget(m_warn_list); + //... Right side of splitter: data view auto* tab = new QTabWidget; @@ -64,66 +85,69 @@ SpecularDataImportWidget::SpecularDataImportWidget(QWidget* parent) auto* data_widget = new QWidget; tab->addTab(data_widget, "Table"); + auto* data_vbox = new QVBoxLayout; + data_widget->setLayout(data_vbox); + + m_check_raw = new QCheckBox("Show file content"); + data_vbox->addWidget(m_check_raw); + m_check_raw->setChecked(false); + + m_check_col = new QCheckBox("Show raw columns"); + data_vbox->addWidget(m_check_col); + m_check_col->setChecked(false); + + m_check_fin = new QCheckBox("Show extracted columns"); + data_vbox->addWidget(m_check_fin); + m_check_fin->setChecked(true); + + m_data_table = new QTableView; + data_vbox->addWidget(m_data_table); + auto* graph_widget = new QWidget; tab->addTab(graph_widget, "Graph"); auto* graph_vbox = new QVBoxLayout; graph_widget->setLayout(graph_vbox); - graph_vbox->addWidget(new StyledToolbar); - graph_vbox->addWidget(new SpecularDataCanvas); - - m_ui->setupUi(this); - m_ui->warningsIcon->setFixedSize(20, 20); - m_ui->warningsIcon->setPixmap(QPixmap(":/images/warning_16x16.png")); + auto* plotToolbar = new StyledToolbar; + graph_vbox->addWidget(plotToolbar); - m_ui->linkedInstrumentGroup->hide(); // #baimport - remove from UI if not used in the future + m_canvas = new SpecularDataCanvas; + graph_vbox->addWidget(m_canvas); - // #baUserDefLoaders - remove next line when implementation is complete - m_ui->createNewFormatButton->hide(); + //... - fillLoaderCombo(); updatePropertiesEdits(); - connect(m_ui->formatSelectionComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), - this, &SpecularDataImportWidget::onFormatSelectionChanged); - connect(m_ui->createNewFormatButton, &QPushButton::clicked, this, - &SpecularDataImportWidget::onCreateNewFormatButton); - - connect(m_ui->originalRowCheckBox, &QCheckBox::stateChanged, this, + connect(m_check_raw, &QCheckBox::stateChanged, this, &SpecularDataImportWidget::updatePreview); - connect(m_ui->rawDataCheckBox, &QCheckBox::stateChanged, this, + connect(m_check_col, &QCheckBox::stateChanged, this, &SpecularDataImportWidget::updatePreview); - connect(m_ui->calculatedDataCheckBox, &QCheckBox::stateChanged, this, + connect(m_check_fin, &QCheckBox::stateChanged, this, &SpecularDataImportWidget::updatePreview); - connect(m_ui->specularDataCanvas->customPlot(), &QCustomPlot::axisClick, this, + connect(m_canvas->customPlot(), &QCustomPlot::axisClick, this, &SpecularDataImportWidget::onPlotAxisClicked); - m_ui->specularDataCanvas->enableDeprecatedOnMousePress(false); // we have an own handler + m_canvas->enableDeprecatedOnMousePress(false); // we have an own handler - m_ui->plotToolbar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); - for (auto* action : m_ui->specularDataCanvas->actionList()) - m_ui->plotToolbar->addAction(action); + plotToolbar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); + for (auto* action : m_canvas->actionList()) + plotToolbar->addAction(action); } void SpecularDataImportWidget::setJobOrRealItem(QObject* real_item) { DataAccessWidget::setJobOrRealItem(real_item); ASSERT(realItem()); - m_ui->specularDataCanvas->setJobOrRealItem(real_item); + m_canvas->setJobOrRealItem(real_item); m_loader = dynamic_cast<AbstractDataLoader1D*>(realItem()->dataLoader()); ASSERT(m_loader); // only items which have a loader are allowed for this widget. Every other // items do not support this widget - fillLoaderCombo(); - - QSignalBlocker b(m_ui->formatSelectionComboBox); - m_ui->formatSelectionComboBox->setCurrentText(m_loader->name()); - updatePropertiesEdits(); updatePreview(); connect(m_loader, &AbstractDataLoader::importSettingsChanged, this, @@ -170,78 +194,25 @@ void SpecularDataImportWidget::onPlotAxisClicked(QCPAxis* axis, QCPAxis::Selecta } } -void SpecularDataImportWidget::fillLoaderCombo() -{ - QSignalBlocker b(m_ui->formatSelectionComboBox); - m_ui->formatSelectionComboBox->clear(); - for (auto* loader : DataLoaders1D::instance().recentlyUsedLoaders()) - m_ui->formatSelectionComboBox->addItem(loader->name()); - for (auto* loader : DataLoaders1D::instance().loaders()) - m_ui->formatSelectionComboBox->addItem(loader->name()); - - // e.g. legacy loader is not present in the combo by default. Add it here so it can be selected - if (m_loader != nullptr) - if (m_ui->formatSelectionComboBox->findText(m_loader->name()) < 0) - m_ui->formatSelectionComboBox->addItem(m_loader->name()); -} - void SpecularDataImportWidget::updatePropertiesEdits() { - for (auto* child : m_ui->propertiesWidget->children()) + for (auto* child : m_properties_widget->children()) delete child; - if (m_ui->propertiesWidget->layout()) - delete m_ui->propertiesWidget->layout(); + if (m_properties_widget->layout()) + delete m_properties_widget->layout(); if (m_loader) - m_loader->populateImportSettingsWidget(m_ui->propertiesWidget); + m_loader->populateImportSettingsWidget(m_properties_widget); - const bool hasChildren = !m_ui->propertiesWidget->children().empty(); + const bool hasChildren = !m_properties_widget->children().empty(); - m_ui->propertiesWidget->setVisible(hasChildren); + m_properties_widget->setVisible(hasChildren); } AbstractDataLoader* SpecularDataImportWidget::selectedLoader() { - const QString name = m_ui->formatSelectionComboBox->currentText(); - - for (auto* loader : DataLoaders1D::instance().loaders()) - if (name == loader->name()) - return loader; - - return nullptr; -} - -void SpecularDataImportWidget::onFormatSelectionChanged() -{ - if (m_loader && m_loader->fileContent().isEmpty()) { - QSignalBlocker b(m_ui->formatSelectionComboBox); - m_ui->formatSelectionComboBox->setCurrentText(m_loader->name()); - - QMessageBox::information(GUI::Global::mainWindow, "Information", - "Changing the loader is not possible because the original file " - "contents are not available any more."); - - return; - } - - if (m_loader) - m_loader->disconnect(this); - - m_loader = dynamic_cast<AbstractDataLoader1D*>(selectedLoader()->clone()); - m_loader->initWithDefaultImportSettings(); - m_loader->setFileContents(realItem()->dataLoader()->fileContent()); - realItem()->setDataLoader(m_loader); - m_loader->setRealDataItem(realItem()); - QApplication::setOverrideCursor(Qt::WaitCursor); - m_loader->guessSettings(); - m_loader->processContents(); - QApplication::restoreOverrideCursor(); - - updatePropertiesEdits(); - updatePreview(); - connect(m_loader, &AbstractDataLoader::importSettingsChanged, this, - &SpecularDataImportWidget::onPropertiesChanged, Qt::UniqueConnection); + return new QREDataLoader; } void SpecularDataImportWidget::updatePreview() @@ -249,7 +220,7 @@ void SpecularDataImportWidget::updatePreview() QApplication::setOverrideCursor(Qt::WaitCursor); if (m_loader) { - auto* oldModel = m_ui->dataResultView->selectionModel(); // sic!! according to Qt docu + auto* oldModel = m_data_table->selectionModel(); // sic!! according to Qt docu // of QAbstractItemView::setModel auto* resultModel = m_loader->createResultModel(); if (resultModel != nullptr) { @@ -262,58 +233,56 @@ void SpecularDataImportWidget::updatePreview() const auto processedSections = resultModel->sectionsOfColumnType( AbstractDataLoaderResultModel::ColumnType::processed); - QSignalBlocker b1(m_ui->originalRowCheckBox); - QSignalBlocker b2(m_ui->rawDataCheckBox); - QSignalBlocker b3(m_ui->calculatedDataCheckBox); + QSignalBlocker b1(m_check_raw); + QSignalBlocker b2(m_check_col); + QSignalBlocker b3(m_check_fin); if (originalSections.isEmpty()) { - m_ui->originalRowCheckBox->setChecked(false); - m_ui->originalRowCheckBox->setEnabled(false); + m_check_raw->setChecked(false); + m_check_raw->setEnabled(false); } else - m_ui->originalRowCheckBox->setEnabled(true); + m_check_raw->setEnabled(true); if (rawSections.isEmpty()) { - m_ui->rawDataCheckBox->setChecked(false); - m_ui->rawDataCheckBox->setEnabled(false); + m_check_col->setChecked(false); + m_check_col->setEnabled(false); } else - m_ui->rawDataCheckBox->setEnabled(true); + m_check_col->setEnabled(true); if (processedSections.isEmpty()) { - m_ui->calculatedDataCheckBox->setChecked(false); - m_ui->calculatedDataCheckBox->setEnabled(false); + m_check_fin->setChecked(false); + m_check_fin->setEnabled(false); } else - m_ui->calculatedDataCheckBox->setEnabled(true); + m_check_fin->setEnabled(true); - m_ui->dataResultView->setModel(resultModel); - auto* horHeader = m_ui->dataResultView->horizontalHeader(); + m_data_table->setModel(resultModel); + auto* horHeader = m_data_table->horizontalHeader(); for (int section : originalSections) - horHeader->setSectionHidden(section, !m_ui->originalRowCheckBox->isChecked()); + horHeader->setSectionHidden(section, !m_check_raw->isChecked()); for (int section : rawSections) - horHeader->setSectionHidden(section, !m_ui->rawDataCheckBox->isChecked()); + horHeader->setSectionHidden(section, !m_check_col->isChecked()); for (int section : processedSections) - horHeader->setSectionHidden(section, !m_ui->calculatedDataCheckBox->isChecked()); + horHeader->setSectionHidden(section, !m_check_fin->isChecked()); // if the result model has a line column, then do not show the vertical header view const bool hasLinesColumn = !resultModel->sectionsOfColumnType(AbstractDataLoaderResultModel::ColumnType::line) .isEmpty(); - m_ui->dataResultView->verticalHeader()->setHidden(hasLinesColumn); + m_data_table->verticalHeader()->setHidden(hasLinesColumn); - m_ui->dataResultView->resizeColumnsToContents(); + m_data_table->resizeColumnsToContents(); } else - m_ui->dataResultView->setModel(nullptr); + m_data_table->setModel(nullptr); delete oldModel; } if (m_loader && m_loader->numErrors() > 0) { - m_ui->warningsIcon->show(); - m_ui->warningsLabel->show(); - m_ui->warningsListWidget->show(); - m_ui->warningsListWidget->clear(); + m_warn_list->clear(); + m_warn_widget->show(); auto warnings = m_loader->lineUnrelatedErrors(); const int nLineRelatedWarnings = m_loader->numErrors() - warnings.size(); @@ -332,31 +301,14 @@ void SpecularDataImportWidget::updatePreview() w.prepend("* "); for (auto& w : warnings) - new QListWidgetItem(w, m_ui->warningsListWidget); + new QListWidgetItem(w, m_warn_list); } else { - m_ui->warningsIcon->hide(); - m_ui->warningsLabel->hide(); - m_ui->warningsListWidget->hide(); + m_warn_widget->hide(); } QApplication::restoreOverrideCursor(); } -void SpecularDataImportWidget::onCreateNewFormatButton() -{ - bool ok; - QString name = QInputDialog::getText( - this, "New format", "Please enter a name for the new format", QLineEdit::Normal, "", &ok); - if (!ok || name.isEmpty()) - return; - - cloneAsUserDefinedLoader(m_loader, name); - - fillLoaderCombo(); - m_ui->formatSelectionComboBox->setCurrentText(name); - onFormatSelectionChanged(); -} - void SpecularDataImportWidget::onPropertiesChanged() { m_loader->applyImportSettings(); // #baimport: may be duplicate diff --git a/GUI/View/Import/SpecularDataImportWidget.h b/GUI/View/Import/SpecularDataImportWidget.h index a5ae8a6290b62c74aeb04fad4dd6229084efa018..b47e02e2d038dbdb2d21354f140bb4881ad49530 100644 --- a/GUI/View/Import/SpecularDataImportWidget.h +++ b/GUI/View/Import/SpecularDataImportWidget.h @@ -24,11 +24,6 @@ class SpecularDataItem; class AbstractDataLoader; class RealItem; -namespace Ui { - -class SpecularDataImportWidget; -} - //! Widget to define and show 1D (specular) imports by data loaders, e.g. CSV file import //! Contains space for the loader-defined import properties, a table for the raw and the imported //! data and a graph to show the plot of the imported data. @@ -49,17 +44,22 @@ private slots: void onPlotAxisClicked(QCPAxis* axis, QCPAxis::SelectablePart part, QMouseEvent* event); private: - void fillLoaderCombo(); void updatePropertiesEdits(); AbstractDataLoader* selectedLoader(); - void onFormatSelectionChanged(); void updatePreview(); - void onCreateNewFormatButton(); void onPropertiesChanged(); QString currentFileName() const; - Ui::SpecularDataImportWidget* m_ui; AbstractDataLoader1D* m_loader; // only borrowed from realItem. Do not delete! + + class SpecularDataCanvas* m_canvas; + QWidget* m_properties_widget; + class QTableView* m_data_table; + QCheckBox* m_check_raw; + QCheckBox* m_check_col; + QCheckBox* m_check_fin; + QWidget* m_warn_widget; + QListWidget* m_warn_list; }; #endif // BORNAGAIN_GUI_VIEW_IMPORT_SPECULARDATAIMPORTWIDGET_H diff --git a/GUI/View/Import/SpecularDataImportWidget.ui b/GUI/View/Import/SpecularDataImportWidget.ui deleted file mode 100644 index 03b9adb0f30aaee2ef8e2b28b40638138f6f70d2..0000000000000000000000000000000000000000 --- a/GUI/View/Import/SpecularDataImportWidget.ui +++ /dev/null @@ -1,268 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>SpecularDataImportWidget</class> - <widget class="QWidget" name="SpecularDataImportWidget"> - <layout class="QVBoxLayout" name="verticalLayout_2"> - <item> - <widget class="QSplitter" name="splitter"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="childrenCollapsible"> - <bool>false</bool> - </property> - <widget class="QWidget" name="layoutWidget"> - <layout class="QVBoxLayout" name="verticalLayout"> - <property name="spacing"> - <number>20</number> - </property> - <item> - <widget class="QGroupBox" name="propertiesGroupBox"> - <property name="title"> - <string>Import settings</string> - </property> - <layout class="QVBoxLayout" name="verticalLayout_4"> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_3"> - <item> - <layout class="QFormLayout" name="formLayout"> - <item row="1" column="0"> - <widget class="QLabel" name="label_2"> - <property name="text"> - <string>Format:</string> - </property> - </widget> - </item> - <item row="1" column="1"> - <widget class="QComboBox" name="formatSelectionComboBox"> - </widget> - </item> - </layout> - </item> - </layout> - </item> - <item> - <widget class="QWidget" name="propertiesWidget" native="true"> - <layout class="QVBoxLayout" name="verticalLayout_8"> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_5"> - <item> - <widget class="QLabel" name="label_4"> - <property name="text"> - <string><PlaceHolder-Widget---will be removed at runtime></string> - </property> - </widget> - </item> - <item> - <spacer name="horizontalSpacer_4"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - </layout> - </item> - </layout> - </widget> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_2"> - <item> - <spacer name="horizontalSpacer"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QPushButton" name="createNewFormatButton"> - <property name="text"> - <string>Save settings as new format...</string> - </property> - </widget> - </item> - </layout> - </item> - </layout> - </widget> - </item> - <item> - <layout class="QVBoxLayout" name="verticalLayout_6"> - <property name="spacing"> - <number>5</number> - </property> - <property name="sizeConstraint"> - <enum>QLayout::SetDefaultConstraint</enum> - </property> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_4"> - <item> - <widget class="QLabel" name="warningsIcon"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>(RT)</string> - </property> - </widget> - </item> - <item> - <widget class="QLabel" name="warningsLabel"> - <property name="sizePolicy"> - <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>The file import issued warnings:</string> - </property> - </widget> - </item> - <item> - <spacer name="horizontalSpacer_2"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - </layout> - </item> - <item> - <widget class="QListWidget" name="warningsListWidget"/> - </item> - </layout> - </item> - <item> - <widget class="QGroupBox" name="linkedInstrumentGroup"> - <property name="title"> - <string>Linked instrument</string> - </property> - <layout class="QFormLayout" name="formLayout_2"> - <item row="0" column="0"> - <widget class="QComboBox" name="linkedInstrumentComboBox"> - <item> - <property name="text"> - <string>Undefined</string> - </property> - </item> - </widget> - </item> - </layout> - </widget> - </item> - <item> - <spacer name="verticalSpacer"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>40</height> - </size> - </property> - </spacer> - </item> - </layout> - </widget> - <widget class="QTabWidget" name="tabWidget"> - <property name="currentIndex"> - <number>0</number> - </property> - <widget class="QWidget" name="tab_4"> - <attribute name="title"> - <string>Data</string> - </attribute> - <layout class="QVBoxLayout" name="verticalLayout_5"> - <item> - <widget class="QCheckBox" name="originalRowCheckBox"> - <property name="text"> - <string>Show file content</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="rawDataCheckBox"> - <property name="text"> - <string>Show raw data</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="calculatedDataCheckBox"> - <property name="text"> - <string>Show resulting data</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QTableView" name="dataResultView"/> - </item> - </layout> - </widget> - <widget class="QWidget" name="tab_2"> - <attribute name="title"> - <string>Graph</string> - </attribute> - <layout class="QVBoxLayout" name="verticalLayout_3"> - <item> - <widget class="StyledToolbar" name="plotToolbar" native="true"/> - </item> - <item> - <widget class="SpecularDataCanvas" name="specularDataCanvas" native="true"/> - </item> - </layout> - </widget> - </widget> - </widget> - </item> - </layout> - </widget> - <customwidgets> - <customwidget> - <class>SpecularDataCanvas</class> - <extends>QWidget</extends> - <header location="global">GUI/View/PlotSpecular/SpecularDataCanvas.h</header> - <container>1</container> - </customwidget> - <customwidget> - <class>StyledToolbar</class> - <extends>QWidget</extends> - <header>GUI/View/Widget/StyledToolbar.h</header> - <container>1</container> - </customwidget> - </customwidgets> - <resources/> - <connections/> -</ui>