Files
Geniusia_v2/geniusia2/gui/dialogs/example_integration.py
2026-03-05 00:20:25 +01:00

304 lines
10 KiB
Python

"""
Exemple d'intégration des dialogues et notifications
Démontre comment utiliser tous les composants ensemble
"""
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget
from PyQt5.QtCore import QTimer
import sys
from correction_dialog import CorrectionDialog
from post_action_notification import PostActionNotification
from transition_notification import TransitionNotification
class IntegrationDemo(QMainWindow):
"""
Démonstration de l'intégration des dialogues et notifications
"""
def __init__(self):
super().__init__()
self.setWindowTitle("Démo Dialogues & Notifications")
self.setGeometry(100, 100, 400, 500)
# Widget central
central_widget = QWidget()
self.setCentralWidget(central_widget)
# Layout
layout = QVBoxLayout()
central_widget.setLayout(layout)
# Boutons de test
btn_correction = QPushButton("1. Dialogue de Correction")
btn_correction.clicked.connect(self.test_correction_dialog)
layout.addWidget(btn_correction)
btn_success = QPushButton("2. Notification Succès")
btn_success.clicked.connect(self.test_success_notification)
layout.addWidget(btn_success)
btn_failure = QPushButton("3. Notification Échec")
btn_failure.clicked.connect(self.test_failure_notification)
layout.addWidget(btn_failure)
btn_autopilot = QPushButton("4. Proposition Autopilot")
btn_autopilot.clicked.connect(self.test_autopilot_proposal)
layout.addWidget(btn_autopilot)
btn_confidence = QPushButton("5. Alerte Baisse Confiance")
btn_confidence.clicked.connect(self.test_confidence_drop)
layout.addWidget(btn_confidence)
btn_whitelist = QPushButton("6. Violation Liste Blanche")
btn_whitelist.clicked.connect(self.test_whitelist_violation)
layout.addWidget(btn_whitelist)
btn_ui_change = QPushButton("7. Changement UI")
btn_ui_change.clicked.connect(self.test_ui_change)
layout.addWidget(btn_ui_change)
btn_transition = QPushButton("8. Transition de Mode")
btn_transition.clicked.connect(self.test_mode_transition)
layout.addWidget(btn_transition)
btn_scenario = QPushButton("9. Scénario Complet")
btn_scenario.clicked.connect(self.test_complete_scenario)
layout.addWidget(btn_scenario)
layout.addStretch()
def test_correction_dialog(self):
"""Test du dialogue de correction"""
print("\n=== Test Dialogue de Correction ===")
incorrect = {
"label": "annuler_button",
"confidence": 0.75,
"bbox": (300, 400, 100, 35),
"action_type": "click"
}
alternatives = [
{
"label": "valider_button",
"confidence": 0.92,
"bbox": (450, 400, 100, 35),
"action_type": "click"
},
{
"label": "enregistrer_button",
"confidence": 0.88,
"bbox": (600, 400, 120, 35),
"action_type": "click"
},
{
"label": "fermer_button",
"confidence": 0.65,
"bbox": (750, 50, 30, 30),
"action_type": "click"
}
]
correction = CorrectionDialog.show_correction_dialog(
incorrect,
alternatives,
parent=self
)
if correction:
print(f"✓ Correction effectuée:")
print(f" Méthode: {correction['correction_method']}")
print(f" Élément corrigé: {correction['corrected_element']['label']}")
print(f" Élément original: {correction['original_detection']['label']}")
else:
print("✗ Correction annulée")
def test_success_notification(self):
"""Test notification de succès"""
print("\n=== Test Notification Succès ===")
notification = PostActionNotification.show_success(
action_type="click",
target_element="valider_button",
confidence=0.95,
parent=self
)
notification.feedback_provided.connect(
lambda result: print(f"✓ Retour reçu: {result}")
)
def test_failure_notification(self):
"""Test notification d'échec"""
print("\n=== Test Notification Échec ===")
def on_correction(data):
print(f"✎ Correction demandée pour: {data['action_type']} sur {data['target_element']}")
notification = PostActionNotification.show_failure(
action_type="click",
target_element="annuler_button",
error_message="Élément non trouvé à l'écran",
confidence=0.65,
allow_correction=True,
parent=self
)
notification.allow_corrective_feedback(on_correction)
notification.feedback_provided.connect(
lambda result: print(f"✓ Retour reçu: {result}")
)
def test_autopilot_proposal(self):
"""Test proposition autopilot"""
print("\n=== Test Proposition Autopilot ===")
notification = TransitionNotification.show_autopilot_proposal(
task_name="Ouvrir Facture",
observation_count=25,
concordance_rate=0.97,
parent=self
)
notification.action_taken.connect(
lambda action: print(f"✓ Décision autopilot: {action}")
)
def test_confidence_drop(self):
"""Test alerte baisse de confiance"""
print("\n=== Test Baisse de Confiance ===")
notification = TransitionNotification.show_confidence_drop(
task_name="Saisie Données",
confidence_score=0.85,
threshold=0.90,
reason="Changements UI détectés",
parent=self
)
notification.action_taken.connect(
lambda action: print(f"✓ Action: {action}")
)
def test_whitelist_violation(self):
"""Test violation liste blanche"""
print("\n=== Test Violation Liste Blanche ===")
notification = TransitionNotification.show_whitelist_violation(
window_title="Application Non Autorisée",
action_type="click",
parent=self
)
notification.action_taken.connect(
lambda action: print(f"✓ Décision liste blanche: {action}")
)
def test_ui_change(self):
"""Test changement UI"""
print("\n=== Test Changement UI ===")
notification = TransitionNotification.show_ui_change(
task_name="Navigation Menu",
similarity=0.65,
parent=self
)
notification.action_taken.connect(
lambda action: print(f"✓ Action changement UI: {action}")
)
def test_mode_transition(self):
"""Test transition de mode"""
print("\n=== Test Transition de Mode ===")
notification = TransitionNotification.show_mode_transition(
task_name="Export Données",
from_mode="auto",
to_mode="assist",
reason="low_confidence",
parent=self
)
notification.action_taken.connect(
lambda action: print(f"✓ Action transition: {action}")
)
def test_complete_scenario(self):
"""Test d'un scénario complet"""
print("\n=== Scénario Complet ===")
print("Simulation d'un flux de travail complet avec notifications...")
# 1. Notification de succès
print("\n1. Action réussie...")
QTimer.singleShot(500, lambda: PostActionNotification.show_success(
"click", "ouvrir_button", 0.96, parent=self
))
# 2. Notification d'échec avec correction
print("2. Action échouée, correction nécessaire...")
def show_failure():
notif = PostActionNotification.show_failure(
"click", "valider_button", "Élément masqué", 0.72, parent=self
)
notif.correction_requested.connect(
lambda data: print(f" → Correction demandée: {data}")
)
QTimer.singleShot(2000, show_failure)
# 3. Alerte de changement UI
print("3. Changement d'interface détecté...")
def show_ui_change():
notif = TransitionNotification.show_ui_change(
"Ouvrir Facture", 0.68, parent=self
)
notif.action_taken.connect(
lambda action: print(f" → Décision UI: {action}")
)
QTimer.singleShot(4000, show_ui_change)
# 4. Baisse de confiance
print("4. Baisse de confiance détectée...")
QTimer.singleShot(6000, lambda: TransitionNotification.show_confidence_drop(
"Saisie Données", 0.87, 0.90, "Erreurs répétées", parent=self
))
# 5. Proposition autopilot
print("5. Proposition de passage en autopilot...")
def show_autopilot():
notif = TransitionNotification.show_autopilot_proposal(
"Export Rapport", 22, 0.96, parent=self
)
notif.action_taken.connect(
lambda action: print(f" → Décision autopilot: {action}")
)
QTimer.singleShot(8000, show_autopilot)
# 6. Transition de mode
print("6. Transition de mode effectuée...")
QTimer.singleShot(10000, lambda: TransitionNotification.show_mode_transition(
"Export Rapport", "assist", "auto", "high_concordance", parent=self
))
print("\nScénario lancé! Observez les notifications...")
def main():
"""Point d'entrée principal"""
app = QApplication(sys.argv)
demo = IntegrationDemo()
demo.show()
print("=== Démo Dialogues & Notifications ===")
print("Cliquez sur les boutons pour tester chaque composant")
print("=" * 50)
sys.exit(app.exec_())
if __name__ == "__main__":
main()