Skip to content

Commit 13590cf

Browse files
author
Lukas Geiger
committed
fix: add search bar accessibility context
1 parent a7cf2c2 commit 13590cf

2 files changed

Lines changed: 93 additions & 13 deletions

File tree

PythonBox_v8.py

Lines changed: 56 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2274,36 +2274,64 @@ def __init__(self, parent=None):
22742274
# Suchen-Zeile
22752275
search_row = QHBoxLayout()
22762276
search_row.addWidget(QLabel("🔍"))
2277-
2277+
22782278
self.search_input = QLineEdit()
22792279
self.search_input.setPlaceholderText("Suchen... (Ctrl+F)")
2280+
self.search_input.setAccessibleName("Suchbegriff")
2281+
self.search_input.setAccessibleDescription(
2282+
"Gibt den Suchbegriff für den aktuellen Editor ein. Eingabetaste springt zum nächsten Treffer."
2283+
)
2284+
self.search_input.setToolTip("Suchbegriff eingeben und mit Eingabetaste zum nächsten Treffer springen")
22802285
self.search_input.textChanged.connect(self.on_search_changed)
22812286
self.search_input.returnPressed.connect(self.find_next)
22822287
search_row.addWidget(self.search_input, 1)
2283-
2288+
22842289
self.match_label = QLabel("0/0")
22852290
self.match_label.setMinimumWidth(60)
2291+
self.match_label.setAccessibleName("Trefferzähler")
2292+
self.match_label.setAccessibleDescription(
2293+
"Zeigt die aktuelle Trefferposition und die Gesamtzahl der Suchtreffer an."
2294+
)
22862295
search_row.addWidget(self.match_label)
2287-
2296+
22882297
self.btn_prev = QPushButton("◀")
22892298
self.btn_prev.setFixedWidth(30)
2299+
self.btn_prev.setToolTip("Vorherigen Treffer auswählen (Shift+Enter)")
2300+
self.btn_prev.setAccessibleName("Vorheriger Treffer")
2301+
self.btn_prev.setAccessibleDescription(
2302+
"Springt zum vorherigen Suchtreffer im aktuellen Editor. Tastaturpfad Shift+Enter."
2303+
)
22902304
self.btn_prev.clicked.connect(self.find_prev)
22912305
search_row.addWidget(self.btn_prev)
2292-
2306+
22932307
self.btn_next = QPushButton("▶")
22942308
self.btn_next.setFixedWidth(30)
2309+
self.btn_next.setToolTip("Nächsten Treffer auswählen (Enter)")
2310+
self.btn_next.setAccessibleName("Nächster Treffer")
2311+
self.btn_next.setAccessibleDescription(
2312+
"Springt zum nächsten Suchtreffer im aktuellen Editor. Tastaturpfad Enter."
2313+
)
22952314
self.btn_next.clicked.connect(self.find_next)
22962315
search_row.addWidget(self.btn_next)
2297-
2316+
22982317
self.case_check = QCheckBox("Aa")
22992318
self.case_check.setToolTip("Groß-/Kleinschreibung beachten")
2319+
self.case_check.setAccessibleName("Groß- und Kleinschreibung beachten")
2320+
self.case_check.setAccessibleDescription(
2321+
"Aktiviert oder deaktiviert die Suche mit Beachtung von Groß- und Kleinschreibung."
2322+
)
23002323
self.case_check.stateChanged.connect(self.on_search_changed)
23012324
search_row.addWidget(self.case_check)
2302-
2303-
btn_close = QPushButton("✕")
2304-
btn_close.setFixedWidth(30)
2305-
btn_close.clicked.connect(self.hide)
2306-
search_row.addWidget(btn_close)
2325+
2326+
self.btn_close = QPushButton("✕")
2327+
self.btn_close.setFixedWidth(30)
2328+
self.btn_close.setToolTip("Suchleiste schließen (Esc)")
2329+
self.btn_close.setAccessibleName("Suchleiste schließen")
2330+
self.btn_close.setAccessibleDescription(
2331+
"Blendet die Suchleiste aus. Tastaturpfad Escape."
2332+
)
2333+
self.btn_close.clicked.connect(self.hide)
2334+
search_row.addWidget(self.btn_close)
23072335

23082336
layout.addLayout(search_row)
23092337

@@ -2313,16 +2341,31 @@ def __init__(self, parent=None):
23132341
replace_layout.setContentsMargins(0, 0, 0, 0)
23142342

23152343
replace_layout.addWidget(QLabel("↔️"))
2316-
2344+
23172345
self.replace_input = QLineEdit()
23182346
self.replace_input.setPlaceholderText("Ersetzen durch...")
2347+
self.replace_input.setAccessibleName("Ersetzen durch")
2348+
self.replace_input.setAccessibleDescription(
2349+
"Gibt den Text ein, der den aktuellen Suchtreffer oder alle Suchtreffer ersetzt."
2350+
)
2351+
self.replace_input.setToolTip("Ersetzungstext für den aktuellen Suchbegriff eingeben")
23192352
replace_layout.addWidget(self.replace_input, 1)
2320-
2353+
23212354
self.btn_replace = QPushButton("Ersetzen")
2355+
self.btn_replace.setToolTip("Aktuellen Treffer ersetzen")
2356+
self.btn_replace.setAccessibleName("Aktuellen Treffer ersetzen")
2357+
self.btn_replace.setAccessibleDescription(
2358+
"Ersetzt den aktuell ausgewählten Suchtreffer durch den eingegebenen Text."
2359+
)
23222360
self.btn_replace.clicked.connect(self.replace_current)
23232361
replace_layout.addWidget(self.btn_replace)
2324-
2362+
23252363
self.btn_replace_all = QPushButton("Alle")
2364+
self.btn_replace_all.setToolTip("Alle Treffer ersetzen")
2365+
self.btn_replace_all.setAccessibleName("Alle Treffer ersetzen")
2366+
self.btn_replace_all.setAccessibleDescription(
2367+
"Ersetzt alle Suchtreffer im aktuellen Editor durch den eingegebenen Text."
2368+
)
23262369
self.btn_replace_all.clicked.connect(self.replace_all)
23272370
replace_layout.addWidget(self.btn_replace_all)
23282371

tests/test_pythonbox_regressions.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,43 @@ def test_toolbar_buttons_expose_accessible_context(self):
119119
window.deleteLater()
120120
app.processEvents()
121121

122+
def test_search_bar_compact_controls_expose_accessible_context(self):
123+
os.environ.setdefault("QT_QPA_PLATFORM", "offscreen")
124+
module = load_pythonbox_module()
125+
app = module.QApplication.instance() or module.QApplication([])
126+
window = module.PythonArchitect()
127+
128+
try:
129+
search_bar = window.search_bar
130+
self.assertEqual("Suchbegriff", search_bar.search_input.accessibleName())
131+
self.assertIn("Eingabetaste", search_bar.search_input.accessibleDescription())
132+
self.assertTrue(search_bar.search_input.toolTip())
133+
134+
expected_buttons = {
135+
"Vorheriger Treffer": ("Shift+Enter", search_bar.btn_prev),
136+
"Nächster Treffer": ("Enter", search_bar.btn_next),
137+
"Suchleiste schließen": ("Escape", search_bar.btn_close),
138+
"Aktuellen Treffer ersetzen": ("Ersetzt den aktuell ausgewählten Suchtreffer", search_bar.btn_replace),
139+
"Alle Treffer ersetzen": ("Ersetzt alle Suchtreffer", search_bar.btn_replace_all),
140+
}
141+
142+
for accessible_name, (description_hint, widget) in expected_buttons.items():
143+
with self.subTest(accessible_name=accessible_name):
144+
self.assertEqual(accessible_name, widget.accessibleName())
145+
self.assertIn(description_hint, widget.accessibleDescription())
146+
self.assertTrue(widget.toolTip())
147+
148+
self.assertEqual("Groß- und Kleinschreibung beachten", search_bar.case_check.accessibleName())
149+
self.assertIn("Groß- und Kleinschreibung", search_bar.case_check.accessibleDescription())
150+
self.assertEqual("Trefferzähler", search_bar.match_label.accessibleName())
151+
self.assertIn("Gesamtzahl", search_bar.match_label.accessibleDescription())
152+
self.assertEqual("Ersetzen durch", search_bar.replace_input.accessibleName())
153+
self.assertIn("alle Suchtreffer ersetzt", search_bar.replace_input.accessibleDescription())
154+
finally:
155+
window.close()
156+
window.deleteLater()
157+
app.processEvents()
158+
122159
def test_apply_theme_normalizes_and_tracks_theme_name(self):
123160
os.environ.setdefault("QT_QPA_PLATFORM", "offscreen")
124161
module = load_pythonbox_module()

0 commit comments

Comments
 (0)