diff options
Diffstat (limited to 'src/fruits/cmc/tui')
| -rw-r--r-- | src/fruits/cmc/tui/pager.c | 2 | ||||
| -rw-r--r-- | src/fruits/cmc/tui/pane_lists.c | 93 | ||||
| -rw-r--r-- | src/fruits/cmc/tui/pane_lists.h | 20 | ||||
| -rw-r--r-- | src/fruits/cmc/tui/pane_search.c | 27 | ||||
| -rw-r--r-- | src/fruits/cmc/tui/ui.c | 47 | ||||
| -rw-r--r-- | src/fruits/cmc/tui/ui.h | 2 |
6 files changed, 161 insertions, 30 deletions
diff --git a/src/fruits/cmc/tui/pager.c b/src/fruits/cmc/tui/pager.c index 00c5665..a672315 100644 --- a/src/fruits/cmc/tui/pager.c +++ b/src/fruits/cmc/tui/pager.c @@ -70,7 +70,7 @@ bool cmc_pager_iterate_to_height(struct cmc_pager *pager, u32 height, u32 anchor { u32 y = 0, offset; struct cmc_view_page *page = cmc_pager_page_containing_index(pager, anchor, &offset); - al_assert(page); + if (!page) return false; struct cmc_view *view; do { // If the page is not processed, return out of space as to not display a discontinuity. diff --git a/src/fruits/cmc/tui/pane_lists.c b/src/fruits/cmc/tui/pane_lists.c new file mode 100644 index 0000000..6367e57 --- /dev/null +++ b/src/fruits/cmc/tui/pane_lists.c @@ -0,0 +1,93 @@ +#include "../cmc.h" + +#include "pane_lists.h" +#include "ui.h" + +void cmc_pane_lists_init(struct cmc_pane_lists *pane, struct cmc_ui *ui) +{ + pane->offset = 0; + pane->selected = 0; + pane->list = al_array_at(ui->c->client.state.lists, 0); + pane->ui = ui; +} + +bool cmc_pane_lists_handle_input(struct cmc_pane_lists *pane, struct ncinput *input) +{ + if (!(input->evtype == NCTYPE_PRESS || input->evtype == NCTYPE_UNKNOWN)) return false; + s32 rows = pane->ui->rows - 1; + s32 size = (s32)pane->list->entries.size; + if (input->id == 'j') { + if (pane->selected + 1 < size) { + pane->selected++; + if (pane->selected - pane->offset >= rows) { + pane->offset += rows; + } + return true; + } + } else if (input->id == 'k') { + if (pane->selected - 1 >= 0) { + pane->selected--; + if (pane->selected - pane->offset < 0) { + pane->offset -= rows; + } + return true; + } + } else if (input->id == 'n') { + if (pane->offset + rows < size) { + pane->offset += rows; + pane->selected += rows; + if (pane->selected >= size) { + pane->selected = size - 1; + } + return true; + } + } else if (input->id == 'p') { + if (pane->offset - rows >= 0) { + pane->offset -= rows; + pane->selected -= rows; + return true; + } + } else if (input->id == NCKEY_RETURN) { + camu_client_skipto(&pane->ui->c->client, pane->selected); + } + return false; +} + +bool cmc_pane_lists_handle_input_overlay(struct cmc_pane_lists *pane, struct ncinput *input) +{ + (void)pane; + (void)input; + return false; +} + +void cmc_pane_lists_draw_overlay(struct cmc_pane_lists *pane) +{ + (void)pane; +} + +void cmc_pane_lists_refresh(struct cmc_pane_lists *pane) +{ + struct cmc_ui *ui = pane->ui; + + ncplane_cursor_move_yx(ui->p, 0, 0); + ncplane_erase(ui->p); + notcurses_refresh(ui->nc, NULL, NULL); + notcurses_render(ui->nc); + + str *unique_id; + u32 rows = AL_MIN(pane->list->entries.size - pane->offset, ui->rows - 1); + for (u32 i = pane->offset; i < pane->offset + rows; i++) { + unique_id = &al_array_at(pane->list->entries, i); + if ((s32)i == pane->selected) { + ncplane_set_fg_palindex(ui->p, 4); + } else { + ncplane_set_fg_default(ui->p); + } + u32 cols = AL_MIN(unique_id->len, ui->cols); + for (u32 j = 0; j < cols; j++) { + ncplane_putchar_yx(ui->p, i - pane->offset, j + 1, al_str_at(unique_id, j)); + } + } + + notcurses_render(ui->nc); +} diff --git a/src/fruits/cmc/tui/pane_lists.h b/src/fruits/cmc/tui/pane_lists.h new file mode 100644 index 0000000..323eb52 --- /dev/null +++ b/src/fruits/cmc/tui/pane_lists.h @@ -0,0 +1,20 @@ +#pragma once + +#include <al/types.h> +#include <notcurses/notcurses.h> + +#include "../../libclient/client.h" + +struct cmc_ui; +struct cmc_pane_lists { + s32 offset; + s32 selected; + struct camu_list *list; + struct cmc_ui *ui; +}; + +void cmc_pane_lists_init(struct cmc_pane_lists *pane, struct cmc_ui *ui); +bool cmc_pane_lists_handle_input(struct cmc_pane_lists *pane, struct ncinput *input); +bool cmc_pane_lists_handle_input_overlay(struct cmc_pane_lists *pane, struct ncinput *input); +void cmc_pane_lists_draw_overlay(struct cmc_pane_lists *pane); +void cmc_pane_lists_refresh(struct cmc_pane_lists *pane); diff --git a/src/fruits/cmc/tui/pane_search.c b/src/fruits/cmc/tui/pane_search.c index 4c14939..002a4d1 100644 --- a/src/fruits/cmc/tui/pane_search.c +++ b/src/fruits/cmc/tui/pane_search.c @@ -27,7 +27,6 @@ void cmc_pane_search_init(struct cmc_pane_search *pane, struct cmc_ui *ui) } if (pane->searches.size > 0) { pane->search = al_array_at(pane->searches, 0); - request_page_internal(pane->ui->c, pane->search, pane->search->search->page); } } @@ -55,8 +54,7 @@ static void add_selected_from_index(struct cmc *c, struct cmc_pager *pager, u32 { struct cmc_view *view = get_view_by_visual_index(pager, pager->selected); if (view && view->post->media.size > index) { - camu_client_add(&c->client, &view->post->unique_id, index); - camu_client_skip(&c->client, 1); + camu_client_add(&c->client, &view->post->unique_id, index, true); } } @@ -71,6 +69,7 @@ bool cmc_pane_search_handle_input(struct cmc_pane_search *pane, struct ncinput * if (pager->selected + 1 >= (s32)pager->count) { if (pager->pending_requests > 0 || pager->find_anchor != PAGE_NONE) return false; if (ON_LAST_PAGE(pager)) return false; + if (pager->count == 0) pager->count = 1; u32 index = pager->anchor + pager->count; pager->find_anchor = PAGE_DOWN; struct cmc_view_page *page = cmc_pager_page_containing_index(pager, index, NULL); @@ -116,7 +115,9 @@ bool cmc_pane_search_handle_input_overlay(struct cmc_pane_search *pane, struct n if (!(input->evtype == NCTYPE_PRESS || input->evtype == NCTYPE_UNKNOWN)) return false; struct cmc_ui *ui = pane->ui; struct cmc_pager *pager = &pane->search->pager; - if (input->id == 'j') { + if (input->id == NCKEY_TAB) { + pager->redraw = true; + } else if (input->id == 'j') { if (ui->overlay.selected + 1 < (s32)pane->searches.size) { ui->overlay.selected++; return true; @@ -137,12 +138,7 @@ bool cmc_pane_search_handle_input_overlay(struct cmc_pane_search *pane, struct n pane->search = al_array_at(pane->searches, ui->overlay.selected); pager = &pane->search->pager; pager->redraw = true; - u32 page = pane->search->search->page; - if (!cmc_get_page_from_num(pager, page)) { - request_page_internal(ui->c, pane->search, page); - } else { - return true; - } + return true; } return false; } @@ -197,6 +193,14 @@ static void draw_selection_line(struct cmc_view *view, u32 y, u32 rows) void cmc_pane_search_refresh(struct cmc_pane_search *pane) { struct cmc_pager *pager = &pane->search->pager; + if (pager->pending_requests > 0) return; + + u32 page = pane->search->search->page; + if (!cmc_get_page_from_num(pager, page)) { + request_page_internal(pane->ui->c, pane->search, page); + return; + } + if (pager->find_anchor == PAGE_UP) { u32 count; // If find_anchor = PAGE_UP, search->anchor is index of the requested view. @@ -204,6 +208,7 @@ void cmc_pane_search_refresh(struct cmc_pane_search *pane) while (anchor >= 0) { count = 0; cmc_pager_iterate_to_height(pager, pane->ui->rows, anchor, &count, NULL, NULL); + // TODO: Handle count == 0. // Is the requested view still visible? if ((s32)(anchor + count) - 1 < pager->anchor) break; anchor--; @@ -249,7 +254,7 @@ void cmc_pane_search_refresh(struct cmc_pane_search *pane) notcurses_refresh(pane->ui->nc, NULL, NULL); } notcurses_render(pane->ui->nc); - if (pager->pending_requests == 0 && pager->count > 0 && !out_of_space && pager->end_of_page == -1) { + if (pager->count > 0 && !out_of_space && pager->end_of_page == -1) { request_page_at_page_offset(pane, pager, (pager->anchor + pager->count) - 1, 1); } } diff --git a/src/fruits/cmc/tui/ui.c b/src/fruits/cmc/tui/ui.c index dac84a7..2c406bd 100644 --- a/src/fruits/cmc/tui/ui.c +++ b/src/fruits/cmc/tui/ui.c @@ -1,4 +1,4 @@ -#include "../../tree/common.h" +#include "../../server/common.h" #include "../cmc.h" @@ -31,6 +31,22 @@ void cmc_ui_toggle_overlay(struct cmc_ui *ui) ui->overlay.active = !ui->overlay.active; } +static void refresh_internal(struct cmc_ui *ui) +{ + switch (ui->pane) { + case CMC_PANE_LIBRARY: + break; + case CMC_PANE_LISTS: + cmc_pane_lists_refresh(&ui->lists); + break; + case CMC_PANE_BROWSE: + break; + case CMC_PANE_SEARCH: + cmc_pane_search_refresh(&ui->search); + break; + } +} + static void input_poll_callback(void *userdata, s32 revents) { struct cmc_ui *ui = (struct cmc_ui *)userdata; @@ -48,13 +64,16 @@ static void input_poll_callback(void *userdata, s32 revents) } else if (input.id == NCKEY_TAB) { cmc_ui_toggle_overlay(ui); do_refresh = true; - ui->search.search->pager.redraw = true; - continue; } switch (ui->pane) { case CMC_PANE_LIBRARY: break; case CMC_PANE_LISTS: + if (ui->overlay.active) { + do_refresh |= cmc_pane_lists_handle_input_overlay(&ui->lists, &input); + } else { + do_refresh |= cmc_pane_lists_handle_input(&ui->lists, &input); + } break; case CMC_PANE_BROWSE: break; @@ -68,18 +87,7 @@ static void input_poll_callback(void *userdata, s32 revents) } } } while (1); - if (!do_refresh) return; - switch (ui->pane) { - case CMC_PANE_LIBRARY: - break; - case CMC_PANE_LISTS: - break; - case CMC_PANE_BROWSE: - break; - case CMC_PANE_SEARCH: - cmc_pane_search_refresh(&ui->search); - break; - } + if (do_refresh) refresh_internal(ui); } static s32 resize_cb(struct ncplane *p) @@ -110,11 +118,12 @@ bool cmc_ui_open(struct cmc_ui *ui, struct cmc *c) ui->c = c; + cmc_pane_lists_init(&ui->lists, ui); cmc_pane_search_init(&ui->search, ui); - if (!cmc_resources_connect(&ui->resources, ui->nc, &ui->c->loop, TREE_SERVER_IP, TREE_RESOURCE_PORT)) { - return false; - } + //if (!cmc_resources_connect(&ui->resources, ui->nc, &ui->c->loop, CAMU_SERVER_IP, CAMU_RESOURCE_PORT)) { + // return false; + //} cmc_resources_set_callback(&ui->resources, cmc_ui_resources_callback, &ui->search); aki_poll_init(&ui->input, input_poll_callback, ui); @@ -129,5 +138,7 @@ bool cmc_ui_open(struct cmc_ui *ui, struct cmc *c) ncplane_set_userptr(stdplane, ui); resize_cb(stdplane); + refresh_internal(ui); + return true; } diff --git a/src/fruits/cmc/tui/ui.h b/src/fruits/cmc/tui/ui.h index 2f81392..76ea353 100644 --- a/src/fruits/cmc/tui/ui.h +++ b/src/fruits/cmc/tui/ui.h @@ -4,6 +4,7 @@ #include <notcurses/notcurses.h> #include "resources.h" +#include "pane_lists.h" #include "pane_search.h" enum { @@ -29,6 +30,7 @@ struct cmc_ui { } overlay; struct aki_poll input; struct cmc_resources resources; + struct cmc_pane_lists lists; struct cmc_pane_search search; struct cmc *c; }; |