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.c
Go to the documentation of this file.
3
4ui_viewport_range_t ui_viewport_update(ui_viewport_t *v, size_t count, size_t rows) {
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;
33 if (r.count > rows)
34 r.count = rows;
35 return r;
36}
37
38bool ui_viewport_key(ui_viewport_t *v, size_t count, size_t rows, keyboard_key_t key) {
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}
Synchronized per-thread pending error stacks and value snapshots. SET_ERRNO pushes,...
#define SET_ERRNO(code,...)
@ ERROR_INVALID_PARAM
keyboard_key_t
Options for interactive line editing.
Definition keyboard.h:53
@ 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
For ui viewport, this is the live record that ties selected, first_visible, page_size together....
Definition viewport.h:10
size_t first_visible
Definition viewport.h:11
size_t selected
Definition viewport.h:11
size_t page_size
Definition viewport.h:11
bool ui_viewport_key(ui_viewport_t *v, size_t count, size_t rows, keyboard_key_t key)
Definition viewport.c:38
ui_viewport_range_t ui_viewport_update(ui_viewport_t *v, size_t count, size_t rows)
Definition viewport.c:4