/** * data file browser * @author Tobias Weber * @date 9-Apr-2018 * @license see 'LICENSE' file */ #include "filebrowser.h" #include #include #include #include #include #include "tlibs/file/loadinstr.h" using t_real = double; // ---------------------------------------------------------------------------- FileBrowserWidget::FileBrowserWidget(QWidget *pParent, QSettings *pSettings) : QWidget(pParent), m_pSettings(pSettings) { m_pListFiles->setAlternatingRowColors(true); // ------------------------------------------------------------------------ // layout auto *pBtnFolders = new QPushButton("Folder...", this); auto *pGrid = new QGridLayout(this); pGrid->addWidget(pBtnFolders, 0, 0, 1, 1); pGrid->addWidget(m_pEditFolder, 0, 1, 1, 1); pGrid->addWidget(m_pListFiles, 1, 0, 2, 2); // ------------------------------------------------------------------------ // ------------------------------------------------------------------------ // connections connect(pBtnFolders, &QPushButton::clicked, this, &FileBrowserWidget::SelectFolder); connect(m_pEditFolder, &QLineEdit::textChanged, this, &FileBrowserWidget::SetFolder); // ------------------------------------------------------------------------ // ------------------------------------------------------------------------ // settings if(m_pSettings) { m_pEditFolder->setText(m_pSettings->value("filebrowser/dir", "").toString()); } // ------------------------------------------------------------------------ } FileBrowserWidget::~FileBrowserWidget() { } /** * open a folder selection dialog */ void FileBrowserWidget::SelectFolder() { QString dir; if(m_pSettings) dir = m_pSettings->value("filebrowser/dir", "").toString(); dir = QFileDialog::getExistingDirectory(this, "Select Folder", dir); if(dir != "") m_pEditFolder->setText(dir); } /** * set a given folder as working dir and populate file list */ void FileBrowserWidget::SetFolder(const QString& dir) { m_pListFiles->clear(); if(dir == "" || !QDir(dir).exists()) return; // create file list std::vector vecFiles; for(QDirIterator iter(dir); ; iter.next()) { if(iter.fileInfo().isFile()) vecFiles.push_back(iter.fileName()); if(!iter.hasNext()) break; } // sort file list std::sort(vecFiles.begin(), vecFiles.end(), [](const auto& str1, const auto& str2) -> bool { return std::lexicographical_compare(str1.begin(), str1.end(), str2.begin(), str2.end()); }); // add files to list widget for(const auto& strFile : vecFiles) { QString fileFull = dir + "/" + strFile; // load file to get a description std::unique_ptr> pInstr(tl::FileInstrBase::LoadInstr(fileFull.toStdString().c_str())); if(pInstr && pInstr->GetColNames().size()) // only valid files with a non-zero column count { QString strDescr; auto vecScanVars = pInstr->GetScannedVars(); if(vecScanVars.size()) { strDescr += ": "; for(std::size_t iScVar=0; iScVarsetText(strFile + strDescr); pItem->setData(Qt::UserRole, fileFull); } } if(m_pSettings) m_pSettings->setValue("filebrowser/dir", dir); } // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- FileBrowser::FileBrowser(QWidget* pParent, QSettings *pSettings) : QDockWidget(pParent), m_pBrowser(std::make_unique(this, pSettings)) { this->setObjectName("fileBrowser"); this->setWindowTitle("File Browser"); this->setWidget(m_pBrowser.get()); } FileBrowser::~FileBrowser() { } // ----------------------------------------------------------------------------