From 2f67e5cab182417c501e82300599e14b08e4ccb7 Mon Sep 17 00:00:00 2001 From: skymike03 Date: Thu, 31 Jul 2025 14:14:58 +0200 Subject: [PATCH] Ajout option pour desactiver la musique depuis le menu pause --- __main__.py | 7 +++++++ config.py | 12 +++--------- controls.py | 25 +++++++++++++++++-------- display.py | 9 +++++++++ languages/fr.json | 5 +++++ utils.py | 31 +++++++++++++++++++++++++++++-- 6 files changed, 70 insertions(+), 19 deletions(-) diff --git a/__main__.py b/__main__.py index 820bb10..a3aa4c2 100644 --- a/__main__.py +++ b/__main__.py @@ -98,11 +98,16 @@ config.repeat_last_action = 0 music_folder = os.path.join(config.APP_FOLDER, "assets", "music") music_files = [f for f in os.listdir(music_folder) if f.lower().endswith(('.ogg', '.mp3'))] current_music = None # Variable pour suivre la musique en cours +config.music_folder = music_folder +config.music_files = music_files +config.current_music = current_music + if music_files: current_music = play_random_music(music_files, music_folder, current_music) else: logger.debug("Aucune musique trouvée dans config.APP_FOLDER/assets/music") +config.current_music = current_music # Met à jour la musique en cours dans config # Chargement de l'historique config.history = load_history() @@ -133,6 +138,8 @@ if pygame.joystick.get_count() > 0: # Initialisation du mixer Pygame pygame.mixer.pre_init(44100, -16, 2, 4096) pygame.mixer.init() +from utils import load_music_config +load_music_config() # Boucle principale diff --git a/config.py b/config.py index d26a6f0..a8c7ada 100644 --- a/config.py +++ b/config.py @@ -49,7 +49,6 @@ SYSTEM_FOLDER = get_system_root() APP_FOLDER = os.path.join(get_application_root(), "RGSX") ROMS_FOLDER = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(APP_FOLDER))), "roms") SAVE_FOLDER = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(APP_FOLDER))), "saves", "ports", "rgsx") - # Configuration du logging logger = logging.getLogger(__name__) log_dir = os.path.join(APP_FOLDER, "logs") @@ -64,8 +63,7 @@ CONTROLS_CONFIG_PATH = os.path.join(SAVE_FOLDER, "controls.json") HISTORY_PATH = os.path.join(SAVE_FOLDER, "history.json") LANGUAGE_CONFIG_PATH = os.path.join(SAVE_FOLDER, "language.json") JSON_EXTENSIONS = os.path.join(APP_FOLDER, "rom_extensions.json") - - +MUSIC_CONFIG_PATH = os.path.join(SAVE_FOLDER, "music_config.json") # URL @@ -102,6 +100,7 @@ transition_state = "idle" transition_progress = 0.0 transition_duration = 18 games_count = {} +music_enabled = True # Par défaut la musique est activée API_KEY_1FICHIER = "" # Initialisation de la variable globale pour la clé API # Variables pour la sélection de langue @@ -205,9 +204,4 @@ def validate_resolution(): if SCREEN_WIDTH > display_info.current_w or SCREEN_HEIGHT > display_info.current_h: logger.warning(f"Résolution {SCREEN_WIDTH}x{SCREEN_HEIGHT} dépasse les limites de l'écran") return display_info.current_w, display_info.current_h - return SCREEN_WIDTH, SCREEN_HEIGHT - - - - - + return SCREEN_WIDTH, SCREEN_HEIGHT \ No newline at end of file diff --git a/controls.py b/controls.py index f5a02d9..3a84b0b 100644 --- a/controls.py +++ b/controls.py @@ -9,7 +9,7 @@ import json import os from display import draw_validation_transition from network import download_rom, download_from_1fichier, is_1fichier_url -from utils import load_games, check_extension_before_download, is_extension_supported, load_extensions_json, sanitize_filename, load_api_key_1fichier +from utils import load_games, check_extension_before_download, is_extension_supported, load_extensions_json, play_random_music, sanitize_filename, load_api_key_1fichier, save_music_config from history import load_history, clear_history, add_to_history, save_history import logging from language import _ # Import de la fonction de traduction @@ -861,16 +861,11 @@ def handle_controls(event, sources, joystick, screen): #logger.debug(f"État pause_menu, selected_option={config.selected_option}, événement={event.type}, valeur={getattr(event, 'value', None)}") if is_input_matched(event, "up"): config.selected_option = max(0, config.selected_option - 1) - # La répétition est gérée par update_key_state config.needs_redraw = True - #logger.debug(f"Navigation vers le haut: selected_option={config.selected_option}") elif is_input_matched(event, "down"): - config.selected_option = min(6, config.selected_option + 1) - # La répétition est gérée par update_key_state + config.selected_option = min(7, config.selected_option + 1) # 7 options maintenant config.needs_redraw = True - #logger.debug(f"Navigation vers le bas: selected_option={config.selected_option}") elif is_input_matched(event, "confirm"): - #logger.debug(f"Confirmation dans pause_menu avec selected_option={config.selected_option}") if config.selected_option == 0: # Controls config.previous_menu_state = validate_menu_state(config.previous_menu_state) config.menu_state = "controls_help" @@ -914,7 +909,21 @@ def handle_controls(event, sources, joystick, screen): config.redownload_confirm_selection = 0 config.needs_redraw = True logger.debug(f"Passage à redownload_game_cache depuis pause_menu") - elif config.selected_option == 6: # Quit + elif config.selected_option == 6: # Music toggle + config.music_enabled = not config.music_enabled + save_music_config() + if config.music_enabled: + # Relancer la musique si activée + # Utilise les variables globales si elles existent + music_files = getattr(config, "music_files", None) + music_folder = getattr(config, "music_folder", None) + if music_files and music_folder: + config.current_music = play_random_music(music_files, music_folder, getattr(config, "current_music", None)) + else: + pygame.mixer.music.stop() + config.needs_redraw = True + logger.info(f"Musique {'activée' if config.music_enabled else 'désactivée'} via menu pause") + elif config.selected_option == 7: # Quit config.previous_menu_state = validate_menu_state(config.previous_menu_state) config.menu_state = "confirm_exit" config.confirm_selection = 0 diff --git a/display.py b/display.py index a250912..fcfcad4 100644 --- a/display.py +++ b/display.py @@ -1161,6 +1161,13 @@ def draw_pause_menu(screen, selected_option): """Dessine le menu pause avec un style moderne.""" screen.blit(OVERLAY, (0, 0)) + # Option musique dynamique + if config.music_enabled: + music_name = config.current_music_name or "" + music_option = _("menu_music_enabled").format(music_name) + else: + music_option = _("menu_music_disabled") + options = [ _("menu_controls"), _("menu_remap_controls"), @@ -1168,6 +1175,7 @@ def draw_pause_menu(screen, selected_option): _("menu_language"), _("menu_accessibility"), _("menu_redownload_cache"), + music_option, # Ici l'option dynamique _("menu_quit") ] @@ -1290,6 +1298,7 @@ def draw_controls_help(screen, previous_state): control_columns = state_controls.get(previous_state, {}) if not control_columns: + return screen.blit(OVERLAY, (0, 0)) diff --git a/languages/fr.json b/languages/fr.json index 79d5f84..6c686fe 100644 --- a/languages/fr.json +++ b/languages/fr.json @@ -70,6 +70,9 @@ "menu_accessibility": "Accessibilité", "menu_redownload_cache": "Retélécharger le cache des jeux", "menu_quit": "Quitter", + "menu_music_toggle": "Activer/Désactiver la musique", + "menu_music_enabled": "Musique activée : {0}", + "menu_music_disabled": "Musique désactivée", "button_yes": "Oui", "button_no": "Non", @@ -94,6 +97,7 @@ "controls_action_delete": "Supprimer", "controls_action_space": "Espace", "controls_action_start": "Aide / Réglages", + "controls_action_music_toggle": "Musique On/Off", "controls_desc_confirm": "Valider (ex: A, Entrée)", "controls_desc_cancel": "Annuler/Retour (ex: B, RetourArrière)", @@ -109,6 +113,7 @@ "controls_desc_delete": "Supprimer caractère (ex: LT, Suppr)", "controls_desc_space": "Ajouter espace (ex: RT, Espace)", "controls_desc_start": "Ouvrir le menu pause (ex: Start, AltGr)", + "controls_desc_music_toggle": "Active ou désactive la musique de fond", "footer_version": "RGSX v{0} - {1} : Options - {2}: Historique - {3} : Filtrer", diff --git a/utils.py b/utils.py index bccf36e..d9c8e09 100644 --- a/utils.py +++ b/utils.py @@ -602,7 +602,9 @@ def extract_rar(rar_path, dest_dir, url): logger.error(f"Erreur lors de la suppression de {rar_path}: {str(e)}") def play_random_music(music_files, music_folder, current_music=None): - """Joue une musique aléatoire et configure l'événement de fin de manière non-bloquante.""" + if not getattr(config, "music_enabled", True): + pygame.mixer.music.stop() + return current_music if music_files: # Éviter de rejouer la même musique consécutivement available_music = [f for f in music_files if f != current_music] @@ -665,4 +667,29 @@ def load_api_key_1fichier(): return api_key except OSError as e: logger.error(f"Erreur lors de la lecture de la clé API : {e}") - return "" \ No newline at end of file + return "" + +def load_music_config(): + """Charge la configuration musique depuis music_config.json.""" + path = config.MUSIC_CONFIG_PATH + try: + if os.path.exists(path): + with open(path, "r", encoding="utf-8") as f: + data = json.load(f) + config.music_enabled = data.get("music_enabled", True) + return config.music_enabled + except Exception as e: + logger.error(f"Erreur lors du chargement de music_config.json: {str(e)}") + config.music_enabled = True + return True + +def save_music_config(): + """Sauvegarde la configuration musique dans music_config.json.""" + path = config.MUSIC_CONFIG_PATH + try: + os.makedirs(config.SAVE_FOLDER, exist_ok=True) + with open(path, "w", encoding="utf-8") as f: + json.dump({"music_enabled": config.music_enabled}, f, indent=2) + logger.debug(f"Configuration musique sauvegardée: {config.music_enabled}") + except Exception as e: + logger.error(f"Erreur lors de la sauvegarde de music_config.json: {str(e)}") \ No newline at end of file