Skip to content

Commit 570322d

Browse files
Lukas Geigerclaude
andcommitted
fix(B-009): currentFileChanged nach close_tab mit korrektem Tab emittieren
removeTab() loest currentChanged waehrend self.tabs noch das alte Mapping hat. Dadurch wurde currentFileChanged mit dem gerade entfernten Tab emittiert, was die UI-Anzeige (Titel, Sprache, Run-Button) auf den falschen Tab setzte. Beim Schliessen des letzten Tabs wurde gar kein Signal emittiert. Fix: nach _rebuild_tab_map() korrigierendes currentFileChanged(path|None) emittieren. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent aade3f0 commit 570322d

2 files changed

Lines changed: 48 additions & 0 deletions

File tree

core/tabs.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,8 @@ def close_tab(self, index: int):
138138

139139
self.removeTab(index)
140140
self._rebuild_tab_map()
141+
current = self.current_tab()
142+
self.currentFileChanged.emit(current.file_path if current else None)
141143

142144
def _on_tab_moved(self, _from: int, _to: int):
143145
"""Hält die Tab-Map nach Drag-and-drop im Sync."""

tests/test_tab_reordering.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,52 @@ def _ensure_app():
99
return QApplication.instance() or QApplication([])
1010

1111

12+
def test_close_tab_emits_current_file_changed_with_correct_tab():
13+
"""Regression (B-009): close_tab() muss currentFileChanged mit dem neu
14+
aktiven Tab emittieren, nicht mit dem gerade geschlossenen.
15+
Vor dem Fix: removeTab() löst currentChanged mit veralteter Tab-Map aus,
16+
sodass das Signal den falschen (entfernten) Tab enthält."""
17+
_ensure_app()
18+
widget = TabWidget()
19+
20+
first = widget.new_tab()
21+
first.file_path = Path("first.py")
22+
second = widget.new_tab()
23+
second.file_path = Path("second.py")
24+
25+
emitted_paths = []
26+
widget.currentFileChanged.connect(lambda p: emitted_paths.append(p))
27+
28+
widget.close_tab(0)
29+
30+
assert widget.count() == 1
31+
# Das letzte Signal muss second.file_path sein, nicht first.file_path
32+
assert emitted_paths, "currentFileChanged wurde nie emittiert"
33+
assert emitted_paths[-1] == Path("second.py"), (
34+
f"Falscher Pfad emittiert: {emitted_paths[-1]!r}"
35+
)
36+
37+
widget.close()
38+
39+
40+
def test_close_last_tab_emits_none():
41+
"""Regression (B-009): Wird der letzte Tab geschlossen, muss
42+
currentFileChanged(None) emittiert werden, damit die UI zurückgesetzt wird."""
43+
_ensure_app()
44+
widget = TabWidget()
45+
widget.new_tab()
46+
47+
emitted_paths = []
48+
widget.currentFileChanged.connect(lambda p: emitted_paths.append(p))
49+
50+
widget.close_tab(0)
51+
52+
assert widget.count() == 0
53+
assert None in emitted_paths, (
54+
f"currentFileChanged(None) wurde nie emittiert; bekommen: {emitted_paths}"
55+
)
56+
57+
1258
def test_new_tab_title_shows_asterisk_when_modified():
1359
"""Regression (B-005): new_tab() muss _update_tab_title verbinden, damit
1460
der Tab-Titel '*Unbenannt' zeigt, sobald Inhalt geändert wurde."""

0 commit comments

Comments
 (0)