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(const QSharedPointer&); + const 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(const QSharedPointer& f) { m_filter = f; } -AbstractFileFilter* LiveDataSource::filter() const { +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 @@ -41,7 +41,7 @@ #include class QString; -class AbstractFileFilter; +class AsciiFilter; class MQTTSubscription; class QAction; #endif @@ -150,8 +150,8 @@ void pauseReading(); void continueReading(); - void setFilter(AbstractFileFilter*); - AbstractFileFilter* filter() const; + void setFilter(const QSharedPointer&); + const 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(const QSharedPointer& f) { m_filter = f; } /*! * \brief Returns the filter of the MQTTClient. */ -AbstractFileFilter* MQTTClient::filter() const { +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 = static_cast(willTopic->filter().get()); //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 @@ -31,23 +31,25 @@ #include "backend/spreadsheet/Spreadsheet.h" #include "backend/matrix/Matrix.h" -#include "backend/datasources/filters/AbstractFileFilter.h" +#include "backend/datasources/filters/AsciiFilter.h" #ifdef HAVE_MQTT class MQTTSubscription; 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(const QSharedPointer&); + const 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,35 +57,34 @@ 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 = m_MQTTClient->filter(); - myFilter->setAutoModeEnabled(mainFilter->isAutoModeEnabled()); + m_filter->setAutoModeEnabled(mainFilter->isAutoModeEnabled()); if (!mainFilter->isAutoModeEnabled()) { - myFilter->setCommentCharacter(mainFilter->commentCharacter()); - myFilter->setSeparatingCharacter(mainFilter->separatingCharacter()); - myFilter->setDateTimeFormat(mainFilter->dateTimeFormat()); - myFilter->setCreateIndexEnabled(mainFilter->createIndexEnabled()); - myFilter->setSimplifyWhitespacesEnabled(mainFilter->simplifyWhitespacesEnabled()); - myFilter->setNaNValueToZero(mainFilter->NaNValueToZeroEnabled()); - myFilter->setRemoveQuotesEnabled(mainFilter->removeQuotesEnabled()); - myFilter->setSkipEmptyParts(mainFilter->skipEmptyParts()); - myFilter->setHeaderEnabled(mainFilter->isHeaderEnabled()); + m_filter->setCommentCharacter(mainFilter->commentCharacter()); + m_filter->setSeparatingCharacter(mainFilter->separatingCharacter()); + m_filter->setDateTimeFormat(mainFilter->dateTimeFormat()); + m_filter->setCreateIndexEnabled(mainFilter->createIndexEnabled()); + m_filter->setSimplifyWhitespacesEnabled(mainFilter->simplifyWhitespacesEnabled()); + m_filter->setNaNValueToZero(mainFilter->NaNValueToZeroEnabled()); + m_filter->setRemoveQuotesEnabled(mainFilter->removeQuotesEnabled()); + m_filter->setSkipEmptyParts(mainFilter->skipEmptyParts()); + m_filter->setHeaderEnabled(mainFilter->isHeaderEnabled()); QString vectorNames; const QStringList& filterVectorNames = mainFilter->vectorNames(); for (int i = 0; i < filterVectorNames.size(); ++i) { vectorNames.append(filterVectorNames.at(i)); if (i != vectorNames.size() - 1) vectorNames.append(QLatin1String(" ")); } - myFilter->setVectorNames(vectorNames); - myFilter->setStartRow(mainFilter->startRow()); - myFilter->setEndRow(mainFilter->endRow()); - myFilter->setStartColumn(mainFilter->startColumn()); - myFilter->setEndColumn(mainFilter->endColumn()); + m_filter->setVectorNames(vectorNames); + m_filter->setStartRow(mainFilter->startRow()); + m_filter->setEndRow(mainFilter->endRow()); + m_filter->setStartColumn(mainFilter->startColumn()); + m_filter->setEndColumn(mainFilter->endColumn()); } connect(m_MQTTClient, &MQTTClient::readFromTopics, this, &MQTTTopic::read); @@ -102,14 +101,14 @@ * * \param filter */ -void MQTTTopic::setFilter(AbstractFileFilter* f) { +void MQTTTopic::setFilter(const QSharedPointer& f) { m_filter = f; } /*! *\brief Returns the MQTTTopic's filter */ -AbstractFileFilter* MQTTTopic::filter() const { +const QSharedPointer& MQTTTopic::filter() const { return m_filter; } @@ -228,7 +227,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); + m_filter->readMQTTTopic(tempMessage, m_topicName, this); } } @@ -246,8 +245,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(m_filter->isPrepared())); + writer->writeAttribute("filterSeparator", 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 +345,7 @@ } //prepare filter for reading - dynamic_cast(m_filter)->setPreparedForMQTT(isFilterPrepared, this, separator); + 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 @@ -47,7 +47,7 @@ enum FileType {Ascii, Binary, Image, HDF5, NETCDF, FITS, JSON, ROOT, NgspiceRawAscii, NgspiceRawBinary}; enum ImportMode {Append, Prepend, Replace}; - AbstractFileFilter() {} + explicit AbstractFileFilter(FileType type) : m_type(type) {} ~AbstractFileFilter() override = default; static bool isNan(QString); @@ -65,8 +65,13 @@ virtual void save(QXmlStreamWriter*) const = 0; virtual bool load(XmlStreamReader*) = 0; + constexpr FileType type() const { return m_type; } + signals: void completed(int) const; //!< int ranging from 0 to 100 notifies about the status of a read/write process + +protected: + const FileType m_type; }; #endif 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,7 @@ void save(QXmlStreamWriter*) const override; bool load(XmlStreamReader*) override; - int isPrepared(); + int isPrepared(); private: std::unique_ptr const d; diff --git a/src/backend/datasources/filters/AsciiFilter.cpp b/src/backend/datasources/filters/AsciiFilter.cpp --- a/src/backend/datasources/filters/AsciiFilter.cpp +++ b/src/backend/datasources/filters/AsciiFilter.cpp @@ -57,7 +57,7 @@ \ingroup datasources */ -AsciiFilter::AsciiFilter() : AbstractFileFilter(), d(new AsciiFilterPrivate(this)) {} +AsciiFilter::AsciiFilter() : AbstractFileFilter(Ascii), d(new AsciiFilterPrivate(this)) {} AsciiFilter::~AsciiFilter() = default; diff --git a/src/backend/datasources/filters/BinaryFilter.cpp b/src/backend/datasources/filters/BinaryFilter.cpp --- a/src/backend/datasources/filters/BinaryFilter.cpp +++ b/src/backend/datasources/filters/BinaryFilter.cpp @@ -41,7 +41,7 @@ \ingroup datasources */ -BinaryFilter::BinaryFilter():AbstractFileFilter(), d(new BinaryFilterPrivate(this)) {} +BinaryFilter::BinaryFilter():AbstractFileFilter(Binary), d(new BinaryFilterPrivate(this)) {} BinaryFilter::~BinaryFilter() = default; diff --git a/src/backend/datasources/filters/FITSFilter.cpp b/src/backend/datasources/filters/FITSFilter.cpp --- a/src/backend/datasources/filters/FITSFilter.cpp +++ b/src/backend/datasources/filters/FITSFilter.cpp @@ -46,7 +46,7 @@ * \since 2.2.0 * \ingroup datasources */ -FITSFilter::FITSFilter():AbstractFileFilter(), d(new FITSFilterPrivate(this)) {} +FITSFilter::FITSFilter():AbstractFileFilter(FITS), d(new FITSFilterPrivate(this)) {} FITSFilter::~FITSFilter() = default; diff --git a/src/backend/datasources/filters/HDF5Filter.cpp b/src/backend/datasources/filters/HDF5Filter.cpp --- a/src/backend/datasources/filters/HDF5Filter.cpp +++ b/src/backend/datasources/filters/HDF5Filter.cpp @@ -47,7 +47,7 @@ \ingroup datasources */ -HDF5Filter::HDF5Filter():AbstractFileFilter(), d(new HDF5FilterPrivate(this)) {} +HDF5Filter::HDF5Filter():AbstractFileFilter(HDF5), d(new HDF5FilterPrivate(this)) {} HDF5Filter::~HDF5Filter() = default; diff --git a/src/backend/datasources/filters/ImageFilter.cpp b/src/backend/datasources/filters/ImageFilter.cpp --- a/src/backend/datasources/filters/ImageFilter.cpp +++ b/src/backend/datasources/filters/ImageFilter.cpp @@ -38,7 +38,7 @@ \ingroup datasources */ -ImageFilter::ImageFilter():AbstractFileFilter(), d(new ImageFilterPrivate(this)) {} +ImageFilter::ImageFilter():AbstractFileFilter(Image), d(new ImageFilterPrivate(this)) {} ImageFilter::~ImageFilter() = default; diff --git a/src/backend/datasources/filters/JsonFilter.cpp b/src/backend/datasources/filters/JsonFilter.cpp --- a/src/backend/datasources/filters/JsonFilter.cpp +++ b/src/backend/datasources/filters/JsonFilter.cpp @@ -46,7 +46,7 @@ \ingroup datasources */ -JsonFilter::JsonFilter() : AbstractFileFilter(), d(new JsonFilterPrivate(this)) {} +JsonFilter::JsonFilter() : AbstractFileFilter(JSON), d(new JsonFilterPrivate(this)) {} JsonFilter::~JsonFilter() = default; diff --git a/src/backend/datasources/filters/NetCDFFilter.cpp b/src/backend/datasources/filters/NetCDFFilter.cpp --- a/src/backend/datasources/filters/NetCDFFilter.cpp +++ b/src/backend/datasources/filters/NetCDFFilter.cpp @@ -39,7 +39,7 @@ \ingroup datasources */ -NetCDFFilter::NetCDFFilter():AbstractFileFilter(), d(new NetCDFFilterPrivate(this)) {} +NetCDFFilter::NetCDFFilter():AbstractFileFilter(NETCDF), d(new NetCDFFilterPrivate(this)) {} NetCDFFilter::~NetCDFFilter() = default; diff --git a/src/backend/datasources/filters/NgspiceRawAsciiFilter.cpp b/src/backend/datasources/filters/NgspiceRawAsciiFilter.cpp --- a/src/backend/datasources/filters/NgspiceRawAsciiFilter.cpp +++ b/src/backend/datasources/filters/NgspiceRawAsciiFilter.cpp @@ -37,7 +37,7 @@ \ingroup datasources */ -NgspiceRawAsciiFilter::NgspiceRawAsciiFilter() : AbstractFileFilter(), d(new NgspiceRawAsciiFilterPrivate(this)) {} +NgspiceRawAsciiFilter::NgspiceRawAsciiFilter() : AbstractFileFilter(NgspiceRawAscii), d(new NgspiceRawAsciiFilterPrivate(this)) {} NgspiceRawAsciiFilter::~NgspiceRawAsciiFilter() = default; diff --git a/src/backend/datasources/filters/NgspiceRawBinaryFilter.cpp b/src/backend/datasources/filters/NgspiceRawBinaryFilter.cpp --- a/src/backend/datasources/filters/NgspiceRawBinaryFilter.cpp +++ b/src/backend/datasources/filters/NgspiceRawBinaryFilter.cpp @@ -38,7 +38,7 @@ \ingroup datasources */ -NgspiceRawBinaryFilter::NgspiceRawBinaryFilter() : AbstractFileFilter(), d(new NgspiceRawBinaryFilterPrivate(this)) {} +NgspiceRawBinaryFilter::NgspiceRawBinaryFilter() : AbstractFileFilter(NgspiceRawBinary), d(new NgspiceRawBinaryFilterPrivate(this)) {} NgspiceRawBinaryFilter::~NgspiceRawBinaryFilter() = default; diff --git a/src/backend/datasources/filters/ROOTFilter.cpp b/src/backend/datasources/filters/ROOTFilter.cpp --- a/src/backend/datasources/filters/ROOTFilter.cpp +++ b/src/backend/datasources/filters/ROOTFilter.cpp @@ -46,7 +46,7 @@ #include #include -ROOTFilter::ROOTFilter():AbstractFileFilter(), d(new ROOTFilterPrivate) {} +ROOTFilter::ROOTFilter():AbstractFileFilter(ROOT), d(new ROOTFilterPrivate) {} ROOTFilter::~ROOTFilter() = default; 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(FITSFilter* 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 = static_cast(m_fileWidget->currentFileFilter().get()); bool readFitsTableToMatrix; const QVector importedStrings = filter->readChdu(selectedExtension, &readFitsTableToMatrix, ui.sbPreviewLines->value()); emit m_fileWidget->checkedFitsTableToMatrix(readFitsTableToMatrix); 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(HDF5Filter* 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().get(); 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, &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]); + static_cast(filter)->setCurrentDataSetName(names[i]); break; case AbstractFileFilter::NETCDF: - ((NetCDFFilter*) filter)->setCurrentVarName(names[i]); + static_cast(filter)->setCurrentVarName(names[i]); break; case AbstractFileFilter::ROOT: - ((ROOTFilter*) filter)->setCurrentHistogram(names[i]); + static_cast(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; + 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(qSharedPointerCast(currentFileFilter())); client->setReadingType(readingType); @@ -589,15 +589,18 @@ /*! returns the currently used filter. */ -AbstractFileFilter* ImportFileWidget::currentFileFilter() const { +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 = static_cast(currentFilter.get()); 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 = static_cast(currentFilter.get()); 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 = static_cast(currentFilter.get()); 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 = static_cast(currentFilter.get()); 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 = static_cast(currentFilter.get()); 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 = static_cast(currentFilter.get()); 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 = static_cast(currentFilter.get()); 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 = static_cast(currentFilter.get()); 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(); + if (!currentFilter) + currentFilter.reset(new NgspiceRawAsciiFilter); + auto filter = static_cast(currentFilter.get()); filter->setStartRow( ui.sbStartRow->value() ); filter->setEndRow( ui.sbEndRow->value() ); - return filter; + + break; } case AbstractFileFilter::NgspiceRawBinary: { - auto* filter = new NgspiceRawBinaryFilter(); + if (!currentFilter) + currentFilter.reset(new NgspiceRawBinaryFilter); + auto filter = static_cast(currentFilter.get()); filter->setStartRow( ui.sbStartRow->value() ); filter->setEndRow( ui.sbEndRow->value() ); - return filter; + + break; } } - return nullptr; + return currentFilter; } /*! @@ -1718,7 +1743,7 @@ case AbstractFileFilter::Ascii: { ui.tePreview->clear(); - auto* filter = static_cast(this->currentFileFilter()); + auto filter = static_cast(currentFileFilter().get()); DEBUG("Data Source Type: " << ENUM_TO_STRING(LiveDataSource, SourceType, sourceType)); switch (sourceType) { @@ -1832,7 +1857,7 @@ } case AbstractFileFilter::Binary: { ui.tePreview->clear(); - auto* filter = (BinaryFilter*)this->currentFileFilter(); + auto filter = static_cast(currentFileFilter().get()); importedStrings = filter->preview(fileName, lines); break; } @@ -1846,21 +1871,21 @@ return; } case AbstractFileFilter::HDF5: { - auto* filter = (HDF5Filter*)this->currentFileFilter(); + auto filter = static_cast(currentFileFilter().get()); 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 = static_cast(currentFileFilter().get()); 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 = static_cast(currentFileFilter().get()); lines = m_fitsOptionsWidget->lines(); // update file name (may be any file type) @@ -1882,16 +1907,16 @@ case AbstractFileFilter::JSON: { ui.tePreview->clear(); m_jsonOptionsWidget->loadDocument(fileName); - auto* filter = (JsonFilter*)this->currentFileFilter(); + auto filter = static_cast(currentFileFilter().get()); 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 = static_cast(currentFileFilter().get()); lines = m_rootOptionsWidget->lines(); m_rootOptionsWidget->setNBins(filter->binsInCurrentHistogram(fileName)); importedStrings = filter->previewCurrentHistogram( @@ -1909,15 +1934,15 @@ } case AbstractFileFilter::NgspiceRawAscii: { ui.tePreview->clear(); - auto* filter = (NgspiceRawAsciiFilter*)this->currentFileFilter(); + auto filter = static_cast(currentFileFilter().get()); 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 = static_cast(currentFileFilter().get()); importedStrings = filter->preview(fileName, lines); vectorNameList = filter->vectorNames(); columnModes = filter->columnModes(); @@ -1982,21 +2007,21 @@ void ImportFileWidget::updateContent(const QString& fileName, AbstractFileFilter::FileType fileType) { initOptionsWidget(fileType); - if (auto* filter = currentFileFilter()) { + if (auto filter = currentFileFilter().get()) { switch (fileType) { case AbstractFileFilter::HDF5: - m_hdf5OptionsWidget->updateContent((HDF5Filter*)filter, fileName); + m_hdf5OptionsWidget->updateContent(static_cast(filter), fileName); break; case AbstractFileFilter::NETCDF: - m_netcdfOptionsWidget->updateContent((NetCDFFilter*)filter, fileName); + m_netcdfOptionsWidget->updateContent(static_cast(filter), fileName); break; case AbstractFileFilter::FITS: #ifdef HAVE_FITS - m_fitsOptionsWidget->updateContent((FITSFilter*)filter, fileName); + m_fitsOptionsWidget->updateContent(static_cast(filter), fileName); #endif break; case AbstractFileFilter::ROOT: - m_rootOptionsWidget->updateContent((ROOTFilter*)filter, fileName); + m_rootOptionsWidget->updateContent(static_cast(filter), fileName); break; case AbstractFileFilter::Ascii: case AbstractFileFilter::Binary: 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(NetCDFFilter* 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 = static_cast(m_fileWidget->currentFileFilter().get()); 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.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(ROOTFilter* 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();