Tool
=======================

.. currentmodule:: axioma.gui

.. class:: Tool

	Базовый класс инструментов. Когда пользователь включает инструмент, события от
	виджетов, которые им поддерживаются, начинают приходить в обработчики этого
	инструмента. Для каждого виджета создаётся один экземпляр класса,
	наследованного от :class:`~axioma.gui.Tool`. События сначала поступают в метод
	:meth:`~axioma.gui.Tool.handleEvent_impl`, который по умолчанию передаёт их в
	соответствующий обработчик для конкретного типа события:
	:meth:`~axioma.gui.Tool.mousePressEvent`,
	:meth:`~axioma.gui.Tool.keyPressEvent` и т. д. Все обработчики должны
	возвращать значение типа :class:`~axioma.gui.Tool.EventPolicy`, чтобы
	определить, нужно ли передавать событие дальше виджету или другим вложенным
	инструментам. Исключением является обработчик события отрисовки, который
	является независимым от метода :meth:`~axioma.gui.Tool.handleEvent_impl`, и в
	который дополнительно передаётся :class:`~PyQt5.QtGui.QPainter`.

	Унаследован от:

	* :class:`~PyQt5.QtCore.QObject`
	
	От него наследуются: 

	* :class:`~axioma.gui.ChainTool`
	* :class:`~axioma.gui.DeviceToSceneHandler`
	* :class:`~axioma.gui.SnapHandler`

	Методы:

		.. method:: Tool(widget)

			Конструктор класса

			:param widget: Виджет, от которого инструмент будет получать события
			:type widget: :class:`~PyQt5.QtWidgets.QWidget`

		.. method:: handleEvent_impl(event)

			Метод для обработки всех поддерживаемых инструментом событий.
			По умолчанию передаёт событие в обработчики для конкретного типа.
			Инструмент может обрабатывать следующие типы событий:

			* QEvent::MouseButtonPress
			* QEvent::MouseButtonRelease
			* QEvent::MouseButtonDblClick
			* QEvent::MouseMove
			* QEvent::KeyPress
			* QEvent::KeyRelease
			* QEvent::Wheel
			* QEvent::Enter
			* QEvent::Leave

			:param event: событие
			:type event: :class:`~PyQt5.QtCore.QEvent`
			:rtype: :class:`~axioma.gui.Tool.EventPolicy`

		.. method:: paintEvent(event, painter)

			Событие отрисовки

			:param event: событие отрисовки
			:type event: :class:`~PyQt5.QtGui.QPaintEvent`
			:param painter: QPainter для рисования поверх виджета
			:type painter: :class:`~PyQt5.QtGui.QPainter`

		.. method:: mousePressEvent(event)

			Событие нажатия клавиши мыши

			:param event: событие мыши
			:type event: :class:`~PyQt5.QtGui.QMouseEvent`
			:rtype: :class:`~axioma.gui.Tool.EventPolicy`

		.. method:: mouseReleaseEvent(event)

			Событие отпускания клавиши мыши

			:param event: событие мыши
			:type event: :class:`~PyQt5.QtGui.QMouseEvent`
			:rtype: :class:`~axioma.gui.Tool.EventPolicy`

		.. method:: mouseMoveEvent(event)

			Событие перемещения мыши

			:param event: событие мыши
			:type event: :class:`~PyQt5.QtGui.QMouseEvent`
			:rtype: :class:`~axioma.gui.Tool.EventPolicy`

		.. method:: mouseDoubleClickEvent(event)

			Событие двойного клика мыши

			:param event: событие мыши
			:type event: :class:`~PyQt5.QtGui.QMouseEvent`
			:rtype: :class:`~axioma.gui.Tool.EventPolicy`

		.. method:: keyPressEvent(event)

			Событие нажатия клавиши клавиатуры

			:param event: событие клавиш
			:type event: :class:`~PyQt5.QtGui.QKeyEvent`
			:rtype: :class:`~axioma.gui.Tool.EventPolicy`

		.. method:: keyReleaseEvent(event)

			Событие отпускания клавиши клавиатуры

			:param event: событие клавиш
			:type event: :class:`~PyQt5.QtGui.QKeyEvent`
			:rtype: :class:`~axioma.gui.Tool.EventPolicy`

		.. method:: wheelEvent(event)

			Событие колеса мыши

			:param event: событие колеса мыши
			:type event: :class:`~PyQt5.QtGui.QWheelEvent`
			:rtype: :class:`~axioma.gui.Tool.EventPolicy`

		.. method:: widget()

			Виджет, от которого поступают события.

			:rtype: :class:`~PyQt5.QtWidgets.QWidget`

		..

			.. class:: EventPolicy

				Режим передачи событий.

				.. csv-table:: Значения
					:header: Наименование, Описание

					PassEvent, Пропустить событие дальше по цепочке обработчиков
					BlockEvent,  Блокировать обработку события
