ref: f85ebfc1bfe3e2a42d0530a57d62d79bf6b55046
parent: 84d38195051579957da6fd26114d09d9413f92a1
author: cancel <cancel@cancel.fm>
date: Wed Nov 11 03:10:42 EST 2020
Factor out repeated Qform single line input code Qform (the popup text entry thing) is currently only used as a single modal text input, but the TUI code still went through the motions of setting each one up as if it could have a variety of things inside of it. This commit saves on repeated code by providing a wrapper that does the thing we want, but still leaves the door open in the future for having other types of inputs in the form. It also renames a few Qform functions for consistency.
--- a/term_util.c
+++ b/term_util.c
@@ -59,8 +59,8 @@
int id;
};
-void qmenu_free(Qmenu *qm);
-void qform_free(Qform *qf);
+static void qmenu_free(Qmenu *qm);
+static void qform_free(Qform *qf);
ORCA_NOINLINE static void qmenu_reprint(Qmenu *qm);
Qnav_stack qnav_stack;
@@ -470,7 +470,7 @@
qnav_stack_push(&qm->qblock, menu_min_h, menu_min_w);
}
-void qmenu_free(Qmenu *qm) {
+static void qmenu_free(Qmenu *qm) {
Qmenu_item *items = qm->items;
for (Usz i = 0, n = qm->items_count; i < n; ++i) {
if (items[i].owns_string)
@@ -553,12 +553,21 @@
qf->id = id;
return qf;
}
-
-Qform *qform_of(Qblock *qb) { return ORCA_CONTAINER_OF(qb, Qform, qblock); }
-
+static void qform_free(Qform *qf) {
+ curs_set(0);
+ 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);
+}
int qform_id(Qform const *qf) { return qf->id; }
-
-void qform_add_text_line(Qform *qf, int id, char const *initial) {
+Qform *qform_of(Qblock *qb) { return ORCA_CONTAINER_OF(qb, Qform, qblock); }
+void qform_set_title(Qform *qf, char const *title) {
+ qblock_set_title(&qf->qblock, title);
+}
+void qform_add_line_input(Qform *qf, int id, char const *initial) {
FIELD *f = new_field(1, 30, 0, 0, 0, 0);
if (initial)
set_field_buffer(f, 0, initial);
@@ -568,7 +577,6 @@
++qf->fields_count;
qf->ncurses_fields[qf->fields_count] = NULL;
}
-
void qform_push_to_nav(Qform *qf) {
qf->ncurses_form = new_form(qf->ncurses_fields);
int form_min_h, form_min_w;
@@ -581,21 +589,12 @@
curs_set(1);
form_driver(qf->ncurses_form, REQ_END_LINE);
}
-
-void qform_set_title(Qform *qf, char const *title) {
- qblock_set_title(&qf->qblock, title);
+void qform_single_line_input(int id, char const *title, char const *initial) {
+ Qform *qf = qform_create(id);
+ qform_set_title(qf, title);
+ qform_add_line_input(qf, 1, initial);
+ qform_push_to_nav(qf);
}
-
-void qform_free(Qform *qf) {
- curs_set(0);
- 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);
-}
-
bool qform_drive(Qform *qf, int key, Qform_action *out_action) {
switch (key) {
case 27:
@@ -635,7 +634,6 @@
form_driver(qf->ncurses_form, key);
return false;
}
-
static Usz size_without_trailing_spaces(char const *str) {
Usz size = strlen(str);
for (;;) {
@@ -647,8 +645,7 @@
}
return size;
}
-
-FIELD *qform_find_field(Qform const *qf, int id) {
+static 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];
@@ -657,7 +654,6 @@
}
return NULL;
}
-
bool qform_get_text_line(Qform const *qf, int id, oso **out) {
FIELD *f = qform_find_field(qf, id);
if (!f)
@@ -669,4 +665,14 @@
Usz trimmed = size_without_trailing_spaces(buf);
osoputlen(out, buf, trimmed);
return true;
+}
+bool qform_get_single_text_line(Qform const *qf, struct oso **out) {
+ return qform_get_text_line(qf, 1, out);
+}
+oso *qform_get_nonempty_single_line_input(Qform *qf) {
+ oso *s = NULL;
+ if (qform_get_text_line(qf, 1, &s) && osolen(s) > 0)
+ return s;
+ osofree(s);
+ return NULL;
}
--- a/term_util.h
+++ b/term_util.h
@@ -154,11 +154,14 @@
Qform *qform_create(int id);
int qform_id(Qform const *qf);
Qform *qform_of(Qblock *qb);
-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);
+void qform_add_line_input(Qform *qf, int id, char const *initial);
+void qform_push_to_nav(Qform *qf);
+void qform_single_line_input(int id, char const *title, char const* initial);
bool qform_drive(Qform *qf, int key, Qform_action *out_action);
bool qform_get_text_line(Qform const *qf, int id, struct oso **out);
+bool qform_get_single_text_line(Qform const *qf, struct oso **out);
+struct oso *qform_get_nonempty_single_line_input(Qform *qf);
extern Qnav_stack qnav_stack;
--- a/tui_main.c
+++ b/tui_main.c
@@ -1989,9 +1989,6 @@
#endif
};
enum {
- Single_form_item_id = 1,
-};
-enum {
Autofit_nicely_id = 1,
Autofit_tightly_id,
};
@@ -2084,13 +2081,10 @@
qmenu_push_to_nav(qm);
}
static void push_soft_margins_form(int init_y, int init_x) {
- Qform *qf = qform_create(Set_soft_margins_form_id);
char buff[128];
int snres = snprintf(buff, sizeof buff, "%dx%d", init_x, init_y);
char const *inistr = snres > 0 && (Usz)snres < sizeof buff ? buff : "2x1";
- qform_set_title(qf, "Set Margins");
- qform_add_text_line(qf, Single_form_item_id, inistr);
- qform_push_to_nav(qf);
+ qform_single_line_input(Set_soft_margins_form_id, "Set Margins", inistr);
}
static void push_plainorfancy_menu(int menu_id, char const *title,
bool initial_fancy) {
@@ -2117,16 +2111,12 @@
qmenu_push_to_nav(qm);
}
static void push_osc_output_address_form(char const *initial) {
- Qform *qf = qform_create(Osc_output_address_form_id);
- qform_set_title(qf, "Set OSC Output Address");
- qform_add_text_line(qf, Single_form_item_id, initial);
- qform_push_to_nav(qf);
+ qform_single_line_input(Osc_output_address_form_id, "Set OSC Output Address",
+ initial);
}
static void push_osc_output_port_form(char const *initial) {
- Qform *qf = qform_create(Osc_output_port_form_id);
- qform_set_title(qf, "Set OSC Output Port");
- qform_add_text_line(qf, Single_form_item_id, initial);
- qform_push_to_nav(qf);
+ qform_single_line_input(Osc_output_port_form_id, "Set OSC Output Port",
+ initial);
}
enum {
Playback_menu_midi_bclock = 1,
@@ -2308,10 +2298,7 @@
}
}
static void push_open_form(char const *initial) {
- Qform *qf = qform_create(Open_form_id);
- qform_set_title(qf, "Open");
- qform_add_text_line(qf, Single_form_item_id, initial);
- qform_push_to_nav(qf);
+ qform_single_line_input(Open_form_id, "Open", initial);
}
staticni bool try_save_with_msg(Field *field, oso const *str) {
if (!osolen(str))
@@ -2327,28 +2314,19 @@
return ok;
}
static void push_save_as_form(char const *initial) {
- Qform *qf = qform_create(Save_as_form_id);
- qform_set_title(qf, "Save As");
- qform_add_text_line(qf, Single_form_item_id, initial);
- qform_push_to_nav(qf);
+ qform_single_line_input(Save_as_form_id, "Save As", initial);
}
static void push_set_tempo_form(Usz initial) {
- Qform *qf = qform_create(Set_tempo_form_id);
char buff[64];
int snres = snprintf(buff, sizeof buff, "%zu", initial);
char const *inistr = snres > 0 && (Usz)snres < sizeof buff ? buff : "120";
- qform_set_title(qf, "Set BPM");
- qform_add_text_line(qf, Single_form_item_id, inistr);
- qform_push_to_nav(qf);
+ qform_single_line_input(Set_tempo_form_id, "Set BPM", inistr);
}
static void push_set_grid_dims_form(Usz init_height, Usz init_width) {
- Qform *qf = qform_create(Set_grid_dims_form_id);
char buff[128];
int snres = snprintf(buff, sizeof buff, "%zux%zu", init_width, init_height);
char const *inistr = snres > 0 && (Usz)snres < sizeof buff ? buff : "57x25";
- qform_set_title(qf, "Set Grid Size");
- qform_add_text_line(qf, Single_form_item_id, inistr);
- qform_push_to_nav(qf);
+ qform_single_line_input(Set_grid_dims_form_id, "Set Grid Size", inistr);
}
#ifdef FEAT_PORTMIDI
@@ -2393,14 +2371,6 @@
}
#endif
-staticni oso *get_nonempty_singular_form_text(Qform *qf) {
- oso *s = NULL;
- if (qform_get_text_line(qf, Single_form_item_id, &s) && osolen(s) > 0)
- return s;
- osofree(s);
- return NULL;
-}
-
staticni bool read_int(char const *str, int *out) {
int a;
int res = sscanf(str, "%d", &a);
@@ -3123,7 +3093,7 @@
case Qform_action_type_submitted: {
switch (qform_id(qf)) {
case Open_form_id: {
- oso *temp_name = get_nonempty_singular_form_text(qf);
+ oso *temp_name = qform_get_nonempty_single_line_input(qf);
if (!temp_name)
break;
expand_home_tilde(&temp_name);
@@ -3156,7 +3126,7 @@
break;
}
case Save_as_form_id: {
- oso *temp_name = get_nonempty_singular_form_text(qf);
+ oso *temp_name = qform_get_nonempty_single_line_input(qf);
if (!temp_name)
break;
qnav_stack_pop();
@@ -3167,7 +3137,7 @@
break;
}
case Set_tempo_form_id: {
- oso *tmpstr = get_nonempty_singular_form_text(qf);
+ oso *tmpstr = qform_get_nonempty_single_line_input(qf);
if (!tmpstr)
break;
int newbpm = atoi(osoc(tmpstr));
@@ -3181,7 +3151,7 @@
case Osc_output_address_form_id: {
oso *addr = NULL;
// Empty string is OK here
- if (qform_get_text_line(qf, Single_form_item_id, &addr)) {
+ if (qform_get_single_text_line(qf, &addr)) {
if (osolen(addr))
ososwap(&t->osc_address, &addr);
else
@@ -3195,7 +3165,7 @@
break;
}
case Osc_output_port_form_id: {
- oso *portstr = get_nonempty_singular_form_text(qf);
+ oso *portstr = qform_get_nonempty_single_line_input(qf);
if (!portstr)
break;
qnav_stack_pop();
@@ -3207,7 +3177,7 @@
break;
}
case Set_grid_dims_form_id: {
- oso *tmpstr = get_nonempty_singular_form_text(qf);
+ oso *tmpstr = qform_get_nonempty_single_line_input(qf);
if (!tmpstr)
break;
int newheight, newwidth;
@@ -3231,7 +3201,7 @@
break;
}
case Set_soft_margins_form_id: {
- oso *tmpstr = get_nonempty_singular_form_text(qf);
+ oso *tmpstr = qform_get_nonempty_single_line_input(qf);
if (!tmpstr)
break;
bool do_save = false;
--
⑨