File indexing completed on 2025-11-02 03:43:18

0001 /*
0002     File                 : ImportFileWidget.h
0003     Project              : LabPlot
0004     Description          : import file data widget
0005     --------------------------------------------------------------------
0006     SPDX-FileCopyrightText: 2009-2017 Stefan Gerlach <stefan.gerlach@uni-konstanz.de>
0007     SPDX-FileCopyrightText: 2009-2023 Alexander Semke <alexander.semke@web.de>
0008     SPDX-FileCopyrightText: 2017-2018 Fabian Kristof <fkristofszabolcs@gmail.com>
0009     SPDX-FileCopyrightText: 2018-2019 Kovacs Ferencz <kferike98@gmail.com>
0010     SPDX-License-Identifier: GPL-2.0-or-later
0011 */
0012 
0013 #ifndef IMPORTFILEWIDGET_H
0014 #define IMPORTFILEWIDGET_H
0015 
0016 #include "backend/datasources/LiveDataSource.h"
0017 #include "ui_importfilewidget.h"
0018 #include <memory>
0019 
0020 #ifdef HAVE_MQTT
0021 #include "backend/datasources/MQTTClient.h"
0022 class MQTTSubscriptionWidget;
0023 #endif
0024 
0025 #include <QVector>
0026 
0027 class AbstractFileFilter;
0028 class AsciiOptionsWidget;
0029 class BinaryOptionsWidget;
0030 class CANOptionsWidget;
0031 class XLSXOptionsWidget;
0032 class FITSOptionsWidget;
0033 class HDF5OptionsWidget;
0034 class ImageOptionsWidget;
0035 class JsonOptionsWidget;
0036 class MatioOptionsWidget;
0037 class NetCDFOptionsWidget;
0038 class OdsOptionsWidget;
0039 class ROOTOptionsWidget;
0040 class TemplateHandler;
0041 
0042 class QTableWidget;
0043 class QCompleter;
0044 class QTimer;
0045 class QTreeWidgetItem;
0046 
0047 class KConfig;
0048 class KUrlComboBox;
0049 
0050 class ImportFileWidget : public QWidget {
0051     Q_OBJECT
0052 
0053 public:
0054     static QString absolutePath(const QString& fileName);
0055 
0056     explicit ImportFileWidget(QWidget*, bool liveDataSource, const QString& fileName = QString());
0057     ~ImportFileWidget() override;
0058 
0059     void showOptions(bool);
0060     void saveSettings(LiveDataSource*) const;
0061     void loadSettings();
0062     AbstractFileFilter::FileType currentFileType() const;
0063     LiveDataSource::SourceType currentSourceType() const;
0064     AbstractFileFilter* currentFileFilter() const;
0065     QString fileName() const;
0066     QString dbcFileName() const;
0067     QString selectedObject() const;
0068     bool importValid() const;
0069     bool useFirstRowAsColNames() const; // use by XLSX and ODS
0070 
0071     const QStringList selectedXLSXRegionNames() const;
0072     const QStringList selectedOdsSheetNames() const;
0073     const QStringList selectedHDF5Names() const;
0074     const QStringList selectedNetCDFNames() const;
0075     const QStringList selectedFITSExtensions() const;
0076     const QStringList selectedROOTNames() const;
0077     const QStringList selectedMatioNames() const;
0078     //  const QStringList selectedVectorBLFNames() const;
0079 
0080     QString host() const;
0081     QString port() const;
0082     QString serialPort() const;
0083     int baudRate() const;
0084 
0085 public Q_SLOTS:
0086     void dataContainerChanged(AbstractAspect*);
0087 
0088 private:
0089     Ui::ImportFileWidget ui;
0090     void setMQTTVisible(bool);
0091     void updateContent(const QString&);
0092     void initOptionsWidget();
0093     void initSlots();
0094     QString fileInfoString(const QString&) const;
0095     void showJsonModel(bool);
0096     void enableFirstRowAsColNames(bool enable); // used by XLSX and Ods
0097     void updateHeaderOptions();
0098 
0099     std::unique_ptr<AsciiOptionsWidget> m_asciiOptionsWidget;
0100     std::unique_ptr<BinaryOptionsWidget> m_binaryOptionsWidget;
0101     std::unique_ptr<HDF5OptionsWidget> m_hdf5OptionsWidget;
0102     std::unique_ptr<ImageOptionsWidget> m_imageOptionsWidget;
0103     std::unique_ptr<OdsOptionsWidget> m_odsOptionsWidget;
0104     std::unique_ptr<XLSXOptionsWidget> m_xlsxOptionsWidget;
0105     std::unique_ptr<NetCDFOptionsWidget> m_netcdfOptionsWidget;
0106     std::unique_ptr<CANOptionsWidget> m_canOptionsWidget;
0107     std::unique_ptr<MatioOptionsWidget> m_matioOptionsWidget;
0108     std::unique_ptr<FITSOptionsWidget> m_fitsOptionsWidget;
0109     std::unique_ptr<JsonOptionsWidget> m_jsonOptionsWidget;
0110     std::unique_ptr<ROOTOptionsWidget> m_rootOptionsWidget;
0111 
0112     mutable std::unique_ptr<AbstractFileFilter> m_currentFilter;
0113 
0114     AbstractAspect* m_targetContainer{nullptr};
0115     QTableWidget* m_twPreview{nullptr};
0116     KUrlComboBox* m_cbFileName{nullptr};
0117     KUrlComboBox* m_cbDBCFileName{nullptr};
0118     const QString& m_fileName;
0119     const QString m_dbcFileName;
0120     bool m_importValid{false};
0121     bool m_liveDataSource;
0122     bool m_suppressRefresh{false};
0123     TemplateHandler* m_templateHandler{nullptr};
0124 
0125 Q_SIGNALS:
0126     void enableImportToMatrix(bool enable);
0127     void fileNameChanged();
0128     void sourceTypeChanged();
0129     void hostChanged();
0130     void portChanged();
0131     void error(const QString&);
0132 
0133 private Q_SLOTS:
0134     void fileNameChanged(const QString&);
0135     void fileTypeChanged(int = 0);
0136 
0137     void sourceTypeChanged(int);
0138     void updateTypeChanged(int);
0139     void readingTypeChanged(int);
0140     void firstRowAsColNamesChanged(bool checked);
0141 
0142     void hidePropertyWidgets();
0143     void filterChanged(int);
0144     void selectFile();
0145     void selectDBCFile();
0146     void showFileInfo();
0147     void refreshPreview();
0148     void updateStartRow(int);
0149     void enableDataPortionSelection(bool);
0150 
0151     // save/load template
0152     void loadConfigFromTemplate(KConfig&);
0153     void saveConfigAsTemplate(KConfig&);
0154 
0155     friend class HDF5OptionsWidget; // to access refreshPreview()
0156     friend class MatioOptionsWidget; // to access refreshPreview() and others
0157     friend class NetCDFOptionsWidget; // to access refreshPreview() and others
0158     friend class FITSOptionsWidget;
0159     friend class JsonOptionsWidget;
0160     friend class ROOTOptionsWidget; // to access refreshPreview() and others
0161     friend class OdsOptionsWidget; // to access refreshPreview()
0162     friend class XLSXOptionsWidget; // to access refreshPreview()
0163 
0164 #ifdef HAVE_MQTT
0165 private:
0166     QMqttClient* m_client{nullptr};
0167     QVector<QMqttSubscription*> m_mqttSubscriptions;
0168     QTimer* m_connectTimeoutTimer{nullptr};
0169     QMap<QMqttTopicName, QMqttMessage> m_lastMessage;
0170     QVector<QString> m_subscribedTopicNames;
0171     QVector<QString> m_addedTopics;
0172     QString m_configPath;
0173     bool m_initialisingMQTT{false};
0174     MQTTClient::MQTTWill m_willSettings;
0175     MQTTSubscriptionWidget* m_subscriptionWidget{nullptr};
0176 
0177     void disconnectMqttConnection();
0178 
0179 public:
0180     void saveMQTTSettings(MQTTClient*) const;
0181     bool isMqttValid();
0182 
0183 Q_SIGNALS:
0184     void newTopic(const QString&);
0185     void subscriptionsChanged();
0186     void checkFileType();
0187     void updateSubscriptionTree(const QVector<QString>&);
0188     void MQTTClearTopics();
0189 
0190 private Q_SLOTS:
0191     void mqttConnectionChanged();
0192     void onMqttConnect();
0193     void subscribeTopic(const QString&, uint);
0194     void unsubscribeTopic(const QString&, QVector<QTreeWidgetItem*>);
0195     void mqttMessageReceived(const QByteArray&, const QMqttTopicName&);
0196     void mqttSubscriptionMessageReceived(const QMqttMessage&);
0197     void onMqttDisconnect();
0198     void mqttErrorChanged(QMqttClient::ClientError);
0199     void mqttConnectTimeout();
0200     void showMQTTConnectionManager();
0201     void readMQTTConnections();
0202     void showWillSettings();
0203     void enableWill(bool);
0204 #endif
0205 };
0206 
0207 #endif