WidgetManagerService - Менеджер виджетов
=========================================

.. currentmodule:: axioma.gui

.. class:: WidgetManagerService

	.. note:: Абстрактный

	Менеджер виджетов

	Для получения объекта этого класса используйте :ref:`axioma_app_global_variables`

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

	* :class:`~PyQt5.QtCore.QObject`

	Методы:

		.. method:: activeWidget(widget_type=QWidget)

			Получить активный виджет заданного типа

			:param widget_type: тип виджета
			:type widget_type: :class:`type`

		.. code-block:: python3

			from axioma.gui import MapView

			widgetManager = axioma.app.gui.widgetManager
			# get current MapView
			current_map_view = widgetManager.activeWidget(MapView)
			# get current widget (any)
			current_widget = widgetManager.activeWidget()

		.. method:: registerWidget(widget)

			Зарегистрировать виджет в менеджере

			:param widget: виджет
			:type widget: :class:`~PyQt5.QtWidgets.QWidget`

		.. method:: count()

			:return: количество всех виджетов
			:rtype: :class:`int`

		.. method:: count(type)

			Количество виджетов заданного типа

			:param type: тип
			:type type: :class:`~PyQt5.QtCore.QMetaObject`
			:return: количество
			:rtype: :class:`int`

		.. method:: allWidgets()

			Список всех виджетов

			:return: список виджетов
			:rtype: :class:`list` [:class:`~PyQt5.QtWidgets.QWidget`]

		.. method:: allWidgets(type)

			Список виджетов заданного типа

			:param type: тип
			:type type: :class:`~PyQt5.QtCore.QMetaObject`
			:return: список виджетов
			:rtype: :class:`list` [:class:`~PyQt5.QtWidgets.QWidget`]

		.. code-block:: python3
			
			# Получение списка окон с картами
			from axioma.gui import *

			list = axioma.app.gui.widgetManager.allWidgets(MapView.staticMetaObject)

		.. method:: connectWidgetCountChanged(type, context, callback)

			Подписаться на изменение количества виджетов определенного типа

			:param type: тип виджетов, за количеством которых нужно следить
			:type type: :class:`type`
			:param context: отвечает за время жизни соединения
			:type context: :class:`~PyQt5.QtCore.QObject`
			:param callback: вызываемый метод при изменении количества виджетов; должен принимать ноль или один параметр типа :class:`int` и возвращать :any:`None`
			:type callback: :any:`typing.Callable` [[:class:`int`], :any:`None`]

		.. code-block:: python3

			from axioma.gui import MapView, ItemView

			widgetManager = axioma.app.gui.widgetManager

			# без параметров
			callbackMap = lambda: print("Number of MapViews has changed")
			widgetManager.connectWidgetCountChanged(MapView, None, callbackMap)
			# с параметром
			callbackItem = lambda itemview_count: print("ItemViews: ", itemview_count)
			widgetManager.connectWidgetCountChanged(ItemView, None, callbackItem)

		.. method:: connectWidgetChanged(type, context, callback)

			Подписаться на изменение текущего виджета определенного типа

			:param type: тип виджета, об изменении которого необходимо узнать
			:type type: :class:`type`
			:param context: отвечает за время жизни соединения
			:type context: :class:`~PyQt5.QtCore.QObject`
			:param callback: вызываемый метод при смене виджета заданного типа; должен принимать ноль или один параметр типа :class:`~PyQt5.QtWidgets.QWidget` и возвращать :any:`None`
			:type callback: :any:`typing.Callable` [[:class:`~PyQt5.QtWidgets.QWidget`], :any:`None`]

		.. code-block:: python3

			from PyQt5.QtWidgets import QWidget

			widgetManager = axioma.app.gui.widgetManager

			callbackChanged = lambda: print("Current widget changed")
			widgetManager.connectWidgetChanged(QWidget, None, callbackChanged)

		.. method:: connectCurrentWidget(type, signal, context, callback)

			Подписаться на сигнал активного виджета. При его смене произойдет переподключение нового активного виджета

			:param type: тип виджета, за сигналом которого нужно следить
			:type type: :class:`type`
			:param signal: сигнал
			:type signal: :class:`PyQt5.QtCore.pyqtSignal`
			:param context: отвечает за время жизни соединения
			:type context: :class:`~PyQt5.QtCore.QObject`
			:param callback: вызываемый метод при смене виджета заданного типа; должен быть совместим с сигналом
			:type callback: :any:`typing.Callable`

		.. code-block:: python3

			from axioma.gui import MapView
			from PyQt5.QtWidgets import QPushButton

			widgetManager = axioma.app.gui.widgetManager

			callbackZoomChanged = lambda zoom: print("Zoom is changed: ", zoom)

			# guard контроллирует время жизни соединения
			guard = QPushButton("Disconnect")
			guard.setAttribute(Qt.WA_DeleteOnClose)
			guard.clicked.connect(guard.close)
			guard.show()

			widgetManager.connectCurrentWidget(MapView, MapView.zoomChanged, guard, callbackZoomChanged)

		.. method:: removeWidget(widget)

			Убрать виджет из менеджера

			:param widget: виджет
			:type widget: :class:`~PyQt5.QtWidgets.QWidget`

		.. method:: activateWidget(widget)

			Активировать виджет

			:param widget: виджет
			:type widget: :class:`~PyQt5.QtWidgets.QWidget`
