diff --git a/src/dymoprint/gui/gui.py b/src/dymoprint/gui/gui.py index c865c05..50c2d6f 100644 --- a/src/dymoprint/gui/gui.py +++ b/src/dymoprint/gui/gui.py @@ -8,6 +8,7 @@ from PyQt6.QtGui import QIcon, QPixmap from PyQt6.QtWidgets import ( QApplication, + QCheckBox, QComboBox, QGraphicsDropShadowEffect, QHBoxLayout, @@ -58,6 +59,7 @@ def __init__(self): self.min_label_width_mm = QSpinBox() self.justify = QComboBox() self.info_label = QLabel() + self.preview_show_margins = QCheckBox() self.last_error = None self.dymo_labeler = None @@ -104,6 +106,7 @@ def init_elements(self): self.background_color.addItems( ["white", "black", "yellow", "blue", "red", "green"] ) + self.preview_show_margins.setChecked(False) self.update_params() self.label_list.populate() @@ -126,6 +129,7 @@ def init_connections(self): self.label_list.renderPrintPreviewSignal.connect(self.update_preview_render) self.label_list.renderPrintPayloadSignal.connect(self.update_print_render) self.print_button.clicked.connect(self.print_label) + self.preview_show_margins.stateChanged.connect(self.update_params) def init_layout(self): settings_widget = QToolBar(self) @@ -145,6 +149,8 @@ def init_layout(self): settings_widget.addWidget(self.foreground_color) settings_widget.addWidget(QLabel(" on ")) settings_widget.addWidget(self.background_color) + settings_widget.addWidget(QLabel("Show margins:")) + settings_widget.addWidget(self.preview_show_margins) render_widget = QWidget(self) label_render_widget = QWidget(render_widget) @@ -189,6 +195,7 @@ def update_params(self): self.render_context.foreground_color = self.foreground_color.currentText() self.render_context.background_color = self.background_color.currentText() self.render_context.height_px = self.dymo_labeler.height_px + self.render_context.preview_show_margins = self.preview_show_margins.isChecked() self.label_list.update_params( dymo_labeler=self.dymo_labeler, diff --git a/src/dymoprint/gui/q_dymo_labels_list.py b/src/dymoprint/gui/q_dymo_labels_list.py index 4db2e38..c3a2a2b 100644 --- a/src/dymoprint/gui/q_dymo_labels_list.py +++ b/src/dymoprint/gui/q_dymo_labels_list.py @@ -187,7 +187,7 @@ def render_print(self): min_width_px=mm_to_px(self.min_label_width_mm), ) try: - bitmap = render_engine.render(self.render_context) + bitmap, _ = render_engine.render(self.render_context) except BaseException as err: # noqa: BLE001 crash_msg_box(self, "Render Engine Failed!", err) bitmap = EmptyRenderEngine().render(self.render_context) diff --git a/src/dymoprint/lib/render_engines/margins.py b/src/dymoprint/lib/render_engines/margins.py index 7eaa5c7..b1e2257 100644 --- a/src/dymoprint/lib/render_engines/margins.py +++ b/src/dymoprint/lib/render_engines/margins.py @@ -104,4 +104,8 @@ def render(self, context: RenderContext) -> Image.Image: bitmap.paste( payload_bitmap, box=(round(horizontal_offset_px), round(vertical_offset_px)) ) - return bitmap + meta = { + "horizontal_offset_px": horizontal_offset_px, + "vertical_offset_px": vertical_offset_px, + } + return bitmap, meta diff --git a/src/dymoprint/lib/render_engines/print_preview.py b/src/dymoprint/lib/render_engines/print_preview.py index ff3541e..906bc29 100644 --- a/src/dymoprint/lib/render_engines/print_preview.py +++ b/src/dymoprint/lib/render_engines/print_preview.py @@ -1,6 +1,6 @@ from __future__ import annotations -from PIL import Image, ImageColor, ImageOps +from PIL import Image, ImageColor, ImageDraw, ImageOps from dymoprint.lib.render_engines.margins import MarginsMode, MarginsRenderEngine from dymoprint.lib.render_engines.render_context import RenderContext @@ -8,6 +8,9 @@ class PrintPreviewRenderEngine(RenderEngine): + MARGIN_PX = 20 + DX = MARGIN_PX * 0.2 + def __init__( self, render_engine: RenderEngine, @@ -29,7 +32,7 @@ def __init__( ) def _get_preview_bitmap(self, context: RenderContext): - label_bitmap = self.render_engine.render(context) + label_bitmap, meta = self.render_engine.render(context) bitmap = ImageOps.invert(label_bitmap.convert("L")).convert("RGBA") pixel_map = { "black": context.foreground_color, @@ -44,7 +47,41 @@ def _get_preview_bitmap(self, context: RenderContext): for x in range(0, width): for y in range(0, height): pixdata[x, y] = pixel_map[pixdata[x, y]] - return bitmap + return bitmap, meta + + def _show_margins(self, preview_bitmap, bitmap, meta, context): + draw = ImageDraw.Draw(bitmap) + x = meta["horizontal_offset_px"] + y = meta["vertical_offset_px"] + width, height = bitmap.size + preview_width, preview_height = preview_bitmap.size + lines = [ + (self.MARGIN_PX + x, 0, self.MARGIN_PX + x, height), + ( + self.MARGIN_PX + preview_width - x, + 0, + self.MARGIN_PX + preview_width - x, + height, + ), + (0, self.MARGIN_PX + y, width, self.MARGIN_PX + y), + ( + 0, + self.MARGIN_PX + preview_height - y, + width, + self.MARGIN_PX + preview_height - y, + ), + ] + for line in lines: + draw.line(line, fill=context.foreground_color) def render(self, context: RenderContext) -> Image.Image: - return self._get_preview_bitmap(context) + preview_bitmap, meta = self._get_preview_bitmap(context) + preview_width, preview_height = preview_bitmap.size + width = preview_width + self.MARGIN_PX * 2 + height = preview_height + self.MARGIN_PX * 2 + bitmap = Image.new("RGBA", (width, height), color=(255, 0, 0, 0)) + bitmap.paste(preview_bitmap, box=(self.MARGIN_PX, self.MARGIN_PX)) + if context.preview_show_margins: + self._show_margins(preview_bitmap, bitmap, meta, context) + + return bitmap diff --git a/src/dymoprint/lib/render_engines/render_context.py b/src/dymoprint/lib/render_engines/render_context.py index f2bb066..652960f 100644 --- a/src/dymoprint/lib/render_engines/render_context.py +++ b/src/dymoprint/lib/render_engines/render_context.py @@ -5,6 +5,7 @@ class _RenderContextFieldName(Enum): BACKGROUND_COLOR = 1 FOREGROUND_COLOR = 2 HEIGHT_PX = 3 + PREVIEW_SHOW_MARGINS = 4 class RenderContext: