Skip to content

Commit fbaa16d

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 7270c09 commit fbaa16d

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
@@ -69,8 +69,6 @@ def _prime_expected_attrs(self) -> None:
6969
"select_theme",
7070
"compiler_tabs",
7171
"tab_hello",
72-
"btn_select_icon",
73-
"btn_nuitka_icon",
7472
"toolButton_more",
7573
]
7674
for name in names:
@@ -95,6 +93,14 @@ def _load_ide_like_ui(self) -> None:
9593
# ui_ide_design2.ui uses QMainWindow as root. Reuse its central widget.
9694
if isinstance(loaded, QMainWindow):
9795
_clear_inline_styles(loaded)
96+
# Preserve status bar authored in the .ui file when available.
97+
try:
98+
statusbar = loaded.statusBar()
99+
if statusbar is not None:
100+
statusbar.setParent(self)
101+
self.setStatusBar(statusbar)
102+
except Exception:
103+
pass
98104
central = loaded.takeCentralWidget()
99105
if central is None:
100106
central = loaded.findChild(QWidget, "centralwidget")
@@ -178,8 +184,8 @@ def _find(cls, name: str):
178184
self.btn_select_files = _find(QPushButton, "btn_select_files")
179185
self.btn_remove_file = _find(QPushButton, "btn_remove_file")
180186
self.btn_clear_workspace = _find(QPushButton, "btn_clear_workspace")
181-
self.btn_select_icon = _find(QPushButton, "btn_select_icon")
182-
self.btn_nuitka_icon = _find(QPushButton, "btn_nuitka_icon")
187+
self.btn_select_icon = None
188+
self.btn_nuitka_icon = None
183189
self.toolButton_more = _find(QToolButton, "toolButton_more")
184190
self.log = _find(QTextEdit, "log")
185191
self.progress = _find(QProgressBar, "progress")
@@ -580,11 +586,6 @@ def _connect_clicked(widget, handler) -> None:
580586
getattr(self, "activity_btn_deps", None),
581587
getattr(self, "suggest_missing_dependencies", None),
582588
)
583-
_connect_clicked(getattr(self, "btn_select_icon", None), getattr(self, "select_icon", None))
584-
_connect_clicked(
585-
getattr(self, "btn_nuitka_icon", None),
586-
getattr(self, "select_nuitka_icon", None),
587-
)
588589
_bind_status_updates(self)
589590

590591
def init_ide_like_ui(self) -> None:

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)