eliminated some undo bug-prone nonsense
This commit is contained in:
parent
ab4d5bbe02
commit
016d07cce4
|
@ -305,9 +305,9 @@ enum Command_Line_Input_Flag{
|
|||
CLI_CursorAtEnd = 0x4,
|
||||
};
|
||||
|
||||
enum Auto_Tab_Flag{
|
||||
AutoTab_ClearLine = 0x1,
|
||||
AutoTab_UseTab = 0x2
|
||||
enum Auto_Indent_Flag{
|
||||
AutoIndent_ClearLine = 0x1,
|
||||
AutoIndent_UseTab = 0x2
|
||||
};
|
||||
|
||||
enum Input_Type_Flag{
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
#define BUFFER_READ_RANGE_SIG(n) int n(Application_Links *app, Buffer_Summary *buffer, int start, int end, char *out)
|
||||
#define BUFFER_REPLACE_RANGE_SIG(n) int n(Application_Links *app, Buffer_Summary *buffer, int start, int end, char *str, int len)
|
||||
#define BUFFER_SET_SETTING_SIG(n) int n(Application_Links *app, Buffer_Summary *buffer, int setting, int value)
|
||||
#define BUFFER_AUTO_INDENT_SIG(n) int n(Application_Links *app, Buffer_Summary *buffer, int start, int end, int tab_width, unsigned int flags)
|
||||
#define CREATE_BUFFER_SIG(n) Buffer_Summary n(Application_Links *app, char *filename, int filename_len, unsigned int flags)
|
||||
#define SAVE_BUFFER_SIG(n) int n(Application_Links *app, Buffer_Summary *buffer, char *filename, int filename_len, unsigned int flags)
|
||||
#define KILL_BUFFER_SIG(n) int n(Application_Links *app, Buffer_Identifier buffer, int view_id, unsigned int flags)
|
||||
|
@ -24,7 +25,6 @@
|
|||
#define GET_VIEW_NEXT_SIG(n) void n(Application_Links *app, View_Summary *view, unsigned int access)
|
||||
#define GET_VIEW_SIG(n) View_Summary n(Application_Links *app, int view_id, unsigned int access)
|
||||
#define GET_ACTIVE_VIEW_SIG(n) View_Summary n(Application_Links *app, unsigned int access)
|
||||
#define VIEW_AUTO_TAB_SIG(n) int n(Application_Links *app, View_Summary *view, int start, int end, int tab_width, unsigned int flags)
|
||||
#define VIEW_COMPUTE_CURSOR_SIG(n) Full_Cursor n(Application_Links *app, View_Summary *view, Buffer_Seek seek)
|
||||
#define VIEW_SET_CURSOR_SIG(n) int n(Application_Links *app, View_Summary *view, Buffer_Seek seek, int set_preferred_x)
|
||||
#define VIEW_SET_MARK_SIG(n) int n(Application_Links *app, View_Summary *view, Buffer_Seek seek)
|
||||
|
@ -64,6 +64,7 @@ extern "C"{
|
|||
typedef BUFFER_READ_RANGE_SIG(Buffer_Read_Range_Function);
|
||||
typedef BUFFER_REPLACE_RANGE_SIG(Buffer_Replace_Range_Function);
|
||||
typedef BUFFER_SET_SETTING_SIG(Buffer_Set_Setting_Function);
|
||||
typedef BUFFER_AUTO_INDENT_SIG(Buffer_Auto_Indent_Function);
|
||||
typedef CREATE_BUFFER_SIG(Create_Buffer_Function);
|
||||
typedef SAVE_BUFFER_SIG(Save_Buffer_Function);
|
||||
typedef KILL_BUFFER_SIG(Kill_Buffer_Function);
|
||||
|
@ -71,7 +72,6 @@ extern "C"{
|
|||
typedef GET_VIEW_NEXT_SIG(Get_View_Next_Function);
|
||||
typedef GET_VIEW_SIG(Get_View_Function);
|
||||
typedef GET_ACTIVE_VIEW_SIG(Get_Active_View_Function);
|
||||
typedef VIEW_AUTO_TAB_SIG(View_Auto_Tab_Function);
|
||||
typedef VIEW_COMPUTE_CURSOR_SIG(View_Compute_Cursor_Function);
|
||||
typedef VIEW_SET_CURSOR_SIG(View_Set_Cursor_Function);
|
||||
typedef VIEW_SET_MARK_SIG(View_Set_Mark_Function);
|
||||
|
@ -114,6 +114,7 @@ struct Application_Links{
|
|||
Buffer_Read_Range_Function *buffer_read_range;
|
||||
Buffer_Replace_Range_Function *buffer_replace_range;
|
||||
Buffer_Set_Setting_Function *buffer_set_setting;
|
||||
Buffer_Auto_Indent_Function *buffer_auto_indent;
|
||||
Create_Buffer_Function *create_buffer;
|
||||
Save_Buffer_Function *save_buffer;
|
||||
Kill_Buffer_Function *kill_buffer;
|
||||
|
@ -121,7 +122,6 @@ struct Application_Links{
|
|||
Get_View_Next_Function *get_view_next;
|
||||
Get_View_Function *get_view;
|
||||
Get_Active_View_Function *get_active_view;
|
||||
View_Auto_Tab_Function *view_auto_tab;
|
||||
View_Compute_Cursor_Function *view_compute_cursor;
|
||||
View_Set_Cursor_Function *view_set_cursor;
|
||||
View_Set_Mark_Function *view_set_mark;
|
||||
|
@ -166,6 +166,7 @@ app_links->buffer_seek = external_buffer_seek;\
|
|||
app_links->buffer_read_range = external_buffer_read_range;\
|
||||
app_links->buffer_replace_range = external_buffer_replace_range;\
|
||||
app_links->buffer_set_setting = external_buffer_set_setting;\
|
||||
app_links->buffer_auto_indent = external_buffer_auto_indent;\
|
||||
app_links->create_buffer = external_create_buffer;\
|
||||
app_links->save_buffer = external_save_buffer;\
|
||||
app_links->kill_buffer = external_kill_buffer;\
|
||||
|
@ -173,7 +174,6 @@ app_links->get_view_first = external_get_view_first;\
|
|||
app_links->get_view_next = external_get_view_next;\
|
||||
app_links->get_view = external_get_view;\
|
||||
app_links->get_active_view = external_get_active_view;\
|
||||
app_links->view_auto_tab = external_view_auto_tab;\
|
||||
app_links->view_compute_cursor = external_view_compute_cursor;\
|
||||
app_links->view_set_cursor = external_view_set_cursor;\
|
||||
app_links->view_set_mark = external_view_set_mark;\
|
||||
|
|
|
@ -650,16 +650,16 @@ long_braces(Application_Links *app, char *text, int size){
|
|||
unsigned int access = AccessOpen;
|
||||
View_Summary view = app->get_active_view(app, access);
|
||||
Buffer_Summary buffer = app->get_buffer(app, view.buffer_id, access);
|
||||
int pos;
|
||||
int pos = view.cursor.pos;
|
||||
|
||||
pos = view.cursor.pos;
|
||||
app->buffer_replace_range(app, &buffer, pos, pos, text, size);
|
||||
app->view_set_cursor(app, &view, seek_pos(pos + 2), true);
|
||||
|
||||
app->view_auto_tab(app, &view,
|
||||
app->buffer_auto_indent(app, &buffer,
|
||||
pos, pos + size,
|
||||
DEF_TAB_WIDTH,
|
||||
0);
|
||||
// TODO(allen): set cursor position
|
||||
}
|
||||
|
||||
CUSTOM_COMMAND_SIG(open_long_braces){
|
||||
|
@ -705,10 +705,11 @@ CUSTOM_COMMAND_SIG(if0_off){
|
|||
|
||||
app->buffer_replace_range(app, &buffer, pos, pos, text1, size1);
|
||||
|
||||
app->view_auto_tab(app, &view,
|
||||
app->buffer_auto_indent(app, &buffer,
|
||||
pos, pos,
|
||||
DEF_TAB_WIDTH,
|
||||
0);
|
||||
// TODO(allen): place cursor
|
||||
|
||||
refresh_view(app, &view);
|
||||
range = get_range(&view);
|
||||
|
@ -716,10 +717,11 @@ CUSTOM_COMMAND_SIG(if0_off){
|
|||
|
||||
app->buffer_replace_range(app, &buffer, pos, pos, text2, size2);
|
||||
|
||||
app->view_auto_tab(app, &view,
|
||||
app->buffer_auto_indent(app, &buffer,
|
||||
pos, pos,
|
||||
DEF_TAB_WIDTH,
|
||||
0);
|
||||
// TODO(allen): place cursor
|
||||
}
|
||||
|
||||
CUSTOM_COMMAND_SIG(backspace_word){
|
||||
|
@ -1298,11 +1300,13 @@ CUSTOM_COMMAND_SIG(build_search){
|
|||
CUSTOM_COMMAND_SIG(auto_tab_line_at_cursor){
|
||||
unsigned int access = AccessOpen;
|
||||
View_Summary view = app->get_active_view(app, access);
|
||||
Buffer_Summary buffer = app->get_buffer(app, view.buffer_id, access);
|
||||
|
||||
app->view_auto_tab(app, &view,
|
||||
app->buffer_auto_indent(app, &buffer,
|
||||
view.cursor.pos, view.cursor.pos,
|
||||
DEF_TAB_WIDTH,
|
||||
0);
|
||||
// TODO(allen): place cursor
|
||||
}
|
||||
|
||||
CUSTOM_COMMAND_SIG(auto_tab_whole_file){
|
||||
|
@ -1310,21 +1314,24 @@ CUSTOM_COMMAND_SIG(auto_tab_whole_file){
|
|||
View_Summary view = app->get_active_view(app, access);
|
||||
Buffer_Summary buffer = app->get_buffer(app, view.buffer_id, access);
|
||||
|
||||
app->view_auto_tab(app, &view,
|
||||
app->buffer_auto_indent(app, &buffer,
|
||||
0, buffer.size,
|
||||
DEF_TAB_WIDTH,
|
||||
0);
|
||||
// TODO(allen): place cursor
|
||||
}
|
||||
|
||||
CUSTOM_COMMAND_SIG(auto_tab_range){
|
||||
unsigned int access = AccessOpen;
|
||||
View_Summary view = app->get_active_view(app, access);
|
||||
Buffer_Summary buffer = app->get_buffer(app, view.buffer_id, access);
|
||||
Range range = get_range(&view);
|
||||
|
||||
app->view_auto_tab(app, &view,
|
||||
app->buffer_auto_indent(app, &buffer,
|
||||
range.min, range.max,
|
||||
DEF_TAB_WIDTH,
|
||||
0);
|
||||
// TODO(allen): place cursor
|
||||
}
|
||||
|
||||
CUSTOM_COMMAND_SIG(write_and_auto_tab){
|
||||
|
|
|
@ -792,6 +792,46 @@ DOC_SEE(Buffer_Setting_ID)
|
|||
return(result);
|
||||
}
|
||||
|
||||
BUFFER_AUTO_INDENT_SIG(external_buffer_auto_indent)/*
|
||||
DOC_PARAM(buffer, the buffer in which to apply the auto indenting)
|
||||
DOC_PARAM(start, the position to start the auto indenting)
|
||||
DOC_PARAM(end, the position to end the auto indenting)
|
||||
DOC_PARAM(tab_width, the number of spaces to place as a tab)
|
||||
DOC_PARAM(flags, the auto tab behavior flags)
|
||||
DOC_RETURN(returns non-zero when the call succeeds)
|
||||
DOC
|
||||
(
|
||||
Applies the built in auto-indentation rule to the code in the range from
|
||||
start to end by inserting spaces or tabs at the beginning of the lines.
|
||||
If the buffer does not have lexing enabled or the lexing job has not
|
||||
completed this function will fail.
|
||||
)
|
||||
DOC_SEE(Auto_Tab_Flag)
|
||||
*/{
|
||||
Command_Data *cmd = (Command_Data*)app->cmd_context;
|
||||
System_Functions *system = cmd->system;
|
||||
Models *models = cmd->models;
|
||||
|
||||
Indent_Options opts = {0};
|
||||
int result = false;
|
||||
|
||||
Editing_File *file = imp_get_file(cmd, buffer);
|
||||
if (file && file->state.token_stack.tokens &&
|
||||
file->state.tokens_complete && !file->state.still_lexing){
|
||||
result = true;
|
||||
|
||||
opts.empty_blank_lines = (flags & AutoIndent_ClearLine);
|
||||
opts.use_tabs = (flags & AutoIndent_UseTab);
|
||||
opts.tab_width = tab_width;
|
||||
|
||||
file_auto_tab_tokens(system, models, file, start, start, end, opts);
|
||||
|
||||
fill_buffer_summary(buffer, file, cmd);
|
||||
}
|
||||
|
||||
return(result);
|
||||
}
|
||||
|
||||
CREATE_BUFFER_SIG(external_create_buffer)/*
|
||||
DOC_PARAM(filename, the name of the file to be opened or created)
|
||||
DOC_PARAM(filename_len, the length of the filename string)
|
||||
|
@ -1063,42 +1103,6 @@ DOC_RETURN(returns a summary that describes the active view)
|
|||
return(view);
|
||||
}
|
||||
|
||||
VIEW_AUTO_TAB_SIG(external_view_auto_tab)/*
|
||||
DOC_PARAM(start, )
|
||||
DOC_PARAM(end, )
|
||||
DOC_PARAM(tab_width, )
|
||||
DOC_PARAM(flags, )
|
||||
*/{
|
||||
Command_Data *cmd = (Command_Data*)app->cmd_context;
|
||||
System_Functions *system = cmd->system;
|
||||
Models *models = cmd->models;
|
||||
|
||||
int result = false;
|
||||
|
||||
Editing_File *file = 0;
|
||||
View *vptr = imp_get_view(cmd, view);
|
||||
|
||||
if (vptr){
|
||||
file = vptr->file_data.file;
|
||||
|
||||
if (file && file->state.token_stack.tokens &&
|
||||
file->state.tokens_complete && !file->state.still_lexing){
|
||||
result = true;
|
||||
|
||||
Indent_Options opts;
|
||||
opts.empty_blank_lines = (flags & AutoTab_ClearLine);
|
||||
opts.use_tabs = (flags & AutoTab_UseTab);
|
||||
opts.tab_width = tab_width;
|
||||
|
||||
view_auto_tab_tokens(system, models, vptr, start, end, opts);
|
||||
|
||||
fill_view_summary(view, vptr, cmd);
|
||||
}
|
||||
}
|
||||
|
||||
return(result);
|
||||
}
|
||||
|
||||
VIEW_COMPUTE_CURSOR_SIG(external_view_compute_cursor){
|
||||
Command_Data *cmd = (Command_Data*)app->cmd_context;
|
||||
View *vptr = imp_get_view(cmd, view);
|
||||
|
|
|
@ -40,8 +40,6 @@ struct Edit_Step{
|
|||
struct{
|
||||
b32 can_merge;
|
||||
Buffer_Edit edit;
|
||||
i32 pre_pos;
|
||||
i32 post_pos;
|
||||
i32 next_block, prev_block;
|
||||
};
|
||||
struct{
|
||||
|
|
|
@ -1210,8 +1210,6 @@ file_post_undo(General_Memory *general, Editing_File *file,
|
|||
|
||||
Edit_Step inv_step = {};
|
||||
inv_step.edit = inv;
|
||||
inv_step.pre_pos = step.pre_pos;
|
||||
inv_step.post_pos = step.post_pos;
|
||||
inv_step.can_merge = (b8)can_merge;
|
||||
inv_step.type = ED_UNDO;
|
||||
|
||||
|
@ -1222,7 +1220,6 @@ file_post_undo(General_Memory *general, Editing_File *file,
|
|||
if (prev.edit.end == inv_step.edit.start){
|
||||
did_merge = 1;
|
||||
inv_step.edit.start = prev.edit.start;
|
||||
inv_step.pre_pos = prev.pre_pos;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1280,8 +1277,6 @@ file_post_redo(General_Memory *general, Editing_File *file, Edit_Step step){
|
|||
|
||||
Edit_Step inv_step = {};
|
||||
inv_step.edit = inv;
|
||||
inv_step.pre_pos = step.pre_pos;
|
||||
inv_step.post_pos = step.post_pos;
|
||||
inv_step.type = ED_REDO;
|
||||
|
||||
if (redo->edit_count == redo->edit_max)
|
||||
|
@ -1350,19 +1345,16 @@ file_post_history(General_Memory *general, Editing_File *file,
|
|||
|
||||
Edit_Step inv_step = {};
|
||||
inv_step.edit = inv;
|
||||
inv_step.pre_pos = step.pre_pos;
|
||||
inv_step.post_pos = step.post_pos;
|
||||
inv_step.can_merge = (b8)can_merge;
|
||||
inv_step.type = reverse_types[step.type];
|
||||
|
||||
bool32 did_merge = 0;
|
||||
b32 did_merge = 0;
|
||||
if (do_merge && history->edit_count > 0){
|
||||
Edit_Step prev = history->edits[history->edit_count-1];
|
||||
if (prev.can_merge && inv_step.edit.len == 0 && prev.edit.len == 0){
|
||||
if (prev.edit.end == inv_step.edit.start){
|
||||
did_merge = 1;
|
||||
inv_step.edit.start = prev.edit.start;
|
||||
inv_step.pre_pos = prev.pre_pos;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2218,8 +2210,6 @@ file_replace_range(System_Functions *system, Models *models, Editing_File *file,
|
|||
spec.step.edit.end = end;
|
||||
|
||||
spec.step.edit.len = len;
|
||||
spec.step.pre_pos = file->state.cursor_pos;
|
||||
spec.step.post_pos = next_cursor;
|
||||
spec.str = (u8*)str;
|
||||
file_do_single_edit(system, models, file, spec, hist_normal, use_high_permission);
|
||||
}
|
||||
|
@ -2276,8 +2266,7 @@ view_undo_redo(System_Functions *system,
|
|||
|
||||
file_do_single_edit(system, models, file, spec, hist_normal);
|
||||
|
||||
if (expected_type == ED_UNDO) view_cursor_move(view, step.pre_pos);
|
||||
else view_cursor_move(view, step.post_pos);
|
||||
view_cursor_move(view, step.edit.start + step.edit.len);
|
||||
view->recent->mark = view->recent->cursor.pos;
|
||||
|
||||
Style *style = main_style(models);
|
||||
|
@ -2390,7 +2379,7 @@ view_history_step(System_Functions *system, Models *models, View *view, History_
|
|||
}
|
||||
|
||||
if (do_history_step){
|
||||
Edit_Spec spec;
|
||||
Edit_Spec spec = {0};
|
||||
spec.step = step;
|
||||
|
||||
if (spec.step.child_count == 0){
|
||||
|
@ -2402,12 +2391,12 @@ view_history_step(System_Functions *system, Models *models, View *view, History_
|
|||
switch (spec.step.type){
|
||||
case ED_NORMAL:
|
||||
case ED_REDO:
|
||||
view_cursor_move(view, step.post_pos);
|
||||
view_cursor_move(view, step.edit.start + step.edit.len);
|
||||
break;
|
||||
|
||||
case ED_REVERSE_NORMAL:
|
||||
case ED_UNDO:
|
||||
view_cursor_move(view, step.pre_pos);
|
||||
view_cursor_move(view, step.edit.start + step.edit.len);
|
||||
break;
|
||||
}
|
||||
view->recent->mark = view->recent->cursor.pos;
|
||||
|
@ -2524,10 +2513,8 @@ file_compute_whitespace_edit(Mem_Options *mem, Editing_File *file, i32 cursor_po
|
|||
spec.step.special_type = 1;
|
||||
spec.step.child_count = edit_count;
|
||||
spec.step.inverse_child_count = edit_count;
|
||||
spec.step.pre_pos = cursor_pos;
|
||||
spec.step.post_pos = cursor_pos;
|
||||
|
||||
return spec;
|
||||
return(spec);
|
||||
}
|
||||
|
||||
internal void
|
||||
|
|
|
@ -30,6 +30,7 @@ int Buffer_Read_Range(Application_Links *app, Buffer_Summary *buffer, int start,
|
|||
|
||||
int Buffer_Replace_Range(Application_Links *app, Buffer_Summary *buffer, int start, int end, char *str, int len);
|
||||
int Buffer_Set_Setting(Application_Links *app, Buffer_Summary *buffer, int setting, int value);
|
||||
int Buffer_Auto_Indent(Application_Links *app, Buffer_Summary *buffer, int start, int end, int tab_width, unsigned int flags);
|
||||
|
||||
Buffer_Summary Create_Buffer(Application_Links *app, char *filename, int filename_len, unsigned int flags);
|
||||
int Save_Buffer(Application_Links *app, Buffer_Summary *buffer, char *filename, int filename_len, unsigned int flags);
|
||||
|
@ -42,7 +43,6 @@ void Get_View_Next(Application_Links *app, View_Summary *view, unsigned int acce
|
|||
View_Summary Get_View(Application_Links *app, int view_id, unsigned int access);
|
||||
View_Summary Get_Active_View(Application_Links *app, unsigned int access);
|
||||
|
||||
int View_Auto_Tab (Application_Links *app, View_Summary *view, int start, int end, int tab_width, unsigned int flags);
|
||||
Full_Cursor View_Compute_Cursor (Application_Links *app, View_Summary *view, Buffer_Seek seek);
|
||||
int View_Set_Cursor (Application_Links *app, View_Summary *view, Buffer_Seek seek, int set_preferred_x);
|
||||
int View_Set_Mark (Application_Links *app, View_Summary *view, Buffer_Seek seek);
|
||||
|
|
Loading…
Reference in New Issue