diff --git a/Marlin/src/lcd/tft/tft_string.cpp b/Marlin/src/lcd/tft/tft_string.cpp index eb805ac423dc..b2cd8215ca12 100644 --- a/Marlin/src/lcd/tft/tft_string.cpp +++ b/Marlin/src/lcd/tft/tft_string.cpp @@ -122,13 +122,14 @@ void TFT_String::add(uint8_t *string, int8_t index, uint8_t *itemString) { eol(); } -void TFT_String::add(uint8_t *string) { +void TFT_String::add(uint8_t *string, uint16_t max_len) { wchar_t wchar; - while (*string) { + while (*string && max_len) { string = get_utf8_value_cb(string, read_byte, &wchar); if (wchar > 255) wchar |= 0x0080; uint8_t ch = uint8_t(wchar & 0x00FF); add_character(ch); + max_len--; } eol(); } diff --git a/Marlin/src/lcd/tft/tft_string.h b/Marlin/src/lcd/tft/tft_string.h index e800b1ded95e..62577a04340d 100644 --- a/Marlin/src/lcd/tft/tft_string.h +++ b/Marlin/src/lcd/tft/tft_string.h @@ -85,7 +85,7 @@ class TFT_String { static void set(); static void add(uint8_t character) { add_character(character); eol(); } - static void add(uint8_t *string); + static void add(uint8_t *string, uint16_t max_len = MAX_STRING_LENGTH); static void add(uint8_t *string, int8_t index, uint8_t *itemString=nullptr); static void set(uint8_t *string) { set(); add(string); }; static void set(uint8_t *string, int8_t index, const char *itemString=nullptr) { set(); add(string, index, (uint8_t *)itemString); }; @@ -96,6 +96,9 @@ class TFT_String { static void trim(uint8_t character=0x20); static void rtrim(uint8_t character=0x20); static void ltrim(uint8_t character=0x20); + + static void truncate(uint16_t maxlen) { if (length > maxlen) { length = maxlen; eol(); } } + static uint16_t width() { return span; } static uint8_t *string() { return data; } static uint16_t center(uint16_t width) { return span > width ? 0 : (width - span) / 2; } diff --git a/Marlin/src/lcd/tft/ui_320x240.cpp b/Marlin/src/lcd/tft/ui_320x240.cpp index aea0039698a2..fd02e54be45b 100644 --- a/Marlin/src/lcd/tft/ui_320x240.cpp +++ b/Marlin/src/lcd/tft/ui_320x240.cpp @@ -669,6 +669,7 @@ void lcd_moveto(const lcd_uint_t col, const lcd_uint_t row) { } int lcd_put_wchar_max(wchar_t c, pixel_len_t max_length) { + if (max_length < 1) return 0; tft_string.set(); tft_string.add(c); tft.add_text(MENU_TEXT_X_OFFSET, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); @@ -676,8 +677,10 @@ int lcd_put_wchar_max(wchar_t c, pixel_len_t max_length) { } int lcd_put_u8str_max_P(PGM_P utf8_str_P, pixel_len_t max_length) { + if (max_length < 1) return 0; tft_string.set(utf8_str_P); tft_string.trim(); + tft_string.truncate(max_length); tft.add_text(MENU_TEXT_X_OFFSET, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); return tft_string.width(); } diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index 4165c3990c60..d7af4ef6374b 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -676,9 +676,19 @@ void lcd_moveto(const lcd_uint_t col, const lcd_uint_t row) { tft.set_background(COLOR_BACKGROUND); } +int lcd_put_wchar_max(wchar_t c, pixel_len_t max_length) { + if (max_length < 1) return 0; + tft_string.set(); + tft_string.add(c); + tft.add_text(MENU_TEXT_X_OFFSET, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + return tft_string.width(); +} + int lcd_put_u8str_max_P(PGM_P utf8_str_P, pixel_len_t max_length) { + if (max_length < 1) return 0; tft_string.set(utf8_str_P); tft_string.trim(); + tft_string.truncate(max_length); tft.add_text(MENU_TEXT_X_OFFSET, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); return tft_string.width(); }