Touch up to the edit position stack

This commit is contained in:
Allen Webster 2019-02-09 14:48:53 -08:00
parent a19492dfd7
commit 4bdc1e6d21
10 changed files with 109 additions and 187 deletions

24
4ed.cpp
View File

@ -82,7 +82,9 @@ file_cursor_to_end(System_Functions *system, Models *models, Editing_File *file)
continue;
}
view_cursor_move(system, view, pos);
view->transient.edit_pos.mark = view->transient.edit_pos.cursor.pos;
File_Edit_Positions edit_pos = view_get_edit_pos(view);
edit_pos.mark = edit_pos.cursor.pos;
view_set_edit_pos(view, edit_pos);
}
}
@ -1292,8 +1294,9 @@ App_Step_Sig(app_step){
GUI_Scroll_Vars *scroll_vars = 0;
i32 max_y = 0;
b32 file_scroll = false;
File_Edit_Positions edit_pos = view_get_edit_pos(view);
if (!view->transient.ui_mode){
scroll_vars = &view->transient.edit_pos.scroll;
scroll_vars = &edit_pos.scroll;
max_y = view_compute_max_target_y(view);
file_scroll = true;
}
@ -1311,6 +1314,11 @@ App_Step_Sig(app_step){
app_result.animating = true;
}
if (file_scroll){
// TODO(allen): do(eliminate view_set_edit_pos if it is redundant)
view_set_edit_pos(view, edit_pos);
}
if (memcmp(scroll_vars, &ip_result.scroll, sizeof(*scroll_vars)) != 0){
if (file_scroll){
view_set_scroll(system, view, ip_result.scroll);
@ -1328,9 +1336,10 @@ App_Step_Sig(app_step){
panel != 0;
panel = layout_get_next_open_panel(layout, panel)){
View *view = panel->view;
GUI_Scroll_Vars *scroll_vars = &view->transient.edit_pos.scroll;
scroll_vars->scroll_x = (f32)scroll_vars->target_x;
scroll_vars->scroll_y = (f32)scroll_vars->target_y;
File_Edit_Positions edit_pos = view_get_edit_pos(view);
edit_pos.scroll.scroll_x = (f32)edit_pos.scroll.target_x;
edit_pos.scroll.scroll_y = (f32)edit_pos.scroll.target_y;
view_set_edit_pos(view, edit_pos);
}
}
@ -1418,11 +1427,14 @@ App_Step_Sig(app_step){
draw_rectangle(target, full, style->theme.colors[Stag_Back]);
GUI_Scroll_Vars *scroll_vars = &view->transient.edit_pos.scroll;
File_Edit_Positions edit_pos = view_get_edit_pos(view);
GUI_Scroll_Vars *scroll_vars = &edit_pos.scroll;
b32 active = (panel == active_panel);
do_render_file_view(system, view, models, scroll_vars, active_view, inner, active, target);
view_set_edit_pos(view, edit_pos);
u32 margin_color = 0;
if (active){
margin_color = style->theme.colors[Stag_Margin_Active];

View File

@ -66,9 +66,12 @@ fill_view_summary(System_Functions *system, View_Summary *view, View *vptr, Live
view->buffer_id = vptr->transient.file_data.file->id.id;
Assert(data->file != 0);
view->mark = file_compute_cursor(system, data->file, seek_pos(vptr->transient.edit_pos.mark), 0);
view->cursor = vptr->transient.edit_pos.cursor;
view->preferred_x = vptr->transient.edit_pos.preferred_x;
File_Edit_Positions edit_pos = view_get_edit_pos(vptr);
view->mark = file_compute_cursor(system, data->file, seek_pos(edit_pos.mark), 0);
view->cursor = edit_pos.cursor;
view->preferred_x = edit_pos.preferred_x;
view->view_region = vptr->transient.panel->rect_inner;
view->file_region = vptr->transient.file_region;
@ -76,7 +79,7 @@ fill_view_summary(System_Functions *system, View_Summary *view, View *vptr, Live
view->scroll_vars = vptr->transient.ui_scroll;
}
else{
view->scroll_vars = vptr->transient.edit_pos.scroll;
view->scroll_vars = edit_pos.scroll;
}
}
}
@ -1408,9 +1411,10 @@ Reopen_Buffer(Application_Links *app, Buffer_Summary *buffer, Buffer_Reopen_Flag
continue;
}
vptrs[vptr_count] = view_it;
edit_positions[vptr_count] = view_it->transient.edit_pos;
line_numbers[vptr_count] = view_it->transient.edit_pos.cursor.line;
column_numbers[vptr_count] = view_it->transient.edit_pos.cursor.character;
File_Edit_Positions edit_pos = view_get_edit_pos(view_it);
edit_positions[vptr_count] = edit_pos;
line_numbers[vptr_count] = edit_pos.cursor.line;
column_numbers[vptr_count] = edit_pos.cursor.character;
view_it->transient.file_data.file = models->scratch_buffer;
++vptr_count;
}
@ -1423,7 +1427,7 @@ Reopen_Buffer(Application_Links *app, Buffer_Summary *buffer, Buffer_Reopen_Flag
view_set_file(system, models, vptrs[i], file);
vptrs[i]->transient.file_data.file = file;
vptrs[i]->transient.edit_pos = edit_positions[i];
view_set_edit_pos(vptrs[i], edit_positions[i]);
Full_Cursor cursor = file_compute_cursor(system, file, seek_line_char(line_numbers[i], column_numbers[i]), 0);
view_set_cursor(vptrs[i], cursor, true, file->settings.unwrapped_lines);
@ -1944,15 +1948,17 @@ DOC_SEE(Buffer_Seek)
Editing_File *file = vptr->transient.file_data.file;
Assert(file != 0);
if (!file->is_loading){
File_Edit_Positions edit_pos = view_get_edit_pos(vptr);
if (seek.type != buffer_seek_pos){
result = true;
Full_Cursor cursor = file_compute_cursor(system, file, seek, 0);
vptr->transient.edit_pos.mark = cursor.pos;
edit_pos.mark = cursor.pos;
}
else{
result = true;
vptr->transient.edit_pos.mark = seek.pos;
edit_pos.mark = seek.pos;
}
view_set_edit_pos(vptr, edit_pos);
fill_view_summary(system, view, vptr, models);
}
}

View File

@ -177,63 +177,6 @@ buffer_batch_edit_update_cursors(Cursor_With_Index *sorted_positions, i32 count,
return(shift_amount);
}
#if 0
internal i32
buffer_batch_edit_update_cursors(Cursor_With_Index *sorted_positions, i32 count, Buffer_Edit *sorted_edits, i32 edit_count, b32 lean_right){
Cursor_With_Index *position = sorted_positions;
Cursor_With_Index *end_position = sorted_positions + count;
Buffer_Edit *edit = sorted_edits;
Buffer_Edit *end_edit = sorted_edits + edit_count;
i32 shift_amount = 0;
if (lean_right){
for (; edit < end_edit && position < end_position; ++edit){
i32 start = edit->start;
i32 end = edit->end;
for (; position->pos < start && position < end_position; ++position){
position->pos += shift_amount;
}
i32 new_end = start + edit->len + shift_amount;
for (; position->pos <= end && position < end_position; ++position){
position->pos = new_end;
}
shift_amount += (edit->len - (end - start));
}
}
else{
for (; edit < end_edit && position < end_position; ++edit){
i32 start = edit->start;
i32 end = edit->end;
for (; position->pos < start && position < end_position; ++position){
position->pos += shift_amount;
}
i32 new_end = start + shift_amount;
for (; position->pos <= end && position < end_position; ++position){
position->pos = new_end;
}
shift_amount += (edit->len - (end - start));
}
}
for (; position < end_position; ++position){
position->pos += shift_amount;
}
for (; edit < end_edit; ++edit){
shift_amount += (edit->len - (edit->end - edit->start));
}
return(shift_amount);
}
#endif
//////////////////////////////////////
internal i32
@ -554,35 +497,6 @@ buffer_batch_edit_step(Buffer_Batch_State *state, Gap_Buffer *buffer, Edit_Array
return(result);
}
#if 0
internal i32
buffer_batch_edit_step(Buffer_Batch_State *state, Gap_Buffer *buffer, Buffer_Edit *sorted_edits, char *strings, i32 edit_count,
void *scratch, i32 scratch_size, i32 *request_amount){
Buffer_Edit *edit = 0;
i32 shift_total = state->shift_total;
i32 result = 0;
i32 i = state->i;
edit = sorted_edits + i;
for (; i < edit_count; ++i, ++edit){
i32 start = edit->start + shift_total;
i32 end = edit->end + shift_total;
i32 len = edit->len;
i32 shift_amount = buffer_replace_range_compute_shift(start, end, len);
result = buffer_replace_range(buffer, start, end, strings + edit->str_start, len, shift_amount, scratch, scratch_size, request_amount);
if (result){
break;
}
shift_total += shift_amount;
}
state->shift_total = shift_total;
state->i = i;
return(result);
}
#endif
internal void*
buffer_edit_provide_memory(Gap_Buffer *buffer, void *new_data, i32 new_max){
void *result = buffer->data;

View File

@ -114,9 +114,10 @@ edit_fix_markers(System_Functions *system, Models *models, Editing_File *file, E
panel = layout_get_next_open_panel(layout, panel)){
View *view = panel->view;
if (view->transient.file_data.file == file){
write_cursor_with_index(cursors, &cursor_count, view->transient.edit_pos.cursor.pos);
write_cursor_with_index(cursors, &cursor_count, view->transient.edit_pos.mark);
write_cursor_with_index(cursors, &cursor_count, view->transient.edit_pos.scroll_i);
File_Edit_Positions edit_pos = view_get_edit_pos(view);
write_cursor_with_index(cursors, &cursor_count, edit_pos.cursor.pos);
write_cursor_with_index(cursors, &cursor_count, edit_pos.mark );
write_cursor_with_index(cursors, &cursor_count, edit_pos.scroll_i );
}
}
@ -139,17 +140,6 @@ edit_fix_markers(System_Functions *system, Models *models, Editing_File *file, E
if (cursor_count > 0 || r_cursor_count > 0){
buffer_sort_cursors(cursors, cursor_count);
#if 0
if (desc.is_batch){
buffer_batch_edit_update_cursors(cursors, cursor_count, desc.batch, desc.batch_size, false);
buffer_batch_edit_update_cursors(r_cursors, r_cursor_count, desc.batch, desc.batch_size, true);
}
else{
buffer_update_cursors(cursors, cursor_count, desc.start, desc.end, desc.shift_amount + (desc.end - desc.start), false);
buffer_update_cursors(r_cursors, r_cursor_count, desc.start, desc.end, desc.shift_amount + (desc.end - desc.start), true);
}
#endif
if (edits.count > 1){
buffer_batch_edit_update_cursors( cursors, cursor_count, edits, false);
buffer_batch_edit_update_cursors(r_cursors, r_cursor_count, edits, true);
@ -172,16 +162,17 @@ edit_fix_markers(System_Functions *system, Models *models, Editing_File *file, E
i32 cursor_pos = cursors[cursor_count++].pos;
Full_Cursor new_cursor = file_compute_cursor(system, file, seek_pos(cursor_pos), 0);
GUI_Scroll_Vars scroll = view->transient.edit_pos.scroll;
File_Edit_Positions edit_pos = view_get_edit_pos(view);
GUI_Scroll_Vars scroll = edit_pos.scroll;
view->transient.edit_pos.mark = cursors[cursor_count++].pos;
edit_pos.mark = cursors[cursor_count++].pos;
i32 new_scroll_i = cursors[cursor_count++].pos;
if (view->transient.edit_pos.scroll_i != new_scroll_i){
view->transient.edit_pos.scroll_i = new_scroll_i;
if (edit_pos.scroll_i != new_scroll_i){
edit_pos.scroll_i = new_scroll_i;
Full_Cursor temp_cursor = file_compute_cursor(system, file, seek_pos(view->transient.edit_pos.scroll_i), 0);
Full_Cursor temp_cursor = file_compute_cursor(system, file, seek_pos(edit_pos.scroll_i), 0);
f32 y_offset = MOD(view->transient.edit_pos.scroll.scroll_y, view->transient.line_height);
f32 y_offset = MOD(edit_pos.scroll.scroll_y, view->transient.line_height);
f32 y_position = temp_cursor.wrapped_y;
if (file->settings.unwrapped_lines){
y_position = temp_cursor.unwrapped_y;
@ -192,7 +183,9 @@ edit_fix_markers(System_Functions *system, Models *models, Editing_File *file, E
scroll.scroll_y = y_position;
}
view_set_cursor_and_scroll(view, new_cursor, 1, view->transient.file_data.file->settings.unwrapped_lines, scroll);
// TODO(allen): do(remove view_set_edit_pos from marker unrolling if it is redundant)
view_set_edit_pos(view, edit_pos);
view_set_cursor_and_scroll(view, new_cursor, true, view->transient.file_data.file->settings.unwrapped_lines, scroll);
}
}
@ -301,31 +294,6 @@ edit_single(System_Functions *system, Models *models, Editing_File *file, Edit e
}
}
#if 0
internal Edit_Spec
edit_compute_batch_spec(Heap *heap, Editing_File *file, Buffer_Edit *edits, char *str_base, i32 str_size,
Buffer_Edit *inverse_array, char *inv_str, i32 inv_max, i32 edit_count, i32 batch_type){
i32 inv_str_pos = 0;
Buffer_Invert_Batch state = {};
if (buffer_invert_batch(&state, &file->state.buffer, edits, edit_count, inverse_array, inv_str, &inv_str_pos, inv_max)){
InvalidCodePath;
}
i32 first_child = undo_children_push(heap, &file->state.undo.children, edits, edit_count, (u8*)(str_base), str_size);
i32 inverse_first_child = undo_children_push(heap, &file->state.undo.children, inverse_array, edit_count, (u8*)(inv_str), inv_str_pos);
Edit_Spec spec = {};
spec.step.type = ED_NORMAL;
spec.step.first_child = first_child;
spec.step.inverse_first_child = inverse_first_child;
spec.step.special_type = batch_type;
spec.step.child_count = edit_count;
spec.step.inverse_child_count = edit_count;
return(spec);
}
#endif
internal void
edit_batch(System_Functions *system, Models *models, Editing_File *file, Edit_Array edits, Edit_Behaviors behaviors){
Mem_Options *mem = &models->mem;

View File

@ -22,10 +22,12 @@ internal void
edit_pos_set_cursor(File_Edit_Positions *edit_pos, Full_Cursor cursor, b32 set_preferred_x, b32 unwrapped_lines){
edit_pos->cursor = cursor;
if (set_preferred_x){
edit_pos->preferred_x = cursor.wrapped_x;
if (unwrapped_lines){
edit_pos->preferred_x = cursor.unwrapped_x;
}
else{
edit_pos->preferred_x = cursor.wrapped_x;
}
}
edit_pos->last_set_type = EditPos_CursorSet;
}
@ -51,6 +53,9 @@ edit_pos_pop(Editing_File *file){
edit_pos = file->state.edit_pos_stack[file->state.edit_pos_stack_top];
file->state.edit_pos_stack_top -= 1;
}
else{
edit_pos = file->state.edit_pos_most_recent;
}
return(edit_pos);
}

View File

@ -89,6 +89,7 @@ struct Editing_File_State{
Dirty_State dirty;
u32 ignore_behind_os;
File_Edit_Positions edit_pos_most_recent;
File_Edit_Positions edit_pos_stack[16];
i32 edit_pos_stack_top;
};

View File

@ -60,17 +60,6 @@ history__merge_record_ptr_range_to_one_ptr(Record_Ptr_Lookup_Table *lookup, i32
lookup->records[first] = record;
}
#if 0
internal Node*
history__to_node(History *history, i32 index){
Node *result = 0;
if (0 <= index && index <= history->record_count){
Node *sentinel = &history->records;
result = history__to_node(sentinel, index);
}
return(result);
}
#else
internal Node*
history__to_node(History *history, i32 index){
Node *result = 0;
@ -84,7 +73,6 @@ history__to_node(History *history, i32 index){
}
return(result);
}
#endif
////////////////////////////////

View File

@ -58,6 +58,19 @@ live_set_free_view(Heap *heap, Lifetime_Allocator *lifetime_allocator, Live_View
////////////////////////////////
internal File_Edit_Positions
view_get_edit_pos(View *view){
return(view->transient.edit_pos_);
}
internal void
view_set_edit_pos(View *view, File_Edit_Positions edit_pos){
view->transient.edit_pos_ = edit_pos;
view->transient.file_data.file->state.edit_pos_most_recent = edit_pos;
}
////////////////////////////////
// TODO(allen): Switch over to using an i32 for these.
internal f32
view_width(View *view){
@ -80,7 +93,8 @@ view_get_cursor_xy(View *view){
cursor = &view->transient.file_data.temp_highlight;
}
else{
cursor = &view->transient.edit_pos.cursor;
File_Edit_Positions edit_pos = view_get_edit_pos(view);
cursor = &edit_pos.cursor;
}
Vec2 result = V2(cursor->wrapped_x, cursor->wrapped_y);
if (view->transient.file_data.file->settings.unwrapped_lines){
@ -241,44 +255,52 @@ view_move_cursor_to_view(System_Functions *system, View *view, GUI_Scroll_Vars s
internal void
view_set_cursor(View *view, Full_Cursor cursor, b32 set_preferred_x, b32 unwrapped_lines){
edit_pos_set_cursor(&view->transient.edit_pos, cursor, set_preferred_x, unwrapped_lines);
GUI_Scroll_Vars scroll = view->transient.edit_pos.scroll;
File_Edit_Positions edit_pos = view_get_edit_pos(view);
edit_pos_set_cursor(&edit_pos, cursor, set_preferred_x, unwrapped_lines);
GUI_Scroll_Vars scroll = edit_pos.scroll;
if (view_move_view_to_cursor(view, &scroll, 0)){
view->transient.edit_pos.scroll = scroll;
edit_pos.scroll = scroll;
}
view_set_edit_pos(view, edit_pos);
}
internal void
view_set_scroll(System_Functions *system, View *view, GUI_Scroll_Vars scroll){
edit_pos_set_scroll(&view->transient.edit_pos, scroll);
Full_Cursor cursor = view->transient.edit_pos.cursor;
if (view_move_cursor_to_view(system, view, view->transient.edit_pos.scroll, &cursor, view->transient.edit_pos.preferred_x)){
view->transient.edit_pos.cursor = cursor;
File_Edit_Positions edit_pos = view_get_edit_pos(view);
edit_pos_set_scroll(&edit_pos, scroll);
Full_Cursor cursor = edit_pos.cursor;
if (view_move_cursor_to_view(system, view, edit_pos.scroll, &cursor, edit_pos.preferred_x)){
edit_pos.cursor = cursor;
}
view_set_edit_pos(view, edit_pos);
}
internal void
view_set_cursor_and_scroll(View *view, Full_Cursor cursor, b32 set_preferred_x, b32 unwrapped_lines, GUI_Scroll_Vars scroll){
File_Edit_Positions *edit_pos = &view->transient.edit_pos;
edit_pos_set_cursor(edit_pos, cursor, set_preferred_x, unwrapped_lines);
edit_pos_set_scroll(edit_pos, scroll);
edit_pos->last_set_type = EditPos_None;
File_Edit_Positions edit_pos = view_get_edit_pos(view);
edit_pos_set_cursor(&edit_pos, cursor, set_preferred_x, unwrapped_lines);
edit_pos_set_scroll(&edit_pos, scroll);
edit_pos.last_set_type = EditPos_None;
view_set_edit_pos(view, edit_pos);
}
internal Relative_Scrolling
view_get_relative_scrolling(View *view){
Vec2 cursor = view_get_cursor_xy(view);
File_Edit_Positions edit_pos = view_get_edit_pos(view);
Relative_Scrolling result = {};
result.scroll_y = cursor.y - view->transient.edit_pos.scroll.scroll_y;
result.target_y = cursor.y - view->transient.edit_pos.scroll.target_y;
result.scroll_y = cursor.y - edit_pos.scroll.scroll_y;
result.target_y = cursor.y - edit_pos.scroll.target_y;
return(result);
}
internal void
view_set_relative_scrolling(View *view, Relative_Scrolling scrolling){
Vec2 cursor = view_get_cursor_xy(view);
view->transient.edit_pos.scroll.scroll_y = cursor.y - scrolling.scroll_y;
view->transient.edit_pos.scroll.target_y = round32(clamp_bottom(0.f, cursor.y - scrolling.target_y));
File_Edit_Positions edit_pos = view_get_edit_pos(view);
edit_pos.scroll.scroll_y = cursor.y - scrolling.scroll_y;
edit_pos.scroll.target_y = round32(clamp_bottom(0.f, cursor.y - scrolling.target_y));
view_set_edit_pos(view, edit_pos);
}
internal void
@ -319,18 +341,20 @@ view_set_file(System_Functions *system, Models *models, View *view, Editing_File
Editing_File *old_file = view->transient.file_data.file;
if (old_file != 0){
file_touch(&models->working_set, old_file);
edit_pos_push(old_file, view->transient.edit_pos);
edit_pos_push(old_file, view_get_edit_pos(view));
}
block_zero(&view->transient.file_data, sizeof(view->transient.file_data));
view->transient.file_data.file = file;
view->transient.edit_pos = edit_pos_pop(file);
// TODO(allen): do(set edit pos without updating file when popping)
view->transient.edit_pos_ = edit_pos_pop(file);
Font_Pointers font = system->font.get_pointers_by_id(file->settings.font_id);
view->transient.line_height = font.metrics->height;
if (view->transient.edit_pos.cursor.line == 0){
File_Edit_Positions edit_pos = view_get_edit_pos(view);
if (edit_pos.cursor.line == 0){
view_cursor_move(system, view, 0);
}
}
@ -362,7 +386,8 @@ adjust_views_looking_at_file_to_new_cursor(System_Functions *system, Models *mod
View *view = panel->view;
if (view->transient.file_data.file == file){
if (!view->transient.file_data.show_temp_highlight){
i32 pos = view->transient.edit_pos.cursor.pos;
File_Edit_Positions edit_pos = view_get_edit_pos(view);
i32 pos = edit_pos.cursor.pos;
Full_Cursor cursor = file_compute_cursor(system, file, seek_pos(pos), 0);
view_set_cursor(view, cursor, 1, file->settings.unwrapped_lines);
}
@ -1202,8 +1227,9 @@ render_loaded_file_in_view(System_Functions *system, View *view, Models *models,
Face_ID font_id = file->settings.font_id;
Font_Pointers font = system->font.get_pointers_by_id(font_id);
f32 scroll_x = view->transient.edit_pos.scroll.scroll_x;
f32 scroll_y = view->transient.edit_pos.scroll.scroll_y;
File_Edit_Positions edit_pos = view_get_edit_pos(view);
f32 scroll_x = edit_pos.scroll.scroll_x;
f32 scroll_y = edit_pos.scroll.scroll_y;
// NOTE(allen): For now we will temporarily adjust scroll_y to try
// to prevent the view moving around until floating sections are added
@ -1218,7 +1244,8 @@ render_loaded_file_in_view(System_Functions *system, View *view, Models *models,
render_cursor = file_compute_cursor(system, file, seek_unwrapped_xy(0, scroll_y, 0), true);
}
view->transient.edit_pos.scroll_i = render_cursor.pos;
// TODO(allen): do(eliminate scroll_i nonsense)
view->transient.edit_pos_.scroll_i = render_cursor.pos;
i32 item_count = 0;
i32 end_pos = 0;

View File

@ -42,7 +42,7 @@ struct View_Transient{
i32_Rect file_region;
i32_Rect scroll_region;
File_Edit_Positions edit_pos;
File_Edit_Positions edit_pos_;
b32 ui_mode;
UI_Quit_Function_Type *ui_quit;

View File

@ -183,12 +183,13 @@ draw_file_bar(System_Functions *system, Render_Target *target, View *view, Model
intbar_draw_string(system, target, &bar, lit(" loading"), base_color);
}
else{
File_Edit_Positions edit_pos = view_get_edit_pos(view);
char bar_space[526];
String bar_text = make_fixed_width_string(bar_space);
append_ss (&bar_text, lit(" L#"));
append_int_to_str(&bar_text, view->transient.edit_pos.cursor.line);
append_int_to_str(&bar_text, edit_pos.cursor.line);
append_ss (&bar_text, lit(" C#"));
append_int_to_str(&bar_text, view->transient.edit_pos.cursor.character);
append_int_to_str(&bar_text, edit_pos.cursor.character);
append_ss(&bar_text, lit(" -"));