Files

236 lines
8.9 KiB
Markdown
Raw Permalink Normal View History

# Architecture GUI Refactorée
## Vue d'ensemble
Le fichier `gui.py` a été refactorisé pour améliorer la maintenabilité en divisant la classe `MainWindow` monolithique (1837 lignes) en plusieurs modules organisés dans le dossier `gui/`.
## Structure des fichiers
```
tidal_dl_ng/
├── gui/
│ ├── __init__.py # Point d'entrée du module GUI
│ ├── activate.py # Fonction d'activation de l'application GUI
│ ├── main_window.py # Classe MainWindow principale
│ ├── initialization.py # Mixin: Initialisation des composants UI
│ ├── tidal_session.py # Mixin: Gestion de la session Tidal
│ ├── signals.py # Mixin: Gestion des signaux Qt
│ ├── progress.py # Mixin: Barres de progression
│ ├── ui_helpers.py # Mixin: Helpers UI (spinners, logs, statusbar)
│ ├── track_extras.py # Mixin: Cache et gestion des extras de tracks
│ ├── updates.py # Mixin: Vérification des mises à jour
│ ├── downloads.py # Mixin: Gestion des téléchargements
│ ├── trees_results.py # Mixin: Gestion des arbres et résultats
│ ├── context_menus.py # Mixin: Menus contextuels et actions
│ ├── history.py # Mixin: Historique et prévention des doublons
│ ├── covers.py # Manager de couvertures
│ ├── playlist.py # Manager de playlists
│ ├── queue.py # Manager de queue
│ └── search.py # Manager de recherche
├── gui.py # Point de compatibilité (redirige vers gui/)
```
## Mixins et Responsabilités
### 1. InitializationMixin (`initialization.py`)
Responsable de l'initialisation de tous les composants de l'interface utilisateur.
**Méthodes:**
- `_init_gui()` - Configuration de la fenêtre principale
- `_init_threads()` - Initialisation du pool de threads
- `_init_dl()` - Configuration de l'objet Download
- `_init_progressbar()` - Initialisation des barres de progression
- `_init_info()` - Configuration de l'image de couverture par défaut
- `_init_tree_results()` - Configuration de l'arbre des résultats
- `_init_tree_results_model()` - Configuration du modèle de l'arbre
- `_init_tree_queue()` - Configuration de la queue de téléchargement
- `_init_tree_lists()` - Configuration de l'arbre des listes utilisateur
- `_init_menu_actions()` - Ajout d'actions de menu personnalisées
- `_populate_quality()` - Remplissage des options de qualité
- `_populate_search_types()` - Remplissage des types de recherche
### 2. TidalSessionMixin (`tidal_session.py`)
Gère l'authentification et la session Tidal.
**Méthodes:**
- `init_tidal()` - Initialisation de la session Tidal avec gestion du login
- `on_logout()` - Déconnexion de Tidal
### 3. SignalsMixin (`signals.py`)
Configure toutes les connexions de signaux Qt.
**Méthodes:**
- `_init_signals()` - Connexion de tous les signaux aux slots
- `on_result_item_clicked()` - Gestion du clic sur un élément de résultat
- `on_quality_set_audio()` - Configuration de la qualité audio
- `on_quality_set_video()` - Configuration de la qualité vidéo
### 4. ProgressMixin (`progress.py`)
Gère les barres de progression.
**Méthodes:**
- `on_progress_reset()` - Réinitialisation des barres de progression
- `on_progress_list()` - Mise à jour de la barre de progression de liste
- `on_progress_item()` - Mise à jour de la barre de progression d'élément
- `on_progress_item_name()` - Définition du nom d'élément
- `on_progress_list_name()` - Définition du nom de liste
### 5. UIHelpersMixin (`ui_helpers.py`)
Fournit des fonctions utilitaires pour l'interface utilisateur.
**Méthodes:**
- `on_spinner_start()` - Démarrage d'un spinner de chargement
- `on_spinner_stop()` - Arrêt de tous les spinners
- `on_statusbar_message()` - Affichage d'un message dans la barre d'état
- `_log_output()` - Redirection des logs vers l'interface
- `button_reload_status()` - Mise à jour du statut du bouton de rechargement
### 6. TrackExtrasMixin (`track_extras.py`)
Gère le cache et la récupération des informations supplémentaires des tracks.
**Méthodes:**
- `get_track_extras()` - Récupération des extras (avec cache)
- `_on_invoke_callback()` - Invocation du callback dans le thread principal
- `_decorate_extras()` - Ajout de champs formatés aux extras
- `preload_covers_for_playlist()` - Préchargement des couvertures
### 7. UpdatesMixin (`updates.py`)
Gère la vérification des mises à jour de l'application.
**Méthodes:**
- `on_update_check()` - Vérification des mises à jour disponibles
- `on_version()` - Affichage du dialogue de version
### 8. DownloadsMixin (`downloads.py`)
Gère la queue de téléchargement et les opérations de téléchargement.
**Méthodes:**
- `on_download_results()` - Téléchargement des résultats sélectionnés
- `queue_download_media()` - Ajout d'un élément à la queue
- `watcher_queue_download()` - Surveillance de la queue
- `on_queue_download()` - Exécution d'un téléchargement
- `download()` - Téléchargement d'un élément média
- Méthodes de gestion de statut: `on_queue_download_item_downloading()`, etc.
### 9. TreesResultsMixin (`trees_results.py`)
Gère les arbres de vue et l'affichage des résultats.
**Méthodes:**
- `handle_filter_activated()` - Gestion des filtres d'en-tête
- `populate_tree_results()` - Remplissage de l'arbre des résultats
- `populate_tree_result_child()` - Création d'un élément enfant
- `on_tr_results_expanded()` - Gestion de l'expansion des résultats
- `tr_results_expanded()` - Chargement des enfants d'un élément
- `list_items_show_result()` - Affichage des éléments d'une liste
- `tidal_user_lists()` - Récupération des listes utilisateur
- `on_populate_tree_lists()` - Remplissage de l'arbre des listes
- `on_track_hover_confirmed()` - Gestion du survol d'un track
- `on_track_hover_left()` - Gestion de la sortie du survol
### 10. ContextMenusMixin (`context_menus.py`)
Gère les menus contextuels et leurs actions.
**Méthodes:**
- `menu_context_tree_results()` - Menu contextuel pour les résultats
- `menu_context_queue_download()` - Menu contextuel pour la queue
- `on_copy_url_share()` - Copie de l'URL de partage
- `on_download_album_from_track()` - Téléchargement de l'album d'un track
- `on_download_all_albums_from_playlist()` - Téléchargement de tous les albums
- `_extract_album_ids_from_tracks()` - Extraction des IDs d'albums
- `_load_albums_with_rate_limiting()` - Chargement avec limitation de débit
- `on_search_in_app()` - Recherche dans l'application
- `on_search_in_browser()` - Ouverture de recherche dans le navigateur
### 11. HistoryMixin (`history.py`)
Gère l'historique des téléchargements et la prévention des doublons.
**Méthodes:**
- `on_view_history()` - Affichage du dialogue d'historique
- `on_toggle_duplicate_prevention()` - Activation/désactivation de la prévention
- `on_mark_track_as_downloaded()` - Marquer un track comme téléchargé
- `on_mark_track_as_not_downloaded()` - Retirer le marquage
- `_update_downloaded_column()` - Mise à jour de la colonne UI
- `on_preferences()` - Ouverture du dialogue de préférences
- `on_settings_save()` - Sauvegarde des paramètres
## Classe MainWindow
La classe `MainWindow` hérite de tous les mixins et de `QtWidgets.QMainWindow` + `Ui_MainWindow`:
```python
class MainWindow(
QtWidgets.QMainWindow,
Ui_MainWindow,
InitializationMixin,
TidalSessionMixin,
SignalsMixin,
ProgressMixin,
UIHelpersMixin,
TrackExtrasMixin,
UpdatesMixin,
DownloadsMixin,
TreesResultsMixin,
ContextMenusMixin,
HistoryMixin,
):
...
```
## Compatibilité
Le fichier `gui.py` original est maintenu comme point de compatibilité :
- Redirige les imports vers `tidal_dl_ng.gui`
- Conserve les directives de compilation nuitka
- Permet une migration progressive
## Avantages de cette architecture
1. **Maintenabilité** : Chaque mixin a une responsabilité claire et limitée
2. **Lisibilité** : Fichiers plus petits et focalisés (100-300 lignes vs 1837)
3. **Testabilité** : Les mixins peuvent être testés individuellement
4. **Extensibilité** : Facile d'ajouter de nouvelles fonctionnalités
5. **Réutilisabilité** : Les mixins peuvent être réutilisés si nécessaire
6. **Organisation** : Structure logique par fonctionnalité
## Migration
Pour utiliser la nouvelle structure :
```python
# Ancienne méthode (toujours supportée)
from tidal_dl_ng.gui import gui_activate
# Nouvelle méthode recommandée
from tidal_dl_ng.gui import MainWindow
from tidal_dl_ng.gui.activate import gui_activate
```
## Notes
- Les avertissements IDE sur les "unresolved attributes" dans les mixins sont normaux
- Les mixins accèdent à `self` qui sera fourni par `MainWindow` via l'héritage multiple
- L'ordre des mixins dans l'héritage est important pour la résolution de méthode (MRO)