From ece1890ba075f3f6225ad5cf059c6094818640c9 Mon Sep 17 00:00:00 2001
From: Alberto Nidasio <alberto.nidasio@skywarder.eu>
Date: Tue, 4 Oct 2022 16:01:42 +0200
Subject: [PATCH] [Filter] Fixed Graph and IncomingMessageViewer

---
 .vscode/settings.json                         |  3 +-
 sbs                                           |  2 +-
 .../FilterSelector/FilterSelector.cpp         | 72 +++++++++++--------
 .../FilterSelector/FilterSelector.h           |  4 ++
 .../SubscriptionsPanel/SubscriptionsPanel.cpp |  2 +-
 src/shared/Core/Message/Filter.cpp            | 34 ++++++++-
 src/shared/Core/Message/Filter.h              |  1 +
 src/shared/Modules/Graph/Graph.cpp            | 12 ++--
 8 files changed, 89 insertions(+), 41 deletions(-)

diff --git a/.vscode/settings.json b/.vscode/settings.json
index fcde4c61..42af6674 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -145,7 +145,8 @@
         "scoped_allocator": "cpp",
         "shared_mutex": "cpp",
         "span": "cpp",
-        "qlistwidget": "cpp"
+        "qlistwidget": "cpp",
+        "qcompleter": "cpp"
     },
     "editor.defaultFormatter": "ms-vscode.cpptools",
     "[xml]": {
diff --git a/sbs b/sbs
index 9dd12b16..b19ef395 100755
--- a/sbs
+++ b/sbs
@@ -322,7 +322,7 @@ EOF
 }
 
 CMAKE_FILENAME="CMakeCache.txt"
-CMAKE_PREFIX_PATH="~/Qt/5.15.2/gcc_64/lib/cmake/"
+CMAKE_PREFIX_PATH="~/Qt/5.15.2/clang_64/lib/cmake/"
 DEBUG_FILENAME=".sbsdebug"
 VERBOSE_FILENAME=".sbsverbose"
 BUILD_DIRNAME="build"
diff --git a/src/shared/Components/FilterSelector/FilterSelector.cpp b/src/shared/Components/FilterSelector/FilterSelector.cpp
index 969ce367..47fdea56 100644
--- a/src/shared/Components/FilterSelector/FilterSelector.cpp
+++ b/src/shared/Components/FilterSelector/FilterSelector.cpp
@@ -2,7 +2,6 @@
 
 #include <Modules/Mavlink/MavlinkVersionHeader.h>
 
-#include <QDebug>
 #include <QLabel>
 #include <QPushButton>
 
@@ -13,7 +12,7 @@ void FilterSelector::setupUi()
 
     QVBoxLayout *layout = new QVBoxLayout;
 
-    QComboBox *topic = new QComboBox;
+    topic = new QComboBox;
     topic->setSizeAdjustPolicy(QComboBox::AdjustToContents);
     topic->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
     topic->addItems(messages.keys());
@@ -31,47 +30,26 @@ void FilterSelector::setupUi()
 
     // Set default message
     if (filter.getTopic().toString() != Topic().toString())
-    {
         currentMessage = filter.getTopic().toString();
-        topic->setCurrentText(filter.getTopic().toString());
-    }
     else
-    {
         currentMessage = messages.keys().at(0);
-        topic->setCurrentText(messages.keys().at(0));
-    }
+    topic->setCurrentText(currentMessage);
+    setTopic(currentMessage);
 
     connect(topic, &QComboBox::currentTextChanged, this,
             [=](QString key)
             {
                 if (messages.contains(key))
                 {
-                    fieldsWidget->clear();
-
-                    fieldsWidget->addItems(messages[key]);
-                    for (int i = 0; i < fieldsWidget->count(); i++)
-                    {
-                        auto item = fieldsWidget->item(i);
-                        item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
-                        item->setCheckState(Qt::Unchecked);
-                    }
-
-                    currentMessage = key;
+                    filter = getFilter();
+                    setTopic(key);
                 }
             });
     connect(cancel, &QPushButton::clicked, [this]() { deleteLater(); });
     connect(select, &QPushButton::clicked,
-            [=]()
+            [this]()
             {
-                Filter filter(Topic(topic->currentText()));
-
-                for (int i = 0; i < fieldsWidget->count(); i++)
-                {
-                    auto item = fieldsWidget->item(i);
-                    if (item->checkState())
-                        filter.addField(item->text());
-                }
-
+                filter = getFilter();
                 emit filterSelected(filter);
                 deleteLater();
             });
@@ -124,3 +102,39 @@ void FilterSelector::parseMessagesList()
         }
     }
 }
+
+void FilterSelector::setTopic(QString topic)
+{
+    // Clear the fields
+    fieldsWidget->clear();
+
+    // Add the new topic fields
+    fieldsWidget->addItems(messages[topic]);
+    for (int i = 0; i < fieldsWidget->count(); i++)
+    {
+        auto item = fieldsWidget->item(i);
+        item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
+
+        // Check the item if it was checked before
+        if (filter.getFields().contains(item->text()))
+            item->setCheckState(Qt::Checked);
+        else
+            item->setCheckState(Qt::Unchecked);
+    }
+
+    currentMessage = topic;
+}
+
+Filter FilterSelector::getFilter()
+{
+    auto filter = Filter(Topic(topic->currentText()));
+
+    for (int i = 0; i < fieldsWidget->count(); i++)
+    {
+        auto item = fieldsWidget->item(i);
+        if (item->checkState())
+            filter.addField(item->text());
+    }
+
+    return filter;
+}
\ No newline at end of file
diff --git a/src/shared/Components/FilterSelector/FilterSelector.h b/src/shared/Components/FilterSelector/FilterSelector.h
index 3b5ea4d1..422a4954 100644
--- a/src/shared/Components/FilterSelector/FilterSelector.h
+++ b/src/shared/Components/FilterSelector/FilterSelector.h
@@ -18,6 +18,7 @@ public:
 
     static void selectFilter(Handler handler);
     static void selectFilter(const Filter& filter, Handler handler);
+    Filter getFilter();
 
 private:
     FilterSelector();
@@ -26,10 +27,13 @@ private:
     void parseMessagesList();
     void setupUi();
 
+    void setTopic(QString topic);
+
     Filter filter;
 
     QString currentMessage;
     QListWidget* fieldsWidget;
+    QComboBox* topic;
 
     QMap<QString, QList<QString>> messages;
 
diff --git a/src/shared/Components/SubscriptionsPanel/SubscriptionsPanel.cpp b/src/shared/Components/SubscriptionsPanel/SubscriptionsPanel.cpp
index 9d1b463e..a14f5080 100644
--- a/src/shared/Components/SubscriptionsPanel/SubscriptionsPanel.cpp
+++ b/src/shared/Components/SubscriptionsPanel/SubscriptionsPanel.cpp
@@ -32,7 +32,7 @@ SubscriptionsPanel::SubscriptionsPanel(const QList<Filter>& filters)
 
 void SubscriptionsPanel::addFilter(const Filter& filter)
 {
-    filtersList->addItem(new QListWidgetItem(filter.toString()));
+    filtersList->addItem(new QListWidgetItem(filter.toPrettyString()));
     emit filterAdded(filter);
 }
 
diff --git a/src/shared/Core/Message/Filter.cpp b/src/shared/Core/Message/Filter.cpp
index 4bda5550..7f96bd0c 100644
--- a/src/shared/Core/Message/Filter.cpp
+++ b/src/shared/Core/Message/Filter.cpp
@@ -73,6 +73,38 @@ QString Filter::toString() const
     return string;
 }
 
+QString Filter::toPrettyString() const
+{
+    QString string;
+
+    string += topic.toString();
+    string += ":";
+
+    if (!fields.isEmpty())
+    {
+        auto list = fields.values();
+
+        if (fields.size() > 1)
+        {
+            string += "\n";
+
+            for (int i = 0; i < list.size() - 1; i++)
+                string += "    " + list[i] + ",\n";
+            string += "    " + list.last();
+        }
+        else
+        {
+            string += " " + list.last();
+        }
+    }
+    else
+    {
+        string += "*";
+    }
+
+    return string;
+}
+
 Filter Filter::fromString(QString string)
 {
     int idxCol = string.indexOf(':');
@@ -84,7 +116,7 @@ Filter Filter::fromString(QString string)
         auto right = string.right(string.size() - 1 - idxCol);
 
         for (auto field : right.split(','))
-            filter.addField(field);
+            filter.addField(field.trimmed());
     }
 
     return filter;
diff --git a/src/shared/Core/Message/Filter.h b/src/shared/Core/Message/Filter.h
index d3f5d0c5..2d4ab7cc 100644
--- a/src/shared/Core/Message/Filter.h
+++ b/src/shared/Core/Message/Filter.h
@@ -47,6 +47,7 @@ public:
     bool filterMessage(Message& message) const;
 
     QString toString() const;
+    QString toPrettyString() const;
     static Filter fromString(QString string);
 
 private:
diff --git a/src/shared/Modules/Graph/Graph.cpp b/src/shared/Modules/Graph/Graph.cpp
index e49e6598..3af91601 100644
--- a/src/shared/Modules/Graph/Graph.cpp
+++ b/src/shared/Modules/Graph/Graph.cpp
@@ -4,7 +4,6 @@
 #include <Components/SubscriptionsPanel/SubscriptionsPanel.h>
 #include <Core/MessageBroker/MessageBroker.h>
 
-#include <QDebug>
 #include <QTimer>
 #include <algorithm>
 
@@ -108,18 +107,16 @@ void Graph::onFollowClicked(bool checked) { following = checked; }
 
 void Graph::onFilterAdded(const Filter& filter)
 {
-    qDebug() << "[Graph] On filter added";
-
     // Fail if the filter is already in the list
     if (lines.keys().contains(filter))
-    {
-        qDebug() << "[Graph] Filter already in the list";
         return;
-    }
 
     // Add a new line for each field of the filter
     for (auto field : filter.getFields())
     {
+        if (field == "timestamp")
+            continue;
+
         // Create the graph
         QCPGraph* graph = plot->addGraph();
         graph->setPen(
@@ -132,13 +129,12 @@ void Graph::onFilterAdded(const Filter& filter)
         lines[filter].first[field] = {graph, QVector<double>(),
                                       QVector<double>()};
     }
+    plot->replot();
 
     getCore()->getMessageBroker()->subscribe(
         filter, this,
         [&](const Message& message, const Filter& filter)
         {
-            qDebug() << "[Graph] Received new message:" << message.toString();
-
             if (stopped && !lines.contains(filter))
                 return;
 
-- 
GitLab