#include "UI.h" #include const int MAX_LINES = 256; const int SPACING_H = 1; const float SCROLL_SENC = 10; void DrawRecBordered(Rectangle rec, Color bg, Color border_color, int border_width) { DrawRectangleRounded(rec, 0.015f, 8, bg); DrawRectangleRoundedLinesEx(rec, 0.015f, 8, border_width, border_color); } float MeasureChar(Font *font, int height, char symbol) { char buf[2] = { symbol, 0 }; return MeasureTextEx(*font, buf, height, SPACING_H).x; } int CalculateSpans(Rectangle rec, char *text, Font *font, int height, int *spans) { spans[0] = 0; int ptr = 0, span_ptr = 1, last_space_ptr; float acc = 0; while (text[ptr] != 0x0) { char symbol = text[ptr]; float char_width = MeasureChar(font, height, symbol); acc += char_width + SPACING_H; if (symbol == ' ' || symbol == '\n') last_space_ptr = ptr; if (acc > rec.width || symbol == '\n') { spans[span_ptr] = last_space_ptr + 1; ptr = last_space_ptr; span_ptr++; acc = 0; } ptr++; } return span_ptr + 1; } bool IsMouseInRec(Rectangle rec) { Vector2 MousePos = GetMousePosition(); return CheckCollisionPointRec(MousePos, rec); } void DrawTextInRec(Rectangle rec, char *text, Font *font, int height, Color color, float padding, int *scroll) { int spans[MAX_LINES]; rec.x += padding; rec.y += padding; rec.width -= 2 * padding; rec.height -= 2 * padding; int lines = CalculateSpans(rec, text, font, height, spans); if (lines == 2) { Vector2 pos = {.x = rec.x, .y = rec.y}; DrawTextEx(*font, text, pos, height, SPACING_H, color); return; } int vertical_acc = rec.y - *scroll; int text_height = lines * height; int max_scroll = text_height - rec.height; if (text_height >= rec.height && IsMouseInRec(rec)) { *scroll -= GetMouseWheelMove() * SCROLL_SENC; if (*scroll < 0) *scroll = 0; if (*scroll > max_scroll) *scroll = max_scroll; } BeginScissorMode(rec.x, rec.y, rec.width, rec.height); for (int i = 1; i < lines; i++) { Vector2 pos = { .x = rec.x, .y = vertical_acc }; char *line_start = text + spans[i-1]; int line_length = spans[i] - spans[i-1]; DrawTextEx(*font, TextFormat("%.*s", line_length, line_start), pos, height, SPACING_H, color); vertical_acc += height; } EndScissorMode(); }