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