Remove the persistent and transient sub parts of the view, just a view now

This commit is contained in:
Allen Webster 2019-02-10 01:18:34 -08:00
parent 7b4705be60
commit 90163a2f85
10 changed files with 237 additions and 230 deletions

View File

@ -9,7 +9,7 @@ buffer_find_hard_start(Application_Links *app, Buffer_Summary *buffer, int32_t l
tab_width -= 1;
Hard_Start_Result result = {};
result.all_space = 1;
result.all_space = true;
result.indent_pos = 0;
result.char_pos = line_start;
@ -17,7 +17,7 @@ buffer_find_hard_start(Application_Links *app, Buffer_Summary *buffer, int32_t l
Stream_Chunk stream = {};
stream.add_null = true;
if (init_stream_chunk(&stream, app, buffer, line_start, data_chunk, sizeof(data_chunk))){
int32_t still_looping = 1;
bool32 still_looping = true;
do{
for (; result.char_pos < stream.end; ++result.char_pos){
char c = stream.data[result.char_pos];
@ -36,7 +36,7 @@ buffer_find_hard_start(Application_Links *app, Buffer_Summary *buffer, int32_t l
}
if (c != ' '){
result.all_space = 0;
result.all_space = false;
}
result.indent_pos += 1;
@ -51,8 +51,7 @@ buffer_find_hard_start(Application_Links *app, Buffer_Summary *buffer, int32_t l
static Buffer_Batch_Edit
make_batch_from_indent_marks(Application_Links *app, Partition *arena, Buffer_Summary *buffer,
int32_t first_line, int32_t one_past_last_line,
int32_t *indent_marks, Indent_Options opts){
int32_t first_line, int32_t one_past_last_line, int32_t *indent_marks, Indent_Options opts){
int32_t *shifted_indent_marks = indent_marks - first_line;
int32_t edit_count = 0;

View File

@ -242,9 +242,9 @@ int32_t line_number;
};
static Command_Metadata fcoder_metacmd_table[220] = {
{ PROC_LINKS(allow_mouse, 0), "allow_mouse", 11, "Shows the mouse and causes all mouse input to be processed normally.", 68, "w:\\4ed\\code\\4coder_default_framework.cpp", 40, 240 },
{ PROC_LINKS(auto_tab_line_at_cursor, 0), "auto_tab_line_at_cursor", 23, "Auto-indents the line on which the cursor sits.", 47, "w:\\4ed\\code\\4coder_auto_indent.cpp", 34, 722 },
{ PROC_LINKS(auto_tab_range, 0), "auto_tab_range", 14, "Auto-indents the range between the cursor and the mark.", 55, "w:\\4ed\\code\\4coder_auto_indent.cpp", 34, 733 },
{ PROC_LINKS(auto_tab_whole_file, 0), "auto_tab_whole_file", 19, "Audo-indents the entire current buffer.", 39, "w:\\4ed\\code\\4coder_auto_indent.cpp", 34, 712 },
{ PROC_LINKS(auto_tab_line_at_cursor, 0), "auto_tab_line_at_cursor", 23, "Auto-indents the line on which the cursor sits.", 47, "w:\\4ed\\code\\4coder_auto_indent.cpp", 34, 721 },
{ PROC_LINKS(auto_tab_range, 0), "auto_tab_range", 14, "Auto-indents the range between the cursor and the mark.", 55, "w:\\4ed\\code\\4coder_auto_indent.cpp", 34, 732 },
{ PROC_LINKS(auto_tab_whole_file, 0), "auto_tab_whole_file", 19, "Audo-indents the entire current buffer.", 39, "w:\\4ed\\code\\4coder_auto_indent.cpp", 34, 711 },
{ PROC_LINKS(backspace_char, 0), "backspace_char", 14, "Deletes the character to the left of the cursor.", 48, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 97 },
{ PROC_LINKS(backspace_word, 0), "backspace_word", 14, "Delete characters between the cursor position and the first alphanumeric boundary to the left.", 94, "w:\\4ed\\code\\4coder_seek.cpp", 27, 1258 },
{ PROC_LINKS(basic_change_active_panel, 0), "basic_change_active_panel", 25, "Change the currently active panel, moving to the panel with the next highest view_id. Will not skipe the build panel if it is open.", 132, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 504 },
@ -453,7 +453,7 @@ static Command_Metadata fcoder_metacmd_table[220] = {
{ PROC_LINKS(view_buffer_other_panel, 0), "view_buffer_other_panel", 23, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1542 },
{ PROC_LINKS(view_jump_list_with_lister, 0), "view_jump_list_with_lister", 26, "When executed on a buffer with jumps, creates a persistent lister for all the jumps", 83, "w:\\4ed\\code\\4coder_jump_lister.cpp", 34, 108 },
{ PROC_LINKS(word_complete, 0), "word_complete", 13, "Iteratively tries completing the word to the left of the cursor with other words in open buffers that have the same prefix string.", 130, "w:\\4ed\\code\\4coder_search.cpp", 29, 856 },
{ PROC_LINKS(write_and_auto_tab, 0), "write_and_auto_tab", 18, "Inserts a character and auto-indents the line on which the cursor sits.", 71, "w:\\4ed\\code\\4coder_auto_indent.cpp", 34, 745 },
{ PROC_LINKS(write_and_auto_tab, 0), "write_and_auto_tab", 18, "Inserts a character and auto-indents the line on which the cursor sits.", 71, "w:\\4ed\\code\\4coder_auto_indent.cpp", 34, 744 },
{ PROC_LINKS(write_block, 0), "write_block", 11, "At the cursor, insert a block comment.", 38, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 46, 103 },
{ PROC_LINKS(write_character, 0), "write_character", 15, "Inserts whatever character was used to trigger this command.", 60, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 63 },
{ PROC_LINKS(write_hack, 0), "write_hack", 10, "At the cursor, insert a '// HACK' comment, includes user name if it was specified in config.4coder.", 99, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 46, 91 },

37
4ed.cpp
View File

@ -78,12 +78,12 @@ file_cursor_to_end(System_Functions *system, Models *models, Editing_File *file)
panel != 0;
panel = layout_get_next_open_panel(layout, panel)){
View *view = panel->view;
if (view->transient.file_data.file != file){
if (view->file_data.file != file){
continue;
}
view_cursor_move(system, view, pos);
File_Edit_Positions edit_pos = view_get_edit_pos(view);
view->transient.mark = edit_pos.cursor_pos;
view->mark = edit_pos.cursor_pos;
}
}
@ -105,8 +105,8 @@ file_cursor_to_end(System_Functions *system, Models *models, Editing_File *file)
#define REQ_OPEN_VIEW(n) USE_VIEW(n); if (view_lock_flags(n) != 0) return
#define REQ_FILE(n,v) Editing_File *n = (v)->transient.file_data.file; if (n == 0) return
#define REQ_FILE_HISTORY(n,v) Editing_File *n = (v)->transient.file_data.file; if (n == 0 || n->state.undo.undo.edits == 0) return
#define REQ_FILE(n,v) Editing_File *n = (v)->file_data.file; if (n == 0) return
#define REQ_FILE_HISTORY(n,v) Editing_File *n = (v)->file_data.file; if (n == 0 || n->state.undo.undo.edits == 0) return
SCROLL_RULE_SIG(fallback_scroll_rule){
b32 result = false;
@ -736,7 +736,7 @@ force_abort_coroutine(System_Functions *system, Models *models, View *view){
// TODO(allen): post grave warning
models->command_coroutine = 0;
}
init_query_set(&view->transient.query_set);
init_query_set(&view->query_set);
}
internal void
@ -802,20 +802,17 @@ App_Init_Sig(app_init){
models->live_set.views = push_array(part, View, models->live_set.max);
//dll_init_sentinel
models->live_set.free_sentinel.transient.next = &models->live_set.free_sentinel;
models->live_set.free_sentinel.transient.prev = &models->live_set.free_sentinel;
models->live_set.free_sentinel.next = &models->live_set.free_sentinel;
models->live_set.free_sentinel.prev = &models->live_set.free_sentinel;
i32 max = models->live_set.max;
View *view = models->live_set.views;
for (i32 i = 0; i < max; ++i, ++view){
//dll_insert(&models->live_set.free_sentinel, view);
view->transient.next = models->live_set.free_sentinel.transient.next;
view->transient.prev = &models->live_set.free_sentinel;
models->live_set.free_sentinel.transient.next = view;
view->transient.next->transient.prev = view;
View_Persistent *persistent = &view->persistent;
persistent->id = i;
view->next = models->live_set.free_sentinel.next;
view->prev = &models->live_set.free_sentinel;
models->live_set.free_sentinel.next = view;
view->next->prev = view;
}
}
@ -907,7 +904,7 @@ App_Init_Sig(app_init){
Panel *panel = layout_initialize(part, &models->layout);
View *new_view = live_set_alloc_view(&models->mem.heap, &models->lifetime_allocator, &models->live_set);
panel->view = new_view;
new_view->transient.panel = panel;
new_view->panel = panel;
view_set_file(system, models, new_view, models->scratch_buffer);
}
@ -1238,7 +1235,7 @@ App_Step_Sig(app_step){
app_result.animating = true;
if (models->command_coroutine == 0){
init_query_set(&view->transient.query_set);
init_query_set(&view->query_set);
}
}
}
@ -1294,20 +1291,20 @@ App_Step_Sig(app_step){
i32 max_y = 0;
b32 file_scroll = false;
File_Edit_Positions edit_pos = view_get_edit_pos(view);
if (!view->transient.ui_mode){
if (!view->ui_mode){
scroll_vars = &edit_pos.scroll;
max_y = view_compute_max_target_y(view);
file_scroll = true;
}
else{
scroll_vars = &view->transient.ui_scroll;
i32 bottom = view->transient.ui_control.bounding_box[UICoordinates_Scrolled].y1;
scroll_vars = &view->ui_scroll;
i32 bottom = view->ui_control.bounding_box[UICoordinates_Scrolled].y1;
max_y = view_compute_max_target_y_from_bottom_y(view, (f32)bottom);
file_scroll = false;
}
b32 active = (panel == active_panel);
Input_Process_Result ip_result = do_step_file_view(system, view, models, panel->rect_inner, active, dt, *scroll_vars, max_y);
Input_Process_Result ip_result = do_step_file_view(system, models, view, panel->rect_inner, active, dt, *scroll_vars, max_y);
if (ip_result.is_animating){
app_result.animating = true;

View File

@ -51,32 +51,32 @@ fill_buffer_summary(Buffer_Summary *buffer, Editing_File *file, Working_Set *wor
internal void
fill_view_summary(System_Functions *system, View_Summary *view, View *vptr, Live_Views *live_set, Working_Set *working_set){
File_Viewing_Data *data = &vptr->transient.file_data;
File_Viewing_Data *data = &vptr->file_data;
memset(view, 0, sizeof(*view));
if (vptr->transient.in_use){
if (vptr->in_use){
view->exists = true;
view->view_id = (int32_t)(vptr - live_set->views) + 1;
view->line_height = (f32)(vptr->transient.line_height);
view->line_height = (f32)(vptr->line_height);
view->unwrapped_lines = data->file->settings.unwrapped_lines;
view->show_whitespace = data->show_whitespace;
view->lock_flags = view_lock_flags(vptr);
view->buffer_id = vptr->transient.file_data.file->id.id;
view->buffer_id = vptr->file_data.file->id.id;
Assert(data->file != 0);
File_Edit_Positions edit_pos = view_get_edit_pos(vptr);
view->mark = file_compute_cursor(system, data->file, seek_pos(vptr->transient.mark));
view->mark = file_compute_cursor(system, data->file, seek_pos(vptr->mark));
view->cursor = file_compute_cursor(system, data->file, seek_pos(edit_pos.cursor_pos));
view->preferred_x = edit_pos.preferred_x;
view->preferred_x = vptr->preferred_x;
view->view_region = vptr->transient.panel->rect_inner;
view->file_region = vptr->transient.file_region;
if (vptr->transient.ui_mode){
view->scroll_vars = vptr->transient.ui_scroll;
view->view_region = vptr->panel->rect_inner;
view->file_region = vptr->file_region;
if (vptr->ui_mode){
view->scroll_vars = vptr->ui_scroll;
}
else{
view->scroll_vars = edit_pos.scroll;
@ -92,11 +92,11 @@ fill_view_summary(System_Functions *system, View_Summary *view, View *vptr, Mode
internal void
view_quit_ui(System_Functions *system, Models *models, View *view){
Assert(view != 0);
view->transient.ui_mode = false;
if (view->transient.ui_quit != 0){
view->ui_mode = false;
if (view->ui_quit != 0){
View_Summary view_summary = {};
fill_view_summary(system, &view_summary, view, models);
view->transient.ui_quit(&models->app_links, view_summary);
view->ui_quit(&models->app_links, view_summary);
}
}
@ -139,7 +139,7 @@ imp_get_view(Models *models, View_ID view_id){
view_id = view_id - 1;
if (0 <= view_id && view_id < live_set->max){
vptr = live_set->views + view_id;
if (!vptr->transient.in_use){
if (!vptr->in_use){
vptr = 0;
}
}
@ -1347,9 +1347,9 @@ DOC_SEE(Buffer_Identifier)
panel != 0;
panel = layout_get_next_open_panel(layout, panel)){
View *view = panel->view;
if (view->transient.file_data.file == file){
if (view->file_data.file == file){
Assert(file_node != used);
view->transient.file_data.file = 0;
view->file_data.file = 0;
Editing_File *new_file = CastFromMember(Editing_File, main_chain_node, file_node);
view_set_file(system, models, view, new_file);
if (file_node->next != used){
@ -1406,15 +1406,15 @@ Reopen_Buffer(Application_Links *app, Buffer_Summary *buffer, Buffer_Reopen_Flag
panel != 0;
panel = layout_get_next_open_panel(layout, panel)){
View *view_it = panel->view;
if (view_it->transient.file_data.file != file){
if (view_it->file_data.file != file){
continue;
}
vptrs[vptr_count] = view_it;
File_Edit_Positions edit_pos = view_get_edit_pos(view_it);
Full_Cursor cursor = file_compute_cursor(system, view_it->transient.file_data.file, seek_pos(edit_pos.cursor_pos));
Full_Cursor cursor = file_compute_cursor(system, view_it->file_data.file, seek_pos(edit_pos.cursor_pos));
line_numbers[vptr_count] = cursor.line;
column_numbers[vptr_count] = cursor.character;
view_it->transient.file_data.file = models->scratch_buffer;
view_it->file_data.file = models->scratch_buffer;
++vptr_count;
}
@ -1425,10 +1425,10 @@ Reopen_Buffer(Application_Links *app, Buffer_Summary *buffer, Buffer_Reopen_Flag
for (i32 i = 0; i < vptr_count; ++i){
view_set_file(system, models, vptrs[i], file);
vptrs[i]->transient.file_data.file = file;
vptrs[i]->file_data.file = file;
Full_Cursor cursor = file_compute_cursor(system, file, seek_line_char(line_numbers[i], column_numbers[i]));
view_set_cursor(system, vptrs[i], cursor, true, file->settings.unwrapped_lines);
view_set_cursor(system, vptrs[i], cursor, true);
}
result = BufferReopenResult_Reopened;
@ -1462,7 +1462,7 @@ get_view_next__internal(Models *models, View_Summary *view){
i32 index = view->view_id - 1;
if (index >= 0 && index < live_set->max){
View *vptr = live_set->views + index;
Panel *panel = vptr->transient.panel;
Panel *panel = vptr->panel;
if (panel != 0){
panel = layout_get_next_open_panel(layout, panel);
}
@ -1581,7 +1581,7 @@ DOC_SEE(View_Split_Position)
System_Functions *system = models->system;
Layout *layout = &models->layout;
View *vptr = imp_get_view(models, view_location);
Panel *panel = vptr->transient.panel;
Panel *panel = vptr->panel;
View_Summary result = {};
b32 vertical_split = ((position == ViewSplit_Left) || (position == ViewSplit_Right));
b32 br_split = ((position == ViewSplit_Bottom) || (position == ViewSplit_Right));
@ -1589,7 +1589,7 @@ DOC_SEE(View_Split_Position)
if (new_panel != 0){
View *new_view = live_set_alloc_view(&models->mem.heap, &models->lifetime_allocator, &models->live_set);
new_panel->view = new_view;
new_view->transient.panel = new_panel;
new_view->panel = new_panel;
view_set_file(system, models, new_view, models->scratch_buffer);
fill_view_summary(system, &result, new_view, models);
}
@ -1614,7 +1614,7 @@ in the system, the call will fail.)
bool32 result = false;
if (vptr != 0){
if (layout_close_panel(layout, vptr->transient.panel)){
if (layout_close_panel(layout, vptr->panel)){
live_set_free_view(&models->mem.heap, &models->lifetime_allocator, &models->live_set, vptr);
result = true;
}
@ -1637,7 +1637,7 @@ DOC_SEE(get_active_view)
View *vptr = imp_get_view(models, view);
bool32 result = false;
if (vptr != 0){
models->layout.active_panel = vptr->transient.panel;
models->layout.active_panel = vptr->panel;
result = true;
}
return(result);
@ -1660,22 +1660,22 @@ DOC_RETURN(returns non-zero on success)
switch (setting){
case ViewSetting_ShowWhitespace:
{
*value_out = vptr->transient.file_data.show_whitespace;
*value_out = vptr->file_data.show_whitespace;
}break;
case ViewSetting_ShowScrollbar:
{
*value_out = !vptr->transient.hide_scrollbar;
*value_out = !vptr->hide_scrollbar;
}break;
case ViewSetting_ShowFileBar:
{
*value_out = !vptr->transient.hide_file_bar;
*value_out = !vptr->hide_file_bar;
}break;
case ViewSetting_UICommandMap:
{
*value_out = vptr->transient.ui_map_id;
*value_out = vptr->ui_map_id;
}break;
default:
@ -1707,22 +1707,22 @@ DOC_SEE(View_Setting_ID)
switch (setting){
case ViewSetting_ShowWhitespace:
{
vptr->transient.file_data.show_whitespace = value;
vptr->file_data.show_whitespace = value;
}break;
case ViewSetting_ShowScrollbar:
{
vptr->transient.hide_scrollbar = !value;
vptr->hide_scrollbar = !value;
}break;
case ViewSetting_ShowFileBar:
{
vptr->transient.hide_file_bar = !value;
vptr->hide_file_bar = !value;
}break;
case ViewSetting_UICommandMap:
{
vptr->transient.ui_map_id = value;
vptr->ui_map_id = value;
}break;
default:
@ -1750,8 +1750,8 @@ If the view_id does not specify a valid view, the returned scope is null.)
View *view = imp_get_view(models, view_id);
Managed_Scope lifetime = 0;
if (view != 0){
Assert(view->transient.lifetime_object != 0);
lifetime = (Managed_Scope)(view->transient.lifetime_object->workspace.scope_id);
Assert(view->lifetime_object != 0);
lifetime = (Managed_Scope)(view->lifetime_object->workspace.scope_id);
}
return(lifetime);
}
@ -1776,7 +1776,7 @@ DOC_RETURN(This call returns non-zero on success.)
View *vptr = imp_get_view(models, view);
bool32 result = false;
if (vptr != 0){
Panel *panel = vptr->transient.panel;
Panel *panel = vptr->panel;
Panel *intermediate = panel->parent;
if (intermediate != 0){
Assert(intermediate->kind == PanelKind_Intermediate);
@ -1828,7 +1828,7 @@ DOC_RETURN(The rectangle of the panel containing this view.)
View *vptr = imp_get_view(models, view);
i32_Rect result = {};
if (vptr != 0){
Panel *panel = vptr->transient.panel;
Panel *panel = vptr->panel;
Assert(panel != 0);
Panel *parent = panel->parent;
if (parent != 0){
@ -1858,7 +1858,7 @@ DOC_SEE(Full_Cursor)
bool32 result = false;
if (vptr != 0){
Editing_File *file = vptr->transient.file_data.file;
Editing_File *file = vptr->file_data.file;
Assert(file != 0);
if (!file->is_loading){
result = true;
@ -1886,12 +1886,12 @@ DOC_SEE(Buffer_Seek)
bool32 result = false;
if (vptr != 0){
Editing_File *file = vptr->transient.file_data.file;
Editing_File *file = vptr->file_data.file;
if (!file->is_loading){
result = true;
Full_Cursor cursor = file_compute_cursor(system, file, seek);
view_set_cursor(system, vptr, cursor, set_preferred_x, file->settings.unwrapped_lines);
view_set_cursor(system, vptr, cursor, set_preferred_x);
fill_view_summary(system, view, vptr, models);
result = true;
}
}
@ -1912,14 +1912,14 @@ DOC_SEE(GUI_Scroll_Vars)
bool32 result = false;
if (vptr != 0){
Editing_File *file = vptr->transient.file_data.file;
Editing_File *file = vptr->file_data.file;
if (!file->is_loading){
result = true;
if (!vptr->transient.ui_mode){
if (!vptr->ui_mode){
view_set_scroll(system, vptr, scroll);
}
else{
vptr->transient.ui_scroll = scroll;
vptr->ui_scroll = scroll;
}
fill_view_summary(system, view, vptr, models);
}
@ -1943,17 +1943,17 @@ DOC_SEE(Buffer_Seek)
bool32 result = false;
if (vptr != 0){
Editing_File *file = vptr->transient.file_data.file;
Editing_File *file = vptr->file_data.file;
Assert(file != 0);
if (!file->is_loading){
if (seek.type != buffer_seek_pos){
result = true;
Full_Cursor cursor = file_compute_cursor(system, file, seek);
vptr->transient.mark = cursor.pos;
vptr->mark = cursor.pos;
}
else{
result = true;
vptr->transient.mark = seek.pos;
vptr->mark = seek.pos;
}
fill_view_summary(system, view, vptr, models);
}
@ -1989,7 +1989,7 @@ DOC_SEE(Set_Buffer_Flag)
Editing_File *file = working_set_get_active_file(&models->working_set, buffer_id);
if (file != 0){
result = true;
if (file != vptr->transient.file_data.file){
if (file != vptr->file_data.file){
view_set_file(system, models, vptr, file);
if (!(flags & SetBuffer_KeepOriginalGUI)){
view_quit_ui(system, models, vptr);
@ -2040,11 +2040,11 @@ DOC_SEE(view_set_ui)
Models *models = (Models*)app->cmd_context;
View *vptr = imp_get_view(models, view);
if (vptr != 0){
if (vptr->transient.ui_mode){
if (vptr->ui_mode){
return(false);
}
else{
vptr->transient.ui_mode = true;
vptr->ui_mode = true;
return(true);
}
}
@ -2067,9 +2067,9 @@ DOC_SEE(view_set_ui)
bool32 result = false;
Models *models = (Models*)app->cmd_context;
View *vptr = imp_get_view(models, view);
if (vptr != 0 && vptr->transient.ui_mode){
if (vptr != 0 && vptr->ui_mode){
view_quit_ui(models->system, models, vptr);
vptr->transient.ui_mode = false;
vptr->ui_mode = false;
result = true;
}
return(result);
@ -2093,11 +2093,11 @@ DOC_SEE(UI_Quit_Function_Type)
Heap *heap = &models->mem.heap;
View *vptr = imp_get_view(models, view);
if (vptr != 0){
if (vptr->transient.ui_control.items != 0){
heap_free(heap, vptr->transient.ui_control.items);
if (vptr->ui_control.items != 0){
heap_free(heap, vptr->ui_control.items);
}
memset(&vptr->transient.ui_control, 0, sizeof(vptr->transient.ui_control));
vptr->transient.ui_quit = quit_function;
memset(&vptr->ui_control, 0, sizeof(vptr->ui_control));
vptr->ui_quit = quit_function;
if (control != 0){
if (control->count > 0){
i32 string_size = 0;
@ -2168,14 +2168,14 @@ DOC_SEE(UI_Quit_Function_Type)
memcpy(new_str, old.str, old.size);
}
}
vptr->transient.ui_control.items = new_items;
vptr->transient.ui_control.count = count;
vptr->ui_control.items = new_items;
vptr->ui_control.count = count;
}
else{
return(false);
}
}
memcpy(vptr->transient.ui_control.bounding_box, control->bounding_box,
memcpy(vptr->ui_control.bounding_box, control->bounding_box,
sizeof(control->bounding_box));
}
return(true);
@ -2196,7 +2196,7 @@ DOC_SEE(view_set_ui)
View *vptr = imp_get_view(models, view);
UI_Control result = {};
if (vptr != 0 && part != 0){
UI_Control *control = &vptr->transient.ui_control;
UI_Control *control = &vptr->ui_control;
result.items = push_array(part, UI_Item, control->count);
if (result.items != 0){
result.count = control->count;
@ -2280,7 +2280,7 @@ get_lifetime_object_from_workspace(Dynamic_Workspace *workspace){
case DynamicWorkspace_View:
{
View *vptr = (View*)workspace->user_back_ptr;
result = vptr->transient.lifetime_object;
result = vptr->lifetime_object;
}break;
default:
{
@ -3044,7 +3044,7 @@ max_result_count of 1 and be assured you will get the most recent bar if any exi
Models *models = (Models*)app->cmd_context;
View *view = imp_get_view(models, view_id);
if (view != 0){
for (Query_Slot *slot = view->transient.query_set.used_slot;
for (Query_Slot *slot = view->query_set.used_slot;
slot != 0 && (result < max_result_count);
slot = slot->next){
if (slot->query_bar != 0){
@ -3075,7 +3075,7 @@ only use for this call is in an interactive command that makes calls to get_user
Models *models = (Models*)app->cmd_context;
Panel *active_panel = layout_get_active_panel(&models->layout);
View *active_view = active_panel->view;
Query_Slot *slot = alloc_query_slot(&active_view->transient.query_set);
Query_Slot *slot = alloc_query_slot(&active_view->query_set);
bool32 result = (slot != 0);
if (result){
slot->query_bar = bar;
@ -3093,7 +3093,7 @@ DOC(Stops showing the particular query bar specified by the bar parameter.)
Models *models = (Models*)app->cmd_context;
Panel *active_panel = layout_get_active_panel(&models->layout);
View *active_view = active_panel->view;
free_query_slot(&active_view->transient.query_set, bar);
free_query_slot(&active_view->query_set, bar);
}
API_EXPORT void
@ -4073,7 +4073,7 @@ Get_Default_Font_For_View(Application_Links *app, View_ID view_id)
{
Models *models = (Models*)app->cmd_context;
View *view = imp_get_view(models, view_id);
Editing_File *file = view->transient.file_data.file;
Editing_File *file = view->file_data.file;
Assert(file != 0);
Face_ID face_id = file->settings.font_id;
return(face_id);

View File

@ -28,11 +28,11 @@ edit_pre_state_change(System_Functions *system, Heap *heap, Models *models, Edit
panel != 0;
panel = layout_get_next_open_panel(layout, panel)){
View *view = panel->view;
if (view->transient.file_data.file == file){
if (view->file_data.file == file){
Full_Cursor render_cursor = view_get_render_cursor(system, view);
Full_Cursor target_cursor = view_get_render_cursor_target(system, view);
view->transient.temp_view_top_left_pos = render_cursor.pos;
view->transient.temp_view_top_left_target_pos = target_cursor.pos;
view->temp_view_top_left_pos = render_cursor.pos;
view->temp_view_top_left_target_pos = target_cursor.pos;
}
}
}
@ -135,12 +135,12 @@ edit_fix_markers(System_Functions *system, Models *models, Editing_File *file, E
panel != 0;
panel = layout_get_next_open_panel(layout, panel)){
View *view = panel->view;
if (view->transient.file_data.file == file){
if (view->file_data.file == file){
File_Edit_Positions edit_pos = view_get_edit_pos(view);
write_cursor_with_index(cursors, &cursor_count, edit_pos.cursor_pos);
write_cursor_with_index(cursors, &cursor_count, view->transient.mark);
write_cursor_with_index(cursors, &cursor_count, view->transient.temp_view_top_left_pos);
write_cursor_with_index(cursors, &cursor_count, view->transient.temp_view_top_left_target_pos);
write_cursor_with_index(cursors, &cursor_count, view->mark);
write_cursor_with_index(cursors, &cursor_count, view->temp_view_top_left_pos);
write_cursor_with_index(cursors, &cursor_count, view->temp_view_top_left_target_pos);
}
}
@ -180,19 +180,19 @@ edit_fix_markers(System_Functions *system, Models *models, Editing_File *file, E
panel != 0;
panel = layout_get_next_open_panel(layout, panel)){
View *view = panel->view;
if (view->transient.file_data.file == file){
if (view->file_data.file == file){
i32 cursor_pos = cursors[cursor_count++].pos;
Full_Cursor new_cursor = file_compute_cursor(system, file, seek_pos(cursor_pos));
File_Edit_Positions edit_pos = view_get_edit_pos(view);
GUI_Scroll_Vars scroll = edit_pos.scroll;
view->transient.mark = cursors[cursor_count++].pos;
i32 line_height = view->transient.line_height;
view->mark = cursors[cursor_count++].pos;
i32 line_height = view->line_height;
i32 top_left_pos = cursors[cursor_count++].pos;
i32 top_left_target_pos = cursors[cursor_count++].pos;
f32 new_y_val_aligned = 0;
if (view->transient.temp_view_top_left_pos != top_left_pos){
if (view->temp_view_top_left_pos != top_left_pos){
Full_Cursor new_position_cursor = file_compute_cursor(system, file, seek_pos(top_left_pos));
if (file->settings.unwrapped_lines){
new_y_val_aligned = new_position_cursor.unwrapped_y;
@ -202,7 +202,7 @@ edit_fix_markers(System_Functions *system, Models *models, Editing_File *file, E
}
scroll.scroll_y = edit_fix_markers__compute_scroll_y(line_height, scroll.scroll_y, new_y_val_aligned);
}
if (view->transient.temp_view_top_left_target_pos != top_left_target_pos){
if (view->temp_view_top_left_target_pos != top_left_target_pos){
if (top_left_target_pos != top_left_pos){
Full_Cursor new_position_cursor = file_compute_cursor(system, file, seek_pos(top_left_target_pos));
if (file->settings.unwrapped_lines){
@ -215,7 +215,7 @@ edit_fix_markers(System_Functions *system, Models *models, Editing_File *file, E
scroll.target_y = edit_fix_markers__compute_scroll_y(line_height, scroll.target_y, new_y_val_aligned);
}
view_set_cursor_and_scroll(view, new_cursor, true, view->transient.file_data.file->settings.unwrapped_lines, scroll);
view_set_cursor_and_scroll(view, new_cursor, true, scroll);
}
}
@ -461,12 +461,12 @@ edit_clear(System_Functions *system, Models *models, Editing_File *file){
panel != 0;
panel = layout_get_next_open_panel(layout, panel)){
View *view = panel->view;
if (view->transient.file_data.file == file){
if (view->file_data.file == file){
Full_Cursor cursor = {};
cursor.line = 1;
cursor.character = 1;
cursor.wrap_line = 1;
view_set_cursor(system, view, cursor, true, file->settings.unwrapped_lines);
view_set_cursor(system, view, cursor, true);
no_views_see_file = false;
}
}

View File

@ -19,16 +19,8 @@ to_file_id(i32 id){
////////////////////////////////
internal void
file_edit_positions_set_cursor(File_Edit_Positions *edit_pos, Full_Cursor cursor, b32 set_preferred_x, b32 unwrapped_lines){
edit_pos->cursor_pos = cursor.pos;
if (set_preferred_x){
if (unwrapped_lines){
edit_pos->preferred_x = cursor.unwrapped_x;
}
else{
edit_pos->preferred_x = cursor.wrapped_x;
}
}
file_edit_positions_set_cursor(File_Edit_Positions *edit_pos, i32 pos){
edit_pos->cursor_pos = pos;
edit_pos->last_set_type = EditPos_CursorSet;
}

View File

@ -22,7 +22,6 @@ struct File_Edit_Positions{
Edit_Pos_Set_Type last_set_type;
GUI_Scroll_Vars scroll;
i32 cursor_pos;
f32 preferred_x;
};
// TODO(NAME): do(replace Text_Effect with markers over time)

View File

@ -11,29 +11,37 @@
internal i32
view_get_map(View *view){
if (view->transient.ui_mode){
return(view->transient.ui_map_id);
if (view->ui_mode){
return(view->ui_map_id);
}
else{
return(view->transient.file_data.file->settings.base_map_id);
return(view->file_data.file->settings.base_map_id);
}
}
internal i32
view_get_index(Live_Views *live_set, View *view){
return((i32)(view - live_set->views));
}
internal i32
view_get_id(Live_Views *live_set, View *view){
return((i32)(view - live_set->views) + 1);
}
internal View*
live_set_alloc_view(Heap *heap, Lifetime_Allocator *lifetime_allocator, Live_Views *live_set){
Assert(live_set->count < live_set->max);
++live_set->count;
View *result = live_set->free_sentinel.transient.next;
Assert((i32)(result - live_set->views) == result->persistent.id);
View *result = live_set->free_sentinel.next;
result->next->prev = result->prev;
result->prev->next = result->next;
block_zero_struct(result);
result->transient.next->transient.prev = result->transient.prev;
result->transient.prev->transient.next = result->transient.next;
block_zero_struct(&result->transient);
result->transient.in_use = true;
init_query_set(&result->transient.query_set);
result->transient.lifetime_object = lifetime_alloc_object(heap, lifetime_allocator, DynamicWorkspace_View, result);
result->in_use = true;
init_query_set(&result->query_set);
result->lifetime_object = lifetime_alloc_object(heap, lifetime_allocator, DynamicWorkspace_View, result);
return(result);
}
@ -43,50 +51,50 @@ live_set_free_view(Heap *heap, Lifetime_Allocator *lifetime_allocator, Live_View
Assert(live_set->count > 0);
--live_set->count;
if (view->transient.ui_control.items != 0){
heap_free(heap, view->transient.ui_control.items);
if (view->ui_control.items != 0){
heap_free(heap, view->ui_control.items);
}
view->transient.next = live_set->free_sentinel.transient.next;
view->transient.prev = &live_set->free_sentinel;
live_set->free_sentinel.transient.next = view;
view->transient.next->transient.prev = view;
view->transient.in_use = false;
view->next = live_set->free_sentinel.next;
view->prev = &live_set->free_sentinel;
live_set->free_sentinel.next = view;
view->next->prev = view;
view->in_use = false;
lifetime_free_object(heap, lifetime_allocator, view->transient.lifetime_object);
lifetime_free_object(heap, lifetime_allocator, view->lifetime_object);
}
////////////////////////////////
internal File_Edit_Positions
view_get_edit_pos(View *view){
return(view->transient.edit_pos_);
return(view->edit_pos_);
}
internal void
view_set_edit_pos(View *view, File_Edit_Positions edit_pos){
view->transient.edit_pos_ = edit_pos;
view->transient.file_data.file->state.edit_pos_most_recent = edit_pos;
view->edit_pos_ = edit_pos;
view->file_data.file->state.edit_pos_most_recent = edit_pos;
}
////////////////////////////////
internal i32
view_width(View *view){
return(rect_width(view->transient.file_region));
return(rect_width(view->file_region));
}
internal i32
view_height(View *view){
return(rect_height(view->transient.file_region));
return(rect_height(view->file_region));
}
internal Vec2_i32
view_get_cursor_xy(System_Functions *system, View *view){
File_Edit_Positions edit_pos = view_get_edit_pos(view);
Full_Cursor cursor = file_compute_cursor(system, view->transient.file_data.file, seek_pos(edit_pos.cursor_pos));
Full_Cursor cursor = file_compute_cursor(system, view->file_data.file, seek_pos(edit_pos.cursor_pos));
Vec2_i32 result = {};
if (view->transient.file_data.file->settings.unwrapped_lines){
if (view->file_data.file->settings.unwrapped_lines){
result = V2i32((i32)cursor.unwrapped_x, (i32)cursor.unwrapped_y);
}
else{
@ -97,7 +105,7 @@ view_get_cursor_xy(System_Functions *system, View *view){
internal Cursor_Limits
view_cursor_limits(View *view){
i32 line_height = view->transient.line_height;
i32 line_height = view->line_height;
i32 visible_height = view_height(view);
Cursor_Limits limits = {};
limits.max = visible_height - line_height*3;
@ -119,7 +127,7 @@ view_cursor_limits(View *view){
internal i32
view_compute_max_target_y_from_bottom_y(View *view, f32 max_item_y){
i32 line_height = view->transient.line_height;
i32 line_height = view->line_height;
f32 height = clamp_bottom((f32)line_height, view_height(view));
f32 max_target_y = clamp_bottom(0.f, max_item_y - height*0.5f);
return(ceil32(max_target_y));
@ -127,8 +135,8 @@ view_compute_max_target_y_from_bottom_y(View *view, f32 max_item_y){
internal i32
view_compute_max_target_y(View *view){
i32 line_height = view->transient.line_height;
Editing_File *file = view->transient.file_data.file;
i32 line_height = view->line_height;
Editing_File *file = view->file_data.file;
Gap_Buffer *buffer = &file->state.buffer;
i32 lowest_line = buffer->line_count;
if (!file->settings.unwrapped_lines){
@ -140,8 +148,8 @@ view_compute_max_target_y(View *view){
internal u32
view_lock_flags(View *view){
u32 result = AccessOpen;
File_Viewing_Data *data = &view->transient.file_data;
if (view->transient.ui_mode){
File_Viewing_Data *data = &view->file_data;
if (view->ui_mode){
result |= AccessHidden;
}
if (data->file_locked || (data->file && data->file->settings.read_only)){
@ -192,10 +200,10 @@ view_move_view_to_cursor(System_Functions *system, View *view, GUI_Scroll_Vars *
internal b32
view_move_cursor_to_view(System_Functions *system, View *view, GUI_Scroll_Vars scroll, i32 *pos_in_out, f32 preferred_x){
Editing_File *file = view->transient.file_data.file;
Editing_File *file = view->file_data.file;
Full_Cursor cursor = file_compute_cursor(system, file, seek_pos(*pos_in_out));
i32 line_height = view->transient.line_height;
i32 line_height = view->line_height;
f32 old_cursor_y = 0.f;
if (file->settings.unwrapped_lines){
old_cursor_y = cursor.unwrapped_y;
@ -204,7 +212,7 @@ view_move_cursor_to_view(System_Functions *system, View *view, GUI_Scroll_Vars s
old_cursor_y = cursor.wrapped_y;
}
f32 cursor_y = old_cursor_y;
f32 target_y = scroll.target_y + view->transient.widget_height;
f32 target_y = scroll.target_y + view->widget_height;
Cursor_Limits limits = view_cursor_limits(view);
@ -232,10 +240,35 @@ view_move_cursor_to_view(System_Functions *system, View *view, GUI_Scroll_Vars s
return(result);
}
internal b32
view_has_unwrapped_lines(View *view){
return(view->file_data.file->settings.unwrapped_lines);
}
internal void
view_set_cursor(System_Functions *system, View *view, Full_Cursor cursor, b32 set_preferred_x, b32 unwrapped_lines){
view_set_preferred_x(View *view, Full_Cursor cursor){
if (view_has_unwrapped_lines(view)){
view->preferred_x = cursor.unwrapped_x;
}
else{
view->preferred_x = cursor.wrapped_x;
}
}
internal void
view_set_preferred_x_to_current_position(System_Functions *system, View *view){
File_Edit_Positions edit_pos = view_get_edit_pos(view);
file_edit_positions_set_cursor(&edit_pos, cursor, set_preferred_x, unwrapped_lines);
Full_Cursor cursor = file_compute_cursor(system, view->file_data.file, seek_pos(edit_pos.cursor_pos));
view_set_preferred_x(view, cursor);
}
internal void
view_set_cursor(System_Functions *system, View *view, Full_Cursor cursor, b32 set_preferred_x){
File_Edit_Positions edit_pos = view_get_edit_pos(view);
file_edit_positions_set_cursor(&edit_pos, cursor.pos);
if (set_preferred_x){
view_set_preferred_x(view, cursor);
}
view_set_edit_pos(view, edit_pos);
GUI_Scroll_Vars scroll = edit_pos.scroll;
if (view_move_view_to_cursor(system, view, &scroll)){
@ -250,17 +283,20 @@ view_set_scroll(System_Functions *system, View *view, GUI_Scroll_Vars scroll){
file_edit_positions_set_scroll(&edit_pos, scroll);
view_set_edit_pos(view, edit_pos);
i32 pos = edit_pos.cursor_pos;
if (view_move_cursor_to_view(system, view, edit_pos.scroll, &pos, edit_pos.preferred_x)){
Full_Cursor cursor = file_compute_cursor(system, view->transient.file_data.file, seek_pos(pos));
if (view_move_cursor_to_view(system, view, edit_pos.scroll, &pos, view->preferred_x)){
Full_Cursor cursor = file_compute_cursor(system, view->file_data.file, seek_pos(pos));
edit_pos.cursor_pos = cursor.pos;
view_set_edit_pos(view, edit_pos);
}
}
internal void
view_set_cursor_and_scroll(View *view, Full_Cursor cursor, b32 set_preferred_x, b32 unwrapped_lines, GUI_Scroll_Vars scroll){
view_set_cursor_and_scroll(View *view, Full_Cursor cursor, b32 set_preferred_x, GUI_Scroll_Vars scroll){
File_Edit_Positions edit_pos = view_get_edit_pos(view);
file_edit_positions_set_cursor(&edit_pos, cursor, set_preferred_x, unwrapped_lines);
file_edit_positions_set_cursor(&edit_pos, cursor.pos);
if (set_preferred_x){
view_set_preferred_x(view, cursor);
}
file_edit_positions_set_scroll(&edit_pos, scroll);
edit_pos.last_set_type = EditPos_None;
view_set_edit_pos(view, edit_pos);
@ -268,15 +304,15 @@ view_set_cursor_and_scroll(View *view, Full_Cursor cursor, b32 set_preferred_x,
internal void
view_cursor_move(System_Functions *system, View *view, i32 pos){
Editing_File *file = view->transient.file_data.file;
Editing_File *file = view->file_data.file;
Assert(file != 0);
Full_Cursor cursor = file_compute_cursor(system, file, seek_pos(pos));
view_set_cursor(system, view, cursor, true, file->settings.unwrapped_lines);
view_set_cursor(system, view, cursor, true);
}
internal void
view_post_paste_effect(View *view, f32 seconds, i32 start, i32 size, u32 color){
Editing_File *file = view->transient.file_data.file;
Editing_File *file = view->file_data.file;
file->state.paste_effect.start = start;
file->state.paste_effect.end = start + size;
file->state.paste_effect.color = color;
@ -290,28 +326,22 @@ internal void
view_set_file(System_Functions *system, Models *models, View *view, Editing_File *file){
Assert(file != 0);
Editing_File *old_file = view->transient.file_data.file;
Editing_File *old_file = view->file_data.file;
if (old_file != 0){
file_touch(&models->working_set, old_file);
file_edit_positions_push(old_file, view_get_edit_pos(view));
}
block_zero(&view->transient.file_data, sizeof(view->transient.file_data));
view->transient.file_data.file = file;
block_zero(&view->file_data, sizeof(view->file_data));
view->file_data.file = file;
File_Edit_Positions edit_pos = file_edit_positions_pop(file);
view_set_edit_pos(view, edit_pos);
view->transient.mark = edit_pos.cursor_pos;
view->mark = edit_pos.cursor_pos;
view_set_preferred_x_to_current_position(system, view);
Font_Pointers font = system->font.get_pointers_by_id(file->settings.font_id);
view->transient.line_height = font.metrics->height;
#if 0
File_Edit_Positions edit_pos = view_get_edit_pos(view);
if (edit_pos.cursor.line == 0){
view_cursor_move(system, view, 0);
}
#endif
view->line_height = font.metrics->height;
}
////////////////////////////////
@ -323,7 +353,7 @@ file_is_viewed(Layout *layout, Editing_File *file){
panel != 0;
panel = layout_get_next_open_panel(layout, panel)){
View *view = panel->view;
if (view->transient.file_data.file == file){
if (view->file_data.file == file){
is_viewed = true;
break;
}
@ -338,10 +368,10 @@ adjust_views_looking_at_file_to_new_cursor(System_Functions *system, Models *mod
panel != 0;
panel = layout_get_next_open_panel(layout, panel)){
View *view = panel->view;
if (view->transient.file_data.file == file){
if (view->file_data.file == file){
File_Edit_Positions edit_pos = view_get_edit_pos(view);
Full_Cursor cursor = file_compute_cursor(system, file, seek_pos(edit_pos.cursor_pos));
view_set_cursor(system, view, cursor, true, file->settings.unwrapped_lines);
view_set_cursor(system, view, cursor, true);
}
}
}
@ -358,8 +388,8 @@ file_full_remeasure(System_Functions *system, Models *models, Editing_File *file
panel != 0;
panel = layout_get_next_open_panel(layout, panel)){
View *view = panel->view;
if (view->transient.file_data.file == file){
view->transient.line_height = font.metrics->height;
if (view->file_data.file == file){
view->line_height = font.metrics->height;
}
}
}
@ -744,7 +774,7 @@ internal void
render_loaded_file_in_view__inner(Models *models, Render_Target *target, View *view,
i32_Rect rect, Full_Cursor render_cursor, Range on_screen_range,
Buffer_Render_Item *items, i32 item_count){
Editing_File *file = view->transient.file_data.file;
Editing_File *file = view->file_data.file;
Partition *part = &models->mem.part;
Style *style = &models->styles.styles[0];
@ -763,7 +793,7 @@ render_loaded_file_in_view__inner(Models *models, Render_Target *target, View *v
{
Lifetime_Object *lifetime_object = file->lifetime_object;
Buffer_ID buffer_id = file->id.id;
i32 view_index = view->persistent.id;
i32 view_index = view_get_index(&models->live_set, view);
Theme *theme_data = &style->theme;
get_visual_markers(part, &lifetime_object->workspace, on_screen_range, buffer_id, view_index, theme_data);
@ -939,7 +969,7 @@ render_loaded_file_in_view__inner(Models *models, Render_Target *target, View *v
char_color = ghost_color;
}
if (view->transient.file_data.show_whitespace && highlight_color == 0 && codepoint_is_whitespace(item->codepoint)){
if (view->file_data.show_whitespace && highlight_color == 0 && codepoint_is_whitespace(item->codepoint)){
highlight_this_color = style->theme.colors[Stag_Highlight_White];
}
else{
@ -1145,7 +1175,7 @@ do_core_render(Application_Links *app){
internal Full_Cursor
view_get_render_cursor(System_Functions *system, View *view, f32 scroll_y){
Full_Cursor result = {};
Editing_File *file = view->transient.file_data.file;
Editing_File *file = view->file_data.file;
if (file->settings.unwrapped_lines){
result = file_compute_cursor_hint(system, file, seek_unwrapped_xy(0, scroll_y, false));
}
@ -1162,7 +1192,7 @@ view_get_render_cursor(System_Functions *system, View *view){
// NOTE(allen): For now we will temporarily adjust scroll_y to try
// to prevent the view moving around until floating sections are added
// to the gui system.
scroll_y += view->transient.widget_height;
scroll_y += view->widget_height;
return(view_get_render_cursor(system, view, scroll_y));
}
@ -1173,14 +1203,14 @@ view_get_render_cursor_target(System_Functions *system, View *view){
// NOTE(allen): For now we will temporarily adjust scroll_y to try
// to prevent the view moving around until floating sections are added
// to the gui system.
scroll_y += view->transient.widget_height;
scroll_y += view->widget_height;
return(view_get_render_cursor(system, view, scroll_y));
}
internal void
render_loaded_file_in_view(System_Functions *system, View *view, Models *models, i32_Rect rect, b32 is_active, Render_Target *target){
Editing_File *file = view->transient.file_data.file;
i32 line_height = view->transient.line_height;
Editing_File *file = view->file_data.file;
i32 line_height = view->line_height;
f32 max_x = (f32)file->settings.display_width;
i32 max_y = rect.y1 - rect.y0 + line_height;
@ -1210,13 +1240,13 @@ render_loaded_file_in_view(System_Functions *system, View *view, Models *models,
// NOTE(allen): For now we will temporarily adjust scroll_y to try
// to prevent the view moving around until floating sections are added
// to the gui system.
scroll_y += view->transient.widget_height;
scroll_y += view->widget_height;
Full_Cursor render_cursor = view_get_render_cursor(system, view);
#if 0
// TODO(allen): do(eliminate scroll_i nonsense)
view->transient.edit_pos_.scroll_i = render_cursor.pos;
view->edit_pos_.scroll_i = render_cursor.pos;
#endif
i32 item_count = 0;
@ -1296,13 +1326,14 @@ render_loaded_file_in_view(System_Functions *system, View *view, Models *models,
////////////////////////////////
if (models->render_caller != 0){
View_ID view_id = view_get_id(&models->live_set, view);
models->render_view = view;
models->render_rect = rect;
models->render_cursor = render_cursor;
models->render_range = on_screen_range;
models->render_items = items;
models->render_item_count = item_count;
models->render_caller(&models->app_links, view->persistent.id + 1, on_screen_range, do_core_render);
models->render_caller(&models->app_links, view_id, on_screen_range, do_core_render);
models->render_view = 0;
}
else{

View File

@ -12,18 +12,13 @@
#if !defined(FRED_VIEW_H)
#define FRED_VIEW_H
struct View_Persistent{
i32 id;
Coroutine_Head *coroutine;
};
struct File_Viewing_Data{
Editing_File *file;
b32 show_whitespace;
b32 file_locked;
};
struct View_Transient{
struct View{
struct View *next;
struct View *prev;
struct Panel *panel;
@ -38,6 +33,7 @@ struct View_Transient{
i32_Rect scroll_region;
File_Edit_Positions edit_pos_;
i32 mark;
f32 preferred_x;
i32 temp_view_top_left_pos;
i32 temp_view_top_left_target_pos;
@ -52,8 +48,6 @@ struct View_Transient{
b32 hide_scrollbar;
b32 hide_file_bar;
b32 changed_context_in_step;
// misc
// TODO(allen): Can we burn line_height to the ground now?
@ -64,12 +58,6 @@ struct View_Transient{
f32 widget_height;
};
struct View{
// TODO(allen): Why is this this way?
View_Persistent persistent;
View_Transient transient;
};
struct Live_Views{
View *views;
View free_sentinel;

View File

@ -47,14 +47,14 @@ global_const Style_Color_Edit colors_to_edit[] = {
};
internal Input_Process_Result
do_step_file_view(System_Functions *system, View *view, Models *models, i32_Rect rect, b32 is_active, f32 dt, GUI_Scroll_Vars scroll, i32 max_y){
do_step_file_view(System_Functions *system, Models *models, View *view, i32_Rect rect, b32 is_active, f32 dt, GUI_Scroll_Vars scroll, i32 max_y){
Input_Process_Result result = {};
scroll.target_y = clamp(0, scroll.target_y, max_y);
result.scroll = scroll;
i32 line_height = view->transient.line_height;
i32 line_height = view->line_height;
if (!view->transient.hide_file_bar){
if (!view->hide_file_bar){
i32_Rect top_bar_rect = {};
top_bar_rect.x0 = rect.x0;
top_bar_rect.y0 = rect.y0;
@ -62,15 +62,15 @@ do_step_file_view(System_Functions *system, View *view, Models *models, i32_Rect
top_bar_rect.y1 = rect.y0 + line_height + 2;
rect.y0 = top_bar_rect.y1;
}
view->transient.file_region = rect;
view->file_region = rect;
i32 bar_count = 0;
for (Query_Slot *slot = view->transient.query_set.used_slot;
for (Query_Slot *slot = view->query_set.used_slot;
slot != 0;
slot = slot->next, ++bar_count);
view->transient.widget_height = (f32)bar_count*(view->transient.line_height + 2);
view->widget_height = (f32)bar_count*(view->line_height + 2);
Editing_File *file = view->transient.file_data.file;
Editing_File *file = view->file_data.file;
// TODO(allen): do(eliminate the built in paste_effect)
if (!file->is_loading && file->state.paste_effect.seconds_down > 0.f){
@ -79,18 +79,19 @@ do_step_file_view(System_Functions *system, View *view, Models *models, i32_Rect
}
// NOTE(allen): call scroll rule hook
b32 is_new_target = (result.scroll.target_x != view->transient.prev_target.x ||
result.scroll.target_y != view->transient.prev_target.y);
b32 is_new_target = (result.scroll.target_x != view->prev_target.x ||
result.scroll.target_y != view->prev_target.y);
f32 target_x = (f32)result.scroll.target_x;
f32 target_y = (f32)result.scroll.target_y;
if (models->scroll_rule(target_x, target_y, &result.scroll.scroll_x, &result.scroll.scroll_y, (view->persistent.id) + 1, is_new_target, dt)){
View_ID view_id = view_get_id(&models->live_set, view);
if (models->scroll_rule(target_x, target_y, &result.scroll.scroll_x, &result.scroll.scroll_y, view_id, is_new_target, dt)){
result.is_animating = true;
}
view->transient.prev_target.x = result.scroll.target_x;
view->transient.prev_target.y = result.scroll.target_y;
view->prev_target.x = result.scroll.target_x;
view->prev_target.y = result.scroll.target_y;
return(result);
}
@ -149,7 +150,7 @@ draw_file_bar(System_Functions *system, Render_Target *target, View *view, Model
}
else{
File_Edit_Positions edit_pos = view_get_edit_pos(view);
Full_Cursor cursor = file_compute_cursor(system, view->transient.file_data.file, seek_pos(edit_pos.cursor_pos));
Full_Cursor cursor = file_compute_cursor(system, view->file_data.file, seek_pos(edit_pos.cursor_pos));
char bar_space[526];
String bar_text = make_fixed_width_string(bar_space);
@ -213,10 +214,10 @@ get_margin_color(Style *style, i32 level){
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->transient.file_data.file;
Editing_File *file = view->file_data.file;
Assert(file != 0);
i32 line_height = view->transient.line_height;
i32 line_height = view->line_height;
Style *style = &models->styles.styles[0];
Face_ID font_id = file->settings.font_id;
char font_name_space[256];
@ -224,7 +225,7 @@ do_render_file_view(System_Functions *system, View *view, Models *models, GUI_Sc
font_name.size = system->font.get_name_by_id(font_id, font_name.str, font_name.memory_size);
Font_Pointers font = system->font.get_pointers_by_id(font_id);
if (!view->transient.hide_file_bar){
if (!view->hide_file_bar){
i32_Rect top_bar_rect = {};
top_bar_rect.x0 = rect.x0;
top_bar_rect.y0 = rect.y0;
@ -235,7 +236,7 @@ do_render_file_view(System_Functions *system, View *view, Models *models, GUI_Sc
}
i32 bar_count = 0;
for (Query_Slot *slot = view->transient.query_set.used_slot;
for (Query_Slot *slot = view->query_set.used_slot;
slot != 0;
slot = slot->next, ++bar_count){
i32_Rect query_bar_rect = {};
@ -253,10 +254,10 @@ do_render_file_view(System_Functions *system, View *view, Models *models, GUI_Sc
x = ceil32(draw_string(system, target, font_id, slot->query_bar->prompt, x, y, text2_color));
draw_string(system, target, font_id, slot->query_bar->string, x, y, text1_color);
}
view->transient.widget_height = (f32)bar_count*(view->transient.line_height + 2);
view->widget_height = (f32)bar_count*(view->line_height + 2);
draw_push_clip(target, rect);
if (!view->transient.ui_mode){
if (!view->ui_mode){
if (file_is_ready(file)){
render_loaded_file_in_view(system, view, models, rect, is_active, target);
}
@ -264,9 +265,9 @@ do_render_file_view(System_Functions *system, View *view, Models *models, GUI_Sc
else{
f32_Rect rect_f32 = f32R(rect);
i32 item_count = view->transient.ui_control.count;
UI_Item *item = view->transient.ui_control.items;
GUI_Scroll_Vars ui_scroll = view->transient.ui_scroll;
i32 item_count = view->ui_control.count;
UI_Item *item = view->ui_control.items;
GUI_Scroll_Vars ui_scroll = view->ui_scroll;
for (i32 i = 0; i < item_count; ++i, item += 1){
f32_Rect item_rect = f32R(item->rectangle);