shithub: orca

Download patch

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;
--