From 7ee165723ab3ce8294d6ce91f7f59dd4858c8ecb Mon Sep 17 00:00:00 2001 From: cancel Date: Tue, 11 Dec 2018 19:55:52 +0900 Subject: [PATCH] Add quote to toggle selection resize mode --- tui_main.c | 87 +++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 63 insertions(+), 24 deletions(-) diff --git a/tui_main.c b/tui_main.c index 37759ed..33ef946 100644 --- a/tui_main.c +++ b/tui_main.c @@ -46,6 +46,7 @@ typedef enum { Tui_input_mode_normal = 0, Tui_input_mode_append = 1, Tui_input_mode_piano = 2, + Tui_input_mode_selresize = 3, } Tui_input_mode; typedef enum { @@ -437,6 +438,10 @@ void tdraw_hud(WINDOW* win, int win_y, int win_x, int height, int width, wattrset(win, A_reverse); wprintw(win, "trigger"); break; + case Tui_input_mode_selresize: + wattrset(win, A_bold); + wprintw(win, "select"); + break; } wattrset(win, A_normal); wprintw(win, "\t%s", filename); @@ -1022,6 +1027,29 @@ void app_move_cursor_relative(App_state* a, Isz delta_y, Isz delta_x) { a->is_draw_dirty = true; } +Usz guarded_selection_axis_resize(Usz x, int delta) { + if (delta < 0) { + if (delta > INT_MIN && (Usz)(-delta) < x) { + x -= (Usz)(-delta); + } + } else if (x < SIZE_MAX - (Usz)delta) { + x += (Usz)delta; + } + return x; +} + +void app_modify_selection_size(App_state* a, int delta_y, int delta_x) { + Usz cur_h = a->tui_cursor.h; + Usz cur_w = a->tui_cursor.w; + Usz new_h = guarded_selection_axis_resize(cur_h, delta_y); + Usz new_w = guarded_selection_axis_resize(cur_w, delta_x); + if (cur_h != new_h || cur_w != new_w) { + a->tui_cursor.h = new_h; + a->tui_cursor.w = new_w; + a->is_draw_dirty = true; + } +} + typedef enum { App_dir_up, App_dir_down, @@ -1030,7 +1058,11 @@ typedef enum { } App_dir; void app_dir_input(App_state* a, App_dir dir) { - switch (dir) { + switch (a->input_mode) { + case Tui_input_mode_normal: + case Tui_input_mode_append: + case Tui_input_mode_piano: + switch (dir) { case App_dir_up: app_move_cursor_relative(a, -1, 0); break; @@ -1043,6 +1075,23 @@ void app_dir_input(App_state* a, App_dir dir) { case App_dir_right: app_move_cursor_relative(a, 0, 1); break; + } + break; + case Tui_input_mode_selresize: + switch (dir) { + case App_dir_up: + app_modify_selection_size(a, -1, 0); + break; + case App_dir_down: + app_modify_selection_size(a, 1, 0); + break; + case App_dir_left: + app_modify_selection_size(a, 0, -1); + break; + case App_dir_right: + app_modify_selection_size(a, 0, 1); + break; + } } } @@ -1174,6 +1223,7 @@ void app_input_character(App_state* a, char c) { switch (a->input_mode) { case Tui_input_mode_normal: case Tui_input_mode_append: + case Tui_input_mode_selresize: app_write_character(a, c); break; case Tui_input_mode_piano: @@ -1182,33 +1232,11 @@ void app_input_character(App_state* a, char c) { } } -Usz guarded_selection_axis_resize(Usz x, int delta) { - if (delta < 0) { - if (delta > INT_MIN && (Usz)(-delta) < x) { - x -= (Usz)(-delta); - } - } else if (x < SIZE_MAX - (Usz)delta) { - x += (Usz)delta; - } - return x; -} - -void app_modify_selection_size(App_state* a, int delta_y, int delta_x) { - Usz cur_h = a->tui_cursor.h; - Usz cur_w = a->tui_cursor.w; - Usz new_h = guarded_selection_axis_resize(cur_h, delta_y); - Usz new_w = guarded_selection_axis_resize(cur_w, delta_x); - if (cur_h != new_h || cur_w != new_w) { - a->tui_cursor.h = new_h; - a->tui_cursor.w = new_w; - a->is_draw_dirty = true; - } -} - typedef enum { App_input_cmd_undo, App_input_cmd_toggle_append_mode, App_input_cmd_toggle_piano_mode, + App_input_cmd_toggle_selresize_mode, App_input_cmd_step_forward, App_input_cmd_toggle_show_event_list, App_input_cmd_toggle_play_pause, @@ -1242,6 +1270,14 @@ void app_input_cmd(App_state* a, App_input_cmd ev) { } a->is_draw_dirty = true; break; + case App_input_cmd_toggle_selresize_mode: + if (a->input_mode == Tui_input_mode_selresize) { + a->input_mode = Tui_input_mode_normal; + } else { + a->input_mode = Tui_input_mode_selresize; + } + a->is_draw_dirty = true; + break; case App_input_cmd_step_forward: undo_history_push(&a->undo_hist, &a->field, a->tick_num); orca_run(a->field.buffer, a->markmap_r.buffer, a->field.height, @@ -1662,6 +1698,9 @@ int main(int argc, char** argv) { case AND_CTRL('v'): app_input_cmd(&app_state, App_input_cmd_paste); break; + case '\'': + app_input_cmd(&app_state, App_input_cmd_toggle_selresize_mode); + break; case ' ': app_input_cmd(&app_state, App_input_cmd_toggle_play_pause); // flush lap time -- quick hack to prevent time before hitting spacebar