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