Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ add_library( commonROS STATIC
dialog_select_ros_topics.cpp
dialog_with_itemlist.h
publisher_select_dialog.h
publisher_select_dialog.cpp
parser_configuration.cpp
parser_configuration.h
ros_parsers/ros2_parser.cpp
Expand Down
66 changes: 40 additions & 26 deletions src/TopicPublisherROS2/publisher_ros2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,11 @@

#include <QDebug>
#include <QDialog>
#include <QFormLayout>
#include <QCheckBox>
#include <QLabel>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QDialogButtonBox>
#include <QScrollArea>
#include <QTableWidget>
#include <QTableWidgetItem>
#include <QAbstractItemView>
#include <QPushButton>
#include <QSettings>
#include <QRadioButton>
#include <unordered_map>
#include <QMessageBox>
#include <algorithm>
#include <tf2_ros/qos.hpp>
#include <rosbag2_cpp/types.hpp>
#include <rmw/rmw.h>
Expand Down Expand Up @@ -153,34 +146,55 @@ void TopicPublisherROS2::filterDialog()

std::map<std::string, QCheckBox*> checkbox;

for (const TopicInfo& info : _topics_info)
dialog->ui()->listTopics->setRowCount(sorted_topics.size());

for (size_t i = 0; i < sorted_topics.size(); i++)
{
const std::string topic_name = info.topic_name;
auto cb = new QCheckBox(dialog);
const std::string topic_name = sorted_topics[i].topic_name;
auto item = new QTableWidgetItem(QString::fromStdString(topic_name));
item->setFlags(item->flags() & ~Qt::ItemIsEditable);
dialog->ui()->listTopics->setItem(i, 0, item);

auto filter_it = _topics_to_publish.find(topic_name);
if (filter_it == _topics_to_publish.end())
if (filter_it == _topics_to_publish.end() || filter_it->second)
{
cb->setChecked(true);
dialog->ui()->listTopics->selectRow(i);
}
else
}

dialog->ui()->listTopics->sortByColumn(0, Qt::AscendingOrder);

connect(dialog->ui()->pushButtonSelect, &QPushButton::pressed, [dialog]() {
for (int row = 0; row < dialog->ui()->listTopics->rowCount(); row++)
{
cb->setChecked(filter_it->second);
if (!dialog->ui()->listTopics->isRowHidden(row))
{
dialog->ui()->listTopics->selectRow(row);
}
}
cb->setFocusPolicy(Qt::NoFocus);
dialog->ui()->formLayout->addRow(new QLabel(QString::fromStdString(topic_name)), cb);
checkbox.insert(std::make_pair(topic_name, cb));
connect(dialog->ui()->pushButtonSelect, &QPushButton::pressed, [cb]() { cb->setChecked(true); });
connect(dialog->ui()->pushButtonDeselect, &QPushButton::pressed, [cb]() { cb->setChecked(false); });
}
});
connect(dialog->ui()->pushButtonDeselect, &QPushButton::pressed, dialog->ui()->listTopics,
&QAbstractItemView::clearSelection);

dialog->exec();

if (dialog->result() == QDialog::Accepted)
{
_topics_to_publish.clear();
for (const auto& it : checkbox)
QModelIndexList selected_indexes = dialog->ui()->listTopics->selectionModel()->selectedIndexes();

for (const auto& info : sorted_topics)
{
_topics_to_publish.insert({ it.first, it.second->isChecked() });
_topics_to_publish.insert({ info.topic_name, false });
}

for (const QModelIndex& index : selected_indexes)
{
if (index.column() == 0)
{
std::string topic_name = index.data(Qt::DisplayRole).toString().toStdString();
_topics_to_publish[topic_name] = true;
}
}

updatePublishers();
Expand Down
32 changes: 32 additions & 0 deletions src/publisher_select_dialog.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#include "publisher_select_dialog.h"
#include <QStringList>
#include <QTableWidgetItem>
#include <QAbstractItemView>

void PublisherSelectDialog::on_lineEditFilter_textChanged(const QString& search_string)
{
QStringList spaced_items = search_string.split(' ');

for (int row = 0; row < _ui->listTopics->rowCount(); row++)
{
auto item = _ui->listTopics->item(row, 0);
QString name = item->text();
bool toHide = false;

for (const auto& item : spaced_items)
{
if (!name.contains(item, Qt::CaseInsensitive))
{
toHide = true;
break;
}
}
_ui->listTopics->setRowHidden(row, toHide);
}
}

void PublisherSelectDialog::on_listTopics_itemSelectionChanged()
{
QModelIndexList indexes = _ui->listTopics->selectionModel()->selectedIndexes();
_ui->buttonBox->setEnabled(indexes.size() > 0);
}
9 changes: 5 additions & 4 deletions src/publisher_select_dialog.h
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
#pragma once
#include <QDialog>
#include <QLabel>
#include <QListWidget>
#include <QAbstractButton>
#include <unordered_set>
#include <QStringList>

#include "ui_publisher_select_dialog.h"

Expand All @@ -22,6 +19,10 @@ class PublisherSelectDialog : public QDialog
explicit PublisherSelectDialog(QWidget* parent = nullptr) : QDialog(parent), _ui(new Ui::PublisherSelect)
{
_ui->setupUi(this);
_ui->listTopics->verticalHeader()->setVisible(false);
QStringList labels;
labels.push_back("Topic name");
_ui->listTopics->setHorizontalHeaderLabels(labels);
}

Ui::PublisherSelect* ui()
Expand Down
Loading