4coder/4ed_view_ui.cpp

181 lines
7.1 KiB
C++

/*
* Mr. 4th Dimention - Allen Webster
*
* ??.??.2018
*
* View GUI layouts and implementations
*
*/
// TOP
internal GUI_Scroll_Vars
do_step_file_view(System_Functions *system, Models *models, View *view, i32_Rect rect, b32 is_active, f32 dt, GUI_Scroll_Vars scroll){
Editing_File *file = view->file;
// TODO(allen): do(eliminate the built in paste_effect)
if (!file->is_loading && file->state.paste_effect.seconds_down > 0.f){
file->state.paste_effect.seconds_down -= dt;
models->animate_next_frame = true;
}
// NOTE(allen): call scroll rule hook
b32 is_new_target = (scroll.target_x != view->prev_target.x || scroll.target_y != view->prev_target.y);
f32 target_x = (f32)scroll.target_x;
f32 target_y = (f32)scroll.target_y;
View_ID view_id = view_get_id(&models->live_set, view);
if (models->scroll_rule(target_x, target_y, &scroll.scroll_x, &scroll.scroll_y, view_id, is_new_target, dt)){
models->animate_next_frame = true;
}
view->prev_target.x = scroll.target_x;
view->prev_target.y = scroll.target_y;
return(scroll);
}
////////////////////////////////
#if 0
internal void
do_render_file_view(System_Functions *system, View *view, Models *models, GUI_Scroll_Vars *scroll, View *active, i32_Rect rect, b32 is_active, Render_Target *target){
Editing_File *file = view->file;
Assert(file != 0);
draw_push_clip(target, rect);
if (!view->ui_mode){
if (file_is_ready(file)){
Rect_i32 buffer_rect = view_get_buffer_rect(models, view);
//render_loaded_file_in_view(system, view, models, buffer_rect, is_active, target);
Editing_File *file = view->file;
i32 line_height = view->line_height;
f32 max_x = (f32)file->settings.display_width;
i32 max_y = buffer_rect.y1 - buffer_rect.y0 + line_height;
Assert(file != 0);
Assert(!file->is_dummy);
Assert(buffer_good(&file->state.buffer));
Partition *part = &models->mem.part;
Temp_Memory temp = begin_temp_memory(part);
push_align(part, 4);
f32 left_side_space = 0;
i32 max = part_remaining(part)/sizeof(Buffer_Render_Item);
Buffer_Render_Item *items = push_array(part, Buffer_Render_Item, 0);
b32 wrapped = !file->settings.unwrapped_lines;
Face_ID font_id = file->settings.font_id;
Font_Pointers font = system->font.get_pointers_by_id(font_id);
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;
Full_Cursor render_cursor = view_get_render_cursor(system, view);
i32 item_count = 0;
i32 end_pos = 0;
{
Buffer_Render_Params params;
params.buffer = &file->state.buffer;
params.items = items;
params.max = max;
params.count = &item_count;
params.port_x = (f32)buffer_rect.x0 + left_side_space;
params.port_y = (f32)buffer_rect.y0;
params.clip_w = view_width(models, view) - left_side_space;
params.scroll_x = scroll_x;
params.scroll_y = scroll_y;
params.width = max_x;
params.height = (f32)max_y;
params.start_cursor = render_cursor;
params.wrapped = wrapped;
params.system = system;
params.font = font;
params.virtual_white = file->settings.virtual_white;
params.wrap_slashes = file->settings.wrap_indicator;
Buffer_Render_State state = {};
Buffer_Layout_Stop stop = {};
f32 line_shift = 0.f;
b32 do_wrap = false;
i32 wrap_unit_end = 0;
b32 first_wrap_determination = true;
i32 wrap_array_index = 0;
do{
stop = buffer_render_data(&state, params, line_shift, do_wrap, wrap_unit_end);
switch (stop.status){
case BLStatus_NeedWrapDetermination:
{
if (first_wrap_determination){
wrap_array_index = binary_search(file->state.wrap_positions, stop.pos, 0, file->state.wrap_position_count);
++wrap_array_index;
if (file->state.wrap_positions[wrap_array_index] == stop.pos){
do_wrap = true;
wrap_unit_end = file->state.wrap_positions[wrap_array_index];
}
else{
do_wrap = false;
wrap_unit_end = file->state.wrap_positions[wrap_array_index];
}
first_wrap_determination = false;
}
else{
Assert(stop.pos == wrap_unit_end);
do_wrap = true;
++wrap_array_index;
wrap_unit_end = file->state.wrap_positions[wrap_array_index];
}
}break;
case BLStatus_NeedWrapLineShift:
case BLStatus_NeedLineShift:
{
line_shift = file->state.line_indents[stop.wrap_line_index];
}break;
}
}while(stop.status != BLStatus_Finished);
end_pos = state.i;
}
push_array(part, Buffer_Render_Item, item_count);
Range on_screen_range = {};
on_screen_range.first = render_cursor.pos;
on_screen_range.one_past_last = end_pos;
////////////////////////////////
if (models->render_caller != 0){
view_call_render_caller(models, target, view, buffer_rect, render_cursor, on_screen_range, items, item_count, do_core_render);
}
else{
render_loaded_file_in_view__inner(models, target, view, buffer_rect, render_cursor, on_screen_range, items, item_count);
}
end_temp_memory(temp);
}
}
else{
Full_Cursor render_cursor = {};
Range on_screen_range = {};
if (models->render_caller != 0){
view_call_render_caller(models, target, view, buffer_rect, render_cursor, on_screen_range, 0, 0, dont_do_core_render);
}
}
draw_pop_clip(target);
}
#endif
// BOTTOM