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

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

Дополнительные параметры могут быть переданы прямо в конструктор инструмента `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 панель закрываем.