diff --git a/src/config/configure.py b/src/config/config_manager.py similarity index 97% rename from src/config/configure.py rename to src/config/config_manager.py index f103ffe..df38888 100644 --- a/src/config/configure.py +++ b/src/config/config_manager.py @@ -130,6 +130,9 @@ class ConfigManager: self.set(VOLUME_KEY, volume) # --------------- GETTERS MÉTIER ------------------------------- + def get_default(self, key: str): + return CONFIG_SCHEMA[key]["default"] + def get_discord_user(self) -> str: return cast(str, self.get(DISCORD_USER_KEY)) diff --git a/src/mainwindow.py b/src/mainwindow.py index 8411006..102a90e 100644 --- a/src/mainwindow.py +++ b/src/mainwindow.py @@ -9,7 +9,7 @@ from PySide6.QtUiTools import QUiLoader from PySide6.QtWidgets import QMainWindow, QApplication, QGraphicsDropShadowEffect from PySide6.QtMultimedia import QMediaPlayer, QAudioOutput -from config.configure import ConfigManager +from config.config_manager import ConfigManager, VOLUME_KEY # Compile resources.qrc into resources_rc.py # rcc -g python .\resources.qrc -o .\src\resources_rc.py @@ -50,13 +50,13 @@ class MainWindow(QMainWindow): # Initialisation de la configuration self.config = ConfigManager() + # Chargement de l'interface self.ui = QUiLoader().load(f"{bundle_dir}/ui/mainwindow.ui", self) - central = self.ui.centralWidget() - self.setCentralWidget(central) + self.setCentralWidget(self.ui.centralWidget()) - # # Remove the title bar and window frame + # Remove the title bar and window frame self.setWindowFlags(Qt.WindowType.FramelessWindowHint | Qt.WindowType.Window) - # # Optional: Make background transparent (if you want rounded corners, etc.) + # Optional: Make background transparent (if you want rounded corners, etc.) self.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground) # Initialize audio @@ -79,15 +79,17 @@ class MainWindow(QMainWindow): self.media_player.setSourceDevice(self.mp3buffer) - # Définir la valeur initiale du slider (ici: 10%) - #self.ui.audio_volume_adjust.setValue(10) - self.ui.audio_volume_adjust.setValue(self.config.get_volume()) - #self.audio_output.setVolume(0.1) - self.audio_output.setVolume(self.config.get_volume() / 100) + volume = self.config.get_volume() - # Initialisation de la mémoire du volume (par défaut 10%) - self.previous_volume = 10 - self.is_muted = False + # Définir la valeur initiale du slider (ici: 10%) + self.ui.audio_volume_adjust.setValue(volume) + self.audio_output.setVolume(volume / 100) + + self.is_muted = volume == 0 + self.previous_volume = volume if volume != 0 else self.config.get_default(VOLUME_KEY) + + if self.is_muted: + self.ui.mute_btn.setProperty("muted", True) # Connexion du Slider self.ui.audio_volume_adjust.valueChanged.connect(self.update_volume) @@ -104,38 +106,114 @@ class MainWindow(QMainWindow): self.ui.info_text.setMarkdown(patch_note) + self.setup_button_animation() + self.connect_signals() + + # On centre la fenêtre avant de l'afficher + self.center_window() + self.show() + + #------------------------------------------------------------------------------------------------------------ + + def setup_button_animation(self): + # 1. Création de l'effet de lueur intense - self.ui.connexion_btn.glow = QGraphicsDropShadowEffect(self.ui.connexion_btn) - self.ui.connexion_btn.glow.setBlurRadius(20) # Point de départ - self.ui.connexion_btn.glow.setOffset(0, 0) # Centré - self.ui.connexion_btn.glow.setColor(QColor(255, 140, 0, 255)) # Orange pur (Alpha max) - #self.ui.connexion_btn.setGraphicsEffect(self.ui.connexion_btn.glow) + glow = QGraphicsDropShadowEffect(self.ui.connexion_btn) + glow.setBlurRadius(20) # Point de départ + glow.setOffset(0, 0) # Centré + glow.setColor(QColor(255, 140, 0, 255)) # Orange pur (Alpha max) + + self.ui.connexion_btn.glow = glow # 2. Animation du "Pulse" avec une grande amplitude - self.ui.connexion_btn.pulse_anim = QPropertyAnimation(self.ui.connexion_btn.glow, b"blurRadius") - self.ui.connexion_btn.pulse_anim.setDuration(1200) # Un peu plus rapide pour le dynamisme - self.ui.connexion_btn.pulse_anim.setStartValue(15) # Lueur de base - self.ui.connexion_btn.pulse_anim.setKeyValueAt(0.5, 70) # Lueur d'explosion (très large) - self.ui.connexion_btn.pulse_anim.setEndValue(15) + anim = QPropertyAnimation(glow, b"blurRadius") + anim.setDuration(1200) # Un peu plus rapide pour le dynamisme + anim.setStartValue(15) # Lueur de base + anim.setKeyValueAt(0.5, 70) # Lueur d'explosion (très large) + anim.setEndValue(15) - self.ui.connexion_btn.pulse_anim.setEasingCurve(QEasingCurve.InOutQuad) - self.ui.connexion_btn.pulse_anim.setLoopCount(-1) - #self.ui.connexion_btn.pulse_anim.start() + anim.setEasingCurve(QEasingCurve.InOutQuad) + anim.setLoopCount(-1) + + self.ui.connexion_btn.pulse_anim = anim + + def connect_signals(self): - # Find the button by its objectName in Qt Designer - # Example: objectName = "close_btn" self.ui.close_btn.clicked.connect(self.close) self.ui.minimize_btn.clicked.connect(self.showMinimized) + self.ui.connexion_btn.clicked.connect(self.connexion_btn_link) self.ui.discord_btn.clicked.connect(self.discord_btn_link) self.ui.intranet_btn.clicked.connect(self.intranet_btn_link) self.ui.mute_btn.clicked.connect(self.mute_btn_link) - #self.show() + def set_volume(self, value): + self.audio_output.setVolume(value / 100) + self.ui.audio_volume_adjust.setValue(value) + self.config.set_volume(value) - # On centre la fenêtre avant de l'afficher - self.center_window() - self.show() + def update_volume(self, value): + # 'value' est l'entier venant du slider (ex: 0 à 100) + # On convertit en float pour QAudioOutput (0.0 à 1.0) + volume = value / 100.0 + self.audio_output.setVolume(volume) + self.config.set_volume(value) + + if volume == 0: + self.ui.mute_btn.setStyleSheet("background-color: red;") + + def mute_btn_link(self) -> None: + current_volume = self.ui.audio_volume_adjust.value() + + if current_volume == 0 and self.is_muted is False: + # volume déjà à 0 → restaurer le volume par défaut + default_volume = self.config.get_default(VOLUME_KEY) + + self.ui.audio_volume_adjust.setValue(default_volume) + self.audio_output.setVolume(default_volume / 100) + + self.config.set_volume(default_volume) + + self.ui.mute_btn.setStyleSheet("") + + return + + if not self.is_muted: + # --- PASSAGE EN MUTE --- + self.previous_volume = current_volume + + self.audio_output.setVolume(0.0) + self.ui.audio_volume_adjust.setValue(0) + + self.ui.mute_btn.setStyleSheet("background-color: red;") + + self.is_muted = True + self.config.set_volume(0) + + else: + # --- RESTAURATION --- + volume_float = self.previous_volume / 100 + + self.audio_output.setVolume(volume_float) + self.ui.audio_volume_adjust.setValue(self.previous_volume) + + self.ui.mute_btn.setStyleSheet("") + + self.is_muted = False + self.config.set_volume(self.previous_volume) + + @staticmethod + def connexion_btn_link(): + return None + + @staticmethod + def discord_btn_link(): + webbrowser.open('https://discord.gg/A7eanmSkp2') + + def intranet_btn_link(self): + webbrowser.open('https://la-taniere.fun/connexion/') + self.ui.connexion_btn.setGraphicsEffect(self.ui.connexion_btn.glow) + self.ui.connexion_btn.pulse_anim.start() def center_window(self): # On s'assure que la fenêtre a calculé sa taille @@ -170,56 +248,6 @@ class MainWindow(QMainWindow): self._drag_pos = None super().mouseReleaseEvent(event) - @staticmethod - def connexion_btn_link(): - return None - - @staticmethod - def discord_btn_link() -> None: - webbrowser.open('https://discord.gg/A7eanmSkp2') - return None - - def intranet_btn_link(self) -> None: - webbrowser.open('https://la-taniere.fun/connexion/') - self.ui.connexion_btn.setGraphicsEffect(self.ui.connexion_btn.glow) - self.ui.connexion_btn.pulse_anim.start() - return None - - def update_volume(self, value): - # 'value' est l'entier venant du slider (ex: 0 à 100) - # On convertit en float pour QAudioOutput (0.0 à 1.0) - volume = value / 100.0 - self.audio_output.setVolume(volume) - self.config.set_volume(value) - - def mute_btn_link(self) -> None: - if not self.is_muted: - # --- PASSAGE EN MUTE --- - # On sauvegarde la valeur actuelle du slider - self.previous_volume = self.ui.audio_volume_adjust.value() - - # On met le volume à 0 (moteur audio + interface) - self.audio_output.setVolume(0.0) - self.ui.audio_volume_adjust.setValue(0) - - # Optionnel : changer l'icône ou le style du bouton - self.ui.mute_btn.setStyleSheet("background-color: red;") - - self.is_muted = True - self.config.set_volume(0) - else: - # --- RETOUR DU SON --- - # On restaure le volume précédent - volume_float = self.previous_volume / 100.0 - self.audio_output.setVolume(volume_float) - self.ui.audio_volume_adjust.setValue(self.previous_volume) - - # Optionnel : remettre le style d'origine - self.ui.mute_btn.setStyleSheet("") - - self.is_muted = False - self.config.set_volume(self.previous_volume) - def closeEvent(self, event): self.config.save() super().closeEvent(event)