From e1a9def1933089b3c9f7d4f2a6f265fa03c17e42 Mon Sep 17 00:00:00 2001 From: cancel Date: Mon, 17 Dec 2018 23:17:31 +0900 Subject: [PATCH] Add start of forms use --- field.c | 2 +- field.h | 2 +- term_util.c | 75 +++++++++++++++++++++++++++++++++++++++++++---------- term_util.h | 18 +++++++------ tool | 2 +- tui_main.c | 16 +++++++----- 6 files changed, 83 insertions(+), 32 deletions(-) diff --git a/field.c b/field.c index cfd3886..b24303a 100644 --- a/field.c +++ b/field.c @@ -2,7 +2,7 @@ #include "gbuffer.h" #include -void field_init(Field* f) { +void gfield_init(Field* f) { f->buffer = NULL; f->height = 0; f->width = 0; diff --git a/field.h b/field.h index db0067a..c4a1852 100644 --- a/field.h +++ b/field.h @@ -7,7 +7,7 @@ struct Field { U16 width; }; -void field_init(Field* field); +void gfield_init(Field* field); void field_init_fill(Field* field, Usz height, Usz width, Glyph fill_char); void field_deinit(Field* field); void field_resize_raw(Field* field, Usz height, Usz width); diff --git a/term_util.c b/term_util.c index 67a447a..fba2068 100644 --- a/term_util.c +++ b/term_util.c @@ -1,5 +1,6 @@ -#include "base.h" #include "term_util.h" +#include +#include void term_util_init_colors() { if (has_colors()) { @@ -29,6 +30,22 @@ void term_util_init_colors() { #define ORCA_CONTAINER_OF(ptr, type, member) \ ((type*)((char*)(1 ? (ptr) : &((type*)0)->member) - offsetof(type, member))) +struct Qmenu { + Qblock qblock; + MENU* ncurses_menu; + ITEM* ncurses_items[32]; + Usz items_count; + int id; +}; + +struct Qform { + Qblock qblock; + FORM* ncurses_form; + FIELD* ncurses_fields[32]; + Usz fields_count; + int id; +}; + Qnav_stack qnav_stack; static struct { int unused; } qmenu_spacer_user_unique; @@ -88,6 +105,25 @@ void qnav_stack_pop() { qnav_stack.blocks[qnav_stack.count] = NULL; qnav_stack.stack_changed = true; } + +void qmenu_free(Qmenu* qm); +void qform_free(Qform* qf); + +void qnav_free_block(Qblock* qb) { + switch (qb->tag) { + case Qblock_type_qmsg: { + Qmsg* qm = qmsg_of(qb); + free(qm); + } break; + case Qblock_type_qmenu: { + qmenu_free(qmenu_of(qb)); + } break; + case Qblock_type_qform: { + qform_free(qform_of(qb)); + } break; + } +} + void qblock_print_border(Qblock* qb, unsigned int attr) { wborder(qb->outer_window, ACS_VLINE | attr, ACS_VLINE | attr, ACS_HLINE | attr, ACS_HLINE | attr, ACS_ULCORNER | attr, @@ -149,6 +185,10 @@ Qmenu* qmenu_create(int id) { qm->id = id; return qm; } +int qmenu_id(Qmenu const* qm) { return qm->id; } +void qmenu_set_title(Qmenu* qm, char const* title) { + qblock_set_title(&qm->qblock, title); +} void qmenu_add_choice(Qmenu* qm, char const* text, int id) { ITEM* item = new_item(text, NULL); set_item_userptr(item, (void*)(intptr_t)(id)); @@ -186,19 +226,6 @@ void qmenu_free(Qmenu* qm) { free(qm); } -void qnav_free_block(Qblock* qb) { - switch (qb->tag) { - case Qblock_type_qmsg: { - Qmsg* qm = qmsg_of(qb); - free(qm); - } break; - case Qblock_type_qmenu: { - Qmenu* qm = qmenu_of(qb); - qmenu_free(qm); - } break; - } -} - bool qmenu_drive(Qmenu* qm, int key, Qmenu_action* out_action) { switch (key) { case 27: { @@ -254,3 +281,23 @@ bool qmenu_top_is_menu(int id) { Qmenu* qm = qmenu_of(qb); return qm->id == id; } + +Qform* qform_create(int id) { + Qform* qf = (Qform*)malloc(sizeof(Qform)); + qf->ncurses_form = NULL; + qf->ncurses_fields[0] = NULL; + qf->fields_count = 0; + qf->id = id; + return qf; +} + +Qform* qform_of(Qblock* qb) { return ORCA_CONTAINER_OF(qb, Qform, qblock); } + +void qform_free(Qform* qf) { + unpost_form(qf->ncurses_form); + free_form(qf->ncurses_form); + for (Usz i = 0; i < qf->fields_count; ++i) { + free_field(qf->ncurses_fields[i]); + } + free(qf); +} diff --git a/term_util.h b/term_util.h index d1d92e3..669e54a 100644 --- a/term_util.h +++ b/term_util.h @@ -1,5 +1,5 @@ #pragma once -#include +#include "base.h" #include #define CTRL_PLUS(c) ((c)&037) @@ -42,6 +42,7 @@ void term_util_init_colors(void); typedef enum { Qblock_type_qmsg, Qblock_type_qmenu, + Qblock_type_qform, } Qblock_type_tag; typedef struct { @@ -61,13 +62,7 @@ typedef struct { Qblock qblock; } Qmsg; -typedef struct { - Qblock qblock; - MENU* ncurses_menu; - ITEM* ncurses_items[32]; - Usz items_count; - int id; -} Qmenu; +typedef struct Qmenu Qmenu; typedef enum { Qmenu_action_type_canceled, @@ -88,6 +83,8 @@ typedef union { Qmenu_action_picked picked; } Qmenu_action; +typedef struct Qform Qform; + void qnav_init(void); void qnav_deinit(void); Qblock* qnav_top_block(void); @@ -103,6 +100,8 @@ bool qmsg_drive(Qmsg* qm, int key); Qmsg* qmsg_of(Qblock* qb); Qmenu* qmenu_create(int id); +int qmenu_id(Qmenu const* qm); +void qmenu_set_title(Qmenu* qm, char const* title); void qmenu_add_choice(Qmenu* qm, char const* text, int id); void qmenu_add_spacer(Qmenu* qm); void qmenu_push_to_nav(Qmenu* qm); @@ -110,4 +109,7 @@ bool qmenu_drive(Qmenu* qm, int key, Qmenu_action* out_action); Qmenu* qmenu_of(Qblock* qb); bool qmenu_top_is_menu(int id); +Qform* qform_create(int id); +Qform* qform_of(Qblock* qb); + extern Qnav_stack qnav_stack; diff --git a/tool b/tool index 9aa1648..876a014 100755 --- a/tool +++ b/tool @@ -277,7 +277,7 @@ build_target() { add cc_flags -D_POSIX_C_SOURCE=200809L ;; esac - add libraries -lmenuw -lncursesw + add libraries -lmenuw -lformw -lncursesw # If we wanted wide chars, use -lncursesw on Linux, and still just # -lncurses on Mac. ;; diff --git a/tui_main.c b/tui_main.c index be7612a..43563a9 100644 --- a/tui_main.c +++ b/tui_main.c @@ -341,7 +341,7 @@ void undo_history_push(Undo_history* hist, Field* field, Usz tick_num) { } else { new_node = malloc(sizeof(Undo_node)); ++hist->count; - field_init(&new_node->field); + gfield_init(&new_node->field); } field_copy(field, &new_node->field); new_node->tick_num = tick_num; @@ -670,9 +670,9 @@ typedef struct { } Ged; void ged_init(Ged* a) { - field_init(&a->field); - field_init(&a->scratch_field); - field_init(&a->clipboard_field); + gfield_init(&a->field); + gfield_init(&a->scratch_field); + gfield_init(&a->clipboard_field); markmap_reusable_init(&a->markmap_r); bank_init(&a->bank); undo_history_init(&a->undo_hist); @@ -1505,7 +1505,7 @@ void push_main_menu(void) { qmenu_add_spacer(qm); qmenu_add_choice(qm, "Quit", Main_menu_quit); qmenu_push_to_nav(qm); - qblock_set_title(&qm->qblock, "ORCA"); + qmenu_set_title(qm, "ORCA"); } void push_about_msg(void) { @@ -1925,7 +1925,7 @@ int main(int argc, char** argv) { Qmenu_action act; // special case for main menu: pressing the key to open it will close // it again. - if (qm->id == Main_menu_id && + if (qmenu_id(qm) == Main_menu_id && (key == CTRL_PLUS('d') || key == KEY_F(1))) { qnav_stack_pop(); break; @@ -1936,7 +1936,7 @@ int main(int argc, char** argv) { qnav_stack_pop(); } break; case Qmenu_action_type_picked: { - if (qm->id == Main_menu_id) { + if (qmenu_id(qm) == Main_menu_id) { switch (act.picked.id) { case Main_menu_quit: goto quit; @@ -1961,6 +1961,8 @@ int main(int argc, char** argv) { } } } break; + case Qblock_type_qform: { + } break; } goto next_getch; }