From b3eaafbbe53a96af7404d0119686b0b7cbecebe9 Mon Sep 17 00:00:00 2001 From: localhorst Date: Fri, 5 Dec 2025 21:41:52 +0100 Subject: [PATCH] print checkbox --- layouter.py | 57 +++++++++++++++++++++++++++++++++++++++++++++------- output.png | Bin 4530 -> 4711 bytes 2 files changed, 50 insertions(+), 7 deletions(-) diff --git a/layouter.py b/layouter.py index b719642..a8d0583 100644 --- a/layouter.py +++ b/layouter.py @@ -49,7 +49,7 @@ class DriveData: @dataclasses.dataclass class DriveDataJson: state: str - connection_type: str + contype: str fam: str name: str cap: int @@ -153,17 +153,19 @@ def format_to_printable(drive): cut_string(30, str(datetime.timedelta(seconds=drive.shred_duration)), "end"), ) - def draw_text(drawable, printable_data, font_regular, font_bold, font_bold_bigger): """Draws formatted text with Cycles and Errors on one row.""" - + y_start = 4 line_height = 26 label_x = TEXT_X_OFFSET value_offset = 115 right_field_spacing = 200 # Horizontal gap between Cycles and Errors x_capacity = 520 y_capacity = 142 - y_start = 4 + x_connection_type = 600 + y_connection_type = y_start + y_spacing_connection_type = 25 + # Serial Number drawable.text((label_x, y_start), "Serial:", fill=0, font=font_bold) @@ -250,6 +252,49 @@ def draw_text(drawable, printable_data, font_regular, font_bold, font_bold_bigge font=font_bold_bigger, ) + if (printable_data.connectiontype == "sata"): + drawable.text( + (x_connection_type, y_connection_type), + "⬤ SATA", + fill=0, + font=font_regular, + ) + + drawable.text( + (x_connection_type, y_connection_type+y_spacing_connection_type), + "◯ NVME", + fill=0, + font=font_regular, + ) + elif (printable_data.connectiontype == "nvme"): + drawable.text( + (x_connection_type, y_connection_type), + "◯ SATA", + fill=0, + font=font_regular, + ) + + drawable.text( + (x_connection_type, y_connection_type+y_spacing_connection_type), + "⬤ NVME", + fill=0, + font=font_regular, + ) + else: + drawable.text( + (x_connection_type, y_connection_type), + "◯ SATA", + fill=0, + font=font_regular, + ) + + drawable.text( + (x_connection_type, y_connection_type+y_spacing_connection_type), + "◯ NVME", + fill=0, + font=font_regular, + ) + def draw_qr_code(image, data): """ @@ -274,7 +319,6 @@ def draw_qr_code(image, data): region = (5, 5, 5 + QR_CODE_SIZE, 5 + QR_CODE_SIZE) image.paste(qr_img, box=region) - def draw_outline(drawable, margin, width, output_width, output_height): """ Draws a rectangular outline on the drawable canvas. @@ -303,14 +347,13 @@ def draw_outline(drawable, margin, width, output_width, output_height): for line in lines: drawable.line(line, fill=0, width=width) - def generate_image(drive, rehdd_info, output_file): """Generates an image containing drive data and a QR code.""" try: drive_json = DriveDataJson( state=drive.drive_state, - connection_type=drive.drive_connection_type, + contype=drive.drive_connection_type, fam=drive.modelfamily, name=drive.modelname, cap=drive.capacity, diff --git a/output.png b/output.png index 7f9d9dc9308fb55d22e15eeb4fef43c8b265cc95..6d01057d63f570356c282e481838b386208d367f 100644 GIT binary patch literal 4711 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