Skip to content

Commit 5c854d9

Browse files
author
Lukas Geiger
committed
[UX/A11y] Add accessible names, tooltips, and dynamic descriptions for status bar indicators and linter panel
1 parent ab2a132 commit 5c854d9

3 files changed

Lines changed: 45 additions & 0 deletions

File tree

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ Format basiert auf [Keep a Changelog](https://keepachangelog.com/de/1.1.0/).
55

66
## [Unreleased]
77

8+
### Barrierefreiheit & UX / Accessibility & UX
9+
- Barrierefreiheits- & UX-Erweiterung (2026-08-03): Statusleisten-Indikatoren (`git_label`, `pos_label`, `linter_status`), Linter-Meldungsliste (`linter_list`) und Linter-Dock wurden mit vollständigen Barrierefreiheits-Attributen (`AccessibleName`, `AccessibleDescription`, `ToolTip`) sowie dynamischen Accessible-Description-Updates für Screenreader bei Textänderungen (Cursorposition, Git-Status, Linter-Ergebnisse) ausgestattet (93/93 Pytest-Tests 100% grün).
10+
811
### Geändert / Changed
912
- Discoverability & Marketing Audit (2026-07-26): `README.md` & `README_de.md` mit LLM-Ready-, Ecosystem- und Umbrella-Badges, GFM-Hinweisboxen (`> [!NOTE]` / `> [!TIP]`) und Mermaid-Systemarchitekturdiagramm erweitert; `llms.txt` Header auf `Last-checked: 2026-07-26` aktualisiert (92/92 Pytest-Tests 100% grün).
1013
- Dokumentations- & Sichtbarkeitspflege (2026-07-24): `llms.txt` auf `Last-checked: 2026-07-24` mit aktualisierter Testsuite-Beschreibung (92 Pytest-Tests) aktualisiert, dedizierte deutsche Startseite (`README_de.md`) angelegt, zweisprachige Sprachwahl-Navigation (`[English](README.md) | [Deutsch](README_de.md)`) oben in den READMEs integriert und Test-Badge ergänzt.

PythonBox_v8.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3379,6 +3379,8 @@ def add_toolbar_action(symbol: str, callback, tooltip: str, accessible_name: str
33793379
# --- LINTER PANEL (DOCK) (NEU v7!) ---
33803380
self.linter_dock = QDockWidget("Linter Probleme", self)
33813381
self.linter_list = QListWidget()
3382+
self.linter_list.setAccessibleName("Linter-Meldungsliste")
3383+
self.linter_list.setAccessibleDescription("Liste aller von der statischen Codeanalyse erkannten Fehler und Warnungen")
33823384
self.linter_list.setStyleSheet("""
33833385
QListWidget {
33843386
background-color: #1e1e1e;
@@ -3407,13 +3409,22 @@ def add_toolbar_action(symbol: str, callback, tooltip: str, accessible_name: str
34073409

34083410
# --- GIT STATUS LABEL (NEU v7!) ---
34093411
self.git_label = QLabel("")
3412+
self.git_label.setAccessibleName("Git-Status")
3413+
self.git_label.setAccessibleDescription("Aktueller Git-Branch und Dateistatus des aktiven Dokuments")
3414+
self.git_label.setToolTip("Git-Branch und Dateistatus")
34103415
self.status_bar.addWidget(self.git_label)
34113416

34123417
self.pos_label = QLabel("Zeile: 1 | Spalte: 1")
3418+
self.pos_label.setAccessibleName("Cursorposition")
3419+
self.pos_label.setAccessibleDescription("Zeile 1, Spalte 1")
3420+
self.pos_label.setToolTip("Aktuelle Cursorposition (Zeile und Spalte)")
34133421
self.status_bar.addPermanentWidget(self.pos_label)
34143422

34153423
# Linter-Status
34163424
self.linter_status = QLabel("")
3425+
self.linter_status.setAccessibleName("Linter-Status")
3426+
self.linter_status.setAccessibleDescription("Ergebnis der statischen Codeanalyse")
3427+
self.linter_status.setToolTip("Linter-Status (Fehler und Warnungen)")
34173428
self.status_bar.addPermanentWidget(self.linter_status)
34183429

34193430

@@ -3439,19 +3450,22 @@ def on_editor_changed(self, editor: CodeEditor):
34393450
if tab and tab.file_path:
34403451
status = self.git.get_file_status(tab.file_path)
34413452
self.git_label.setText(f"Git: {status}" if status else "")
3453+
self.git_label.setAccessibleDescription(f"Git-Status: {status}" if status else "Keine Git-Informationen")
34423454

34433455
# Git-Zeilen-Markierungen
34443456
added, modified, deleted = self.git.get_modified_lines(tab.file_path)
34453457
editor.set_git_status(added, modified)
34463458
else:
34473459
self.git_label.setText("")
3460+
self.git_label.setAccessibleDescription("Keine Git-Informationen")
34483461

34493462
# Minimap aktualisieren
34503463
if hasattr(self, 'minimap_action'):
34513464
self._update_minimap(editor)
34523465

34533466
def update_cursor_position(self, line: int, col: int):
34543467
self.pos_label.setText(f"Zeile: {line} | Spalte: {col}")
3468+
self.pos_label.setAccessibleDescription(f"Zeile {line}, Spalte {col}")
34553469

34563470
# --- RECENT FILES ---
34573471

@@ -3771,10 +3785,12 @@ def run_linter_now(self):
37713785
# Status
37723786
if errors:
37733787
self.linter_status.setText(f"❌ {error_count} | ⚠️ {warning_count}")
3788+
self.linter_status.setAccessibleDescription(f"Linter-Status: {error_count} Fehler, {warning_count} Warnungen")
37743789
self.linter_dock.show()
37753790
self.linter_action.setChecked(True)
37763791
else:
37773792
self.linter_status.setText("✓ Keine Probleme")
3793+
self.linter_status.setAccessibleDescription("Linter-Status: Keine Probleme gefunden")
37783794

37793795
self.status_bar.showMessage(f"Linter: {error_count} Fehler, {warning_count} Warnungen", 3000)
37803796

tests/test_pythonbox_regressions.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,32 @@ def test_search_bar_compact_controls_expose_accessible_context(self):
156156
window.deleteLater()
157157
app.processEvents()
158158

159+
def test_statusbar_and_linter_indicators_expose_accessible_context(self):
160+
os.environ.setdefault("QT_QPA_PLATFORM", "offscreen")
161+
module = load_pythonbox_module()
162+
app = module.QApplication.instance() or module.QApplication([])
163+
window = module.PythonArchitect()
164+
165+
try:
166+
self.assertEqual("Git-Status", window.git_label.accessibleName())
167+
self.assertTrue(window.git_label.toolTip())
168+
self.assertEqual("Cursorposition", window.pos_label.accessibleName())
169+
self.assertIn("Zeile 1, Spalte 1", window.pos_label.accessibleDescription())
170+
self.assertTrue(window.pos_label.toolTip())
171+
172+
window.update_cursor_position(10, 25)
173+
self.assertEqual("Zeile: 10 | Spalte: 25", window.pos_label.text())
174+
self.assertIn("Zeile 10, Spalte 25", window.pos_label.accessibleDescription())
175+
176+
self.assertEqual("Linter-Status", window.linter_status.accessibleName())
177+
self.assertTrue(window.linter_status.toolTip())
178+
self.assertEqual("Linter-Meldungsliste", window.linter_list.accessibleName())
179+
self.assertIn("statischen Codeanalyse", window.linter_list.accessibleDescription())
180+
finally:
181+
window.close()
182+
window.deleteLater()
183+
app.processEvents()
184+
159185
def test_apply_theme_normalizes_and_tracks_theme_name(self):
160186
os.environ.setdefault("QT_QPA_PLATFORM", "offscreen")
161187
module = load_pythonbox_module()

0 commit comments

Comments
 (0)