""" 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()