MEP22: Symbolleiste neu schreiben #
Status #
Fortschritt
Branches und Pull-Requests #
Vorherige Arbeit:
Pull-Requests:
- Entfernen der NavigationToolbar-Klassen https://github.com/matplotlib/matplotlib/pull/2740 CLOSED 
- Halten Sie die NavigationToolbar-Klassen https://github.com/matplotlib/matplotlib/pull/2759 GESCHLOSSEN 
- Navigation nach Ereignissen: https://github.com/matplotlib/matplotlib/pull/3652 
Zusammenfassung #
Das Hauptziel dieses MEP ist es, die Art und Weise, wie der Benutzer mit den Figuren interagiert, einfacher zu modifizieren (hinzufügen, ändern, entfernen).
Die Benutzerinteraktion mit der Figur ist tief in die Leinwand und die Symbolleiste integriert. Es ist extrem schwierig, Änderungen vorzunehmen.
Dieses MdEP schlägt die Aufteilung dieser Interaktion in Symbolleiste, Navigation und Tools vor, um einen unabhängigen Zugriff und eine Neukonfiguration zu ermöglichen.
Dieser Ansatz erleichtert das Erstellen und Freigeben von Tools unter Benutzern. In ferner Zukunft können wir uns sogar eine Art Marktplatz für Tools vorstellen, auf dem die beliebtesten in die Hauptverteilung aufgenommen werden können.
Detaillierte Beschreibung #
Die Neukonfiguration der Toolbar ist komplex und erfordert meistens ein benutzerdefiniertes Backend.
Die Erstellung von benutzerdefinierten Tools stört manchmal die Symbolleiste, siehe Beispiel https://github.com/matplotlib/matplotlib/issues/2694 , auch die Verknüpfungen sind fest codiert und wiederum nicht leicht modifizierbar https://github.com/matplotlib/matplotlib /issues/2699
Die vorgeschlagene Lösung besteht darin, die Aktionen aus dem Toolbarund die Verknüpfungen aus dem zu nehmen Canvas. Die Aktionen und Verknüpfungen haben die Form von Tools.
Eine neue Klasse Navigationbildet die Brücke zwischen den Ereignissen von
 Canvasund Toolbarund leitet sie an die entsprechenden weiter Tool.
Am Ende wird die Benutzerinteraktion in drei Klassen eingeteilt:
- NavigationBase: Diese Klasse wird für jeden FigureManager instanziiert und verbindet alle Benutzerinteraktionen mit den Tools 
- ToolbarBase: Diese vorhandene Klasse wird nur als GUI-Zugriff auf Tools degradiert. 
- ToolBase: Ist die grundlegende Definition von Tools. 
Implementierung #
ToolBase(Objekt) #
Werkzeuge können eine grafische Darstellung als haben SubplotTooloder gar nicht in der Symbolleiste vorhanden sein als Quit.
Die ToolBasehat die folgenden Klassenattribute für die Konfiguration zur Definitionszeit
- keymap = None: Taste(n) zum Auslösen des Tools 
- description = '': Kleine Beschreibung des Tools 
- image = None: Bild, das in der Symbolleiste verwendet wird 
Die folgenden Instanzattribute werden bei der Instanziierung gesetzt:
- Name 
- Navigation 
Methoden #
- trigger(self, event): Dies ist die Hauptmethode des Tools, sie wird aufgerufen, wenn das Tool ausgelöst wird durch:- Klicken Sie auf die Symbolleistenschaltfläche 
- Tastendruck, der mit der Werkzeug-Keymap verknüpft ist 
- Aufruf von navigation.trigger_tool(name) 
 
- set_figure(self, figure): Legen Sie die Abbildungs- und Navigationsattribute fest
- destroy(self, *args): Zerstöre die- Toolgrafische Oberfläche (falls vorhanden)
Verfügbare Werkzeuge #
- WerkzeugBeenden 
- ToolEnableAllNavigation 
- ToolEnableNavigation 
- ToolToggleGrid 
- WerkzeugToggleFullScreen 
- ToolToggleYScale 
- ToolToggleXScale 
- ToolHome 
- ToolBack 
- ToolForward 
- SaveFigureBase 
- ConfigureSubplotsBase 
ToolToggleBase(ToolBase) #
Die ToolToggleBasehat die folgenden Klassenattribute für die Konfiguration zur Definitionszeit
- radio_group = None: Attribut zur Gruppe 'radio' like tools (schließen sich gegenseitig aus) 
- cursor = None: Cursor, der verwendet werden soll, wenn das Werkzeug aktiv ist 
Die Toggleable Tools können Tastendrücke, Mausbewegungen und Maustastendrücke erfassen
Methoden #
- enable(self, event): Von- ToolToggleBase.triggerMethode aufgerufen
- disable(self, event): Wird aufgerufen, wenn das Tool deaktiviert ist
- toggled: Eigenschaft True oder False
Verfügbare Werkzeuge #
- WerkzeugZoom 
- ToolPan 
ToolbarBase #
Methoden (für Backend-Implementierung) #
- add_toolitem(self, name, group, position, image, description, toggle): Toolitem zur Symbolleiste hinzufügen. Diese Methode ist ein Callback von- tool_added_event(ausgegeben von der Navigation)
- set_message(self, s): Zeigt eine Nachricht auf der Symbolleiste oder in der Statusleiste an
- toggle_toolitem(self, name): Schaltet das Toolitem um, ohne dass ein Ereignis ausgelöst wird.
- remove_toolitem(self, name): Toolitem aus dem entfernen- Toolbar
Abwärtskompatibilität #
Aus Gründen der Abwärtskompatibilität wurde 'navigation' zur Liste der unterstützten Werte hinzugefügt rcParams["toolbar"](Standard: 'toolbar2'), die Navigationanstelle der NavigationToolbar-Klassen für die Instanziierung von Klassen verwendet wird
Mit diesem Parameter wird es für jeden transparent, der die vorhandenen Backends verwendet.
[@Pelson-Kommentar: Dies gibt uns auch die Möglichkeit zu vermeiden, dass all dies in derselben PR implementiert werden muss – einige Backends können möglicherweise für kurze Zeit ohne die neue Funktionalität existieren (aber es muss irgendwann getan werden).]