feat(gui): filter variables in the F1 window (name, optional value)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-15 23:36:57 +02:00
parent f62ea10d24
commit 7a732c0d04

View File

@@ -6,8 +6,8 @@ import subprocess
import sys import sys
from PySide6.QtWidgets import ( from PySide6.QtWidgets import (
QDialog, QDialogButtonBox, QHeaderView, QMenu, QMessageBox, QCheckBox, QDialog, QDialogButtonBox, QHBoxLayout, QHeaderView, QLineEdit,
QPushButton, QTextEdit, QVBoxLayout, QMenu, QMessageBox, QPushButton, QTextEdit, QVBoxLayout,
) )
from PySide6.QtGui import QSyntaxHighlighter, QTextCharFormat, QColor, QFont, QDesktopServices from PySide6.QtGui import QSyntaxHighlighter, QTextCharFormat, QColor, QFont, QDesktopServices
from PySide6.QtCore import Qt, QUrl, Slot from PySide6.QtCore import Qt, QUrl, Slot
@@ -119,6 +119,43 @@ class DialogF1(QDialog):
self.ui.addVarButton.setEnabled(False) self.ui.addVarButton.setEnabled(False)
self.ui.addVarButton.clicked.connect(self._on_add_var) self.ui.addVarButton.clicked.connect(self._on_add_var)
# Filter box above the table: hides rows whose name doesn't match.
# The optional "values" checkbox extends the match to the value column.
self._filter_text = ""
self._filter_edit = QLineEdit(self.ui.tabVariables)
self._filter_edit.setPlaceholderText("Filter variables by name")
self._filter_edit.setClearButtonEnabled(True)
self._filter_edit.textChanged.connect(self._on_filter_changed)
self._filter_values_cb = QCheckBox("values", self.ui.tabVariables)
self._filter_values_cb.setToolTip("Also match on the variable value")
self._filter_values_cb.toggled.connect(lambda _checked: self._apply_filter())
filter_row = QHBoxLayout()
filter_row.addWidget(self._filter_edit)
filter_row.addWidget(self._filter_values_cb)
self.ui.verticalLayout_tab1.insertLayout(0, filter_row)
def _on_filter_changed(self, text):
self._filter_text = text.strip().lower()
self._apply_filter()
def _apply_filter(self):
for row in range(self.ui.varsTable.rowCount()):
self._apply_filter_row(row)
def _apply_filter_row(self, row):
needle = self._filter_text
if not needle:
self.ui.varsTable.setRowHidden(row, False)
return
table = self.ui.varsTable
key_item = table.item(row, 0)
hay = key_item.text().lower() if key_item else ""
if self._filter_values_cb.isChecked():
val_item = table.item(row, 1)
if val_item is not None:
hay += "\n" + val_item.text().lower()
table.setRowHidden(row, needle not in hay)
def load_initial_vars(self, vars_dict: dict): def load_initial_vars(self, vars_dict: dict):
for key, value in vars_dict.items(): for key, value in vars_dict.items():
self.gd_var_updated(key, value) self.gd_var_updated(key, value)
@@ -149,6 +186,7 @@ class DialogF1(QDialog):
self._updating = False self._updating = False
self._key_rows[key] = row self._key_rows[key] = row
self._refresh_row(row, key, value) self._refresh_row(row, key, value)
self._apply_filter_row(self._key_rows[key])
@Slot(str) @Slot(str)
def gd_var_deleted(self, key): def gd_var_deleted(self, key):
@@ -161,6 +199,7 @@ class DialogF1(QDialog):
finally: finally:
self._updating = False self._updating = False
self._key_rows = {k: (r - 1 if r > row else r) for k, r in self._key_rows.items()} self._key_rows = {k: (r - 1 if r > row else r) for k, r in self._key_rows.items()}
self._apply_filter()
def _refresh_row(self, row, key, value): def _refresh_row(self, row, key, value):
from PySide6.QtWidgets import QTableWidgetItem from PySide6.QtWidgets import QTableWidgetItem