# Annexe : Application - Paramètres

## Rôle et utilité

`apps/parametres/app.py` est le panneau de contrôle de GrimOS. C'est l'interface graphique qui permet à l'utilisateur de modifier le fond d'écran ou de changer le thème global du système (couleurs et bordures) sans avoir à ouvrir de fichiers de configuration manuellement.

## Implémentation technique

- Lecture du registre de Thèmes : Le script importe directement la variable `THEMES` depuis `core.theme` pour récupérer la liste de tous les thèmes visuels disponibles (Win 98, Ubuntu, etc.) et les injecte dans une liste déroulante Tkinter (`ttk.Combobox`).
- Interaction avec `config.py` : Lorsqu'une modification est validée, l'application utilise la fonction `set_setting("theme", nouveau_theme)` du module système `core.config`, garantissant ainsi que la modification sera sauvegardée de façon persistante sur le disque dur.
- Rechargement à chaud (Hot-Reload) : Après avoir sauvegardé, l'application exécute un appel direct à la fonction de mise à jour du bureau (`app_manager.desktop.update_desktop_bg()`) et au moteur de thème pour que les couleurs de l'écran changent instantanément, sans qu'il soit nécessaire de redémarrer la session.

## Pistes de modification

- Gestion de l'heure et de la date : Ajouter un onglet permettant d'utiliser la commande système `date -s` (avec `sudo` via le mot de passe stocké) pour régler l'horloge de l'ordinateur, ou pour configurer un serveur NTP.
- Options d'alimentation : On pourrait y ajouter des curseurs permettant de configurer la luminosité de l'écran (en modifiant `/sys/class/backlight`) ou de gérer le délai avant la mise en veille de la machine (via `xset`).

## Code Source

    import tkinter as tk
    from tkinter import messagebox
    from tkinter import colorchooser
    import json
    import os

    def start(window, app_manager=None, **kwargs):
        frame = tk.Frame(window, bg="white")
        frame.pack(fill="both", expand=True, padx=10, pady=10)

        tk.Label(frame, text="Paramètres du Système", font=("Arial", 14, "bold"), bg="white").pack(pady=10)
        desktop = app_manager.desktop

        # --- THÈMES ---
        tk.Label(frame, text="Thème de l'interface :", font=("Arial", 12, "bold"), bg="white").pack(pady=5)

        import sys, os
        sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
        from core.theme import THEMES

        theme_var = tk.StringVar(value=desktop.settings.get("theme", "GrimOS"))
        theme_frame = tk.Frame(frame, bg="white")
        theme_frame.pack(fill="x", pady=5)

        theme_menu = tk.OptionMenu(theme_frame, theme_var, *THEMES.keys())
        theme_menu.pack(side="left", padx=5)

        def apply_theme_setting():
            desktop.settings["theme"] = theme_var.get()
            try:
                settings_path = os.path.join(
                    os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))),
                    "config", "settings.json"
                )
                with open(settings_path, "w", encoding="utf-8") as f:
                    json.dump(desktop.settings, f, indent=4)

                desktop.restart_requested = True
                desktop.save_and_quit()
            except Exception as e:
                import traceback
                with open("/tmp/grimos_theme_error.txt", "w") as f:
                    f.write(traceback.format_exc())
                messagebox.showerror("Erreur", f"Erreur détaillée sauvegardée dans /tmp/grimos_theme_error.txt\n{str(e)}")

        tk.Button(theme_frame, text=" Appliquer", image=(app_manager.desktop.icons.get("btn_apply") if app_manager else None), compound="left", command=apply_theme_setting).pack(side="left", padx=5)

        tk.Frame(frame, height=2, bg="black").pack(fill="x", pady=10)
        tk.Label(frame, text="Sécurité / Système :", font=("Arial", 12, "bold"), bg="white").pack(pady=5)

        sudo_frame = tk.Frame(frame, bg="white")
        sudo_frame.pack(fill="x", pady=2)
        tk.Label(sudo_frame, text="Mot de passe Sudo :", bg="white").pack(side="left", padx=5)

        sudo_entry = tk.Entry(sudo_frame, width=15)
        sudo_entry.pack(side="left", padx=5)
        sudo_entry.insert(0, desktop.settings.get("sudo_pwd", ""))

        def save_sudo():
            desktop.settings["sudo_pwd"] = sudo_entry.get()
            try:
                settings_path = os.path.join(
                    os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))),
                    "config", "settings.json"
                )
                with open(settings_path, "w", encoding="utf-8") as f:
                    json.dump(desktop.settings, f, indent=4)
                messagebox.showinfo("Succès", "Mot de passe système (Sudo) enregistré avec succès.")
            except Exception as e:
                messagebox.showerror("Erreur", str(e))

        tk.Button(sudo_frame, text=" Enregistrer", image=(app_manager.desktop.icons.get("menu_save") if app_manager else None), compound="left", command=save_sudo).pack(side="left", padx=5)

        cpu_frame = tk.Frame(frame, bg="white")
        cpu_frame.pack(fill="x", pady=2)
        tk.Label(cpu_frame, text="Largeur Graphique CPU :", bg="white").pack(side="left", padx=5)

        cpu_entry = tk.Entry(cpu_frame, width=5)
        cpu_entry.pack(side="left", padx=5)
        cpu_entry.insert(0, str(desktop.settings.get("cpu_graph_width", 10)))

        def save_cpu_width():
            try:
                val = int(cpu_entry.get())
                if val < 1 or val > 50:
                    raise ValueError("La valeur doit être entre 1 et 50.")
                desktop.settings["cpu_graph_width"] = val
                settings_path = os.path.join(
                    os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))),
                    "config", "settings.json"
                )
                with open(settings_path, "w", encoding="utf-8") as f:
                    json.dump(desktop.settings, f, indent=4)
                messagebox.showinfo("Succès", "Largeur du graphique CPU enregistrée.\nL'effet sera immédiat sur la barre des tâches.")
            except Exception as e:
                messagebox.showerror("Erreur", str(e))

        tk.Button(cpu_frame, text=" Enregistrer", image=(app_manager.desktop.icons.get("menu_save") if app_manager else None), compound="left", command=save_cpu_width).pack(side="left", padx=5)