From ea9682b12b2f563cbc92a795fe1818119d5c0240 Mon Sep 17 00:00:00 2001 From: cancel Date: Tue, 18 Dec 2018 04:52:46 +0900 Subject: [PATCH] Add more file save as logic --- term_util.c | 49 +++++++++++++++++++++++++++++++++++++++++++++---- term_util.h | 2 ++ tui_main.c | 10 ++++++++++ 3 files changed, 57 insertions(+), 4 deletions(-) diff --git a/term_util.c b/term_util.c index db483c8..6947ba2 100644 --- a/term_util.c +++ b/term_util.c @@ -1,4 +1,5 @@ #include "term_util.h" +#include #include #include @@ -26,15 +27,14 @@ void heapstr_reserve(Heapstr* hs, Usz capacity) { } void heapstr_set_cstrlen(Heapstr* hs, char const* cstr, Usz len) { heapstr_reserve(hs, len + 1); - memcpy(hs->str, cstr, len + 1); + memcpy(hs->str, cstr, len); + hs->str[len] = 0; } void heapstr_set_cstr(Heapstr* hs, char const* cstr) { Usz len = strlen(cstr); heapstr_set_cstrlen(hs, cstr, len); } -Usz heapstr_len(Heapstr const* hs) { - return strlen(hs->str); -} +Usz heapstr_len(Heapstr const* hs) { return strlen(hs->str); } void term_util_init_colors() { if (has_colors()) { @@ -416,9 +416,50 @@ bool qform_drive(Qform* qf, int key, Qform_action* out_action) { case CTRL_PLUS('h'): form_driver(qf->ncurses_form, REQ_DEL_PREV); return false; + case ' ': + case '\r': + case KEY_ENTER: { + out_action->any.type = Qform_action_type_submitted; + return true; + } break; default: form_driver(qf->ncurses_form, key); return false; } return false; } + +static Usz size_without_trailing_spaces(char const* str) { + Usz size = strlen(str); + for (;;) { + if (size == 0) + break; + if (!isspace(str[size - 1])) + break; + --size; + } + return size; +} + +FIELD* qform_find_field(Qform const* qf, int id) { + Usz count = qf->fields_count; + for (Usz i = 0; i < count; ++i) { + FIELD* f = qf->ncurses_fields[i]; + if ((int)(intptr_t)field_userptr(f) == id) + return f; + } + return NULL; +} + +bool qform_get_text_line(Qform const* qf, int id, Heapstr* out) { + FIELD* f = qform_find_field(qf, id); + if (!f) + return false; + form_driver(qf->ncurses_form, REQ_VALIDATION); + char* buf = field_buffer(f, 0); + if (!buf) + return false; + Usz trimmed = size_without_trailing_spaces(buf); + heapstr_set_cstrlen(out, buf, trimmed); + return true; +} diff --git a/term_util.h b/term_util.h index f2d883c..826f0fe 100644 --- a/term_util.h +++ b/term_util.h @@ -99,6 +99,7 @@ typedef struct Qform Qform; typedef enum { Qform_action_type_canceled, + Qform_action_type_submitted, } Qform_action_type; typedef struct { Qform_action_type type; @@ -138,5 +139,6 @@ void qform_add_text_line(Qform* qf, int id, char const* initial); void qform_push_to_nav(Qform* qf); void qform_set_title(Qform* qf, char const* title); bool qform_drive(Qform* qf, int key, Qform_action* out_action); +bool qform_get_text_line(Qform const* qf, int id, Heapstr* out); extern Qnav_stack qnav_stack; diff --git a/tui_main.c b/tui_main.c index 4c5a3d6..ec6a1fd 100644 --- a/tui_main.c +++ b/tui_main.c @@ -1982,6 +1982,16 @@ int main(int argc, char** argv) { case Qform_action_type_canceled: qnav_stack_pop(); break; + case Qform_action_type_submitted: { + switch (qform_id(qf)) { + case Save_as_form_id: { + if (qform_get_text_line(qf, Save_as_name_id, &file_name)) { + fprintf(stderr, "new file name: %s\n", file_name.str); + ged_state.filename = file_name.str; + } + } break; + } + } break; } } } break;