summaryrefslogtreecommitdiff
path: root/src/fruits/cmc
diff options
context:
space:
mode:
Diffstat (limited to 'src/fruits/cmc')
-rw-r--r--src/fruits/cmc/cmc.c6
-rw-r--r--src/fruits/cmc/meson.build1
-rw-r--r--src/fruits/cmc/tui/pager.c2
-rw-r--r--src/fruits/cmc/tui/pane_lists.c93
-rw-r--r--src/fruits/cmc/tui/pane_lists.h20
-rw-r--r--src/fruits/cmc/tui/pane_search.c27
-rw-r--r--src/fruits/cmc/tui/ui.c47
-rw-r--r--src/fruits/cmc/tui/ui.h2
8 files changed, 165 insertions, 33 deletions
diff --git a/src/fruits/cmc/cmc.c b/src/fruits/cmc/cmc.c
index 97ae15d..5bbdb0b 100644
--- a/src/fruits/cmc/cmc.c
+++ b/src/fruits/cmc/cmc.c
@@ -5,7 +5,7 @@
#include <aki/common.h>
#include <aki/event_loop.h>
-#include "../../tree/common.h"
+#include "../../server/common.h"
#include "cmc.h"
@@ -78,7 +78,7 @@ s32 main(s32 argc, char *argv[])
str module;
str query;
- str *cmd = al_str_c(argv[1]);
+ str *cmd = al_str_cr(argv[1]);
if (al_str_eq(cmd, al_str_c("search"))) {
c.type = CMC_SEARCH;
if (argc == 2) {
@@ -104,7 +104,7 @@ s32 main(s32 argc, char *argv[])
aki_event_loop_init(&c.loop);
camu_client_init(&c.client, &c.loop, client_callback, &c);
- if (!camu_client_login(&c.client, al_str_c("andrew"), TREE_SERVER_IP, TREE_PORT)) {
+ if (!camu_client_login(&c.client, al_str_c("andrew"), CAMU_SERVER_IP, CAMU_PORT)) {
goto err;
}
diff --git a/src/fruits/cmc/meson.build b/src/fruits/cmc/meson.build
index 6dd3960..57ded9c 100644
--- a/src/fruits/cmc/meson.build
+++ b/src/fruits/cmc/meson.build
@@ -4,6 +4,7 @@ cmc_src = [
'tui/resources.c',
'tui/pager.c',
'tui/view_twitter.c',
+ 'tui/pane_lists.c',
'tui/pane_search.c'
]
cmc_deps = [common_deps, libclient, subproject('stb').get_variable('stb')]
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;
};