new wrap rule; cleaning up some init stuff
parent
3947255b00
commit
582faa4bdf
162
4ed.cpp
162
4ed.cpp
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 = {};
|
||||||
|
|
14
TODO.txt
14
TODO.txt
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue