Создание инструментов

Передача параметров в инструменты

Дополнительные параметры могут быть переданы прямо в конструктор инструмента axipy.MapTool при создании кнопки ToolButton. Для этого необходимо «обернуть» вызов конструктора в функцию, захватив (capture) все необходимые параметры. Например, сравните:

Инструмент без параметров
button = ToolButton('Мой инструмент', MyTool)
Инструмент с захватом параметров
button = ToolButton('Мой инструмент', lambda: MyTool(config, params))

Панель активного инструмента

Если при работе с инструментом пользователю регулярно нужно взаимодействовать с различными графическими элементами / настройками то для этого можно воспользоваться готовым решением из axipy.ActiveToolPanel. Это обертка вокруг стандартной панели PySide2.QtWidgets.QDockWidget предоставляющая дополнительные возможности:

  1. Можно задать наблюдателя который будет автоматически следить за доступностью панели.

  2. Предопределенное место для панели активного инструмента.

  3. Готовые компоненты с кнопками управления для упрощения добавления пользовательского графического элемента.

При написании плагинов текущий экземпляр axipy.ActiveToolPanel можно получить из метода axipy.AxiomaInterface.active_tool_panel(). Взаимодействие с панелью активного инструмента идет через обработчик который можно создать через один из методов axipy.ActiveToolPanel.make_acceptable() или axipy.ActiveToolPanel.make_custom(). При работе с панелью активного инструмента через обработчик axipy.AxipyAcceptableActiveToolHandler созданный через axipy.ActiveToolPanel.make_acceptable() то на панели активного инструмента по умолчанию расположены кнопки «Применить» и «Отмена». При нажатии на них будут посланы соответствующие сигналы axipy.AxipyAcceptableActiveToolHandler.accepted и axipy.AxipyAcceptableActiveToolHandler.rejected. Если нужно настроить кнопки управления по своему усмотрению то можно воспользоваться обработчиком axipy.AxipyCustomActiveToolPanelHandler, который создаётся с помощью axipy.ActiveToolPanel.make_custom().

Создание обработчика для взаимодействия с панелью активного инструмента.
service = ActiveToolPanel()
# Любой пользовательский графический элемент
widget = QWidget()

# Создаём обработчик для панели активного инструмента через который 
# будем управлять панелью. 
tool_panel = service.make_acceptable(
    title="Мой инструмент",
    observer_id=DefaultKeys.SelectionEditable,
    widget=widget)

# Подписываемся на сигнал отправляемый после нажатия на кнопку "Применить" в панели
tool_panel.accepted.connect(lambda: print("Применяем изменения"))

Чтобы показать панель активного инструмента с переданным ранее графическим элементом нужно вызвать axipy.AxipyActiveToolPanelHandlerBase.activate(), а для закрытия axipy.AxipyActiveToolPanelHandlerBase.deactivate().

Включение/Выключение панели активного инструмента.
class PyTool(MapTool):

    def mousePressEvent(self, event: QMouseEvent) -> Optional[bool]:
        if event.button() == Qt.LeftButton:
            self.tool_panel.activate()
        return self.PassEvent

    def keyPressEvent(self, event: QKeyEvent) -> Optional[bool]:
        if event.key() == Qt.Key_Escape:
            self.tool_panel.deactivate()
            return self.BlockEvent
        return super().keyPressEvent(event

См.также

Создание и добавление кнопок Создание кнопок

В коде выше в методе mousePressEvent() при нажатии левой кнопкой мыши мы показываем панель с активным инструментом, а в методе keyPressEvent() при нажатии на клавишу Esc панель закрываем.