cleaned up view vs cursor issue, fixed casey goto error bug
parent
134e166099
commit
a16e77abd4
30
4ed.cpp
30
4ed.cpp
|
@ -4494,14 +4494,40 @@ App_Step_Sig(app_step){
|
||||||
|
|
||||||
// NOTE(allen): post scroll vars back to the view's gui targets
|
// NOTE(allen): post scroll vars back to the view's gui targets
|
||||||
{
|
{
|
||||||
View *view;
|
View *view = 0;
|
||||||
Panel *panel, *used_panels;
|
Panel *panel = 0, *used_panels = 0;
|
||||||
|
i32 cursor_view_state = 0;
|
||||||
|
|
||||||
used_panels = &models->layout.used_sentinel;
|
used_panels = &models->layout.used_sentinel;
|
||||||
for (dll_items(panel, used_panels)){
|
for (dll_items(panel, used_panels)){
|
||||||
view = panel->view;
|
view = panel->view;
|
||||||
|
|
||||||
|
cursor_view_state = view_get_cursor_view_change_state(view);
|
||||||
|
|
||||||
|
switch (cursor_view_state){
|
||||||
|
case CursorView_NoChange:break;
|
||||||
|
|
||||||
|
case CursorView_Cursor:
|
||||||
|
case CursorView_Both:
|
||||||
|
view_move_view_to_cursor(view);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CursorView_View:
|
||||||
|
gui_post_scroll_vars(&view->gui_target, view->current_scroll);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
if (view->gui_target.did_file){
|
||||||
|
if (view->prev_cursor_pos != view->file_data.cursor.pos){
|
||||||
|
view_move_view_to_cursor(view);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (view->current_scroll){
|
if (view->current_scroll){
|
||||||
gui_post_scroll_vars(&view->gui_target, view->current_scroll);
|
gui_post_scroll_vars(&view->gui_target, view->current_scroll);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -193,6 +193,7 @@ struct View{
|
||||||
Command_Map *map;
|
Command_Map *map;
|
||||||
|
|
||||||
File_Viewing_Data file_data;
|
File_Viewing_Data file_data;
|
||||||
|
i32 prev_cursor_pos;
|
||||||
|
|
||||||
i32_Rect file_region_prev;
|
i32_Rect file_region_prev;
|
||||||
i32_Rect file_region;
|
i32_Rect file_region;
|
||||||
|
@ -3118,51 +3119,135 @@ view_reinit_scrolling(View *view){
|
||||||
#define CursorMaxY(m,h) (CursorMaxY_(m,h) > 0)?(CursorMaxY_(m,h)):(0)
|
#define CursorMaxY(m,h) (CursorMaxY_(m,h) > 0)?(CursorMaxY_(m,h)):(0)
|
||||||
#define CursorMinY(m,h) (CursorMinY_(m,h) > 0)?(CursorMinY_(m,h)):(0)
|
#define CursorMinY(m,h) (CursorMinY_(m,h) > 0)?(CursorMinY_(m,h)):(0)
|
||||||
|
|
||||||
|
internal void
|
||||||
|
view_move_cursor_to_view(View *view){
|
||||||
|
f32 min_target_y = view->recent->scroll.min_y;
|
||||||
|
i32 line_height = view->font_height;
|
||||||
|
f32 old_cursor_y = view_get_cursor_y(view);
|
||||||
|
f32 cursor_y = old_cursor_y;
|
||||||
|
f32 target_y = view->recent->scroll.target_y;
|
||||||
|
f32 cursor_max_y = CursorMaxY(view_file_height(view), line_height);
|
||||||
|
f32 cursor_min_y = CursorMinY(min_target_y, line_height);
|
||||||
|
|
||||||
|
if (cursor_y > target_y + cursor_max_y){
|
||||||
|
cursor_y = target_y + cursor_max_y;
|
||||||
|
}
|
||||||
|
if (target_y != 0 && cursor_y < target_y + cursor_min_y){
|
||||||
|
cursor_y = target_y + cursor_min_y;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cursor_y != old_cursor_y){
|
||||||
|
if (cursor_y > old_cursor_y){
|
||||||
|
cursor_y += line_height;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
cursor_y -= line_height;
|
||||||
|
}
|
||||||
|
view->file_data.cursor =
|
||||||
|
view_compute_cursor_from_xy(view, view->file_data.preferred_x, cursor_y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void
|
||||||
|
view_move_view_to_cursor(View *view){
|
||||||
|
f32 line_height = (f32)view->font_height;
|
||||||
|
f32 delta_y = 3.f*line_height;
|
||||||
|
|
||||||
|
f32 max_visible_y = view_file_height(view);
|
||||||
|
f32 max_x = view_file_width(view);
|
||||||
|
|
||||||
|
f32 cursor_y = view_get_cursor_y(view);
|
||||||
|
f32 cursor_x = view_get_cursor_x(view);
|
||||||
|
|
||||||
|
GUI_Scroll_Vars scroll_vars = view->gui_target.scroll_updated;
|
||||||
|
f32 target_y = scroll_vars.target_y;
|
||||||
|
f32 target_x = scroll_vars.target_x;
|
||||||
|
|
||||||
|
f32 cursor_max_y = CursorMaxY(max_visible_y, line_height);
|
||||||
|
f32 cursor_min_y = CursorMinY(scroll_vars.min_y, line_height);
|
||||||
|
|
||||||
|
if (cursor_y > target_y + cursor_max_y){
|
||||||
|
target_y = cursor_y - cursor_max_y + delta_y;
|
||||||
|
}
|
||||||
|
if (cursor_y < target_y + cursor_min_y){
|
||||||
|
target_y = cursor_y - delta_y - cursor_min_y;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (target_y > scroll_vars.max_y) target_y = scroll_vars.max_y;
|
||||||
|
if (target_y < scroll_vars.min_y) target_y = view->recent->scroll.min_y;
|
||||||
|
|
||||||
|
if (cursor_x < target_x){
|
||||||
|
target_x = (f32)Max(0, cursor_x - max_x/2);
|
||||||
|
}
|
||||||
|
else if (cursor_x >= target_x + max_x){
|
||||||
|
target_x = (f32)(cursor_x - max_x/2);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (target_x != scroll_vars.target_x || target_y != scroll_vars.target_y){
|
||||||
|
view->gui_target.scroll_updated.target_x = target_x;
|
||||||
|
view->gui_target.scroll_updated.target_y = target_y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
enum CursorView_State{
|
||||||
|
CursorView_NoChange,
|
||||||
|
CursorView_Cursor,
|
||||||
|
CursorView_View,
|
||||||
|
CursorView_Both
|
||||||
|
};
|
||||||
|
|
||||||
|
internal i32
|
||||||
|
view_get_cursor_view_change_state(View *view){
|
||||||
|
i32 result = 0;
|
||||||
|
b32 cursor_change = 0;
|
||||||
|
b32 view_change = 0;
|
||||||
|
|
||||||
|
if (view->gui_target.did_file){
|
||||||
|
cursor_change = (view->prev_cursor_pos != view->file_data.cursor.pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!gui_scroll_eq(view->current_scroll, &view->gui_target.scroll_updated)){
|
||||||
|
view_change = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cursor_change){
|
||||||
|
if (view_change){
|
||||||
|
result = CursorView_Both;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
result = CursorView_Cursor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
if (view_change){
|
||||||
|
result = CursorView_View;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
result = CursorView_NoChange;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
internal b32
|
internal b32
|
||||||
file_step(View *view, i32_Rect region, Input_Summary *user_input, b32 is_active){
|
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){
|
||||||
f32 line_height = (f32)view->font_height;
|
|
||||||
f32 delta_y = 3.f*line_height;
|
|
||||||
|
|
||||||
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);
|
|
||||||
|
|
||||||
GUI_Scroll_Vars scroll_vars = view->gui_target.scroll_updated;
|
GUI_Scroll_Vars scroll_vars = view->gui_target.scroll_updated;
|
||||||
f32 target_y = scroll_vars.target_y;
|
|
||||||
f32 target_x = scroll_vars.target_x;
|
|
||||||
|
|
||||||
f32 cursor_max_y = CursorMaxY(max_visible_y, line_height);
|
view->prev_cursor_pos = view->file_data.cursor.pos;
|
||||||
f32 cursor_min_y = CursorMinY(scroll_vars.min_y, line_height);
|
|
||||||
|
|
||||||
|
#if 0
|
||||||
if (!gui_id_eq(view->gui_target.active, gui_id_scrollbar())){
|
if (!gui_id_eq(view->gui_target.active, gui_id_scrollbar())){
|
||||||
if (cursor_y > target_y + cursor_max_y){
|
view_move_view_to_cursor(view);
|
||||||
target_y = cursor_y - cursor_max_y + delta_y;
|
|
||||||
}
|
|
||||||
if (cursor_y < target_y + cursor_min_y){
|
|
||||||
target_y = cursor_y - delta_y - cursor_min_y;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (target_y > scroll_vars.max_y) target_y = scroll_vars.max_y;
|
|
||||||
if (target_y < scroll_vars.min_y) target_y = view->recent->scroll.min_y;
|
|
||||||
|
|
||||||
if (cursor_x < target_x){
|
|
||||||
target_x = (f32)Max(0, cursor_x - max_x/2);
|
|
||||||
}
|
|
||||||
else if (cursor_x >= target_x + max_x){
|
|
||||||
target_x = (f32)(cursor_x - max_x/2);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (target_x != scroll_vars.target_x || target_y != scroll_vars.target_y){
|
|
||||||
view->gui_target.scroll_updated.target_x = target_x;
|
|
||||||
view->gui_target.scroll_updated.target_y = target_y;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (file->state.paste_effect.tick_down > 0){
|
if (file->state.paste_effect.tick_down > 0){
|
||||||
--file->state.paste_effect.tick_down;
|
--file->state.paste_effect.tick_down;
|
||||||
is_animating = 1;
|
is_animating = 1;
|
||||||
|
@ -3479,8 +3564,6 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su
|
||||||
Models *models = view->models;
|
Models *models = view->models;
|
||||||
Key_Summary keys = input.keys;
|
Key_Summary keys = input.keys;
|
||||||
|
|
||||||
f32 min_target_y = view->recent->scroll.min_y;
|
|
||||||
|
|
||||||
b32 show_scrollbar = !view->hide_scrollbar;
|
b32 show_scrollbar = !view->hide_scrollbar;
|
||||||
|
|
||||||
view->current_scroll = 0;
|
view->current_scroll = 0;
|
||||||
|
@ -3496,37 +3579,14 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su
|
||||||
|
|
||||||
gui_begin_serial_section(target);
|
gui_begin_serial_section(target);
|
||||||
{
|
{
|
||||||
i32 line_height = view->font_height;
|
|
||||||
f32 old_cursor_y = view_get_cursor_y(view);
|
|
||||||
f32 cursor_y = old_cursor_y;
|
|
||||||
f32 cursor_max_y = CursorMaxY(view_file_height(view), line_height);
|
|
||||||
f32 cursor_min_y = CursorMinY(min_target_y, line_height);
|
|
||||||
f32 delta = 9.f * view->font_height;
|
f32 delta = 9.f * view->font_height;
|
||||||
f32 target_y = 0;
|
|
||||||
|
|
||||||
view->current_scroll = &view->recent->scroll;
|
view->current_scroll = &view->recent->scroll;
|
||||||
if (gui_get_scroll_vars(target, view->showing_ui,
|
if (gui_get_scroll_vars(target, view->showing_ui,
|
||||||
&view->recent->scroll, &view->scroll_region)){
|
&view->recent->scroll, &view->scroll_region)){
|
||||||
target_y = view->recent->scroll.target_y;
|
view_move_cursor_to_view(view);
|
||||||
if (cursor_y > target_y + cursor_max_y){
|
|
||||||
cursor_y = target_y + cursor_max_y;
|
|
||||||
}
|
|
||||||
if (target_y != 0 && cursor_y < target_y + cursor_min_y){
|
|
||||||
cursor_y = target_y + cursor_min_y;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cursor_y != old_cursor_y){
|
|
||||||
if (cursor_y > old_cursor_y){
|
|
||||||
cursor_y += view->font_height;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
cursor_y -= view->font_height;
|
|
||||||
}
|
|
||||||
view->file_data.cursor =
|
|
||||||
view_compute_cursor_from_xy(view, view->file_data.preferred_x, cursor_y);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gui_begin_scrollable(target, view->showing_ui, view->recent->scroll,
|
gui_begin_scrollable(target, view->showing_ui, view->recent->scroll,
|
||||||
delta, show_scrollbar);
|
delta, show_scrollbar);
|
||||||
gui_do_file(target);
|
gui_do_file(target);
|
||||||
|
|
|
@ -160,6 +160,7 @@ struct GUI_Target{
|
||||||
u32 scroll_id;
|
u32 scroll_id;
|
||||||
b32 has_keys;
|
b32 has_keys;
|
||||||
b32 animating;
|
b32 animating;
|
||||||
|
b32 did_file;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct GUI_Item_Update{
|
struct GUI_Item_Update{
|
||||||
|
@ -415,6 +416,7 @@ gui_begin_top_level(GUI_Target *target, Input_Summary input){
|
||||||
target->push.pos = 0;
|
target->push.pos = 0;
|
||||||
target->has_keys = (input.keys.count > 0);
|
target->has_keys = (input.keys.count > 0);
|
||||||
target->animating = 0;
|
target->animating = 0;
|
||||||
|
target->did_file = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
|
@ -431,6 +433,7 @@ gui_do_top_bar(GUI_Target *target){
|
||||||
internal void
|
internal void
|
||||||
gui_do_file(GUI_Target *target){
|
gui_do_file(GUI_Target *target){
|
||||||
gui_push_simple_command(target, guicom_file);
|
gui_push_simple_command(target, guicom_file);
|
||||||
|
target->did_file = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
|
|
Loading…
Reference in New Issue