LegendItemComponent
====================

.. currentmodule:: axioma.render

.. class:: LegendItemComponent

	Элемент легенды LegendItem для векторного слоя

		.. py:method:: LegendItemComponent(style, description, objects=-1)

			Конструктор

			:param style: Стиль оформления элемента.
			:type style: :class:`Style`
			:param description: Текстовое описание.
			:type description: :class:`str`
			:param objects: Количество объектов. Применим только для тематики по интервалам.
			:type objects: :class:`int`

		.. py:method:: LegendItemComponent(other)

			Копирующий конструктор

			:param other: Исходный объект LegendItemComponent, на базе которого необходимо сделать копию.
			:type other: :class:`LegendItemComponent`

		.. py:attribute:: style

			Стиль оформления 

			:type: :class:`Style`

		.. py:method:: description()

			Описание элемента. Если методе setDescriptionChanged установлено значение, отличное от None, показывается оно, в противном случае исходное.

			:return: Строка с описанием
			:rtype: :class:`str`

		.. py:method:: fullDescription()

			Полное описание элемента. Если в конструкторе (или посредством метода setObjectCount) передано количество объектов со значением, отличающимся от -1, в описание включается и данное значение. В противном случае результат аналогичен методу description

			:return: Строка с описанием
			:rtype: :class:`str`

		.. py:method:: setDescription(description)

			Установка нового описания

			:param description: Описание
			:type description: :class:`str`

		.. py:method:: setDescriptionChanged(description)

			Замена текстового описания. При этом исходное описание сохраняется. Используется, если есть необходимость изменить тестовую подпись с возможностью его сохранение при обновлении параметров элемента легенды. 

			:param description: Описание
			:type description: :class:`str`

		.. py:method:: setObjectCount(objects)

			Установка количества объектов. По умолчанию равно -1 (количество в легенде не показывается).

			:param objects: Количество
			:type objects: :class:`bool`

		.. py:method:: objectCount()

			Количество объектов для элемента легенды

			:return: Значение
			:rtype: :class:`int`

		.. py:attribute:: isVisible

			Управляет видимостью элемента. True, если элемент показывается.

			:type: :class:`bool`
  

LegendItem
===========

.. currentmodule:: axioma.render

.. class:: LegendItem

	Легенда для векторного слоя.

	От него наследуются: :class:`FeatureLegendItem`, :class:`ThematicLegendItem`

		.. py:method:: LegendItem(caption, parent=None)

			Конструктор

			:param caption: Наименование (заголовок) легенды.
			:type caption: :class:`str`
			:param parent: Владелец элемента легенды. При удалении владельца так же удаляется и сам элемент
			:type parent: :class:`~PyQt5.QtCore.QObject`

		.. py:method:: LegendItem(caption, overrideComponentsб parent=None)

			Конструктор

			:param caption: Наименование (заголовок) легенды.
			:type caption: :class:`str`
			:param overrideComponents: Список элементов легенды
			:type overrideComponents: :class:`list` [:class:`LegendItemComponent`]
			:param parent: Владелец элемента легенды. При удалении владельца так же удаляется и сам элемент
			:type parent: :class:`~PyQt5.QtCore.QObject`

		.. py:method:: LegendItem(other)

			Копирующий конструктор

			:param other: Исходный объект, на базе которого создается новый.
			:type other: :class:`LegendItem`

		.. py:method:: clone()

			Делает копию текущего объекта

			:return: Копия объекта
			:rtype:  :class:`LegendItem`

		.. py:method:: rect()

			Прямоугольник, который занимает данный элемент легенды

			:return: Ограничивающий прямоугольник
			:rtype: :class:`~PyQt5.QtCore.QRectF`

		.. py:method:: rect(pos)

			Прямоугольник, который занимает данный элемент легенды с указанием начальной точки

			:param pos: Левый верхний угол
			:type pos: :class:`~PyQt5.QtCore.QPointF`
			:return: Ограничивающий прямоугольник
			:rtype: :class:`~PyQt5.QtCore.QRectF`

		.. py:method:: refreshStyleItems()

			Обновление значений элементов легенды

		.. py:method:: draw(context)

			Отрисовка элемента легенды в заданном контексте

			:param context: Контекст, в котором будет отрисован элемент легенды
			:type context: :class:`~axioma.render.Context`

		.. py:method:: draw(context, pos)

			Отрисовка элемента легенды в заданном контексте

			:param context: Контекст, в котором будет отрисован элемент легенды
			:type context: :class:`~axioma.render.Context`
			:param pos: Левый верхний угол, если есть необходимость отрисовать в другом месте
			:type pos: :class:`~PyQt5.QtCore.QPointF`

		.. py:method:: drawSelected(context)

			Отрисовка выделения элемента легенды в заданном контексте

			:param context: Контекст, в котором будет отрисовано выделение элемента легенды
			:type context: :class:`~axioma.render.Context`

		.. py:method:: drawSelected(context, pos)

			Отрисовка выделения элемента легенды в заданном контексте

			:param context: Контекст, в котором будет отрисовано выделение элемент легенды
			:type context: :class:`~axioma.render.Context`
			:param pos: Левый верхний угол, если есть необходимость отрисовать в другом месте
			:type pos: :class:`~PyQt5.QtCore.QPointF`

		.. py:method:: name()

			Наименование элемента легенды

			:return: Наименование
			:rtype: :class:`str`

		.. py:method:: baseSizeStyleElement()

			Базовый размер элемента. Остальные параметры масштабируются относительно этого размера

			:return: Размер
			:rtype: :class:`~PyQt5.QtCore.QSize`

		.. py:method:: setBaseSizeStyleElement(value)

			Переопределение базового размера элемента

			:param value: размер
			:type value: :class:`~PyQt5.QtCore.QSize`

		.. py:method:: textRender()

			Отрисовщик элементов легенды

			:return: Установленное значение
			:rtype: :class:`TextRenderer`

		.. py:method:: setTextRender(value)

			Установка нового значения отрисовщика элемента

			:param value: Новое значение
			:type value: :class:`TextRenderer`

		.. py:method:: caption()

			Заголовок элемента легенды

			:return: Заголовок
			:rtype: :class:`str`

		.. py:method:: setCaption(value)

			Установка нового значения заголовка элемента легенды

			:param value: Новое значения заголовка
			:type value: :class:`str`

		.. py:method:: subCaption()

			Подзаголовок элемента легенды

			:return: Подзаголовок
			:rtype: :class:`str`

		.. py:method:: setSubCaption(value)

			Установка нового значения подзаголовка элемента легенды

			:param value: Новое значения подзаголовка
			:type value: :class:`str`

		.. py:method:: textRenderCaption()

			Отрисовщик заголовка легенды

			:return: Установленное значение
			:rtype: :class:`TextRenderer`

		.. py:method:: setTextRenderCaption(value)

			Установка нового значения отрисовщика заголовка легенды

			:param value: Новое значение
			:type value: :class:`TextRenderer`

		.. py:method:: textRenderSubCaption()

			Отрисовщик подзаголовка легенды

			:return: Установленное значение
			:rtype: :class:`TextRenderer`

		.. py:method:: setTextRenderSubCaption(value)

			Установка нового значения отрисовщика подзаголовка легенды

			:param value: Новое значение
			:type value: :class:`TextRenderer`

		.. py:method:: basePoint()

			Базовая точка, относительно которой производится отрисовка элемента легенды

			:return: Точка
			:rtype: :class:`~PyQt5.QtCore.QPointF`

		.. py:method:: setBasePoint(value)

			Установка нового значения базовой точки

			:param value: Значение
			:type value: :class:`~PyQt5.QtCore.QPointF`

		.. py:method:: borderStyle()

			Стиль окантовки. Если не указан (равен None), окантовка не рисуется.  По умолчанию окантовка отсутствует

			:return: Стиль
			:rtype: :class:`LineStringStyle`

		.. py:method:: setBorderStyle(style)

			Задание стиля окантовки

			:param style: Стиль. Значение None убирает окантовку
			:type style: :class:`LineStringStyle`

		.. py:method:: numberColumns()

			Количество колонок, на которые разбиваются элементы легенды. По умолчанию установлено значение 1.

			:return: Количество колонок.
			:rtype: :class:`int`

		.. py:method:: setNumberColumns(value)

			Задание количества колонок

			:param value: Количество колонок
			:type value: :class:`int`

		.. py:method:: space()

			Промежуток в пикселях между элементами легенды

			:return: Значение
			:rtype: :class:`int`

		.. py:method:: transform(transform)

			Преобразование (трансформирование) легенды

			:param transform: Матрица преобразования
			:type transform: :class:`~PyQt5.QtGui.QTransform`

		.. py:method:: setVisibledItem(index, value)

			Управление видимостью элемента легенды.

			:param index: Индекс
			:type index: :class:`int`
			:param value: True, если необходимо сделать видимым. В противном случае False
			:type value: :class:`bool`

		.. py:method:: setDescriptionItem(index, value)

			Изменение описания элемента легенды

			:param index: Индекс
			:type index: :class:`int`
			:param value: Новое описание элемента
			:type value: :class:`str`

		.. py:method:: moveItem(oldPos, newPos)

			Перемещение (смена позиции) элемента легенды

			:param oldPos: Старая позиция
			:type oldPos: :class:`bool`
			:param newPos: Новая позиция
			:type newPos: :class:`float`

		.. py:method:: styleItems()

			Список элементов легенды

			:return: Список
			:rtype: :class:`list` [:class:`LegendItemComponent`]

		.. py:method:: styleItemAt(index)

			Возвращает элемент по его индексу

			:param index:  Индекс
			:type index: :class:`int`
			:return: Элемент
			:rtype: :class:`LegendItemComponent`

		.. py:method:: updateComponent(index, component)

			Замена существующего элемента легенды новым значением

			:param index:  Индекс
			:type index: :class:`int`
			:param component: Замещающий элемент
			:type component: :class:`LegendItemComponent`

		.. method:: aboutToBeDestroyed()

			[signal] Сигнал, который срабатывает при удалении легенды

  
Пример использования:

  .. code-block:: python
  
    # Импорт
    from axioma.render import *

    from PyQt5.QtCore import  *
    from PyQt5.QtGui import *
    from PyQt5.QtWidgets import *

    class StyleDialog(QDialog):

        def __init__(self, parent, layers):
            QDialog.__init__(self, parent)
            self.setGeometry(200, 200, 600, 400)
            self.setWindowTitle('Пример легенды')
            self.layers = layers # Перечень слоев, для которых будет строиться легенда
            self.image = QImage()  # временный растр, куда производится отрисовка легенды
            
    # Создание контекста
        def createContext(self, painter):
            deviceRect = sceneRect = QRectF(0,0,100,100)
            viewport = Viewport (deviceRect,sceneRect)
            return Context(painter, viewport)
            
    # Отрисовка элемента легенды
        def drawElement(self, fi, context, pos):
            r = fi.rect()
            fi.draw(context, pos)
            pos.setY(pos.y() + 10 + r.height())
            return pos
            
        def renderLegend(self): # Рисуем в растр
            self.image = QImage(self.size(), QImage.Format_ARGB32_Premultiplied)
            painter = QPainter(self.image)
            painter.fillRect(self.image.rect(), Qt.white)
            context = self.createContext(painter)
            pos = QPoint(10, 10)
            for lay in self.layers:
                if isinstance(lay, HasStyles): # Если есть легенда
                    fi = FeatureLegendItem(lay, lay.name(), self)
                    pos = self.drawElement(fi, context, pos)
                    if isinstance(lay, LayerWithThematic):
                        thematics  = lay.createLegendsList() # Перечень легенд для тематики, если таковые имеются
                        for them in thematics:
                            pos = self.drawElement(them, context, pos)

        def paintEvent(self, event):
            try:
                painter = QPainter(self)
                if not self.image.isNull():
                    painter.drawImage(0,0, self.image)
            except Exception as ex:
                print(ex)
                
        def resizeEvent(self, event):
            self.renderLegend()
            
    # Текущая карта
    mapview = axioma.app.mainWindow.mapViewManager().currentMapView()
    if mapview is not None:
        layers = mapview.map().flatLayerList() # Список слоев карты
        dlg = StyleDialog(axioma.app.mainWindow, layers)
        dlg.exec()
    else:
        QMessageBox.information(axioma.app.mainWindow, QObject().tr("Информация"), QObject().tr("Текущая карта не найдена"))
