new wrap rule; cleaning up some init stuff

master
Allen Webster 2016-09-21 18:34:19 -04:00
parent 3947255b00
commit 582faa4bdf
5 changed files with 1109 additions and 1094 deletions

162
4ed.cpp
View File

@ -39,9 +39,11 @@ typedef struct Command_Data{
System_Functions *system; System_Functions *system;
Live_Views *live_set; Live_Views *live_set;
#if 0
// TODO(allen): eliminate this shit yo! // TODO(allen): eliminate this shit yo!
Panel *panel; Panel *panel;
View *view; View *view;
#endif
i32 screen_width, screen_height; i32 screen_width, screen_height;
Key_Event_Data key; Key_Event_Data key;
@ -246,12 +248,23 @@ do_feedback_message(System_Functions *system, Models *models, String value, b32
#define USE_MODELS(n) Models *n = command->models #define USE_MODELS(n) Models *n = command->models
#define USE_VARS(n) App_Vars *n = command->vars #define USE_VARS(n) App_Vars *n = command->vars
#define USE_PANEL(n) Panel *n = command->panel
#define USE_VIEW(n) View *n = command->view
#define USE_FILE(n,v) Editing_File *n = (v)->file_data.file #define USE_FILE(n,v) Editing_File *n = (v)->file_data.file
#define REQ_OPEN_VIEW(n) View *n = command->panel->view; if (view_lock_level(n) > LockLevel_Open) return
#define REQ_READABLE_VIEW(n) View *n = command->panel->view; if (view_lock_level(n) > LockLevel_Protected) return #define USE_PANEL(n) Panel *n = 0;{ \
i32 panel_index = command->models->layout.active_panel; \
n = command->models->layout.panels + panel_index; \
}
#define USE_VIEW(n) View *n = 0;{ \
i32 panel_index = command->models->layout.active_panel; \
Panel *panel = command->models->layout.panels + panel_index; \
n = panel->view; \
}
#define REQ_OPEN_VIEW(n) USE_VIEW(n); if (view_lock_level(n) > LockLevel_Open) return
#define REQ_READABLE_VIEW(n) USE_VIEW(n); if (view_lock_level(n) > LockLevel_Protected) return
#define REQ_FILE(n,v) Editing_File *n = (v)->file_data.file; if (!n) return #define REQ_FILE(n,v) Editing_File *n = (v)->file_data.file; if (!n) return
#define REQ_FILE_HISTORY(n,v) Editing_File *n = (v)->file_data.file; if (!n || !n->state.undo.undo.edits) return #define REQ_FILE_HISTORY(n,v) Editing_File *n = (v)->file_data.file; if (!n || !n->state.undo.undo.edits) return
@ -710,12 +723,6 @@ COMMAND_DECL(user_callback){
if (binding.custom) binding.custom(&models->app_links); if (binding.custom) binding.custom(&models->app_links);
} }
internal void
update_command_data(App_Vars *vars, Command_Data *cmd){
cmd->panel = cmd->models->layout.panels + cmd->models->layout.active_panel;
cmd->view = cmd->panel->view;
}
globalvar Command_Function command_table[cmdid_count]; globalvar Command_Function command_table[cmdid_count];
#include "4ed_api_implementation.cpp" #include "4ed_api_implementation.cpp"
@ -728,9 +735,9 @@ struct Command_In{
internal void internal void
command_caller(Coroutine *coroutine){ command_caller(Coroutine *coroutine){
Command_In *cmd_in = (Command_In*)coroutine->in; Command_In *cmd_in = (Command_In*)coroutine->in;
Command_Data *cmd = cmd_in->cmd; Command_Data *command = cmd_in->cmd;
Models *models = cmd->models; Models *models = command->models;
View *view = cmd->view; USE_VIEW(view);
view->next_mode = view_mode_zero(); view->next_mode = view_mode_zero();
if (models->command_caller){ if (models->command_caller){
@ -745,7 +752,7 @@ command_caller(Coroutine *coroutine){
} }
} }
else{ else{
cmd_in->bind.function(cmd->system, cmd, cmd_in->bind); cmd_in->bind.function(command->system, command, cmd_in->bind);
} }
view->mode = view->next_mode; view->mode = view->next_mode;
} }
@ -1673,6 +1680,42 @@ App_Init_Sig(app_init){
models->palette = push_array(partition, u32, models->palette_size); models->palette = push_array(partition, u32, models->palette_size);
// NOTE(allen): init first panel // NOTE(allen): init first panel
Command_Data *cmd = &vars->command_data;
cmd->models = models;
cmd->vars = vars;
cmd->system = system;
cmd->live_set = &vars->live_set;
cmd->screen_width = target->width;
cmd->screen_height = target->height;
cmd->key = null_key_event_data;
General_Memory *general = &models->mem.general;
String init_files[] = {
make_lit_string("*messages*"),
make_lit_string("*scratch*"),
};
Editing_File **init_file_ptrs[] = {
&models->message_buffer,
&models->scratch_buffer,
};
for (i32 i = 0; i < ArrayCount(init_files); ++i){
String name = init_files[i];
Editing_File *file = working_set_alloc_always(&models->working_set, general);
buffer_bind_name(general, &models->working_set, file, name);
init_read_only_file(system, models, file);
file->settings.never_kill = 1;
file->settings.unimportant = 1;
file->settings.unwrapped_lines = 1;
*init_file_ptrs[i] = file;
}
Panel_And_ID p = layout_alloc_panel(&models->layout); Panel_And_ID p = layout_alloc_panel(&models->layout);
panel_make_empty(system, vars, p.panel); panel_make_empty(system, vars, p.panel);
models->layout.active_panel = p.id; models->layout.active_panel = p.id;
@ -1811,22 +1854,11 @@ App_Step_Sig(app_step){
i32 current_width = target->width; i32 current_width = target->width;
i32 current_height = target->height; i32 current_height = target->height;
Panel *panel = 0, *used_panels = &models->layout.used_sentinel;
View *view = 0;
models->layout.full_width = current_width; models->layout.full_width = current_width;
models->layout.full_height = current_height; models->layout.full_height = current_height;
if (prev_width != current_width || prev_height != current_height){ if (prev_width != current_width || prev_height != current_height){
layout_refit(&models->layout, prev_width, prev_height); layout_refit(&models->layout, prev_width, prev_height);
for (dll_items(panel, used_panels)){
view = panel->view;
Assert(view);
// TODO(allen): All responses to a panel changing size should
// be handled in the same place.
view_change_size(&models->mem.general, view);
}
} }
} }
@ -1985,9 +2017,6 @@ App_Step_Sig(app_step){
cmd->system = system; cmd->system = system;
cmd->live_set = &vars->live_set; cmd->live_set = &vars->live_set;
cmd->panel = models->layout.panels + models->layout.active_panel;
cmd->view = cmd->panel->view;
cmd->screen_width = target->width; cmd->screen_width = target->width;
cmd->screen_height = target->height; cmd->screen_height = target->height;
@ -2024,30 +2053,6 @@ App_Step_Sig(app_step){
} }
#endif #endif
General_Memory *general = &models->mem.general;
{
Editing_File *file = working_set_alloc_always(&models->working_set, general);
buffer_bind_name(general, &models->working_set, file, make_lit_string("*messages*"));
init_read_only_file(system, models, file);
file->settings.never_kill = 1;
file->settings.unimportant = 1;
file->settings.unwrapped_lines = 1;
models->message_buffer = file;
}
{
Editing_File *file = working_set_alloc_always(&models->working_set, general);
buffer_bind_name(general, &models->working_set, file, make_lit_string("*scratch*"));
init_normal_file(system, models, file, 0, 0);
file->settings.never_kill = 1;
file->settings.unimportant = 1;
file->settings.unwrapped_lines = 1;
models->scratch_buffer = file;
}
if (models->hooks[hook_start]){ if (models->hooks[hook_start]){
models->hooks[hook_start](&models->app_links); models->hooks[hook_start](&models->app_links);
} }
@ -2101,11 +2106,6 @@ App_Step_Sig(app_step){
panel = panel->next; panel = panel->next;
} }
for (;i < models->layout.panel_count; ++i, panel = panel->next){
view_set_file(panel->view, models->scratch_buffer, models);
view_show_file(panel->view);
}
panel = models->layout.used_sentinel.next; panel = models->layout.used_sentinel.next;
for (i = 0; i < models->settings.init_files_count; ++i, panel = panel->next){ for (i = 0; i < models->settings.init_files_count; ++i, panel = panel->next){
Assert(panel->view->file_data.file != 0); Assert(panel->view->file_data.file != 0);
@ -2129,7 +2129,8 @@ App_Step_Sig(app_step){
if (there_is_unsaved){ if (there_is_unsaved){
Coroutine *command_coroutine = models->command_coroutine; Coroutine *command_coroutine = models->command_coroutine;
View *view = cmd->view; Command_Data *command = cmd;
USE_VIEW(view);
for (i32 i = 0; i < 128 && command_coroutine; ++i){ for (i32 i = 0; i < 128 && command_coroutine; ++i){
User_Input user_in = {0}; User_Input user_in = {0};
@ -2208,7 +2209,8 @@ App_Step_Sig(app_step){
for (i32 key_i = 0; key_i < key_data.count; ++key_i){ for (i32 key_i = 0; key_i < key_data.count; ++key_i){
Key_Event_Data key = get_single_key(&key_data, key_i); Key_Event_Data key = get_single_key(&key_data, key_i);
View *view = cmd->view; Command_Data *command = cmd;
USE_VIEW(view);
b32 pass_in = 0; b32 pass_in = 0;
cmd->key = key; cmd->key = key;
@ -2265,7 +2267,8 @@ App_Step_Sig(app_step){
// NOTE(allen): Mouse input to command coroutine // NOTE(allen): Mouse input to command coroutine
if (models->command_coroutine != 0 && (get_flags & EventOnMouse)){ if (models->command_coroutine != 0 && (get_flags & EventOnMouse)){
View *view = cmd->view; Command_Data *command = cmd;
USE_VIEW(view);
b32 pass_in = 0; b32 pass_in = 0;
User_Input user_in; User_Input user_in;
@ -2335,8 +2338,6 @@ App_Step_Sig(app_step){
} }
} }
update_command_data(vars, cmd);
// NOTE(allen): pass raw input to the panels // NOTE(allen): pass raw input to the panels
Input_Summary dead_input = {}; Input_Summary dead_input = {};
dead_input.mouse.x = input->mouse.x; dead_input.mouse.x = input->mouse.x;
@ -2354,15 +2355,18 @@ App_Step_Sig(app_step){
{ {
Panel *panel = 0, *used_panels = 0; Panel *panel = 0, *used_panels = 0;
View *view = 0, *active_view = 0; View *view = 0;
b32 active = 0; b32 active = 0;
Input_Summary summary = {0}; Input_Summary summary = {0};
active_view = cmd->panel->view; Command_Data *command = cmd;
USE_VIEW(active_view);
USE_PANEL(active_panel);
used_panels = &models->layout.used_sentinel; used_panels = &models->layout.used_sentinel;
for (dll_items(panel, used_panels)){ for (dll_items(panel, used_panels)){
view = panel->view; view = panel->view;
active = (panel == cmd->panel); active = (panel == active_panel);
summary = (active)?(active_input):(dead_input); summary = (active)?(active_input):(dead_input);
view->changed_context_in_step = 0; view->changed_context_in_step = 0;
@ -2382,7 +2386,7 @@ App_Step_Sig(app_step){
} }
if (view->changed_context_in_step == 0){ if (view->changed_context_in_step == 0){
active = (panel == cmd->panel); active = (panel == active_panel);
summary = (active)?(active_input):(dead_input); summary = (active)?(active_input):(dead_input);
if (panel == mouse_panel && !input->mouse.out_of_window){ if (panel == mouse_panel && !input->mouse.out_of_window){
summary.mouse = mouse_state; summary.mouse = mouse_state;
@ -2443,8 +2447,6 @@ App_Step_Sig(app_step){
} }
} }
update_command_data(vars, cmd);
// NOTE(allen): command execution // NOTE(allen): command execution
{ {
Key_Summary key_data = get_key_data(&vars->available_input); Key_Summary key_data = get_key_data(&vars->available_input);
@ -2460,11 +2462,15 @@ App_Step_Sig(app_step){
Key_Event_Data key = get_single_key(&key_data, key_i); Key_Event_Data key = get_single_key(&key_data, key_i);
cmd->key = key; cmd->key = key;
View *view = cmd->view; Command_Data *command = cmd;
USE_VIEW(view);
Assert(view);
Command_Map *map = view->map;
if (map == 0){
map = &models->map_top;
}
Command_Map *map = 0;
if (view) map = view->map;
if (map == 0) map = &models->map_top;
Command_Binding cmd_bind = map_extract_recursive(map, key); Command_Binding cmd_bind = map_extract_recursive(map, key);
if (cmd_bind.function){ if (cmd_bind.function){
@ -2514,8 +2520,6 @@ App_Step_Sig(app_step){
} }
} }
update_command_data(vars, cmd);
// NOTE(allen): pass consumption data to debug // NOTE(allen): pass consumption data to debug
{ {
Debug_Data *debug = &models->debug; Debug_Data *debug = &models->debug;
@ -2742,8 +2746,6 @@ App_Step_Sig(app_step){
models->layout.active_panel = (i32)(mouse_panel - models->layout.panels); models->layout.active_panel = (i32)(mouse_panel - models->layout.panels);
} }
update_command_data(vars, cmd);
end_temp_memory(param_stack_temp); end_temp_memory(param_stack_temp);
// NOTE(allen): on the first frame there should be no scrolling // NOTE(allen): on the first frame there should be no scrolling
@ -2774,6 +2776,10 @@ App_Step_Sig(app_step){
target->clip_top = -1; target->clip_top = -1;
draw_push_clip(target, rect_from_target(target)); draw_push_clip(target, rect_from_target(target));
Command_Data *command = cmd;
USE_PANEL(active_panel);
USE_VIEW(active_view);
// NOTE(allen): render the panels // NOTE(allen): render the panels
Panel *panel, *used_panels; Panel *panel, *used_panels;
used_panels = &models->layout.used_sentinel; used_panels = &models->layout.used_sentinel;
@ -2784,7 +2790,7 @@ App_Step_Sig(app_step){
View *view = panel->view; View *view = panel->view;
Style *style = main_style(models); Style *style = main_style(models);
b32 active = (panel == cmd->panel); b32 active = (panel == active_panel);
u32 back_color = style->main.back_color; u32 back_color = style->main.back_color;
draw_rectangle(target, full, back_color); draw_rectangle(target, full, back_color);
@ -2803,7 +2809,7 @@ App_Step_Sig(app_step){
} }
} }
do_render_file_view(system, view, scroll_vars, cmd->view, do_render_file_view(system, view, scroll_vars, active_view,
panel->inner, active, target, &dead_input); panel->inner, active, target, &dead_input);
draw_pop_clip(target); draw_pop_clip(target);

View File

@ -171,8 +171,6 @@ DOC_SEE(Command_ID)
binding.function = function; binding.function = function;
if (function) function(cmd->system, cmd, binding); if (function) function(cmd->system, cmd, binding);
update_command_data(cmd->vars, cmd);
result = true; result = true;
} }
else{ else{
@ -1243,8 +1241,6 @@ DOC_SEE(View_Split_Position)
fill_view_summary(&result, split.panel->view, cmd); fill_view_summary(&result, split.panel->view, cmd);
} }
update_command_data(cmd->vars, cmd);
return(result); return(result);
} }
@ -1370,8 +1366,6 @@ DOC_SEE(get_active_view)
Panel *panel = vptr->panel; Panel *panel = vptr->panel;
models->layout.active_panel = (i32)(panel - models->layout.panels); models->layout.active_panel = (i32)(panel - models->layout.panels);
update_command_data(cmd->vars, cmd);
} }
return(result); return(result);
@ -1807,11 +1801,9 @@ will reflect the change. Since the bar stops showing when the command exits the
only use for this call is in an interactive command that makes calls to get_user_input. only use for this call is in an interactive command that makes calls to get_user_input.
) )
*/{ */{
Command_Data *cmd = (Command_Data*)app->cmd_context; Command_Data *command = (Command_Data*)app->cmd_context;
USE_VIEW(vptr);
Query_Slot *slot = 0; Query_Slot *slot = 0;
View *vptr;
vptr = cmd->view;
slot = alloc_query_slot(&vptr->query_set); slot = alloc_query_slot(&vptr->query_set);
slot->query_bar = bar; slot->query_bar = bar;
@ -1826,9 +1818,8 @@ DOC_PARAM(bar, This parameter should be a bar pointer of a currently active quer
DOC_PARAM(flags, This parameter is not currently used and should be 0 for now.) DOC_PARAM(flags, This parameter is not currently used and should be 0 for now.)
DOC(Stops showing the particular query bar specified by the bar parameter.) DOC(Stops showing the particular query bar specified by the bar parameter.)
*/{ */{
Command_Data *cmd = (Command_Data*)app->cmd_context; Command_Data *command = (Command_Data*)app->cmd_context;
View *vptr; USE_VIEW(vptr);
vptr = cmd->view;
free_query_slot(&vptr->query_set, bar); free_query_slot(&vptr->query_set, bar);
} }

View File

@ -944,7 +944,7 @@ file_grow_starts_widths_as_needed(General_Memory *general, Buffer_Type *buffer,
internal void internal void
file_measure_starts_widths(System_Functions *system, General_Memory *general, file_measure_starts_widths(System_Functions *system, General_Memory *general,
Buffer_Type *buffer, float *advance_data){ Buffer_Type *buffer, f32 *advance_data){
if (!buffer->line_starts){ if (!buffer->line_starts){
i32 max = buffer->line_max = Kbytes(1); i32 max = buffer->line_max = Kbytes(1);
buffer->line_starts = (i32*)general_memory_allocate(general, max*sizeof(i32)); buffer->line_starts = (i32*)general_memory_allocate(general, max*sizeof(i32));
@ -991,10 +991,9 @@ file_measure_starts_widths(System_Functions *system, General_Memory *general,
} }
internal void internal void
view_measure_wraps(General_Memory *general, View *view){ view_measure_wraps(Models *models, General_Memory *general, View *view){
Buffer_Type *buffer; Editing_File *file = view->file_data.file;
Buffer_Type *buffer = &file->state.buffer;
buffer = &view->file_data.file->state.buffer;
i32 line_count = buffer->line_count; i32 line_count = buffer->line_count;
if (view->file_data.line_max < line_count){ if (view->file_data.line_max < line_count){
@ -1009,9 +1008,13 @@ view_measure_wraps(General_Memory *general, View *view){
} }
} }
Render_Font *font = get_font_info(models->font_set, file->settings.font_id)->font;
f32 *adv = font->advance_data;
f32 line_height = (f32)view->line_height; f32 line_height = (f32)view->line_height;
f32 max_width = view_file_display_width(view); f32 max_width = view_file_display_width(view);
buffer_measure_wrap_y(buffer, view->file_data.line_wrap_y, line_height, max_width); buffer_measure_wrap_y(buffer, view->file_data.line_wrap_y, line_height,
adv, max_width);
view->file_data.line_count = line_count; view->file_data.line_count = line_count;
} }
@ -1703,6 +1706,8 @@ update_view_line_height(Models *models, View *view, i16 font_id){
internal void internal void
view_set_file(View *view, Editing_File *file, Models *models){ view_set_file(View *view, Editing_File *file, Models *models){
Assert(file);
if (view->file_data.file != 0){ if (view->file_data.file != 0){
touch_file(&models->working_set, view->file_data.file); touch_file(&models->working_set, view->file_data.file);
} }
@ -1717,21 +1722,16 @@ view_set_file(View *view, Editing_File *file, Models *models){
file_view_nullify_file(view); file_view_nullify_file(view);
view->file_data.file = file; view->file_data.file = file;
if (file){ view->file_data.unwrapped_lines = file->settings.unwrapped_lines;
view->file_data.unwrapped_lines = file->settings.unwrapped_lines;
edit_pos = edit_pos_get_new(file, view->persistent.id); edit_pos = edit_pos_get_new(file, view->persistent.id);
view->edit_pos = edit_pos; view->edit_pos = edit_pos;
if (file_is_ready(file)){ if (file_is_ready(file)){
view_measure_wraps(&models->mem.general, view); view_measure_wraps(models, &models->mem.general, view);
}
update_view_line_height(models, view, file->settings.font_id);
}
else{
update_view_line_height(models, view, models->global_font.font_id);
} }
update_view_line_height(models, view, file->settings.font_id);
} }
struct Relative_Scrolling{ struct Relative_Scrolling{
@ -1995,25 +1995,26 @@ struct Cursor_Fix_Descriptor{
}; };
internal void internal void
file_edit_cursor_fix(System_Functions *system, file_edit_cursor_fix(System_Functions *system, Models *models,
Partition *part, General_Memory *general,
Editing_File *file, Editing_Layout *layout, Editing_File *file, Editing_Layout *layout,
Cursor_Fix_Descriptor desc, i32 *shift_out){ Cursor_Fix_Descriptor desc, i32 *shift_out){
Partition *part = &models->mem.part;
General_Memory *general = &models->mem.general;
Temp_Memory cursor_temp = begin_temp_memory(part); Temp_Memory cursor_temp = begin_temp_memory(part);
i32 cursor_max = layout->panel_max_count * 2; i32 cursor_max = layout->panel_max_count * 2;
Cursor_With_Index *cursors = push_array(part, Cursor_With_Index, cursor_max); Cursor_With_Index *cursors = push_array(part, Cursor_With_Index, cursor_max);
i32 cursor_count = 0; i32 cursor_count = 0;
View *view; View *view = 0;
Panel *panel, *used_panels; Panel *panel, *used_panels = &layout->used_sentinel;
used_panels = &layout->used_sentinel;
for (dll_items(panel, used_panels)){ for (dll_items(panel, used_panels)){
view = panel->view; view = panel->view;
if (view->file_data.file == file){ if (view->file_data.file == file){
view_measure_wraps(general, view); // TODO(allen): Is this a good place for this ????
view_measure_wraps(models, general, view);
Assert(view->edit_pos); Assert(view->edit_pos);
write_cursor_with_index(cursors, &cursor_count, view->edit_pos->cursor.pos); write_cursor_with_index(cursors, &cursor_count, view->edit_pos->cursor.pos);
write_cursor_with_index(cursors, &cursor_count, view->edit_pos->mark); write_cursor_with_index(cursors, &cursor_count, view->edit_pos->mark);
@ -2142,7 +2143,7 @@ file_do_single_edit(System_Functions *system,
for (dll_items(panel, used_panels)){ for (dll_items(panel, used_panels)){
View *view = panel->view; View *view = panel->view;
if (view->file_data.file == file){ if (view->file_data.file == file){
view_measure_wraps(general, view); view_measure_wraps(models, general, view);
} }
} }
@ -2152,7 +2153,7 @@ file_do_single_edit(System_Functions *system,
desc.end = end; desc.end = end;
desc.shift_amount = shift_amount; desc.shift_amount = shift_amount;
file_edit_cursor_fix(system, part, general, file, layout, desc, 0); file_edit_cursor_fix(system, models, file, layout, desc, 0);
// NOTE(allen): token fixing // NOTE(allen): token fixing
if (file->settings.tokens_exist){ if (file->settings.tokens_exist){
@ -2219,7 +2220,7 @@ file_do_batch_edit(System_Functions *system, Models *models, Editing_File *file,
desc.batch = batch; desc.batch = batch;
desc.batch_size = batch_size; desc.batch_size = batch_size;
file_edit_cursor_fix(system, part, general, file, layout, desc, &shift_total); file_edit_cursor_fix(system, models, file, layout, desc, &shift_total);
} }
// NOTE(allen): token fixing // NOTE(allen): token fixing
@ -2626,13 +2627,16 @@ style_get_color(Style *style, Cpp_Token token){
return result; return result;
} }
// TODO(allen): What's the deal with this function? Can we
// just pass models in... by the way is this even being called?
internal void internal void
remeasure_file_view(System_Functions *system, View *view){ remeasure_file_view(System_Functions *system, View *view){
if (file_is_ready(view->file_data.file)){ if (file_is_ready(view->file_data.file)){
Assert(view->edit_pos); Assert(view->edit_pos);
Relative_Scrolling relative = view_get_relative_scrolling(view); Relative_Scrolling relative = view_get_relative_scrolling(view);
view_measure_wraps(&view->persistent.models->mem.general, view); Models *models = view->persistent.models;
view_measure_wraps(models, &models->mem.general, view);
if (view->file_data.show_temp_highlight == 0){ if (view->file_data.show_temp_highlight == 0){
view_cursor_move(view, view->edit_pos->cursor.pos); view_cursor_move(view, view->edit_pos->cursor.pos);
} }
@ -2749,7 +2753,7 @@ init_normal_file(System_Functions *system, Models *models, Editing_File *file,
for (View_Iter iter = file_view_iter_init(&models->layout, file, 0); for (View_Iter iter = file_view_iter_init(&models->layout, file, 0);
file_view_iter_good(iter); file_view_iter_good(iter);
iter = file_view_iter_next(iter)){ iter = file_view_iter_next(iter)){
view_measure_wraps(general, iter.view); view_measure_wraps(models, general, iter.view);
} }
} }
@ -2767,7 +2771,7 @@ init_read_only_file(System_Functions *system, Models *models, Editing_File *file
for (View_Iter iter = file_view_iter_init(&models->layout, file, 0); for (View_Iter iter = file_view_iter_init(&models->layout, file, 0);
file_view_iter_good(iter); file_view_iter_good(iter);
iter = file_view_iter_next(iter)){ iter = file_view_iter_next(iter)){
view_measure_wraps(general, iter.view); view_measure_wraps(models, general, iter.view);
} }
} }
@ -5600,17 +5604,6 @@ file_view_free_buffers(View *view){
view->gui_mem = 0; view->gui_mem = 0;
} }
inline void
view_change_size(General_Memory *general, View *view){
if (view->file_data.file){
Assert(view->edit_pos);
view_measure_wraps(general, view);
Full_Cursor cursor =
view_compute_cursor_from_pos(view, view->edit_pos->cursor.pos);
view_set_cursor(view, cursor, 0, view->file_data.unwrapped_lines);
}
}
internal View_And_ID internal View_And_ID
live_set_alloc_view(Live_Views *live_set, Panel *panel, Models *models){ live_set_alloc_view(Live_Views *live_set, Panel *panel, Models *models){
View_And_ID result = {}; View_And_ID result = {};

View File

@ -133,6 +133,7 @@
; [X] use strange theme ; [X] use strange theme
; [X] cuber's return to previous buffer idea ; [X] cuber's return to previous buffer idea
; Token related upgrades
; [X] tokens in the custom API ; [X] tokens in the custom API
; [X] token seeking on custom side ; [X] token seeking on custom side
; [X] auto indent on the custom side ; [X] auto indent on the custom side
@ -151,6 +152,13 @@
; [] command for setting wrap positions in views directly ; [] command for setting wrap positions in views directly
; [] ability to see the wrap position as a number/line and adjust graphically ; [] ability to see the wrap position as a number/line and adjust graphically
; buffer behavior cleanup
; [X] show all characters as \# if they can't be rendered
; [] get the navigation working correctly around multi-glyph characters
; [] binary buffer mode
; [] unicode buffer mode
; [] support full length unicode file names
; [] miblo's various number editors ; [] miblo's various number editors
; [] user file bar string ; [] user file bar string
; [] API docs as text file ; [] API docs as text file
@ -177,12 +185,6 @@
; [] control the file opening/start hook relationship better ; [] control the file opening/start hook relationship better
; [] get keyboard state on launch ; [] get keyboard state on launch
; buffer behavior cleanup
; [X] show all characters as \# if they can't be rendered
; [] get the navigation working correctly around multi-glyph characters
; [] binary buffer mode
; [] support full length unicode file names
; meta programming system ; meta programming system
; [X] condense system into single meta compiler ; [X] condense system into single meta compiler
; [] formalize the rewriter for the 4coder_string.h so it can be used for other single header libs ; [] formalize the rewriter for the 4coder_string.h so it can be used for other single header libs

View File

@ -73,36 +73,25 @@ typedef struct Buffer_Measure_Starts{
f32 width; f32 width;
} Buffer_Measure_Starts; } Buffer_Measure_Starts;
// TODO(allen): Rewrite this with a duff routine
internal_4tech i32 internal_4tech i32
buffer_measure_starts_widths_(Buffer_Measure_Starts *state, Buffer_Type *buffer, f32 *advance_data){ buffer_measure_starts_widths_(Buffer_Measure_Starts *state, Buffer_Type *buffer, f32 *advance_data){
Buffer_Stringify_Type loop; Buffer_Stringify_Type loop = {0};
i32 *start_ptr, *start_end; char *data = 0;
f32 *width_ptr; i32 end = 0;
debug_4tech(i32 widths_max); i32 size = buffer_size(buffer);
debug_4tech(i32 max); f32 width = state->width;
char *data; i32 start = state->start, i = state->i;
i32 size, end; i32 *start_ptr = buffer->line_starts + state->count;
f32 width; i32 *start_end = buffer->line_starts + buffer->line_max;
i32 start, i; f32 *width_ptr = buffer->line_widths + state->count;
i32 result; i32 result = 1;
char ch; char ch = 0;
size = buffer_size(buffer); debug_4tech(i32 widths_max = buffer->widths_max);
debug_4tech(i32 max = buffer->line_max);
debug_4tech(max = buffer->line_max);
debug_4tech(widths_max = buffer->widths_max);
assert_4tech(max == widths_max); assert_4tech(max == widths_max);
result = 1;
i = state->i;
start = state->start;
width = state->width;
start_ptr = buffer->line_starts + state->count;
width_ptr = buffer->line_widths + state->count;
start_end = buffer->line_starts + buffer->line_max;
for (loop = buffer_stringify_loop(buffer, i, size); for (loop = buffer_stringify_loop(buffer, i, size);
buffer_stringify_good(&loop); buffer_stringify_good(&loop);
buffer_stringify_next(&loop)){ buffer_stringify_next(&loop)){
@ -111,7 +100,9 @@ buffer_measure_starts_widths_(Buffer_Measure_Starts *state, Buffer_Type *buffer,
for (; i < end; ++i){ for (; i < end; ++i){
ch = data[i]; ch = data[i];
if (ch == '\n'){ if (ch == '\n'){
if (start_ptr == start_end) goto buffer_measure_starts_widths_end; if (start_ptr == start_end){
goto buffer_measure_starts_widths_end;
}
*width_ptr++ = width; *width_ptr++ = width;
*start_ptr++ = start; *start_ptr++ = start;
@ -126,12 +117,14 @@ buffer_measure_starts_widths_(Buffer_Measure_Starts *state, Buffer_Type *buffer,
assert_4tech(i == size); assert_4tech(i == size);
if (start_ptr == start_end) goto buffer_measure_starts_widths_end; if (start_ptr == start_end){
goto buffer_measure_starts_widths_end;
}
*start_ptr++ = start; *start_ptr++ = start;
*width_ptr++ = 0; *width_ptr++ = 0;
result = 0; result = 0;
buffer_measure_starts_widths_end: buffer_measure_starts_widths_end:;
state->i = i; state->i = i;
state->count = (i32)(start_ptr - buffer->line_starts); state->count = (i32)(start_ptr - buffer->line_starts);
state->start = start; state->start = start;
@ -338,21 +331,51 @@ buffer_remeasure_widths(Buffer_Type *buffer, f32 *advance_data,
internal_4tech void internal_4tech void
buffer_measure_wrap_y(Buffer_Type *buffer, f32 *wraps, buffer_measure_wrap_y(Buffer_Type *buffer, f32 *wraps,
f32 font_height, f32 max_width){ f32 font_height, f32 *adv, f32 max_width){
f32 *widths = buffer->line_widths; Buffer_Stringify_Type loop = {0};
f32 y_pos = 0; i32 size = buffer_size(buffer);
i32 line_count = buffer->line_count; char *data = 0;
i32 end = 0;
i32 i = 0; i32 i = 0;
for (; i < line_count; ++i){ i32 wrap_index = 0;
wraps[i] = y_pos; f32 last_wrap = 0.f;
if (widths[i] == 0){ f32 current_wrap = 0.f;
y_pos += font_height;
} f32 x = 0.f;
else{ f32 current_adv = 0.f;
y_pos += font_height*ceil_4tech(widths[i]/max_width);
u8 ch = 0;
for (loop = buffer_stringify_loop(buffer, i, size);
buffer_stringify_good(&loop);
buffer_stringify_next(&loop)){
end = loop.size + loop.absolute_pos;
data = loop.data - loop.absolute_pos;
for (; i < end; ++i){
ch = (u8)data[i];
if (ch == '\n'){
wraps[wrap_index++] = last_wrap;
current_wrap += font_height;
last_wrap = current_wrap;
x = 0.f;
}
else{
current_adv = adv[ch];
if (x + current_adv > max_width){
current_wrap += font_height;
x = current_adv;
}
else{
x += current_adv;
}
}
} }
} }
wraps[wrap_index++] = last_wrap;
assert_4tech(wrap_index == buffer->line_count);
} }
internal_4tech i32 internal_4tech i32
@ -932,7 +955,7 @@ buffer_get_render_data(Buffer_Type *buffer, Buffer_Render_Item *items, i32 max,
buffer_get_render_data_end:; buffer_get_render_data_end:;
if (write.y <= height + shift_y || write.item == items){ if (write.y <= height + shift_y || write.item == items){
if (write.item < item_end){ if (write.item < item_end){
write_render_item(write, size, ' ', 0); write = write_render_item(write, size, ' ', 0);
} }
} }
} }
@ -941,7 +964,7 @@ buffer_get_render_data(Buffer_Type *buffer, Buffer_Render_Item *items, i32 max,
write.adv = &zero; write.adv = &zero;
if (write.item < item_end){ if (write.item < item_end){
write_render_item(write, size, 0, 0); write = write_render_item(write, size, 0, 0);
} }
} }