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 Tool
s 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 Toolbar
und die Verknüpfungen aus dem zu nehmen Canvas
. Die Aktionen und Verknüpfungen haben die Form von Tool
s.
Eine neue Klasse Navigation
bildet die Brücke zwischen den Ereignissen von
Canvas
und Toolbar
und 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 SubplotTool
oder gar nicht in der Symbolleiste vorhanden sein als Quit
.
Die ToolBase
hat 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 festdestroy(self, *args)
: Zerstöre dieTool
grafische Oberfläche (falls vorhanden)
Verfügbare Werkzeuge #
WerkzeugBeenden
ToolEnableAllNavigation
ToolEnableNavigation
ToolToggleGrid
WerkzeugToggleFullScreen
ToolToggleYScale
ToolToggleXScale
ToolHome
ToolBack
ToolForward
SaveFigureBase
ConfigureSubplotsBase
ToolToggleBase(ToolBase) #
Die ToolToggleBase
hat 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)
: VonToolToggleBase.trigger
Methode aufgerufendisable(self, event)
: Wird aufgerufen, wenn das Tool deaktiviert isttoggled
: 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 vontool_added_event
(ausgegeben von der Navigation)set_message(self, s)
: Zeigt eine Nachricht auf der Symbolleiste oder in der Statusleiste antoggle_toolitem(self, name)
: Schaltet das Toolitem um, ohne dass ein Ereignis ausgelöst wird.remove_toolitem(self, name)
: Toolitem aus dem entfernenToolbar
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 Navigation
anstelle 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).]