diff --git a/beeref/fileio/export.py b/beeref/fileio/export.py index c8168d0..583690a 100644 --- a/beeref/fileio/export.py +++ b/beeref/fileio/export.py @@ -36,13 +36,15 @@ class SceneToPixmapExporter: # Selection outlines/handles will be rendered to the exported # image, so deselect first. (Alternatively, pass an attribute # to paint functions to not paint them?) - rect = scene.itemsBoundingRect() + rect = self.scene.itemsBoundingRect() + logger.trace(f'Items bounding rect: {rect}') size = QtCore.QSize(int(rect.width()), int(rect.height())) + logger.trace(f'Export size without margins: {size}') self.margin = max(size.width(), size.height()) * 0.03 self.default_size = size.grownBy( QtCore.QMargins(*([int(self.margin)] * 4))) - logger.debug(f'Default export size: {self.default_size}') logger.debug(f'Default export margin: {self.margin}') + logger.debug(f'Default export size with margins: {self.default_size}') def render_to_image(self, size): logger.debug(f'Final export size: {size}') @@ -52,12 +54,15 @@ class SceneToPixmapExporter: image = QtGui.QImage(size, QtGui.QImage.Format.Format_RGB32) image.fill(QtGui.QColor(*constants.COLORS['Scene:Canvas'])) painter = QtGui.QPainter(image) - painter.setViewport(QtCore.QRect( - int(margin), - int(margin), - int(size.width() - 2 * margin), - int(size.height() - 2 * margin))) - self.scene.render(painter) + target_rect = QtCore.QRectF( + margin, + margin, + size.width() - 2 * margin, + size.height() - 2 * margin) + logger.trace(f'Final export target_rect: {target_rect}') + self.scene.render(painter, + source=self.scene.itemsBoundingRect(), + target=target_rect) painter.end() return image diff --git a/tests/fileio/test_export.py b/tests/fileio/test_export.py index 41e33b6..12b775e 100644 --- a/tests/fileio/test_export.py +++ b/tests/fileio/test_export.py @@ -1,6 +1,6 @@ import os import stat -from unittest.mock import patch +from unittest.mock import patch, ANY import pytest from PyQt6 import QtGui, QtCore @@ -46,8 +46,8 @@ def test_scene_to_pixmap_exporter_default_size_and_margin_when_selection(view): assert exporter.default_size == QtCore.QSize(318, 118) -@patch('PyQt6.QtGui.QPainter.setViewport') -def test_scene_to_pixmap_exporter_render_sets_margins(set_mock, view): +@patch('beeref.scene.BeeGraphicsScene.render') +def test_scene_to_pixmap_exporter_render_sets_margins(render_mock, view): item = BeePixmapItem( QtGui.QImage(1000, 1200, QtGui.QImage.Format.Format_RGB32)) view.scene.addItem(item) @@ -56,8 +56,10 @@ def test_scene_to_pixmap_exporter_render_sets_margins(set_mock, view): assert exporter.default_size == QtCore.QSize(1072, 1272) exporter.render_to_image(QtCore.QSize(536, 636)) - set_mock.assert_called_once_with( - QtCore.QRect(18, 18, 500, 600)) + render_mock.assert_called_once_with( + ANY, + source=QtCore.QRectF(0, 0, 1000, 1200), + target=QtCore.QRectF(18, 18, 500, 600)) def test_scene_to_pixmap_exporter_render_renders_scene(view):