diff --git a/main/graphics/drawing.c b/main/graphics/drawing.c index f73f099..a56ebde 100644 --- a/main/graphics/drawing.c +++ b/main/graphics/drawing.c @@ -231,17 +231,39 @@ static const int char_heights[] = { // library. AND HEAVILY MODIFIED void LCD_setStrEx(const char *dString, int x, int y, enum Color color, struct TextStyle style) { - const int x0 = x; + struct Utf8Char uchar; struct Utf8Iterator iter; Utf8Iterator_Init(&iter, dString); int charw = char_widths[style.size]; int charh = char_heights[style.size]; - int spacingx = char_spacings[style.size] + style.spacing_x; int spacingy = style.spacing_y; - struct Utf8Char uchar; + if (style.align != ALIGN_LEFT) { + int line_len = 0; + int skip = style.skip; + while ((uchar = Utf8Iterator_Next(&iter)).uint) { + if (skip > 0) { + skip -= 1; + continue; + } + if (uchar.bytes[0] == '\n') { + break; + } + line_len++; + } + if (style.align == ALIGN_CENTER) { + x -= ((charw + spacingx) * line_len) / 2 - spacingx/2; + } else { + // right + x -= ((charw + spacingx) * line_len) - spacingx; + } + } + + const int x0 = x; + Utf8Iterator_Init(&iter, dString); + int limit = style.limit; int skip = style.skip; bool wrap; diff --git a/main/graphics/drawing.h b/main/graphics/drawing.h index c896ffd..6ebafef 100644 --- a/main/graphics/drawing.h +++ b/main/graphics/drawing.h @@ -50,15 +50,22 @@ enum TextSize { FONT_BOLD = 2, }; +enum TextAlign { + ALIGN_LEFT = 0, + ALIGN_CENTER = 1, + ALIGN_RIGHT = 2, +}; + struct TextStyle { - bool bg; //!< Fill the characters background with the opposite color - enum TextSize size; //!< Character size - int limit; //!< Number of characters to print from the string, if > 0 - int skip; //!< Characters to skip before printing - int spacing_x; //!< Additional X spacing - int spacing_y; //!< Additional Y spacing - bool nowrap; //!< Stop painting when the right edge of the screen is reached - bool wrap_to_0; //!< wrap to 0 instead of the initial X coordinate + bool bg; //!< Fill the characters background with the opposite color + enum TextSize size; //!< Character size + enum TextAlign align; //!< Alignment (works only for single line) + int limit; //!< Number of characters to print from the string, if > 0 + int skip; //!< Characters to skip before printing + int spacing_x; //!< Additional X spacing + int spacing_y; //!< Additional Y spacing + bool nowrap; //!< Stop painting when the right edge of the screen is reached + bool wrap_to_0; //!< wrap to 0 instead of the initial X coordinate }; // setStr draws a string of characters, calling setChar with diff --git a/main/liquid/gui.c b/main/liquid/gui.c index 1ddc8d9..aa0b62a 100644 --- a/main/liquid/gui.c +++ b/main/liquid/gui.c @@ -1,8 +1,6 @@ #include #include -#include -#include "gui.h" #include "nokia.h" #include "liquid.h" #include "drawing.h" @@ -27,7 +25,6 @@ void gui_init() { * 0b10 - knowb CCW * 0b100 - button released * 0b1000 - button pressed - * 0b10000 - ticker event * * @param arg */ diff --git a/main/scenes/scene_manual_menu.c b/main/scenes/scene_manual_menu.c index f56065c..c300e7c 100644 --- a/main/scenes/scene_manual_menu.c +++ b/main/scenes/scene_manual_menu.c @@ -2,9 +2,10 @@ #include #include #include -#include -#include +#include "analog.h" +#include "firehazard.h" +#include "graphics/bitmaps.h" #include "liquid.h" #include "graphics/drawing.h" #include "graphics/display_spec.h" @@ -74,8 +75,8 @@ static void paint(struct MenuScene *self) char buf[10]; sprintf(buf, "%.0f", analog_read()); // TODO centering - LCD_setStrEx(buf, 0, 0, BLACK, (struct TextStyle) {.size = FONT_DOUBLE}); - LCD_setStrEx("°C", 0, 17, BLACK, (struct TextStyle) {.size = FONT_BOLD}); + LCD_setStrEx(buf, XLINE/2, 0, BLACK, (struct TextStyle) {.size = FONT_DOUBLE, .align = ALIGN_CENTER}); + LCD_setStrEx("°C", XLINE/2, 17, BLACK, (struct TextStyle) {.align = ALIGN_CENTER}); //.size = FONT_BOLD, if (fire_enabled()) { strcpy(buf, "RUN");