MEP22: Regravação da barra de ferramentas #

Estado #

Progresso

Filiais e solicitações pull #

Trabalho prévio:

Solicitações de pull:

Resumo #

O principal objetivo deste MEP é facilitar a modificação (adicionar, alterar, remover) a forma como o usuário interage com as figuras.

A interação do usuário com a figura é profundamente integrada na tela e na barra de ferramentas. Tornando extremamente difícil fazer qualquer modificação.

Este MEP propõe a separação desta interação em Barra de Ferramentas, Navegação e Ferramentas para fornecer acesso e reconfiguração independentes.

Essa abordagem facilitará a criação e o compartilhamento de ferramentas entre os usuários. No futuro distante, podemos até prever uma espécie de Marketplace para Tools, onde os mais populares podem ser adicionados à distribuição principal.

Descrição detalhada #

A reconfiguração da barra de ferramentas é complexa, na maioria das vezes requer um back-end personalizado.

A criação de ferramentas personalizadas às vezes interfere na barra de ferramentas, como exemplo, consulte https://github.com/matplotlib/matplotlib/issues/2694 também os atalhos são codificados e, novamente, não são facilmente modificáveis ​​https://github.com/matplotlib/matplotlib /problemas/2699

A solução proposta é tirar as ações do Toolbare os atalhos do Canvas. As ações e atalhos estarão na forma de Tools.

Uma nova classe Navigationserá a ponte entre os eventos do Canvase Toolbare os redirecionará para o apropriado Tool.

Ao final a interação com o usuário será dividida em três classes:

  • NavigationBase: Esta classe é instanciada para cada FigureManager e conecta todas as interações do usuário com as ferramentas

  • ToolbarBase: Esta classe existente é relegada apenas como um acesso GUI para Tools.

  • ToolBase: É a definição básica de Ferramentas.

Implementação #

ToolBase(objeto) #

As ferramentas podem ter uma representação gráfica como o SubplotToolou nem mesmo estar presentes na Barra de Ferramentas como Quit.

O ToolBasetem os seguintes atributos de classe para configuração no momento da definição

  • keymap = None: Chave(s) a ser(em) usada(s) para acionar a ferramenta

  • description = '': Pequena descrição da ferramenta

  • image = None: Imagem que é usada na barra de ferramentas

Os seguintes atributos de instância são definidos na instanciação:

  • nome

  • navegação

Métodos #

  • trigger(self, event): Este é o método principal da Ferramenta, é chamado quando a Ferramenta é acionada por:

    • Clique no botão da barra de ferramentas

    • pressionamento de tecla associado ao mapa de teclas da ferramenta

    • Chamada para navigation.trigger_tool(name)

  • set_figure(self, figure): Defina a figura e os atributos de navegação

  • destroy(self, *args): Destrua a Toolinterface gráfica (se existir)

Ferramentas Disponíveis #

  • Ferramenta Sair

  • FerramentaHabilitarTodaNavegação

  • FerramentaHabilitarNavegação

  • ToolToggleGrid

  • FerramentaToggleFullScreen

  • FerramentaToggleYScale

  • FerramentaToggleXScale

  • ToolHome

  • ToolBack

  • ToolForward

  • SaveFigureBase

  • ConfigureSubplotsBase

ToolToggleBase(ToolBase) #

O ToolToggleBasetem os seguintes atributos de classe para configuração no momento da definição

  • radio_group = Nenhum: Atributo para agrupar 'rádio' como ferramentas (mutuamente exclusivas)

  • cursor = None: Cursor a ser usado quando a ferramenta está ativa

As ferramentas alternáveis ​​podem capturar teclas pressionadas, movimentos do mouse e pressionamento do botão do mouse

Métodos #

  • enable(self, event): Chamado pelo ToolToggleBase.triggermétodo

  • disable(self, event): Chamado quando a ferramenta é desativada

  • toggled: Propriedade Verdadeiro ou Falso

Ferramentas Disponíveis #

  • ToolZoom

  • ToolPan

ToolbarBase #

Métodos (para implementação de back-end) #

  • add_toolitem(self, name, group, position, image, description, toggle): Adicione um item de ferramenta à barra de ferramentas. Este método é um retorno de chamada tool_added_event(emitido pela navegação)

  • set_message(self, s): Exibe uma mensagem na barra de ferramentas ou na barra de status

  • toggle_toolitem(self, name): Alterna o item de ferramenta sem disparar o evento.

  • remove_toolitem(self, name): Remova um item de ferramenta doToolbar

Compatibilidade com versões anteriores #

Para compatibilidade com versões anteriores, 'navigation' foi adicionado à lista de valores suportados por rcParams["toolbar"](padrão: 'toolbar2'), que é usado para Navigationinstanciação de classes em vez das classes NavigationToolbar

Com esse parâmetro, torna-se transparente para qualquer pessoa que use os back-ends existentes.

[@pelson comment: Isso também nos dá a oportunidade de evitar a necessidade de implementar tudo isso no mesmo PR - alguns back-ends podem existir sem a nova funcionalidade por um curto período (mas isso deve ser feito em algum momento).]