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;
Live_Views *live_set;
#if 0
// TODO(allen): eliminate this shit yo!
Panel *panel;
View *view;
#endif
i32 screen_width, screen_height;
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_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 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_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);
}
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];
#include "4ed_api_implementation.cpp"
@ -728,9 +735,9 @@ struct Command_In{
internal void
command_caller(Coroutine *coroutine){
Command_In *cmd_in = (Command_In*)coroutine->in;
Command_Data *cmd = cmd_in->cmd;
Models *models = cmd->models;
View *view = cmd->view;
Command_Data *command = cmd_in->cmd;
Models *models = command->models;
USE_VIEW(view);
view->next_mode = view_mode_zero();
if (models->command_caller){
@ -745,7 +752,7 @@ command_caller(Coroutine *coroutine){
}
}
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;
}
@ -1673,6 +1680,42 @@ App_Init_Sig(app_init){
models->palette = push_array(partition, u32, models->palette_size);
// 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_make_empty(system, vars, p.panel);
models->layout.active_panel = p.id;
@ -1811,22 +1854,11 @@ App_Step_Sig(app_step){
i32 current_width = target->width;
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_height = current_height;
if (prev_width != current_width || prev_height != current_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->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_height = target->height;
@ -2024,30 +2053,6 @@ App_Step_Sig(app_step){
}
#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]){
models->hooks[hook_start](&models->app_links);
}
@ -2101,11 +2106,6 @@ App_Step_Sig(app_step){
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;
for (i = 0; i < models->settings.init_files_count; ++i, panel = panel->next){
Assert(panel->view->file_data.file != 0);
@ -2129,7 +2129,8 @@ App_Step_Sig(app_step){
if (there_is_unsaved){
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){
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){
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;
cmd->key = key;
@ -2265,7 +2267,8 @@ App_Step_Sig(app_step){
// NOTE(allen): Mouse input to command coroutine
if (models->command_coroutine != 0 && (get_flags & EventOnMouse)){
View *view = cmd->view;
Command_Data *command = cmd;
USE_VIEW(view);
b32 pass_in = 0;
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
Input_Summary dead_input = {};
dead_input.mouse.x = input->mouse.x;
@ -2354,15 +2355,18 @@ App_Step_Sig(app_step){
{
Panel *panel = 0, *used_panels = 0;
View *view = 0, *active_view = 0;
View *view = 0;
b32 active = 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;
for (dll_items(panel, used_panels)){
view = panel->view;
active = (panel == cmd->panel);
active = (panel == active_panel);
summary = (active)?(active_input):(dead_input);
view->changed_context_in_step = 0;
@ -2382,7 +2386,7 @@ App_Step_Sig(app_step){
}
if (view->changed_context_in_step == 0){
active = (panel == cmd->panel);
active = (panel == active_panel);
summary = (active)?(active_input):(dead_input);
if (panel == mouse_panel && !input->mouse.out_of_window){
summary.mouse = mouse_state;
@ -2443,8 +2447,6 @@ App_Step_Sig(app_step){
}
}
update_command_data(vars, cmd);
// NOTE(allen): command execution
{
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);
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);
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
{
Debug_Data *debug = &models->debug;
@ -2742,8 +2746,6 @@ App_Step_Sig(app_step){
models->layout.active_panel = (i32)(mouse_panel - models->layout.panels);
}
update_command_data(vars, cmd);
end_temp_memory(param_stack_temp);
// NOTE(allen): on the first frame there should be no scrolling
@ -2774,6 +2776,10 @@ App_Step_Sig(app_step){
target->clip_top = -1;
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
Panel *panel, *used_panels;
used_panels = &models->layout.used_sentinel;
@ -2784,7 +2790,7 @@ App_Step_Sig(app_step){
View *view = panel->view;
Style *style = main_style(models);
b32 active = (panel == cmd->panel);
b32 active = (panel == active_panel);
u32 back_color = style->main.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);
draw_pop_clip(target);

View File

@ -171,8 +171,6 @@ DOC_SEE(Command_ID)
binding.function = function;
if (function) function(cmd->system, cmd, binding);
update_command_data(cmd->vars, cmd);
result = true;
}
else{
@ -1243,8 +1241,6 @@ DOC_SEE(View_Split_Position)
fill_view_summary(&result, split.panel->view, cmd);
}
update_command_data(cmd->vars, cmd);
return(result);
}
@ -1370,8 +1366,6 @@ DOC_SEE(get_active_view)
Panel *panel = vptr->panel;
models->layout.active_panel = (i32)(panel - models->layout.panels);
update_command_data(cmd->vars, cmd);
}
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.
)
*/{
Command_Data *cmd = (Command_Data*)app->cmd_context;
Command_Data *command = (Command_Data*)app->cmd_context;
USE_VIEW(vptr);
Query_Slot *slot = 0;
View *vptr;
vptr = cmd->view;
slot = alloc_query_slot(&vptr->query_set);
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(Stops showing the particular query bar specified by the bar parameter.)
*/{
Command_Data *cmd = (Command_Data*)app->cmd_context;
View *vptr;
vptr = cmd->view;
Command_Data *command = (Command_Data*)app->cmd_context;
USE_VIEW(vptr);
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
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){
i32 max = buffer->line_max = Kbytes(1);
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
view_measure_wraps(General_Memory *general, View *view){
Buffer_Type *buffer;
buffer = &view->file_data.file->state.buffer;
view_measure_wraps(Models *models, General_Memory *general, View *view){
Editing_File *file = view->file_data.file;
Buffer_Type *buffer = &file->state.buffer;
i32 line_count = buffer->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 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;
}
@ -1703,6 +1706,8 @@ update_view_line_height(Models *models, View *view, i16 font_id){
internal void
view_set_file(View *view, Editing_File *file, Models *models){
Assert(file);
if (view->file_data.file != 0){
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);
view->file_data.file = file;
if (file){
view->file_data.unwrapped_lines = file->settings.unwrapped_lines;
edit_pos = edit_pos_get_new(file, view->persistent.id);
view->edit_pos = edit_pos;
if (file_is_ready(file)){
view_measure_wraps(&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);
view->file_data.unwrapped_lines = file->settings.unwrapped_lines;
edit_pos = edit_pos_get_new(file, view->persistent.id);
view->edit_pos = edit_pos;
if (file_is_ready(file)){
view_measure_wraps(models, &models->mem.general, view);
}
update_view_line_height(models, view, file->settings.font_id);
}
struct Relative_Scrolling{
@ -1995,25 +1995,26 @@ struct Cursor_Fix_Descriptor{
};
internal void
file_edit_cursor_fix(System_Functions *system,
Partition *part, General_Memory *general,
file_edit_cursor_fix(System_Functions *system, Models *models,
Editing_File *file, Editing_Layout *layout,
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);
i32 cursor_max = layout->panel_max_count * 2;
Cursor_With_Index *cursors = push_array(part, Cursor_With_Index, cursor_max);
i32 cursor_count = 0;
View *view;
Panel *panel, *used_panels;
used_panels = &layout->used_sentinel;
View *view = 0;
Panel *panel, *used_panels = &layout->used_sentinel;
for (dll_items(panel, used_panels)){
view = panel->view;
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);
write_cursor_with_index(cursors, &cursor_count, view->edit_pos->cursor.pos);
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)){
View *view = panel->view;
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.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
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_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
@ -2626,13 +2627,16 @@ style_get_color(Style *style, Cpp_Token token){
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
remeasure_file_view(System_Functions *system, View *view){
if (file_is_ready(view->file_data.file)){
Assert(view->edit_pos);
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){
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);
file_view_iter_good(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);
file_view_iter_good(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;
}
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
live_set_alloc_view(Live_Views *live_set, Panel *panel, Models *models){
View_And_ID result = {};

View File

@ -133,6 +133,7 @@
; [X] use strange theme
; [X] cuber's return to previous buffer idea
; Token related upgrades
; [X] tokens in the custom API
; [X] token seeking on custom side
; [X] auto indent on the custom side
@ -151,6 +152,13 @@
; [] command for setting wrap positions in views directly
; [] 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
; [] user file bar string
; [] API docs as text file
@ -177,12 +185,6 @@
; [] control the file opening/start hook relationship better
; [] 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
; [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

File diff suppressed because it is too large Load Diff