Deplace l'overlay Cocoa derriere le contrat Overlay, sans le modifier

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Ralph Mayola 2026-08-23 18:13:12 +02:00
parent 5f83e4c6a3
commit 3c3ea4444d
5 changed files with 29 additions and 2 deletions

4
app.py
View File

@ -30,7 +30,7 @@ from pynput import keyboard
from controller import ZonzaController from controller import ZonzaController
from core import CONFIG, validate_config from core import CONFIG, validate_config
from pulse_window import PulseWindow from interface import classe_overlay_pour
from systeme import choisir_systeme from systeme import choisir_systeme
_STATE_TITLES = { _STATE_TITLES = {
@ -49,7 +49,7 @@ class ZonzaApp(NSObject):
return None return None
self._item = None self._item = None
self._sounds_item = None self._sounds_item = None
self.pulse = PulseWindow.alloc().init() self.pulse = classe_overlay_pour().alloc().init()
self.controller = ZonzaController( self.controller = ZonzaController(
CONFIG, self.pulse, on_state=self._set_state, CONFIG, self.pulse, on_state=self._set_state,
run_on_main=AppHelper.callAfter, run_on_main=AppHelper.callAfter,

11
interface/__init__.py Normal file
View File

@ -0,0 +1,11 @@
"""Choisit l'implémentation d'overlay selon la plateforme."""
import sys
def classe_overlay_pour(plateforme=None):
"""Rend la CLASSE d'overlay (pas une instance : Cocoa exige `alloc().init()`)."""
plateforme = plateforme or sys.platform
if plateforme.startswith("darwin"):
from interface.cocoa.overlay import PulseWindow
return PulseWindow
raise NotImplementedError(f"Aucune interface pour : {plateforme}")

View File

16
tests/test_interface.py Normal file
View File

@ -0,0 +1,16 @@
"""La fabrique rend un overlay conforme au contrat, sans ouvrir de fenêtre."""
import pytest
from interface import classe_overlay_pour
def test_l_overlay_macos_declare_tout_le_contrat():
classe = classe_overlay_pour("darwin")
for methode in ("show", "hide", "set_level", "set_status", "rearmer_garde"):
assert callable(getattr(classe, methode, None)), f"{methode} manque"
def test_une_plateforme_inconnue_est_refusee_clairement():
with pytest.raises(NotImplementedError) as e:
classe_overlay_pour("haiku-os")
assert "haiku-os" in str(e.value)