From 9f5406bd8c4cdf940d6dfac0248a76674e292068 Mon Sep 17 00:00:00 2001 From: Laurent Trinques Date: Sun, 11 Oct 2026 13:31:30 +0200 Subject: [PATCH] Terminal strip: add a label filter to the free terminals table --- .../TerminalStrip/ui/freeterminaleditor.cpp | 35 +++++++++++++++---- sources/TerminalStrip/ui/freeterminaleditor.h | 2 ++ .../TerminalStrip/ui/freeterminaleditor.ui | 34 +++++++++++------- 3 files changed, 52 insertions(+), 19 deletions(-) diff --git a/sources/TerminalStrip/ui/freeterminaleditor.cpp b/sources/TerminalStrip/ui/freeterminaleditor.cpp index dc7412141..5044b202e 100644 --- a/sources/TerminalStrip/ui/freeterminaleditor.cpp +++ b/sources/TerminalStrip/ui/freeterminaleditor.cpp @@ -25,6 +25,8 @@ #include "../terminalstrip.h" #include "../UndoCommand/addterminaltostripcommand.h" +#include + /** * @brief FreeTerminalEditor::FreeTerminalEditor * @param project @@ -39,8 +41,23 @@ FreeTerminalEditor::FreeTerminalEditor(QETProject *project, QWidget *parent) : ui->m_table_view->setItemDelegate(new FreeTerminalModelDelegate(ui->m_table_view)); m_model = new FreeTerminalModel(m_project, this); - ui->m_table_view->setModel(m_model); - ui->m_table_view->setCurrentIndex(m_model->index(0,0)); + + //The view works on a filtered proxy of the model. The filter is a plain, + //case insensitive "contains" on the label, so typing Z1 shows Z1:1, Z1:2... + //Not dynamic : an edited label must not vanish from the table while it is typed. + m_proxy_model = new QSortFilterProxyModel(this); + m_proxy_model->setSourceModel(m_model); + m_proxy_model->setFilterKeyColumn(FreeTerminalModel::Label); + m_proxy_model->setFilterCaseSensitivity(Qt::CaseInsensitive); + m_proxy_model->setDynamicSortFilter(false); + ui->m_table_view->setModel(m_proxy_model); + ui->m_table_view->setCurrentIndex(m_proxy_model->index(0,0)); + + connect(ui->m_filter_le, &QLineEdit::textChanged, this, [this](const QString &text) + { + m_proxy_model->setFilterFixedString(text); + selectionChanged(); + }); //Selected rows can be dragged onto a strip of the terminal strip tree ui->m_table_view->setDragEnabled(true); ui->m_table_view->setDragDropMode(QAbstractItemView::DragOnly); @@ -55,8 +72,9 @@ FreeTerminalEditor::FreeTerminalEditor(QETProject *project, QWidget *parent) : connect(ui->m_table_view->selectionModel(), &QItemSelectionModel::selectionChanged, this, &FreeTerminalEditor::selectionChanged); - connect(ui->m_table_view, &QAbstractItemView::doubleClicked, this, [this](const QModelIndex &index) + connect(ui->m_table_view, &QAbstractItemView::doubleClicked, this, [this](const QModelIndex &proxy_index) { + const auto index = m_proxy_model->mapToSource(proxy_index); if (m_model->columnTypeForIndex(index) == FreeTerminalModel::XRef) { auto mrtd = m_model->dataAtRow(index.row()); @@ -176,7 +194,7 @@ void FreeTerminalEditor::on_m_type_cb_activated(int index) for (auto model_index : index_list) { - auto type_index = m_model->index(model_index.row(), FreeTerminalModel::Type, model_index.parent()); + auto type_index = m_model->index(m_proxy_model->mapToSource(model_index).row(), FreeTerminalModel::Type); if (type_index.isValid()) { ElementData::TerminalType override_type; @@ -219,7 +237,7 @@ void FreeTerminalEditor::on_m_function_cb_activated(int index) for (auto model_index : index_list) { - auto function_index = m_model->index(model_index.row(), FreeTerminalModel::Function, model_index.parent()); + auto function_index = m_model->index(m_proxy_model->mapToSource(model_index).row(), FreeTerminalModel::Function); if (function_index.isValid()) { ElementData::TerminalFunction override_function; @@ -248,7 +266,7 @@ void FreeTerminalEditor::on_m_led_cb_activated(int index) for (auto model_index : index_list) { - auto led_index = m_model->index(model_index.row(), FreeTerminalModel::Led, model_index.parent()); + auto led_index = m_model->index(m_proxy_model->mapToSource(model_index).row(), FreeTerminalModel::Led); if (led_index.isValid()) { m_model->setData(led_index, @@ -262,7 +280,10 @@ void FreeTerminalEditor::on_m_led_cb_activated(int index) void FreeTerminalEditor::on_m_move_pb_clicked() { //Get the selected real terminal - const auto index_list = ui->m_table_view->selectionModel()->selectedIndexes(); + QModelIndexList index_list; + for (const auto &proxy_index : ui->m_table_view->selectionModel()->selectedIndexes()) { + index_list.append(m_proxy_model->mapToSource(proxy_index)); + } const auto real_t_vector = m_model->realTerminalForIndex(index_list); if (real_t_vector.isEmpty()) { return; diff --git a/sources/TerminalStrip/ui/freeterminaleditor.h b/sources/TerminalStrip/ui/freeterminaleditor.h index 2320a60ba..99c08d54e 100644 --- a/sources/TerminalStrip/ui/freeterminaleditor.h +++ b/sources/TerminalStrip/ui/freeterminaleditor.h @@ -24,6 +24,7 @@ class RealTerminal; class FreeTerminalModel; class QTableView; +class QSortFilterProxyModel; namespace Ui { class FreeTerminalEditor; @@ -57,5 +58,6 @@ class FreeTerminalEditor : public QWidget Ui::FreeTerminalEditor *ui; QPointer m_project; FreeTerminalModel *m_model {nullptr}; + QSortFilterProxyModel *m_proxy_model {nullptr}; }; #endif // FREETERMINALEDITOR_H diff --git a/sources/TerminalStrip/ui/freeterminaleditor.ui b/sources/TerminalStrip/ui/freeterminaleditor.ui index 2832bf1b5..f4292464a 100644 --- a/sources/TerminalStrip/ui/freeterminaleditor.ui +++ b/sources/TerminalStrip/ui/freeterminaleditor.ui @@ -14,14 +14,24 @@ Form - + + + + Filter by label (e.g. Z1) + + + true + + + + Move to : - + @@ -34,7 +44,7 @@ - + Qt::Vertical @@ -47,35 +57,35 @@ - + true - + Type : - + Function : - + LED : - + Apply displacement @@ -88,14 +98,14 @@ - + Qt::Horizontal - + @@ -149,7 +159,7 @@ - + @@ -168,7 +178,7 @@ - +