diff --git a/src/backend/datasources/LiveDataSource.h b/src/backend/datasources/LiveDataSource.h --- a/src/backend/datasources/LiveDataSource.h +++ b/src/backend/datasources/LiveDataSource.h @@ -141,8 +141,8 @@ void pauseReading(); void continueReading(); - void setFilter(AbstractFileFilter*); - AbstractFileFilter* filter() const; + void setFilter(QSharedPointer); + QSharedPointer filter() const; QIcon icon() const override; QMenu* createContextMenu() override; @@ -178,7 +178,7 @@ qint64 m_bytesRead; - AbstractFileFilter* m_filter; + QSharedPointer m_filter; QTimer* m_updateTimer; QFileSystemWatcher* m_fileSystemWatcher; diff --git a/src/backend/datasources/LiveDataSource.cpp b/src/backend/datasources/LiveDataSource.cpp --- a/src/backend/datasources/LiveDataSource.cpp +++ b/src/backend/datasources/LiveDataSource.cpp @@ -75,7 +75,6 @@ m_port(1027), m_baudRate(9600), m_bytesRead(0), - m_filter(nullptr), m_updateTimer(new QTimer(this)), m_fileSystemWatcher(nullptr), m_file(nullptr), @@ -94,9 +93,6 @@ //stop reading before deleting the objects pauseReading(); - if (m_filter) - delete m_filter; - if (m_fileSystemWatcher) delete m_fileSystemWatcher; @@ -248,11 +244,11 @@ return m_fileType; } -void LiveDataSource::setFilter(AbstractFileFilter* f) { +void LiveDataSource::setFilter(QSharedPointer f) { m_filter = f; } -AbstractFileFilter* LiveDataSource::filter() const { +QSharedPointer LiveDataSource::filter() const { return m_filter; } @@ -497,7 +493,7 @@ */ void LiveDataSource::read() { DEBUG("\nLiveDataSource::read()"); - if (m_filter == nullptr) + if (!m_filter) return; //initialize the device (file, socket, serial port) when calling this function for the first time @@ -565,16 +561,16 @@ switch (m_fileType) { case AbstractFileFilter::Ascii: if (m_readingType == LiveDataSource::ReadingType::WholeFile) { - dynamic_cast(m_filter)->readFromLiveDevice(*m_file, this, 0); + qSharedPointerCast(m_filter)->readFromLiveDevice(*m_file, this, 0); } else { - bytes = dynamic_cast(m_filter)->readFromLiveDevice(*m_file, this, m_bytesRead); + bytes = qSharedPointerCast(m_filter)->readFromLiveDevice(*m_file, this, m_bytesRead); m_bytesRead += bytes; DEBUG("Read " << bytes << " bytes, in total: " << m_bytesRead); } break; case AbstractFileFilter::Binary: //TODO: not implemented yet - // bytes = dynamic_cast(m_filter)->readFromLiveDevice(*m_file, this, m_bytesRead); + // bytes = qSharedPointerCast(m_filter)->readFromLiveDevice(*m_file, this, m_bytesRead); // m_bytesRead += bytes; //TODO: other types not implemented yet case AbstractFileFilter::Image: @@ -602,7 +598,7 @@ // reading data here if (m_fileType == AbstractFileFilter::Ascii) - dynamic_cast(m_filter)->readFromLiveDeviceNotFile(*m_device, this); + qSharedPointerCast(m_filter)->readFromLiveDeviceNotFile(*m_device, this); break; case LocalSocket: DEBUG(" Reading from local socket. state before abort = " << m_localSocket->state()); @@ -618,7 +614,7 @@ // reading data here if (m_fileType == AbstractFileFilter::Ascii) - dynamic_cast(m_filter)->readFromLiveDeviceNotFile(*m_device, this); + qSharedPointerCast(m_filter)->readFromLiveDeviceNotFile(*m_device, this); break; case MQTT: break; @@ -635,7 +631,7 @@ DEBUG(" REMAINING TIME = " << m_updateTimer->remainingTime()); if (m_fileType == AbstractFileFilter::Ascii) - dynamic_cast(m_filter)->readFromLiveDeviceNotFile(*m_device, this); + qSharedPointerCast(m_filter)->readFromLiveDeviceNotFile(*m_device, this); //TODO: not implemented yet // else if (m_fileType == AbstractFileFilter::Binary) @@ -957,7 +953,7 @@ } } else if (reader->name() == "asciiFilter") { - m_filter = new AsciiFilter(); + m_filter.reset(new AsciiFilter); if (!m_filter->load(reader)) return false; } else if (reader->name() == "column") { diff --git a/src/backend/datasources/MQTTClient.h b/src/backend/datasources/MQTTClient.h --- a/src/backend/datasources/MQTTClient.h +++ b/src/backend/datasources/MQTTClient.h @@ -150,8 +150,8 @@ void pauseReading(); void continueReading(); - void setFilter(AbstractFileFilter*); - AbstractFileFilter* filter() const; + void setFilter(QSharedPointer); + QSharedPointer filter() const; QIcon icon() const override; @@ -221,7 +221,7 @@ int m_sampleSize; int m_keepNValues; int m_updateInterval; - AbstractFileFilter* m_filter; + QSharedPointer m_filter; QTimer* m_updateTimer; QMqttClient* m_client; QMap m_subscribedTopicNameQoS; diff --git a/src/backend/datasources/MQTTClient.cpp b/src/backend/datasources/MQTTClient.cpp --- a/src/backend/datasources/MQTTClient.cpp +++ b/src/backend/datasources/MQTTClient.cpp @@ -70,7 +70,6 @@ m_sampleSize(1), m_keepNValues(0), m_updateInterval(1000), - m_filter(nullptr), m_updateTimer(new QTimer(this)), m_client(new QMqttClient(this)), m_MQTTTest(false), @@ -100,8 +99,6 @@ //stop reading before deleting the objects pauseReading(); qDebug()<<"Delete MQTTClient: " << m_client->hostname(); - if (m_filter) - delete m_filter; delete m_updateTimer; delete m_willTimer; @@ -150,14 +147,14 @@ * * \param f a pointer to the new filter */ -void MQTTClient::setFilter(AbstractFileFilter* f) { +void MQTTClient::setFilter(QSharedPointer f) { m_filter = f; } /*! * \brief Returns the filter of the MQTTClient. */ -AbstractFileFilter* MQTTClient::filter() const { +QSharedPointer MQTTClient::filter() const { return m_filter; } @@ -823,7 +820,6 @@ */ void MQTTClient::updateWillMessage() { QVector topics = children(AbstractAspect::Recursive); - const AsciiFilter* asciiFilter = nullptr; const MQTTTopic* willTopic = nullptr; //Search for the will topic @@ -865,7 +861,7 @@ qDebug()<<"Will own message" << m_MQTTWill.willOwnMessage; break; case WillMessageType::Statistics: { - asciiFilter = dynamic_cast(willTopic->filter()); + const auto asciiFilter = qSharedPointerCast(willTopic->filter()); //If the topic's asciiFilter was found, get the needed statistics if (asciiFilter != nullptr) { @@ -988,7 +984,7 @@ *\brief called periodically when update type is TimeInterval */ void MQTTClient::read() { - if (m_filter == nullptr) + if (!m_filter) return; if (!m_prepared) { @@ -1358,7 +1354,7 @@ } } else if (reader->name() == "asciiFilter") { - m_filter = new AsciiFilter(); + m_filter.reset(new AsciiFilter); if (!m_filter->load(reader)) return false; } else if (reader->name() == "MQTTSubscription") { diff --git a/src/backend/datasources/MQTTTopic.h b/src/backend/datasources/MQTTTopic.h --- a/src/backend/datasources/MQTTTopic.h +++ b/src/backend/datasources/MQTTTopic.h @@ -38,16 +38,18 @@ class MQTTClient; #endif +#include + class MQTTTopic : public Spreadsheet { #ifdef HAVE_MQTT Q_OBJECT public: MQTTTopic(const QString& name, MQTTSubscription* subscription, bool loading = false); ~MQTTTopic() override; - void setFilter(AbstractFileFilter*); - AbstractFileFilter* filter() const; + void setFilter(QSharedPointer); + QSharedPointer filter() const; QIcon icon() const override; QMenu* createContextMenu() override; @@ -70,7 +72,7 @@ QString m_topicName; MQTTClient* m_MQTTClient; - AbstractFileFilter* m_filter; + QSharedPointer m_filter; QVector m_messagePuffer; QAction* m_plotDataAction; diff --git a/src/backend/datasources/MQTTTopic.cpp b/src/backend/datasources/MQTTTopic.cpp --- a/src/backend/datasources/MQTTTopic.cpp +++ b/src/backend/datasources/MQTTTopic.cpp @@ -57,10 +57,10 @@ MQTTTopic::MQTTTopic(const QString& name, MQTTSubscription* subscription, bool loading) : Spreadsheet(name, loading), m_topicName(name), - m_MQTTClient(subscription->mqttClient()), - m_filter(new AsciiFilter()) { - AsciiFilter* mainFilter = dynamic_cast(m_MQTTClient->filter()); - AsciiFilter* myFilter = dynamic_cast(m_filter); + m_MQTTClient(subscription->mqttClient()), + m_filter(new AsciiFilter) { + auto mainFilter = qSharedPointerCast(m_MQTTClient->filter()); + AsciiFilter* myFilter = dynamic_cast(m_filter.get()); myFilter->setAutoModeEnabled(mainFilter->isAutoModeEnabled()); if (!mainFilter->isAutoModeEnabled()) { @@ -102,14 +102,14 @@ * * \param filter */ -void MQTTTopic::setFilter(AbstractFileFilter* f) { +void MQTTTopic::setFilter(QSharedPointer f) { m_filter = f; } /*! *\brief Returns the MQTTTopic's filter */ -AbstractFileFilter* MQTTTopic::filter() const { +QSharedPointer MQTTTopic::filter() const { return m_filter; } @@ -228,7 +228,7 @@ while (!m_messagePuffer.isEmpty()) { qDebug()<< "Reading from topic " << m_topicName; const QString tempMessage = m_messagePuffer.takeFirst(); - dynamic_cast(m_filter)->readMQTTTopic(tempMessage, m_topicName, this); + qSharedPointerCast(m_filter)->readMQTTTopic(tempMessage, m_topicName, this); } } @@ -246,8 +246,8 @@ //general writer->writeStartElement("general"); writer->writeAttribute("topicName", m_topicName); - writer->writeAttribute("filterPrepared", QString::number(dynamic_cast(m_filter)->isPrepared())); - writer->writeAttribute("filterSeparator", dynamic_cast(m_filter)->separator()); + writer->writeAttribute("filterPrepared", QString::number(qSharedPointerCast(m_filter)->isPrepared())); + writer->writeAttribute("filterSeparator", qSharedPointerCast(m_filter)->separator()); writer->writeAttribute("messagePufferSize", QString::number(m_messagePuffer.size())); for (int i = 0; i < m_messagePuffer.count(); ++i) writer->writeAttribute("message"+QString::number(i), m_messagePuffer[i]); @@ -346,7 +346,7 @@ } //prepare filter for reading - dynamic_cast(m_filter)->setPreparedForMQTT(isFilterPrepared, this, separator); + qSharedPointerCast(m_filter)->setPreparedForMQTT(isFilterPrepared, this, separator); return !reader->hasError(); } diff --git a/src/backend/datasources/filters/AbstractFileFilter.h b/src/backend/datasources/filters/AbstractFileFilter.h --- a/src/backend/datasources/filters/AbstractFileFilter.h +++ b/src/backend/datasources/filters/AbstractFileFilter.h @@ -65,6 +65,8 @@ virtual void save(QXmlStreamWriter*) const = 0; virtual bool load(XmlStreamReader*) = 0; + virtual FileType type() const = 0; + signals: void completed(int) const; //!< int ranging from 0 to 100 notifies about the status of a read/write process }; diff --git a/src/backend/datasources/filters/AsciiFilter.h b/src/backend/datasources/filters/AsciiFilter.h --- a/src/backend/datasources/filters/AsciiFilter.h +++ b/src/backend/datasources/filters/AsciiFilter.h @@ -121,7 +121,8 @@ void save(QXmlStreamWriter*) const override; bool load(XmlStreamReader*) override; - int isPrepared(); + FileType type() const override { return Ascii; } + int isPrepared(); private: std::unique_ptr const d; diff --git a/src/backend/datasources/filters/BinaryFilter.h b/src/backend/datasources/filters/BinaryFilter.h --- a/src/backend/datasources/filters/BinaryFilter.h +++ b/src/backend/datasources/filters/BinaryFilter.h @@ -84,6 +84,8 @@ void save(QXmlStreamWriter*) const override; bool load(XmlStreamReader*) override; + FileType type() const override { return Binary; } + private: std::unique_ptr const d; friend class BinaryFilterPrivate; diff --git a/src/backend/datasources/filters/FITSFilter.h b/src/backend/datasources/filters/FITSFilter.h --- a/src/backend/datasources/filters/FITSFilter.h +++ b/src/backend/datasources/filters/FITSFilter.h @@ -51,6 +51,8 @@ void save(QXmlStreamWriter*) const override; bool load(XmlStreamReader*) override; + FileType type() const override { return FITS; } + struct KeywordUpdate { KeywordUpdate() : keyUpdated(false), valueUpdated(false), commentUpdated(false), unitUpdated(false) {} diff --git a/src/backend/datasources/filters/HDF5Filter.h b/src/backend/datasources/filters/HDF5Filter.h --- a/src/backend/datasources/filters/HDF5Filter.h +++ b/src/backend/datasources/filters/HDF5Filter.h @@ -64,6 +64,8 @@ void save(QXmlStreamWriter*) const override; bool load(XmlStreamReader*) override; + FileType type() const override { return HDF5; } + private: std::unique_ptr const d; friend class HDF5FilterPrivate; diff --git a/src/backend/datasources/filters/ImageFilter.h b/src/backend/datasources/filters/ImageFilter.h --- a/src/backend/datasources/filters/ImageFilter.h +++ b/src/backend/datasources/filters/ImageFilter.h @@ -65,6 +65,8 @@ void save(QXmlStreamWriter*) const override; bool load(XmlStreamReader*) override; + FileType type() const override { return Image; } + private: std::unique_ptr const d; friend class ImageFilterPrivate; diff --git a/src/backend/datasources/filters/JsonFilter.h b/src/backend/datasources/filters/JsonFilter.h --- a/src/backend/datasources/filters/JsonFilter.h +++ b/src/backend/datasources/filters/JsonFilter.h @@ -96,6 +96,8 @@ void save(QXmlStreamWriter*) const override; bool load(XmlStreamReader*) override; + FileType type() const override { return JSON; } + private: std::unique_ptr const d; friend class JsonFilterPrivate; diff --git a/src/backend/datasources/filters/NetCDFFilter.h b/src/backend/datasources/filters/NetCDFFilter.h --- a/src/backend/datasources/filters/NetCDFFilter.h +++ b/src/backend/datasources/filters/NetCDFFilter.h @@ -64,6 +64,8 @@ void save(QXmlStreamWriter*) const override; bool load(XmlStreamReader*) override; + FileType type() const override { return NETCDF; } + private: std::unique_ptr const d; friend class NetCDFFilterPrivate; diff --git a/src/backend/datasources/filters/NgspiceRawAsciiFilter.h b/src/backend/datasources/filters/NgspiceRawAsciiFilter.h --- a/src/backend/datasources/filters/NgspiceRawAsciiFilter.h +++ b/src/backend/datasources/filters/NgspiceRawAsciiFilter.h @@ -62,6 +62,8 @@ void save(QXmlStreamWriter*) const override; bool load(XmlStreamReader*) override; + FileType type() const override { return NgspiceRawAscii; } + private: std::unique_ptr const d; friend class NgspiceRawAsciiFilterPrivate; diff --git a/src/backend/datasources/filters/NgspiceRawBinaryFilter.h b/src/backend/datasources/filters/NgspiceRawBinaryFilter.h --- a/src/backend/datasources/filters/NgspiceRawBinaryFilter.h +++ b/src/backend/datasources/filters/NgspiceRawBinaryFilter.h @@ -62,6 +62,8 @@ void save(QXmlStreamWriter*) const override; bool load(XmlStreamReader*) override; + FileType type() const override { return NgspiceRawBinary; } + private: std::unique_ptr const d; friend class NgspiceRawBinaryFilterPrivate; diff --git a/src/backend/datasources/filters/ROOTFilter.h b/src/backend/datasources/filters/ROOTFilter.h --- a/src/backend/datasources/filters/ROOTFilter.h +++ b/src/backend/datasources/filters/ROOTFilter.h @@ -103,6 +103,8 @@ /// Load bin limitation settings bool load(XmlStreamReader*) override; + FileType type() const override { return ROOT; } + private: std::unique_ptr const d; friend class ROOTFilterPrivate; diff --git a/src/kdefrontend/datasources/AsciiOptionsWidget.h b/src/kdefrontend/datasources/AsciiOptionsWidget.h --- a/src/kdefrontend/datasources/AsciiOptionsWidget.h +++ b/src/kdefrontend/datasources/AsciiOptionsWidget.h @@ -39,7 +39,7 @@ public: explicit AsciiOptionsWidget(QWidget*); void showAsciiHeaderOptions(bool); - void applyFilterSettings(AsciiFilter*) const; + void applyFilterSettings(QSharedPointer) const; void loadSettings() const; void saveSettings(); diff --git a/src/kdefrontend/datasources/AsciiOptionsWidget.cpp b/src/kdefrontend/datasources/AsciiOptionsWidget.cpp --- a/src/kdefrontend/datasources/AsciiOptionsWidget.cpp +++ b/src/kdefrontend/datasources/AsciiOptionsWidget.cpp @@ -140,7 +140,7 @@ } } -void AsciiOptionsWidget::applyFilterSettings(AsciiFilter* filter) const { +void AsciiOptionsWidget::applyFilterSettings(QSharedPointer filter) const { Q_ASSERT(filter); filter->setCommentCharacter( ui.cbCommentCharacter->currentText() ); diff --git a/src/kdefrontend/datasources/BinaryOptionsWidget.h b/src/kdefrontend/datasources/BinaryOptionsWidget.h --- a/src/kdefrontend/datasources/BinaryOptionsWidget.h +++ b/src/kdefrontend/datasources/BinaryOptionsWidget.h @@ -38,7 +38,7 @@ public: explicit BinaryOptionsWidget(QWidget*); - void applyFilterSettings(BinaryFilter*) const; + void applyFilterSettings(QSharedPointer) const; void loadSettings() const; void saveSettings(); diff --git a/src/kdefrontend/datasources/BinaryOptionsWidget.cpp b/src/kdefrontend/datasources/BinaryOptionsWidget.cpp --- a/src/kdefrontend/datasources/BinaryOptionsWidget.cpp +++ b/src/kdefrontend/datasources/BinaryOptionsWidget.cpp @@ -65,7 +65,7 @@ ui.cbByteOrder->setWhatsThis(textByteOrder); } -void BinaryOptionsWidget::applyFilterSettings(BinaryFilter* filter) const { +void BinaryOptionsWidget::applyFilterSettings(QSharedPointer filter) const { Q_ASSERT(filter); filter->setVectors( ui.niVectors->value() ); diff --git a/src/kdefrontend/datasources/FITSOptionsWidget.h b/src/kdefrontend/datasources/FITSOptionsWidget.h --- a/src/kdefrontend/datasources/FITSOptionsWidget.h +++ b/src/kdefrontend/datasources/FITSOptionsWidget.h @@ -41,7 +41,7 @@ explicit FITSOptionsWidget(QWidget*, ImportFileWidget*); void clear(); QString currentExtensionName(); - void updateContent(FITSFilter*, const QString& fileName); + void updateContent(QSharedPointer, const QString& fileName); const QStringList selectedFITSExtensions() const; int lines() const { return ui.sbPreviewLines->value(); } QTableWidget* previewWidget() const { return ui.twPreview; } diff --git a/src/kdefrontend/datasources/FITSOptionsWidget.cpp b/src/kdefrontend/datasources/FITSOptionsWidget.cpp --- a/src/kdefrontend/datasources/FITSOptionsWidget.cpp +++ b/src/kdefrontend/datasources/FITSOptionsWidget.cpp @@ -60,7 +60,7 @@ return name; } -void FITSOptionsWidget::updateContent(FITSFilter *filter, const QString& fileName) { +void FITSOptionsWidget::updateContent(QSharedPointer filter, const QString& fileName) { DEBUG("FITSOptionsWidget::updateContent() file name = " << fileName.toStdString()); ui.twExtensions->clear(); filter->parseExtensions(fileName, ui.twExtensions, true); @@ -110,7 +110,7 @@ } if (!selectedExtension.isEmpty()) { - auto* filter = dynamic_cast(m_fileWidget->currentFileFilter()); + auto filter = qSharedPointerCast(m_fileWidget->currentFileFilter()); bool readFitsTableToMatrix; const QVector importedStrings = filter->readChdu(selectedExtension, &readFitsTableToMatrix, ui.sbPreviewLines->value()); emit m_fileWidget->checkedFitsTableToMatrix(readFitsTableToMatrix); diff --git a/src/kdefrontend/datasources/HDF5OptionsWidget.h b/src/kdefrontend/datasources/HDF5OptionsWidget.h --- a/src/kdefrontend/datasources/HDF5OptionsWidget.h +++ b/src/kdefrontend/datasources/HDF5OptionsWidget.h @@ -39,7 +39,7 @@ public: explicit HDF5OptionsWidget(QWidget*, ImportFileWidget*); void clear(); - void updateContent(HDF5Filter*, const QString &fileName); + void updateContent(QSharedPointer, const QString &fileName); const QStringList selectedHDF5Names() const; int lines() const { return ui.sbPreviewLines->value(); } QTableWidget* previewWidget() const { return ui.twPreview; } diff --git a/src/kdefrontend/datasources/HDF5OptionsWidget.cpp b/src/kdefrontend/datasources/HDF5OptionsWidget.cpp --- a/src/kdefrontend/datasources/HDF5OptionsWidget.cpp +++ b/src/kdefrontend/datasources/HDF5OptionsWidget.cpp @@ -60,7 +60,7 @@ ui.twPreview->clear(); } -void HDF5OptionsWidget::updateContent(HDF5Filter *filter, const QString& fileName) { +void HDF5OptionsWidget::updateContent(QSharedPointer filter, const QString& fileName) { ui.twContent->clear(); QTreeWidgetItem *rootItem = ui.twContent->invisibleRootItem(); filter->parse(fileName, rootItem); diff --git a/src/kdefrontend/datasources/ImportFileDialog.cpp b/src/kdefrontend/datasources/ImportFileDialog.cpp --- a/src/kdefrontend/datasources/ImportFileDialog.cpp +++ b/src/kdefrontend/datasources/ImportFileDialog.cpp @@ -152,7 +152,7 @@ //show a progress bar in the status bar auto* progressBar = new QProgressBar(); progressBar->setRange(0, 100); - connect(source->filter(), &AbstractFileFilter::completed, progressBar, &QProgressBar::setValue); + connect(source->filter().get(), &AbstractFileFilter::completed, progressBar, &QProgressBar::setValue); statusBar->clearMessage(); statusBar->addWidget(progressBar, 1); @@ -200,13 +200,13 @@ } QString fileName = m_importFileWidget->fileName(); - AbstractFileFilter* filter = m_importFileWidget->currentFileFilter(); + auto filter = m_importFileWidget->currentFileFilter(); auto mode = AbstractFileFilter::ImportMode(cbPosition->currentIndex()); //show a progress bar in the status bar auto* progressBar = new QProgressBar(); progressBar->setRange(0, 100); - connect(filter, SIGNAL(completed(int)), progressBar, SLOT(setValue(int))); + connect(filter.get(), &AbstractFileFilter::completed, progressBar, &QProgressBar::setValue); statusBar->clearMessage(); statusBar->addWidget(progressBar, 1); @@ -279,13 +279,13 @@ for (int i = 0; i < nrNames; ++i) { switch (fileType) { case AbstractFileFilter::HDF5: - ((HDF5Filter*) filter)->setCurrentDataSetName(names[i]); + qSharedPointerCast(filter)->setCurrentDataSetName(names[i]); break; case AbstractFileFilter::NETCDF: - ((NetCDFFilter*) filter)->setCurrentVarName(names[i]); + qSharedPointerCast(filter)->setCurrentVarName(names[i]); break; case AbstractFileFilter::ROOT: - ((ROOTFilter*) filter)->setCurrentHistogram(names[i]); + qSharedPointerCast(filter)->setCurrentHistogram(names[i]); break; case AbstractFileFilter::Ascii: case AbstractFileFilter::Binary: @@ -321,7 +321,6 @@ RESET_CURSOR; statusBar->removeWidget(progressBar); - delete filter; } void ImportFileDialog::toggleOptions() { 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 @@ -38,6 +38,7 @@ #include "backend/datasources/MQTTClient.h" #endif +#include #include #include @@ -67,7 +68,7 @@ void loadSettings(); AbstractFileFilter::FileType currentFileType() const; LiveDataSource::SourceType currentSourceType() const; - AbstractFileFilter* currentFileFilter() const; + QSharedPointer currentFileFilter() const; QString fileName() const; QString selectedObject() const; bool isFileEmpty() const; @@ -99,6 +100,8 @@ std::unique_ptr m_jsonOptionsWidget; std::unique_ptr m_rootOptionsWidget; + mutable QSharedPointer currentFilter; + QTableWidget* m_twPreview; const QString& m_fileName; bool m_fileEmpty; 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 @@ -482,7 +482,7 @@ source->setComment( ui.leFileName->text() ); source->setFileType(fileType); - source->setFilter(this->currentFileFilter()); + source->setFilter(currentFileFilter()); source->setSourceType(sourceType); source->setReadingType(readingType); @@ -534,7 +534,7 @@ MQTTClient::ReadingType readingType = static_cast(ui.cbReadingType->currentIndex()); client->setComment( ui.leFileName->text() ); - client->setFilter(this->currentFileFilter()); + client->setFilter(currentFileFilter()); client->setReadingType(readingType); @@ -589,15 +589,18 @@ /*! returns the currently used filter. */ -AbstractFileFilter* ImportFileWidget::currentFileFilter() const { +QSharedPointer ImportFileWidget::currentFileFilter() const { DEBUG("ImportFileWidget::currentFileFilter()"); AbstractFileFilter::FileType fileType = currentFileType(); + if (currentFilter && currentFilter->type() != fileType) + currentFilter.reset(); switch (fileType) { case AbstractFileFilter::Ascii: { DEBUG(" ASCII"); - //TODO std::unique_ptr filter(new AsciiFilter()); - auto* filter = new AsciiFilter(); + if (!currentFilter) + currentFilter.reset(new AsciiFilter); + auto filter = qSharedPointerCast(currentFilter); if (ui.cbFilter->currentIndex() == 0) //"automatic" filter->setAutoModeEnabled(true); @@ -614,10 +617,12 @@ filter->setStartColumn( ui.sbStartColumn->value()); filter->setEndColumn( ui.sbEndColumn->value()); - return filter; + break; } case AbstractFileFilter::Binary: { - auto* filter = new BinaryFilter(); + if (!currentFilter) + currentFilter.reset(new BinaryFilter); + auto filter = qSharedPointerCast(currentFilter); if ( ui.cbFilter->currentIndex() == 0 ) //"automatic" filter->setAutoModeEnabled(true); else if ( ui.cbFilter->currentIndex() == 1 ) { //"custom" @@ -632,88 +637,108 @@ filter->setStartRow( ui.sbStartRow->value() ); filter->setEndRow( ui.sbEndRow->value() ); - return filter; + break; } case AbstractFileFilter::Image: { - auto* filter = new ImageFilter(); + if (!currentFilter) + currentFilter.reset(new ImageFilter); + auto filter = qSharedPointerCast(currentFilter); filter->setImportFormat(m_imageOptionsWidget->currentFormat()); filter->setStartRow( ui.sbStartRow->value() ); filter->setEndRow( ui.sbEndRow->value() ); filter->setStartColumn( ui.sbStartColumn->value() ); filter->setEndColumn( ui.sbEndColumn->value() ); - return filter; + break; } case AbstractFileFilter::HDF5: { - auto* filter = new HDF5Filter(); + if (!currentFilter) + currentFilter.reset(new HDF5Filter); + auto filter = qSharedPointerCast(currentFilter); QStringList names = selectedHDF5Names(); if (!names.isEmpty()) filter->setCurrentDataSetName(names[0]); filter->setStartRow( ui.sbStartRow->value() ); filter->setEndRow( ui.sbEndRow->value() ); filter->setStartColumn( ui.sbStartColumn->value() ); filter->setEndColumn( ui.sbEndColumn->value() ); - return filter; + break; } case AbstractFileFilter::NETCDF: { - auto* filter = new NetCDFFilter(); + if (!currentFilter) + currentFilter.reset(new NetCDFFilter); + auto filter = qSharedPointerCast(currentFilter); if (!selectedNetCDFNames().isEmpty()) filter->setCurrentVarName(selectedNetCDFNames()[0]); filter->setStartRow( ui.sbStartRow->value() ); filter->setEndRow( ui.sbEndRow->value() ); filter->setStartColumn( ui.sbStartColumn->value() ); filter->setEndColumn( ui.sbEndColumn->value() ); - return filter; + break; } case AbstractFileFilter::FITS: { - auto* filter = new FITSFilter(); + if (!currentFilter) + currentFilter.reset(new FITSFilter); + auto filter = qSharedPointerCast(currentFilter); filter->setStartRow( ui.sbStartRow->value()); filter->setEndRow( ui.sbEndRow->value() ); filter->setStartColumn( ui.sbStartColumn->value()); filter->setEndColumn( ui.sbEndColumn->value()); - return filter; + + break; } case AbstractFileFilter::JSON: { - auto* filter = new JsonFilter(); + if (!currentFilter) + currentFilter.reset(new JsonFilter); + auto filter = qSharedPointerCast(currentFilter); m_jsonOptionsWidget->applyFilterSettings(filter, ui.tvJson->currentIndex()); filter->setStartRow( ui.sbStartRow->value() ); filter->setEndRow( ui.sbEndRow->value() ); filter->setStartColumn( ui.sbStartColumn->value()); filter->setEndColumn( ui.sbEndColumn->value()); - return filter; + + break; } case AbstractFileFilter::ROOT: { - auto* filter = new ROOTFilter(); + if (!currentFilter) + currentFilter.reset(new ROOTFilter); + auto filter = qSharedPointerCast(currentFilter); QStringList names = selectedROOTNames(); if (!names.isEmpty()) filter->setCurrentHistogram(names.first()); filter->setStartBin( m_rootOptionsWidget->startBin() ); filter->setEndBin( m_rootOptionsWidget->endBin() ); filter->setColumns( m_rootOptionsWidget->columns() ); - return filter; + break; } case AbstractFileFilter::NgspiceRawAscii: { - auto* filter = new NgspiceRawAsciiFilter(); - filter->setStartRow( ui.sbStartRow->value() ); - filter->setEndRow( ui.sbEndRow->value() ); - return filter; - } + if (!currentFilter) + currentFilter.reset(new NgspiceRawAsciiFilter); + auto filter = qSharedPointerCast(currentFilter); + filter->setStartRow( ui.sbStartRow->value() ); + filter->setEndRow( ui.sbEndRow->value() ); + + break; + } case AbstractFileFilter::NgspiceRawBinary: { - auto* filter = new NgspiceRawBinaryFilter(); - filter->setStartRow( ui.sbStartRow->value() ); - filter->setEndRow( ui.sbEndRow->value() ); - return filter; - } + if (!currentFilter) + currentFilter.reset(new NgspiceRawBinaryFilter); + auto filter = qSharedPointerCast(currentFilter); + filter->setStartRow( ui.sbStartRow->value() ); + filter->setEndRow( ui.sbEndRow->value() ); + + break; + } } - return nullptr; + return currentFilter; } /*! @@ -1717,7 +1742,7 @@ case AbstractFileFilter::Ascii: { ui.tePreview->clear(); - auto* filter = static_cast(this->currentFileFilter()); + auto filter = qSharedPointerCast(currentFileFilter()); DEBUG("Data Source Type: " << ENUM_TO_STRING(LiveDataSource, SourceType, sourceType)); switch (sourceType) { @@ -1831,7 +1856,7 @@ } case AbstractFileFilter::Binary: { ui.tePreview->clear(); - auto* filter = (BinaryFilter*)this->currentFileFilter(); + auto filter = qSharedPointerCast(currentFileFilter()); importedStrings = filter->preview(fileName, lines); break; } @@ -1845,21 +1870,21 @@ return; } case AbstractFileFilter::HDF5: { - auto* filter = (HDF5Filter*)this->currentFileFilter(); + auto filter = qSharedPointerCast(currentFileFilter()); lines = m_hdf5OptionsWidget->lines(); importedStrings = filter->readCurrentDataSet(fileName, nullptr, ok, AbstractFileFilter::Replace, lines); tmpTableWidget = m_hdf5OptionsWidget->previewWidget(); break; } case AbstractFileFilter::NETCDF: { - auto* filter = (NetCDFFilter*)this->currentFileFilter(); + auto filter = qSharedPointerCast(currentFileFilter()); lines = m_netcdfOptionsWidget->lines(); importedStrings = filter->readCurrentVar(fileName, nullptr, AbstractFileFilter::Replace, lines); tmpTableWidget = m_netcdfOptionsWidget->previewWidget(); break; } case AbstractFileFilter::FITS: { - auto* filter = (FITSFilter*)this->currentFileFilter(); + auto filter = qSharedPointerCast(currentFileFilter()); lines = m_fitsOptionsWidget->lines(); // update file name (may be any file type) @@ -1881,16 +1906,16 @@ case AbstractFileFilter::JSON: { ui.tePreview->clear(); m_jsonOptionsWidget->loadDocument(fileName); - auto* filter = (JsonFilter*)this->currentFileFilter(); + auto filter = qSharedPointerCast(currentFileFilter()); m_jsonOptionsWidget->applyFilterSettings(filter, ui.tvJson->currentIndex()); importedStrings = filter->preview(fileName); vectorNameList = filter->vectorNames(); columnModes = filter->columnModes(); break; } case AbstractFileFilter::ROOT: { - auto* filter = (ROOTFilter*)this->currentFileFilter(); + auto filter = qSharedPointerCast(currentFileFilter()); lines = m_rootOptionsWidget->lines(); m_rootOptionsWidget->setNBins(filter->binsInCurrentHistogram(fileName)); importedStrings = filter->previewCurrentHistogram( @@ -1908,15 +1933,15 @@ } case AbstractFileFilter::NgspiceRawAscii: { ui.tePreview->clear(); - auto* filter = (NgspiceRawAsciiFilter*)this->currentFileFilter(); + auto filter = qSharedPointerCast(currentFileFilter()); importedStrings = filter->preview(fileName, lines); vectorNameList = filter->vectorNames(); columnModes = filter->columnModes(); break; } case AbstractFileFilter::NgspiceRawBinary: { ui.tePreview->clear(); - auto* filter = (NgspiceRawBinaryFilter*)this->currentFileFilter(); + auto filter = qSharedPointerCast(currentFileFilter()); importedStrings = filter->preview(fileName, lines); vectorNameList = filter->vectorNames(); columnModes = filter->columnModes(); @@ -1981,21 +2006,21 @@ void ImportFileWidget::updateContent(const QString& fileName, AbstractFileFilter::FileType fileType) { initOptionsWidget(fileType); - if (auto* filter = currentFileFilter()) { + if (auto filter = currentFileFilter()) { switch (fileType) { case AbstractFileFilter::HDF5: - m_hdf5OptionsWidget->updateContent((HDF5Filter*)filter, fileName); + m_hdf5OptionsWidget->updateContent(qSharedPointerCast(filter), fileName); break; case AbstractFileFilter::NETCDF: - m_netcdfOptionsWidget->updateContent((NetCDFFilter*)filter, fileName); + m_netcdfOptionsWidget->updateContent(qSharedPointerCast(filter), fileName); break; case AbstractFileFilter::FITS: #ifdef HAVE_FITS - m_fitsOptionsWidget->updateContent((FITSFilter*)filter, fileName); + m_fitsOptionsWidget->updateContent(qSharedPointerCast(filter), fileName); #endif break; case AbstractFileFilter::ROOT: - m_rootOptionsWidget->updateContent((ROOTFilter*)filter, fileName); + m_rootOptionsWidget->updateContent(qSharedPointerCast(filter), fileName); break; case AbstractFileFilter::Ascii: case AbstractFileFilter::Binary: diff --git a/src/kdefrontend/datasources/JsonOptionsWidget.h b/src/kdefrontend/datasources/JsonOptionsWidget.h --- a/src/kdefrontend/datasources/JsonOptionsWidget.h +++ b/src/kdefrontend/datasources/JsonOptionsWidget.h @@ -42,7 +42,7 @@ public: explicit JsonOptionsWidget(QWidget*, ImportFileWidget*); - void applyFilterSettings(JsonFilter*, const QModelIndex&) const; + void applyFilterSettings(QSharedPointer, const QModelIndex&) const; void clearModel(); void loadSettings() const; void saveSettings(); diff --git a/src/kdefrontend/datasources/JsonOptionsWidget.cpp b/src/kdefrontend/datasources/JsonOptionsWidget.cpp --- a/src/kdefrontend/datasources/JsonOptionsWidget.cpp +++ b/src/kdefrontend/datasources/JsonOptionsWidget.cpp @@ -56,7 +56,7 @@ setTooltips(); } -void JsonOptionsWidget::applyFilterSettings(JsonFilter* filter, const QModelIndex& index) const { +void JsonOptionsWidget::applyFilterSettings(QSharedPointer filter, const QModelIndex& index) const { Q_ASSERT(filter); filter->setModelRows(getIndexRows(index)); diff --git a/src/kdefrontend/datasources/NetCDFOptionsWidget.h b/src/kdefrontend/datasources/NetCDFOptionsWidget.h --- a/src/kdefrontend/datasources/NetCDFOptionsWidget.h +++ b/src/kdefrontend/datasources/NetCDFOptionsWidget.h @@ -39,7 +39,7 @@ public: explicit NetCDFOptionsWidget(QWidget*, ImportFileWidget*); void clear(); - void updateContent(NetCDFFilter*, const QString& fileName); + void updateContent(QSharedPointer, const QString& fileName); const QStringList selectedNetCDFNames() const; int lines() const { return ui.sbPreviewLines->value(); } QTableWidget* previewWidget() const { return ui.twPreview; } 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 @@ -60,7 +60,7 @@ ui.twPreview->clear(); } -void NetCDFOptionsWidget::updateContent(NetCDFFilter *filter, const QString& fileName) { +void NetCDFOptionsWidget::updateContent(QSharedPointer filter, const QString& fileName) { ui.twContent->clear(); QTreeWidgetItem *rootItem = ui.twContent->invisibleRootItem(); @@ -86,7 +86,7 @@ m_fileWidget->refreshPreview(); else if (item->data(1, Qt::DisplayRole).toString().contains("attribute")) { // reads attributes (only for preview) - auto* filter = (NetCDFFilter*)m_fileWidget->currentFileFilter(); + auto filter = qSharedPointerCast(m_fileWidget->currentFileFilter()); QString fileName = m_fileWidget->ui.leFileName->text(); QString name = item->data(0, Qt::DisplayRole).toString(); QString varName = item->data(1, Qt::DisplayRole).toString().split(' ')[0]; diff --git a/src/kdefrontend/datasources/ROOTOptionsWidget.h b/src/kdefrontend/datasources/ROOTOptionsWidget.h --- a/src/kdefrontend/datasources/ROOTOptionsWidget.h +++ b/src/kdefrontend/datasources/ROOTOptionsWidget.h @@ -41,7 +41,7 @@ explicit ROOTOptionsWidget(QWidget*, ImportFileWidget*); void clear(); /// Fill the list of available histograms - void updateContent(ROOTFilter* filter, const QString &fileName); + void updateContent(QSharedPointer filter, const QString &fileName); /// Return a list of selected histograms const QStringList selectedROOTNames() const; int lines() const { return ui.sbPreviewLines->value(); } diff --git a/src/kdefrontend/datasources/ROOTOptionsWidget.cpp b/src/kdefrontend/datasources/ROOTOptionsWidget.cpp --- a/src/kdefrontend/datasources/ROOTOptionsWidget.cpp +++ b/src/kdefrontend/datasources/ROOTOptionsWidget.cpp @@ -44,7 +44,7 @@ ui.twPreview->clearContents(); } -void ROOTOptionsWidget::updateContent(ROOTFilter *filter, const QString& fileName) { +void ROOTOptionsWidget::updateContent(QSharedPointer filter, const QString& fileName) { DEBUG("updateContent()"); ui.lwContent->clear(); ui.lwContent->addItems(filter->listHistograms(fileName)); diff --git a/tests/import_export/MQTT/MQTTUnitTest.cpp b/tests/import_export/MQTT/MQTTUnitTest.cpp --- a/tests/import_export/MQTT/MQTTUnitTest.cpp +++ b/tests/import_export/MQTT/MQTTUnitTest.cpp @@ -139,7 +139,7 @@ //################# test handling of data received by messages ############### //############################################################################## void MQTTUnitTest::testIntegerMessage() { - AsciiFilter* filter = new AsciiFilter(); + auto filter = QSharedPointer::create(); filter->setAutoModeEnabled(true); Project* project = new Project(); @@ -230,7 +230,7 @@ } void MQTTUnitTest::testNumericMessage() { - AsciiFilter* filter = new AsciiFilter(); + auto filter = QSharedPointer::create(); filter->setAutoModeEnabled(true); Project* project = new Project(); @@ -321,7 +321,7 @@ } void MQTTUnitTest::testTextMessage() { - AsciiFilter* filter = new AsciiFilter(); + auto filter = QSharedPointer::create(); filter->setAutoModeEnabled(true); Project* project = new Project(); @@ -398,7 +398,7 @@ //##################### test subscribing and unsubscribing ################### //############################################################################## void MQTTUnitTest::testSubscriptions() { - AsciiFilter* filter = new AsciiFilter(); + auto filter = QSharedPointer::create(); filter->setAutoModeEnabled(true); Project* project = new Project();