Browse Source

Add start of forms use

master
cancel 6 years ago
parent
commit
e1a9def193
  1. 2
      field.c
  2. 2
      field.h
  3. 75
      term_util.c
  4. 18
      term_util.h
  5. 2
      tool
  6. 16
      tui_main.c

2
field.c

@ -2,7 +2,7 @@
#include "gbuffer.h" #include "gbuffer.h"
#include <ctype.h> #include <ctype.h>
void field_init(Field* f) { void gfield_init(Field* f) {
f->buffer = NULL; f->buffer = NULL;
f->height = 0; f->height = 0;
f->width = 0; f->width = 0;

2
field.h

@ -7,7 +7,7 @@ struct Field {
U16 width; 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_init_fill(Field* field, Usz height, Usz width, Glyph fill_char);
void field_deinit(Field* field); void field_deinit(Field* field);
void field_resize_raw(Field* field, Usz height, Usz width); void field_resize_raw(Field* field, Usz height, Usz width);

75
term_util.c

@ -1,5 +1,6 @@
#include "base.h"
#include "term_util.h" #include "term_util.h"
#include <form.h>
#include <menu.h>
void term_util_init_colors() { void term_util_init_colors() {
if (has_colors()) { if (has_colors()) {
@ -29,6 +30,22 @@ void term_util_init_colors() {
#define ORCA_CONTAINER_OF(ptr, type, member) \ #define ORCA_CONTAINER_OF(ptr, type, member) \
((type*)((char*)(1 ? (ptr) : &((type*)0)->member) - offsetof(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; Qnav_stack qnav_stack;
static struct { int unused; } qmenu_spacer_user_unique; 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.blocks[qnav_stack.count] = NULL;
qnav_stack.stack_changed = true; 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) { void qblock_print_border(Qblock* qb, unsigned int attr) {
wborder(qb->outer_window, ACS_VLINE | attr, ACS_VLINE | attr, wborder(qb->outer_window, ACS_VLINE | attr, ACS_VLINE | attr,
ACS_HLINE | attr, ACS_HLINE | attr, ACS_ULCORNER | attr, ACS_HLINE | attr, ACS_HLINE | attr, ACS_ULCORNER | attr,
@ -149,6 +185,10 @@ Qmenu* qmenu_create(int id) {
qm->id = id; qm->id = id;
return qm; 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) { void qmenu_add_choice(Qmenu* qm, char const* text, int id) {
ITEM* item = new_item(text, NULL); ITEM* item = new_item(text, NULL);
set_item_userptr(item, (void*)(intptr_t)(id)); set_item_userptr(item, (void*)(intptr_t)(id));
@ -186,19 +226,6 @@ void qmenu_free(Qmenu* qm) {
free(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) { bool qmenu_drive(Qmenu* qm, int key, Qmenu_action* out_action) {
switch (key) { switch (key) {
case 27: { case 27: {
@ -254,3 +281,23 @@ bool qmenu_top_is_menu(int id) {
Qmenu* qm = qmenu_of(qb); Qmenu* qm = qmenu_of(qb);
return qm->id == id; 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);
}

18
term_util.h

@ -1,5 +1,5 @@
#pragma once #pragma once
#include <menu.h> #include "base.h"
#include <ncurses.h> #include <ncurses.h>
#define CTRL_PLUS(c) ((c)&037) #define CTRL_PLUS(c) ((c)&037)
@ -42,6 +42,7 @@ void term_util_init_colors(void);
typedef enum { typedef enum {
Qblock_type_qmsg, Qblock_type_qmsg,
Qblock_type_qmenu, Qblock_type_qmenu,
Qblock_type_qform,
} Qblock_type_tag; } Qblock_type_tag;
typedef struct { typedef struct {
@ -61,13 +62,7 @@ typedef struct {
Qblock qblock; Qblock qblock;
} Qmsg; } Qmsg;
typedef struct { typedef struct Qmenu Qmenu;
Qblock qblock;
MENU* ncurses_menu;
ITEM* ncurses_items[32];
Usz items_count;
int id;
} Qmenu;
typedef enum { typedef enum {
Qmenu_action_type_canceled, Qmenu_action_type_canceled,
@ -88,6 +83,8 @@ typedef union {
Qmenu_action_picked picked; Qmenu_action_picked picked;
} Qmenu_action; } Qmenu_action;
typedef struct Qform Qform;
void qnav_init(void); void qnav_init(void);
void qnav_deinit(void); void qnav_deinit(void);
Qblock* qnav_top_block(void); Qblock* qnav_top_block(void);
@ -103,6 +100,8 @@ bool qmsg_drive(Qmsg* qm, int key);
Qmsg* qmsg_of(Qblock* qb); Qmsg* qmsg_of(Qblock* qb);
Qmenu* qmenu_create(int id); 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_choice(Qmenu* qm, char const* text, int id);
void qmenu_add_spacer(Qmenu* qm); void qmenu_add_spacer(Qmenu* qm);
void qmenu_push_to_nav(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); Qmenu* qmenu_of(Qblock* qb);
bool qmenu_top_is_menu(int id); bool qmenu_top_is_menu(int id);
Qform* qform_create(int id);
Qform* qform_of(Qblock* qb);
extern Qnav_stack qnav_stack; extern Qnav_stack qnav_stack;

2
tool

@ -277,7 +277,7 @@ build_target() {
add cc_flags -D_POSIX_C_SOURCE=200809L add cc_flags -D_POSIX_C_SOURCE=200809L
;; ;;
esac esac
add libraries -lmenuw -lncursesw add libraries -lmenuw -lformw -lncursesw
# If we wanted wide chars, use -lncursesw on Linux, and still just # If we wanted wide chars, use -lncursesw on Linux, and still just
# -lncurses on Mac. # -lncurses on Mac.
;; ;;

16
tui_main.c

@ -341,7 +341,7 @@ void undo_history_push(Undo_history* hist, Field* field, Usz tick_num) {
} else { } else {
new_node = malloc(sizeof(Undo_node)); new_node = malloc(sizeof(Undo_node));
++hist->count; ++hist->count;
field_init(&new_node->field); gfield_init(&new_node->field);
} }
field_copy(field, &new_node->field); field_copy(field, &new_node->field);
new_node->tick_num = tick_num; new_node->tick_num = tick_num;
@ -670,9 +670,9 @@ typedef struct {
} Ged; } Ged;
void ged_init(Ged* a) { void ged_init(Ged* a) {
field_init(&a->field); gfield_init(&a->field);
field_init(&a->scratch_field); gfield_init(&a->scratch_field);
field_init(&a->clipboard_field); gfield_init(&a->clipboard_field);
markmap_reusable_init(&a->markmap_r); markmap_reusable_init(&a->markmap_r);
bank_init(&a->bank); bank_init(&a->bank);
undo_history_init(&a->undo_hist); undo_history_init(&a->undo_hist);
@ -1505,7 +1505,7 @@ void push_main_menu(void) {
qmenu_add_spacer(qm); qmenu_add_spacer(qm);
qmenu_add_choice(qm, "Quit", Main_menu_quit); qmenu_add_choice(qm, "Quit", Main_menu_quit);
qmenu_push_to_nav(qm); qmenu_push_to_nav(qm);
qblock_set_title(&qm->qblock, "ORCA"); qmenu_set_title(qm, "ORCA");
} }
void push_about_msg(void) { void push_about_msg(void) {
@ -1925,7 +1925,7 @@ int main(int argc, char** argv) {
Qmenu_action act; Qmenu_action act;
// special case for main menu: pressing the key to open it will close // special case for main menu: pressing the key to open it will close
// it again. // it again.
if (qm->id == Main_menu_id && if (qmenu_id(qm) == Main_menu_id &&
(key == CTRL_PLUS('d') || key == KEY_F(1))) { (key == CTRL_PLUS('d') || key == KEY_F(1))) {
qnav_stack_pop(); qnav_stack_pop();
break; break;
@ -1936,7 +1936,7 @@ int main(int argc, char** argv) {
qnav_stack_pop(); qnav_stack_pop();
} break; } break;
case Qmenu_action_type_picked: { case Qmenu_action_type_picked: {
if (qm->id == Main_menu_id) { if (qmenu_id(qm) == Main_menu_id) {
switch (act.picked.id) { switch (act.picked.id) {
case Main_menu_quit: case Main_menu_quit:
goto quit; goto quit;
@ -1961,6 +1961,8 @@ int main(int argc, char** argv) {
} }
} }
} break; } break;
case Qblock_type_qform: {
} break;
} }
goto next_getch; goto next_getch;
} }

Loading…
Cancel
Save