Skip to content

Commit 4ff959a

Browse files
authored
Merge pull request #1 from guilyx/feat/republisher-topics-filter-tb
Add Filter and Improve Topic Selection in ROS2 Republisher Dialog
2 parents 16081ce + efe708e commit 4ff959a

5 files changed

Lines changed: 304 additions & 197 deletions

File tree

src/CMakeLists.txt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,12 @@ QT5_WRAP_UI ( COMMON_UI_SRC
99
publisher_select_dialog.ui )
1010

1111

12-
add_library( commonROS STATIC
12+
add_library( commonROS STATIC
1313
dialog_select_ros_topics.h
1414
dialog_select_ros_topics.cpp
1515
dialog_with_itemlist.h
1616
publisher_select_dialog.h
17+
publisher_select_dialog.cpp
1718
parser_configuration.cpp
1819
parser_configuration.h
1920
ros_parsers/ros2_parser.cpp
@@ -60,6 +61,6 @@ install(TARGETS
6061
DataLoadROS2
6162
DataStreamROS2
6263
TopicPublisherROS2
63-
DESTINATION lib/${PROJECT_NAME}
64+
DESTINATION lib/${PROJECT_NAME}
6465
)
6566

src/TopicPublisherROS2/publisher_ros2.cpp

Lines changed: 39 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,11 @@
22

33
#include <QDebug>
44
#include <QDialog>
5-
#include <QFormLayout>
6-
#include <QCheckBox>
7-
#include <QLabel>
8-
#include <QHBoxLayout>
9-
#include <QVBoxLayout>
10-
#include <QDialogButtonBox>
11-
#include <QScrollArea>
5+
#include <QTableWidget>
6+
#include <QTableWidgetItem>
7+
#include <QAbstractItemView>
128
#include <QPushButton>
13-
#include <QSettings>
14-
#include <QRadioButton>
15-
#include <unordered_map>
169
#include <algorithm>
17-
#include <QMessageBox>
1810
#include <tf2_ros/qos.hpp>
1911
#include <rosbag2_cpp/types.hpp>
2012
#include <rmw/rmw.h>
@@ -156,38 +148,55 @@ void TopicPublisherROS2::filterDialog()
156148
return a.topic_name < b.topic_name;
157149
});
158150

159-
std::map<std::string, QCheckBox *> checkbox;
151+
dialog->ui()->listTopics->setRowCount(sorted_topics.size());
160152

161-
for (const TopicInfo &info : sorted_topics)
153+
for (size_t i = 0; i < sorted_topics.size(); i++)
162154
{
163-
const std::string topic_name = info.topic_name;
164-
auto cb = new QCheckBox(dialog);
155+
const std::string topic_name = sorted_topics[i].topic_name;
156+
auto item = new QTableWidgetItem(QString::fromStdString(topic_name));
157+
item->setFlags(item->flags() & ~Qt::ItemIsEditable);
158+
dialog->ui()->listTopics->setItem(i, 0, item);
159+
165160
auto filter_it = _topics_to_publish.find(topic_name);
166-
if (filter_it == _topics_to_publish.end())
167-
{
168-
cb->setChecked(true);
169-
}
170-
else
161+
if (filter_it == _topics_to_publish.end() || filter_it->second)
171162
{
172-
cb->setChecked(filter_it->second);
163+
dialog->ui()->listTopics->selectRow(i);
173164
}
174-
cb->setFocusPolicy(Qt::NoFocus);
175-
dialog->ui()->formLayout->addRow(new QLabel(QString::fromStdString(topic_name)), cb);
176-
checkbox.insert(std::make_pair(topic_name, cb));
177-
connect(dialog->ui()->pushButtonSelect, &QPushButton::pressed, [cb]()
178-
{ cb->setChecked(true); });
179-
connect(dialog->ui()->pushButtonDeselect, &QPushButton::pressed, [cb]()
180-
{ cb->setChecked(false); });
181165
}
182166

167+
dialog->ui()->listTopics->sortByColumn(0, Qt::AscendingOrder);
168+
169+
connect(dialog->ui()->pushButtonSelect, &QPushButton::pressed, [dialog]()
170+
{
171+
for (int row = 0; row < dialog->ui()->listTopics->rowCount(); row++)
172+
{
173+
if (!dialog->ui()->listTopics->isRowHidden(row))
174+
{
175+
dialog->ui()->listTopics->selectRow(row);
176+
}
177+
} });
178+
connect(dialog->ui()->pushButtonDeselect, &QPushButton::pressed, dialog->ui()->listTopics,
179+
&QAbstractItemView::clearSelection);
180+
183181
dialog->exec();
184182

185183
if (dialog->result() == QDialog::Accepted)
186184
{
187185
_topics_to_publish.clear();
188-
for (const auto &it : checkbox)
186+
QModelIndexList selected_indexes = dialog->ui()->listTopics->selectionModel()->selectedIndexes();
187+
188+
for (const auto &info : sorted_topics)
189+
{
190+
_topics_to_publish.insert({info.topic_name, false});
191+
}
192+
193+
for (const QModelIndex &index : selected_indexes)
189194
{
190-
_topics_to_publish.insert({it.first, it.second->isChecked()});
195+
if (index.column() == 0)
196+
{
197+
std::string topic_name = index.data(Qt::DisplayRole).toString().toStdString();
198+
_topics_to_publish[topic_name] = true;
199+
}
191200
}
192201

193202
updatePublishers();

src/publisher_select_dialog.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#include "publisher_select_dialog.h"
2+
#include <QStringList>
3+
#include <QTableWidgetItem>
4+
#include <QAbstractItemView>
5+
6+
void PublisherSelectDialog::on_lineEditFilter_textChanged(const QString &search_string)
7+
{
8+
QStringList spaced_items = search_string.split(' ');
9+
10+
for (int row = 0; row < _ui->listTopics->rowCount(); row++)
11+
{
12+
auto item = _ui->listTopics->item(row, 0);
13+
QString name = item->text();
14+
bool toHide = false;
15+
16+
for (const auto &item : spaced_items)
17+
{
18+
if (!name.contains(item, Qt::CaseInsensitive))
19+
{
20+
toHide = true;
21+
break;
22+
}
23+
}
24+
_ui->listTopics->setRowHidden(row, toHide);
25+
}
26+
}
27+
28+
void PublisherSelectDialog::on_listTopics_itemSelectionChanged()
29+
{
30+
QModelIndexList indexes = _ui->listTopics->selectionModel()->selectedIndexes();
31+
_ui->buttonBox->setEnabled(indexes.size() > 0);
32+
}

src/publisher_select_dialog.h

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,39 @@
11
#pragma once
22
#include <QDialog>
3-
#include <QLabel>
4-
#include <QListWidget>
5-
#include <QAbstractButton>
6-
#include <unordered_set>
3+
#include <QStringList>
74

85
#include "ui_publisher_select_dialog.h"
96

107
namespace Ui
118
{
12-
class Ui_PublisherSelect;
9+
class Ui_PublisherSelect;
1310
}
1411

1512
class PublisherSelectDialog : public QDialog
1613
{
1714
Q_OBJECT
1815
private:
19-
Ui::PublisherSelect* _ui;
16+
Ui::PublisherSelect *_ui;
2017

2118
public:
22-
explicit PublisherSelectDialog(QWidget* parent = nullptr)
23-
: QDialog(parent), _ui(new Ui::PublisherSelect)
19+
explicit PublisherSelectDialog(QWidget *parent = nullptr)
20+
: QDialog(parent), _ui(new Ui::PublisherSelect)
2421
{
2522
_ui->setupUi(this);
23+
_ui->listTopics->verticalHeader()->setVisible(false);
24+
QStringList labels;
25+
labels.push_back("Topic name");
26+
_ui->listTopics->setHorizontalHeaderLabels(labels);
2627
}
2728

28-
Ui::PublisherSelect* ui() { return _ui; }
29+
Ui::PublisherSelect *ui() { return _ui; }
2930

3031
~PublisherSelectDialog()
3132
{
3233
delete _ui;
3334
}
34-
};
3535

36+
private slots:
37+
void on_lineEditFilter_textChanged(const QString &search_string);
38+
void on_listTopics_itemSelectionChanged();
39+
};

0 commit comments

Comments
 (0)