Skip to content

Commit a1c6503

Browse files
committed
Corrige les incohérences globales de l'UI IDE
Aligne le câblage IDE-like avec les widgets réellement présents dans ui_ide_design2.ui et supprime les liaisons d'icônes inexistantes. Préserve la statusbar définie dans le fichier .ui lors du chargement de la variante IDE-like. Rend select_icon robuste quand icon_preview est absent pour éviter les erreurs selon la variante d'interface. Synchronise la documentation de parité IDE/classique avec l'état réel de l'UI. Fiabilise les tests (ajout du root dans sys.path via conftest) et enrichit le smoke test UI. Remplace locale.getdefaultlocale() par locale.getlocale() pour supprimer les avertissements de dépréciation Python 3.15.
1 parent ad966a1 commit a1c6503

8 files changed

Lines changed: 45 additions & 18 deletions

File tree

Core/Gui.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ def __init__(self):
131131

132132
sys_lang = None
133133
try:
134-
loc = locale.getdefaultlocale()[0] or ""
134+
loc = (locale.getlocale()[0] or "")
135135
sys_lang = (
136136
"Français" if loc.lower().startswith(("fr", "fr_")) else "English"
137137
)

Core/IdeLikeGui/connections.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,6 @@ def _prime_expected_attrs(self) -> None:
8181
"select_theme",
8282
"compiler_tabs",
8383
"tab_hello",
84-
"btn_select_icon",
85-
"btn_nuitka_icon",
8684
"toolButton_more",
8785
"mainSplitter",
8886
"rightSplitter",
@@ -114,6 +112,14 @@ def _load_ide_like_ui(self) -> None:
114112
# ui_ide_design2.ui uses QMainWindow as root. Reuse its central widget.
115113
if isinstance(loaded, QMainWindow):
116114
_clear_inline_styles(loaded)
115+
# Preserve status bar authored in the .ui file when available.
116+
try:
117+
statusbar = loaded.statusBar()
118+
if statusbar is not None:
119+
statusbar.setParent(self)
120+
self.setStatusBar(statusbar)
121+
except Exception:
122+
pass
117123
central = loaded.takeCentralWidget()
118124
if central is None:
119125
central = loaded.findChild(QWidget, "centralwidget")
@@ -199,8 +205,8 @@ def _find(cls, name: str):
199205
self.btn_select_files = _find(QPushButton, "btn_select_files")
200206
self.btn_remove_file = _find(QPushButton, "btn_remove_file")
201207
self.btn_clear_workspace = _find(QPushButton, "btn_clear_workspace")
202-
self.btn_select_icon = _find(QPushButton, "btn_select_icon")
203-
self.btn_nuitka_icon = _find(QPushButton, "btn_nuitka_icon")
208+
self.btn_select_icon = None
209+
self.btn_nuitka_icon = None
204210
self.toolButton_more = _find(QToolButton, "toolButton_more")
205211
self.mainSplitter = _find(QSplitter, "mainSplitter")
206212
self.rightSplitter = _find(QSplitter, "rightSplitter")
@@ -634,11 +640,6 @@ def _connect_ide_like_specific_signals(self) -> None:
634640
getattr(self, "activity_btn_deps", None),
635641
getattr(self, "suggest_missing_dependencies", None),
636642
)
637-
_connect_clicked(getattr(self, "btn_select_icon", None), getattr(self, "select_icon", None))
638-
_connect_clicked(
639-
getattr(self, "btn_nuitka_icon", None),
640-
getattr(self, "select_nuitka_icon", None),
641-
)
642643
_bind_status_updates(self)
643644

644645

Core/PreferencesManager.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ def detect_system_language() -> tuple[str, str]:
270270
try:
271271
import locale
272272

273-
loc = (locale.getdefaultlocale()[0] or "").lower()
273+
loc = (locale.getlocale()[0] or "").lower()
274274
if loc.startswith(("fr", "fr_")):
275275
return ("fr", "Français")
276276
return ("en", "English")

Core/UiFeatures.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ class UiFeatures:
5252

5353
def select_icon(self):
5454
"""Ouvre une boîte de dialogue pour sélectionner une icône."""
55+
icon_preview = getattr(self, "icon_preview", None)
5556
file, _ = QFileDialog.getOpenFileName(
5657
self, "Choisir un fichier .ico", "", "Icon Files (*.ico)"
5758
)
@@ -68,14 +69,17 @@ def select_icon(self):
6869
Qt.AspectRatioMode.KeepAspectRatio,
6970
Qt.TransformationMode.SmoothTransformation,
7071
)
71-
self.icon_preview.setPixmap(scaled_pixmap)
72-
self.icon_preview.show()
72+
if icon_preview is not None:
73+
icon_preview.setPixmap(scaled_pixmap)
74+
icon_preview.show()
7375
else:
74-
self.icon_preview.hide()
76+
if icon_preview is not None:
77+
icon_preview.hide()
7578
else:
7679
# Annulation: supprimer l'icône sélectionnée et masquer l'aperçu
7780
self.icon_path = None
78-
self.icon_preview.hide()
81+
if icon_preview is not None:
82+
icon_preview.hide()
7983
# Persistance et mise à jour en temps réel
8084
self.update_command_preview()
8185
try:

docs/ide_classic_parity.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ It focuses on shared user-facing behaviors and the remaining IDE-specific deltas
99
| Workspace / venv / files actions | Yes | Yes | Done | Routed through the same shared handlers. |
1010
| Compilation / cancel actions | Yes | Yes | Done | Uses the common signal connector. |
1111
| Dependencies analysis action | Yes | Yes | Done | Shared button plus IDE activity button. |
12-
| App icon button wiring | Yes | Yes | Done | Explicit IDE binding for `btn_select_icon`. |
13-
| Nuitka icon button wiring | Yes | Yes | Done | Explicit IDE binding for `btn_nuitka_icon`. |
12+
| App icon button wiring | Yes | No | Intentional | No dedicated icon button in `ui_ide_design2.ui`. |
13+
| Nuitka icon button wiring | Yes | No | Intentional | No dedicated Nuitka icon button in `ui_ide_design2.ui`. |
1414
| Entrypoint selector | Yes | Yes | Done | `setup_entrypoint_selector()` is called during IDE init. |
1515
| Theme and language dialogs | Yes | Yes | Done | IDE keeps dedicated affordances on top of shared wiring. |
1616
| More-actions (`...`) menu | No | Yes | Done | IDE-only affordance, now translated and refreshed with language changes. |

docs/ide_like_gui.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ python -m pycompiler_ark --ide-gui
3434
- Keeps IDE-specific affordances:
3535
- `...` activity-bar menu
3636
- dependencies activity button
37-
- explicit icon buttons for engines
3837
- Tunes the loaded layout at runtime to reduce label compression in the header, center panel, and logs area.
3938

4039
## Runtime Switch

tests/conftest.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,15 @@
1717

1818
from pathlib import Path
1919
import shutil
20+
import sys
2021

2122
import pytest
2223

24+
# Ensure project root imports (e.g. `import Core`) work regardless of pytest invocation path.
25+
ROOT_DIR = Path(__file__).resolve().parent.parent
26+
if str(ROOT_DIR) not in sys.path:
27+
sys.path.insert(0, str(ROOT_DIR))
28+
2329

2430
@pytest.fixture()
2531
def test_workspace(tmp_path: Path) -> Path:

tests/test_ui_smoke.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,22 @@ def test_ui_init_smoke() -> None:
3232
app = QApplication.instance() or QApplication([])
3333
gui = PyCompilerArkGui()
3434
assert gui is not None
35+
assert gui.statusBar() is not None
36+
gui.close()
37+
app.quit()
38+
39+
40+
def test_select_icon_without_preview_smoke(monkeypatch: pytest.MonkeyPatch) -> None:
41+
"""Selecting/cancelling icon should not require an icon_preview widget."""
42+
os.environ.setdefault("QT_QPA_PLATFORM", "offscreen")
43+
app = QApplication.instance() or QApplication([])
44+
gui = PyCompilerArkGui()
45+
monkeypatch.setattr(
46+
"Core.UiFeatures.QFileDialog.getOpenFileName",
47+
lambda *_args, **_kwargs: ("", ""),
48+
)
49+
if hasattr(gui, "icon_preview"):
50+
delattr(gui, "icon_preview")
51+
gui.select_icon()
3552
gui.close()
3653
app.quit()

0 commit comments

Comments
 (0)