qgis_layout_plugin/plot_layout/layouts/layout.py

70 lines
2.1 KiB
Python

from qgis.PyQt.QtCore import (
QUrl,
QSize
)
from qgis.core import (
QgsLayoutItem,
QgsLayoutItemRegistry,
QgsLayoutItemAbstractMetadata,
QgsNetworkAccessManager,
QgsMessageLog,
QgsGeometry
)
from qgis.PyQt.QtWebKitWidgets import QWebPage
ITEM_TYPE = QgsLayoutItemRegistry.PluginItem + 1338
class LoggingWebPage(QWebPage):
def __init__(self, parent=None):
super().__init__(parent)
def javaScriptConsoleMessage(self, message, lineNumber, source):
QgsMessageLog.logMessage('{}:{} {}'.format(source, lineNumber, message), 'plot-layout')
class PlotLayoutItem(QgsLayoutItem):
def __init__(self, layout):
super().__init__(layout)
self.web_page = LoggingWebPage(self)
self.web_page.mainFrame().setZoomFactor(30.0)
self.html_units_to_layout_units = self.calculate_html_units_to_layout_units()
def calculate_html_units_to_layout_units(self):
if not self.layout():
return 1
return 72
def draw(self, context):
base_url = QUrl.fromLocalFile(self.layout().project().absoluteFilePath())
self.web_page.setViewportSize(QSize(self.rect().width() * self.html_units_to_layout_units,
self.rect().height() * self.html_units_to_layout_units))
self.web_page.mainFrame().setHtml('<b>Hello</b>', base_url)
# almost a direct copy from QgsLayoutItemLabel!
painter = context.renderContext().painter()
painter.save()
# painter is scaled to dots, so scale back to layout units
painter.scale(context.renderContext().scaleFactor() / self.html_units_to_layout_units,
context.renderContext().scaleFactor() / self.html_units_to_layout_units)
self.web_page.mainFrame().render(painter)
def type(self):
return ITEM_TYPE
class PlotLayoutItemMetadata(QgsLayoutItemAbstractMetadata):
def __init__(self):
super().__init__(ITEM_TYPE, 'layoutItem')
def createItem(self, layout):
return PlotLayoutItem(layout)