From 352cb27b739d71ca2e75610160a65573fb5b7a5d Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Mon, 2 Sep 2019 14:32:52 -0700 Subject: [PATCH] Face* instead of Face_ID as much as possible; Preferred X works again --- 4coder_base_commands.cpp | 72 ++++++------- 4coder_clipboard.cpp | 4 +- 4coder_combined_write_commands.cpp | 6 +- 4coder_default_framework.cpp | 2 +- 4coder_experiments.cpp | 4 +- 4coder_generated/app_functions.h | 20 +++- 4coder_generated/command_metadata.h | 162 ++++++++++++++-------------- 4coder_helper.cpp | 19 ++-- 4coder_jump_sticky.cpp | 4 +- 4coder_jumping.cpp | 2 +- 4coder_miblo_numbers.cpp | 6 +- 4coder_scope_commands.cpp | 8 +- 4coder_search.cpp | 2 +- 4coder_seek.cpp | 8 +- 4ed.cpp | 7 +- 4ed_api_implementation.cpp | 96 ++++++++++++----- 4ed_app_models.h | 2 +- 4ed_edit.cpp | 3 +- 4ed_file.cpp | 117 ++++++++++---------- 4ed_file.h | 2 +- 4ed_font_set.cpp | 11 +- 4ed_render_target.cpp | 8 -- 4ed_text_layout.cpp | 7 +- 4ed_view.cpp | 86 +++++++-------- 4ed_view.h | 80 +------------- 25 files changed, 342 insertions(+), 396 deletions(-) diff --git a/4coder_base_commands.cpp b/4coder_base_commands.cpp index 0eb942b2..7ce3f990 100644 --- a/4coder_base_commands.cpp +++ b/4coder_base_commands.cpp @@ -49,7 +49,7 @@ write_character_parameter(Application_Links *app, u8 *character, u32 length){ // NOTE(allen): finish updating the cursor if (edit_success){ - view_set_cursor(app, view, seek_pos(pos + length), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(pos + length)); } } } @@ -100,7 +100,7 @@ CUSTOM_DOC("Deletes the character to the left of the cursor.") i64 character = view_relative_character_from_pos(app, view, cursor.line, cursor.pos); i64 start = view_pos_from_relative_character(app, view, cursor.line, character - 1); if (buffer_replace_range(app, buffer, Ii64(start, end), string_u8_empty)){ - view_set_cursor(app, view, seek_pos(start), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(start)); } } } @@ -112,7 +112,7 @@ CUSTOM_DOC("Sets the mark to the current position of the cursor.") View_ID view = get_active_view(app, AccessProtected); i64 pos = view_get_cursor_pos(app, view); view_set_mark(app, view, seek_pos(pos)); - view_set_cursor(app, view, seek_pos(pos), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(pos)); } CUSTOM_COMMAND_SIG(cursor_mark_swap) @@ -121,7 +121,7 @@ CUSTOM_DOC("Swaps the position of the cursor and the mark.") View_ID view = get_active_view(app, AccessProtected); i64 cursor = view_get_cursor_pos(app, view); i64 mark = view_get_mark_pos(app, view); - view_set_cursor(app, view, seek_pos(mark), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(mark)); view_set_mark(app, view, seek_pos(cursor)); } @@ -227,7 +227,7 @@ CUSTOM_DOC("Sets the cursor position and mark to the mouse position.") if (!view_is_in_ui_mode(app, view)){ Mouse_State mouse = get_mouse_state(app); i64 pos = view_pos_from_xy(app, view, V2(mouse.p)); - view_set_cursor(app, view, seek_pos(pos), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(pos)); view_set_mark(app, view, seek_pos(pos)); } } @@ -239,7 +239,7 @@ CUSTOM_DOC("Sets the cursor position to the mouse position.") if (!view_is_in_ui_mode(app, view)){ Mouse_State mouse = get_mouse_state(app); i64 pos = view_pos_from_xy(app, view, V2(mouse.p)); - view_set_cursor(app, view, seek_pos(pos), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(pos)); no_mark_snap_to_cursor(app, view); } } @@ -252,7 +252,7 @@ CUSTOM_DOC("If the mouse left button is pressed, sets the cursor position to the Mouse_State mouse = get_mouse_state(app); if (mouse.l){ i64 pos = view_pos_from_xy(app, view, V2(mouse.p)); - view_set_cursor(app, view, seek_pos(pos), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(pos)); } no_mark_snap_to_cursor(app, view); } @@ -296,9 +296,10 @@ move_vertical_pixels(Application_Links *app, View_ID view, f32 pixels){ i64 pos = view_get_cursor_pos(app, view); Buffer_Cursor cursor = view_compute_cursor(app, view, seek_pos(pos)); Vec2_f32 p = view_relative_xy_of_pos(app, view, cursor.line, pos); + p.x = view_get_preferred_x(app, view); p.y += pixels; i64 new_pos = view_pos_at_relative_xy(app, view, cursor.line, p); - view_set_cursor(app, view, seek_pos(new_pos), false); + view_set_cursor(app, view, seek_pos(new_pos)); no_mark_snap_to_cursor_if_shift(app, view); } @@ -324,8 +325,6 @@ move_vertical_lines(Application_Links *app, f32 lines){ move_vertical_lines(app, view, lines); } -#define move_vertical move_vertical_lines - internal f32 get_page_jump(Application_Links *app, View_ID view){ Rect_f32 region = view_get_buffer_region(app, view); @@ -335,25 +334,25 @@ get_page_jump(Application_Links *app, View_ID view){ CUSTOM_COMMAND_SIG(move_up) CUSTOM_DOC("Moves the cursor up one line.") { - move_vertical(app, -1.f); + move_vertical_lines(app, -1.f); } CUSTOM_COMMAND_SIG(move_down) CUSTOM_DOC("Moves the cursor down one line.") { - move_vertical(app, 1.f); + move_vertical_lines(app, 1.f); } CUSTOM_COMMAND_SIG(move_up_10) CUSTOM_DOC("Moves the cursor up ten lines.") { - move_vertical(app, -10.f); + move_vertical_lines(app, -10.f); } CUSTOM_COMMAND_SIG(move_down_10) CUSTOM_DOC("Moves the cursor down ten lines.") { - move_vertical(app, 10.f); + move_vertical_lines(app, 10.f); } CUSTOM_COMMAND_SIG(move_down_textual) @@ -363,7 +362,7 @@ CUSTOM_DOC("Moves down to the next line of actual text, regardless of line wrapp i64 pos = view_get_cursor_pos(app, view); Buffer_Cursor cursor = view_compute_cursor(app, view, seek_pos(pos)); i64 next_line = cursor.line + 1; - view_set_cursor(app, view, seek_line_col(next_line, 1), true); + view_set_cursor_and_preferred_x(app, view, seek_line_col(next_line, 1)); } CUSTOM_COMMAND_SIG(page_up) @@ -399,7 +398,7 @@ seek_blank_line(Application_Links *app, Scan_Direction direction, Position_Withi new_pos = get_line_side_pos_from_pos(app, buffer, new_pos, Side_Max); }break; } - view_set_cursor(app, view, seek_pos(new_pos), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(new_pos)); no_mark_snap_to_cursor_if_shift(app, view); } @@ -439,11 +438,6 @@ CUSTOM_DOC("Seeks the cursor down to the next blank line and places it at the en seek_blank_line(app, Scan_Forward, PositionWithinLine_End); } -#define seek_whitespace_up move_up_to_blank_line -#define seek_whitespace_down move_down_to_blank_line -#define seek_whitespace_up_end_line move_up_to_blank_line_skip_whitespace -#define seek_whitespace_down_end_line move_down_to_blank_line_skip_whitespace - CUSTOM_COMMAND_SIG(move_left) CUSTOM_DOC("Moves the cursor one character to the left.") { @@ -452,7 +446,7 @@ CUSTOM_DOC("Moves the cursor one character to the left.") Buffer_Cursor cursor = view_compute_cursor(app, view, seek_pos(pos)); i64 character = view_relative_character_from_pos(app, view, cursor.line, pos); i64 new_pos = view_pos_from_relative_character(app, view, cursor.line, character - 1); - view_set_cursor(app, view, seek_pos(new_pos), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(new_pos)); no_mark_snap_to_cursor_if_shift(app, view); } @@ -464,7 +458,7 @@ CUSTOM_DOC("Moves the cursor one character to the right.") Buffer_Cursor cursor = view_compute_cursor(app, view, seek_pos(pos)); i64 character = view_relative_character_from_pos(app, view, cursor.line, pos); i64 new_pos = view_pos_from_relative_character(app, view, cursor.line, character + 1); - view_set_cursor(app, view, seek_pos(new_pos), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(new_pos)); no_mark_snap_to_cursor_if_shift(app, view); } @@ -474,7 +468,7 @@ current_view_scan_move(Application_Links *app, Scan_Direction direction, Boundar Buffer_ID buffer = view_get_buffer(app, view, AccessProtected); i64 cursor_pos = view_get_cursor_pos(app, view); i64 pos = scan(app, funcs, buffer, direction, cursor_pos); - view_set_cursor(app, view, seek_pos(pos), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(pos)); no_mark_snap_to_cursor_if_shift(app, view); } @@ -577,7 +571,7 @@ CUSTOM_DOC("Puts the cursor at the top of the file, and the mark at the bottom o View_ID view = get_active_view(app, AccessProtected); Buffer_ID buffer = view_get_buffer(app, view, AccessProtected); i32 buffer_size = (i32)buffer_get_size(app, buffer); - view_set_cursor(app, view, seek_pos(0), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(0)); view_set_mark(app, view, seek_pos(buffer_size)); no_mark_snap_to_cursor(app, view); } @@ -594,7 +588,7 @@ CUSTOM_DOC("Converts all ascii text in the range between the cursor and the mark String_Const_u8 string = push_buffer_range(app, scratch, buffer, range); string = string_mod_upper(string); buffer_replace_range(app, buffer, range, string); - view_set_cursor(app, view, seek_pos(range.max), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(range.max)); } CUSTOM_COMMAND_SIG(to_lowercase) @@ -607,7 +601,7 @@ CUSTOM_DOC("Converts all ascii text in the range between the cursor and the mark String_Const_u8 string = push_buffer_range(app, scratch, buffer, range); string = string_mod_lower(string); buffer_replace_range(app, buffer, range, string); - view_set_cursor(app, view, seek_pos(range.max), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(range.max)); } CUSTOM_COMMAND_SIG(clean_all_lines) @@ -833,7 +827,7 @@ CUSTOM_DOC("Queries the user for a number, and jumps the cursor to the correspon if (query_user_number(app, &bar)){ i32 line_number = (i32)string_to_integer(bar.string, 10); View_ID view = get_active_view(app, AccessProtected); - view_set_cursor(app, view, seek_line_col(line_number, 0), true); + view_set_cursor_and_preferred_x(app, view, seek_line_col(line_number, 0)); } } @@ -843,7 +837,7 @@ CUSTOM_COMMAND_SIG(reverse_search); static void isearch__update_highlight(Application_Links *app, View_ID view, Range_i64 range){ view_set_highlight_range(app, view, range); - view_set_cursor(app, view, seek_pos(range.start), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(range.start)); } static void @@ -1029,7 +1023,7 @@ isearch(Application_Links *app, b32 start_reversed, String_Const_u8 query_init, size = clamp_top(size, sizeof(previous_isearch_query) - 1); block_copy(previous_isearch_query, bar.string.str, size); previous_isearch_query[size] = 0; - view_set_cursor(app, view, seek_pos(first_pos), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(first_pos)); } } @@ -1178,7 +1172,7 @@ query_replace_base(Application_Links *app, View_ID view, Buffer_ID buffer_id, i6 return; } - view_set_cursor(app, view, seek_pos(pos), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(pos)); } static void @@ -1452,7 +1446,7 @@ current_view_move_line(Application_Links *app, Scan_Direction direction){ i64 pos = view_get_cursor_pos(app, view); i64 line_number = get_line_number_from_pos(app, buffer, pos); pos = move_line(app, buffer, line_number, direction); - view_set_cursor(app, view, seek_pos(pos), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(pos)); } CUSTOM_COMMAND_SIG(move_line_up) @@ -1600,7 +1594,7 @@ CUSTOM_DOC("Set the other non-active panel to view the buffer that the active pa change_active_panel(app); view = get_active_view(app, AccessAll); view_set_buffer(app, view, buffer, 0); - view_set_cursor(app, view, seek_pos(pos), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(pos)); } CUSTOM_COMMAND_SIG(swap_buffers_between_panels) @@ -1627,11 +1621,11 @@ CUSTOM_DOC("Set the other non-active panel to view the buffer that the active pa i64 m2 = view_get_mark_pos(app, view2); Buffer_Scroll sc2 = view_get_buffer_scroll(app, view2); - view_set_cursor(app, view1, seek_pos(p2), true); - view_set_mark (app, view1, seek_pos(m2)); + view_set_cursor_and_preferred_x(app, view1, seek_pos(p2)); + view_set_mark(app, view1, seek_pos(m2)); view_set_buffer_scroll(app, view1, sc2); - view_set_cursor(app, view2, seek_pos(p1), true); - view_set_mark (app, view2, seek_pos(m1)); + view_set_cursor_and_preferred_x(app, view2, seek_pos(p1)); + view_set_mark(app, view2, seek_pos(m1)); view_set_buffer_scroll(app, view2, sc1); } } @@ -1726,7 +1720,7 @@ CUSTOM_DOC("Advances backwards through the undo history of the current buffer.") if (current > 0){ i32 new_position = record_get_new_cursor_position_undo(app, buffer, current); buffer_history_set_current_state_index(app, buffer, current - 1); - view_set_cursor(app, view, seek_pos(new_position), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(new_position)); } } @@ -1740,7 +1734,7 @@ CUSTOM_DOC("Advances forwards through the undo history of the current buffer.") if (current < max_index){ i32 new_position = record_get_new_cursor_position_redo(app, buffer, current + 1); buffer_history_set_current_state_index(app, buffer, current + 1); - view_set_cursor(app, view, seek_pos(new_position), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(new_position)); } } diff --git a/4coder_clipboard.cpp b/4coder_clipboard.cpp index b095310e..a5fc2d8d 100644 --- a/4coder_clipboard.cpp +++ b/4coder_clipboard.cpp @@ -58,7 +58,7 @@ CUSTOM_DOC("At the cursor, insert the text at the top of the clipboard.") i64 pos = view_get_cursor_pos(app, view); buffer_replace_range(app, buffer, Ii64(pos), string); view_set_mark(app, view, seek_pos(pos)); - view_set_cursor(app, view, seek_pos(pos + (i32)string.size), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(pos + (i32)string.size)); // TODO(allen): Send this to all views. Theme_Color paste = {}; @@ -97,7 +97,7 @@ CUSTOM_DOC("If the previous command was paste or paste_next, replaces the paste i64 pos = range.min; buffer_replace_range(app, buffer, range, string); - view_set_cursor(app, view, seek_pos(pos + string.size), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(pos + string.size)); // TODO(allen): Send this to all views. Theme_Color paste = {}; diff --git a/4coder_combined_write_commands.cpp b/4coder_combined_write_commands.cpp index cd2dc8e8..4fce0ee3 100644 --- a/4coder_combined_write_commands.cpp +++ b/4coder_combined_write_commands.cpp @@ -8,7 +8,7 @@ static void write_string(Application_Links *app, View_ID view, Buffer_ID buffer, String_Const_u8 string){ i64 pos = view_get_cursor_pos(app, view); buffer_replace_range(app, buffer, Ii64(pos), string); - view_set_cursor(app, view, seek_pos(pos + string.size), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(pos + string.size)); } static void @@ -38,7 +38,7 @@ long_braces(Application_Links *app, char *text, i32 size){ Buffer_ID buffer = view_get_buffer(app, view, AccessOpen); i64 pos = view_get_cursor_pos(app, view); buffer_replace_range(app, buffer, Ii64(pos), SCu8(text, size)); - view_set_cursor(app, view, seek_pos(pos + 2), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(pos + 2)); buffer_auto_indent(app, buffer, pos, pos + size, DEF_TAB_WIDTH, DEFAULT_INDENT_FLAGS | AutoIndent_FullTokens); move_past_lead_whitespace(app, view, buffer); } @@ -205,7 +205,7 @@ activate_snippet(Application_Links *app, Heap *heap, View_ID view, struct Lister Buffer_ID buffer = view_get_buffer(app, view, AccessOpen); i64 pos = view_get_cursor_pos(app, view); buffer_replace_range(app, buffer, Ii64(pos), SCu8(snippet.text)); - view_set_cursor(app, view, seek_pos(pos + snippet.cursor_offset), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(pos + snippet.cursor_offset)); view_set_mark(app, view, seek_pos(pos + snippet.mark_offset)); } else{ diff --git a/4coder_default_framework.cpp b/4coder_default_framework.cpp index ed004af9..e3a64fcd 100644 --- a/4coder_default_framework.cpp +++ b/4coder_default_framework.cpp @@ -188,7 +188,7 @@ view_buffer_set(Application_Links *app, Buffer_ID *buffers, i32 *positions, i32 View_Node *node = primary_view_first; for (i32 i = 0; i < buffer_set_count; i += 1, node = node->next){ if (view_set_buffer(app, node->view_id, buffers[i], 0)){ - view_set_cursor(app, node->view_id, seek_pos(positions[i]), true); + view_set_cursor_and_preferred_x(app, node->view_id, seek_pos(positions[i])); } } diff --git a/4coder_experiments.cpp b/4coder_experiments.cpp index a7ec3e93..4a43ebcc 100644 --- a/4coder_experiments.cpp +++ b/4coder_experiments.cpp @@ -39,7 +39,7 @@ CUSTOM_COMMAND_SIG(multi_paste){ Range_i64 range = get_view_range(app, view); buffer_replace_range(app, buffer, Ii64(range.max), insert_string); view_set_mark(app, view, seek_pos(range.max + 1)); - view_set_cursor(app, view, seek_pos(range.max + insert_string.size), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(range.max + insert_string.size)); // TODO(allen): Send this to all views. Theme_Color paste = {}; @@ -98,7 +98,7 @@ multi_paste_range(Application_Links *app, View_ID view, Range_i64 range, i32 pas finish_range.min = pos; finish_range.max = pos + total_size; view_set_mark(app, view, seek_pos(finish_range.min)); - view_set_cursor(app, view, seek_pos(finish_range.max), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(finish_range.max)); // TODO(allen): Send this to all views. Theme_Color paste; diff --git a/4coder_generated/app_functions.h b/4coder_generated/app_functions.h index 4c3aafe9..32548702 100644 --- a/4coder_generated/app_functions.h +++ b/4coder_generated/app_functions.h @@ -65,6 +65,7 @@ struct Application_Links; #define VIEW_GET_CURSOR_POS_SIG(n) i64 n(Application_Links *app, View_ID view_id) #define VIEW_GET_MARK_POS_SIG(n) i64 n(Application_Links *app, View_ID view_id) #define VIEW_GET_PREFERRED_X_SIG(n) f32 n(Application_Links *app, View_ID view_id) +#define VIEW_SET_PREFERRED_X_SIG(n) b32 n(Application_Links *app, View_ID view_id, f32 x) #define VIEW_GET_SCREEN_RECT_SIG(n) Rect_f32 n(Application_Links *app, View_ID view_id) #define VIEW_GET_PANEL_SIG(n) Panel_ID n(Application_Links *app, View_ID view_id) #define PANEL_GET_VIEW_SIG(n) View_ID n(Application_Links *app, Panel_ID panel_id) @@ -86,7 +87,8 @@ struct Application_Links; #define VIEW_SET_SETTING_SIG(n) b32 n(Application_Links *app, View_ID view_id, View_Setting_ID setting, i32 value) #define VIEW_GET_MANAGED_SCOPE_SIG(n) Managed_Scope n(Application_Links *app, View_ID view_id) #define BUFFER_COMPUTE_CURSOR_SIG(n) Buffer_Cursor n(Application_Links *app, Buffer_ID buffer, Buffer_Seek seek) -#define VIEW_SET_CURSOR_SIG(n) b32 n(Application_Links *app, View_ID view_id, Buffer_Seek seek, b32 set_preferred_x) +#define VIEW_COMPUTE_CURSOR_SIG(n) Buffer_Cursor n(Application_Links *app, View_ID view_id, Buffer_Seek seek) +#define VIEW_SET_CURSOR_SIG(n) b32 n(Application_Links *app, View_ID view_id, Buffer_Seek seek) #define VIEW_SET_BUFFER_SCROLL_SIG(n) b32 n(Application_Links *app, View_ID view_id, Buffer_Scroll scroll) #define VIEW_SET_BASIC_SCROLL_SIG(n) b32 n(Application_Links *app, View_ID view_id, Basic_Scroll scroll) #define VIEW_SET_MARK_SIG(n) b32 n(Application_Links *app, View_ID view_id, Buffer_Seek seek) @@ -249,6 +251,7 @@ typedef VIEW_GET_BUFFER_SIG(View_Get_Buffer_Function); typedef VIEW_GET_CURSOR_POS_SIG(View_Get_Cursor_Pos_Function); typedef VIEW_GET_MARK_POS_SIG(View_Get_Mark_Pos_Function); typedef VIEW_GET_PREFERRED_X_SIG(View_Get_Preferred_X_Function); +typedef VIEW_SET_PREFERRED_X_SIG(View_Set_Preferred_X_Function); typedef VIEW_GET_SCREEN_RECT_SIG(View_Get_Screen_Rect_Function); typedef VIEW_GET_PANEL_SIG(View_Get_Panel_Function); typedef PANEL_GET_VIEW_SIG(Panel_Get_View_Function); @@ -270,6 +273,7 @@ typedef VIEW_GET_SETTING_SIG(View_Get_Setting_Function); typedef VIEW_SET_SETTING_SIG(View_Set_Setting_Function); typedef VIEW_GET_MANAGED_SCOPE_SIG(View_Get_Managed_Scope_Function); typedef BUFFER_COMPUTE_CURSOR_SIG(Buffer_Compute_Cursor_Function); +typedef VIEW_COMPUTE_CURSOR_SIG(View_Compute_Cursor_Function); typedef VIEW_SET_CURSOR_SIG(View_Set_Cursor_Function); typedef VIEW_SET_BUFFER_SCROLL_SIG(View_Set_Buffer_Scroll_Function); typedef VIEW_SET_BASIC_SCROLL_SIG(View_Set_Basic_Scroll_Function); @@ -435,6 +439,7 @@ View_Get_Buffer_Function *view_get_buffer; View_Get_Cursor_Pos_Function *view_get_cursor_pos; View_Get_Mark_Pos_Function *view_get_mark_pos; View_Get_Preferred_X_Function *view_get_preferred_x; +View_Set_Preferred_X_Function *view_set_preferred_x; View_Get_Screen_Rect_Function *view_get_screen_rect; View_Get_Panel_Function *view_get_panel; Panel_Get_View_Function *panel_get_view; @@ -456,6 +461,7 @@ View_Get_Setting_Function *view_get_setting; View_Set_Setting_Function *view_set_setting; View_Get_Managed_Scope_Function *view_get_managed_scope; Buffer_Compute_Cursor_Function *buffer_compute_cursor; +View_Compute_Cursor_Function *view_compute_cursor; View_Set_Cursor_Function *view_set_cursor; View_Set_Buffer_Scroll_Function *view_set_buffer_scroll; View_Set_Basic_Scroll_Function *view_set_basic_scroll; @@ -620,6 +626,7 @@ View_Get_Buffer_Function *view_get_buffer_; View_Get_Cursor_Pos_Function *view_get_cursor_pos_; View_Get_Mark_Pos_Function *view_get_mark_pos_; View_Get_Preferred_X_Function *view_get_preferred_x_; +View_Set_Preferred_X_Function *view_set_preferred_x_; View_Get_Screen_Rect_Function *view_get_screen_rect_; View_Get_Panel_Function *view_get_panel_; Panel_Get_View_Function *panel_get_view_; @@ -641,6 +648,7 @@ View_Get_Setting_Function *view_get_setting_; View_Set_Setting_Function *view_set_setting_; View_Get_Managed_Scope_Function *view_get_managed_scope_; Buffer_Compute_Cursor_Function *buffer_compute_cursor_; +View_Compute_Cursor_Function *view_compute_cursor_; View_Set_Cursor_Function *view_set_cursor_; View_Set_Buffer_Scroll_Function *view_set_buffer_scroll_; View_Set_Basic_Scroll_Function *view_set_basic_scroll_; @@ -813,6 +821,7 @@ app_links->view_get_buffer_ = View_Get_Buffer;\ app_links->view_get_cursor_pos_ = View_Get_Cursor_Pos;\ app_links->view_get_mark_pos_ = View_Get_Mark_Pos;\ app_links->view_get_preferred_x_ = View_Get_Preferred_X;\ +app_links->view_set_preferred_x_ = View_Set_Preferred_X;\ app_links->view_get_screen_rect_ = View_Get_Screen_Rect;\ app_links->view_get_panel_ = View_Get_Panel;\ app_links->panel_get_view_ = Panel_Get_View;\ @@ -834,6 +843,7 @@ app_links->view_get_setting_ = View_Get_Setting;\ app_links->view_set_setting_ = View_Set_Setting;\ app_links->view_get_managed_scope_ = View_Get_Managed_Scope;\ app_links->buffer_compute_cursor_ = Buffer_Compute_Cursor;\ +app_links->view_compute_cursor_ = View_Compute_Cursor;\ app_links->view_set_cursor_ = View_Set_Cursor;\ app_links->view_set_buffer_scroll_ = View_Set_Buffer_Scroll;\ app_links->view_set_basic_scroll_ = View_Set_Basic_Scroll;\ @@ -998,6 +1008,7 @@ static Buffer_ID view_get_buffer(Application_Links *app, View_ID view_id, Access static i64 view_get_cursor_pos(Application_Links *app, View_ID view_id){return(app->view_get_cursor_pos(app, view_id));} static i64 view_get_mark_pos(Application_Links *app, View_ID view_id){return(app->view_get_mark_pos(app, view_id));} static f32 view_get_preferred_x(Application_Links *app, View_ID view_id){return(app->view_get_preferred_x(app, view_id));} +static b32 view_set_preferred_x(Application_Links *app, View_ID view_id, f32 x){return(app->view_set_preferred_x(app, view_id, x));} static Rect_f32 view_get_screen_rect(Application_Links *app, View_ID view_id){return(app->view_get_screen_rect(app, view_id));} static Panel_ID view_get_panel(Application_Links *app, View_ID view_id){return(app->view_get_panel(app, view_id));} static View_ID panel_get_view(Application_Links *app, Panel_ID panel_id){return(app->panel_get_view(app, panel_id));} @@ -1019,7 +1030,8 @@ static b32 view_get_setting(Application_Links *app, View_ID view_id, View_Settin static b32 view_set_setting(Application_Links *app, View_ID view_id, View_Setting_ID setting, i32 value){return(app->view_set_setting(app, view_id, setting, value));} static Managed_Scope view_get_managed_scope(Application_Links *app, View_ID view_id){return(app->view_get_managed_scope(app, view_id));} static Buffer_Cursor buffer_compute_cursor(Application_Links *app, Buffer_ID buffer, Buffer_Seek seek){return(app->buffer_compute_cursor(app, buffer, seek));} -static b32 view_set_cursor(Application_Links *app, View_ID view_id, Buffer_Seek seek, b32 set_preferred_x){return(app->view_set_cursor(app, view_id, seek, set_preferred_x));} +static Buffer_Cursor view_compute_cursor(Application_Links *app, View_ID view_id, Buffer_Seek seek){return(app->view_compute_cursor(app, view_id, seek));} +static b32 view_set_cursor(Application_Links *app, View_ID view_id, Buffer_Seek seek){return(app->view_set_cursor(app, view_id, seek));} static b32 view_set_buffer_scroll(Application_Links *app, View_ID view_id, Buffer_Scroll scroll){return(app->view_set_buffer_scroll(app, view_id, scroll));} static b32 view_set_basic_scroll(Application_Links *app, View_ID view_id, Basic_Scroll scroll){return(app->view_set_basic_scroll(app, view_id, scroll));} static b32 view_set_mark(Application_Links *app, View_ID view_id, Buffer_Seek seek){return(app->view_set_mark(app, view_id, seek));} @@ -1183,6 +1195,7 @@ static Buffer_ID view_get_buffer(Application_Links *app, View_ID view_id, Access static i64 view_get_cursor_pos(Application_Links *app, View_ID view_id){return(app->view_get_cursor_pos_(app, view_id));} static i64 view_get_mark_pos(Application_Links *app, View_ID view_id){return(app->view_get_mark_pos_(app, view_id));} static f32 view_get_preferred_x(Application_Links *app, View_ID view_id){return(app->view_get_preferred_x_(app, view_id));} +static b32 view_set_preferred_x(Application_Links *app, View_ID view_id, f32 x){return(app->view_set_preferred_x_(app, view_id, x));} static Rect_f32 view_get_screen_rect(Application_Links *app, View_ID view_id){return(app->view_get_screen_rect_(app, view_id));} static Panel_ID view_get_panel(Application_Links *app, View_ID view_id){return(app->view_get_panel_(app, view_id));} static View_ID panel_get_view(Application_Links *app, Panel_ID panel_id){return(app->panel_get_view_(app, panel_id));} @@ -1204,7 +1217,8 @@ static b32 view_get_setting(Application_Links *app, View_ID view_id, View_Settin static b32 view_set_setting(Application_Links *app, View_ID view_id, View_Setting_ID setting, i32 value){return(app->view_set_setting_(app, view_id, setting, value));} static Managed_Scope view_get_managed_scope(Application_Links *app, View_ID view_id){return(app->view_get_managed_scope_(app, view_id));} static Buffer_Cursor buffer_compute_cursor(Application_Links *app, Buffer_ID buffer, Buffer_Seek seek){return(app->buffer_compute_cursor_(app, buffer, seek));} -static b32 view_set_cursor(Application_Links *app, View_ID view_id, Buffer_Seek seek, b32 set_preferred_x){return(app->view_set_cursor_(app, view_id, seek, set_preferred_x));} +static Buffer_Cursor view_compute_cursor(Application_Links *app, View_ID view_id, Buffer_Seek seek){return(app->view_compute_cursor_(app, view_id, seek));} +static b32 view_set_cursor(Application_Links *app, View_ID view_id, Buffer_Seek seek){return(app->view_set_cursor_(app, view_id, seek));} static b32 view_set_buffer_scroll(Application_Links *app, View_ID view_id, Buffer_Scroll scroll){return(app->view_set_buffer_scroll_(app, view_id, scroll));} static b32 view_set_basic_scroll(Application_Links *app, View_ID view_id, Basic_Scroll scroll){return(app->view_set_basic_scroll_(app, view_id, scroll));} static b32 view_set_mark(Application_Links *app, View_ID view_id, Buffer_Seek seek){return(app->view_set_mark_(app, view_id, seek));} diff --git a/4coder_generated/command_metadata.h b/4coder_generated/command_metadata.h index f3237304..b0eb938f 100644 --- a/4coder_generated/command_metadata.h +++ b/4coder_generated/command_metadata.h @@ -293,87 +293,87 @@ static Command_Metadata fcoder_metacmd_table[233] = { { PROC_LINKS(click_set_cursor_if_lbutton, 0), "click_set_cursor_if_lbutton", 27, "If the mouse left button is pressed, sets the cursor position to the mouse position.", 84, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 247 }, { PROC_LINKS(click_set_mark, 0), "click_set_mark", 14, "Sets the mark position to the mouse position.", 45, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 261 }, { PROC_LINKS(mouse_wheel_scroll, 0), "mouse_wheel_scroll", 18, "Reads the scroll wheel value from the mouse state and scrolls accordingly.", 74, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 273 }, -{ PROC_LINKS(move_up, 0), "move_up", 7, "Moves the cursor up one line.", 29, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 335 }, -{ PROC_LINKS(move_down, 0), "move_down", 9, "Moves the cursor down one line.", 31, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 341 }, -{ PROC_LINKS(move_up_10, 0), "move_up_10", 10, "Moves the cursor up ten lines.", 30, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 347 }, -{ PROC_LINKS(move_down_10, 0), "move_down_10", 12, "Moves the cursor down ten lines.", 32, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 353 }, -{ PROC_LINKS(move_down_textual, 0), "move_down_textual", 17, "Moves down to the next line of actual text, regardless of line wrapping.", 72, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 359 }, -{ PROC_LINKS(page_up, 0), "page_up", 7, "Scrolls the view up one view height and moves the cursor up one view height.", 76, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 369 }, -{ PROC_LINKS(page_down, 0), "page_down", 9, "Scrolls the view down one view height and moves the cursor down one view height.", 80, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 377 }, -{ PROC_LINKS(move_up_to_blank_line, 0), "move_up_to_blank_line", 21, "Seeks the cursor up to the next blank line.", 43, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 406 }, -{ PROC_LINKS(move_down_to_blank_line, 0), "move_down_to_blank_line", 23, "Seeks the cursor down to the next blank line.", 45, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 412 }, -{ PROC_LINKS(move_up_to_blank_line_skip_whitespace, 0), "move_up_to_blank_line_skip_whitespace", 37, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 418 }, -{ PROC_LINKS(move_down_to_blank_line_skip_whitespace, 0), "move_down_to_blank_line_skip_whitespace", 39, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 424 }, -{ PROC_LINKS(move_up_to_blank_line_end, 0), "move_up_to_blank_line_end", 25, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 430 }, -{ PROC_LINKS(move_down_to_blank_line_end, 0), "move_down_to_blank_line_end", 27, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 436 }, -{ PROC_LINKS(move_left, 0), "move_left", 9, "Moves the cursor one character to the left.", 43, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 447 }, -{ PROC_LINKS(move_right, 0), "move_right", 10, "Moves the cursor one character to the right.", 44, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 459 }, -{ PROC_LINKS(move_right_whitespace_boundary, 0), "move_right_whitespace_boundary", 30, "Seek right for the next boundary between whitespace and non-whitespace.", 71, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 481 }, -{ PROC_LINKS(move_left_whitespace_boundary, 0), "move_left_whitespace_boundary", 29, "Seek left for the next boundary between whitespace and non-whitespace.", 70, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 489 }, -{ PROC_LINKS(move_right_token_boundary, 0), "move_right_token_boundary", 25, "Seek right for the next end of a token.", 39, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 497 }, -{ PROC_LINKS(move_left_token_boundary, 0), "move_left_token_boundary", 24, "Seek left for the next beginning of a token.", 44, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 505 }, -{ PROC_LINKS(move_right_whitespace_or_token_boundary, 0), "move_right_whitespace_or_token_boundary", 39, "Seek right for the next end of a token or boundary between whitespace and non-whitespace.", 89, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 513 }, -{ PROC_LINKS(move_left_whitespace_or_token_boundary, 0), "move_left_whitespace_or_token_boundary", 38, "Seek left for the next end of a token or boundary between whitespace and non-whitespace.", 88, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 521 }, -{ PROC_LINKS(move_right_alpha_numeric_boundary, 0), "move_right_alpha_numeric_boundary", 33, "Seek right for boundary between alphanumeric characters and non-alphanumeric characters.", 88, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 529 }, -{ PROC_LINKS(move_left_alpha_numeric_boundary, 0), "move_left_alpha_numeric_boundary", 32, "Seek left for boundary between alphanumeric characters and non-alphanumeric characters.", 87, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 537 }, -{ PROC_LINKS(move_right_alpha_numeric_or_camel_boundary, 0), "move_right_alpha_numeric_or_camel_boundary", 42, "Seek right for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 107, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 545 }, -{ PROC_LINKS(move_left_alpha_numeric_or_camel_boundary, 0), "move_left_alpha_numeric_or_camel_boundary", 41, "Seek left for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 106, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 553 }, -{ PROC_LINKS(select_all, 0), "select_all", 10, "Puts the cursor at the top of the file, and the mark at the bottom of the file.", 79, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 574 }, -{ PROC_LINKS(to_uppercase, 0), "to_uppercase", 12, "Converts all ascii text in the range between the cursor and the mark to uppercase.", 82, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 587 }, -{ PROC_LINKS(to_lowercase, 0), "to_lowercase", 12, "Converts all ascii text in the range between the cursor and the mark to lowercase.", 82, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 600 }, -{ PROC_LINKS(clean_all_lines, 0), "clean_all_lines", 15, "Removes trailing whitespace from all lines in the current buffer.", 65, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 613 }, -{ PROC_LINKS(basic_change_active_panel, 0), "basic_change_active_panel", 25, "Change the currently active panel, moving to the panel with the next highest view_id. Will not skipe the build panel if it is open.", 132, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 647 }, -{ PROC_LINKS(close_panel, 0), "close_panel", 11, "Closes the currently active panel if it is not the only panel open.", 67, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 655 }, -{ PROC_LINKS(show_scrollbar, 0), "show_scrollbar", 14, "Sets the current view to show it's scrollbar.", 45, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 664 }, -{ PROC_LINKS(hide_scrollbar, 0), "hide_scrollbar", 14, "Sets the current view to hide it's scrollbar.", 45, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 671 }, -{ PROC_LINKS(show_filebar, 0), "show_filebar", 12, "Sets the current view to show it's filebar.", 43, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 678 }, -{ PROC_LINKS(hide_filebar, 0), "hide_filebar", 12, "Sets the current view to hide it's filebar.", 43, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 685 }, -{ PROC_LINKS(toggle_filebar, 0), "toggle_filebar", 14, "Toggles the visibility status of the current view's filebar.", 60, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 692 }, -{ PROC_LINKS(toggle_line_wrap, 0), "toggle_line_wrap", 16, "Toggles the current buffer's line wrapping status.", 50, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 701 }, -{ PROC_LINKS(toggle_fps_meter, 0), "toggle_fps_meter", 16, "Toggles the visibility of the FPS performance meter", 51, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 711 }, -{ PROC_LINKS(increase_line_wrap, 0), "increase_line_wrap", 18, "Increases the current buffer's width for line wrapping.", 55, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 717 }, -{ PROC_LINKS(decrease_line_wrap, 0), "decrease_line_wrap", 18, "Decrases the current buffer's width for line wrapping.", 54, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 727 }, -{ PROC_LINKS(increase_face_size, 0), "increase_face_size", 18, "Increase the size of the face used by the current buffer.", 57, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 737 }, -{ PROC_LINKS(decrease_face_size, 0), "decrease_face_size", 18, "Decrease the size of the face used by the current buffer.", 57, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 748 }, -{ PROC_LINKS(mouse_wheel_change_face_size, 0), "mouse_wheel_change_face_size", 28, "Reads the state of the mouse wheel and uses it to either increase or decrease the face size.", 92, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 759 }, -{ PROC_LINKS(toggle_virtual_whitespace, 0), "toggle_virtual_whitespace", 25, "Toggles the current buffer's virtual whitespace status.", 55, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 776 }, -{ PROC_LINKS(toggle_show_whitespace, 0), "toggle_show_whitespace", 22, "Toggles the current buffer's whitespace visibility status.", 58, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 786 }, -{ PROC_LINKS(toggle_line_numbers, 0), "toggle_line_numbers", 19, "Toggles the left margin line numbers.", 37, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 795 }, -{ PROC_LINKS(eol_dosify, 0), "eol_dosify", 10, "Puts the buffer in DOS line ending mode.", 40, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 801 }, -{ PROC_LINKS(eol_nixify, 0), "eol_nixify", 10, "Puts the buffer in NIX line ending mode.", 40, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 809 }, -{ PROC_LINKS(exit_4coder, 0), "exit_4coder", 11, "Attempts to close 4coder.", 25, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 817 }, -{ PROC_LINKS(goto_line, 0), "goto_line", 9, "Queries the user for a number, and jumps the cursor to the corresponding line.", 78, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 825 }, -{ PROC_LINKS(search, 0), "search", 6, "Begins an incremental search down through the current buffer for a user specified string.", 89, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1036 }, -{ PROC_LINKS(reverse_search, 0), "reverse_search", 14, "Begins an incremental search up through the current buffer for a user specified string.", 87, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1042 }, -{ PROC_LINKS(search_identifier, 0), "search_identifier", 17, "Begins an incremental search down through the current buffer for the word or token under the cursor.", 100, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1048 }, -{ PROC_LINKS(reverse_search_identifier, 0), "reverse_search_identifier", 25, "Begins an incremental search up through the current buffer for the word or token under the cursor.", 98, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1059 }, -{ PROC_LINKS(replace_in_range, 0), "replace_in_range", 16, "Queries the user for a needle and string. Replaces all occurences of needle with string in the range between cursor and the mark in the active buffer.", 150, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1110 }, -{ PROC_LINKS(replace_in_buffer, 0), "replace_in_buffer", 17, "Queries the user for a needle and string. Replaces all occurences of needle with string in the active buffer.", 109, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1119 }, -{ PROC_LINKS(replace_in_all_buffers, 0), "replace_in_all_buffers", 22, "Queries the user for a needle and string. Replaces all occurences of needle with string in all editable buffers.", 112, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1128 }, -{ PROC_LINKS(query_replace, 0), "query_replace", 13, "Queries the user for two strings, and incrementally replaces every occurence of the first string with the second string.", 120, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1216 }, -{ PROC_LINKS(query_replace_identifier, 0), "query_replace_identifier", 24, "Queries the user for a string, and incrementally replace every occurence of the word or token found at the cursor with the specified string.", 140, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1236 }, -{ PROC_LINKS(query_replace_selection, 0), "query_replace_selection", 23, "Queries the user for a string, and incrementally replace every occurence of the string found in the selected range with the specified string.", 141, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1252 }, -{ PROC_LINKS(save_all_dirty_buffers, 0), "save_all_dirty_buffers", 22, "Saves all buffers marked dirty (showing the '*' indicator).", 59, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1287 }, -{ PROC_LINKS(delete_file_query, 0), "delete_file_query", 17, "Deletes the file of the current buffer if 4coder has the appropriate access rights. Will ask the user for confirmation first.", 125, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1312 }, -{ PROC_LINKS(save_to_query, 0), "save_to_query", 13, "Queries the user for a file name and saves the contents of the current buffer, altering the buffer's name too.", 110, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1350 }, -{ PROC_LINKS(rename_file_query, 0), "rename_file_query", 17, "Queries the user for a new name and renames the file of the current buffer, altering the buffer's name too.", 107, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1385 }, -{ PROC_LINKS(make_directory_query, 0), "make_directory_query", 20, "Queries the user for a name and creates a new directory with the given name.", 76, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1425 }, -{ PROC_LINKS(move_line_up, 0), "move_line_up", 12, "Swaps the line under the cursor with the line above it, and moves the cursor up with it.", 88, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1458 }, -{ PROC_LINKS(move_line_down, 0), "move_line_down", 14, "Swaps the line under the cursor with the line below it, and moves the cursor down with it.", 90, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1464 }, -{ PROC_LINKS(duplicate_line, 0), "duplicate_line", 14, "Create a copy of the line on which the cursor sits.", 51, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1470 }, -{ PROC_LINKS(delete_line, 0), "delete_line", 11, "Delete the line the on which the cursor sits.", 45, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1484 }, -{ PROC_LINKS(open_file_in_quotes, 0), "open_file_in_quotes", 19, "Reads a filename from surrounding '\"' characters and attempts to open the corresponding file.", 94, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1549 }, -{ PROC_LINKS(open_matching_file_cpp, 0), "open_matching_file_cpp", 22, "If the current file is a *.cpp or *.h, attempts to open the corresponding *.h or *.cpp file in the other view.", 110, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1581 }, -{ PROC_LINKS(view_buffer_other_panel, 0), "view_buffer_other_panel", 23, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1594 }, -{ PROC_LINKS(swap_buffers_between_panels, 0), "swap_buffers_between_panels", 27, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1606 }, -{ PROC_LINKS(kill_buffer, 0), "kill_buffer", 11, "Kills the current buffer.", 25, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1642 }, -{ PROC_LINKS(save, 0), "save", 4, "Saves the current buffer.", 25, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1650 }, -{ PROC_LINKS(reopen, 0), "reopen", 6, "Reopen the current buffer from the hard drive.", 46, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1662 }, -{ PROC_LINKS(undo, 0), "undo", 4, "Advances backwards through the undo history of the current buffer.", 66, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1720 }, -{ PROC_LINKS(redo, 0), "redo", 4, "Advances forwards through the undo history of the current buffer.", 65, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1733 }, -{ PROC_LINKS(undo_all_buffers, 0), "undo_all_buffers", 16, "Advances backward through the undo history in the buffer containing the most recent regular edit.", 97, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1747 }, -{ PROC_LINKS(redo_all_buffers, 0), "redo_all_buffers", 16, "Advances forward through the undo history in the buffer containing the most recent regular edit.", 96, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1821 }, -{ PROC_LINKS(open_in_other, 0), "open_in_other", 13, "Interactively opens a file in the other panel.", 46, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1924 }, +{ PROC_LINKS(move_up, 0), "move_up", 7, "Moves the cursor up one line.", 29, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 334 }, +{ PROC_LINKS(move_down, 0), "move_down", 9, "Moves the cursor down one line.", 31, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 340 }, +{ PROC_LINKS(move_up_10, 0), "move_up_10", 10, "Moves the cursor up ten lines.", 30, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 346 }, +{ PROC_LINKS(move_down_10, 0), "move_down_10", 12, "Moves the cursor down ten lines.", 32, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 352 }, +{ PROC_LINKS(move_down_textual, 0), "move_down_textual", 17, "Moves down to the next line of actual text, regardless of line wrapping.", 72, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 358 }, +{ PROC_LINKS(page_up, 0), "page_up", 7, "Scrolls the view up one view height and moves the cursor up one view height.", 76, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 368 }, +{ PROC_LINKS(page_down, 0), "page_down", 9, "Scrolls the view down one view height and moves the cursor down one view height.", 80, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 376 }, +{ PROC_LINKS(move_up_to_blank_line, 0), "move_up_to_blank_line", 21, "Seeks the cursor up to the next blank line.", 43, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 405 }, +{ PROC_LINKS(move_down_to_blank_line, 0), "move_down_to_blank_line", 23, "Seeks the cursor down to the next blank line.", 45, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 411 }, +{ PROC_LINKS(move_up_to_blank_line_skip_whitespace, 0), "move_up_to_blank_line_skip_whitespace", 37, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 417 }, +{ PROC_LINKS(move_down_to_blank_line_skip_whitespace, 0), "move_down_to_blank_line_skip_whitespace", 39, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 423 }, +{ PROC_LINKS(move_up_to_blank_line_end, 0), "move_up_to_blank_line_end", 25, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 429 }, +{ PROC_LINKS(move_down_to_blank_line_end, 0), "move_down_to_blank_line_end", 27, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 435 }, +{ PROC_LINKS(move_left, 0), "move_left", 9, "Moves the cursor one character to the left.", 43, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 441 }, +{ PROC_LINKS(move_right, 0), "move_right", 10, "Moves the cursor one character to the right.", 44, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 453 }, +{ PROC_LINKS(move_right_whitespace_boundary, 0), "move_right_whitespace_boundary", 30, "Seek right for the next boundary between whitespace and non-whitespace.", 71, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 475 }, +{ PROC_LINKS(move_left_whitespace_boundary, 0), "move_left_whitespace_boundary", 29, "Seek left for the next boundary between whitespace and non-whitespace.", 70, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 483 }, +{ PROC_LINKS(move_right_token_boundary, 0), "move_right_token_boundary", 25, "Seek right for the next end of a token.", 39, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 491 }, +{ PROC_LINKS(move_left_token_boundary, 0), "move_left_token_boundary", 24, "Seek left for the next beginning of a token.", 44, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 499 }, +{ PROC_LINKS(move_right_whitespace_or_token_boundary, 0), "move_right_whitespace_or_token_boundary", 39, "Seek right for the next end of a token or boundary between whitespace and non-whitespace.", 89, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 507 }, +{ PROC_LINKS(move_left_whitespace_or_token_boundary, 0), "move_left_whitespace_or_token_boundary", 38, "Seek left for the next end of a token or boundary between whitespace and non-whitespace.", 88, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 515 }, +{ PROC_LINKS(move_right_alpha_numeric_boundary, 0), "move_right_alpha_numeric_boundary", 33, "Seek right for boundary between alphanumeric characters and non-alphanumeric characters.", 88, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 523 }, +{ PROC_LINKS(move_left_alpha_numeric_boundary, 0), "move_left_alpha_numeric_boundary", 32, "Seek left for boundary between alphanumeric characters and non-alphanumeric characters.", 87, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 531 }, +{ PROC_LINKS(move_right_alpha_numeric_or_camel_boundary, 0), "move_right_alpha_numeric_or_camel_boundary", 42, "Seek right for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 107, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 539 }, +{ PROC_LINKS(move_left_alpha_numeric_or_camel_boundary, 0), "move_left_alpha_numeric_or_camel_boundary", 41, "Seek left for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 106, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 547 }, +{ PROC_LINKS(select_all, 0), "select_all", 10, "Puts the cursor at the top of the file, and the mark at the bottom of the file.", 79, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 568 }, +{ PROC_LINKS(to_uppercase, 0), "to_uppercase", 12, "Converts all ascii text in the range between the cursor and the mark to uppercase.", 82, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 581 }, +{ PROC_LINKS(to_lowercase, 0), "to_lowercase", 12, "Converts all ascii text in the range between the cursor and the mark to lowercase.", 82, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 594 }, +{ PROC_LINKS(clean_all_lines, 0), "clean_all_lines", 15, "Removes trailing whitespace from all lines in the current buffer.", 65, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 607 }, +{ PROC_LINKS(basic_change_active_panel, 0), "basic_change_active_panel", 25, "Change the currently active panel, moving to the panel with the next highest view_id. Will not skipe the build panel if it is open.", 132, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 641 }, +{ PROC_LINKS(close_panel, 0), "close_panel", 11, "Closes the currently active panel if it is not the only panel open.", 67, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 649 }, +{ PROC_LINKS(show_scrollbar, 0), "show_scrollbar", 14, "Sets the current view to show it's scrollbar.", 45, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 658 }, +{ PROC_LINKS(hide_scrollbar, 0), "hide_scrollbar", 14, "Sets the current view to hide it's scrollbar.", 45, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 665 }, +{ PROC_LINKS(show_filebar, 0), "show_filebar", 12, "Sets the current view to show it's filebar.", 43, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 672 }, +{ PROC_LINKS(hide_filebar, 0), "hide_filebar", 12, "Sets the current view to hide it's filebar.", 43, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 679 }, +{ PROC_LINKS(toggle_filebar, 0), "toggle_filebar", 14, "Toggles the visibility status of the current view's filebar.", 60, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 686 }, +{ PROC_LINKS(toggle_line_wrap, 0), "toggle_line_wrap", 16, "Toggles the current buffer's line wrapping status.", 50, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 695 }, +{ PROC_LINKS(toggle_fps_meter, 0), "toggle_fps_meter", 16, "Toggles the visibility of the FPS performance meter", 51, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 705 }, +{ PROC_LINKS(increase_line_wrap, 0), "increase_line_wrap", 18, "Increases the current buffer's width for line wrapping.", 55, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 711 }, +{ PROC_LINKS(decrease_line_wrap, 0), "decrease_line_wrap", 18, "Decrases the current buffer's width for line wrapping.", 54, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 721 }, +{ PROC_LINKS(increase_face_size, 0), "increase_face_size", 18, "Increase the size of the face used by the current buffer.", 57, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 731 }, +{ PROC_LINKS(decrease_face_size, 0), "decrease_face_size", 18, "Decrease the size of the face used by the current buffer.", 57, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 742 }, +{ PROC_LINKS(mouse_wheel_change_face_size, 0), "mouse_wheel_change_face_size", 28, "Reads the state of the mouse wheel and uses it to either increase or decrease the face size.", 92, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 753 }, +{ PROC_LINKS(toggle_virtual_whitespace, 0), "toggle_virtual_whitespace", 25, "Toggles the current buffer's virtual whitespace status.", 55, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 770 }, +{ PROC_LINKS(toggle_show_whitespace, 0), "toggle_show_whitespace", 22, "Toggles the current buffer's whitespace visibility status.", 58, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 780 }, +{ PROC_LINKS(toggle_line_numbers, 0), "toggle_line_numbers", 19, "Toggles the left margin line numbers.", 37, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 789 }, +{ PROC_LINKS(eol_dosify, 0), "eol_dosify", 10, "Puts the buffer in DOS line ending mode.", 40, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 795 }, +{ PROC_LINKS(eol_nixify, 0), "eol_nixify", 10, "Puts the buffer in NIX line ending mode.", 40, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 803 }, +{ PROC_LINKS(exit_4coder, 0), "exit_4coder", 11, "Attempts to close 4coder.", 25, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 811 }, +{ PROC_LINKS(goto_line, 0), "goto_line", 9, "Queries the user for a number, and jumps the cursor to the corresponding line.", 78, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 819 }, +{ PROC_LINKS(search, 0), "search", 6, "Begins an incremental search down through the current buffer for a user specified string.", 89, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1030 }, +{ PROC_LINKS(reverse_search, 0), "reverse_search", 14, "Begins an incremental search up through the current buffer for a user specified string.", 87, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1036 }, +{ PROC_LINKS(search_identifier, 0), "search_identifier", 17, "Begins an incremental search down through the current buffer for the word or token under the cursor.", 100, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1042 }, +{ PROC_LINKS(reverse_search_identifier, 0), "reverse_search_identifier", 25, "Begins an incremental search up through the current buffer for the word or token under the cursor.", 98, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1053 }, +{ PROC_LINKS(replace_in_range, 0), "replace_in_range", 16, "Queries the user for a needle and string. Replaces all occurences of needle with string in the range between cursor and the mark in the active buffer.", 150, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1104 }, +{ PROC_LINKS(replace_in_buffer, 0), "replace_in_buffer", 17, "Queries the user for a needle and string. Replaces all occurences of needle with string in the active buffer.", 109, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1113 }, +{ PROC_LINKS(replace_in_all_buffers, 0), "replace_in_all_buffers", 22, "Queries the user for a needle and string. Replaces all occurences of needle with string in all editable buffers.", 112, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1122 }, +{ PROC_LINKS(query_replace, 0), "query_replace", 13, "Queries the user for two strings, and incrementally replaces every occurence of the first string with the second string.", 120, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1210 }, +{ PROC_LINKS(query_replace_identifier, 0), "query_replace_identifier", 24, "Queries the user for a string, and incrementally replace every occurence of the word or token found at the cursor with the specified string.", 140, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1230 }, +{ PROC_LINKS(query_replace_selection, 0), "query_replace_selection", 23, "Queries the user for a string, and incrementally replace every occurence of the string found in the selected range with the specified string.", 141, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1246 }, +{ PROC_LINKS(save_all_dirty_buffers, 0), "save_all_dirty_buffers", 22, "Saves all buffers marked dirty (showing the '*' indicator).", 59, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1281 }, +{ PROC_LINKS(delete_file_query, 0), "delete_file_query", 17, "Deletes the file of the current buffer if 4coder has the appropriate access rights. Will ask the user for confirmation first.", 125, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1306 }, +{ PROC_LINKS(save_to_query, 0), "save_to_query", 13, "Queries the user for a file name and saves the contents of the current buffer, altering the buffer's name too.", 110, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1344 }, +{ PROC_LINKS(rename_file_query, 0), "rename_file_query", 17, "Queries the user for a new name and renames the file of the current buffer, altering the buffer's name too.", 107, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1379 }, +{ PROC_LINKS(make_directory_query, 0), "make_directory_query", 20, "Queries the user for a name and creates a new directory with the given name.", 76, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1419 }, +{ PROC_LINKS(move_line_up, 0), "move_line_up", 12, "Swaps the line under the cursor with the line above it, and moves the cursor up with it.", 88, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1452 }, +{ PROC_LINKS(move_line_down, 0), "move_line_down", 14, "Swaps the line under the cursor with the line below it, and moves the cursor down with it.", 90, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1458 }, +{ PROC_LINKS(duplicate_line, 0), "duplicate_line", 14, "Create a copy of the line on which the cursor sits.", 51, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1464 }, +{ PROC_LINKS(delete_line, 0), "delete_line", 11, "Delete the line the on which the cursor sits.", 45, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1478 }, +{ PROC_LINKS(open_file_in_quotes, 0), "open_file_in_quotes", 19, "Reads a filename from surrounding '\"' characters and attempts to open the corresponding file.", 94, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1543 }, +{ PROC_LINKS(open_matching_file_cpp, 0), "open_matching_file_cpp", 22, "If the current file is a *.cpp or *.h, attempts to open the corresponding *.h or *.cpp file in the other view.", 110, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1575 }, +{ PROC_LINKS(view_buffer_other_panel, 0), "view_buffer_other_panel", 23, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1588 }, +{ PROC_LINKS(swap_buffers_between_panels, 0), "swap_buffers_between_panels", 27, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1600 }, +{ PROC_LINKS(kill_buffer, 0), "kill_buffer", 11, "Kills the current buffer.", 25, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1636 }, +{ PROC_LINKS(save, 0), "save", 4, "Saves the current buffer.", 25, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1644 }, +{ PROC_LINKS(reopen, 0), "reopen", 6, "Reopen the current buffer from the hard drive.", 46, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1656 }, +{ PROC_LINKS(undo, 0), "undo", 4, "Advances backwards through the undo history of the current buffer.", 66, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1714 }, +{ PROC_LINKS(redo, 0), "redo", 4, "Advances forwards through the undo history of the current buffer.", 65, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1727 }, +{ PROC_LINKS(undo_all_buffers, 0), "undo_all_buffers", 16, "Advances backward through the undo history in the buffer containing the most recent regular edit.", 97, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1741 }, +{ PROC_LINKS(redo_all_buffers, 0), "redo_all_buffers", 16, "Advances forward through the undo history in the buffer containing the most recent regular edit.", 96, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1815 }, +{ PROC_LINKS(open_in_other, 0), "open_in_other", 13, "Interactively opens a file in the other panel.", 46, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1918 }, { PROC_LINKS(lister__quit, 0), "lister__quit", 12, "A lister mode command that quits the list without executing any actions.", 72, "w:\\4ed\\code\\4coder_lists.cpp", 28, 8 }, { PROC_LINKS(lister__activate, 0), "lister__activate", 16, "A lister mode command that activates the list's action on the highlighted item.", 79, "w:\\4ed\\code\\4coder_lists.cpp", 28, 15 }, { PROC_LINKS(lister__write_character, 0), "lister__write_character", 23, "A lister mode command that dispatches to the lister's write character handler.", 78, "w:\\4ed\\code\\4coder_lists.cpp", 28, 30 }, diff --git a/4coder_helper.cpp b/4coder_helper.cpp index c0df2432..79fe3f87 100644 --- a/4coder_helper.cpp +++ b/4coder_helper.cpp @@ -408,11 +408,6 @@ buffer_seek_character_class_change_0_1(Application_Links *app, Buffer_ID buffer, //////////////////////////////// -internal Buffer_Cursor -view_compute_cursor(Application_Links *app, View_ID view, Buffer_Seek seek){ - return(buffer_compute_cursor(app, view_get_buffer(app, view, AccessAll), seek)); -} - internal i64 view_pos_from_xy(Application_Links *app, View_ID view, Vec2_f32 p){ Buffer_ID buffer = view_get_buffer(app, view, AccessProtected); @@ -446,6 +441,14 @@ view_zero_scroll(Application_Links *app, View_ID view){ } } +internal void +view_set_cursor_and_preferred_x(Application_Links *app, View_ID view, Buffer_Seek seek){ + view_set_cursor(app, view, seek); + Buffer_Cursor cursor = view_compute_cursor(app, view, seek); + Vec2_f32 p = view_relative_xy_of_pos(app, view, cursor.line, cursor.pos); + view_set_preferred_x(app, view, p.x); +} + //////////////////////////////// internal Range_i64 @@ -470,12 +473,12 @@ set_view_range(Application_Links *app, View_ID view, Range_i64 range){ i64 c = view_get_cursor_pos(app, view); i64 m = view_get_mark_pos(app, view); if (c < m){ - view_set_cursor(app, view, seek_pos(range.min), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(range.min)); view_set_mark(app, view, seek_pos(range.max)); } else{ view_set_mark(app, view, seek_pos(range.min)); - view_set_cursor(app, view, seek_pos(range.max), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(range.max)); } } @@ -1291,7 +1294,7 @@ internal void move_past_lead_whitespace(Application_Links *app, View_ID view, Buffer_ID buffer){ i64 pos = view_get_cursor_pos(app, view); i64 new_pos = get_pos_past_lead_whitespace(app, buffer, pos); - view_set_cursor(app, view, seek_pos(new_pos), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(new_pos)); } internal void diff --git a/4coder_jump_sticky.cpp b/4coder_jump_sticky.cpp index 4e59ea3c..525797f3 100644 --- a/4coder_jump_sticky.cpp +++ b/4coder_jump_sticky.cpp @@ -440,7 +440,7 @@ goto_next_filtered_jump(Application_Links *app, Marker_List *list, View_ID jump_ if (!skip_this){ goto_jump_in_order(app, list, jump_view, location); i64 updated_line = get_line_from_list(app, list, list_index); - view_set_cursor(app, jump_view, seek_line_col(updated_line, 1), true); + view_set_cursor_and_preferred_x(app, jump_view, seek_line_col(updated_line, 1)); break; } } @@ -538,7 +538,7 @@ CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to th if (get_jump_from_list(app, jump_state.list, list_index, &location)){ goto_jump_in_order(app, jump_state.list, jump_state.view, location); i64 updated_line = get_line_from_list(app, jump_state.list, list_index); - view_set_cursor(app, jump_state.view, seek_line_col(updated_line, 1), true); + view_set_cursor_and_preferred_x(app, jump_state.view, seek_line_col(updated_line, 1)); } } } diff --git a/4coder_jumping.cpp b/4coder_jumping.cpp index 14dfbc5f..55aa8034 100644 --- a/4coder_jumping.cpp +++ b/4coder_jumping.cpp @@ -240,7 +240,7 @@ set_view_to_location(Application_Links *app, View_ID view, Buffer_ID buffer, Buf if (current_buffer != buffer){ view_set_buffer(app, view, buffer, 0); } - view_set_cursor(app, view, seek, true); + view_set_cursor_and_preferred_x(app, view, seek); } static void diff --git a/4coder_miblo_numbers.cpp b/4coder_miblo_numbers.cpp index 018198ff..ffb309bf 100644 --- a/4coder_miblo_numbers.cpp +++ b/4coder_miblo_numbers.cpp @@ -37,7 +37,7 @@ CUSTOM_DOC("Increment an integer under the cursor by one.") Scratch_Block scratch(app); String_Const_u8 str = push_u8_stringf(scratch, "%d", number.x + 1); buffer_replace_range(app, buffer, number.range, str); - view_set_cursor(app, view, seek_pos(number.range.start + str.size - 1), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(number.range.start + str.size - 1)); } } @@ -52,7 +52,7 @@ CUSTOM_DOC("Decrement an integer under the cursor by one.") Scratch_Block scratch(app); String_Const_u8 str = push_u8_stringf(scratch, "%d", number.x - 1); buffer_replace_range(app, buffer, number.range, str); - view_set_cursor(app, view, seek_pos(number.range.start + str.size - 1), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(number.range.start + str.size - 1)); } } @@ -224,7 +224,7 @@ miblo_time_stamp_alter(Application_Links *app, i32 unit_type, i32 amt){ Miblo_Timestamp inc_timestamp = increment_timestamp(timestamp.time, unit_type, amt); String_Const_u8 str = timestamp_to_string(scratch, inc_timestamp); buffer_replace_range(app, buffer, timestamp.range, str); - view_set_cursor(app, view, seek_pos(timestamp.range.start + str.size - 1), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(timestamp.range.start + str.size - 1)); } } diff --git a/4coder_scope_commands.cpp b/4coder_scope_commands.cpp index efbb122e..54f5f7be 100644 --- a/4coder_scope_commands.cpp +++ b/4coder_scope_commands.cpp @@ -346,7 +346,7 @@ CUSTOM_DOC("Finds the scope enclosed by '{' '}' surrounding the cursor and puts i64 pos = view_get_cursor_pos(app, view); Range_i64 range = {}; if (find_scope_range(app, buffer, pos, &range, FindScope_Brace)){ - view_set_cursor(app, view, seek_pos(range.first), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(range.first)); view_set_mark(app, view, seek_pos(range.end)); view_set_to_region(app, view, range.first, range.end); no_mark_snap_to_cursor(app, view); @@ -364,7 +364,7 @@ CUSTOM_DOC("Finds the first scope started by '{' after the cursor and puts the c i64 bottom = 0; if (find_next_scope(app, buffer, start_pos, FindScope_Brace, &top)){ if (find_scope_bottom(app, buffer, top, FindScope_EndOfToken|FindScope_Brace, &bottom)){ - view_set_cursor(app, view, seek_pos(top), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(top)); view_set_mark(app, view, seek_pos(bottom)); view_set_to_region(app, view, top, bottom); no_mark_snap_to_cursor(app, view); @@ -383,7 +383,7 @@ CUSTOM_DOC("Finds the first scope started by '{' before the cursor and puts the i64 bottom = 0; if (find_prev_scope(app, buffer, start_pos, FindScope_Brace, &top)){ if (find_scope_bottom(app, buffer, top, FindScope_EndOfToken|FindScope_Brace, &bottom)){ - view_set_cursor(app, view, seek_pos(top), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(top)); view_set_mark(app, view, seek_pos(bottom)); view_set_to_region(app, view, top, bottom); no_mark_snap_to_cursor(app, view); @@ -441,7 +441,7 @@ place_begin_and_end_on_own_lines(Application_Links *app, char *begin, char *end) String_Const_u8 str = push_u8_stringf(scratch, "%s\n\n%s", begin, end); buffer_replace_range(app, buffer, range, str); i64 center_pos = range.min + cstring_length(begin) + 1; - view_set_cursor(app, view, seek_pos(center_pos), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(center_pos)); view_set_mark(app, view, seek_pos(center_pos)); } } diff --git a/4coder_search.cpp b/4coder_search.cpp index 35045c20..4071213d 100644 --- a/4coder_search.cpp +++ b/4coder_search.cpp @@ -424,7 +424,7 @@ CUSTOM_DOC("Iteratively tries completing the word to the left of the cursor with buffer_replace_range(app, buffer, state.range, str); state.range.max = state.range.min + str.size; - view_set_cursor(app, view, seek_pos(state.range.max), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(state.range.max)); } } } diff --git a/4coder_seek.cpp b/4coder_seek.cpp index abd47601..2157ddc2 100644 --- a/4coder_seek.cpp +++ b/4coder_seek.cpp @@ -10,7 +10,7 @@ seek_pos_of_textual_line(Application_Links *app, Side side){ Buffer_ID buffer = view_get_buffer(app, view, AccessProtected); i64 pos = view_get_cursor_pos(app, view); i64 new_pos = get_line_side_pos_from_pos(app, buffer, pos, side); - view_set_cursor(app, view, seek_pos(new_pos), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(new_pos)); no_mark_snap_to_cursor_if_shift(app, view); } @@ -22,7 +22,7 @@ seek_pos_of_visual_line(Application_Links *app, Side side){ Vec2_f32 p = view_relative_xy_of_pos(app, view, cursor.line, pos); p.x = (side == Side_Min)?(0.f):(max_f32); i64 new_pos = view_pos_at_relative_xy(app, view, cursor.line, p); - view_set_cursor(app, view, seek_pos(new_pos), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(new_pos)); no_mark_snap_to_cursor_if_shift(app, view); } @@ -54,7 +54,7 @@ CUSTOM_COMMAND_SIG(goto_beginning_of_file) CUSTOM_DOC("Sets the cursor to the beginning of the file.") { View_ID view = get_active_view(app, AccessProtected); - view_set_cursor(app, view, seek_pos(0), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(0)); no_mark_snap_to_cursor_if_shift(app, view); } @@ -64,7 +64,7 @@ CUSTOM_DOC("Sets the cursor to the end of the file.") View_ID view = get_active_view(app, AccessProtected); Buffer_ID buffer_id = view_get_buffer(app, view, AccessProtected); i32 size = (i32)buffer_get_size(app, buffer_id); - view_set_cursor(app, view, seek_pos(size), true); + view_set_cursor_and_preferred_x(app, view, seek_pos(size)); no_mark_snap_to_cursor_if_shift(app, view); } diff --git a/4ed.cpp b/4ed.cpp index 0b98edf7..ddd28283 100644 --- a/4ed.cpp +++ b/4ed.cpp @@ -52,8 +52,8 @@ app_coroutine_handle_request(Models *models, Coroutine *co, u32 *vals){ case AppCoroutineRequest_NewFontFace: { Face_Description *description = ((Face_Description**)vals)[0]; - Face_ID face_id = font_set_new_face(&models->font_set, description); - result = coroutine_run(&models->coroutines, co, &face_id, vals); + Face *face = font_set_new_face(&models->font_set, description); + result = coroutine_run(&models->coroutines, co, &face->id, vals); }break; case AppCoroutineRequest_ModifyFace: @@ -925,7 +925,8 @@ App_Init_Sig(app_init){ description.font.file_name = string_u8_litexpr("liberation-mono.ttf"); description.font.in_4coder_font_folder = true; description.parameters.pt_size = 12; - models->global_font_id = font_set_new_face(&models->font_set, &description); + Face *new_face = font_set_new_face(&models->font_set, &description); + models->global_face_id = new_face->id; } app_hardcode_default_style(models); diff --git a/4ed_api_implementation.cpp b/4ed_api_implementation.cpp index e13688b7..7b5886d5 100644 --- a/4ed_api_implementation.cpp +++ b/4ed_api_implementation.cpp @@ -391,7 +391,10 @@ Buffer_Line_Y_Difference(Application_Links *app, Buffer_ID buffer_id, f32 width, Editing_File *file = imp_get_file(models, buffer_id); f32 result = {}; if (api_check_buffer(file)){ - result = file_line_y_difference(models, file, width, face_id, line_a, line_b); + Face *face = font_set_face_from_id(&models->font_set, face_id); + if (face != 0){ + result = file_line_y_difference(models, file, width, face, line_a, line_b); + } } return(result); } @@ -402,7 +405,10 @@ Buffer_Line_Shift_Y(Application_Links *app, Buffer_ID buffer_id, f32 width, Face Editing_File *file = imp_get_file(models, buffer_id); Line_Shift_Vertical result = {}; if (api_check_buffer(file)){ - result = file_line_shift_y(models, file, width, face_id, line, y_shift); + Face *face = font_set_face_from_id(&models->font_set, face_id); + if (face != 0){ + result = file_line_shift_y(models, file, width, face, line, y_shift); + } } return(result); } @@ -413,7 +419,10 @@ Buffer_Pos_At_Relative_XY(Application_Links *app, Buffer_ID buffer_id, f32 width Editing_File *file = imp_get_file(models, buffer_id); i64 result = -1; if (api_check_buffer(file)){ - result = file_pos_at_relative_xy(models, file, width, face_id, base_line, relative_xy); + Face *face = font_set_face_from_id(&models->font_set, face_id); + if (face != 0){ + result = file_pos_at_relative_xy(models, file, width, face, base_line, relative_xy); + } } return(result); } @@ -425,7 +434,10 @@ Buffer_Relative_XY_Of_Pos(Application_Links *app, Buffer_ID buffer_id, f32 width Editing_File *file = imp_get_file(models, buffer_id); Vec2_f32 result = {}; if (api_check_buffer(file)){ - result = file_relative_xy_of_pos(models, file, width, face_id, base_line, pos); + Face *face = font_set_face_from_id(&models->font_set, face_id); + if (face != 0){ + result = file_relative_xy_of_pos(models, file, width, face, base_line, pos); + } } return(result); } @@ -437,7 +449,10 @@ Buffer_Relative_Character_From_Pos(Application_Links *app, Buffer_ID buffer_id, Editing_File *file = imp_get_file(models, buffer_id); i64 result = {}; if (api_check_buffer(file)){ - result = file_relative_character_from_pos(models, file, width, face_id, base_line, pos); + Face *face = font_set_face_from_id(&models->font_set, face_id); + if (face != 0){ + result = file_relative_character_from_pos(models, file, width, face, base_line, pos); + } } return(result); } @@ -449,7 +464,10 @@ Buffer_Pos_From_Relative_Character(Application_Links *app, Buffer_ID buffer_id, Editing_File *file = imp_get_file(models, buffer_id); i64 result = -1; if (api_check_buffer(file)){ - result = file_pos_from_relative_character(models, file, width, face_id, base_line, relative_character); + Face *face = font_set_face_from_id(&models->font_set, face_id); + if (face != 0){ + result = file_pos_from_relative_character(models, file, width, face, base_line, relative_character); + } } return(result); } @@ -1299,6 +1317,18 @@ View_Get_Preferred_X(Application_Links *app, View_ID view_id){ return(result); } +API_EXPORT b32 +View_Set_Preferred_X(Application_Links *app, View_ID view_id, f32 x){ + Models *models = (Models*)app->cmd_context; + View *view = imp_get_view(models, view_id); + b32 result = false; + if (api_check_view(view)){ + view->preferred_x = x; + result = true; + } + return(result); +} + API_EXPORT Rect_f32 View_Get_Screen_Rect(Application_Links *app, View_ID view_id){ Models *models = (Models*)app->cmd_context; @@ -1673,8 +1703,19 @@ Buffer_Compute_Cursor(Application_Links *app, Buffer_ID buffer, Buffer_Seek seek return(result); } +API_EXPORT Buffer_Cursor +View_Compute_Cursor(Application_Links *app, View_ID view_id, Buffer_Seek seek){ + Models *models = (Models*)app->cmd_context; + View *view = imp_get_view(models, view_id); + Buffer_Cursor result = {}; + if (api_check_view(view)){ + result = view_compute_cursor(view, seek); + } + return(result); +} + API_EXPORT b32 -View_Set_Cursor(Application_Links *app, View_ID view_id, Buffer_Seek seek, b32 set_preferred_x) +View_Set_Cursor(Application_Links *app, View_ID view_id, Buffer_Seek seek) { Models *models = (Models*)app->cmd_context; View *view = imp_get_view(models, view_id); @@ -1684,14 +1725,7 @@ View_Set_Cursor(Application_Links *app, View_ID view_id, Buffer_Seek seek, b32 s Assert(file != 0); if (api_check_buffer(file)){ Buffer_Cursor cursor = file_compute_cursor(file, seek); - f32 preferred_x = 0.f; - if (!set_preferred_x){ - preferred_x = view->preferred_x; - } view_set_cursor(models, view, cursor.pos); - if (!set_preferred_x){ - view->preferred_x = preferred_x; - } result = true; } } @@ -2403,10 +2437,10 @@ Set_Global_Face(Application_Links *app, Face_ID id, b32 apply_to_all_buffers) Face *face = font_set_face_from_id(&models->font_set, id); if (face != 0){ if (apply_to_all_buffers){ - global_set_font_and_update_files(system, models, id); + global_set_font_and_update_files(system, models, face); } else{ - models->global_font_id = id; + models->global_face_id = face->id; } did_change = true; } @@ -2592,9 +2626,10 @@ Buffer_Set_Face(Application_Links *app, Buffer_ID buffer_id, Face_ID id) b32 did_change = false; if (api_check_buffer(file)){ - if (font_set_face_from_id(&models->font_set, id) != 0){ + Face *face = font_set_face_from_id(&models->font_set, id); + if (face != 0){ + file->settings.face_id = face->id; did_change = true; - file_set_font(models->system, models, file, id); } } return(did_change); @@ -2641,11 +2676,11 @@ Get_Face_ID(Application_Links *app, Buffer_ID buffer_id) if (buffer_id != 0){ Editing_File *file = imp_get_file(models, buffer_id); if (api_check_buffer(file)){ - result = file->settings.font_id; + result = file->settings.face_id; } } else{ - result = models->global_font_id; + result = models->global_face_id; } return(result); } @@ -2665,7 +2700,8 @@ Try_Create_New_Face(Application_Links *app, Face_Description *description) result = *(Face_ID*)(coroutine->in); } else{ - result = font_set_new_face(&models->font_set, description); + Face *new_face = font_set_new_face(&models->font_set, description); + result = new_face->id; } return(result); } @@ -2695,8 +2731,10 @@ API_EXPORT b32 Try_Release_Face(Application_Links *app, Face_ID id, Face_ID replacement_id) { Models *models = (Models*)app->cmd_context; - b32 success = release_font_and_update_files(models->system, models, id, replacement_id); - return(success); + Font_Set *font_set = &models->font_set; + Face *face = font_set_face_from_id(font_set, id); + Face *replacement = font_set_face_from_id(font_set, replacement_id); + return(release_font_and_update(models->system, models, face, replacement)); } API_EXPORT void @@ -2982,7 +3020,7 @@ Text_Layout_Create(Application_Links *app, Buffer_ID buffer_id, Rect_f32 rect, B if (api_check_buffer(file)){ Scratch_Block scratch(app); Arena arena = make_arena_models(models); - Face_ID face_id = file->settings.font_id; + Face *face = file_get_face(models, file); Gap_Buffer *buffer = &file->state.buffer; @@ -2993,7 +3031,7 @@ Text_Layout_Create(Application_Links *app, Buffer_ID buffer_id, Rect_f32 rect, B f32 y = -buffer_point.pixel_shift.y; for (;line_number <= line_count; line_number += 1){ - Buffer_Layout_Item_List line = file_get_line_layout(models, file, dim.x, face_id, line_number); + Buffer_Layout_Item_List line = file_get_line_layout(models, file, dim.x, face, line_number); f32 next_y = y + line.height; if (next_y >= dim.y){ break; @@ -3049,13 +3087,13 @@ Text_Layout_Line_On_Screen(Application_Links *app, Text_Layout_ID layout_id, i64 if (api_check_buffer(file)){ Rect_f32 rect = layout->rect; f32 width = rect_width(rect); - Face_ID face_id = file->settings.font_id; + Face *face = file_get_face(models, file); f32 top = 0.f; f32 bot = 0.f; for (i64 line_number_it = layout->visible_line_number_range.first;; line_number_it += 1){ - Buffer_Layout_Item_List line = file_get_line_layout(models, file, width, face_id, line_number_it); + Buffer_Layout_Item_List line = file_get_line_layout(models, file, width, face, line_number_it); bot += line.height; if (line_number_it == line_number){ break; @@ -3090,13 +3128,13 @@ Text_Layout_Character_On_Screen(Application_Links *app, Text_Layout_ID layout_id Rect_f32 rect = layout->rect; f32 width = rect_width(rect); - Face_ID face_id = file->settings.font_id; + Face *face = file_get_face(models, file); f32 y = 0.f; Buffer_Layout_Item_List line = {}; for (i64 line_number_it = layout->visible_line_number_range.first;; line_number_it += 1){ - line = file_get_line_layout(models, file, width, face_id, line_number_it); + line = file_get_line_layout(models, file, width, face, line_number_it); if (line_number_it == line_number){ break; } diff --git a/4ed_app_models.h b/4ed_app_models.h index 8f7afa27..3c793feb 100644 --- a/4ed_app_models.h +++ b/4ed_app_models.h @@ -42,7 +42,7 @@ struct Models{ App_Settings settings; App_State state; - Face_ID global_font_id; + Face_ID global_face_id; Mapping mapping; Command_Binding prev_command; diff --git a/4ed_edit.cpp b/4ed_edit.cpp index e74a9cf1..4dfe52e4 100644 --- a/4ed_edit.cpp +++ b/4ed_edit.cpp @@ -143,8 +143,7 @@ edit_fix_markers(Models *models, Editing_File *file, Edit edit){ buffer_unsort_cursors( cursors, cursor_count); buffer_unsort_cursors(r_cursors, r_cursor_count); - Face *face = font_set_face_from_id(&models->font_set, file->settings.font_id); - Assert(face != 0); + Face *face = file_get_face(models, file); cursor_count = 0; r_cursor_count = 0; diff --git a/4ed_file.cpp b/4ed_file.cpp index 666c7100..5819eb35 100644 --- a/4ed_file.cpp +++ b/4ed_file.cpp @@ -51,6 +51,11 @@ file_edit_positions_pop(Editing_File *file){ //////////////////////////////// +internal Face* +file_get_face(Models *models, Editing_File *file){ + return(font_set_face_from_id(&models->font_set, file->settings.face_id)); +} + internal u32 file_get_access_flags(Editing_File *file){ u32 flags = 0; @@ -223,10 +228,7 @@ file_create_from_string(Models *models, Editing_File *file, String_Const_u8 val, file_clear_dirty_flags(file); file->attributes = attributes; - Face_ID font_id = models->global_font_id; - file->settings.font_id = font_id; - Face *face = font_set_face_from_id(&models->font_set, font_id); - Assert(face != 0); + file->settings.face_id = models->global_face_id; buffer_measure_starts(scratch, &file->state.buffer); @@ -315,41 +317,36 @@ file_get_managed_scope(Editing_File *file){ //////////////////////////////// internal Buffer_Layout_Item_List -file_get_line_layout(Models *models, Editing_File *file, f32 width, Face_ID face_id, i64 line_number){ +file_get_line_layout(Models *models, Editing_File *file, f32 width, Face *face, i64 line_number){ Buffer_Layout_Item_List result = {}; i64 line_count = buffer_line_count(&file->state.buffer); if (1 <= line_number && line_number <= line_count){ - // TODO(allen): optimization: most places that CALL this do so in a LOOP, which could HOIST - // this font_set_face_from_id call OUTSIDE of the LOOP. - Face *face = font_set_face_from_id(&models->font_set, face_id); - if (face != 0){ - Line_Layout_Key key = {}; - key.face_id = face_id; - key.face_version_number = face->version_number; - key.width = width; - key.line_number = line_number; - - Data key_data = make_data_struct(&key); - - Buffer_Layout_Item_List *list = 0; - - Table_Lookup lookup = table_lookup(&file->state.line_layout_table, key_data); - if (lookup.found_match){ - u64 val = 0; - table_read(&file->state.line_layout_table, lookup, &val); - list = (Buffer_Layout_Item_List*)IntAsPtr(val); - } - else{ - list = push_array(&file->state.cached_layouts_arena, Buffer_Layout_Item_List, 1); - Interval_i64 line_range = buffer_get_pos_range_from_line_number(&file->state.buffer, line_number); - *list = buffer_layout(&models->mem.arena, &file->state.cached_layouts_arena, - &file->state.buffer, line_range, face, width); - key_data = push_data_copy(&file->state.cached_layouts_arena, key_data); - table_insert(&file->state.line_layout_table, key_data, (u64)PtrAsInt(list)); - } - block_copy_struct(&result, list); + Line_Layout_Key key = {}; + key.face_id = face->id; + key.face_version_number = face->version_number; + key.width = width; + key.line_number = line_number; + + Data key_data = make_data_struct(&key); + + Buffer_Layout_Item_List *list = 0; + + Table_Lookup lookup = table_lookup(&file->state.line_layout_table, key_data); + if (lookup.found_match){ + u64 val = 0; + table_read(&file->state.line_layout_table, lookup, &val); + list = (Buffer_Layout_Item_List*)IntAsPtr(val); } + else{ + list = push_array(&file->state.cached_layouts_arena, Buffer_Layout_Item_List, 1); + Interval_i64 line_range = buffer_get_pos_range_from_line_number(&file->state.buffer, line_number); + *list = buffer_layout(&models->mem.arena, &file->state.cached_layouts_arena, + &file->state.buffer, line_range, face, width); + key_data = push_data_copy(&file->state.cached_layouts_arena, key_data); + table_insert(&file->state.line_layout_table, key_data, (u64)PtrAsInt(list)); + } + block_copy_struct(&result, list); } return(result); @@ -362,7 +359,7 @@ file_clear_layout_cache(Editing_File *file){ } internal Line_Shift_Vertical -file_line_shift_y(Models *models, Editing_File *file, f32 width, Face_ID face_id, i64 line_number, f32 y_delta){ +file_line_shift_y(Models *models, Editing_File *file, f32 width, Face *face, i64 line_number, f32 y_delta){ Line_Shift_Vertical result = {}; f32 line_y = 0.f; @@ -382,7 +379,7 @@ file_line_shift_y(Models *models, Editing_File *file, f32 width, Face_ID face_id line_number = 1; break; } - Buffer_Layout_Item_List line = file_get_line_layout(models, file, width, face_id, line_number); + Buffer_Layout_Item_List line = file_get_line_layout(models, file, width, face, line_number); line_y -= line.height; } if (!has_result){ @@ -395,7 +392,7 @@ file_line_shift_y(Models *models, Editing_File *file, f32 width, Face_ID face_id b32 has_result = false; i64 line_count = buffer_line_count(&file->state.buffer); for (;;line_number += 1){ - Buffer_Layout_Item_List line = file_get_line_layout(models, file, width, face_id, line_number); + Buffer_Layout_Item_List line = file_get_line_layout(models, file, width, face, line_number); f32 next_y = line_y + line.height; if (y_delta < next_y){ has_result = true; @@ -418,12 +415,12 @@ file_line_shift_y(Models *models, Editing_File *file, f32 width, Face_ID face_id } internal f32 -file_line_y_difference(Models *models, Editing_File *file, f32 width, Face_ID face_id, i64 line_a, i64 line_b){ +file_line_y_difference(Models *models, Editing_File *file, f32 width, Face *face, i64 line_a, i64 line_b){ f32 result = 0.f; if (line_a != line_b){ Interval_i64 line_range = Ii64(line_a, line_b); for (i64 i = line_range.min; i < line_range.max; i += 1){ - Buffer_Layout_Item_List line = file_get_line_layout(models, file, width, face_id, i); + Buffer_Layout_Item_List line = file_get_line_layout(models, file, width, face, i); result += line.height; } if (line_a < line_b){ @@ -434,25 +431,25 @@ file_line_y_difference(Models *models, Editing_File *file, f32 width, Face_ID fa } internal i64 -file_pos_at_relative_xy(Models *models, Editing_File *file, f32 width, Face_ID face_id, i64 base_line, Vec2_f32 relative_xy){ - Line_Shift_Vertical shift = file_line_shift_y(models, file, width, face_id, base_line, relative_xy.y); +file_pos_at_relative_xy(Models *models, Editing_File *file, f32 width, Face *face, i64 base_line, Vec2_f32 relative_xy){ + Line_Shift_Vertical shift = file_line_shift_y(models, file, width, face, base_line, relative_xy.y); relative_xy.y -= shift.y_delta; - Buffer_Layout_Item_List line = file_get_line_layout(models, file, width, face_id, shift.line); + Buffer_Layout_Item_List line = file_get_line_layout(models, file, width, face, shift.line); return(buffer_layout_nearest_pos_to_xy(line, relative_xy)); } internal Vec2_f32 -file_relative_xy_of_pos(Models *models, Editing_File *file, f32 width, Face_ID face_id, i64 base_line, i64 pos){ +file_relative_xy_of_pos(Models *models, Editing_File *file, f32 width, Face *face, i64 base_line, i64 pos){ i64 line_number = buffer_get_line_index(&file->state.buffer, pos) + 1; - Buffer_Layout_Item_List line = file_get_line_layout(models, file, width, face_id, line_number); + Buffer_Layout_Item_List line = file_get_line_layout(models, file, width, face, line_number); Vec2_f32 result = buffer_layout_xy_center_of_pos(line, pos); - result.y += file_line_y_difference(models, file, width, face_id, line_number, base_line); + result.y += file_line_y_difference(models, file, width, face, line_number, base_line); return(result); } internal Buffer_Point -file_normalize_buffer_point(Models *models, Editing_File *file, f32 width, Face_ID face_id, Buffer_Point point){ - Line_Shift_Vertical shift = file_line_shift_y(models, file, width, face_id, point.line_number, point.pixel_shift.y); +file_normalize_buffer_point(Models *models, Editing_File *file, f32 width, Face *face, Buffer_Point point){ + Line_Shift_Vertical shift = file_line_shift_y(models, file, width, face, point.line_number, point.pixel_shift.y); point.line_number = shift.line; point.pixel_shift.y -= shift.y_delta; point.pixel_shift.x = clamp_bot(0.f, point.pixel_shift.x); @@ -461,15 +458,15 @@ file_normalize_buffer_point(Models *models, Editing_File *file, f32 width, Face_ } internal Vec2_f32 -file_buffer_point_difference(Models *models, Editing_File *file, f32 width, Face_ID face_id, Buffer_Point a, Buffer_Point b){ - f32 y_difference = file_line_y_difference(models, file, width, face_id, a.line_number, b.line_number); +file_buffer_point_difference(Models *models, Editing_File *file, f32 width, Face *face, Buffer_Point a, Buffer_Point b){ + f32 y_difference = file_line_y_difference(models, file, width, face, a.line_number, b.line_number); Vec2_f32 result = a.pixel_shift - b.pixel_shift; result.y += y_difference; return(result); } internal Line_Shift_Character -file_line_shift_characters(Models *models, Editing_File *file, f32 width, Face_ID face_id, i64 line_number, i64 character_delta){ +file_line_shift_characters(Models *models, Editing_File *file, f32 width, Face *face, i64 line_number, i64 character_delta){ Line_Shift_Character result = {}; i64 line_character = 0; @@ -489,7 +486,7 @@ file_line_shift_characters(Models *models, Editing_File *file, f32 width, Face_I line_number = 1; break; } - Buffer_Layout_Item_List line = file_get_line_layout(models, file, width, face_id, line_number); + Buffer_Layout_Item_List line = file_get_line_layout(models, file, width, face, line_number); line_character -= line.character_count; } if (!has_result){ @@ -502,7 +499,7 @@ file_line_shift_characters(Models *models, Editing_File *file, f32 width, Face_I b32 has_result = false; i64 line_count = buffer_line_count(&file->state.buffer); for (;;line_number += 1){ - Buffer_Layout_Item_List line = file_get_line_layout(models, file, width, face_id, line_number); + Buffer_Layout_Item_List line = file_get_line_layout(models, file, width, face, line_number); i64 next_character = line_character + line.character_count; if (character_delta < next_character){ has_result = true; @@ -525,12 +522,12 @@ file_line_shift_characters(Models *models, Editing_File *file, f32 width, Face_I } internal i64 -file_line_character_difference(Models *models, Editing_File *file, f32 width, Face_ID face_id, i64 line_a, i64 line_b){ +file_line_character_difference(Models *models, Editing_File *file, f32 width, Face *face, i64 line_a, i64 line_b){ i64 result = 0; if (line_a != line_b){ Interval_i64 line_range = Ii64(line_a, line_b); for (i64 i = line_range.min; i < line_range.max; i += 1){ - Buffer_Layout_Item_List line = file_get_line_layout(models, file, width, face_id, i); + Buffer_Layout_Item_List line = file_get_line_layout(models, file, width, face, i); result += line.character_count; } if (line_a < line_b){ @@ -541,19 +538,19 @@ file_line_character_difference(Models *models, Editing_File *file, f32 width, Fa } internal i64 -file_pos_from_relative_character(Models *models, Editing_File *file, f32 width, Face_ID face_id, i64 base_line, i64 relative_character){ - Line_Shift_Character shift = file_line_shift_characters(models, file, width, face_id, base_line, relative_character); +file_pos_from_relative_character(Models *models, Editing_File *file, f32 width, Face *face, i64 base_line, i64 relative_character){ + Line_Shift_Character shift = file_line_shift_characters(models, file, width, face, base_line, relative_character); relative_character -= shift.character_delta; - Buffer_Layout_Item_List line = file_get_line_layout(models, file, width, face_id, shift.line); + Buffer_Layout_Item_List line = file_get_line_layout(models, file, width, face, shift.line); return(buffer_layout_get_pos_at_character(line, relative_character)); } internal i64 -file_relative_character_from_pos(Models *models, Editing_File *file, f32 width, Face_ID face_id, i64 base_line, i64 pos){ +file_relative_character_from_pos(Models *models, Editing_File *file, f32 width, Face *face, i64 base_line, i64 pos){ i64 line_number = buffer_get_line_index(&file->state.buffer, pos) + 1; - Buffer_Layout_Item_List line = file_get_line_layout(models, file, width, face_id, line_number); + Buffer_Layout_Item_List line = file_get_line_layout(models, file, width, face, line_number); i64 result = buffer_layout_character_from_pos(line, pos); - result += file_line_character_difference(models, file, width, face_id, line_number, base_line); + result += file_line_character_difference(models, file, width, face, line_number, base_line); return(result); } diff --git a/4ed_file.h b/4ed_file.h index 3472023d..7d494fe7 100644 --- a/4ed_file.h +++ b/4ed_file.h @@ -37,7 +37,7 @@ struct Editing_File_Settings{ i32 base_map_id; Parse_Context_ID parse_context_id; b32 dos_write_mode; - Face_ID font_id; + Face_ID face_id; b8 tokens_exist; b8 tokens_without_strings; b8 is_initialized; diff --git a/4ed_font_set.cpp b/4ed_font_set.cpp index c9c1c6cb..67529a5d 100644 --- a/4ed_font_set.cpp +++ b/4ed_font_set.cpp @@ -75,23 +75,22 @@ font_set_init(System_Functions *system, Font_Set *set){ set->id_to_slot_table = make_table_u64_u64(set->arena.base_allocator, 40); } -internal Face_ID +internal Face* font_set_new_face(Font_Set *set, Face_Description *description){ - Face_ID result = 0; Arena arena = make_arena_system(set->system); Face *face = set->system->font_make_face(&arena, description); if (face != 0){ Font_Face_Slot *slot = font_set__alloc_face_slot(set); slot->arena = arena; slot->face = face; - result = font_set__alloc_face_id(set); - face->id = result; - table_insert(&set->id_to_slot_table, result, (u64)slot); + Face_ID new_id = font_set__alloc_face_id(set); + face->id = new_id; + table_insert(&set->id_to_slot_table, new_id, (u64)slot); } else{ linalloc_clear(&arena); } - return(result); + return(face); } internal Font_Face_Slot* diff --git a/4ed_render_target.cpp b/4ed_render_target.cpp index 40f98a7b..2b67d14f 100644 --- a/4ed_render_target.cpp +++ b/4ed_render_target.cpp @@ -226,14 +226,6 @@ draw_font_glyph(Render_Target *target, Face *face, u32 codepoint, f32 x, f32 y, draw__write_vertices_in_current_group(target, vertices, 6); } -internal void -draw_font_glyph(Render_Target *target, Font_Set *font_set, Face_ID face_id, u32 codepoint, f32 x, f32 y, u32 color, u32 flags){ - Face *face = font_set_face_from_id(font_set, face_id); - if (face != 0){ - draw_font_glyph(target, face, codepoint, x, y, color, flags); - } -} - //////////////////////////////// internal void diff --git a/4ed_text_layout.cpp b/4ed_text_layout.cpp index 5b05f237..3f6b0f7b 100644 --- a/4ed_text_layout.cpp +++ b/4ed_text_layout.cpp @@ -88,8 +88,7 @@ text_layout_render(Models *models, Text_Layout *layout){ Arena *scratch = &models->mem.arena; Render_Target *target = models->target; Color_Table color_table = models->color_table; - Font_Set *font_set = &models->font_set; - Face_ID font_id = file->settings.font_id; + Face *face = file_get_face(models, file); f32 width = rect_width(layout->rect); u32 special_color = color_table.vals[Stag_Special_Character]; @@ -100,7 +99,7 @@ text_layout_render(Models *models, Text_Layout *layout){ i64 line_number = layout->visible_line_number_range.min; i64 line_number_last = layout->visible_line_number_range.max; for (;line_number <= line_number_last; line_number += 1){ - Buffer_Layout_Item_List line = file_get_line_layout(models, file, width, font_id, line_number); + Buffer_Layout_Item_List line = file_get_line_layout(models, file, width, face, line_number); for (Buffer_Layout_Item_Block *block = line.first; block != 0; block = block->next){ @@ -127,7 +126,7 @@ text_layout_render(Models *models, Text_Layout *layout){ } Vec2_f32 p = item->rect.p0 + shift_p; - draw_font_glyph(target, font_set, font_id, item->codepoint, p.x, p.y, color, GlyphFlag_None); + draw_font_glyph(target, face, item->codepoint, p.x, p.y, color, GlyphFlag_None); } } } diff --git a/4ed_view.cpp b/4ed_view.cpp index 8dcc2c44..1d923e2b 100644 --- a/4ed_view.cpp +++ b/4ed_view.cpp @@ -123,7 +123,7 @@ view_height(Models *models, View *view){ internal Buffer_Layout_Item_List view_get_line_layout(Models *models, View *view, i64 line_number){ Editing_File *file = view->file; - Face_ID face = file->settings.font_id; + Face *face = file_get_face(models, file); f32 width = view_width(models, view); return(file_get_line_layout(models, file, width, face, line_number)); } @@ -131,7 +131,7 @@ view_get_line_layout(Models *models, View *view, i64 line_number){ internal Line_Shift_Vertical view_line_shift_y(Models *models, View *view, i64 line_number, f32 y_delta){ Editing_File *file = view->file; - Face_ID face = file->settings.font_id; + Face *face = file_get_face(models, file); f32 width = view_width(models, view); return(file_line_shift_y(models, file, width, face, line_number, y_delta)); } @@ -139,7 +139,7 @@ view_line_shift_y(Models *models, View *view, i64 line_number, f32 y_delta){ internal f32 view_line_y_difference(Models *models, View *view, i64 line_a, i64 line_b){ Editing_File *file = view->file; - Face_ID face = file->settings.font_id; + Face *face = file_get_face(models, file); f32 width = view_width(models, view); return(file_line_y_difference(models, file, width, face, line_a, line_b)); } @@ -147,7 +147,7 @@ view_line_y_difference(Models *models, View *view, i64 line_a, i64 line_b){ internal i64 view_pos_at_relative_xy(Models *models, View *view, i64 base_line, Vec2_f32 relative_xy){ Editing_File *file = view->file; - Face_ID face = file->settings.font_id; + Face *face = file_get_face(models, file); f32 width = view_width(models, view); return(file_pos_at_relative_xy(models, file, width, face, base_line, relative_xy)); } @@ -155,7 +155,7 @@ view_pos_at_relative_xy(Models *models, View *view, i64 base_line, Vec2_f32 rela internal Vec2_f32 view_relative_xy_of_pos(Models *models, View *view, i64 base_line, i64 pos){ Editing_File *file = view->file; - Face_ID face = file->settings.font_id; + Face *face = file_get_face(models, file); f32 width = view_width(models, view); return(file_relative_xy_of_pos(models, file, width, face, base_line, pos)); } @@ -163,7 +163,7 @@ view_relative_xy_of_pos(Models *models, View *view, i64 base_line, i64 pos){ internal Buffer_Point view_normalize_buffer_point(Models *models, View *view, Buffer_Point point){ Editing_File *file = view->file; - Face_ID face = file->settings.font_id; + Face *face = file_get_face(models, file); f32 width = view_width(models, view); return(file_normalize_buffer_point(models, file, width, face, point)); } @@ -171,7 +171,7 @@ view_normalize_buffer_point(Models *models, View *view, Buffer_Point point){ internal Vec2_f32 view_buffer_point_difference(Models *models, View *view, Buffer_Point a, Buffer_Point b){ Editing_File *file = view->file; - Face_ID face = file->settings.font_id; + Face *face = file_get_face(models, file); f32 width = view_width(models, view); return(file_buffer_point_difference(models, file, width, face, a, b)); } @@ -188,7 +188,7 @@ view_move_buffer_point(Models *models, View *view, Buffer_Point buffer_point, Ve internal Line_Shift_Character view_line_shift_characters(Models *models, View *view, i64 line_number, i64 character_delta){ Editing_File *file = view->file; - Face_ID face = file->settings.font_id; + Face *face = file_get_face(models, file); f32 width = view_width(models, view); return(file_line_shift_characters(models, file, width, face, line_number, character_delta)); } @@ -196,7 +196,7 @@ view_line_shift_characters(Models *models, View *view, i64 line_number, i64 char internal i64 view_line_character_difference(Models *models, View *view, i64 line_a, i64 line_b){ Editing_File *file = view->file; - Face_ID face = file->settings.font_id; + Face *face = file_get_face(models, file); f32 width = view_width(models, view); return(file_line_character_difference(models, file, width, face, line_a, line_b)); } @@ -204,7 +204,7 @@ view_line_character_difference(Models *models, View *view, i64 line_a, i64 line_ internal i64 view_pos_from_relative_character(Models *models, View *view, i64 base_line, i64 relative_character){ Editing_File *file = view->file; - Face_ID face = file->settings.font_id; + Face *face = file_get_face(models, file); f32 width = view_width(models, view); return(file_pos_from_relative_character(models, file, width, face, base_line, relative_character)); } @@ -212,11 +212,17 @@ view_pos_from_relative_character(Models *models, View *view, i64 base_line, i64 internal i64 view_relative_character_from_pos(Models *models, View *view, i64 base_line, i64 pos){ Editing_File *file = view->file; - Face_ID face = file->settings.font_id; + Face *face = file_get_face(models, file); f32 width = view_width(models, view); return(file_relative_character_from_pos(models, file, width, face, base_line, pos)); } +internal Buffer_Cursor +view_compute_cursor(View *view, Buffer_Seek seek){ + Editing_File *file = view->file; + return(file_compute_cursor(file, seek)); +} + //////////////////////////////// internal Interval_f32 @@ -247,16 +253,15 @@ view_safety_margin(f32 view_width, f32 acceptable_y_height, f32 line_height, f32 internal b32 view_move_view_to_cursor(Models *models, View *view, Buffer_Scroll *scroll){ Editing_File *file = view->file; - Face_ID face_id = file->settings.font_id; + Face *face = file_get_face(models, file); Rect_f32 rect = view_get_buffer_rect(models, view); Vec2_f32 view_dim = rect_dim(rect); File_Edit_Positions edit_pos = view_get_edit_pos(view); - Vec2_f32 p = file_relative_xy_of_pos(models, file, view_dim.x, face_id, scroll->target.line_number, + Vec2_f32 p = file_relative_xy_of_pos(models, file, view_dim.x, face, scroll->target.line_number, edit_pos.cursor_pos); p -= scroll->target.pixel_shift; - Face *face = font_set_face_from_id(&models->font_set, face_id); f32 line_height = face->height; f32 typical_advance = face->typical_advance; Interval_f32 acceptable_y = view_acceptable_y(view_dim.y, line_height); @@ -286,14 +291,13 @@ view_move_view_to_cursor(Models *models, View *view, Buffer_Scroll *scroll){ internal b32 view_move_cursor_to_view(Models *models, View *view, Buffer_Scroll scroll, i64 *pos_in_out, f32 preferred_x){ Editing_File *file = view->file; - Face_ID face_id = file->settings.font_id; + Face *face = file_get_face(models, file); Rect_f32 rect = view_get_buffer_rect(models, view); Vec2_f32 view_dim = rect_dim(rect); - Vec2_f32 p = file_relative_xy_of_pos(models, file, view_dim.x, face_id, scroll.target.line_number, *pos_in_out); + Vec2_f32 p = file_relative_xy_of_pos(models, file, view_dim.x, face, scroll.target.line_number, *pos_in_out); p -= scroll.target.pixel_shift; - Face *face = font_set_face_from_id(&models->font_set, face_id); f32 line_height = face->height; Interval_f32 acceptable_y = view_acceptable_y(view_dim.y, line_height); Vec2_f32 safety = view_safety_margin(view_dim.x, range_size(acceptable_y), @@ -313,28 +317,17 @@ view_move_cursor_to_view(Models *models, View *view, Buffer_Scroll scroll, i64 * b32 result = false; if (adjusted_y){ p += scroll.target.pixel_shift; - *pos_in_out = file_pos_at_relative_xy(models, file, view_dim.x, face_id, scroll.target.line_number, p); + *pos_in_out = file_pos_at_relative_xy(models, file, view_dim.x, face, scroll.target.line_number, p); result = true; } return(result); } -internal void -view_set_preferred_x_to_current_position(Models *models, View *view){ - view->preferred_x = 0.f; -#if 0 - File_Edit_Positions edit_pos = view_get_edit_pos(view); - Full_Cursor cursor = file_compute_cursor(models, view->file, seek_pos(edit_pos.cursor_pos)); - view_set_preferred_x(view, cursor); -#endif -} - internal void view_set_cursor(Models *models, View *view, i64 pos){ File_Edit_Positions edit_pos = view_get_edit_pos(view); file_edit_positions_set_cursor(&edit_pos, pos); - view->preferred_x = 0.f; view_set_edit_pos(view, edit_pos); Buffer_Scroll scroll = edit_pos.scroll; if (view_move_view_to_cursor(models, view, &scroll)){ @@ -390,10 +383,9 @@ view_set_file(System_Functions *system, Models *models, View *view, Editing_File File_Edit_Positions edit_pos = file_edit_positions_pop(file); view_set_edit_pos(view, edit_pos); view->mark = edit_pos.cursor_pos; - view_set_preferred_x_to_current_position(models, view); - - Face *face = font_set_face_from_id(&models->font_set, file->settings.font_id); - Assert(face != 0); + Buffer_Cursor cursor = view_compute_cursor(view, seek_pos(edit_pos.cursor_pos)); + Vec2_f32 p = view_relative_xy_of_pos(models, view, cursor.line, edit_pos.cursor_pos); + view->preferred_x = p.x; models->layout.panel_state_dirty = true; } @@ -430,38 +422,32 @@ adjust_views_looking_at_file_to_new_cursor(System_Functions *system, Models *mod } internal void -file_set_font(System_Functions *system, Models *models, Editing_File *file, Face_ID font_id){ - file->settings.font_id = font_id; -} - -internal void -global_set_font_and_update_files(System_Functions *system, Models *models, Face_ID font_id){ +global_set_font_and_update_files(System_Functions *system, Models *models, Face *new_global_face){ for (Node *node = models->working_set.active_file_sentinel.next; node != &models->working_set.active_file_sentinel; node = node->next){ Editing_File *file = CastFromMember(Editing_File, main_chain_node, node); - file_set_font(system, models, file, font_id); + file->settings.face_id = new_global_face->id; } - models->global_font_id = font_id; + models->global_face_id = new_global_face->id; } internal b32 -release_font_and_update_files(System_Functions *system, Models *models, Face_ID font_id, Face_ID replacement_id){ +release_font_and_update(System_Functions *system, Models *models, Face *face, Face *replacement_face){ b32 success = false; - if (font_set_release_face(&models->font_set, font_id)){ - Face *face = font_set_face_from_id(&models->font_set, replacement_id); - if (face == 0){ - replacement_id = font_set_get_fallback_face(&models->font_set); - Assert(font_set_face_from_id(&models->font_set, replacement_id) != 0); - } + Assert(replacement_face != 0 && replacement_face != face); + if (font_set_release_face(&models->font_set, face->id)){ for (Node *node = models->working_set.active_file_sentinel.next; node != &models->working_set.active_file_sentinel; node = node->next){ Editing_File *file = CastFromMember(Editing_File, main_chain_node, node); - if (file->settings.font_id == font_id){ - file_set_font(system, models, file, replacement_id); + if (file->settings.face_id == face->id){ + file->settings.face_id = replacement_face->id; } } + if (models->global_face_id == face->id){ + models->global_face_id = replacement_face->id; + } success = true; } return(success); diff --git a/4ed_view.h b/4ed_view.h index e26f27a6..9dae4518 100644 --- a/4ed_view.h +++ b/4ed_view.h @@ -13,8 +13,8 @@ #define FRED_VIEW_H struct View{ - struct View *next; - struct View *prev; + View *next; + View *prev; struct Panel *panel; b32 in_use; @@ -25,10 +25,6 @@ struct View{ i64 mark; f32 preferred_x; - // TODO(allen): ELIMINATE THESE - i32 temp_view_top_left_pos; - i32 temp_view_top_left_target_pos; - b8 new_scroll_target; b8 ui_mode; @@ -52,78 +48,6 @@ struct Live_Views{ i32 max; }; -enum{ - GROW_FAILED, - GROW_NOT_NEEDED, - GROW_SUCCESS, -}; - -struct Wrap_Indent_Pair{ - i32 wrap_position; - f32 line_shift; -}; - -struct Potential_Wrap_Indent_Pair{ - i32 wrap_position; - f32 line_shift; - - f32 wrap_x; - i32 wrappable_score; - - b32 adjust_top_to_this; -}; - -struct Shift_Information{ - i32 start; - i32 end; - i32 amount; -}; - -struct File_Bar{ - Vec2 pos; - Vec2 text_shift; - i32_Rect rect; - Face_ID font_id; -}; - -#if 0 -struct Style_Color_Edit{ - Style_Tag target; - Style_Tag fore; - Style_Tag back; - String_Const_u8 text; -}; -#endif - -struct Single_Line_Input_Step{ - b8 hit_newline; - b8 hit_ctrl_newline; - b8 hit_a_character; - b8 hit_backspace; - b8 hit_esc; - b8 made_a_change; - b8 did_command; - b8 no_file_match; -}; - -enum Single_Line_Input_Type{ - SINGLE_LINE_STRING, - SINGLE_LINE_FILE -}; - -struct Single_Line_Mode{ - Single_Line_Input_Type type; - String_Const_u8 *string; - Hot_Directory *hot_directory; - b32 fast_folder_select; -}; - -struct View_Step_Result{ - b32 animating; - b32 consume_keys; - b32 consume_esc; -}; - #endif // BOTTOM