MEP22: Reescritura de la barra de herramientas #
Estado #
Progreso
Sucursales y solicitudes de extracción #
Trabajo previo:
Solicitudes de extracción:
Eliminando las clases de NavigationToolbar https://github.com/matplotlib/matplotlib/pull/2740 CERRADO
Mantener las clases de NavigationToolbar https://github.com/matplotlib/matplotlib/pull/2759 CERRADO
Navegación por eventos: https://github.com/matplotlib/matplotlib/pull/3652
Resumen #
El objetivo principal de este MEP es facilitar la modificación (añadir, cambiar, eliminar) la forma en que el usuario interactúa con las figuras.
La interacción del usuario con la figura está profundamente integrada en el lienzo y la barra de herramientas. Haciendo extremadamente difícil hacer cualquier modificación.
Este eurodiputado propone la separación de esta interacción en Barra de herramientas, Navegación y Herramientas para proporcionar acceso y reconfiguración independientes.
Este enfoque facilitará la creación y el intercambio de herramientas entre los usuarios. En un futuro lejano, incluso podemos prever una especie de Marketplace para Tool
s donde los más populares se pueden agregar a la distribución principal.
Descripción detallada #
La reconfiguración de la barra de herramientas es compleja, la mayoría de las veces requiere un backend personalizado.
La creación de herramientas personalizadas a veces interfiere con la barra de herramientas, como ejemplo, consulte https://github.com/matplotlib/matplotlib/issues/2694 también los accesos directos están codificados y, de nuevo, no se pueden modificar fácilmente https://github.com/matplotlib/matplotlib /temas/2699
La solución propuesta es sacar las acciones del Toolbar
y los accesos directos del Canvas
. Las acciones y atajos serán en forma de Tool
s.
Una nueva clase Navigation
será el puente entre los eventos de
Canvas
y Toolbar
y los redirigirá al Tool
.
Al final, la interacción del usuario se dividirá en tres clases:
NavigationBase: esta clase se instancia para cada FigureManager y conecta todas las interacciones del usuario con las Herramientas
ToolbarBase: esta clase existente está relegada solo como un acceso de GUI a Herramientas.
ToolBase: Es la definición básica de Herramientas.
Implementación #
Base de herramientas (objeto) #
Las herramientas pueden tener una representación gráfica como SubplotTool
o no estar presentes en la barra de herramientas como Quit
.
Tiene los ToolBase
siguientes atributos de clase para la configuración en el momento de la definición
keymap = Ninguno: Tecla(s) que se usará(n) para activar la herramienta
description = '': Pequeña descripción de la herramienta
image = None: Imagen que se utiliza en la barra de herramientas
Los siguientes atributos de instancia se establecen en la creación de instancias:
nombre
navegación
Métodos #
trigger(self, event)
: Este es el método principal de la Herramienta, se llama cuando la Herramienta es activada por:Clic en el botón de la barra de herramientas
pulsación de tecla asociada con el mapa de teclas de la herramienta
Llamar a navigation.trigger_tool(nombre)
set_figure(self, figure)
: Establecer la figura y los atributos de navegacióndestroy(self, *args)
: Destruir laTool
interfaz gráfica (si existe)
Herramientas disponibles #
HerramientaSalir
ToolEnableAllNavigation
ToolEnableNavigation
ToolToggleGrid
ToolToggleFullScreen
ToolToggleYScale
ToolToggleXScale
HerramientaInicio
HerramientaAtrás
HerramientaAdelante
GuardarFiguraBase
ConfigurarSubparcelasBase
ToolToggleBase (Base de herramientas) #
Tiene los ToolToggleBase
siguientes atributos de clase para la configuración en el momento de la definición
radio_group = Ninguno: Atributo al grupo 'radio' como herramientas (mutuamente excluyentes)
cursor = Ninguno: Cursor a usar cuando la herramienta está activa
Las herramientas alternables pueden capturar la pulsación de teclas, los movimientos del mouse y la presión del botón del mouse
Métodos #
enable(self, event)
: Llamado porToolToggleBase.trigger
métododisable(self, event)
: Llamado cuando la herramienta no está activadatoggled
: Propiedad Verdadero o Falso
Herramientas disponibles #
HerramientaZoom
ToolPan
Base de la barra de herramientas #
Métodos (para implementación de backend) #
add_toolitem(self, name, group, position, image, description, toggle)
: agregue un elemento de herramienta a la barra de herramientas. Este método es una devolución de llamada detool_added_event
(emitida por navegación)set_message(self, s)
: Mostrar un mensaje en la barra de herramientas o en la barra de estadotoggle_toolitem(self, name)
: Alterne el elemento de herramienta sin evento de disparo.remove_toolitem(self, name)
: Eliminar un elemento de herramienta de laToolbar
Compatibilidad con versiones anteriores #
Para compatibilidad con versiones anteriores, se agregó 'navegación' a la lista de valores admitidos por rcParams["toolbar"]
(predeterminado: 'toolbar2'
), que se usa para Navigation
la creación de instancias de clases en lugar de las clases de la barra de herramientas de navegación .
Con este parámetro, lo hace transparente para cualquiera que use los backends existentes.
[Comentario de @pelson: Esto también nos brinda la oportunidad de evitar la necesidad de implementar todo esto en el mismo PR: algunos backends pueden existir potencialmente sin la nueva funcionalidad por un corto tiempo (pero debe hacerse en algún momento).]