181 lines
7.1 KiB
C++
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
|
|
|