File indexing completed on 2025-09-14 03:42:59

0001 /*
0002     File                 : MQTTSubscriptionWidget.h
0003     Project              : LabPlot
0004     Description          : manage topics and subscribing
0005     --------------------------------------------------------------------
0006     SPDX-FileCopyrightText: 2019 Kovacs Ferencz <kferike98@gmail.com>
0007     SPDX-License-Identifier: GPL-2.0-or-later
0008 */
0009 
0010 #ifndef MQTTSUBSCRIPTIONWIDGET_H
0011 #define MQTTSUBSCRIPTIONWIDGET_H
0012 
0013 #include "ui_mqttsubscriptionwidget.h"
0014 class QMqttSubscription;
0015 
0016 class MQTTSubscriptionWidget : public QWidget {
0017     Q_OBJECT
0018 
0019 public:
0020     explicit MQTTSubscriptionWidget(QWidget* parent = nullptr);
0021     ~MQTTSubscriptionWidget() override;
0022     enum class MQTTParentWidget { ImportFileWidget, LiveDataDock };
0023 
0024     void setTopicList(const QStringList& topicList);
0025     QStringList getTopicList();
0026 
0027     int subscriptionCount();
0028     QTreeWidgetItem* topLevelTopic(int);
0029     QTreeWidgetItem* topLevelSubscription(int);
0030     QTreeWidgetItem* currentItem() const;
0031     void addTopic(QTreeWidgetItem*);
0032     int topicCount();
0033     void setTopicTreeText(const QString&);
0034     void makeVisible(bool);
0035     void testSubscribe(QTreeWidgetItem*);
0036     void testUnsubscribe(QTreeWidgetItem*);
0037 
0038     static bool checkTopicContains(const QString&, const QString&);
0039     static void findSubscriptionLeafChildren(QVector<QTreeWidgetItem*>&, QTreeWidgetItem*);
0040 
0041 Q_SIGNALS:
0042     void subscriptionChanged();
0043     void makeSubscription(const QString& name, quint8 QoS);
0044     void MQTTUnsubscribeFromTopic(const QString&, QVector<QTreeWidgetItem*> children);
0045     void removeMQTTSubscription(const QString&);
0046     void addBeforeRemoveSubscription(const QString&, quint8);
0047     void reparentTopic(const QString& topic, const QString& parent);
0048     void enableWill(bool);
0049 
0050 private:
0051     Ui::MQTTSubscriptionWidget ui;
0052     MQTTParentWidget m_parent;
0053     QCompleter* m_subscriptionCompleter{nullptr};
0054     QCompleter* m_topicCompleter{nullptr};
0055     QStringList m_topicList;
0056     bool m_searching{false};
0057     QTimer* m_searchTimer;
0058 
0059     void unsubscribeFromTopic(const QString&);
0060     void manageCommonLevelSubscriptions();
0061     void updateSubscriptionCompleter();
0062 
0063     static void addSubscriptionChildren(QTreeWidgetItem*, QTreeWidgetItem*);
0064     static void restoreSubscriptionChildren(QTreeWidgetItem* topic, QTreeWidgetItem* subscription, const QStringList& list, int level);
0065     static int checkCommonChildCount(int levelIdx, int level, QStringList& namelist, QTreeWidgetItem* currentItem);
0066     static int commonLevelIndex(const QString& first, const QString& second);
0067     static QString checkCommonLevel(const QString&, const QString&);
0068 
0069 private Q_SLOTS:
0070     void mqttAvailableTopicDoubleClicked(QTreeWidgetItem* item, int column);
0071     void mqttSubscribedTopicDoubleClicked(QTreeWidgetItem* item, int column);
0072     void mqttSubscribe();
0073     void mqttUnsubscribe();
0074     void setTopicCompleter(const QString&);
0075     void scrollToTopicTreeItem(const QString& rootName);
0076     void scrollToSubsriptionTreeItem(const QString& rootName);
0077     void topicTimeout();
0078     void updateSubscriptionTree(const QVector<QString>&);
0079     void clearWidgets();
0080     void onDisconnect();
0081 };
0082 
0083 #endif // MQTTSUBSCRIPTIONWIDGET_H