diff --git a/app/core/alert_manager.py b/app/core/alert_manager.py index bcd7aad..6a6ee25 100644 --- a/app/core/alert_manager.py +++ b/app/core/alert_manager.py @@ -36,3 +36,28 @@ class AlertManager: box.setDefaultButton(yes) box.exec() return box.clickedButton() == yes + + def show_choice_with_details(self, message: str, parent=None, details_callback=None) -> bool: + """ + Affiche une boîte de dialogue Oui/Non avec un bouton Détails. + Si detailed_text est fourni, l'ajoute comme texte détaillé (affichable par l'utilisateur). + Le callback details_callback est appelé lorsque l'utilisateur clique sur le bouton Détails. + """ + box = QMessageBox(parent) + box.setWindowTitle(self.language_manager.get_text("confirmation")) + box.setText(message) + box.setIcon(QMessageBox.Icon.Question) + yes = box.addButton(QMessageBox.StandardButton.Yes) + no = box.addButton(QMessageBox.StandardButton.No) + details = box.addButton(self.language_manager.get_text("details"), QMessageBox.ButtonRole.ActionRole) + yes.setText(self.language_manager.get_text("yes")) + no.setText(self.language_manager.get_text("no")) + box.setDefaultButton(yes) + + def on_button_clicked(button): + if button == details and details_callback: + details_callback() + + box.buttonClicked.connect(on_button_clicked) + box.exec() + return box.clickedButton() == yes \ No newline at end of file diff --git a/app/core/update_manager.py b/app/core/update_manager.py index 8778738..ffaac5a 100644 --- a/app/core/update_manager.py +++ b/app/core/update_manager.py @@ -1,7 +1,7 @@ import requests from packaging import version from PyQt6.QtWidgets import QApplication -from PyQt6.QtWidgets import QFileDialog, QDialog, QVBoxLayout +from PyQt6.QtWidgets import QFileDialog, QDialog, QVBoxLayout, QTextEdit, QPushButton, QHBoxLayout, QLabel from app.core.alert_manager import AlertManager from app.core.settings_manager import SettingsManager from app.core.language_manager import LanguageManager @@ -67,10 +67,7 @@ class UpdateManager: releases = self.get_releases_with_asset() release = releases[0] if releases else None if release and version.parse(release["tag_name"]) > version.parse(current_version): - choice = self.alert_manager.show_choice( - self.language_manager.get_text("update_found").replace("{latest_tag}", release["tag_name"]), - parent=parent - ) + choice = self.show_update_dialog(releases, current_version, parent) if choice: folder = QFileDialog.getExistingDirectory(parent, self.language_manager.get_text("choose_update_folder")) if folder: @@ -114,3 +111,64 @@ class UpdateManager: subprocess.Popen([local_path]) except Exception: self.alert_manager.show_error("update_download_error", parent=parent) + + def show_update_dialog(self, releases: List[Dict], current_version: str, parent=None) -> bool: + """ + Affiche une boîte de dialogue avec options Mettre à jour et Détails via l'alert_manager + """ + latest_release = releases[0] + message = self.language_manager.get_text("update_found").replace("{latest_tag}", latest_release["tag_name"]) + + # Utiliser l'alert_manager avec boutons personnalisés + choice = self.alert_manager.show_choice_with_details( + message, + parent=parent, + details_callback=lambda: self.show_details_dialog(releases, current_version, parent) + ) + + return choice + + def show_details_dialog(self, releases: List[Dict], current_version: str, parent=None) -> None: + """ + Affiche tous les changelogs des versions supérieures à la version actuelle + """ + dialog = QDialog(parent) + dialog.setWindowTitle(self.language_manager.get_text("update_details")) + dialog.setModal(True) + dialog.resize(600, 500) + + layout = QVBoxLayout(dialog) + + # Zone de texte pour afficher les changelogs + text_edit = QTextEdit() + text_edit.setReadOnly(True) + + # Filtrer et trier les releases supérieures à la version actuelle + newer_releases = [] + for release in releases: + if version.parse(release["tag_name"]) > version.parse(current_version): + newer_releases.append(release) + + # Trier par version décroissante (plus récente en premier) + newer_releases.sort(key=lambda x: version.parse(x["tag_name"]), reverse=True) + + # Construire le texte des changelogs + changelog_text = "" + for release in newer_releases: + changelog_text += f"## {self.language_manager.get_text('version')} {release['tag_name']} :\n\n" + body = release['body'].replace('\n','\n### ') + changelog_text += f"### {body}" + changelog_text += "\n\n" + if release != newer_releases[-1]: + changelog_text += "---\n\n" + print(changelog_text) + text_edit.setAcceptRichText(True) + text_edit.setMarkdown(changelog_text) + layout.addWidget(text_edit) + + # Bouton Fermer + close_button = QPushButton(self.language_manager.get_text("close")) + close_button.clicked.connect(dialog.close) + layout.addWidget(close_button) + + dialog.exec() diff --git a/config.json b/config.json index c51be8f..ca6a66c 100644 --- a/config.json +++ b/config.json @@ -1,9 +1,9 @@ { - "app_name": "Application", + "app_name": "HoDA", "app_os": "Windows", "app_version": "1.0.0", "architecture": "x64", "icon_path": "data/assets/icon.ico", "main_script": "main.py", - "git_repo": "https://gitea.louismazin.ovh/LouisMazin/PythonApplicationTemplate" + "git_repo": "https://gitea.louismazin.ovh/LouisMazin/HoDA" } \ No newline at end of file diff --git a/data/lang/en.json b/data/lang/en.json index f1d7e77..547050b 100644 --- a/data/lang/en.json +++ b/data/lang/en.json @@ -24,5 +24,9 @@ "update_download_error": "Error downloading update", "downloading_update": "Downloading update...", "update": "Update", - "footer_text": "© 2025 Louis Mazin. All rights reserved." + "footer_text": "© 2025 Louis Mazin. All rights reserved.", + "details": "Details", + "version": "Version", + "update_details": "Update Details", + "close": "Close" } \ No newline at end of file diff --git a/data/lang/fr.json b/data/lang/fr.json index 971ad07..c6f2e02 100644 --- a/data/lang/fr.json +++ b/data/lang/fr.json @@ -24,5 +24,9 @@ "update_download_error": "Erreur lors du téléchargement de la mise à jour", "downloading_update": "Téléchargement de la mise à jour...", "update": "Mise à jour", - "footer_text": "© 2025 Louis Mazin. Tous droits réservés." + "footer_text": "© 2025 Louis Mazin. Tous droits réservés.", + "details": "Détails", + "version": "Version", + "update_details": "Détails de la mise à jour", + "close": "Fermer" } \ No newline at end of file