Apply line style to exported diagrams
This commit is contained in:
parent
7ae5f57f56
commit
84848137d2
@ -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
|
||||
|
@ -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)
|
||||
|
1
gaphor/plugins/diagramexport/tests/conftest.py
Normal file
1
gaphor/plugins/diagramexport/tests/conftest.py
Normal file
@ -0,0 +1 @@
|
||||
from gaphor.diagram.tests.fixtures import diagram, element_factory, event_manager
|
@ -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
|
||||
|
@ -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
2
poetry.lock
generated
@ -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]]
|
||||
|
Loading…
x
Reference in New Issue
Block a user