diff --git a/src/kdefrontend/datasources/ImportFileWidget.h b/src/kdefrontend/datasources/ImportFileWidget.h --- a/src/kdefrontend/datasources/ImportFileWidget.h +++ b/src/kdefrontend/datasources/ImportFileWidget.h @@ -56,6 +56,7 @@ class QTimer; class QTreeWidgetItem; class QStringList; +class KUrlComboBox; class ImportFileWidget : public QWidget { Q_OBJECT @@ -104,6 +105,7 @@ mutable std::unique_ptr m_currentFilter; QTableWidget* m_twPreview; + KUrlComboBox* m_cbFileName; const QString& m_fileName; bool m_fileEmpty{false}; bool m_liveDataSource; @@ -123,6 +125,7 @@ void selectFile(); void fileInfoDialog(); void refreshPreview(); + void importUrlChanged(const QUrl url); signals: void fileNameChanged(); diff --git a/src/kdefrontend/datasources/ImportFileWidget.cpp b/src/kdefrontend/datasources/ImportFileWidget.cpp --- a/src/kdefrontend/datasources/ImportFileWidget.cpp +++ b/src/kdefrontend/datasources/ImportFileWidget.cpp @@ -62,6 +62,7 @@ #include #include #include +#include #ifdef HAVE_MQTT #include "kdefrontend/widgets/MQTTWillSettingsWidget.h" @@ -92,7 +93,6 @@ #endif { ui.setupUi(this); - ui.leFileName->setCompleter(new QCompleter(new QDirModel)); //add supported file types if (!liveDataSource) { @@ -168,6 +168,14 @@ ui.tePreview->setLayout(layout); m_twPreview->hide(); + // the combobox for the import path + m_cbFileName = new KUrlComboBox(KUrlComboBox::Mode::Files, ui.tePreview); + m_cbFileName->setMaxItems(7); + auto* gridLayout = dynamic_cast(ui.gbDataSource->layout()); + if (gridLayout) { + gridLayout->addWidget(m_cbFileName, 1, 2, 1, 3); + } + #ifdef HAVE_MQTT ui.cbSourceType->addItem(QLatin1String("MQTT")); m_configPath = QStandardPaths::standardLocations(QStandardPaths::AppDataLocation).constFirst() + QLatin1String("MQTT_connections"); @@ -221,12 +229,16 @@ } } - ui.cbFilter->setCurrentIndex(conf.readEntry("Filter", 0)); - filterChanged(ui.cbFilter->currentIndex()); // needed if filter is not changed - if (m_fileName.isEmpty()) - ui.leFileName->setText(conf.readEntry("LastImportedFile", "")); - else - ui.leFileName->setText(m_fileName); + if (m_fileName.isEmpty()) { + ui.cbFilter->setCurrentIndex(conf.readEntry("Filter", 0)); + m_cbFileName->setUrl(conf.readEntry("LastImportedFile", "")); + QStringList urls = m_cbFileName->urls(); + urls.append(conf.readXdgListEntry("LastImportedFiles")); + m_cbFileName->setUrls(urls); + filterChanged(ui.cbFilter->currentIndex()); // needed if filter is not changed + } else + m_cbFileName->setUrl(QUrl(m_fileName)); + //live data related settings ui.cbBaudRate->setCurrentIndex(conf.readEntry("BaudRate").toInt()); @@ -286,7 +298,8 @@ // general settings conf.writeEntry("Type", (int)currentFileType()); conf.writeEntry("Filter", ui.cbFilter->currentIndex()); - conf.writeEntry("LastImportedFile", ui.leFileName->text()); + conf.writeEntry("LastImportedFile", m_cbFileName->currentText()); + conf.writeXdgListEntry("LastImportedFiles", m_cbFileName->urls()); //live data related settings conf.writeEntry("SourceType", (int)currentSourceType()); @@ -337,8 +350,8 @@ //SLOTs for the general part of the data source configuration connect(ui.cbSourceType, static_cast(&QComboBox::currentIndexChanged), this, static_cast(&ImportFileWidget::sourceTypeChanged)); - connect(ui.leFileName, &QLineEdit::textChanged, - this, static_cast(&ImportFileWidget::fileNameChanged)); + connect(m_cbFileName, &KUrlComboBox::urlActivated, + this, &ImportFileWidget::importUrlChanged); connect(ui.leHost, &QLineEdit::textChanged, this, &ImportFileWidget::hostChanged); connect(ui.lePort, &QLineEdit::textChanged, this, &ImportFileWidget::portChanged); connect(ui.tvJson, &QTreeView::clicked, this, &ImportFileWidget::refreshPreview); @@ -390,11 +403,11 @@ } QString ImportFileWidget::fileName() const { - return ui.leFileName->text(); + return m_cbFileName->currentText(); } QString ImportFileWidget::selectedObject() const { - const QString& path = ui.leFileName->text(); + const QString& path = fileName(); //determine the file name only QString name = path.right(path.length() - path.lastIndexOf(QDir::separator()) - 1); @@ -459,7 +472,7 @@ LiveDataSource::SourceType sourceType = currentSourceType(); auto readingType = static_cast(ui.cbReadingType->currentIndex()); - source->setComment( ui.leFileName->text() ); + source->setComment( fileName() ); source->setFileType(fileType); currentFileFilter(); source->setFilter(m_currentFilter.release()); // pass ownership of the filter to the LiveDataSource @@ -480,12 +493,12 @@ switch (sourceType) { case LiveDataSource::SourceType::FileOrPipe: - source->setFileName(ui.leFileName->text()); + source->setFileName(fileName()); source->setFileLinked(ui.chbLinkFile->isChecked()); break; case LiveDataSource::SourceType::LocalSocket: - source->setFileName(ui.leFileName->text()); - source->setLocalSocketName(ui.leFileName->text()); + source->setFileName(fileName()); + source->setLocalSocketName(fileName()); break; case LiveDataSource::SourceType::NetworkTcpSocket: case LiveDataSource::SourceType::NetworkUdpSocket: @@ -512,7 +525,7 @@ MQTTClient::UpdateType updateType = static_cast(ui.cbUpdateType->currentIndex()); MQTTClient::ReadingType readingType = static_cast(ui.cbReadingType->currentIndex()); - client->setComment(ui.leFileName->text()); + client->setComment(fileName()); currentFileFilter(); client->setFilter(static_cast(m_currentFilter.release())); // pass ownership of the filter to MQTTClient @@ -752,7 +765,10 @@ //before we start calculating the preview QApplication::processEvents(QEventLoop::AllEvents, 0); - ui.leFileName->setText(path); + QStringList urls = m_cbFileName->urls(); + urls.append(path); + m_cbFileName->setUrls(urls); + importUrlChanged(urls.last()); // why do I have to call this function seperately } /*! @@ -870,9 +886,9 @@ bool fileExists = QFile::exists(fileName); if (fileExists) - ui.leFileName->setStyleSheet(QString()); + m_cbFileName->setStyleSheet(QString()); else - ui.leFileName->setStyleSheet("QLineEdit{background:red;}"); + m_cbFileName->setStyleSheet("QComboBox{background:red;}"); ui.gbOptions->setEnabled(fileExists); ui.bManageFilters->setEnabled(fileExists); @@ -1026,7 +1042,8 @@ filterChanged(lastUsedFilterIndex); if (currentSourceType() == LiveDataSource::FileOrPipe) { - const QString& fileName = absolutePath(ui.leFileName->text()); + QString tempFileName = fileName(); + const QString& fileName = absolutePath(tempFileName); if (QFile::exists(fileName)) updateContent(fileName); } @@ -1155,7 +1172,7 @@ shows the dialog with the information about the file(s) to be imported. */ void ImportFileWidget::fileInfoDialog() { - QStringList files = ui.leFileName->text().split(';'); + QStringList files = fileName().split(';'); auto* dlg = new FileInfoDialog(this); dlg->setFiles(files); dlg->exec(); @@ -1192,7 +1209,8 @@ DEBUG("ImportFileWidget::refreshPreview()"); WAIT_CURSOR; - QString fileName = absolutePath(ui.leFileName->text()); + QString tempFileName = fileName(); + QString fileName = absolutePath(tempFileName); AbstractFileFilter::FileType fileType = currentFileType(); LiveDataSource::SourceType sourceType = currentSourceType(); int lines = ui.sbPreviewLines->value(); @@ -1466,6 +1484,10 @@ RESET_CURSOR; } +void ImportFileWidget::importUrlChanged(const QUrl url) { + emit fileNameChanged(url.path()); +} + void ImportFileWidget::updateContent(const QString& fileName) { QDEBUG("ImportFileWidget::updateContent(): file name = " << fileName); if (auto filter = currentFileFilter()) { @@ -1545,7 +1567,7 @@ switch (sourceType) { case LiveDataSource::SourceType::FileOrPipe: ui.lFileName->show(); - ui.leFileName->show(); + m_cbFileName->show(); ui.bFileInfo->show(); ui.bOpen->show(); ui.chbLinkFile->show(); @@ -1570,7 +1592,7 @@ item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); - fileNameChanged(ui.leFileName->text()); + fileNameChanged(fileName()); ui.cbFileType->show(); ui.lFileType->show(); setMQTTVisible(false); @@ -1595,7 +1617,7 @@ ui.cbSerialPort->hide(); ui.lFileName->hide(); - ui.leFileName->hide(); + m_cbFileName->hide(); ui.bFileInfo->hide(); ui.bOpen->hide(); ui.chbLinkFile->hide(); @@ -1612,7 +1634,7 @@ break; case LiveDataSource::SourceType::LocalSocket: ui.lFileName->show(); - ui.leFileName->show(); + m_cbFileName->show(); ui.bOpen->show(); ui.lSampleSize->hide(); ui.sbSampleSize->hide(); @@ -1651,7 +1673,7 @@ ui.lePort->hide(); ui.lPort->hide(); ui.lFileName->hide(); - ui.leFileName->hide(); + m_cbFileName->hide(); ui.bFileInfo->hide(); ui.bOpen->hide(); ui.chbLinkFile->hide(); @@ -1693,7 +1715,7 @@ ui.lPort->hide(); ui.lePort->hide(); ui.lFileName->hide(); - ui.leFileName->hide(); + m_cbFileName->hide(); ui.bFileInfo->hide(); ui.bOpen->hide(); ui.chbLinkFile->hide(); diff --git a/src/kdefrontend/datasources/NetCDFOptionsWidget.cpp b/src/kdefrontend/datasources/NetCDFOptionsWidget.cpp --- a/src/kdefrontend/datasources/NetCDFOptionsWidget.cpp +++ b/src/kdefrontend/datasources/NetCDFOptionsWidget.cpp @@ -29,6 +29,8 @@ #include "backend/datasources/filters/NetCDFFilter.h" #include "backend/lib/macros.h" +#include + /*! \class NetCDFOptionsWidget \brief Widget providing options for the import of NetCDF data @@ -87,7 +89,7 @@ else if (item->data(1, Qt::DisplayRole).toString().contains("attribute")) { // reads attributes (only for preview) auto filter = static_cast(m_fileWidget->currentFileFilter()); - QString fileName = m_fileWidget->ui.leFileName->text(); + QString fileName = m_fileWidget->m_cbFileName->currentText(); QString name = item->data(0, Qt::DisplayRole).toString(); QString varName = item->data(1, Qt::DisplayRole).toString().split(' ')[0]; QDEBUG("name =" << name << "varName =" << varName); diff --git a/src/kdefrontend/ui/datasources/importfilewidget.ui b/src/kdefrontend/ui/datasources/importfilewidget.ui --- a/src/kdefrontend/ui/datasources/importfilewidget.ui +++ b/src/kdefrontend/ui/datasources/importfilewidget.ui @@ -244,16 +244,6 @@ - - - - Specify the name of the file to import. - - - true - - -