4coder/fusion/4coder_fusion.cpp

372 lines
14 KiB
C++

/*
4coder_fusion.cpp - 4coder major mode
*/
// TOP
#include "4coder_default_include.cpp"
////////////////////////////////
// NOTE(allen): Users can declare their own managed IDs here.
CUSTOM_ID(command_map, fusion_map_command);
CUSTOM_ID(command_map, fusion_map_insert);
////////////////////////////////
#if !defined(META_PASS)
#include "generated/managed_id_metadata.cpp"
#endif
////////////////////////////////
typedef i32 Fusion_Mode;
enum{
FusionMode_Command,
FusionMode_Insert,
};
Fusion_Mode fusion_mode = FusionMode_Command;
////////////////////////////////
function void
fusion_set_mode(Fusion_Mode mode){
local_persist ARGB_Color col_margin = finalize_color(defcolor_margin, 0);
local_persist ARGB_Color col_margin_hover = finalize_color(defcolor_margin_hover, 0);
local_persist ARGB_Color col_margin_active = finalize_color(defcolor_margin_active, 0);
local_persist ARGB_Color col_back = finalize_color(defcolor_back, 0);
fusion_mode = mode;
switch (mode){
case FusionMode_Command:
{
col_margin = finalize_color(defcolor_margin, 0);
col_margin_hover = finalize_color(defcolor_margin_hover, 0);
col_margin_active = finalize_color(defcolor_margin_active, 0);
global_config.highlight_line_at_cursor = true;
global_config.mark_thickness = 2.f;
set_single_active_color(defcolor_margin, col_back);
set_single_active_color(defcolor_margin_hover, col_back);
set_single_active_color(defcolor_margin_active, col_back);
}break;
case FusionMode_Insert:
{
global_config.highlight_line_at_cursor = false;
global_config.mark_thickness = 0.f;
set_single_active_color(defcolor_margin, col_margin);
set_single_active_color(defcolor_margin_hover, col_margin_hover);
set_single_active_color(defcolor_margin_active, col_margin_active);
}break;
}
}
CUSTOM_COMMAND_SIG(fusion_toggle_mode)
CUSTOM_DOC("TODO - document fusion mode")
{
if (fusion_mode == FusionMode_Command){
fusion_set_mode(FusionMode_Insert);
}
else{
fusion_set_mode(FusionMode_Command);
}
}
CUSTOM_COMMAND_SIG(fusion_input_handler)
CUSTOM_DOC("TODO - document fusion mode")
{
Scratch_Block scratch(app);
default_input_handler_init(app, scratch);
View_ID view = get_this_ctx_view(app, Access_Always);
Managed_Scope scope = view_get_managed_scope(app, view);
for (;;){
// NOTE(allen): Get input
User_Input input = get_next_input(app, EventPropertyGroup_Any, 0);
ProfileScopeNamed(app, "before view input", view_input_profile);
if (input.abort){
break;
}
// NOTE(allen): Get map_id
Command_Map_ID map_id = fusion_map_command;
if (fusion_mode == FusionMode_Insert){
map_id = fusion_map_insert;
}
// NOTE(allen): Get binding
Command_Binding binding = map_get_binding_recursive(&framework_mapping, map_id, &input.event);
if (binding.custom == 0){
leave_current_input_unhandled(app);
continue;
}
// NOTE(allen): Run the command
default_pre_command(app, scope);
ProfileCloseNow(view_input_profile);
binding.custom(app);
ProfileScope(app, "after view input");
default_post_command(app, scope);
}
}
////////////////////////////////
CUSTOM_COMMAND_SIG(fusion_return)
CUSTOM_DOC("TODO")
{
View_ID view = get_active_view(app, Access_ReadVisible);
Buffer_ID buffer = view_get_buffer(app, view, Access_ReadWriteVisible);
if (buffer == 0){
buffer = view_get_buffer(app, view, Access_ReadVisible);
if (buffer != 0){
goto_jump_at_cursor(app);
lock_jump_buffer(app, buffer);
}
}
else{
write_text(app, string_u8_litexpr("\n"));
}
}
CUSTOM_COMMAND_SIG(fusion_return_shift)
CUSTOM_DOC("TODO")
{
View_ID view = get_active_view(app, Access_ReadVisible);
Buffer_ID buffer = view_get_buffer(app, view, Access_ReadWriteVisible);
if (buffer == 0){
buffer = view_get_buffer(app, view, Access_ReadVisible);
if (buffer != 0){
goto_jump_at_cursor_same_panel(app);
lock_jump_buffer(app, buffer);
}
}
else{
write_text(app, string_u8_litexpr("\n"));
}
}
function b32
string_is_blank(String_Const_u8 string){
b32 is_blank = true;
for (u64 i = 0; i < string.size; i += 1){
if (!character_is_whitespace(string.str[i])){
is_blank = false;
break;
}
}
return(is_blank);
}
CUSTOM_COMMAND_SIG(fusion_backspace)
CUSTOM_DOC("TODO")
{
View_ID view = get_active_view(app, Access_ReadWriteVisible);
if (view != 0){
Scratch_Block scratch(app);
Buffer_ID buffer = view_get_buffer(app, view, Access_ReadWrite);
i64 pos = view_get_cursor_pos(app, view);
i64 line_number = get_line_number_from_pos(app, buffer, pos);
Buffer_Cursor beginning_of_line = get_line_side(app, buffer, line_number, Side_Min);
Range_i64 range = Ii64(beginning_of_line.pos, pos);
String_Const_u8 string = push_buffer_range(app, scratch, buffer, range);
if (string_is_blank(string)){
if (line_number > 1){
Buffer_Cursor end_of_prev_line = get_line_side(app, buffer, line_number - 1, Side_Max);
range.min = end_of_prev_line.pos;
}
buffer_replace_range(app, buffer, range, string_u8_litexpr(""));
}
else{
current_view_boundary_delete(app, Scan_Backward,
push_boundary_list(scratch, boundary_alpha_numeric, boundary_token,
boundary_non_whitespace));
}
}
}
CUSTOM_COMMAND_SIG(fusion_delete)
CUSTOM_DOC("TODO")
{
View_ID view = get_active_view(app, Access_ReadWriteVisible);
if (view != 0){
Scratch_Block scratch(app);
Buffer_ID buffer = view_get_buffer(app, view, Access_ReadWrite);
i64 pos = view_get_cursor_pos(app, view);
i64 line_number = get_line_number_from_pos(app, buffer, pos);
Buffer_Cursor end_of_line = get_line_side(app, buffer, line_number, Side_Max);
Range_i64 range = Ii64(pos, end_of_line.pos);
String_Const_u8 string = push_buffer_range(app, scratch, buffer, range);
if (string_is_blank(string)){
i64 line_count = buffer_get_line_count(app, buffer);
if (line_number < line_count){
Buffer_Cursor beginning_of_prev_line = get_line_side(app, buffer, line_number + 1, Side_Min);
range.max = beginning_of_prev_line.pos;
}
buffer_replace_range(app, buffer, range, string_u8_litexpr(""));
}
else{
current_view_boundary_delete(app, Scan_Forward,
push_boundary_list(scratch, boundary_alpha_numeric, boundary_token,
boundary_non_whitespace));
}
}
}
////////////////////////////////
function void
setup_fusion_mapping(Mapping *mapping){
MappingScope();
SelectMapping(mapping);
SelectMap(mapid_global);
BindCore(default_startup, CoreCode_Startup);
BindCore(default_try_exit, CoreCode_TryExit);
BindCore(clipboard_record_clip, CoreCode_NewClipboardContents);
Bind(exit_4coder, KeyCode_F4, KeyCode_Alt);
Bind(project_fkey_command, KeyCode_F1);
Bind(project_fkey_command, KeyCode_F2);
Bind(project_fkey_command, KeyCode_F3);
Bind(project_fkey_command, KeyCode_F4);
Bind(project_fkey_command, KeyCode_F5);
Bind(project_fkey_command, KeyCode_F6);
Bind(project_fkey_command, KeyCode_F7);
Bind(project_fkey_command, KeyCode_F8);
Bind(project_fkey_command, KeyCode_F9);
Bind(project_fkey_command, KeyCode_F10);
Bind(project_fkey_command, KeyCode_F11);
Bind(project_fkey_command, KeyCode_F12);
Bind(project_fkey_command, KeyCode_F13);
Bind(project_fkey_command, KeyCode_F14);
Bind(project_fkey_command, KeyCode_F15);
Bind(project_fkey_command, KeyCode_F16);
Bind(fusion_toggle_mode, KeyCode_Insert);
Bind(fusion_toggle_mode, KeyCode_Escape);
BindMouseWheel(mouse_wheel_scroll);
BindMouseWheel(mouse_wheel_change_face_size, KeyCode_Control);
BindMouse(click_set_cursor_and_mark, MouseCode_Left);
BindMouseRelease(click_set_cursor, MouseCode_Left);
BindCore(click_set_cursor_and_mark, CoreCode_ClickActivateView);
BindMouseMove(click_set_cursor_if_lbutton);
SelectMap(fusion_map_command);
ParentMap(mapid_global);
Bind(set_mark, KeyCode_Space);
Bind(move_up, KeyCode_Up);
Bind(move_down, KeyCode_Down);
Bind(move_line_up, KeyCode_Up, KeyCode_Shift);
Bind(move_line_down, KeyCode_Down, KeyCode_Shift);
Bind(move_left_alpha_numeric_boundary, KeyCode_Left);
Bind(move_right_alpha_numeric_boundary, KeyCode_Right);
Bind(move_left_alpha_numeric_or_camel_boundary, KeyCode_Left, KeyCode_Shift);
Bind(move_right_alpha_numeric_or_camel_boundary, KeyCode_Right, KeyCode_Shift);
Bind(seek_end_of_line, KeyCode_End);
Bind(seek_beginning_of_line, KeyCode_Home);
Bind(page_up, KeyCode_PageUp);
Bind(page_down, KeyCode_PageDown);
Bind(fusion_backspace, KeyCode_Backspace);
Bind(fusion_delete, KeyCode_Delete);
Bind(snipe_backward_whitespace_or_token_boundary, KeyCode_Backspace, KeyCode_Shift);
Bind(snipe_forward_whitespace_or_token_boundary, KeyCode_Delete, KeyCode_Shift);
Bind(fusion_return, KeyCode_Return);
Bind(fusion_return_shift, KeyCode_Return, KeyCode_Shift);
Bind(change_active_panel, KeyCode_Comma);
Bind(change_active_panel_backwards, KeyCode_Comma, KeyCode_Shift);
Bind(change_to_build_panel, KeyCode_Period);
Bind(close_build_panel, KeyCode_Period, KeyCode_Shift);
Bind(comment_line_toggle, KeyCode_Semicolon);
Bind(keyboard_macro_start_recording , KeyCode_Control);
Bind(keyboard_macro_finish_recording, KeyCode_Alt);
Bind(keyboard_macro_replay, KeyCode_U);
Bind(interactive_open_or_new, KeyCode_O);
Bind(interactive_switch_buffer, KeyCode_I);
Bind(goto_next_jump, KeyCode_N);
Bind(goto_prev_jump, KeyCode_N, KeyCode_Shift);
Bind(goto_first_jump, KeyCode_M);
Bind(command_lister, KeyCode_X);
Bind(jump_to_last_point, KeyCode_P);
Bind(replace_in_range, KeyCode_A);
Bind(copy, KeyCode_C);
Bind(paste_next_and_indent, KeyCode_V);
Bind(delete_range, KeyCode_D);
Bind(delete_line, KeyCode_D, KeyCode_Shift);
Bind(center_view, KeyCode_E);
Bind(search, KeyCode_F);
Bind(list_all_substring_locations_case_insensitive, KeyCode_S);
Bind(goto_line, KeyCode_G);
Bind(snippet_lister, KeyCode_J);
Bind(kill_buffer, KeyCode_K, KeyCode_Shift);
Bind(duplicate_line, KeyCode_L);
Bind(query_replace, KeyCode_Q);
Bind(query_replace_identifier, KeyCode_Q, KeyCode_Shift);
Bind(list_all_locations_of_identifier, KeyCode_T);
Bind(redo, KeyCode_Y);
Bind(undo, KeyCode_Z);
Bind(jump_to_definition_at_cursor, KeyCode_W);
Bind(view_buffer_other_panel, KeyCode_1);
Bind(swap_panels, KeyCode_2);
Bind(open_matching_file_cpp, KeyCode_3);
Bind(write_zero_struct, KeyCode_0);
Bind(open_long_braces, KeyCode_LeftBracket);
Bind(open_long_braces_semicolon, KeyCode_LeftBracket, KeyCode_Shift);
Bind(open_long_braces_break, KeyCode_RightBracket, KeyCode_Shift);
Bind(select_surrounding_scope, KeyCode_RightBracket);
Bind(select_prev_top_most_scope, KeyCode_Quote);
Bind(select_next_scope_after_current, KeyCode_ForwardSlash);
Bind(place_in_scope, KeyCode_ForwardSlash, KeyCode_Shift);
Bind(delete_current_scope, KeyCode_Minus);
Bind(if0_off, KeyCode_9, KeyCode_Alt);
SelectMap(fusion_map_insert);
ParentMap(mapid_global);
BindTextInput(write_text_and_auto_indent);
Bind(move_up, KeyCode_Up);
Bind(move_down, KeyCode_Down);
Bind(move_left, KeyCode_Left);
Bind(move_right, KeyCode_Right);
Bind(delete_char, KeyCode_Delete);
Bind(backspace_char, KeyCode_Backspace);
Bind(seek_end_of_line, KeyCode_End);
Bind(seek_beginning_of_line, KeyCode_Home);
Bind(move_up_to_blank_line_end, KeyCode_PageUp);
Bind(move_down_to_blank_line_end, KeyCode_PageDown);
Bind(word_complete, KeyCode_Tab);
}
void
custom_layer_init(Application_Links *app){
Thread_Context *tctx = get_thread_context(app);
// NOTE(allen): setup for default framework
default_framework_init(app);
// NOTE(allen): default hooks and command maps
set_all_default_hooks(app);
set_custom_hook(app, HookID_ViewEventHandler, fusion_input_handler);
mapping_init(tctx, &framework_mapping);
setup_fusion_mapping(&framework_mapping);
}
// BOTTOM