Apply line style to exported diagrams

This commit is contained in:
Arjan Molenaar 2020-07-10 10:57:40 +02:00
parent 7ae5f57f56
commit 84848137d2
6 changed files with 30 additions and 28 deletions

View File

@ -219,7 +219,8 @@ class Diagram(PackageableElement):
@property
def styleSheet(self) -> Optional[StyleSheet]:
return next(self._model.select(StyleSheet), None) if self._model else None
model = self.model
return next(model.select(StyleSheet), None)
def style(self, node: StyleNode) -> Style:
styleSheet = self.styleSheet

View File

@ -62,8 +62,10 @@ class DiagramExport(Service, ActionProvider):
if save and filename:
return filename
def update_painters(self, view):
sloppiness = self.properties.get("diagram.sloppiness", 0)
def update_painters(self, view, diagram):
style = diagram.style(diagram)
sloppiness = style.get("line-style", 0.0)
if sloppiness:
view.painter = FreeHandPainter(ItemPainter(), sloppiness)
@ -71,10 +73,11 @@ class DiagramExport(Service, ActionProvider):
view.painter = ItemPainter()
view.bounding_box_painter = BoundingBoxPainter(view.painter)
def render(self, canvas, new_surface):
def render(self, diagram, new_surface):
canvas = diagram.canvas
view = View(canvas)
self.update_painters(view)
self.update_painters(view, diagram)
# Update bounding boxes with a temporary CairoContext
# (used for stuff like calculating font metrics)
@ -92,22 +95,22 @@ class DiagramExport(Service, ActionProvider):
cr.show_page()
return surface
def save_svg(self, filename, canvas):
surface = self.render(canvas, lambda w, h: cairo.SVGSurface(filename, w, h))
def save_svg(self, filename, diagram):
surface = self.render(diagram, lambda w, h: cairo.SVGSurface(filename, w, h))
surface.flush()
surface.finish()
def save_png(self, filename, canvas):
def save_png(self, filename, diagram):
surface = self.render(
canvas,
diagram,
lambda w, h: cairo.ImageSurface(
cairo.FORMAT_ARGB32, int(w + 1), int(h + 1)
),
)
surface.write_to_png(filename)
def save_pdf(self, filename, canvas):
surface = self.render(canvas, lambda w, h: cairo.PDFSurface(filename, w, h))
def save_pdf(self, filename, diagram):
surface = self.render(diagram, lambda w, h: cairo.PDFSurface(filename, w, h))
surface.flush()
surface.finish()
@ -122,7 +125,7 @@ class DiagramExport(Service, ActionProvider):
diagram = self.diagrams.get_current_diagram()
filename = self.save_dialog(diagram, title, ext)
if filename:
self.save_svg(filename, diagram.canvas)
self.save_svg(filename, diagram)
@action(
name="file-export-png",
@ -135,7 +138,7 @@ class DiagramExport(Service, ActionProvider):
diagram = self.diagrams.get_current_diagram()
filename = self.save_dialog(diagram, title, ext)
if filename:
self.save_png(filename, diagram.canvas)
self.save_png(filename, diagram)
@action(
name="file-export-pdf",
@ -148,4 +151,4 @@ class DiagramExport(Service, ActionProvider):
diagram = self.diagrams.get_current_diagram()
filename = self.save_dialog(diagram, title, ext)
if filename:
self.save_pdf(filename, diagram.canvas)
self.save_pdf(filename, diagram)

View File

@ -0,0 +1 @@
from gaphor.diagram.tests.fixtures import diagram, element_factory, event_manager

View File

@ -3,7 +3,6 @@ from typing import Dict
import pytest
import gaphor.ui.menufragment
from gaphor.core.modeling.diagram import Diagram
from gaphor.diagram.general import Box
from gaphor.plugins.diagramexport import DiagramExport
@ -17,35 +16,33 @@ def diagram_export():
@pytest.fixture
def canvas():
d = Diagram()
c = d.canvas
c.add(Box())
return c
def diagram_with_box(diagram):
diagram.create(Box)
return diagram
def test_export_to_svg(diagram_export, canvas, tmp_path):
def test_export_to_svg(diagram_export, diagram_with_box, tmp_path):
f = tmp_path / "test.svg"
diagram_export.save_svg(f, canvas)
diagram_export.save_svg(f, diagram_with_box)
content = f.read_text()
assert "<svg" in content
def test_export_to_png(diagram_export, canvas, tmp_path):
def test_export_to_png(diagram_export, diagram_with_box, tmp_path):
f = tmp_path / "test.png"
diagram_export.save_png(f, canvas)
diagram_export.save_png(f, diagram_with_box)
content = f.read_bytes()
assert b"PNG" in content
def test_export_to_pdf(diagram_export, canvas, tmp_path):
def test_export_to_pdf(diagram_export, diagram_with_box, tmp_path):
f = tmp_path / "test.pdf"
diagram_export.save_pdf(f, canvas)
diagram_export.save_pdf(f, diagram_with_box)
content = f.read_bytes()
assert b"%PDF" in content

View File

@ -295,7 +295,6 @@ class DiagramPage:
item_painter = ItemPainter()
view = self.view
view.bounding_box_painter = BoundingBoxPainter(item_painter)
if sloppiness:
item_painter = FreeHandPainter(ItemPainter(), sloppiness=sloppiness)
@ -307,6 +306,7 @@ class DiagramPage:
.append(FocusedItemPainter())
.append(ToolPainter())
)
view.bounding_box_painter = BoundingBoxPainter(item_painter)
view.queue_draw_refresh()

2
poetry.lock generated
View File

@ -210,7 +210,7 @@ importlib_metadata = "^1.3.0"
pycairo = "^1.13.0"
[package.source]
reference = "de0a8c69dc7161e2cc3d48527a4dc25d22fc4b5b"
reference = "4f089f1789c0a15cc57838c1b8fe7847533a2368"
type = "git"
url = "https://github.com/gaphor/gaphas.git"
[[package]]