MEP9 : Gestionnaire d'interaction globale #
Ajoutez un gestionnaire global pour toute l'interactivité des utilisateurs avec les artistes ; rendre n'importe quel artiste redimensionnable, mobile, surligné et sélectionnable selon les souhaits de l'utilisateur.
Statut #
Discussion
Branches et demandes d'extraction #
Résumé #
L'objectif est de pouvoir interagir avec les artistes matplotlib de la même manière que les programmes de dessin. Le cas échéant, l'utilisateur doit pouvoir déplacer, redimensionner ou sélectionner un artiste déjà présent sur le canevas. Bien sûr, le scénariste contrôle en fin de compte si un artiste peut interagir avec lui ou s'il est statique.
Ce code pour ce faire a déjà été implémenté et testé en privé, et devrait être migré de son implémentation "mixin" actuelle vers une partie authentique de matplotlib.
Le résultat final serait d'avoir quatre nouveaux mots clés disponibles pour matplotlib.artist.Artist : _moveable_, _resizeable_, _selectable_ et _highlightable_. Définir l'un de ces mots-clés sur True activerait l'interactivité pour cet artiste.
En effet, ce MEP est une extension logique de la gestion des événements dans matplotlib ; matplotlib prend déjà en charge les interactions "de bas niveau" comme les pressions gauches de la souris, une pression sur une touche ou similaire. Le MEP étend le support au niveau logique, où des rappels sont effectués sur les artistes lorsque certains gestes interactifs de l'utilisateur sont détectés.
Descriptif détaillé #
Cette nouvelle fonctionnalité serait utilisée pour permettre à l'utilisateur final de mieux interagir avec le graphique. Souvent, un graphique est presque ce que l'utilisateur veut, mais un petit repositionnement et/ou redimensionnement des composants est nécessaire. Plutôt que de forcer l'utilisateur à revenir au script pour tester l'emplacement, un simple glisser-déposer serait approprié.
De plus, cela permettrait de mieux prendre en charge les applications qui utilisent matplotlib ; ici, l'utilisateur final n'a aucun accès ou désir raisonnable de modifier la source sous-jacente afin d'affiner un tracé. Ici, si matplotlib offrait la possibilité, on pourrait déplacer ou redimensionner les artistes sur la toile en fonction de leurs besoins. De plus, l'utilisateur devrait pouvoir mettre en surbrillance (avec une souris dessus) un artiste et le sélectionner avec un double-clic, si l'application prend en charge ce genre de chose. Dans ce MEP, nous souhaitons également prendre en charge la mise en surbrillance et la sélection de manière native ; c'est à l'application de gérer ce qui se passe lorsque l'artiste est sélectionné. Une manipulation typique serait d'afficher une boîte de dialogue pour modifier les propriétés de l'artiste.
À l'avenir également (cela ne fait pas partie de ce MEP), matplotlib pourrait proposer des boîtes de dialogue de propriétés spécifiques au backend pour chaque artiste, qui sont soulevées lors de la sélection de l'artiste. Ce député européen serait un tremplin nécessaire pour ce type de capacité.
Il existe actuellement quelques fonctionnalités interactives dans matplotlib (par exemple legend.draggable()), mais elles ont tendance à être dispersées et ne sont pas disponibles pour tous les artistes. Ce MEP cherche à unifier l'interface interactive et à la faire fonctionner pour tous les artistes.
Le MEP actuel comprend également des poignées pour redimensionner les artistes et des cases appropriées dessinées lorsque les artistes sont déplacés ou redimensionnés.
Mise en œuvre #
Ajoutez des méthodes appropriées à "l'arbre" des artistes afin que le gestionnaire d'interactivité dispose d'une interface cohérente à gérer par le gestionnaire d'interactivité. Les méthodes proposées à ajouter aux artistes, si elles doivent favoriser l'interactivité, sont :
get_pixel_position_ll(self) : obtenir la position en pixels du coin inférieur gauche de la boîte englobante de l'artiste
get_pixel_size(self) : obtenir la taille de la boîte englobante de l'artiste, en pixels
set_pixel_position_and_size(self,x,y,dx,dy) : définit la nouvelle taille de l'artiste, de sorte qu'il rentre dans le cadre de sélection spécifié.
ajouter la capacité aux backends pour 1) fournir des curseurs, car ceux-ci sont nécessaires pour l'indication visuelle du déplacement/redimensionnement, et 2) fournir une fonction qui obtient la position actuelle de la souris
Implémenter le gestionnaire. Cela a déjà été fait en privé (par dhyams) en tant que mixin, et a été pas mal testé. Le but serait de déplacer la fonctionnalité du gestionnaire dans les artistes afin qu'elle soit correctement dans matplotlib, et non comme un "monkey patch" comme je l'ai actuellement codé.
Résumé actuel du mixin #
(Notez que ce mixin n'est pour l'instant que du code privé, mais peut évidemment être ajouté à une branche)
InteractiveArtistMixin :
Classe Mixin pour rendre tout objet générique dessiné sur un canevas matplotlib mobile et éventuellement redimensionnable. Le modèle Powerpoint est suivi au plus près ; pas parce que je suis amoureux de Powerpoint, mais parce que c'est ce que la plupart des gens comprennent. Un artiste peut également être sélectionnable, ce qui signifie que l'artiste recevra le rappel on_activated() lors d'un double-clic. Enfin, un artiste peut être surligné, ce qui signifie qu'un surlignage est dessiné sur l'artiste à chaque passage de la souris. En règle générale, les artistes pouvant être mis en évidence seront également sélectionnables, mais cela dépend de l'utilisateur. Donc, fondamentalement, il y a quatre attributs qui peuvent être définis par l'utilisateur sur une base par artiste :
surlignable
sélectionnable
mobile
redimensionnable
Pour être déplaçable (déplaçable) ou redimensionnable, l'objet qui est la cible du mixin doit supporter les protocoles suivants :
get_pixel_position_ll(soi-même)
get_pixel_size (lui-même)
set_pixel_position_and_size(self,x,y,sx,sy)
Notez que les objets non redimensionnables sont libres d'ignorer les paramètres sx et sy. Pour être surlignable, l'objet qui est la cible du mixin doit également supporter le protocole suivant :
get_highlight (soi-même)
Ce qui renvoie une liste d'artistes qui seront utilisés pour dessiner la surbrillance.
Si l'objet cible du mixin n'est pas un artiste matplotlib, les protocoles suivants doivent également être implémentés. Cela est généralement assez trivial, car il doit y avoir un artiste quelque part qui est en train d'être dessiné. En règle générale, votre objet achemine simplement ces appels vers cet artiste.
get_figure (soi-même)
get_axes (soi)
contient (soi, événement)
set_animated (soi, drapeau)
dessiner (soi, moteur de rendu)
get_visible(soi)
Les notifications suivantes sont appelées sur l'artiste, et l'artiste peut éventuellement les mettre en œuvre.
on_select_begin(lui-même)
on_select_end(soi-même)
on_drag_begin(lui-même)
on_drag_end(soi)
on_activated(auto)
on_highlight(soi)
on_right_click(soi,événement)
on_left_click (soi, événement)
on_middle_click (soi, événement)
on_context_click (soi, événement)
on_key_up (soi, événement)
on_key_down (soi, événement)
Les notifications suivantes sont appelées sur le canevas, si aucun artiste interactif ne gère l'événement :
on_press (soi, événement)
on_left_click (soi, événement)
on_middle_click (soi, événement)
on_right_click(soi,événement)
on_context_click (soi, événement)
on_key_up (soi, événement)
on_key_down (soi, événement)
Les fonctions suivantes, si présentes, permettent de modifier le comportement de l'objet interactif :
press_filter(self,event) # détermine si l'objet veut que l'événement presse lui soit acheminé
handle_unpicked_cursor() # peut être utilisé par l'objet pour définir un curseur lorsque le curseur passe sur l'objet lorsqu'il est désélectionné.
Prend en charge plusieurs canevas, en maintenant un verrou de glissement, un notificateur de mouvement et un indicateur global "activé" par canevas. Prend en charge les redimensionnements de rapport d'aspect fixe en maintenant la touche Maj enfoncée pendant le redimensionnement.
Problèmes connus :
L'ordre Z n'est pas respecté lors des opérations de sélection/glisser. En raison de la technique de blit utilisée, je ne pense pas que cela puisse être corrigé. La seule façon à laquelle je peux penser est de rechercher tous les artistes qui ont un zorder supérieur à moi, de les définir tous sur animés, puis de les redessiner tous au-dessus lors de chaque rafraîchissement par glisser-déposer. Cela peut être très lent ; besoin d'essayer.
le mixin ne fonctionne que pour les backends wx à cause de deux choses : 1) les curseurs sont codés en dur, et 2) il y a un appel à wx.GetMousePosition() Ces deux défauts sont raisonnablement corrigés en faisant en sorte que chaque backend fournisse ces éléments.
Rétrocompatibilité #
Aucun problème de rétrocompatibilité, même si une fois que cela est en place, il serait approprié d'obsolescence de certaines des fonctions interactives existantes (comme legend.draggable())
Alternatives #
Aucun que je sache.