diff --git a/term_util.c b/term_util.c index 8eccde2..94cc3f8 100644 --- a/term_util.c +++ b/term_util.c @@ -91,6 +91,11 @@ void qnav_draw_title(Qnav_block* qb, char const* title) { WINDOW* qmsg_window(Qmsg* qm) { return qm->nav_block.content_window; } +void qmsg_set_title(Qmsg* qm, char const* title) { + Qnav_block* qb = &qm->nav_block; + qnav_draw_title(qb, title); +} + Qmsg* qmsg_push(int height, int width) { Qmsg* qm = malloc(sizeof(Qmsg)); qnav_stack_push(Qnav_type_qmsg, height, width, &qm->nav_block); diff --git a/term_util.h b/term_util.h index a248607..66e6643 100644 --- a/term_util.h +++ b/term_util.h @@ -95,6 +95,7 @@ void qnav_stack_pop(); Qmsg* qmsg_push(int height, int width); WINDOW* qmsg_window(Qmsg* qm); +void qmsg_set_title(Qmsg* qm, char const* title); bool qmsg_drive(Qmsg* qm, int key); Qmsg* qmsg_of(Qnav_block* qb); diff --git a/tui_main.c b/tui_main.c index b435bec..67cd2c4 100644 --- a/tui_main.c +++ b/tui_main.c @@ -1455,7 +1455,7 @@ void push_main_menu() { qmenu_add_choice(qm, "Save", Main_menu_save); // qmenu_add_choice(qm, "Save As...", Main_menu_save_as); qmenu_add_spacer(qm); - qmenu_add_choice(qm, "Controls", Main_menu_controls); + qmenu_add_choice(qm, "Controls...", Main_menu_controls); qmenu_add_spacer(qm); qmenu_add_choice(qm, "Quit", Main_menu_quit); qmenu_push_to_nav(qm); @@ -1464,11 +1464,58 @@ void push_main_menu() { } void push_controls_msg() { - Qmsg* qm = qmsg_push(30, 30); + struct Ctrl_item { + char const* left; + char const* right; + }; + static struct Ctrl_item items[] = { + {"Ctrl+Q", "Quit"}, + {"Arrow keys", "Move Cursor"}, + {"Ctrl+D or F1", "Open Main Menu"}, + {NULL, NULL}, + {"0-9, A-Z, a-z,", "Insert Character"}, + {"!, :, #, and *", NULL}, + {NULL, NULL}, + {"Spacebar", "Play/Pause"}, + {"Ctrl+Z or Ctrl+U", "Undo"}, + {"Ctrl+X", "Cut"}, + {"Ctrl+C", "Copy"}, + {"Ctrl+V", "Paste"}, + {"Ctrl+S", "Save"}, + {"Ctrl+F", "Frame Step Forward"}, + }; + int w_left = 0; + int w_right = 0; + for (Usz i = 0; i < ORCA_ARRAY_COUNTOF(items); ++i) { + // use wcswidth instead of strlen if you need wide char support. but note + // that won't be useful for UTF-8 or unicode chars in higher plane (emoji, + // complex zwj, etc.) + if (items[i].left) { + int wl = (int)strlen(items[i].left); + if (wl > w_left) + w_left = wl; + } + if (items[i].right) { + int wr = (int)strlen(items[i].right); + if (wr > w_right) + w_right = wr; + } + } + int mid_pad = 2; + int total_width = 1 + w_left + mid_pad + w_right; + Qmsg* qm = qmsg_push(ORCA_ARRAY_COUNTOF(items), total_width); WINDOW* w = qmsg_window(qm); - wmove(w, 0, 0); - wprintw(w, "ctrl+Q\tquit\n"); - wprintw(w, "arrow keys\tmove cursor\n"); + qmsg_set_title(qm, "Controls"); + for (int i = 0; i < (int)ORCA_ARRAY_COUNTOF(items); ++i) { + if (items[i].left) { + wmove(w, i, 1); + wprintw(w, items[i].left); + } + if (items[i].right) { + wmove(w, i, w_left + 1 + mid_pad); + wprintw(w, items[i].right); + } + } } void try_save_with_msg(Ged* ged) {