import sys

from PySide2.QtGui import QIcon
from PySide2.QtWidgets import QApplication, QLineEdit, QPushButton, QVBoxLayout, QAction, \
    QMainWindow, QWidget


class Dialog(QMainWindow):
    """
    Classe définissant notre fenêtre principale.

    """

    def __init__(self, parent=None):
        """
        Initialiser chaque nouvelle instance de notre fenêtre.

        Args:
            parent: Widget qui va contenir notre boîte de dialogue.

        """
        super().__init__(parent=parent)
        # Changer le titre de la fenêtre et changer la position et taille
        self.setWindowTitle("Ma nouvelle fenêtre")
        self.setGeometry(50, 50, 640, 480)
        # Définir l'icône pour la fenêtre
        self.setWindowIcon(QIcon.fromTheme("exit"))
        # On crée manuellement des contrôles dans notre fenêtre et des menus
        self.edit = QLineEdit("Zone de texte")
        self.button = QPushButton("Appuyez ici !")
        self.menuentry1 = QAction(QIcon.fromTheme("exit"), "&Fin")
        self.menuentry2 = QAction(QIcon.fromTheme("sleep"), "&Dodo")
        self.filemenu = self.menuBar().addMenu("&File")
        self.filemenu.addAction(self.menuentry1)
        self.filemenu.addSeparator()
        self.filemenu.addAction(self.menuentry2)
        # Insérer un objet de mise en page dans notre fenêtre,
        # et y ajouter nos champ de texte et bouton
        frame = QWidget()
        layout = QVBoxLayout()
        layout.addWidget(self.edit)
        layout.addWidget(self.button)
        # Ajouter la mise en page au widget
        frame.setLayout(layout)
        # Définir le widget comme le contenu de la fenêtre
        self.setCentralWidget(frame)
        # Connecter le clic du bouton à la méthode "validate_button"
        self.button.clicked.connect(self.button_clicked)
        # Connecter la validation du menu1 à la même méthode
        self.menuentry1.triggered.connect(self.button_clicked)
        # Connecter la modification du champ de texte à une méthode
        self.edit.textEdited.connect(self.text_modified)

    def button_clicked(self):
        """
        On définit cette méthode pour répondre au clic sur un bouton.

        Il faut que l'on configure notre bouton pour que lorsqu'on clique
        dessus, cette méthode soit exécutée.

        """
        print(f"Vous avez saisi {self.edit.text()}")

    def text_modified(self):
        """
        On définit cette méthode pour répondre à la modification du champ texte.

        Cette méthode n'est pas spécifique à Qt, c'est juste qu'on peut lier
        des événements de contrôles Qt à des fonctions arbitraires. Et on
        va lier l'édition du champ de texte à cette méthode-ci.

        """
        print(f"{self.edit.text()}")


if __name__ == "__main__":
    # Créer une instance qui définit une application Qt
    # Via la variable "sys.argv", qui correspond aux arguments en ligne de commande
    # on peut configurer le comportement de notre application...
    # Également : notre application est un Singleton
    application = QApplication(sys.argv)
    # Ajouter notre boîte de dialogue
    dialog = Dialog()
    dialog.show()
    # Lancer la boucle Qt, qui ferme le programme quand on ferme toutes les fenêtres
    sys.exit(application.exec_())
