From 9803e7bdabc275d8dde59db2d8a9504d801450ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9opold=20Koprivnik?= Date: Fri, 29 Mar 2024 15:04:28 +0100 Subject: [PATCH] Allow to choose the number of letters to underline (#14) Co-authored-by: SkwalExe --- CHANGELOG.md | 10 ++++-- README.md | 10 ++---- assets/style2.png | Bin 15344 -> 0 bytes src/styles/all_underlined.py | 9 ----- src/styles/first_letter_underlined.py | 4 +-- src/styles/underline_core.py | 49 ++++++++++++-------------- 6 files changed, 35 insertions(+), 47 deletions(-) delete mode 100644 assets/style2.png delete mode 100644 src/styles/all_underlined.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 61cf309..e4e15f4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,13 @@ -# v1.1.1 - Unreleased +# v2.0.0 - Unreleased + +### Added +- Custom number of letters to underline + +### Fixed +- Error when entering decimal numbers ### Dependencies -- pillow : `9.5.0` -> `10.1.0` +- pillow : `9.5.0` -> `10.2.0` - click-extra : `4.6.0` -> `4.7.2` # v1.1.0 - 2023-10-02 diff --git a/README.md b/README.md index e288257..1e7a0d1 100644 --- a/README.md +++ b/README.md @@ -42,19 +42,15 @@ python3 src/main.py # Styles -### Style 1 - First letter underlined +### Style 1 - First letters underlined + +> The number of letters to underline is customizable since version 2.0.0

-### Style 2 - All letters underlined - -

- -

- # Color schemes ### Color scheme 1 - adi1090x's color scheme diff --git a/assets/style2.png b/assets/style2.png deleted file mode 100644 index 206c8ba8639f129a8fbed5455d2407801f009f7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15344 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 F{}-qf)-(VB diff --git a/src/styles/all_underlined.py b/src/styles/all_underlined.py deleted file mode 100644 index bdb55d7..0000000 --- a/src/styles/all_underlined.py +++ /dev/null @@ -1,9 +0,0 @@ -from . import underline_core - -display_name = "All text underlined" -active = True -questions = underline_core.questions - - -def get_image(answers): - return underline_core.get_image(answers, "all") diff --git a/src/styles/first_letter_underlined.py b/src/styles/first_letter_underlined.py index a9591cc..f6644c5 100644 --- a/src/styles/first_letter_underlined.py +++ b/src/styles/first_letter_underlined.py @@ -1,9 +1,9 @@ from . import underline_core -display_name = "First letter underlined" +display_name = "First letters underlined" active = True questions = underline_core.questions def get_image(answers): - return underline_core.get_image(answers, "first_letter") + return underline_core.get_image(answers) diff --git a/src/styles/underline_core.py b/src/styles/underline_core.py index 43cf4f6..3f3797f 100644 --- a/src/styles/underline_core.py +++ b/src/styles/underline_core.py @@ -10,6 +10,7 @@ questions = [ SelectQuestion("font", "Select a font", [(font, font) for font in font_list], "Iosevka-Nerd-Font-Complete.ttf"), SelectQuestion("color", "Select a color scheme", color_scheme_names, "adi1090x"), + TextQuestion("underline_count", "Lettrs to undrline", [Number(minimum=0)], "1", "1"), TextQuestion("padding_x", "Padding x (px)", [Number()], "200", "200"), TextQuestion("padding_y", "Padding y (px)", [Number()], "20", "20"), TextQuestion("gap", "Gap between text and bar (px)", [Number()], "20", "20"), @@ -20,14 +21,12 @@ active = False -def get_image(answers, type): - if type not in ['all', 'first_letter']: - raise ValueError("Invalid type") - +def get_image(answers): # Load the selected font font_size = 500 font = ImageFont.truetype(os.path.join(FONTS_DIR, answers["font"]), font_size) + # Set the colors background = ImageColor.getrgb(color_schemes[answers['color']]["background"]) text = ImageColor.getrgb(color_schemes[answers['color']]["text"]) accent = ImageColor.getrgb(color_schemes[answers['color']]["accent"]) @@ -44,41 +43,37 @@ def get_image(answers, type): image = Image.new("RGB", (image_width, image_height), background) draw = ImageDraw.Draw(image) - # Get the anchor position and type + # Get the text anchor type and position on the image (where the text will be drawn) + # LM = Left/Middle anchor_type = "lm" anchor_x = int(answers['padding_x']) anchor_y = image_height / 2 - (int(answers['gap']) + int(answers['bar_size'])) / 2 anchor_pos = (anchor_x, anchor_y) - # Get the bbox of the first letter - - first_letter_bbox = draw.textbbox( - anchor_pos, answers['name'][0], font=font, anchor=anchor_type - ) + if int(answers['underline_count']) > 0: + # Get the bbox of the first n letter to underline + first_letters_bbox = draw.textbbox( + anchor_pos, + answers['name'][:int(answers['underline_count'])], + font=font, + anchor=anchor_type) - # Get the underline position - underline_start_x = first_letter_bbox[0] - int(answers['additionnal_bar_width']) - underline_start_y = first_letter_bbox[3] + int(answers['gap']) + # Get the underline position + underline_start_x = first_letters_bbox[0] - int(answers['additionnal_bar_width']) + underline_start_y = first_letters_bbox[3] + int(answers['gap']) - # The end of the underline depends on the type - # If the type is 'all', the underline will go from the start of the first letter to the end of the text - # If the type is 'first_letter', the underline will go - # from the start of the first letter to the end of the first letter - if type == 'first_letter': - underline_end_x = int(answers['additionnal_bar_width']) + (first_letter_bbox[2]) - else: - underline_end_x = int(int(answers['padding_x']) + text_width) + underline_end_x = int(answers['additionnal_bar_width']) + first_letters_bbox[2] - underline_end_y = underline_start_y + int(answers['bar_size']) + underline_end_y = underline_start_y + int(answers['bar_size']) - underline_start = (underline_start_x, underline_start_y) - underline_end = (underline_end_x, underline_end_y) + underline_start = (underline_start_x, underline_start_y) + underline_end = (underline_end_x, underline_end_y) - underline_pos = [underline_start, underline_end] + underline_pos = [underline_start, underline_end] - # Underline the first letter - draw.rectangle(underline_pos, fill=accent, width=answers['bar_size']) + # Underline the first letter + draw.rectangle(underline_pos, fill=accent, width=answers['bar_size']) # Draw the text draw.text(