skip to content
==> include/tui/block.h <==
1/* @ajax/tui-block: ratatui's Block: borders (any of the four sides, in a border set), titles on the
2 * top or bottom edge aligned left, centre or right, a style for the whole area and one for the
3 * borders, and padding. inner() is the area left for the content. Borders replace what is there
4 * (ratatui's default MergeStrategy::Replace). */
5#ifndef TUI_BLOCK_H
6#define TUI_BLOCK_H
7
8#include "tui/text.h"
9
10enum {
11    TUI_BORDER_NONE = 0,
12    TUI_BORDER_TOP = 1,
13    TUI_BORDER_RIGHT = 2,
14    TUI_BORDER_BOTTOM = 4,
15    TUI_BORDER_LEFT = 8,
16    TUI_BORDER_ALL = 15,
17};
18
19enum { TUI_TITLE_DEFAULT = -1, TUI_TITLE_TOP = 0, TUI_TITLE_BOTTOM = 1 };
20
21typedef struct {
22    const char *top_left, *top_right, *bottom_left, *bottom_right;
23    const char *vertical_left, *vertical_right, *horizontal_top, *horizontal_bottom;
24} tui_border_set;
25
26extern const tui_border_set TUI_BORDER_PLAIN, TUI_BORDER_ROUNDED, TUI_BORDER_DOUBLE, TUI_BORDER_THICK;
27
28typedef struct {
29    tui_line line;
30    int8_t position; /* TUI_TITLE_* */
31} tui_block_title;
32
33typedef struct {
34    uint8_t borders;
35    const tui_border_set *set; /* NULL: plain */
36    tui_style border_style, style, titles_style;
37    tui_block_title *titles;
38    size_t ntitles, captitles;
39    int8_t titles_alignment; /* TUI_ALIGN_LEFT by default */
40    int8_t titles_position;  /* TUI_TITLE_TOP by default */
41    uint16_t pad_left, pad_right, pad_top, pad_bottom;
42} tui_block;
43
44static inline tui_block tui_block_new(void) {
45    tui_block b = {0};
46    b.titles_alignment = TUI_ALIGN_LEFT;
47    b.titles_position = TUI_TITLE_TOP;
48    return b;
49}
50static inline tui_block tui_block_bordered(void) {
51    tui_block b = tui_block_new();
52    b.borders = TUI_BORDER_ALL;
53    return b;
54}
55/* Block::title (position: TUI_TITLE_DEFAULT for the block's). */
56void tui_block_add_title(tui_arena *a, tui_block *b, tui_line line, int8_t position);
57tui_rect tui_block_inner(const tui_block *b, tui_rect area);
58void tui_block_render(tui_arena *a, const tui_block *b, tui_rect area, tui_buffer *buf);
59/* Option<Block>::inner_if_some. */
60static inline tui_rect tui_block_inner_opt(const tui_block *b, tui_rect area) { return b ? tui_block_inner(b, area) : area; }
61
62#endif