8.9 KiB
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 loginon_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 slotson_result_item_clicked()- Gestion du clic sur un élément de résultaton_quality_set_audio()- Configuration de la qualité audioon_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 progressionon_progress_list()- Mise à jour de la barre de progression de listeon_progress_item()- Mise à jour de la barre de progression d'élémenton_progress_item_name()- Définition du nom d'élémenton_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 chargementon_spinner_stop()- Arrêt de tous les spinnerson_statusbar_message()- Affichage d'un message dans la barre d'état_log_output()- Redirection des logs vers l'interfacebutton_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 extraspreload_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 disponibleson_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ésqueue_download_media()- Ajout d'un élément à la queuewatcher_queue_download()- Surveillance de la queueon_queue_download()- Exécution d'un téléchargementdownload()- 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êtepopulate_tree_results()- Remplissage de l'arbre des résultatspopulate_tree_result_child()- Création d'un élément enfanton_tr_results_expanded()- Gestion de l'expansion des résultatstr_results_expanded()- Chargement des enfants d'un élémentlist_items_show_result()- Affichage des éléments d'une listetidal_user_lists()- Récupération des listes utilisateuron_populate_tree_lists()- Remplissage de l'arbre des listeson_track_hover_confirmed()- Gestion du survol d'un trackon_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ésultatsmenu_context_queue_download()- Menu contextuel pour la queueon_copy_url_share()- Copie de l'URL de partageon_download_album_from_track()- Téléchargement de l'album d'un trackon_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ébiton_search_in_app()- Recherche dans l'applicationon_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'historiqueon_toggle_duplicate_prevention()- Activation/désactivation de la préventionon_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 UIon_preferences()- Ouverture du dialogue de préférenceson_settings_save()- Sauvegarde des paramètres
Classe MainWindow
La classe MainWindow hérite de tous les mixins et de QtWidgets.QMainWindow + Ui_MainWindow:
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
- Maintenabilité : Chaque mixin a une responsabilité claire et limitée
- Lisibilité : Fichiers plus petits et focalisés (100-300 lignes vs 1837)
- Testabilité : Les mixins peuvent être testés individuellement
- Extensibilité : Facile d'ajouter de nouvelles fonctionnalités
- Réutilisabilité : Les mixins peuvent être réutilisés si nécessaire
- Organisation : Structure logique par fonctionnalité
Migration
Pour utiliser la nouvelle structure :
# 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 à
selfqui sera fourni parMainWindowvia l'héritage multiple - L'ordre des mixins dans l'héritage est important pour la résolution de méthode (MRO)