Skip to content
Snippets Groups Projects
Commit f83569b8 authored by Matthias Puchner's avatar Matthias Puchner
Browse files

separate 2D file filters for open-file-dialog; refactor import (function invariant)

parent aab85327
No related branches found
No related tags found
1 merge request!18Feature read nicos and crash fix
......@@ -86,9 +86,11 @@ ImportDataUtils::ImportReflectometryData(const QString& fileName)
return result;
}
std::unique_ptr<OutputData<double>> ImportDataUtils::Import2dData(const QString& fileName)
std::unique_ptr<OutputData<double>>
ImportDataUtils::Import2dData(const QString& fileName,
IntensityDataIOFactory::LoaderSelector loader)
{
return ImportKnownData(fileName);
return ImportKnownData(fileName, loader);
}
QString ImportDataUtils::Import1dData(RealDataItem* realDataItem,
......
......@@ -30,7 +30,9 @@ class AbstractDataLoader;
//! Provides utility methods to import data files.
namespace ImportDataUtils {
std::unique_ptr<OutputData<double>> Import2dData(const QString& baseNameOfLoadedFile);
std::unique_ptr<OutputData<double>> Import2dData(const QString& baseNameOfLoadedFile,
IntensityDataIOFactory::LoaderSelector loader);
//! Import 1D data into the given item.
//! Returns an error text if a fatal error occurred (discard item). "Empty string" means "no fatal
......
......@@ -65,13 +65,13 @@ RealDataSelectorWidget::RealDataSelectorWidget(QWidget* parent)
m_import2dDataAction->setIcon(QIcon(":/images/import.svg"));
m_import2dDataAction->setIconText("2D");
m_import2dDataAction->setToolTip("Import 2D data");
connect(m_import2dDataAction, &QAction::triggered, [this]() { importData(2); });
connect(m_import2dDataAction, &QAction::triggered, [this]() { importData2D(); });
m_import1dDataAction->setText("Import 1D data");
m_import1dDataAction->setIcon(QIcon(":/images/import.svg"));
m_import1dDataAction->setIconText("1D");
m_import1dDataAction->setToolTip("Import 1D data");
connect(m_import1dDataAction, &QAction::triggered, [this]() { importData(1); });
connect(m_import1dDataAction, &QAction::triggered, [this]() { importData1D(); });
m_renameDataAction->setText("Rename");
m_renameDataAction->setIcon(QIcon()); // #baTODO: Icon needed?
......@@ -200,76 +200,95 @@ void RealDataSelectorWidget::onContextMenuRequest(const QPoint& point)
menu.exec(m_itemTree->mapToGlobal(point));
}
void RealDataSelectorWidget::importData(int ndim)
void RealDataSelectorWidget::importData1D()
{
QMap<QString, AbstractDataLoader*> loaderOfFilter;
QString filters;
QString selectedFilter;
if (ndim == 2) {
filters = "Intensity File (*.int *.gz *.tif *.tiff *.txt *.csv);;"
"Other (*.*)";
selectedFilter = AppSvc::projectManager()->recentlyUsedImportFilter2D();
} else {
for (auto loader : DataLoaders1D::instance().loaders()) {
const QString filter =
loader->name()
+ " (*.txt *.csv *.dat)"; // #baimport - take file filters from loader
loaderOfFilter[filter] = loader;
if (!filters.isEmpty())
filters += ";;";
filters += filter;
}
filters += ";;Other (*.*)";
for (auto loader : DataLoaders1D::instance().loaders()) {
const QString filter =
loader->name() + " (*.txt *.csv *.dat)"; // #baimport - take file filters from loader
loaderOfFilter[filter] = loader;
if (!filters.isEmpty())
filters += ";;";
filters += filter;
}
filters += ";;Other (*.*)";
QString selectedFilter = AppSvc::projectManager()->recentlyUsedImportFilter1D();
const QString dirname = AppSvc::projectManager()->userImportDir();
const QStringList fileNames = QFileDialog::getOpenFileNames(Q_NULLPTR, "Open Intensity Files",
dirname, filters, &selectedFilter);
if (fileNames.isEmpty())
return;
AppSvc::projectManager()->setImportDirFromFilePath(fileNames[0]);
AppSvc::projectManager()->setRecentlyUsedImportFilter1D(selectedFilter);
selectedFilter = AppSvc::projectManager()->recentlyUsedImportFilter1D();
const AbstractDataLoader* selectedLoader = loaderOfFilter.value(selectedFilter, nullptr);
for (const auto& fileName : fileNames) {
auto realDataItem = m_itemTreeModel->insertSpecularDataItem();
realDataItem->setName(QFileInfo(fileName).baseName());
realDataItem->setNativeFileName(fileName);
const QString errorText = ImportDataUtils::Import1dData(realDataItem, selectedLoader);
if (errorText.isEmpty())
setCurrentItem(realDataItem);
else {
m_itemTreeModel->removeItem(realDataItem);
GUIHelpers::warning("File import",
QString("The file '%1' could not be imported.")
.arg(QDir::toNativeSeparators(fileName)),
errorText);
}
}
QString dirname = AppSvc::projectManager()->userImportDir();
QStringList fileNames = QFileDialog::getOpenFileNames(Q_NULLPTR, "Open Intensity Files",
dirname, filters, &selectedFilter);
}
void RealDataSelectorWidget::importData2D()
{
QMap<QString, IntensityDataIOFactory::LoaderSelector> loaderOfFilter;
QString filters;
const auto addFilter = [&](IntensityDataIOFactory::LoaderSelector loaderSelector,
const QString& filter) {
if (!filters.isEmpty())
filters += ";;";
filters += filter;
loaderOfFilter[filter] = loaderSelector;
};
addFilter(IntensityDataIOFactory::tiff, "TIFF (*.tif *.tiff *.tif.gz)");
addFilter(IntensityDataIOFactory::nicos, "Nicos (*.001)");
addFilter(IntensityDataIOFactory::bornagain, "BornAgain (*.int.gz)");
addFilter(IntensityDataIOFactory::automatic, "CSV (*.txt *.csv *.dat)");
addFilter(IntensityDataIOFactory::automatic, "All (*.*)");
QString selectedFilter = AppSvc::projectManager()->recentlyUsedImportFilter2D();
const QString dirname = AppSvc::projectManager()->userImportDir();
const QStringList fileNames = QFileDialog::getOpenFileNames(Q_NULLPTR, "Open Intensity Files",
dirname, filters, &selectedFilter);
if (fileNames.isEmpty())
return;
QString newImportDir = GUIHelpers::fileDir(fileNames[0]);
if (newImportDir != dirname)
AppSvc::projectManager()->setImportDir(newImportDir);
AppSvc::projectManager()->setImportDirFromFilePath(fileNames[0]);
AppSvc::projectManager()->setRecentlyUsedImportFilter2D(selectedFilter);
if (ndim == 1)
AppSvc::projectManager()->setRecentlyUsedImportFilter1D(selectedFilter);
else
AppSvc::projectManager()->setRecentlyUsedImportFilter2D(selectedFilter);
const auto selectedLoader =
loaderOfFilter.value(selectedFilter, IntensityDataIOFactory::automatic);
for (const auto& fileName : fileNames) {
QFileInfo info(fileName);
auto baseNameOfLoadedFile = info.baseName();
if (ndim == 2) {
std::unique_ptr<OutputData<double>> data = ImportDataUtils::Import2dData(fileName);
if (data) {
auto realDataItem = m_itemTreeModel->insertIntensityDataItem();
realDataItem->setName(baseNameOfLoadedFile);
realDataItem->setOutputData(data.release());
setCurrentItem(realDataItem);
}
} else if (ndim == 1) {
auto realDataItem = m_itemTreeModel->insertSpecularDataItem();
realDataItem->setName(baseNameOfLoadedFile);
realDataItem->setNativeFileName(fileName);
const AbstractDataLoader* selectedLoader =
loaderOfFilter.value(selectedFilter, nullptr);
const QString errorText = ImportDataUtils::Import1dData(realDataItem, selectedLoader);
if (errorText.isEmpty())
setCurrentItem(realDataItem);
else {
m_itemTreeModel->removeItem(realDataItem);
GUIHelpers::warning("File import",
QString("The file '%1' could not be imported.")
.arg(QDir::toNativeSeparators(fileName)),
errorText);
}
std::unique_ptr<OutputData<double>> data =
ImportDataUtils::Import2dData(fileName, selectedLoader);
if (data) {
auto realDataItem = m_itemTreeModel->insertIntensityDataItem();
realDataItem->setName(QFileInfo(fileName).baseName());
realDataItem->setOutputData(data.release());
setCurrentItem(realDataItem);
}
}
}
......
......@@ -61,6 +61,8 @@ private:
void updateActionEnabling(const RealDataItem* item);
void onContextMenuRequest(const QPoint& point);
void importData(int ndim);
void importData1D();
void importData2D();
QModelIndex currentIndex();
private:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment