MEP22: Reescritura de la barra de herramientas #

Estado #

Progreso

Sucursales y solicitudes de extracción #

Trabajo previo:

Solicitudes de extracción:

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 Tools 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 Toolbary los accesos directos del Canvas. Las acciones y atajos serán en forma de Tools.

Una nueva clase Navigationserá el puente entre los eventos de Canvasy Toolbary 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 SubplotToolo no estar presentes en la barra de herramientas como Quit.

Tiene los ToolBasesiguientes 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ón

  • destroy(self, *args): Destruir la Toolinterfaz 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 ToolToggleBasesiguientes 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 por ToolToggleBase.triggermétodo

  • disable(self, event): Llamado cuando la herramienta no está activada

  • toggled: 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 de tool_added_event(emitida por navegación)

  • set_message(self, s): Mostrar un mensaje en la barra de herramientas o en la barra de estado

  • toggle_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 Navigationla 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).]