Remove scroll_i and fix the bopping around of the view for single file side by side editing
This commit is contained in:
parent
66a06053b6
commit
357125c8b2
70
4ed_edit.cpp
70
4ed_edit.cpp
|
@ -23,6 +23,18 @@ edit_pre_state_change(System_Functions *system, Heap *heap, Models *models, Edit
|
|||
file_set_dirty_flag(file, DirtyState_UnsavedChanges);
|
||||
}
|
||||
file_unmark_edit_finished(file);
|
||||
Layout *layout = &models->layout;
|
||||
for (Panel *panel = layout_get_first_open_panel(layout);
|
||||
panel != 0;
|
||||
panel = layout_get_next_open_panel(layout, panel)){
|
||||
View *view = panel->view;
|
||||
if (view->transient.file_data.file == file){
|
||||
Full_Cursor render_cursor = view_get_render_cursor(system, view);
|
||||
Full_Cursor target_cursor = view_get_render_cursor_target(system, view);
|
||||
view->transient.temp_view_top_left_pos = render_cursor.pos;
|
||||
view->transient.temp_view_top_left_target_pos = target_cursor.pos;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal void
|
||||
|
@ -54,7 +66,6 @@ edit_fix_markers__read_workspace_markers(Dynamic_Workspace *workspace, Buffer_ID
|
|||
node != 0;
|
||||
node = node->next){
|
||||
if (node->buffer_id != buffer_id) continue;
|
||||
|
||||
Marker *markers = (Marker*)(node + 1);
|
||||
Assert(sizeof(*markers) == node->std_header.item_size);
|
||||
i32 count = node->std_header.count;
|
||||
|
@ -69,6 +80,18 @@ edit_fix_markers__read_workspace_markers(Dynamic_Workspace *workspace, Buffer_ID
|
|||
}
|
||||
}
|
||||
|
||||
internal f32
|
||||
edit_fix_markers__compute_scroll_y(i32 line_height, f32 old_y_val, f32 new_y_val_aligned){
|
||||
f32 y_offset = MOD(old_y_val, line_height);
|
||||
f32 y_position = new_y_val_aligned + y_offset;
|
||||
return(y_position);
|
||||
}
|
||||
|
||||
internal i32
|
||||
edit_fix_markers__compute_scroll_y(i32 line_height, i32 old_y_val, f32 new_y_val_aligned){
|
||||
return((i32)edit_fix_markers__compute_scroll_y(line_height, (f32)old_y_val, new_y_val_aligned));
|
||||
}
|
||||
|
||||
internal void
|
||||
edit_fix_markers(System_Functions *system, Models *models, Editing_File *file, Edit_Array edits){
|
||||
Partition *part = &models->mem.part;
|
||||
|
@ -82,7 +105,7 @@ edit_fix_markers(System_Functions *system, Models *models, Editing_File *file, E
|
|||
Buffer_ID file_id = file->id.id;
|
||||
Assert(file_lifetime_object != 0);
|
||||
|
||||
i32 cursor_max = layout_get_open_panel_count(layout)*3;
|
||||
i32 cursor_max = layout_get_open_panel_count(layout)*4;
|
||||
i32 total_marker_count = 0;
|
||||
{
|
||||
total_marker_count += file_lifetime_object->workspace.total_marker_count;
|
||||
|
@ -115,9 +138,10 @@ edit_fix_markers(System_Functions *system, Models *models, Editing_File *file, E
|
|||
View *view = panel->view;
|
||||
if (view->transient.file_data.file == file){
|
||||
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.cursor_pos);
|
||||
write_cursor_with_index(cursors, &cursor_count, view->transient.mark);
|
||||
write_cursor_with_index(cursors, &cursor_count, edit_pos.scroll_i );
|
||||
write_cursor_with_index(cursors, &cursor_count, view->transient.temp_view_top_left_pos);
|
||||
write_cursor_with_index(cursors, &cursor_count, view->transient.temp_view_top_left_target_pos);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -149,7 +173,6 @@ edit_fix_markers(System_Functions *system, Models *models, Editing_File *file, E
|
|||
buffer_update_cursors( cursors, cursor_count, edit.range.first, edit.range.one_past_last, edit.length, false);
|
||||
buffer_update_cursors(r_cursors, r_cursor_count, edit.range.first, edit.range.one_past_last, edit.length, true);
|
||||
}
|
||||
|
||||
buffer_unsort_cursors(cursors, cursor_count);
|
||||
|
||||
cursor_count = 0;
|
||||
|
@ -166,22 +189,31 @@ edit_fix_markers(System_Functions *system, Models *models, Editing_File *file, E
|
|||
GUI_Scroll_Vars scroll = edit_pos.scroll;
|
||||
|
||||
view->transient.mark = cursors[cursor_count++].pos;
|
||||
i32 new_scroll_i = cursors[cursor_count++].pos;
|
||||
if (edit_pos.scroll_i != new_scroll_i){
|
||||
edit_pos.scroll_i = new_scroll_i;
|
||||
view_set_edit_pos(view, edit_pos);
|
||||
|
||||
Full_Cursor temp_cursor = file_compute_cursor(system, file, seek_pos(edit_pos.scroll_i));
|
||||
|
||||
f32 y_offset = MOD(edit_pos.scroll.scroll_y, view->transient.line_height);
|
||||
f32 y_position = temp_cursor.wrapped_y;
|
||||
i32 line_height = view->transient.line_height;
|
||||
i32 top_left_pos = cursors[cursor_count++].pos;
|
||||
i32 top_left_target_pos = cursors[cursor_count++].pos;
|
||||
f32 new_y_val_aligned = 0;
|
||||
if (view->transient.temp_view_top_left_pos != top_left_pos){
|
||||
Full_Cursor new_position_cursor = file_compute_cursor(system, file, seek_pos(top_left_pos));
|
||||
if (file->settings.unwrapped_lines){
|
||||
y_position = temp_cursor.unwrapped_y;
|
||||
new_y_val_aligned = new_position_cursor.unwrapped_y;
|
||||
}
|
||||
y_position += y_offset;
|
||||
|
||||
scroll.target_y += round32(y_position - scroll.scroll_y);
|
||||
scroll.scroll_y = y_position;
|
||||
else{
|
||||
new_y_val_aligned = new_position_cursor.wrapped_y;
|
||||
}
|
||||
scroll.scroll_y = edit_fix_markers__compute_scroll_y(line_height, scroll.scroll_y, new_y_val_aligned);
|
||||
}
|
||||
if (view->transient.temp_view_top_left_target_pos != top_left_target_pos){
|
||||
if (top_left_target_pos != top_left_pos){
|
||||
Full_Cursor new_position_cursor = file_compute_cursor(system, file, seek_pos(top_left_target_pos));
|
||||
if (file->settings.unwrapped_lines){
|
||||
new_y_val_aligned = new_position_cursor.unwrapped_y;
|
||||
}
|
||||
else{
|
||||
new_y_val_aligned = new_position_cursor.wrapped_y;
|
||||
}
|
||||
}
|
||||
scroll.target_y = edit_fix_markers__compute_scroll_y(line_height, scroll.target_y, new_y_val_aligned);
|
||||
}
|
||||
|
||||
view_set_cursor_and_scroll(view, new_cursor, true, view->transient.file_data.file->settings.unwrapped_lines, scroll);
|
||||
|
|
|
@ -12,18 +12,18 @@
|
|||
#if !defined(FRED_FILE_H)
|
||||
#define FRED_FILE_H
|
||||
|
||||
enum Edit_Pos_Set_Type{
|
||||
typedef i32 Edit_Pos_Set_Type;
|
||||
enum{
|
||||
EditPos_None,
|
||||
EditPos_CursorSet,
|
||||
EditPos_ScrollSet
|
||||
};
|
||||
struct File_Edit_Positions{
|
||||
Edit_Pos_Set_Type last_set_type;
|
||||
GUI_Scroll_Vars scroll;
|
||||
i32 cursor_pos;
|
||||
f32 preferred_x;
|
||||
i32 scroll_i;
|
||||
i32 last_set_type;
|
||||
b32 in_view;
|
||||
//i32 scroll_i;
|
||||
};
|
||||
|
||||
// TODO(NAME): do(replace Text_Effect with markers over time)
|
||||
|
|
48
4ed_view.cpp
48
4ed_view.cpp
|
@ -1190,9 +1190,43 @@ do_core_render(Application_Links *app){
|
|||
items, item_count);
|
||||
}
|
||||
|
||||
internal Full_Cursor
|
||||
view_get_render_cursor(System_Functions *system, View *view, f32 scroll_y){
|
||||
Full_Cursor result = {};
|
||||
Editing_File *file = view->transient.file_data.file;
|
||||
if (file->settings.unwrapped_lines){
|
||||
result = file_compute_cursor_hint(system, file, seek_unwrapped_xy(0, scroll_y, false));
|
||||
}
|
||||
else{
|
||||
result = file_compute_cursor(system, file, seek_wrapped_xy(0, scroll_y, false));
|
||||
}
|
||||
return(result);
|
||||
}
|
||||
|
||||
internal Full_Cursor
|
||||
view_get_render_cursor(System_Functions *system, View *view){
|
||||
File_Edit_Positions edit_pos = view_get_edit_pos(view);
|
||||
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
|
||||
// to the gui system.
|
||||
scroll_y += view->transient.widget_height;
|
||||
return(view_get_render_cursor(system, view, scroll_y));
|
||||
}
|
||||
|
||||
internal Full_Cursor
|
||||
view_get_render_cursor_target(System_Functions *system, View *view){
|
||||
File_Edit_Positions edit_pos = view_get_edit_pos(view);
|
||||
f32 scroll_y = (f32)edit_pos.scroll.target_y;
|
||||
// NOTE(allen): For now we will temporarily adjust scroll_y to try
|
||||
// to prevent the view moving around until floating sections are added
|
||||
// to the gui system.
|
||||
scroll_y += view->transient.widget_height;
|
||||
return(view_get_render_cursor(system, view, scroll_y));
|
||||
}
|
||||
|
||||
internal void
|
||||
render_loaded_file_in_view(System_Functions *system, View *view, Models *models,
|
||||
i32_Rect rect, b32 is_active, Render_Target *target){
|
||||
render_loaded_file_in_view(System_Functions *system, View *view, Models *models, i32_Rect rect, b32 is_active, Render_Target *target){
|
||||
Editing_File *file = view->transient.file_data.file;
|
||||
i32 line_height = view->transient.line_height;
|
||||
|
||||
|
@ -1226,16 +1260,12 @@ render_loaded_file_in_view(System_Functions *system, View *view, Models *models,
|
|||
// to the gui system.
|
||||
scroll_y += view->transient.widget_height;
|
||||
|
||||
Full_Cursor render_cursor = {};
|
||||
if (!file->settings.unwrapped_lines){
|
||||
render_cursor = file_compute_cursor_hint(system, file, seek_wrapped_xy(0, scroll_y, 0));
|
||||
}
|
||||
else{
|
||||
render_cursor = file_compute_cursor_hint(system, file, seek_unwrapped_xy(0, scroll_y, 0));
|
||||
}
|
||||
Full_Cursor render_cursor = view_get_render_cursor(system, view);
|
||||
|
||||
#if 0
|
||||
// TODO(allen): do(eliminate scroll_i nonsense)
|
||||
view->transient.edit_pos_.scroll_i = render_cursor.pos;
|
||||
#endif
|
||||
|
||||
i32 item_count = 0;
|
||||
i32 end_pos = 0;
|
||||
|
|
|
@ -39,6 +39,9 @@ struct View_Transient{
|
|||
File_Edit_Positions edit_pos_;
|
||||
i32 mark;
|
||||
|
||||
i32 temp_view_top_left_pos;
|
||||
i32 temp_view_top_left_target_pos;
|
||||
|
||||
b32 ui_mode;
|
||||
UI_Quit_Function_Type *ui_quit;
|
||||
UI_Control ui_control;
|
||||
|
@ -56,7 +59,6 @@ struct View_Transient{
|
|||
// It's what I've always wanted!!!! :D
|
||||
i32 line_height;
|
||||
|
||||
// TODO(allen): Do I still use mode?
|
||||
Query_Set query_set;
|
||||
f32 widget_height;
|
||||
|
||||
|
|
Loading…
Reference in New Issue