From df162ea4a01ebdc77060c99ef76240f3809df54a Mon Sep 17 00:00:00 2001 From: cancel Date: Fri, 14 Dec 2018 00:52:37 +0900 Subject: [PATCH] Add active/inactive indicator for qnav blocks --- term_util.c | 29 ++++++++++++++++++++++++----- term_util.h | 5 +++-- tui_main.c | 8 +++++--- 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/term_util.c b/term_util.c index 94cc3f8..f6581d5 100644 --- a/term_util.c +++ b/term_util.c @@ -58,11 +58,13 @@ void qnav_stack_push(Qnav_type_tag tag, int height, int width, } qnav_stack.blocks[qnav_stack.count] = out; ++qnav_stack.count; + out->title = NULL; out->outer_window = newwin(height + 2, width + 3, 0, left); out->content_window = derwin(out->outer_window, height, width, 1, 1); out->tag = tag; qnav_stack.stack_changed = true; } + Qnav_block* qnav_top_block() { if (qnav_stack.count == 0) return NULL; @@ -83,23 +85,40 @@ void qnav_stack_pop() { qnav_stack.blocks[qnav_stack.count] = NULL; qnav_stack.stack_changed = true; } -void qnav_draw_box(Qnav_block* qb) { box(qb->outer_window, 0, 0); } -void qnav_draw_title(Qnav_block* qb, char const* title) { +void qnav_draw_box_attr(Qnav_block* qb, unsigned int attr) { + wborder(qb->outer_window, ACS_VLINE | attr, ACS_VLINE | attr, + ACS_HLINE | attr, ACS_HLINE | attr, ACS_ULCORNER | attr, + ACS_URCORNER | attr, ACS_LLCORNER | attr, ACS_LRCORNER | attr); +} +void qnav_draw_box(Qnav_block* qb) { qnav_draw_box_attr(qb, A_DIM); } +void qnav_draw_title(Qnav_block* qb, char const* title, int attr) { wmove(qb->outer_window, 0, 2); + attr_t attrs = A_NORMAL; + short pair = 0; + wattr_get(qb->outer_window, &attrs, &pair, NULL); + wattrset(qb->outer_window, attr); wprintw(qb->outer_window, title); + wattr_set(qb->outer_window, attrs, pair, NULL); +} + +void qnav_set_title(Qnav_block* qb, char const* title) { qb->title = title; } + +void qnav_print_frame(Qnav_block* qb, bool active) { + qnav_draw_box_attr(qb, active ? A_BOLD : A_DIM); + if (qb->title) { + qnav_draw_title(qb, qb->title, active ? A_BOLD : A_DIM); + } } 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); + qnav_set_title(&qm->nav_block, title); } Qmsg* qmsg_push(int height, int width) { Qmsg* qm = malloc(sizeof(Qmsg)); qnav_stack_push(Qnav_type_qmsg, height, width, &qm->nav_block); - qnav_draw_box(&qm->nav_block); return qm; } diff --git a/term_util.h b/term_util.h index 66e6643..0cf7358 100644 --- a/term_util.h +++ b/term_util.h @@ -48,6 +48,7 @@ typedef struct { Qnav_type_tag tag; WINDOW* outer_window; WINDOW* content_window; + char const* title; } Qnav_block; typedef struct { @@ -88,10 +89,10 @@ typedef union { void qnav_init(); void qnav_deinit(); -void qnav_draw_box(Qnav_block* qb); -void qnav_draw_title(Qnav_block* qb, char const* title); +void qnav_set_title(Qnav_block* qb, char const* title); Qnav_block* qnav_top_block(); void qnav_stack_pop(); +void qnav_print_frame(Qnav_block* qb, bool active); Qmsg* qmsg_push(int height, int width); WINDOW* qmsg_window(Qmsg* qm); diff --git a/tui_main.c b/tui_main.c index cc43afb..0d6ad04 100644 --- a/tui_main.c +++ b/tui_main.c @@ -1459,8 +1459,7 @@ void push_main_menu() { qmenu_add_spacer(qm); qmenu_add_choice(qm, "Quit", Main_menu_quit); qmenu_push_to_nav(qm); - qnav_draw_box(&qm->nav_block); - qnav_draw_title(&qm->nav_block, "ORCA"); + qnav_set_title(&qm->nav_block, "ORCA"); } void push_controls_msg() { @@ -1731,7 +1730,6 @@ int main(int argc, char** argv) { if (qnav_stack.stack_changed) { werase(stdscr); drew_any = true; - qnav_stack.stack_changed = false; } if (ged_is_draw_dirty(&ged_state) || drew_any) { werase(cont_window); @@ -1741,10 +1739,14 @@ int main(int argc, char** argv) { } for (Usz i = 0; i < qnav_stack.count; ++i) { Qnav_block* qb = qnav_stack.blocks[i]; + if (qnav_stack.stack_changed) { + qnav_print_frame(qb, i == qnav_stack.count - 1); + } touchwin(qb->outer_window); wnoutrefresh(qb->outer_window); drew_any = true; } + qnav_stack.stack_changed = false; if (drew_any) doupdate(); diff = stm_laptime(&last_time);