Skip to content

Commit

Permalink
Show preview margins
Browse files Browse the repository at this point in the history
  • Loading branch information
Tomer Shalev committed Feb 10, 2024
1 parent 5c8419c commit 5de5f31
Show file tree
Hide file tree
Showing 5 changed files with 55 additions and 6 deletions.
7 changes: 7 additions & 0 deletions src/dymoprint/gui/gui.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from PyQt6.QtGui import QIcon, QPixmap
from PyQt6.QtWidgets import (
QApplication,
QCheckBox,
QComboBox,
QGraphicsDropShadowEffect,
QHBoxLayout,
Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -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()
Expand All @@ -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)
Expand All @@ -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)
Expand Down Expand Up @@ -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,
Expand Down
2 changes: 1 addition & 1 deletion src/dymoprint/gui/q_dymo_labels_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
6 changes: 5 additions & 1 deletion src/dymoprint/lib/render_engines/margins.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
45 changes: 41 additions & 4 deletions src/dymoprint/lib/render_engines/print_preview.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
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
from dymoprint.lib.render_engines.render_engine import RenderEngine


class PrintPreviewRenderEngine(RenderEngine):
MARGIN_PX = 20
DX = MARGIN_PX * 0.2

def __init__(
self,
render_engine: RenderEngine,
Expand All @@ -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,
Expand All @@ -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
1 change: 1 addition & 0 deletions src/dymoprint/lib/render_engines/render_context.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ class _RenderContextFieldName(Enum):
BACKGROUND_COLOR = 1
FOREGROUND_COLOR = 2
HEIGHT_PX = 3
PREVIEW_SHOW_MARGINS = 4


class RenderContext:
Expand Down

0 comments on commit 5de5f31

Please sign in to comment.