MEP22 : Réécriture de la barre d'outils #

Statut #

Progrès

Branches et demandes d'extraction #

Précédent travail:

Demandes d'extraction :

Résumé #

L'objectif principal de cette MEP est de faciliter la modification (ajout, changement, suppression) de la manière dont l'utilisateur interagit avec les chiffres.

L'interaction de l'utilisateur avec la figure est profondément intégrée dans le canevas et la barre d'outils. Rendre extrêmement difficile toute modification.

Ce MEP propose la séparation de cette interaction en barre d'outils, navigation et outils pour fournir un accès et une reconfiguration indépendants.

Cette approche facilitera la création et le partage d'outils entre les utilisateurs. Dans un futur lointain, on peut même prévoir une sorte de Marketplace pour Tools où les plus populaires pourront être ajoutés à la distribution principale.

Descriptif détaillé #

La reconfiguration de la barre d'outils est complexe, la plupart du temps elle nécessite un backend personnalisé.

La création d'outils personnalisés interfère parfois avec la barre d'outils, comme par exemple voir https://github.com/matplotlib/matplotlib/issues/2694 aussi les raccourcis sont codés en dur et encore une fois pas facilement modifiables https://github.com/matplotlib/matplotlib /numéros/2699

La solution proposée est de retirer les actions du Toolbaret les raccourcis du Canvas. Les actions et les raccourcis seront sous la forme de Tools.

Une nouvelle classe Navigationsera le pont entre les événements du Canvaset Toolbaret les redirigera vers le Tool.

À la fin, l'interaction de l'utilisateur sera divisée en trois classes :

  • NavigationBase : cette classe est instanciée pour chaque FigureManager et connecte toutes les interactions de l'utilisateur avec les outils.

  • ToolbarBase : cette classe existante est reléguée uniquement en tant qu'accès graphique aux outils.

  • ToolBase : est la définition de base des outils.

Mise en œuvre #

ToolBase(objet) #

Les outils peuvent avoir une représentation graphique en tant que SubplotToolou même ne pas être présents dans la barre d'outils en tant que Quit.

Le ToolBasea les attributs de classe suivants pour la configuration au moment de la définition

  • keymap = None : Clé(s) à utiliser pour déclencher l'outil

  • description = '' : Petite description de l'outil

  • image = None : Image utilisée dans la barre d'outils

Les attributs d'instance suivants sont définis lors de l'instanciation :

  • Nom

  • la navigation

Méthodes #

  • trigger(self, event): C'est la méthode principale du Tool, elle est appelée lorsque le Tool est déclenché par :

    • Clic sur le bouton de la barre d'outils

    • touche associée à l'outil Keymap

    • Appel à navigation.trigger_tool(nom)

  • set_figure(self, figure): Définissez les attributs de figure et de navigation

  • destroy(self, *args): Détruit l' Toolinterface graphique (si elle existe)

Outils disponibles #

  • OutilQuitter

  • ToolEnableAllNavigation

  • OutilActiverNavigation

  • OutilToggleGrid

  • OutilBasculerPleinÉcran

  • ToolToggleYScale

  • OutilToggleXScale

  • OutilAccueil

  • OutilRetour

  • OutilAvant

  • EnregistrerFigureBase

  • ConfigureSubplotsBase

ToolToggleBase(ToolBase) #

Le ToolToggleBasea les attributs de classe suivants pour la configuration au moment de la définition

  • radio_group = None : Attribut au groupe 'radio' comme outils (mutuellement exclusifs)

  • curseur = Aucun : curseur à utiliser lorsque l'outil est actif

Les outils commutables peuvent capturer la pression sur les touches, les mouvements de la souris et la pression sur le bouton de la souris

Méthodes #

  • enable(self, event): Appelé par la ToolToggleBase.triggerméthode

  • disable(self, event): Appelé lorsque l'outil est désactivé

  • toggled: Propriété Vrai ou Faux

Outils disponibles #

  • OutilZoom

  • ToolPan

# de base de la barre d'outils

Méthodes (pour l'implémentation backend) #

  • add_toolitem(self, name, group, position, image, description, toggle): Ajouter un outil à la barre d'outils. Cette méthode est un rappel de tool_added_event(émis par la navigation)

  • set_message(self, s): Afficher un message sur la barre d'outils ou dans la barre d'état

  • toggle_toolitem(self, name): Bascule l'élément d'outil sans événement de déclenchement.

  • remove_toolitem(self, name): Supprimer un outil de laToolbar

Rétrocompatibilité #

Pour la rétrocompatibilité, 'navigation' a été ajoutée à la liste des valeurs prises en charge par rcParams["toolbar"](par défaut : 'toolbar2'), qui est utilisée pour Navigationl'instanciation des classes au lieu des classes NavigationToolbar

Avec ce paramètre, il le rend transparent pour quiconque utilise les backends existants.

[Commentaire @pelson : Cela nous donne également l'occasion d'éviter d'avoir à implémenter tout cela dans le même PR - certains backends peuvent potentiellement exister sans la nouvelle fonctionnalité pendant un court moment (mais cela doit être fait à un moment donné).]