summaryrefslogtreecommitdiff
path: root/src/fruits/cmc/ui
diff options
context:
space:
mode:
Diffstat (limited to 'src/fruits/cmc/ui')
-rw-r--r--src/fruits/cmc/ui/pane_search.c39
-rw-r--r--src/fruits/cmc/ui/tile.h5
-rw-r--r--src/fruits/cmc/ui/ui.c67
-rw-r--r--src/fruits/cmc/ui/ui.h25
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);