From 43f65dd5efafb0570eb91218e8ec73fe58ab2e00 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Tue, 31 May 2016 13:07:31 -0400 Subject: [PATCH] remove overlapped sections, need floating sections instead --- 4coder_gui.h | 2 +- 4ed.cpp | 44 ++++++++++--------- 4ed_file_view.cpp | 105 +++++++++++++++++----------------------------- 4ed_gui.cpp | 67 ++++------------------------- 4ed_math.cpp | 16 ++++++- 5 files changed, 84 insertions(+), 150 deletions(-) diff --git a/4coder_gui.h b/4coder_gui.h index 2771b490..28ddc8ef 100644 --- a/4coder_gui.h +++ b/4coder_gui.h @@ -17,7 +17,7 @@ struct GUI_Scroll_Vars{ float scroll_y; float target_y; float prev_target_y; - float min_y, max_y; + float max_y; float scroll_x; float target_x; diff --git a/4ed.cpp b/4ed.cpp index 19eee6a3..b006f540 100644 --- a/4ed.cpp +++ b/4ed.cpp @@ -415,10 +415,9 @@ COMMAND_DECL(center_view){ else{ y = view->recent->cursor.wrapped_y; } - + h = view_file_height(view); - y -= h * .5f; - if (y < view->recent->scroll.min_y) y = view->recent->scroll.min_y; + y = clamp_bottom(0.f, y - h*.5f); view->recent->scroll.target_y = y; } @@ -1362,7 +1361,7 @@ COMMAND_DECL(move_down){ USE_MODELS(models); REQ_READABLE_VIEW(view); REQ_FILE(file, view); - + f32 font_height = (f32)get_font_info(models->font_set, models->global_font.font_id)->height; f32 cy = view_get_cursor_y(view)+font_height; f32 px = view->recent->preferred_x; @@ -1373,7 +1372,7 @@ COMMAND_DECL(move_down){ COMMAND_DECL(seek_end_of_line){ REQ_READABLE_VIEW(view); REQ_FILE(file, view); - + i32 pos = view_find_end_of_line(view, view->recent->cursor.pos); view_cursor_move(view, pos); } @@ -1381,48 +1380,47 @@ COMMAND_DECL(seek_end_of_line){ COMMAND_DECL(seek_beginning_of_line){ REQ_READABLE_VIEW(view); REQ_FILE(file, view); - + i32 pos = view_find_beginning_of_line(view, view->recent->cursor.pos); view_cursor_move(view, pos); } COMMAND_DECL(page_down){ REQ_READABLE_VIEW(view); - + f32 height = view_file_height(view); f32 max_target_y = view->recent->scroll.max_y; - - view->recent->scroll.target_y += height; - if (view->recent->scroll.target_y > max_target_y) view->recent->scroll.target_y = max_target_y; - - view->recent->cursor = view_compute_cursor_from_xy( - view, 0, view->recent->scroll.target_y + (height - view->font_height)*.5f); + + view->recent->scroll.target_y = + clamp_top(view->recent->scroll.target_y + height, max_target_y); + + view->recent->cursor = + view_compute_cursor_from_xy(view, 0, view->recent->scroll.target_y + (height - view->font_height)*.5f); } COMMAND_DECL(page_up){ REQ_READABLE_VIEW(view); - + f32 height = view_file_height(view); - f32 min_target_y = view->recent->scroll.min_y; - - view->recent->scroll.target_y -= height; - if (view->recent->scroll.target_y < min_target_y) view->recent->scroll.target_y = min_target_y; - - view->recent->cursor = view_compute_cursor_from_xy( - view, 0, view->recent->scroll.target_y + (height - view->font_height)*.5f); + + view->recent->scroll.target_y = + clamp_bottom(0.f, view->recent->scroll.target_y - height); + + view->recent->cursor = + view_compute_cursor_from_xy(view, 0, view->recent->scroll.target_y + (height - view->font_height)*.5f); } COMMAND_DECL(open_color_tweaker){ USE_VIEW(view); USE_MODELS(models); - + view_show_theme(view, &models->map_ui); } COMMAND_DECL(open_config){ USE_VIEW(view); USE_MODELS(models); - + view_show_config(view, &models->map_ui); } diff --git a/4ed_file_view.cpp b/4ed_file_view.cpp index d858b124..c8d98518 100644 --- a/4ed_file_view.cpp +++ b/4ed_file_view.cpp @@ -1422,7 +1422,7 @@ view_get_cursor_y(View *view){ internal void view_move_cursor_to_view(View *view){ - f32 min_target_y = view->recent->scroll.min_y; + f32 min_target_y = 0; i32 line_height = view->font_height; f32 old_cursor_y = view_get_cursor_y(view); f32 cursor_y = old_cursor_y; @@ -1465,7 +1465,7 @@ view_move_view_to_cursor(View *view, GUI_Scroll_Vars *scroll){ 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); + f32 cursor_min_y = CursorMinY(0, line_height); if (cursor_y > target_y + cursor_max_y){ target_y = cursor_y - cursor_max_y + delta_y; @@ -1474,8 +1474,7 @@ view_move_view_to_cursor(View *view, GUI_Scroll_Vars *scroll){ 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; + target_y = clamp(0.f, target_y, scroll_vars.max_y); if (cursor_x < target_x){ target_x = (f32)Max(0, cursor_x - max_x/2); @@ -1535,7 +1534,11 @@ view_set_file(View *view, Editing_File *file, Models *models){ if (file_is_ready(file)){ view_measure_wraps(&models->mem.general, view); view->recent->cursor = view_compute_cursor_from_pos(view, view->recent->cursor.pos); + +#if 0 view->recent->scroll.max_y = 1000000000.f; +#endif + view_move_view_to_cursor(view, &view->recent->scroll); } } @@ -1551,11 +1554,13 @@ view_set_file(View *view, Editing_File *file, Models *models){ if (file_is_ready(file)){ view_measure_wraps(&models->mem.general, view); view->recent->cursor = view_compute_cursor_from_pos(view, file->state.cursor_pos); + +#if 0 view->recent->scroll.max_y = 1000000000.f; +#endif + view_move_view_to_cursor(view, &view->recent->scroll); - if (!found_recent_entry){ - view->reinit_scrolling = 1; - } + view->reinit_scrolling = 1; } } } @@ -1564,7 +1569,6 @@ view_set_file(View *view, Editing_File *file, Models *models){ struct Relative_Scrolling{ f32 scroll_x, scroll_y; f32 target_x, target_y; - f32 scroll_min_limit; }; internal Relative_Scrolling @@ -1574,7 +1578,6 @@ view_get_relative_scrolling(View *view){ cursor_y = view_get_cursor_y(view); result.scroll_y = cursor_y - view->recent->scroll.scroll_y; result.target_y = cursor_y - view->recent->scroll.target_y; - result.scroll_min_limit = view->recent->scroll.min_y; return(result); } @@ -1583,10 +1586,8 @@ view_set_relative_scrolling(View *view, Relative_Scrolling scrolling){ f32 cursor_y; cursor_y = view_get_cursor_y(view); view->recent->scroll.scroll_y = cursor_y - scrolling.scroll_y; - view->recent->scroll.target_y = cursor_y - scrolling.target_y; - if (view->recent->scroll.target_y < scrolling.scroll_min_limit){ - view->recent->scroll.target_y = scrolling.scroll_min_limit; - } + view->recent->scroll.target_y = + clamp_bottom(0.f, cursor_y - scrolling.target_y); } inline void @@ -2940,7 +2941,7 @@ style_get_color(Style *style, Cpp_Token token){ inline f32 view_compute_max_target_y(i32 lowest_line, i32 line_height, f32 view_height){ f32 max_target_y = ((lowest_line+.5f)*line_height) - view_height*.5f; - if (max_target_y < 0) max_target_y = 0; + max_target_y = clamp_bottom(0.f, max_target_y); return(max_target_y); } @@ -3402,10 +3403,7 @@ view_reinit_scrolling(View *view){ target_x = (f32)(cursor_x - w*.5f); } - target_y = (f32)FLOOR32(cursor_y - h*.5f); - if (target_y < view->recent->scroll.min_y){ - target_y = view->recent->scroll.min_y; - } + target_y = clamp_bottom(0.f, (f32)FLOOR32(cursor_y - h*.5f)); } view->recent->scroll.target_y = target_y; @@ -3520,7 +3518,7 @@ file_step(View *view, i32_Rect region, Input_Summary *user_input, b32 is_active) f32 rx = (f32)(user_input->mouse.x - region.x0); f32 ry = (f32)(user_input->mouse.y - region.y0); - if (ry >= -view->recent->scroll.min_y){ + if (ry >= 0){ view_set_widget(view, FWIDG_NONE); if (rx >= 0 && rx < max_x && ry >= 0 && ry < max_visible_y){ view_cursor_move(view, rx + scroll_vars.scroll_x, ry + scroll_vars.scroll_y, 1); @@ -3539,14 +3537,10 @@ do_widget(View *view, GUI_Target *target){ Query_Slot *slot; Query_Bar *bar; - gui_begin_serial_section(target); - for (slot = view->query_set.used_slot; slot != 0; slot = slot->next){ bar = slot->query_bar; gui_do_text_field(target, bar->prompt, bar->string); } - - gui_end_serial_section(target); } struct Exhaustive_File_Loop{ @@ -3820,34 +3814,29 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su gui_begin_top_level(target, input); { gui_do_top_bar(target); + do_widget(view, target); if (view->showing_ui == VUI_None){ - gui_begin_overlap(target); + + gui_begin_serial_section(target); { - do_widget(view, target); + f32 delta = 9.f * view->font_height; + GUI_id scroll_context = {0}; + scroll_context.id[1] = view->showing_ui; + scroll_context.id[0] = (u64)(view->file_data.file); - gui_begin_serial_section(target); - { - f32 delta = 9.f * view->font_height; - GUI_id scroll_context = {0}; - scroll_context.id[1] = view->showing_ui; - scroll_context.id[0] = (u64)(view->file_data.file); - - view->current_scroll = &view->recent->scroll; - gui_get_scroll_vars(target, scroll_context, - &view->recent->scroll, &view->scroll_region); - - gui_begin_scrollable(target, scroll_context, view->recent->scroll, - delta, show_scrollbar); - gui_do_file(target); - gui_end_scrollable(target); - } - gui_end_serial_section(target); + view->current_scroll = &view->recent->scroll; + gui_get_scroll_vars(target, scroll_context, + &view->recent->scroll, &view->scroll_region); + + gui_begin_scrollable(target, scroll_context, view->recent->scroll, + delta, show_scrollbar); + gui_do_file(target); + gui_end_scrollable(target); } - gui_end_overlap(target); + gui_end_serial_section(target); } else{ - do_widget(view, target); switch (view->showing_ui){ case VUI_Menu: { @@ -4514,12 +4503,9 @@ do_input_file_view(System_Functions *system, case guicom_file: { - f32 new_min_y = -(f32)(gui_session_get_eclipsed_y(&gui_session) - - gui_session.rect.y0); f32 new_max_y = view_compute_max_target_y(view); view->file_region = gui_session.rect; - result.vars.min_y = new_min_y; result.vars.max_y = new_max_y; if (view->reinit_scrolling){ @@ -4596,10 +4582,8 @@ do_input_file_view(System_Functions *system, if (gui_id_eq(target->mouse_hot, id)){ v = unlerp(gui_session.scroll_top, (f32)my, gui_session.scroll_bottom); - if (v < 0) v = 0; - if (v > 1.f) v = 1.f; - result.vars.target_y = - lerp(result.vars.min_y, v, result.vars.max_y); + v = clamp(0.f, v, 1.f); + result.vars.target_y = lerp(0.f, v, result.vars.max_y); gui_activate_scrolling(target); result.is_animating = 1; @@ -4612,12 +4596,8 @@ do_input_file_view(System_Functions *system, if (user_input->mouse.wheel != 0){ result.vars.target_y += user_input->mouse.wheel*target->delta; - if (result.vars.target_y < result.vars.min_y){ - result.vars.target_y = result.vars.min_y; - } - if (result.vars.target_y > result.vars.max_y){ - result.vars.target_y = result.vars.max_y; - } + result.vars.target_y = + clamp(0.f, result.vars.target_y, result.vars.max_y); gui_activate_scrolling(target); result.is_animating = 1; } @@ -4629,9 +4609,7 @@ do_input_file_view(System_Functions *system, if (scroll_button_input(target, &gui_session, user_input, id, &result.is_animating)){ result.vars.target_y -= target->delta * 0.25f; - if (result.vars.target_y < result.vars.min_y){ - result.vars.target_y = result.vars.min_y; - } + result.vars.target_y = clamp_bottom(0.f, result.vars.target_y); } }break; @@ -4641,19 +4619,14 @@ do_input_file_view(System_Functions *system, if (scroll_button_input(target, &gui_session, user_input, id, &result.is_animating)){ result.vars.target_y += target->delta * 0.25f; - if (result.vars.target_y > result.vars.max_y){ - result.vars.target_y = result.vars.max_y; - } + result.vars.target_y = clamp_top(0.f, result.vars.max_y); } }break; case guicom_end_scrollable_section: { if (!is_file_scroll){ - f32 new_min_y = gui_session.suggested_min_y; f32 new_max_y = gui_session.suggested_max_y; - - result.vars.min_y = new_min_y; result.vars.max_y = new_max_y; } }break; diff --git a/4ed_gui.cpp b/4ed_gui.cpp index c43c5503..81ef53da 100644 --- a/4ed_gui.cpp +++ b/4ed_gui.cpp @@ -171,8 +171,6 @@ struct GUI_Edit{ enum GUI_Command_Type{ guicom_null, - guicom_begin_overlap, - guicom_end_overlap, guicom_begin_serial, guicom_end_serial, guicom_top_bar, @@ -371,16 +369,6 @@ gui_push_string(GUI_Target *target, GUI_Header *h, String s){ gui_push_string(target, h, s, 0); } -internal void -gui_begin_overlap(GUI_Target *target){ - gui_push_simple_command(target, guicom_begin_overlap); -} - -internal void -gui_end_overlap(GUI_Target *target){ - gui_push_simple_command(target, guicom_end_overlap); -} - internal void gui_begin_serial_section(GUI_Target *target){ gui_push_simple_command(target, guicom_begin_serial); @@ -661,10 +649,10 @@ gui_get_scroll_vars(GUI_Target *target, GUI_id scroll_context_id, GUI_Scroll_Var *vars_out = target->scroll_updated; *region_out = target->region_updated; - if (vars_out->target_y < vars_out->min_y) vars_out->target_y = vars_out->min_y; + if (vars_out->target_y < 0) vars_out->target_y = 0; if (vars_out->target_y > vars_out->max_y) vars_out->target_y = vars_out->max_y; - if (vars_out->scroll_y < vars_out->min_y) vars_out->scroll_y = vars_out->min_y; + if (vars_out->scroll_y < 0) vars_out->scroll_y = 0; if (vars_out->scroll_y > vars_out->max_y) vars_out->scroll_y = vars_out->max_y; if (gui_id_eq(target->active, gui_id_scrollbar())){ @@ -724,7 +712,6 @@ gui_activate_scrolling(GUI_Target *target){ } struct GUI_Section{ - b32 overlapped; i32 max_v, v, top_v; }; @@ -739,7 +726,6 @@ struct GUI_Session{ i32_Rect full_rect; i32_Rect rect; - f32 suggested_min_y; f32 suggested_max_y; i32 clip_y; @@ -759,17 +745,11 @@ struct GUI_Session{ #define GUIScrollbarWidth 16 +// TODO(allen): We can probably totally get rid of this now. internal i32 gui_session_get_eclipsed_y(GUI_Session *session){ - GUI_Section *section = session->sections; - i32 count = session->t + 1, i; - i32 max_v = 0; - for (i = 0; i < count; ++i, ++section){ - if (section->overlapped){ - max_v = Max(max_v, section->max_v); - } - } - max_v = Max(max_v, session->sections[count-1].top_v); + i32 count = session->t + 1; + i32 max_v = session->sections[count-1].top_v; return(max_v); } @@ -804,9 +784,7 @@ gui_session_init(GUI_Session *session, GUI_Target *target, internal void gui_section_end_item(GUI_Section *section, i32 v){ - if (!section->overlapped){ - section->v = v; - } + section->v = v; if (section->max_v < v){ section->max_v = v; } @@ -978,29 +956,10 @@ gui_interpret(GUI_Target *target, GUI_Session *session, GUI_Header *h, switch (h->type){ case guicom_null: Assert(0); break; - case guicom_begin_overlap: - ++session->t; - Assert(session->t < ArrayCount(session->sections)); - new_section = &session->sections[session->t]; - new_section->overlapped = 1; - new_section->v = y; - new_section->max_v = y; - new_section->top_v = y; - break; - - case guicom_end_overlap: - Assert(session->t > 0); - Assert(section->overlapped); - prev_section = &session->sections[--session->t]; - end_v = section->max_v; - end_section = prev_section; - break; - case guicom_begin_serial: ++session->t; Assert(session->t < ArrayCount(session->sections)); new_section = &session->sections[session->t]; - new_section->overlapped = 0; new_section->v = y; new_section->max_v = y; new_section->top_v = y; @@ -1008,7 +967,6 @@ gui_interpret(GUI_Target *target, GUI_Session *session, GUI_Header *h, case guicom_end_serial: Assert(session->t > 0); - Assert(!section->overlapped); prev_section = &session->sections[--session->t]; end_v = section->max_v; end_section = prev_section; @@ -1110,7 +1068,6 @@ gui_interpret(GUI_Target *target, GUI_Session *session, GUI_Header *h, case guicom_scrollable: Assert(session->is_scrollable == 0); - Assert(!section->overlapped); session->is_scrollable = 1; always_give_to_user = 1; @@ -1128,7 +1085,6 @@ gui_interpret(GUI_Target *target, GUI_Session *session, GUI_Header *h, case guicom_scrollable_bar: Assert(session->is_scrollable); - Assert(!section->overlapped); give_to_user = 1; rect.x1 = session->full_rect.x1; rect.x0 = rect.x1 - GUIScrollbarWidth; @@ -1151,7 +1107,6 @@ gui_interpret(GUI_Target *target, GUI_Session *session, GUI_Header *h, case guicom_scrollable_top: Assert(session->is_scrollable); - Assert(!section->overlapped); give_to_user = 1; gui_scrollbar_top(session->scroll_rect, &rect); scroll_v = 0; @@ -1159,29 +1114,26 @@ gui_interpret(GUI_Target *target, GUI_Session *session, GUI_Header *h, case guicom_scrollable_slider: Assert(session->is_scrollable); - Assert(!section->overlapped); give_to_user = 1; lerp_space_scroll_v = - unlerp((f32)target->scroll_original.min_y, + unlerp(0, (f32)target->scroll_original.target_y, (f32)target->scroll_original.max_y); gui_scrollbar_slider(session->scroll_rect, &rect, lerp_space_scroll_v, &session->scroll_top, &session->scroll_bottom, - target->scroll_original.min_y, target->scroll_original.max_y); + 0, target->scroll_original.max_y); scroll_v = 0; break; case guicom_scrollable_invisible: Assert(session->is_scrollable); - Assert(!section->overlapped); always_give_to_user = 1; break; case guicom_scrollable_bottom: Assert(session->is_scrollable); - Assert(!section->overlapped); give_to_user = 1; gui_scrollbar_bottom(session->scroll_rect, &rect); scroll_v = 0; @@ -1196,9 +1148,6 @@ gui_interpret(GUI_Target *target, GUI_Session *session, GUI_Header *h, case guicom_end_scrollable_section: always_give_to_user = 1; - session->suggested_min_y = - -(f32)(gui_session_get_eclipsed_y(session) - - gui_session_get_current_top(session)); session->suggested_max_y = (f32)(session->scrollable_items_bottom - session->full_rect.y1 * .5f); diff --git a/4ed_math.cpp b/4ed_math.cpp index cb49e7c0..de324c35 100644 --- a/4ed_math.cpp +++ b/4ed_math.cpp @@ -464,9 +464,23 @@ unlerp(f32 a, f32 x, f32 b){ return(r); } +inline f32 +clamp_bottom(f32 a, f32 n){ + if (n < a) n = a; + return (n); +} + +inline f32 +clamp_top(f32 n, f32 z){ + if (n > z) n = z; + return (n); +} + inline f32 clamp(f32 a, f32 n, f32 z){ - return (nz)?(z):n); + if (n < a) n = a; + else if (n > z) n = z; + return (n); } /*