MainWindow
==========

.. currentmodule:: axioma.app

.. class:: MainWindow
	
	Данный класс представляет собой главное окно приложения.

	Унаследован от: :class:`~PyQt5.QtWidgets.QMainWindow`

		.. staticmethod:: create(gui, parent=None)

			Фабричный метод для создания объекта

			:param gui: сервис пользовательского интерфейса
			:type gui: :class:`~axioma.gui.Gui`
			:param parent: родительский виджет
			:type parent: :class:`~PyQt5.QtWidgets.QWidget` или :any:`None`
			:return: Новый созданный объект
			:rtype: :class:`~axioma.app.MainWindow`

		.. method:: listTables()

			.. deprecated:: >2.0.1
				используйте более обобщенный подход получения списка таблиц \
				через список всех объектов :meth:`axioma.core.dp.DataCatalogInterface.allDataObjects` \
				и функций :func:`filter` и :func:`isinstance`

				.. code-block:: python

					import axioma.core.dp
					object_list=axioma.app.mainWindow.dataCatalog().allDataObjects()
					table_filter_function=lambda obj: isinstance(obj, axioma.core.dp.Table)
					table_list=list(filter(table_filter_function, object_list))

			Метод позволяющий получить список таблиц

			:return: Список открытых таблиц
			:rtype: :class:`list` [:class:`~axioma.core.dp.Table`]

		.. method:: createFile()

			Метод, предназначенный для вызова диалога "Создать файл"

		.. method:: openFile()

			Метод, предназначенный для вызова диалога "Открыть файл"

		.. method:: openFile(filename)

			Метод позволяющий открыть файл, указав путь

			:param filename: наименование файла
			:type filename: :class:`str`
			:return: успешность выполнения операции
			:rtype: :class:`bool`

		.. method:: openFile(filename, open_mode)

			Метод позволяющий открыть файл, указав путь и способ представления

			:param filename: наименование файла
			:type filename: :class:`str`
			:param open_mode: способ представления
			:type open_mode: :class:`OpenMode`
			:return: успешность выполнения операции
			:rtype: :class:`bool`

		.. method:: openDatabaseSql()

			Метод, предназначенный для вызова диалога "Открытие источника данных SQL"

		.. method:: closeDataObjects(dataObjectRefs)

			Закрыть объекты данных

			:param dataObjectRefs: список объектов данных
			:type dataObjectRefs: :class:`list` [:class:`~axioma.core.dp.DataObjectRef`]
			:return: успешность выполнения операции
			:rtype: :class:`bool`

		.. method:: closeDataObject()

			Вызов диалога "Закрыть объект данных"

			:return: успешность выполнения операции
			:rtype: :class:`bool`

		.. method:: closeAllDataObjects()

			Закрыть все объекты данных

			:return: успешность выполнения операции
			:rtype: :class:`bool`

		.. method:: closeAll()

			Закрыть все

			:return: успешность выполнения операции
			:rtype: :class:`bool`

			Метод, предназначенный для выполнения команды "Вырезать"

		.. method:: showTableData(table)

			Отображает таблицу в виде таблицы просмотра и возвращает отображаемый TableWindow

			:param table: таблица для отображения
			:type table: :class:`~axioma.core.dp.Table`
			:return: отображаемый TableWindow
			:rtype: :class:`~axioma.gui.TableWindow`

		.. method:: showSearchDialog()

			Метод, предназначенный для выполнения поиска в таблице

		.. method:: showColumnUpdateDialog()

			Метод, предназначенный для выполнения операции "Обновить колонку"

		.. method:: registerRaster()

			Метод, предназначенный для вызова диалога регистрации растра

		.. method:: openPreferences()

			Метод, предназначенный для вызова диалога "Параметры"

		.. method:: openReportTemplate()

			Метод, предназначенный для открытия шаблона отчета

		.. method:: setActiveSubWindow(window_name)

			Установить окно активным через его имя

			:param window_name: наименование окна
			:type window_name: :class:`str`

		.. method:: setActiveSubWindow(widget)

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

			:param widget: экземпляр окна
			:type widget: :class:`~PyQt5.QtWidgets.QWidget`

		.. method:: setActiveSubWindow(dataObject)

			Установить окно активным через объект данных

			:param dataObject: объект данных
			:type dataObject: :class:`~axioma.core.dp.DataObject`

		.. method:: openCustomZoom()

			Показать по-другому

		.. method:: openLayersControl()

			Отобразить панель управления слоями

		.. method:: newBrowser()

			Создание нового окна списка. Если в системе присутствует более чем один источник данных, будет выдан запрос на выбор необходимого.
			
			:return: Созданные объекты TableWindow в виде списка
			:rtype: :class:`~axioma.gui.TableWindow`

		.. method:: newMap()

			Создание нового окна карты. Если источников данных более одного, будет вызван диалог выбора слоев и их порядка.
			
			:return: Созданный объекты MapView
			:rtype: :class:`~axioma.gui.MapView`

		.. method:: newReport()
		
			:return: Созданный объекты ReportView
			:rtype: :class:`~axioma.gui.ReportView`

			Создание нового окна отчета

		.. method:: newLegend()
		
			:return: Созданное окно легенды LegendView
			:rtype: :class:`~axioma.gui.LegendView`


			Создание новой легенды

		.. method:: newThematic()

			Вызов диалога создания нового тематического слоя для текущей карты

		.. method:: saveTables()

			Выполнить сохранение изменений в таблицах

		.. method:: exportRaster()

			Экспортировать окно в растр

		.. method:: openWorkspace()

			Вызов диалога "Открыть рабочее пространство"

		.. method:: openWorkspace(filename)

			Открыть рабочее пространство

			:param filename: наименование файла
			:type filename: :class:`str`

		.. method:: saveWorkspace()

			Вызов диалога "Сохранить рабочее пространство"

		.. method:: saveWorkspace(filename)

			Сохранить рабочее пространство

			:param filename: наименование файла
			:type filename: :class:`str`

		.. method:: registerDataObject(dataObject, openMode=OpenMode_Undefined)

			Добавить указанный объект данных в главное окно

			:param dataObject: объект данных
			:type dataObject: :class:`~axioma.core.dp.DataObject`
			:param openMode: способ представления
			:type openMode: :class:`~app.OpenTypeMode`
			:return: Зарегистрированный объект данных
			:rtype: :class:`~axioma.core.dp.DataObject`

		.. method:: addPanel(dock)

			Добавить плавающую панель

			:param dock: плавающая панель
			:type dock: :class:`~PyQt5.QtWidgets.QDockWidget`

		.. method:: mapViewManager()

			.. deprecated:: >2.0.1
				используйте более обобщенный :class:`axioma.gui.WidgetManagerService`

			Метод, позволяющий получить доступ к менеджеру карт

			:return: менеджер карт
			:rtype: :class:`~axioma.gui.MapViewManager`

		.. method:: dataCatalog()

			Метод, позволяющий получить доступ к каталогу открытых источников данных. 

			:return: каталог открытых источников данных
			:rtype: :class:`~axioma.core.dp.DataCatalogWithSelection`
			
		.. py:method:: createMapViewForLayerList(layers, title=None)

			Создает новое окно просмотра карты на базе перечня слоев

			:param layers: Перечень слоев
			:type layers: :class:`list` [:class:`~axioma.render.Layer`]
			:param title: Заголовок окна. Если не указан, задается по умолчанию.
			:type title: :class:`str`
			:return: Созданный объект
			:rtype: :class:`~axioma.gui.MapView`

Пример создания окна карты и таблицы просмотра в главном окне приложения:

  .. code-block:: python
  
		import axioma.app
		from PyQt5.QtCore import QRectF, QPointF

		# Открываем таблицу
		table = axioma.core.open_json({"src" : "/tmp/world.tab"})
		# Если нужно, чтобы пользователь видел таблицу в списке открытых данных,
		# добавляем её в каталог приложения
		axioma.app.mainWindow.dataCatalog().addDataObject(table) 
		# Создаём слой для таблицы
		layer = axioma.app.render.createLayerForDataObject(table)
		# Создаём окно карты и показываем его в главном окне
		mapView = axioma.app.mainWindow.createMapViewForLayerList([layer], 'Моя карта')
		#
		# Попробуем заменить координатную систему для карты, если нам это необходимо.
		# Текущую КС карты можно взять так: mapView.viewport().coordSystem()
		# КС таблицы можно взять так: table.coordSystem()
		# Или создать с помощью CoordSysFactory:
		cs = axioma.app.csfactory.createFromEpsg(4326);
		# Задаем новую область отображения:
		rect_cs = cs.rectNumericCoordSys()
		rect_device = QRectF(mapView.rect())
		rect_cs.setHeight(rect_cs.width() / ( rect_device.width() / rect_device.height())) # пропорционально размеру окна виджета
		viewport = axioma.render.MapViewport(rect_device, rect_cs, cs)
		# Устанавливаем область отображения для карты
		mapView.setViewport(viewport)
		# Показываем таблицу в виде списка
		axioma.app.mainWindow.showTableData(table)
