MEP22 : Réécriture de la barre d'outils #
Statut #
Progrès
Branches et demandes d'extraction #
Précédent travail:
Demandes d'extraction :
Suppression des classes NavigationToolbar https://github.com/matplotlib/matplotlib/pull/2740 FERMÉ
Garder les classes NavigationToolbar https://github.com/matplotlib/matplotlib/pull/2759 CLOSED
Navigation par événements : https://github.com/matplotlib/matplotlib/pull/3652
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 Tool
s 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 Toolbar
et les raccourcis du Canvas
. Les actions et les raccourcis seront sous la forme de Tool
s.
Une nouvelle classe Navigation
sera le pont entre les événements du
Canvas
et Toolbar
et 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 SubplotTool
ou même ne pas être présents dans la barre d'outils en tant que Quit
.
Le ToolBase
a 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 navigationdestroy(self, *args)
: Détruit l'Tool
interface graphique (si elle existe)
Outils disponibles #
OutilQuitter
ToolEnableAllNavigation
OutilActiverNavigation
OutilToggleGrid
OutilBasculerPleinÉcran
ToolToggleYScale
OutilToggleXScale
OutilAccueil
OutilRetour
OutilAvant
EnregistrerFigureBase
ConfigureSubplotsBase
ToolToggleBase(ToolBase) #
Le ToolToggleBase
a 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 laToolToggleBase.trigger
méthodedisable(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 detool_added_event
(émis par la navigation)set_message(self, s)
: Afficher un message sur la barre d'outils ou dans la barre d'étattoggle_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 Navigation
l'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é).]