remove overlapped sections, need floating sections instead

master
Allen Webster 2016-05-31 13:07:31 -04:00
parent 0f3f7ce05b
commit 43f65dd5ef
5 changed files with 84 additions and 150 deletions

View File

@ -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;

44
4ed.cpp
View File

@ -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);
}

View File

@ -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;

View File

@ -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);

View File

@ -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 (n<a)?(a):((n>z)?(z):n);
if (n < a) n = a;
else if (n > z) n = z;
return (n);
}
/*