Export scene: Fix scale/margins when scene has been scaled/moved (#83)

This commit is contained in:
Rebecca Breu 2023-12-27 23:19:10 +01:00
parent 6f6afa3d8c
commit 310ca140e0
2 changed files with 20 additions and 13 deletions

View file

@ -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

View file

@ -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):