fixed extra scrolling when switching files

This commit is contained in:
Allen Webster 2016-05-11 22:15:54 -04:00
parent 654ae784e2
commit 6be352e775
9 changed files with 309 additions and 168 deletions

View File

@ -177,7 +177,6 @@ enum Command_ID{
cmdid_paste, cmdid_paste,
cmdid_paste_next, cmdid_paste_next,
cmdid_delete_range, cmdid_delete_range,
cmdid_timeline_scrub,
cmdid_undo, cmdid_undo,
cmdid_redo, cmdid_redo,
cmdid_history_backward, cmdid_history_backward,

View File

@ -15,66 +15,6 @@ enum My_Maps{
my_maps_count my_maps_count
}; };
HOOK_SIG(my_start){
exec_command(app, cmdid_open_panel_vsplit);
exec_command(app, cmdid_change_active_panel);
app->change_theme(app, literal("4coder"));
app->change_font(app, literal("liberation sans"));
// Theme options:
// "4coder"
// "Handmade Hero"
// "Twilight"
// "Woverine"
// "stb"
// Font options:
// "liberation sans"
// "liberation mono"
// "hack"
// "cutive mono"
// "inconsolata"
// no meaning for return
return(0);
}
HOOK_SIG(my_file_settings){
// NOTE(allen|a4): In hooks that want parameters, such as this file
// opened hook. The file created hook is guaranteed to have only
// and exactly one buffer parameter. In normal command callbacks
// there are no parameter buffers.
Buffer_Summary buffer = app->get_parameter_buffer(app, 0);
assert(buffer.exists);
int treat_as_code = 0;
int wrap_lines = 1;
if (buffer.file_name && buffer.size < (16 << 20)){
String ext = file_extension(make_string(buffer.file_name, buffer.file_name_len));
if (match(ext, make_lit_string("cpp"))) treat_as_code = 1;
else if (match(ext, make_lit_string("h"))) treat_as_code = 1;
else if (match(ext, make_lit_string("c"))) treat_as_code = 1;
else if (match(ext, make_lit_string("hpp"))) treat_as_code = 1;
}
if (treat_as_code){
wrap_lines = 0;
}
if (buffer.file_name[0] == '*'){
wrap_lines = 0;
}
push_parameter(app, par_lex_as_cpp_file, treat_as_code);
push_parameter(app, par_wrap_lines, wrap_lines);
push_parameter(app, par_key_mapid, (treat_as_code)?((int)my_code_map):((int)mapid_file));
exec_command(app, cmdid_set_settings);
// no meaning for return
return(0);
}
CUSTOM_COMMAND_SIG(write_allen_todo){ CUSTOM_COMMAND_SIG(write_allen_todo){
write_string(app, make_lit_string("// TODO(allen): ")); write_string(app, make_lit_string("// TODO(allen): "));
} }
@ -265,17 +205,70 @@ CUSTOM_COMMAND_SIG(ruin_theme){
} }
#endif #endif
int get_bindings(void *data, int size){ HOOK_SIG(my_start){
Bind_Helper context_ = begin_bind_helper(data, size); exec_command(app, cmdid_open_panel_vsplit);
Bind_Helper *context = &context_; exec_command(app, cmdid_change_active_panel);
// NOTE(allen|a3.1): Hooks have no loyalties to maps. All hooks are global app->change_theme(app, literal("4coder"));
// and once set they always apply, regardless of what map is active. app->change_font(app, literal("liberation sans"));
set_hook(context, hook_start, my_start);
set_hook(context, hook_open_file, my_file_settings); // Theme options:
// "4coder"
// "Handmade Hero"
// "Twilight"
// "Woverine"
// "stb"
set_scroll_rule(context, smooth_scroll_rule); // Font options:
// "liberation sans"
// "liberation mono"
// "hack"
// "cutive mono"
// "inconsolata"
// no meaning for return
return(0);
}
HOOK_SIG(my_file_settings){
// NOTE(allen|a4): In hooks that want parameters, such as this file
// opened hook. The file created hook is guaranteed to have only
// and exactly one buffer parameter. In normal command callbacks
// there are no parameter buffers.
Buffer_Summary buffer = app->get_parameter_buffer(app, 0);
assert(buffer.exists);
int treat_as_code = 0;
int wrap_lines = 1;
if (buffer.file_name && buffer.size < (16 << 20)){
String ext = file_extension(make_string(buffer.file_name, buffer.file_name_len));
if (match(ext, make_lit_string("cpp"))) treat_as_code = 1;
else if (match(ext, make_lit_string("h"))) treat_as_code = 1;
else if (match(ext, make_lit_string("c"))) treat_as_code = 1;
else if (match(ext, make_lit_string("hpp"))) treat_as_code = 1;
}
if (treat_as_code){
wrap_lines = 0;
}
if (buffer.file_name[0] == '*'){
wrap_lines = 0;
}
push_parameter(app, par_lex_as_cpp_file, treat_as_code);
push_parameter(app, par_wrap_lines, wrap_lines);
push_parameter(app, par_key_mapid, (treat_as_code)?((int)my_code_map):((int)mapid_file));
exec_command(app, cmdid_set_settings);
// no meaning for return
return(0);
}
typedef void (Extension_Bindings)(Bind_Helper *context);
void
default_keys(Bind_Helper *context, Extension_Bindings *extension = 0){
begin_map(context, mapid_global); begin_map(context, mapid_global);
bind(context, 'p', MDFR_CTRL, cmdid_open_panel_vsplit); bind(context, 'p', MDFR_CTRL, cmdid_open_panel_vsplit);
@ -389,49 +382,65 @@ int get_bindings(void *data, int size){
bind(context, key_back, MDFR_ALT, snipe_token_or_word); bind(context, key_back, MDFR_ALT, snipe_token_or_word);
bind(context, ' ', MDFR_CTRL, cmdid_set_mark); bind(context, ' ', MDFR_CTRL, cmdid_set_mark);
bind(context, 'm', MDFR_CTRL, cmdid_cursor_mark_swap); bind(context, 'a', MDFR_CTRL, replace_in_range);
bind(context, 'c', MDFR_CTRL, cmdid_copy); bind(context, 'c', MDFR_CTRL, cmdid_copy);
bind(context, 'x', MDFR_CTRL, cmdid_cut); bind(context, 'd', MDFR_CTRL, cmdid_delete_range);
bind(context, 'v', MDFR_CTRL, cmdid_paste); bind(context, 'e', MDFR_CTRL, cmdid_center_view);
bind(context, 'V', MDFR_CTRL, cmdid_paste_next); bind(context, 'f', MDFR_CTRL, search);
bind(context, 'Z', MDFR_CTRL, cmdid_timeline_scrub); bind(context, 'g', MDFR_CTRL, goto_line);
bind(context, 'z', MDFR_CTRL, cmdid_undo);
bind(context, 'y', MDFR_CTRL, cmdid_redo);
bind(context, 'h', MDFR_CTRL, cmdid_history_backward); bind(context, 'h', MDFR_CTRL, cmdid_history_backward);
bind(context, 'H', MDFR_CTRL, cmdid_history_forward); bind(context, 'H', MDFR_CTRL, cmdid_history_forward);
bind(context, 'd', MDFR_CTRL, cmdid_delete_range);
bind(context, 'l', MDFR_CTRL, cmdid_toggle_line_wrap); bind(context, 'l', MDFR_CTRL, cmdid_toggle_line_wrap);
bind(context, 'L', MDFR_CTRL, cmdid_toggle_endline_mode);
bind(context, 'u', MDFR_CTRL, cmdid_to_uppercase);
bind(context, 'j', MDFR_CTRL, cmdid_to_lowercase); bind(context, 'j', MDFR_CTRL, cmdid_to_lowercase);
bind(context, '?', MDFR_CTRL, cmdid_toggle_show_whitespace);
bind(context, '~', MDFR_CTRL, cmdid_clean_all_lines);
bind(context, '1', MDFR_CTRL, cmdid_eol_dosify);
bind(context, '!', MDFR_CTRL, cmdid_eol_nixify);
bind(context, 'f', MDFR_CTRL, search);
bind(context, 'r', MDFR_CTRL, reverse_search);
bind(context, 'g', MDFR_CTRL, goto_line);
bind(context, 'q', MDFR_CTRL, query_replace);
bind(context, 'a', MDFR_CTRL, replace_in_range);
bind(context, 's', MDFR_ALT, rewrite_as_single_caps);
bind(context, 'K', MDFR_CTRL, cmdid_kill_buffer); bind(context, 'K', MDFR_CTRL, cmdid_kill_buffer);
bind(context, 'L', MDFR_CTRL, cmdid_toggle_endline_mode);
bind(context, 'm', MDFR_CTRL, cmdid_cursor_mark_swap);
bind(context, 'O', MDFR_CTRL, cmdid_reopen); bind(context, 'O', MDFR_CTRL, cmdid_reopen);
bind(context, 'q', MDFR_CTRL, query_replace);
bind(context, 'r', MDFR_CTRL, reverse_search);
bind(context, 's', MDFR_ALT, rewrite_as_single_caps);
bind(context, 's', MDFR_CTRL, cmdid_save); bind(context, 's', MDFR_CTRL, cmdid_save);
bind(context, 'u', MDFR_CTRL, cmdid_to_uppercase);
bind(context, 'v', MDFR_CTRL, cmdid_paste);
bind(context, 'V', MDFR_CTRL, cmdid_paste_next);
bind(context, 'x', MDFR_CTRL, cmdid_cut);
bind(context, 'y', MDFR_CTRL, cmdid_redo);
bind(context, 'z', MDFR_CTRL, cmdid_undo);
bind(context, '1', MDFR_CTRL, cmdid_eol_dosify);
bind(context, '?', MDFR_CTRL, cmdid_toggle_show_whitespace);
bind(context, '~', MDFR_CTRL, cmdid_clean_all_lines);
bind(context, '!', MDFR_CTRL, cmdid_eol_nixify);
bind(context, '\n', MDFR_SHIFT, write_and_auto_tab); bind(context, '\n', MDFR_SHIFT, write_and_auto_tab);
bind(context, ' ', MDFR_SHIFT, cmdid_write_character); bind(context, ' ', MDFR_SHIFT, cmdid_write_character);
bind(context, 'e', MDFR_CTRL, cmdid_center_view); if (extension != 0){
extension(context);
bind(context, 'T', MDFR_CTRL | MDFR_ALT, begin_html_mode); }
end_map(context); end_map(context);
}
#ifndef NO_BINDING
int get_bindings(void *data, int size){
Bind_Helper context_ = begin_bind_helper(data, size);
Bind_Helper *context = &context_;
// NOTE(allen|a3.1): Hooks have no loyalties to maps. All hooks are global
// and once set they always apply, regardless of what map is active.
set_hook(context, hook_start, my_start);
set_hook(context, hook_open_file, my_file_settings);
set_scroll_rule(context, smooth_scroll_rule);
default_keys(context);
int result = end_bind_helper(context); int result = end_bind_helper(context);
return(result); return(result);
} }
#endif
// BOTTOM // BOTTOM

View File

@ -334,7 +334,9 @@ isearch(Application_Links *app, int start_reversed){
} }
} }
else{ else{
match.end = match.start + bar.string.size; if (match.end > match.start + bar.string.size){
match.end = match.start + bar.string.size;
}
} }
app->view_set_highlight(app, &view, match.start, match.end, 1); app->view_set_highlight(app, &view, match.start, match.end, 1);

View File

@ -224,6 +224,35 @@ get_range(View_Summary *view){
return(range); return(range);
} }
struct Buffer_Rect{
int char0,line0;
int char1,line1;
};
#ifndef Swap
#define Swap(a,b) do{ auto t = a; a = b; b = t; } while(0)
#endif
inline Buffer_Rect
get_rect(View_Summary *view){
Buffer_Rect rect;
rect.char0 = view->mark.character;
rect.line0 = view->mark.line;
rect.char1 = view->cursor.character;
rect.line1 = view->cursor.line;
if (rect.line0 > rect.line1){
Swap(rect.line0, rect.line1);
}
if (rect.char0 > rect.char1){
Swap(rect.char0, rect.char1);
}
return(rect);
}
inline void inline void
exec_command(Application_Links *app, Command_ID id){ exec_command(Application_Links *app, Command_ID id){
app->exec_command_keep_stack(app, id); app->exec_command_keep_stack(app, id);

View File

@ -192,6 +192,7 @@ FCPP_LINK String file_extension_slowly(char *str);
FCPP_LINK char * file_extension_c(String str); FCPP_LINK char * file_extension_c(String str);
FCPP_LINK bool remove_last_folder(String *str); FCPP_LINK bool remove_last_folder(String *str);
FCPP_LINK void replace_char(String str, char replace, char with); FCPP_LINK void replace_char(String str, char replace, char with);
FCPP_LINK void replace_char(char *str, char replace, char with);
inline String make_string(void *str, int size, int mem_size){ inline String make_string(void *str, int size, int mem_size){
String result; String result;
@ -1131,6 +1132,13 @@ replace_char(String str, char replace, char with){
} }
} }
FCPP_LINK void
replace_char(char *str, char replace, char with){
for (; *str; ++str){
if (*str == replace) *str = with;
}
}
// NOTE(allen): experimental section, things below here are // NOTE(allen): experimental section, things below here are
// not promoted to public API level yet. // not promoted to public API level yet.

25
4ed.cpp
View File

@ -754,15 +754,6 @@ COMMAND_DECL(delete_range){
} }
} }
COMMAND_DECL(timeline_scrub){
REQ_OPEN_VIEW(view);
REQ_FILE_HISTORY(file, view);
view_set_widget(view, FWIDG_TIMELINES);
view->widget.timeline.undo_line = 1;
view->widget.timeline.history_line = 1;
}
COMMAND_DECL(undo){ COMMAND_DECL(undo){
USE_MODELS(models); USE_MODELS(models);
REQ_OPEN_VIEW(view); REQ_OPEN_VIEW(view);
@ -772,7 +763,6 @@ COMMAND_DECL(undo){
} }
COMMAND_DECL(redo){ COMMAND_DECL(redo){
USE_MODELS(models); USE_MODELS(models);
REQ_OPEN_VIEW(view); REQ_OPEN_VIEW(view);
REQ_FILE_HISTORY(file, view); REQ_FILE_HISTORY(file, view);
@ -781,7 +771,6 @@ COMMAND_DECL(redo){
} }
COMMAND_DECL(history_backward){ COMMAND_DECL(history_backward){
USE_MODELS(models); USE_MODELS(models);
REQ_OPEN_VIEW(view); REQ_OPEN_VIEW(view);
REQ_FILE_HISTORY(file, view); REQ_FILE_HISTORY(file, view);
@ -790,7 +779,6 @@ COMMAND_DECL(history_backward){
} }
COMMAND_DECL(history_forward){ COMMAND_DECL(history_forward){
USE_MODELS(models); USE_MODELS(models);
REQ_OPEN_VIEW(view); REQ_OPEN_VIEW(view);
REQ_FILE_HISTORY(file, view); REQ_FILE_HISTORY(file, view);
@ -799,7 +787,6 @@ COMMAND_DECL(history_forward){
} }
COMMAND_DECL(interactive_new){ COMMAND_DECL(interactive_new){
USE_MODELS(models); USE_MODELS(models);
USE_VIEW(view); USE_VIEW(view);
@ -890,8 +877,9 @@ view_file_in_panel(Command_Data *cmd, Panel *panel, Editing_File *file){
temp = begin_temp_memory(part); temp = begin_temp_memory(part);
cmd->part = partition_sub_part(part, Kbytes(16)); cmd->part = partition_sub_part(part, Kbytes(16));
view_set_file(panel->view, file, models, system, View *view = panel->view;
models->hooks[hook_open_file], &app_links); view_set_file(view, file, models, system, models->hooks[hook_open_file], &app_links);
view_show_file(view, 0);
cmd->part = old_part; cmd->part = old_part;
end_temp_memory(temp); end_temp_memory(temp);
@ -923,6 +911,7 @@ COMMAND_DECL(reopen){
view_set_file(view, file, models, system, view_set_file(view, file, models, system,
models->hooks[hook_open_file], &app_links); models->hooks[hook_open_file], &app_links);
view_show_file(view, 0);
} }
else{ else{
do_feedback_message(system, models, make_lit_string("ERROR: no file load slot available\n")); do_feedback_message(system, models, make_lit_string("ERROR: no file load slot available\n"));
@ -2419,6 +2408,7 @@ extern "C"{
if (file != vptr->file_data.file){ if (file != vptr->file_data.file){
view_set_file(vptr, file, models, cmd->system, view_set_file(vptr, file, models, cmd->system,
models->hooks[hook_open_file], &app_links); models->hooks[hook_open_file], &app_links);
view_show_file(vptr, 0);
} }
} }
@ -2649,7 +2639,6 @@ setup_command_table(){
SET(paste); SET(paste);
SET(paste_next); SET(paste_next);
SET(delete_range); SET(delete_range);
SET(timeline_scrub);
SET(undo); SET(undo);
SET(redo); SET(redo);
SET(history_backward); SET(history_backward);
@ -4030,7 +4019,7 @@ App_Step_Sig(app_step){
"Newest features:\n" "Newest features:\n"
"Scroll bar on files and file lists\n" "Scroll bar on files and file lists\n"
"Arrow navigation in lists\n" "Arrow navigation in lists\n"
"A new minimal theme\n" "A new minimal theme editor\n"
"\n" "\n"
"New in alpha 4.0.2:\n" "New in alpha 4.0.2:\n"
"-The file count limit is over 8 million now\n" "-The file count limit is over 8 million now\n"
@ -4375,6 +4364,7 @@ App_Step_Sig(app_step){
View *view = panel->view; View *view = panel->view;
view_set_file(view, file, models, system, models->hooks[hook_open_file], &app_links); view_set_file(view, file, models, system, models->hooks[hook_open_file], &app_links);
view_show_file(view, 0);
view->map = app_get_map(models, file->settings.base_map_id); view->map = app_get_map(models, file->settings.base_map_id);
Hook_Function *new_file_fnc = models->hooks[hook_new_file]; Hook_Function *new_file_fnc = models->hooks[hook_new_file];
@ -4405,6 +4395,7 @@ App_Step_Sig(app_step){
view_set_file(view, file, models, system, view_set_file(view, file, models, system,
models->hooks[hook_open_file], &app_links); models->hooks[hook_open_file], &app_links);
view_show_file(view, 0);
view->map = app_get_map(models, file->settings.base_map_id); view->map = app_get_map(models, file->settings.base_map_id);
} }
}break; }break;

View File

@ -1295,11 +1295,13 @@ view_set_file(
} }
} }
#if 0
if (set_vui){ if (set_vui){
// TODO(allen): Fix this! There should be a way to easily separate setting a file, // TODO(allen): Fix this! There should be a way to easily separate setting a file,
// and switching to file mode, so that they don't cross over eachother like this. // and switching to file mode, so that they don't cross over eachother like this.
view->showing_ui = VUI_None; view->showing_ui = VUI_None;
} }
#endif
} }
struct Relative_Scrolling{ struct Relative_Scrolling{
@ -2516,6 +2518,7 @@ view_show_menu(View *view, Command_Map *gui_map){
view->map_for_file = view->map; view->map_for_file = view->map;
view->map = gui_map; view->map = gui_map;
view->showing_ui = VUI_Menu; view->showing_ui = VUI_Menu;
view->current_scroll = &view->gui_scroll;
} }
inline void inline void
@ -2523,6 +2526,7 @@ view_show_config(View *view, Command_Map *gui_map){
view->map_for_file = view->map; view->map_for_file = view->map;
view->map = gui_map; view->map = gui_map;
view->showing_ui = VUI_Config; view->showing_ui = VUI_Config;
view->current_scroll = &view->gui_scroll;
} }
inline void inline void
@ -2537,6 +2541,7 @@ view_show_interactive(System_Functions *system, View *view,
view->interaction = interaction; view->interaction = interaction;
view->dest = make_fixed_width_string(view->dest_); view->dest = make_fixed_width_string(view->dest_);
view->list_i = 0; view->list_i = 0;
view->current_scroll = &view->gui_scroll;
view->map_for_file = view->map; view->map_for_file = view->map;
view->map = gui_map; view->map = gui_map;
@ -2553,6 +2558,7 @@ view_show_theme(View *view, Command_Map *gui_map){
view->color_mode = CV_Mode_Library; view->color_mode = CV_Mode_Library;
view->color = super_color_create(0xFF000000); view->color = super_color_create(0xFF000000);
view->current_color_editing = 0; view->current_color_editing = 0;
view->current_scroll = &view->gui_scroll;
} }
@ -2565,6 +2571,7 @@ view_show_file(View *view, Command_Map *file_map){
view->map = view->map_for_file; view->map = view->map_for_file;
} }
view->showing_ui = VUI_None; view->showing_ui = VUI_None;
view->current_scroll = &view->file_scroll;
} }
inline void inline void
@ -2747,7 +2754,6 @@ intbar_draw_string(Render_Target *target, File_Bar *bar, String str, u32 char_co
bar->pos_x += font_string_width(target, font_id, str); bar->pos_x += font_string_width(target, font_id, str);
} }
// TODO(allen): wtf is this?
internal void internal void
view_reinit_scrolling(View *view){ view_reinit_scrolling(View *view){
Editing_File *file = view->file_data.file; Editing_File *file = view->file_data.file;
@ -2780,10 +2786,14 @@ view_reinit_scrolling(View *view){
view->file_scroll.target_y = target_y; view->file_scroll.target_y = target_y;
view->file_scroll.scroll_y = target_y; view->file_scroll.scroll_y = target_y;
view->file_scroll.prev_target_y = -1000.f; view->file_scroll.prev_target_y = -1000.f;
view->file_scroll.min_y = view->gui_target.scroll_updated.min_y;
view->file_scroll.max_y = view->gui_target.scroll_updated.max_y;
view->file_scroll.target_x = target_x; view->file_scroll.target_x = target_x;
view->file_scroll.scroll_x = target_x; view->file_scroll.scroll_x = target_x;
view->file_scroll.prev_target_x = -1000.f; view->file_scroll.prev_target_x = -1000.f;
gui_post_scroll_vars(&view->gui_target, &view->file_scroll);
} }
#define CursorMaxY_(m,h) ((m) - (h)*3) #define CursorMaxY_(m,h) ((m) - (h)*3)
@ -2797,18 +2807,17 @@ file_step(View *view, i32_Rect region, Input_Summary *user_input, b32 is_active)
i32 is_animating = 0; i32 is_animating = 0;
Editing_File *file = view->file_data.file; Editing_File *file = view->file_data.file;
if (file && !file->state.is_loading){ if (file && !file->state.is_loading){
// TODO(allen): rewrite with real scrolling system now.
f32 line_height = (f32)view->font_height; f32 line_height = (f32)view->font_height;
f32 delta_y = 3.f*line_height; f32 delta_y = 3.f*line_height;
f32 cursor_y = view_get_cursor_y(view);
f32 max_visible_y = view_file_height(view); f32 max_visible_y = view_file_height(view);
f32 max_x = view_file_width(view); f32 max_x = view_file_width(view);
f32 cursor_y = view_get_cursor_y(view);
f32 cursor_x = view_get_cursor_x(view); f32 cursor_x = view_get_cursor_x(view);
GUI_Scroll_Vars scroll_vars = view->gui_target.scroll_original; GUI_Scroll_Vars scroll_vars = view->gui_target.scroll_updated;
f32 target_y = scroll_vars.target_y; f32 target_y = scroll_vars.target_y;
f32 target_x = scroll_vars.target_x; f32 target_x = scroll_vars.target_x;
@ -3434,6 +3443,13 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su
switch (view->interaction){ switch (view->interaction){
case IInt_Sys_File_List: case IInt_Sys_File_List:
{ {
b32 use_item_in_list = 1;
b32 activate_directly = 0;
if (view->action == IAct_Save_As || view->action == IAct_New){
use_item_in_list = 0;
}
String message = {0}; String message = {0};
switch (view->action){ switch (view->action){
case IAct_Open: message = make_lit_string("Open: "); break; case IAct_Open: message = make_lit_string("Open: "); break;
@ -3453,16 +3469,19 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su
Single_Line_Input_Step step = {0}; Single_Line_Input_Step step = {0};
Key_Event_Data key = {0}; Key_Event_Data key = {0};
i32 i; i32 i;
for (i = 0; i < keys.count; ++i){ for (i = 0; i < keys.count; ++i){
key = get_single_key(&keys, i); key = get_single_key(&keys, i);
step = app_single_file_input_step(system, &models->working_set, key, &hdir->string, hdir, 1, 1, 0); step = app_single_file_input_step(system, &models->working_set, key, &hdir->string, hdir, 1, 1, 0);
if (step.made_a_change){ if (step.made_a_change){
view->list_i = 0; view->list_i = 0;
} }
if (!use_item_in_list && (key.keycode == '\n' || key.keycode == '\t')){
activate_directly = 1;
}
} }
} }
gui_do_text_field(target, message, hdir->string); gui_do_text_field(target, message, hdir->string);
view->current_scroll = &view->gui_scroll; view->current_scroll = &view->gui_scroll;
@ -3470,6 +3489,7 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su
gui_begin_scrollable(target, view->showing_ui, view->gui_scroll, 9.f * view->font_height); gui_begin_scrollable(target, view->showing_ui, view->gui_scroll, 9.f * view->font_height);
id.id[0] = (u64)(hdir) + 1; id.id[0] = (u64)(hdir) + 1;
if (gui_begin_list(target, id, view->list_i, 0, &update)){ if (gui_begin_list(target, id, view->list_i, 0, &update)){
gui_standard_list(target, id, &keys, &view->list_i, &update); gui_standard_list(target, id, &keys, &view->list_i, &update);
} }
@ -3478,7 +3498,7 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su
begin_exhaustive_loop(&loop, hdir); begin_exhaustive_loop(&loop, hdir);
for (i = 0; i < loop.count; ++i){ for (i = 0; i < loop.count; ++i){
file_info = get_exhaustive_info(system, &models->working_set, &loop, i); file_info = get_exhaustive_info(system, &models->working_set, &loop, i);
if (file_info.name_match){ if (file_info.name_match){
id.id[0] = (u64)(file_info.info); id.id[0] = (u64)(file_info.info);
if (gui_do_file_option(target, id, file_info.info->filename, file_info.is_folder, file_info.message)){ if (gui_do_file_option(target, id, file_info.info->filename, file_info.is_folder, file_info.message)){
@ -3486,16 +3506,20 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su
set_last_folder(&hdir->string, file_info.info->filename, '/'); set_last_folder(&hdir->string, file_info.info->filename, '/');
do_new_directory = 1; do_new_directory = 1;
} }
else{ else if (use_item_in_list){
interactive_view_complete(view, loop.full_path, 0); interactive_view_complete(view, loop.full_path, 0);
} }
} }
} }
} }
} }
gui_end_list(target); gui_end_list(target);
if (activate_directly){
interactive_view_complete(view, hdir->string, 0);
}
if (do_new_directory){ if (do_new_directory){
hot_directory_reload(system, hdir, &models->working_set); hot_directory_reload(system, hdir, &models->working_set);
} }
@ -3752,6 +3776,7 @@ do_input_file_view(System_Functions *system, Exchange *exchange,
if (view->reinit_scrolling){ if (view->reinit_scrolling){
view_reinit_scrolling(view); view_reinit_scrolling(view);
is_animating = 1;
} }
if (file_step(view, gui_session.rect, user_input, is_active)){ if (file_step(view, gui_session.rect, user_input, is_active)){
is_animating = 1; is_animating = 1;
@ -4202,6 +4227,8 @@ draw_file_bar(Render_Target *target, View *view, Editing_File *file, i32_Rect re
String line_number = make_fixed_width_string(line_number_space); String line_number = make_fixed_width_string(line_number_space);
append(&line_number, " L#"); append(&line_number, " L#");
append_int_to_str(view->file_data.cursor.line, &line_number); append_int_to_str(view->file_data.cursor.line, &line_number);
append(&line_number, " C#");
append_int_to_str(view->file_data.cursor.character, &line_number);
intbar_draw_string(target, &bar, line_number, base_color); intbar_draw_string(target, &bar, line_number, base_color);

View File

@ -15,7 +15,8 @@ pushd ..\code
popd popd
pushd ..\build pushd ..\build
call "..\code\buildsuper.bat" ..\code\4coder_default_bindings.cpp REM call "..\code\buildsuper.bat" ..\code\4coder_default_bindings.cpp
call "..\code\buildsuper.bat" ..\code\power\4coder_experiments.cpp
set EXPORTS=/EXPORT:app_get_functions set EXPORTS=/EXPORT:app_get_functions
cl %OPTS% %INCLUDES% %DEFINES% ..\code\4ed_app_target.cpp %* /Fe4ed_app /LD /link /INCREMENTAL:NO /OPT:REF %EXPORTS% cl %OPTS% %INCLUDES% %DEFINES% ..\code\4ed_app_target.cpp %* /Fe4ed_app /LD /link /INCREMENTAL:NO /OPT:REF %EXPORTS%

View File

@ -1,54 +1,129 @@
#include "4coder_default_bindings.cpp" // TOP
enum Experiment_Maps{ #define NO_BINDING
my_experiment_map = my_maps_count #include "../4coder_default_bindings.cpp"
};
HOOK_SIG(my_file_settings){ CUSTOM_COMMAND_SIG(kill_rect){
Buffer_Summary buffer = app->get_parameter_buffer(app, 0); View_Summary view = app->get_active_view(app);
assert(buffer.exists); Buffer_Summary buffer = app->get_buffer(app, view.buffer_id);
int treat_as_code = 0; Buffer_Rect rect = get_rect(&view);
int wrap_lines = 1;
for (int line = rect.line1; line >= rect.line0; --line){
if (buffer.file_name && buffer.size < (16 << 20)){ int start = 0;
String ext = file_extension(make_string(buffer.file_name, buffer.file_name_len)); int end = 0;
if (match(ext, make_lit_string("cpp"))) treat_as_code = 1;
else if (match(ext, make_lit_string("h"))) treat_as_code = 1; app->view_set_cursor(app, &view, seek_line_char(line, rect.char0), 0);
else if (match(ext, make_lit_string("c"))) treat_as_code = 1; app->refresh_view(app, &view);
else if (match(ext, make_lit_string("hpp"))) treat_as_code = 1; start = view.cursor.pos;
app->view_set_cursor(app, &view, seek_line_char(line, rect.char1), 0);
app->refresh_view(app, &view);
end = view.cursor.pos;
app->buffer_replace_range(app, &buffer, start, end, 0, 0);
} }
}
if (treat_as_code){ CUSTOM_COMMAND_SIG(complete_word){
wrap_lines = 0; app->print_message(app, literal("complete_word\n"));
View_Summary view = app->get_active_view(app);
Buffer_Summary buffer = app->get_buffer(app, view.buffer_id);
int start = 0;
int end = 0;
end = view.cursor.pos;
push_parameter(app, par_flags, BoundryAlphanumeric);
exec_command(app, cmdid_seek_left);
app->refresh_view(app, &view);
start = view.cursor.pos;
String complete_string;
int size = (start - end);
char complete_space[256];
if (size < sizeof(complete_space) - 1){
complete_string = make_fixed_width_string(complete_space);
app->buffer_read_range(app, &buffer, start, end, complete_space);
complete_string.size = size;
complete_string.str[size] = 0;
// TODO(allen): Complete this when the heavy duty coroutine stuff
// and the hash table are available
app->print_message(app, complete_string.str, complete_string.size);
} }
if (buffer.file_name[0] == '*'){ }
wrap_lines = 0;
// TODO(allen): Query theme settings
#if 0
CUSTOM_COMMAND_SIG(save_theme_settings){
FILE *file = fopen(".4coder_settings", "rb");
char theme_name[128];
char font_name[128];
fscanf(file, "%*128s %*128s", theme_name, font_name);
if (file){
replace_char(theme_name, '#', ' ');
replace_char(font_name, '#', ' ');
fclose(file);
app->change_theme(app, theme_name, strlen(theme_name));
app->change_font(app, font_name, strlen(font_name));
} }
}
#endif
push_parameter(app, par_lex_as_cpp_file, treat_as_code); void experiment_extension(Bind_Helper *context){
push_parameter(app, par_wrap_lines, !treat_as_code); bind(context, 'k', MDFR_ALT, kill_rect);
push_parameter(app, par_key_mapid, (treat_as_code)?((int)my_experiment_map):((int)mapid_file)); bind(context, '+', MDFR_CTRL, complete_word);
exec_command(app, cmdid_set_settings); }
// no meaning for return #include <stdio.h>
HOOK_SIG(experimental_start_hook){
my_start(app);
FILE *file = fopen(".4coder_settings", "rb");
char theme_name[128];
char font_name[128];
if (file){
fscanf(file, "%127s\n%127s", theme_name, font_name);
replace_char(theme_name, '#', ' ');
replace_char(font_name, '#', ' ');
fclose(file);
app->change_theme(app, theme_name, (int)strlen(theme_name));
app->change_font(app, font_name, (int)strlen(font_name));
}
return(0); return(0);
} }
CUSTOM_COMMAND_SIG(kill_rect){ int get_bindings(void *data, int size){
// TODO Bind_Helper context_ = begin_bind_helper(data, size);
Bind_Helper *context = &context_;
set_hook(context, hook_start, experimental_start_hook);
set_hook(context, hook_open_file, my_file_settings);
set_scroll_rule(context, smooth_scroll_rule);
default_keys(context, experiment_extension);
int result = end_bind_helper(context);
return(result);
} }
void experiments_get_bindings(Bind_Helper *context){ // BOTTOM
default_get_bindings(context, 0);
set_hook(context, hook_start, my_start);
set_hook(context, hook_open_file, experiment_file_settings);
begin_map(context, my_experiment_map);
inherit_map(my_code_map);
end_map(context);
}