refacto pour simplifier la maintenance. Voir à séparer dans des sous class plus tard

This commit is contained in:
2026-03-13 12:20:16 +01:00
parent 13b591a157
commit 983d584015
2 changed files with 113 additions and 82 deletions

View File

@@ -130,6 +130,9 @@ class ConfigManager:
self.set(VOLUME_KEY, volume) self.set(VOLUME_KEY, volume)
# --------------- GETTERS MÉTIER ------------------------------- # --------------- GETTERS MÉTIER -------------------------------
def get_default(self, key: str):
return CONFIG_SCHEMA[key]["default"]
def get_discord_user(self) -> str: def get_discord_user(self) -> str:
return cast(str, self.get(DISCORD_USER_KEY)) return cast(str, self.get(DISCORD_USER_KEY))

View File

@@ -9,7 +9,7 @@ from PySide6.QtUiTools import QUiLoader
from PySide6.QtWidgets import QMainWindow, QApplication, QGraphicsDropShadowEffect from PySide6.QtWidgets import QMainWindow, QApplication, QGraphicsDropShadowEffect
from PySide6.QtMultimedia import QMediaPlayer, QAudioOutput 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 # Compile resources.qrc into resources_rc.py
# rcc -g python .\resources.qrc -o .\src\resources_rc.py # rcc -g python .\resources.qrc -o .\src\resources_rc.py
@@ -50,13 +50,13 @@ class MainWindow(QMainWindow):
# Initialisation de la configuration # Initialisation de la configuration
self.config = ConfigManager() self.config = ConfigManager()
# Chargement de l'interface
self.ui = QUiLoader().load(f"{bundle_dir}/ui/mainwindow.ui", self) self.ui = QUiLoader().load(f"{bundle_dir}/ui/mainwindow.ui", self)
central = self.ui.centralWidget() self.setCentralWidget(self.ui.centralWidget())
self.setCentralWidget(central)
# # Remove the title bar and window frame # Remove the title bar and window frame
self.setWindowFlags(Qt.WindowType.FramelessWindowHint | Qt.WindowType.Window) 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) self.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground)
# Initialize audio # Initialize audio
@@ -79,15 +79,17 @@ class MainWindow(QMainWindow):
self.media_player.setSourceDevice(self.mp3buffer) self.media_player.setSourceDevice(self.mp3buffer)
# Définir la valeur initiale du slider (ici: 10%) volume = self.config.get_volume()
#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)
# Initialisation de la mémoire du volume (par défaut 10%) # Définir la valeur initiale du slider (ici: 10%)
self.previous_volume = 10 self.ui.audio_volume_adjust.setValue(volume)
self.is_muted = False 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 # Connexion du Slider
self.ui.audio_volume_adjust.valueChanged.connect(self.update_volume) 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.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 # 1. Création de l'effet de lueur intense
self.ui.connexion_btn.glow = QGraphicsDropShadowEffect(self.ui.connexion_btn) glow = QGraphicsDropShadowEffect(self.ui.connexion_btn)
self.ui.connexion_btn.glow.setBlurRadius(20) # Point de départ glow.setBlurRadius(20) # Point de départ
self.ui.connexion_btn.glow.setOffset(0, 0) # Centré glow.setOffset(0, 0) # Centré
self.ui.connexion_btn.glow.setColor(QColor(255, 140, 0, 255)) # Orange pur (Alpha max) glow.setColor(QColor(255, 140, 0, 255)) # Orange pur (Alpha max)
#self.ui.connexion_btn.setGraphicsEffect(self.ui.connexion_btn.glow)
self.ui.connexion_btn.glow = glow
# 2. Animation du "Pulse" avec une grande amplitude # 2. Animation du "Pulse" avec une grande amplitude
self.ui.connexion_btn.pulse_anim = QPropertyAnimation(self.ui.connexion_btn.glow, b"blurRadius") anim = QPropertyAnimation(glow, b"blurRadius")
self.ui.connexion_btn.pulse_anim.setDuration(1200) # Un peu plus rapide pour le dynamisme anim.setDuration(1200) # Un peu plus rapide pour le dynamisme
self.ui.connexion_btn.pulse_anim.setStartValue(15) # Lueur de base anim.setStartValue(15) # Lueur de base
self.ui.connexion_btn.pulse_anim.setKeyValueAt(0.5, 70) # Lueur d'explosion (très large) anim.setKeyValueAt(0.5, 70) # Lueur d'explosion (très large)
self.ui.connexion_btn.pulse_anim.setEndValue(15) anim.setEndValue(15)
self.ui.connexion_btn.pulse_anim.setEasingCurve(QEasingCurve.InOutQuad) anim.setEasingCurve(QEasingCurve.InOutQuad)
self.ui.connexion_btn.pulse_anim.setLoopCount(-1) anim.setLoopCount(-1)
#self.ui.connexion_btn.pulse_anim.start()
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.close_btn.clicked.connect(self.close)
self.ui.minimize_btn.clicked.connect(self.showMinimized) self.ui.minimize_btn.clicked.connect(self.showMinimized)
self.ui.connexion_btn.clicked.connect(self.connexion_btn_link) self.ui.connexion_btn.clicked.connect(self.connexion_btn_link)
self.ui.discord_btn.clicked.connect(self.discord_btn_link) self.ui.discord_btn.clicked.connect(self.discord_btn_link)
self.ui.intranet_btn.clicked.connect(self.intranet_btn_link) self.ui.intranet_btn.clicked.connect(self.intranet_btn_link)
self.ui.mute_btn.clicked.connect(self.mute_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 def update_volume(self, value):
self.center_window() # 'value' est l'entier venant du slider (ex: 0 à 100)
self.show() # 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): def center_window(self):
# On s'assure que la fenêtre a calculé sa taille # On s'assure que la fenêtre a calculé sa taille
@@ -170,56 +248,6 @@ class MainWindow(QMainWindow):
self._drag_pos = None self._drag_pos = None
super().mouseReleaseEvent(event) 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): def closeEvent(self, event):
self.config.save() self.config.save()
super().closeEvent(event) super().closeEvent(event)