From 76b09096598a1da6069dc136f1921acca85d3877 Mon Sep 17 00:00:00 2001 From: Timerix22 Date: Thu, 18 May 2023 07:27:15 +0600 Subject: [PATCH] TermCharInfo --- kerep | 2 +- src/TUI/Canvas.c | 2 +- src/TUI/Renderer.c | 47 ++++++++++--------- src/TUI/TextBlock.c | 11 +++-- ...der_charTables.c => UIBorder_charTables.c} | 0 src/TUI/UIElement.c | 5 +- src/TUI/tui.h | 30 ++++++++---- src/encoding/encoding.h | 2 +- src/main.c | 8 +++- 9 files changed, 66 insertions(+), 41 deletions(-) rename src/TUI/{uiBorder_charTables.c => UIBorder_charTables.c} (100%) diff --git a/kerep b/kerep index f6864de..6aaf270 160000 --- a/kerep +++ b/kerep @@ -1 +1 @@ -Subproject commit f6864de2c9c3a16c5ac1b56cdf43073490b81a28 +Subproject commit 6aaf270aad6dec2accfa49addc8c6fa5cbe8b337 diff --git a/src/TUI/Canvas.c b/src/TUI/Canvas.c index 250e364..097a9f6 100644 --- a/src/TUI/Canvas.c +++ b/src/TUI/Canvas.c @@ -7,7 +7,7 @@ void Canvas_freeMembers(void* _self){ Autoarr_freeWithoutMembers(self->children, true); } -UI_Maybe Canvas_draw(Renderer* renderer, UIElement* _self, DrawingArea area){ +UI_Maybe Canvas_draw(Renderer* renderer, UIElement* _self, const DrawingArea area){ Canvas* self=(Canvas*)_self; Autoarr_foreach(self->children, ch, ({ if(ch==NULL) diff --git a/src/TUI/Renderer.c b/src/TUI/Renderer.c index 2a9ec1f..1350702 100644 --- a/src/TUI/Renderer.c +++ b/src/TUI/Renderer.c @@ -1,5 +1,10 @@ #include "tui_internal.h" +int TCI_fwrite(FILE* file, TermCharInfo tci){ + kprint_setColor(tci.color); + return termchar_fwrite(file, tci.ch); +} + ////////////////////////////////////// // FrameBuffer // ////////////////////////////////////// @@ -25,7 +30,7 @@ Maybe FrameBuffer_create(FrameBuffer* fb){ fb->data=malloc( sz* length); for(u32 i=0; idata[i]=TERMCHAR('#'); + fb->data[i]=TCI(TERMCHAR(' '), kp_bgGray|kp_fgGray); return MaybeNull; } @@ -39,12 +44,12 @@ void Renderer_freeMembers(void * _self){ // Renderer // ////////////////////////////////////// -UI_Maybe __Renderer_set(Renderer* self, termchar c, u16 x, u16 y) { +UI_Maybe __Renderer_set(Renderer* self, TermCharInfo tci, u16 x, u16 y) { if(x >= self->frameBuffer.size.cols) UI_safethrow(UIError_InvalidX,;); if(y >= self->frameBuffer.size.rows) UI_safethrow(UIError_InvalidY,;); - self->frameBuffer.data[self->frameBuffer.size.cols * y + x] = c; + self->frameBuffer.data[self->frameBuffer.size.cols * y + x] = tci; return MaybeNull; } @@ -58,10 +63,10 @@ UI_Maybe __Renderer_drawFrame(Renderer* self){ for(u16 y=0; y0){ - UI_try(Renderer_set(renderer, c, x, y),_,;); + UI_try(Renderer_set(renderer, tci, x, y),_,;); x++; length--; } return MaybeNull; } -UI_Maybe Renderer_drawLineY(Renderer* renderer, termchar c, u16 x, u16 y, u16 length){ +UI_Maybe Renderer_drawLineY(Renderer* renderer, TermCharInfo tci, u16 x, u16 y, u16 length){ while(length>0){ - UI_try(Renderer_set(renderer, c, x, y),_,;); + UI_try(Renderer_set(renderer, tci, x, y),_,;); y++; length--; } return MaybeNull; } -UI_Maybe Renderer_drawBorder(Renderer* renderer, UIBorder border, DrawingArea area){ +UI_Maybe Renderer_drawBorder(Renderer* renderer, UIBorder border, const DrawingArea area){ UI_try(DrawingArea_validate(area),_0,;); //lines @@ -133,13 +138,13 @@ UI_Maybe Renderer_drawBorder(Renderer* renderer, UIBorder border, DrawingArea ar // TODO check neighbor borders and insert crossing chars like '╄' - UI_try(Renderer_drawLineX(renderer, topChar, area.x+1, area.y, area.w-2),_1,;) + UI_try(Renderer_drawLineX(renderer, TCI(topChar, border.color), area.x+1, area.y, area.w-2),_1,;) // bottom - UI_try(Renderer_drawLineX(renderer, bottomChar, area.x+1, area.y+area.h-1, area.w-2),_2,;) + UI_try(Renderer_drawLineX(renderer, TCI(bottomChar, border.color), area.x+1, area.y+area.h-1, area.w-2),_2,;) // left - UI_try(Renderer_drawLineY(renderer, leftChar, area.x, area.y+1, area.h-2),_3,;) + UI_try(Renderer_drawLineY(renderer, TCI(leftChar, border.color), area.x, area.y+1, area.h-2),_3,;) // right - UI_try(Renderer_drawLineY(renderer, rightChar, area.x+area.w-1, area.y+1, area.h-2),_4,;) + UI_try(Renderer_drawLineY(renderer, TCI(rightChar, border.color), area.x+area.w-1, area.y+1, area.h-2),_4,;) // corners termchar ltCornerChar = UIBorder_char_lt[border.left ][border.top ]; @@ -147,13 +152,13 @@ UI_Maybe Renderer_drawBorder(Renderer* renderer, UIBorder border, DrawingArea ar termchar rbCornerChar = UIBorder_char_rb[border.right][border.bottom]; termchar lbCornerChar = UIBorder_char_lb[border.left ][border.bottom]; // left top corner - UI_try(Renderer_set(renderer, ltCornerChar, area.x, area.y),_5,;); + UI_try(Renderer_set(renderer, TCI(ltCornerChar, border.color), area.x, area.y),_5,;); // right top corner - UI_try(Renderer_set(renderer, rtCornerChar, area.x+area.w-1, area.y),_6,;); + UI_try(Renderer_set(renderer, TCI(rtCornerChar, border.color), area.x+area.w-1, area.y),_6,;); // right bottom corner - UI_try(Renderer_set(renderer, rbCornerChar, area.x+area.w-1, area.y+area.h-1),_7,;); + UI_try(Renderer_set(renderer, TCI(rbCornerChar, border.color), area.x+area.w-1, area.y+area.h-1),_7,;); // left bottom corner - UI_try(Renderer_set(renderer, lbCornerChar, area.x, area.y+area.h-1),_8,;); + UI_try(Renderer_set(renderer, TCI(lbCornerChar, border.color), area.x, area.y+area.h-1),_8,;); return MaybeNull; } diff --git a/src/TUI/TextBlock.c b/src/TUI/TextBlock.c index eb72074..8ee1051 100644 --- a/src/TUI/TextBlock.c +++ b/src/TUI/TextBlock.c @@ -5,11 +5,16 @@ void TextBlock_freeMembers(void* _self){ free(self->text.ptr); } -UI_Maybe TextBlock_draw(Renderer* renderer, UIElement* _self, DrawingArea area){ +UI_Maybe TextBlock_draw(Renderer* renderer, UIElement* _self, const DrawingArea area){ TextBlock* self=(TextBlock*)_self; UI_try(UIElement_validate((UIElement*)self, area),_0,;); - UI_try(Renderer_fill(renderer, TERMCHAR(' '), area),_2,;); - UI_try(Renderer_drawBorder(renderer, self->base.borders, area),_1,;); + UI_try(Renderer_fill(renderer, TCI(TERMCHAR(' '), kp_bgBlack|kp_fgGray), area),_2,;); + UI_try(Renderer_drawBorder(renderer, self->base.border, area),_1,;); + for(u16 i=0; itext.length; i++){ + u16 x=area.x+1+i; + u16 y=area.y+area.h/2; + UI_try(Renderer_set(renderer, TCI(self->text.ptr[i], kp_fgCyan), x, y), _2,;); + } return MaybeNull; } diff --git a/src/TUI/uiBorder_charTables.c b/src/TUI/UIBorder_charTables.c similarity index 100% rename from src/TUI/uiBorder_charTables.c rename to src/TUI/UIBorder_charTables.c diff --git a/src/TUI/UIElement.c b/src/TUI/UIElement.c index 6f8db0e..98b4311 100644 --- a/src/TUI/UIElement.c +++ b/src/TUI/UIElement.c @@ -14,9 +14,10 @@ UIElement __UIElement_createDefault(ktid typeId, UIElement_draw_t drawFunc){ .fgColor=kp_fgWhite, .bgColor=kp_bgBlack, .anchor=UIAnchor_Center, - .borders={ + .border={ .left=UIBorder_Thin, .right=UIBorder_Thin, - .top=UIBorder_Thin, .bottom=UIBorder_Thin + .top=UIBorder_Thin, .bottom=UIBorder_Thin, + .color=kp_bgBlack|kp_fgGray }, .draw=drawFunc }; diff --git a/src/TUI/tui.h b/src/TUI/tui.h index 9c91ca3..3471f0e 100644 --- a/src/TUI/tui.h +++ b/src/TUI/tui.h @@ -5,7 +5,7 @@ extern "C" { #endif #include "../../kerep/src/String/string.h" -#include "../../kerep/src/kprint/kprint_colors.h" +#include "../../kerep/src/kprint/kprint_format.h" #include "../../kerep/src/Array/Array.h" #include "../term/term.h" #include "../encoding/encoding.h" @@ -55,14 +55,24 @@ STRUCT(UIBorder, UIBorderThickness left; UIBorderThickness top; UIBorderThickness bottom; + kp_fmt color; ) +STRUCT(TermCharInfo, + termchar ch; + kp_fmt color; /* background + foreground */ +) + +#define TCI(CH,COLOR)(TermCharInfo){.ch=CH, .color=COLOR} +int TCI_fwrite(FILE* file, TermCharInfo tci); +#define TCI_print(tci) TCI_fwrite(stdout, tci); + ////////////////////////////////////// // Renderer // ////////////////////////////////////// STRUCT(FrameBuffer, - termchar* data; + TermCharInfo* data; TerminalSize size; ) @@ -71,19 +81,19 @@ typedef struct Renderer Renderer; STRUCT(Renderer, FrameBuffer frameBuffer; UI_THROWING_FUNC_DECL((*drawFrame)(Renderer*)); - UI_THROWING_FUNC_DECL((*set)(Renderer*, termchar c, u16 x, u16 y)); + UI_THROWING_FUNC_DECL((*set)(Renderer*, TermCharInfo tci, u16 x, u16 y)); ) #define Renderer_drawFrame(RENDERER) RENDERER->drawFrame(RENDERER) -#define Renderer_set(RENDERER, CH, X, Y) RENDERER->set(RENDERER, CH, X, Y) +#define Renderer_set(RENDERER, TCI, X, Y) RENDERER->set(RENDERER, TCI, X, Y) Renderer* Renderer_create(); void Renderer_destroy(Renderer* self); -UI_THROWING_FUNC_DECL(Renderer_fill(Renderer* renderer, termchar c, DrawingArea area)); -UI_THROWING_FUNC_DECL(Renderer_drawLineX(Renderer* renderer, termchar c, u16 x, u16 y, u16 length)); -UI_THROWING_FUNC_DECL(Renderer_drawLineY(Renderer* renderer, termchar c, u16 x, u16 y, u16 length)); -UI_THROWING_FUNC_DECL(Renderer_drawBorder(Renderer* renderer, UIBorder border, DrawingArea area)); +UI_THROWING_FUNC_DECL(Renderer_fill(Renderer* renderer, TermCharInfo tci, const DrawingArea area)); +UI_THROWING_FUNC_DECL(Renderer_drawLineX(Renderer* renderer, TermCharInfo tci, u16 x, u16 y, u16 length)); +UI_THROWING_FUNC_DECL(Renderer_drawLineY(Renderer* renderer, TermCharInfo tci, u16 x, u16 y, u16 length)); +UI_THROWING_FUNC_DECL(Renderer_drawBorder(Renderer* renderer, UIBorder border, const DrawingArea area)); ////////////////////////////////////// // UIElement abstract struct // @@ -91,7 +101,7 @@ UI_THROWING_FUNC_DECL(Renderer_drawBorder(Renderer* renderer, UIBorder border, D typedef struct UIElement UIElement; typedef UIElement* UIElementPtr; -typedef UI_THROWING_FUNC_DECL((*UIElement_draw_t)(Renderer* renderer, UIElement* self, DrawingArea area)); +typedef UI_THROWING_FUNC_DECL((*UIElement_draw_t)(Renderer* renderer, UIElement* self, const DrawingArea area)); #define UIElement_stretch (u16)-1 @@ -104,7 +114,7 @@ STRUCT(UIElement, kp_fgColor fgColor; kp_bgColor bgColor; UIAnchor anchor; - UIBorder borders; + UIBorder border; UIElement_draw_t draw; ) diff --git a/src/encoding/encoding.h b/src/encoding/encoding.h index ec26f5d..2255c3d 100644 --- a/src/encoding/encoding.h +++ b/src/encoding/encoding.h @@ -18,7 +18,7 @@ int utf32char_fwrite(FILE* file, utf32char ch); typedef utf32char termchar; #define TERMCHAR(CHAR) U##CHAR #define TERMSTR(STR) U##STR -#define termchar_print(CH) utf32char_fwrite(stdout, CH) +#define termchar_fwrite utf32char_fwrite #if __cplusplus } diff --git a/src/main.c b/src/main.c index 009d3b6..4eacc1d 100644 --- a/src/main.c +++ b/src/main.c @@ -1,6 +1,10 @@ #include "../kerep/src/Filesystem/filesystem.h" #include "TUI/tui.h" #include +#include +#if _WIN32 || _WIN64 +#include +#endif Maybe tryReadFile(char* filePath){ if(!file_exists(filePath)) @@ -12,7 +16,7 @@ Maybe tryReadFile(char* filePath){ try(file_close(file),_m_,;); return SUCCESS(UniHeapPtr(char,fileContent)); } -#include + i32 main(const i32 argc, const char* const* argv){ #if _WIN32 || _WIN64 if(!SetConsoleOutputCP(CP_UTF8)){ @@ -42,7 +46,7 @@ i32 main(const i32 argc, const char* const* argv){ Canvas* mainCanvas=Canvas_create(); TextBlock* testTextBlock=TextBlock_create(string_fromCptr("some example text")); Canvas_addChild(mainCanvas, (UIElement*)testTextBlock); - tryLast(UIElement_draw(renderer, (UIElement*)mainCanvas, ((DrawingArea){.x=4, .y=4, .h=4, .w=4})),_); + tryLast(UIElement_draw(renderer, (UIElement*)mainCanvas, ((DrawingArea){.x=10, .y=4, .h=7, .w=24})),_); tryLast(Renderer_drawFrame(renderer),_2); UIElement_destroy((UIElement*)mainCanvas);