ascii-chat
Binary v0.15.83-53-gb711d8720
Library lib/v0.3.2-701-gb711d8720
Video chat in your terminal
Loading...
Searching...
No Matches
viewport.h File Reference

Go to the source code of this file.

Data Structures

struct  ui_viewport_t
 For ui viewport, this is the live record that ties selected, first_visible, page_size together. The owning code creates it, updates it while work is active, and releases its handles and pointed-to storage before freeing the record. More...
struct  ui_viewport_range_t

Functions

ui_viewport_range_t ui_viewport_update (ui_viewport_t *view, size_t count, size_t rows)
bool ui_viewport_key (ui_viewport_t *view, size_t count, size_t rows, keyboard_key_t key)

Function Documentation

◆ ui_viewport_key()

bool ui_viewport_key ( ui_viewport_t * view,
size_t count,
size_t rows,
keyboard_key_t key )

Definition at line 38 of file viewport.c.

38 {
39 if (!v) {
40 SET_ERRNO(ERROR_INVALID_PARAM, "Viewport state is NULL");
41 return false;
42 }
43 ui_viewport_range_t r = ui_viewport_update(v, count, rows);
44 size_t step = v->page_size ? v->page_size : (rows ? rows : 1);
45 switch ((int)key) {
46 case KEY_UP:
47 if (v->selected)
48 --v->selected;
49 break;
50 case KEY_DOWN:
51 if (count && v->selected < count - 1)
52 ++v->selected;
53 break;
54 case KEY_HOME:
55 v->selected = v->first_visible = 0;
56 break;
57 case KEY_END:
58 v->selected = count ? count - 1 : 0;
59 break;
60 case KEY_LEFT:
61 if (v->page_size) {
62 if (r.page)
63 v->selected -= step;
64 } else
65 v->selected = v->selected > step ? v->selected - step : 0;
66 break;
67 case KEY_RIGHT:
68 if (count && (!v->page_size || r.page + 1 < r.pages))
69 v->selected = step < count - v->selected ? v->selected + step : count - 1;
70 break;
71 default:
72 return false;
73 }
74 ui_viewport_update(v, count, rows);
75 return true;
76}
#define SET_ERRNO(code,...)
@ ERROR_INVALID_PARAM
@ KEY_UP
Up arrow key.
Definition keyboard.h:57
@ KEY_LEFT
Left arrow key.
Definition keyboard.h:59
@ KEY_RIGHT
Right arrow key.
Definition keyboard.h:60
@ KEY_END
End key (move to end of line).
Definition keyboard.h:63
@ KEY_DOWN
Down arrow key.
Definition keyboard.h:58
@ KEY_HOME
Home key (move to start of line).
Definition keyboard.h:62
ui_viewport_range_t ui_viewport_update(ui_viewport_t *v, size_t count, size_t rows)
Definition viewport.c:4

References ERROR_INVALID_PARAM, ui_viewport_t::first_visible, KEY_DOWN, KEY_END, KEY_HOME, KEY_LEFT, KEY_RIGHT, KEY_UP, ui_viewport_range_t::page, ui_viewport_t::page_size, ui_viewport_range_t::pages, ui_viewport_t::selected, SET_ERRNO, and ui_viewport_update().

Referenced by ui_sync_handle_key().

◆ ui_viewport_update()

ui_viewport_range_t ui_viewport_update ( ui_viewport_t * view,
size_t count,
size_t rows )

Definition at line 4 of file viewport.c.

4 {
5 ui_viewport_range_t r = {.pages = 1};
6 if (!v) {
7 SET_ERRNO(ERROR_INVALID_PARAM, "Viewport state is NULL");
8 return r;
9 }
10 if (!count) {
11 v->selected = v->first_visible = 0;
12 return r;
13 }
14 if (!rows)
15 rows = 1;
16 if (v->selected >= count)
17 v->selected = count - 1;
18 size_t page_size = v->page_size ? v->page_size : count;
19 r.page = v->selected / page_size;
20 r.pages = 1 + (count - 1) / page_size;
21 r.page_first = r.page * page_size;
22 r.page_count = count - r.page_first < page_size ? count - r.page_first : page_size;
23 size_t selected = v->selected - r.page_first;
24 size_t last = r.page_count > rows ? r.page_count - rows : 0;
25 if (v->first_visible > last)
26 v->first_visible = last;
27 if (selected < v->first_visible)
28 v->first_visible = selected;
29 if (selected - v->first_visible >= rows)
30 v->first_visible = selected - rows + 1;
31 r.first = r.page_first + v->first_visible;
32 r.count = r.page_count - v->first_visible;
33 if (r.count > rows)
34 r.count = rows;
35 return r;
36}

References ui_viewport_range_t::count, ERROR_INVALID_PARAM, ui_viewport_range_t::first, ui_viewport_t::first_visible, ui_viewport_range_t::page, ui_viewport_range_t::page_count, ui_viewport_range_t::page_first, ui_viewport_t::page_size, ui_viewport_range_t::pages, ui_viewport_t::selected, and SET_ERRNO.

Referenced by ui_selectable_list_keep_visible(), ui_table_render(), and ui_viewport_key().