From f2c84837807aaa0145c4242347f93e8ec48630bd Mon Sep 17 00:00:00 2001 From: cancel Date: Sat, 18 Jan 2020 19:51:33 +0900 Subject: [PATCH] Add options for fancy or plain grid dots and rulers --- tui_main.c | 149 +++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 138 insertions(+), 11 deletions(-) diff --git a/tui_main.c b/tui_main.c index 33b807a..b05a1ea 100644 --- a/tui_main.c +++ b/tui_main.c @@ -1879,6 +1879,8 @@ enum { Confirm_new_file_menu_id, Cosmetics_menu_id, Set_soft_margins_form_id, + Set_fancy_grid_dots_menu_id, + Set_fancy_grid_rulers_menu_id, #ifdef FEAT_PORTMIDI Portmidi_output_device_menu_id, #endif @@ -1971,6 +1973,8 @@ void push_autofit_menu(void) { enum { Cosmetics_soft_margins_id = 1, + Cosmetics_grid_dots_id, + Cosmetics_grid_rulers_id, }; enum { Soft_margins_text_line_id = 1, @@ -1979,6 +1983,8 @@ void push_cosmetics_menu(void) { Qmenu *qm = qmenu_create(Cosmetics_menu_id); qmenu_set_title(qm, "Appearance"); qmenu_add_choice(qm, Cosmetics_soft_margins_id, "Margins..."); + qmenu_add_choice(qm, Cosmetics_grid_dots_id, "Grid dots..."); + qmenu_add_choice(qm, Cosmetics_grid_rulers_id, "Grid rulers..."); qmenu_push_to_nav(qm); } void push_soft_margins_form(int init_y, int init_x) { @@ -1990,6 +1996,40 @@ void push_soft_margins_form(int init_y, int init_x) { qform_add_text_line(qf, Soft_margins_text_line_id, inistr); qform_push_to_nav(qf); } +void push_plainorfancy_menu(int menu_id, char const *title, + bool initial_fancy) { + Qmenu *qm = qmenu_create(menu_id); + qmenu_set_title(qm, title); + qmenu_add_printf(qm, 1, "(%c) Fancy", initial_fancy ? '*' : ' '); + qmenu_add_printf(qm, 2, "(%c) Plain", !initial_fancy ? '*' : ' '); + if (!initial_fancy) + qmenu_set_current_item(qm, 2); + qmenu_push_to_nav(qm); +} + +bool plainorfancy_menu_was_picked(int picked_id, bool *p_is_fancy, + U32 *prefs_touched, U32 pref_touch_flag) { + bool val = *p_is_fancy; + bool newval = val; + switch (picked_id) { + case 1: // fancy + newval = true; + break; + case 2: // plain + newval = false; + break; + default: // wat + break; + } + bool changed = newval != val; + if (changed) { + *p_is_fancy = newval; + *prefs_touched |= pref_touch_flag; + } + qnav_stack_pop(); + // ^- doesn't actually matter when we do this, with our current code + return changed; +} void push_about_msg(void) { // clang-format off @@ -2240,7 +2280,7 @@ void push_portmidi_output_device_menu(Midi_mode const *midi_mode) { if (!info || !info->output) continue; bool is_cur_dev_id = has_cur_dev_id && cur_dev_id == i; - qmenu_add_printf(qm, i, "[%c] #%d - %s", is_cur_dev_id ? '*' : ' ', i, + qmenu_add_printf(qm, i, "(%c) #%d - %s", is_cur_dev_id ? '*' : ' ', i, info->name); ++output_devices; } @@ -2359,6 +2399,7 @@ void try_send_to_gui_clipboard(Ged const *a, bool *io_use_gui_clipboard) { typedef struct { oso *portmidi_output_device; int softmargin_y, softmargin_x; + bool fancy_grid_dots : 1, fancy_grid_rulers : 1; U32 touched; } Prefs; @@ -2369,11 +2410,18 @@ typedef enum { Prefs_load_ok = 0, } Prefs_load_error; -char const *const confopts[] = {"portmidi_output_device", "margins"}; +char const *const confopts[] = { + "portmidi_output_device", + "margins", + "grid_dot_type", + "grid_ruler_type", +}; enum { Confoptslen = ORCA_ARRAY_COUNTOF(confopts) }; enum { Confopt_portmidi_output_device = 0, Confopt_margins, + Confopt_grid_dot_type, + Confopt_grid_ruler_type, }; enum { @@ -2381,6 +2429,21 @@ enum { Preftouch_griddotstype = 1 << 1, Preftouch_gridrulerstype = 1 << 2, }; +char const *const prefval_plain = "plain"; +char const *const prefval_fancy = "fancy"; + +ORCA_FORCE_NO_INLINE +bool plainorfancy(char const *val, bool *out) { + if (strcmp(val, prefval_plain) == 0) { + *out = false; + return true; + } + if (strcmp(val, prefval_fancy) == 0) { + *out = true; + return true; + } + return false; +} ORCA_FORCE_NO_INLINE Prefs_load_error prefs_load_from_conf_file(Prefs *p) { @@ -2399,6 +2462,20 @@ Prefs_load_error prefs_load_from_conf_file(Prefs *p) { p->touched |= Preftouch_softmargins; } } break; + case Confopt_grid_dot_type: { + bool fancy; + if (plainorfancy(ez.value, &fancy)) { + p->fancy_grid_dots = fancy; + p->touched |= Preftouch_griddotstype; + } + } break; + case Confopt_grid_ruler_type: { + bool fancy; + if (plainorfancy(ez.value, &fancy)) { + p->fancy_grid_rulers = fancy; + p->touched |= Preftouch_gridrulerstype; + } + } break; } } return Prefs_load_ok; @@ -2406,7 +2483,8 @@ Prefs_load_error prefs_load_from_conf_file(Prefs *p) { void save_prefs_with_error_message(U32 prefs_touched, Midi_mode const *midi_mode, int softmargin_y, - int softmargin_x) { + int softmargin_x, bool fancy_grid_dots, + bool fancy_grid_rulers) { Ezconf_opt optsbuff[Confoptslen]; Ezconf_w ez; ezconf_w_start(&ez, optsbuff, ORCA_ARRAY_COUNTOF(optsbuff)); @@ -2431,9 +2509,14 @@ void save_prefs_with_error_message(U32 prefs_touched, } break; #endif } - if (prefs_touched & Preftouch_softmargins) { + if (prefs_touched & Preftouch_softmargins) ezconf_w_addopt(&ez, confopts[Confopt_margins], Confopt_margins); - } + if (prefs_touched & Preftouch_griddotstype) + ezconf_w_addopt(&ez, confopts[Confopt_grid_dot_type], + Confopt_grid_dot_type); + if (prefs_touched & Preftouch_gridrulerstype) + ezconf_w_addopt(&ez, confopts[Confopt_grid_ruler_type], + Confopt_grid_ruler_type); while (ezconf_w_step(&ez)) { switch (ez.optid) { #ifdef FEAT_PORTMIDI @@ -2444,6 +2527,12 @@ void save_prefs_with_error_message(U32 prefs_touched, case Confopt_margins: fprintf(ez.file, "%dx%d", softmargin_x, softmargin_y); break; + case Confopt_grid_dot_type: + fputs(fancy_grid_dots ? prefval_fancy : prefval_plain, ez.file); + break; + case Confopt_grid_ruler_type: + fputs(fancy_grid_rulers ? prefval_fancy : prefval_plain, ez.file); + break; } } osofree(midi_output_device_name); @@ -2515,6 +2604,7 @@ int main(int argc, char **argv) { bool use_gui_cboard = true; bool strict_timing = false; bool should_autosize_grid = true; + bool fancy_grid_dots = true, fancy_grid_rulers = true; Midi_mode midi_mode; midi_mode_init_null(&midi_mode); @@ -2740,11 +2830,17 @@ int main(int argc, char **argv) { prefs_init(&prefs); Prefs_load_error prefserr = prefs_load_from_conf_file(&prefs); if (prefserr == Prefs_load_ok) { + prefs_touched |= prefs.touched; if (prefs.touched & Preftouch_softmargins) { - prefs_touched |= Preftouch_softmargins; softmargin_y = prefs.softmargin_y; softmargin_x = prefs.softmargin_x; } + if (prefs.touched & Preftouch_griddotstype) { + fancy_grid_dots = prefs.fancy_grid_dots; + } + if (prefs.touched & Preftouch_gridrulerstype) { + fancy_grid_rulers = prefs.fancy_grid_rulers; + } #ifdef FEAT_PORTMIDI if (midi_mode.any.type == Midi_mode_type_null && osolen(prefs.portmidi_output_device)) { @@ -2779,7 +2875,6 @@ int main(int argc, char **argv) { bracketed_paste_x = 0, bracketed_paste_max_y = 0, bracketed_paste_max_x = 0; bool is_in_bracketed_paste = false; - bool fancy_grid_dots = true, fancy_grid_rulers = true; // Send initial BPM send_num_message(ged_state.oosc_dev, "/orca/bpm", (I32)ged_state.bpm); @@ -3136,9 +3231,39 @@ int main(int argc, char **argv) { case Cosmetics_soft_margins_id: { push_soft_margins_form(softmargin_y, softmargin_x); break; + case Cosmetics_grid_dots_id: + push_plainorfancy_menu(Set_fancy_grid_dots_menu_id, "Grid Dots", + fancy_grid_dots); + break; + case Cosmetics_grid_rulers_id: + push_plainorfancy_menu(Set_fancy_grid_rulers_menu_id, + "Grid Rulers", fancy_grid_rulers); + break; } } } break; + case Set_fancy_grid_dots_menu_id: { + if (plainorfancy_menu_was_picked(act.picked.id, &fancy_grid_dots, + &prefs_touched, + Preftouch_griddotstype)) { + ged_state.is_draw_dirty = true; + // TODO highly redundant, factor out + save_prefs_with_error_message( + prefs_touched, &midi_mode, softmargin_y, softmargin_x, + fancy_grid_dots, fancy_grid_rulers); + } + } break; + case Set_fancy_grid_rulers_menu_id: { + if (plainorfancy_menu_was_picked( + act.picked.id, &fancy_grid_rulers, &prefs_touched, + Preftouch_gridrulerstype)) { + ged_state.is_draw_dirty = true; + // TODO highly redundant, factor out + save_prefs_with_error_message( + prefs_touched, &midi_mode, softmargin_y, softmargin_x, + fancy_grid_dots, fancy_grid_rulers); + } + } break; #ifdef FEAT_PORTMIDI case Portmidi_output_device_menu_id: { ged_stop_all_sustained_notes(&ged_state); @@ -3150,8 +3275,9 @@ int main(int argc, char **argv) { "Error setting PortMidi output device:\n%s", Pm_GetErrorText(pme)); } else { - save_prefs_with_error_message(prefs_touched, &midi_mode, - softmargin_y, softmargin_x); + save_prefs_with_error_message( + prefs_touched, &midi_mode, softmargin_y, softmargin_x, + fancy_grid_dots, fancy_grid_rulers); } } break; #endif @@ -3269,8 +3395,9 @@ int main(int argc, char **argv) { qnav_stack_pop(); // Might push message, so gotta pop old guy first if (do_save) - save_prefs_with_error_message(prefs_touched, &midi_mode, - softmargin_y, softmargin_x); + save_prefs_with_error_message( + prefs_touched, &midi_mode, softmargin_y, softmargin_x, + fancy_grid_dots, fancy_grid_rulers); } osofree(tmpstr); } break;