diff options
| author | 2024-12-18 11:06:44 -0500 | |
|---|---|---|
| committer | 2024-12-18 11:06:44 -0500 | |
| commit | 3d55d2722a3129449ab1418e73abd97caa7fd2ae (patch) | |
| tree | 0cba3f876c9b339d20d8e4a38a7a5d786fa2102d /src/fruits/cmc/ui | |
| parent | 692785bc9da6904cf17e986fb034730ed3d78231 (diff) | |
| download | camu-3d55d2722a3129449ab1418e73abd97caa7fd2ae.tar.gz camu-3d55d2722a3129449ab1418e73abd97caa7fd2ae.tar.bz2 camu-3d55d2722a3129449ab1418e73abd97caa7fd2ae.zip | |
Extend server resource loading, work on client
Also, cleanup in preparation for changing code style.
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/fruits/cmc/ui')
| -rw-r--r-- | src/fruits/cmc/ui/pane_search.c | 39 | ||||
| -rw-r--r-- | src/fruits/cmc/ui/tile.h | 5 | ||||
| -rw-r--r-- | src/fruits/cmc/ui/ui.c | 67 | ||||
| -rw-r--r-- | src/fruits/cmc/ui/ui.h | 25 |
4 files changed, 118 insertions, 18 deletions
diff --git a/src/fruits/cmc/ui/pane_search.c b/src/fruits/cmc/ui/pane_search.c new file mode 100644 index 0000000..cc549e1 --- /dev/null +++ b/src/fruits/cmc/ui/pane_search.c @@ -0,0 +1,39 @@ +#include "../cmc.h" + +#include "ui.h" + +void cmc_sp_init(struct cmc_ui *ui) +{ + if (ui->c->searches.size > 0) { + ui->sp.search = al_array_at(ui->c->searches, 0); + } + cmc_sp_layout(ui, notcurses_stdplane(ui->nc)); +} + +void cmc_sp_layout(struct cmc_ui *ui, struct ncplane *parent) +{ + if (ui->sp.n) ncplane_destroy(ui->sp.n); + struct ncplane_options nopts = { + .rows = ui->term_rows, + .cols = ui->term_cols, + .x = 0, + .y = 0 + }; + ui->sp.n = ncplane_create(parent, &nopts); +} + +bool cmc_sp_handle_input(struct cmc_ui *ui, struct ncinput *input) +{ + (void)ui; + (void)input; + return true; +} + +void cmc_sp_render(struct cmc_ui *ui) +{ + if (ui->sp.search) { + char *c_str = al_str_to_c_str(&ui->sp.search->query); + ncplane_putstr_yx(ui->sp.n, 0, 0, c_str); + al_free(c_str); + } +} diff --git a/src/fruits/cmc/ui/tile.h b/src/fruits/cmc/ui/tile.h new file mode 100644 index 0000000..6f15c7d --- /dev/null +++ b/src/fruits/cmc/ui/tile.h @@ -0,0 +1,5 @@ +#pragma once + +struct cmc_tile { + +}; diff --git a/src/fruits/cmc/ui/ui.c b/src/fruits/cmc/ui/ui.c index a838f96..58d630f 100644 --- a/src/fruits/cmc/ui/ui.c +++ b/src/fruits/cmc/ui/ui.c @@ -2,28 +2,69 @@ #include "ui.h" -bool cmc_ui_init(struct cmc_ui *ui) +static s32 resize_cb(struct ncplane *p) { - al_memset(ui, 0, sizeof(struct cmc_ui)); - if (!(ui->nc = notcurses_init(NULL, stdin))) { - return false; - } - return true; + struct cmc_ui *ui = (struct cmc_ui *)ncplane_userptr(p); + (void)ui; + return 0; } -s32 cmc_ui_get_input_fd(struct cmc_ui *ui) -{ - return notcurses_inputready_fd(ui->nc); -} - -bool cmc_ui_read_input(struct cmc_ui *ui, struct ncinput *input) +static bool read_input(struct cmc_ui *ui, struct ncinput *input) { al_memset(input, 0, sizeof(struct ncinput)); u32 ret = notcurses_get_nblock(ui->nc, input); return !(ret == (u32)-1 || ret == 0); } +static void input_poll_callback(void *userdata, s32 revents) +{ + struct cmc_ui *ui = (struct cmc_ui *)userdata; + (void)revents; + struct ncinput input; + do { + if (!read_input(ui, &input)) break; + bool do_render = false; + if (input.evtype == NCTYPE_PRESS || input.evtype == NCTYPE_UNKNOWN) { + switch (input.id) { + case 'q': + aki_event_loop_break_one(ui->loop); + break; + } + } + switch (ui->pane) { + case CMC_PANE_SEARCH: + if (cmc_sp_handle_input(ui, &input)) { + cmc_sp_render(ui); + do_render |= true; + } + } + if (do_render) { + notcurses_render(ui->nc); + } + } while (1); +} + +bool cmc_ui_init(struct cmc_ui *ui, struct aki_event_loop *loop, struct cmc *c) +{ + al_memset(ui, 0, sizeof(struct cmc_ui)); + ui->c = c; + if (!(ui->nc = notcurses_init(NULL, stdin))) { + return false; + } + ui->loop = loop; + notcurses_stddim_yx(ui->nc, &ui->term_rows, &ui->term_cols); + cmc_sp_init(ui); + struct ncplane *stdplane = notcurses_stdplane(ui->nc); + ncplane_set_resizecb(stdplane, resize_cb); + ncplane_set_userptr(stdplane, ui); + aki_poll_init(&ui->input_poll, input_poll_callback, ui); + aki_poll_set(&ui->input_poll, notcurses_inputready_fd(ui->nc), AKI_POLL_READ); + aki_poll_start(&ui->input_poll, ui->loop); + ui->pane = CMC_PANE_SEARCH; + return true; +} + void cmc_ui_close(struct cmc_ui *ui) { - notcurses_stop(ui->nc); + if (ui->nc) notcurses_stop(ui->nc); } diff --git a/src/fruits/cmc/ui/ui.h b/src/fruits/cmc/ui/ui.h index 4af222e..1a49985 100644 --- a/src/fruits/cmc/ui/ui.h +++ b/src/fruits/cmc/ui/ui.h @@ -1,18 +1,33 @@ #pragma once #include <al/types.h> +#include <aki/event_loop.h> #include <notcurses/notcurses.h> +enum { + CMC_PANE_SEARCH = 0, +}; + +struct cmc; struct cmc_ui { struct notcurses *nc; + struct aki_event_loop *loop; u32 term_cols; u32 term_rows; bool pending_layout; + struct aki_poll input_poll; + u8 pane; + struct { + struct ncplane *n; + struct cmc_search *search; + } sp; // search pane. + struct cmc *c; }; -bool cmc_ui_init(struct cmc_ui *ui); - -s32 cmc_ui_get_input_fd(struct cmc_ui *ui); -bool cmc_ui_read_input(struct cmc_ui *ui, struct ncinput *input); - +bool cmc_ui_init(struct cmc_ui *ui, struct aki_event_loop *loop, struct cmc *c); void cmc_ui_close(struct cmc_ui *ui); + +void cmc_sp_init(struct cmc_ui *ui); +void cmc_sp_layout(struct cmc_ui *ui, struct ncplane *parent); +bool cmc_sp_handle_input(struct cmc_ui *ui, struct ncinput *input); +void cmc_sp_render(struct cmc_ui *ui); |