Skip to content

Commit 9de183b

Browse files
author
Lukas Geiger
committed
fix: sync minimap settings
1 parent d055c48 commit 9de183b

4 files changed

Lines changed: 91 additions & 7 deletions

File tree

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ Format basiert auf [Keep a Changelog](https://keepachangelog.com/de/1.1.0/).
2323
- Entfernte Qt6-APIs `fontMetrics().width()` und `setTabStopWidth()` durch aktuelle Alternativen ersetzt.
2424
- Externe Python-Skripte starten jetzt mit `sys.executable` statt einem hardcodierten `python`/`python3`.
2525

26+
- Die Minimap-Option im Einstellungsdialog nutzt jetzt denselben `show_minimap`-Key wie das Ansicht-Menü und wird auch über den Apply-Button direkt auf die Hauptansicht angewendet.
27+
2628
## [1.0.0] - YYYY-MM-DD
2729

2830
### Hinzugefügt / Added

PythonBox_v8.py

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1759,6 +1759,7 @@ def get_line(self) -> int:
17591759

17601760
class SettingsDialog(QDialog):
17611761
"""Dialog für Editor-Einstellungen"""
1762+
settings_applied = Signal()
17621763

17631764
def __init__(self, parent=None, settings: QSettings = None):
17641765
super().__init__(parent)
@@ -1814,7 +1815,8 @@ def __init__(self, parent=None, settings: QSettings = None):
18141815

18151816
# Minimap
18161817
self.minimap_check = QCheckBox("Aktiviert")
1817-
self.minimap_check.setChecked(self.settings.value("minimap", False, type=bool))
1818+
legacy_minimap = self.settings.value("minimap", False, type=bool)
1819+
self.minimap_check.setChecked(self.settings.value("show_minimap", legacy_minimap, type=bool))
18181820
display_layout.addRow("Minimap:", self.minimap_check)
18191821

18201822
# Zeilennummern
@@ -1840,8 +1842,10 @@ def apply_settings(self):
18401842
self.settings.setValue("autocomplete", self.autocomplete_check.isChecked())
18411843
self.settings.setValue("bracket_matching", self.bracket_check.isChecked())
18421844
self.settings.setValue("theme", self.theme_combo.currentText())
1843-
self.settings.setValue("minimap", self.minimap_check.isChecked())
1845+
self.settings.setValue("show_minimap", self.minimap_check.isChecked())
18441846
self.settings.setValue("line_numbers", self.line_numbers_check.isChecked())
1847+
self.settings.sync()
1848+
self.settings_applied.emit()
18451849

18461850
def accept(self):
18471851
self.apply_settings()
@@ -1855,7 +1859,7 @@ def get_settings(self) -> dict:
18551859
"autocomplete": self.autocomplete_check.isChecked(),
18561860
"bracket_matching": self.bracket_check.isChecked(),
18571861
"theme": self.theme_combo.currentText(),
1858-
"minimap": self.minimap_check.isChecked(),
1862+
"show_minimap": self.minimap_check.isChecked(),
18591863
"line_numbers": self.line_numbers_check.isChecked(),
18601864
}
18611865

@@ -2625,7 +2629,7 @@ def setup_ui(self):
26252629
view_menu = menubar.addMenu("Ansicht")
26262630
self.minimap_action = view_menu.addAction("🗺️ Minimap")
26272631
self.minimap_action.setCheckable(True)
2628-
self.minimap_action.setChecked(self.settings.value("show_minimap", False, type=bool))
2632+
self.minimap_action.setChecked(self._show_minimap_enabled())
26292633
self.minimap_action.triggered.connect(self.toggle_minimap)
26302634

26312635
self.linter_action = view_menu.addAction("⚠️ Linter-Panel")
@@ -2717,7 +2721,7 @@ def setup_ui(self):
27172721
self.minimap = None # Wird bei Bedarf erstellt
27182722
self.minimap_container = QWidget()
27192723
self.minimap_container.setFixedWidth(80)
2720-
self.minimap_container.setVisible(self.settings.value("show_minimap", False, type=bool))
2724+
self.minimap_container.setVisible(self._show_minimap_enabled())
27212725
editor_h_layout.addWidget(self.minimap_container)
27222726

27232727
c_layout.addWidget(editor_container)
@@ -2937,8 +2941,8 @@ def goto_line(self):
29372941
def show_settings(self):
29382942
"""Öffnet den Einstellungs-Dialog"""
29392943
dlg = SettingsDialog(self, self.settings)
2944+
dlg.settings_applied.connect(self._apply_settings_to_editors)
29402945
if dlg.exec() == QDialog.Accepted:
2941-
self._apply_settings_to_editors()
29422946
self.status_bar.showMessage("Einstellungen gespeichert", 3000)
29432947

29442948
def _apply_settings_to_editors(self):
@@ -2977,9 +2981,31 @@ def _apply_settings_to_editors(self):
29772981
font = self.preview_editor.font()
29782982
font.setPointSize(font_size)
29792983
self.preview_editor.setFont(font)
2984+
self._apply_minimap_setting()
29802985

29812986
# --- NEU v7: MINIMAP, LINTER, GIT ---
29822987

2988+
def _show_minimap_enabled(self) -> bool:
2989+
"""Liest die Minimap-Einstellung mit Fallback auf den alten Settings-Key."""
2990+
legacy_minimap = self.settings.value("minimap", False, type=bool)
2991+
return self.settings.value("show_minimap", legacy_minimap, type=bool)
2992+
2993+
def _apply_minimap_setting(self):
2994+
"""Synchronisiert Settings-Dialog, Ansicht-Menue und Minimap-Container."""
2995+
checked = self._show_minimap_enabled()
2996+
self.minimap_action.blockSignals(True)
2997+
self.minimap_action.setChecked(checked)
2998+
self.minimap_action.blockSignals(False)
2999+
self.minimap_container.setVisible(checked)
3000+
3001+
if checked:
3002+
editor = self.tab_editor.current_editor()
3003+
if editor:
3004+
self._update_minimap(editor)
3005+
elif self.minimap:
3006+
self.minimap.deleteLater()
3007+
self.minimap = None
3008+
29833009
def toggle_minimap(self, checked: bool):
29843010
"""Minimap ein-/ausschalten"""
29853011
self.settings.setValue("show_minimap", checked)

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ PythonBox is a lightweight Python IDE with a dark theme, integrated debugging, c
2525
- Linter-Integration für Pylint und Flake8
2626
- Git-Status, Diff und Modified-Markierung
2727
- Qt6-kompatible Editor-Metriken und F5-Ausführung über das Debug-Output-Panel
28+
- Die Minimap-Einstellung bleibt zwischen Ansicht-Menü und Einstellungsdialog synchron, inklusive Fallback für ältere Konfigurationen
2829

2930
### Windows-Paketierung
3031
- `PythonBox.ico` wird als App- und Fenstericon verwendet, wenn die Datei vorhanden ist.
@@ -64,7 +65,7 @@ Das Build-Ergebnis liegt anschließend in `dist/`. Build-Artefakte und lokale Re
6465

6566
## Tests
6667

67-
Die Regressionstests prüfen die Qt6-API-Kompatibilität, die F5-Ausführung über `debug_output.run_normal`, die externe Terminal-Ausführung mit dem aktuellen Python-Interpreter und einen Offscreen-Smoke-Test für das Hauptfenster.
68+
Die Regressionstests prüfen die Qt6-API-Kompatibilität, die F5-Ausführung über `debug_output.run_normal`, die externe Terminal-Ausführung mit dem aktuellen Python-Interpreter, die Minimap-Einstellungssynchronisation und einen Offscreen-Smoke-Test für das Hauptfenster.
6869

6970
```bash
7071
python -m unittest discover -s tests -v

tests/test_pythonbox_regressions.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import ast
22
import importlib.util
33
import os
4+
import tempfile
45
import unittest
56
from pathlib import Path
67
from unittest import mock
@@ -104,5 +105,59 @@ def test_non_windows_external_commands_use_current_interpreter(self):
104105
self.assertEqual(["/opt/current-python/bin/python", "tool.py"], cmd)
105106

106107

108+
class SettingsRegressionTests(unittest.TestCase):
109+
def _temp_settings(self, module, folder: str):
110+
settings_path = Path(folder) / "settings.ini"
111+
return module.QSettings(str(settings_path), module.QSettings.Format.IniFormat)
112+
113+
def test_settings_dialog_reads_and_writes_runtime_minimap_key(self):
114+
module = load_pythonbox_module()
115+
app = module.QApplication.instance() or module.QApplication([])
116+
117+
with tempfile.TemporaryDirectory() as temp_dir:
118+
settings = self._temp_settings(module, temp_dir)
119+
settings.setValue("show_minimap", True)
120+
121+
dialog = module.SettingsDialog(settings=settings)
122+
try:
123+
emissions = []
124+
dialog.settings_applied.connect(lambda: emissions.append(True))
125+
self.assertTrue(dialog.minimap_check.isChecked())
126+
127+
dialog.minimap_check.setChecked(False)
128+
dialog.apply_settings()
129+
130+
self.assertFalse(settings.value("show_minimap", True, type=bool))
131+
self.assertEqual([True], emissions)
132+
finally:
133+
dialog.deleteLater()
134+
app.processEvents()
135+
136+
def test_main_window_reacts_to_minimap_setting_changes(self):
137+
module = load_pythonbox_module()
138+
app = module.QApplication.instance() or module.QApplication([])
139+
140+
with tempfile.TemporaryDirectory() as temp_dir:
141+
settings = self._temp_settings(module, temp_dir)
142+
settings.setValue("show_minimap", False)
143+
144+
with mock.patch.object(module, "QSettings", lambda *args, **kwargs: settings):
145+
window = module.PythonArchitect()
146+
147+
try:
148+
self.assertFalse(window.minimap_action.isChecked())
149+
self.assertTrue(window.minimap_container.isHidden())
150+
151+
settings.setValue("show_minimap", True)
152+
window._apply_settings_to_editors()
153+
154+
self.assertTrue(window.minimap_action.isChecked())
155+
self.assertFalse(window.minimap_container.isHidden())
156+
finally:
157+
window.close()
158+
window.deleteLater()
159+
app.processEvents()
160+
161+
107162
if __name__ == "__main__":
108163
unittest.main()

0 commit comments

Comments
 (0)