MEP22: Symbolleiste neu schreiben #

Status #

Fortschritt

Branches und Pull-Requests #

Vorherige Arbeit:

Pull-Requests:

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 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 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).]