"""Confort du terminal : zoom de police, barre de defilement, recherche dans l'historique.""" import pathlib import sys sys.path.insert(0, str(pathlib.Path(__file__).resolve().parent.parent)) from PySide6.QtCore import QEvent, Qt from PySide6.QtGui import QKeyEvent from PySide6.QtWidgets import QApplication from app.terminal_widget import TerminalWidget app = QApplication([]) t = TerminalWidget() t.resize(900, 500) t.show() print("=== 1. Zoom de police ===") base = t.font_size base_cols = t.cols t.zoom(4) print(f" taille {base} -> {t.font_size} | colonnes {base_cols} -> {t.cols}") assert t.font_size == base + 4 assert t.cols < base_cols, "agrandir la police doit reduire le nombre de colonnes" t.zoom(-4) assert t.font_size == base t.set_font_size(999) print(" taille bornee au maximum :", t.font_size) assert t.font_size == 32, t.font_size t.set_font_size(1) print(" taille bornee au minimum :", t.font_size) assert t.font_size == 6, t.font_size t.reset_zoom() assert t.font_size == 10 print() print("=== 2. Ctrl+molette zoome, molette seule defile ===") before = t.font_size class Wheel: def __init__(self, ctrl): self._ctrl = ctrl def angleDelta(self): return type("D", (), {"y": lambda s: 120})() def modifiers(self): return Qt.ControlModifier if self._ctrl else Qt.NoModifier t.wheelEvent(Wheel(ctrl=True)) print(f" Ctrl+molette : {before} -> {t.font_size}") assert t.font_size == before + 1 t.reset_zoom() print() print("=== 3. Barre de defilement liee a l'historique ===") assert not t.scrollbar.isVisible(), "pas d'historique = pas de barre" for i in range(200): t.feed(f"ligne d historique {i}\r\n".encode()) print(" apres 200 lignes -> barre visible :", t.scrollbar.isVisible(), "| plage :", t.scrollbar.minimum(), "a", t.scrollbar.maximum()) assert t.scrollbar.isVisible() assert t.scrollbar.maximum() > 0 assert t.scrollbar.value() == t.scrollbar.maximum(), "en vue directe, la barre est en bas" print() print("=== 4. Recherche dans l'historique ===") t.feed(b"une aiguille dans une botte de foin\r\n") for i in range(120): t.feed(f"remplissage {i}\r\n".encode()) trouve = t.find_text("aiguille") print(" 'aiguille' trouvee :", trouve, "| texte selectionne :", repr(t.selected_text())) assert trouve, "la recherche doit remonter l'historique" assert "aiguille" in t.selected_text() absent = t.find_text("chaine-totalement-absente-xyz") print(" chaine absente -> trouvee :", absent) assert not absent print() print("=== 5. Retour a la vue en direct ===") t.scroll_to_bottom() print(" scroll_offset :", t.scroll_offset, "| barre en bas :", t.scrollbar.value() == t.scrollbar.maximum()) assert t.scroll_offset == 0 print() print("=== 6. Ctrl+F emet la demande de recherche ===") demandes = [] t.search_requested.connect(lambda: demandes.append(True)) t.keyPressEvent(QKeyEvent(QEvent.KeyPress, Qt.Key_F, Qt.ControlModifier, "")) print(" signal emis :", bool(demandes)) assert demandes print() print("CONFORT DU TERMINAL : TOUS LES TESTS OK")