more view debugging

This commit is contained in:
Allen Webster 2016-06-09 23:20:45 -04:00
parent c26bf843a9
commit 4abac7a639
6 changed files with 263 additions and 32 deletions

View File

@ -142,6 +142,10 @@ FSTRING_LINK int32_t u64_to_str_size(uint64_t x);
FSTRING_LINK fstr_bool u64_to_str(String *s_out, uint64_t x); FSTRING_LINK fstr_bool u64_to_str(String *s_out, uint64_t x);
FSTRING_LINK fstr_bool append_u64_to_str(String *s_out, uint64_t x); FSTRING_LINK fstr_bool append_u64_to_str(String *s_out, uint64_t x);
FSTRING_LINK int32_t float_to_str_size(float x);
FSTRING_LINK fstr_bool float_to_str(String *s_out, float x);
FSTRING_LINK fstr_bool append_float_to_str(String *s_out, float x);
FSTRING_LINK int32_t str_to_int(char *s); FSTRING_LINK int32_t str_to_int(char *s);
FSTRING_LINK int32_t str_to_int(String s); FSTRING_LINK int32_t str_to_int(String s);
FSTRING_LINK int32_t hexchar_to_int(char c); FSTRING_LINK int32_t hexchar_to_int(char c);
@ -800,6 +804,59 @@ append_u64_to_str(String *dest, uint64_t x){
return(result); return(result);
} }
struct Float_To_Str_Variables{
fstr_bool negative;
int32_t int_part;
int32_t dec_part;
};
FSTRING_INLINE Float_To_Str_Variables
get_float_vars(float x){
Float_To_Str_Variables vars = {0};
if (x < 0){
vars.negative = true;
x = -x;
}
vars.int_part = (int32_t)(x);
vars.dec_part = (int32_t)((x - vars.int_part) * 1000);
return(vars);
}
FSTRING_LINK int32_t
float_to_str_size(float x){
Float_To_Str_Variables vars = get_float_vars(x);
int32_t size =
vars.negative + int_to_str_size(vars.int_part) + 1 + int_to_str_size(vars.dec_part);
return(size);
}
FSTRING_LINK fstr_bool
append_float_to_str(String *dest, float x){
fstr_bool result = 1;
Float_To_Str_Variables vars = get_float_vars(x);
if (vars.negative){
append(dest, '-');
}
append_int_to_str(dest, vars.int_part);
append(dest, '.');
append_int_to_str(dest, vars.dec_part);
return(result);
}
FSTRING_LINK fstr_bool
float_to_str(String *dest, float x){
fstr_bool result = 1;
dest->size = 0;
append_float_to_str(dest, x);
return(result);
}
FSTRING_LINK int32_t FSTRING_LINK int32_t
str_to_int(char *str){ str_to_int(char *str){

12
4ed.cpp
View File

@ -59,11 +59,13 @@ struct Command_Data{
struct App_Vars{ struct App_Vars{
Models models; Models models;
// TODO(allen): This wants to live in
// models with everyone else but the order
// of declaration is a little bit off...
Live_Views live_set;
CLI_List cli_processes; CLI_List cli_processes;
Live_Views live_set;
App_State state; App_State state;
App_State_Resizing resizing; App_State_Resizing resizing;
Complete_State complete_state; Complete_State complete_state;
@ -1247,10 +1249,8 @@ COMMAND_DECL(open_menu){
COMMAND_DECL(open_debug){ COMMAND_DECL(open_debug){
USE_VIEW(view); USE_VIEW(view);
#if FRED_INTERNAL
view_show_GUI(view, VUI_Debug); view_show_GUI(view, VUI_Debug);
view->debug_mode = DBG_Input; view->debug_vars = debug_vars_zero();
#endif
} }
COMMAND_DECL(user_callback){ COMMAND_DECL(user_callback){
@ -2847,6 +2847,8 @@ App_Init_Sig(app_init){
i32 i = 0; i32 i = 0;
i32 max = 0; i32 max = 0;
models->live_set = &vars->live_set;
vars->live_set.count = 0; vars->live_set.count = 0;
vars->live_set.max = panel_max_count; vars->live_set.max = panel_max_count;

View File

@ -69,6 +69,7 @@ struct Models{
Editing_Layout layout; Editing_Layout layout;
Working_Set working_set; Working_Set working_set;
struct Live_Views *live_set;
Editing_File *message_buffer; Editing_File *message_buffer;
char hot_dir_base_[256]; char hot_dir_base_[256];

View File

@ -206,6 +206,16 @@ struct View_Persistent{
Models *models; Models *models;
}; };
struct Debug_Vars{
i32 mode;
i32 inspecting_view_id;
};
inline Debug_Vars
debug_vars_zero(){
Debug_Vars vars = {0};
return(vars);
}
struct View{ struct View{
View_Persistent persistent; View_Persistent persistent;
@ -266,7 +276,7 @@ struct View{
b32 reinit_scrolling; b32 reinit_scrolling;
Debug_Mode debug_mode; Debug_Vars debug_vars;
}; };
inline void* inline void*
get_view_body(View *view){ get_view_body(View *view){
@ -284,6 +294,12 @@ struct View_And_ID{
i32 id; i32 id;
}; };
struct Live_Views{
View *views;
View free_sentinel;
i32 count, max;
};
#define LockLevel_Open 0 #define LockLevel_Open 0
#define LockLevel_NoWrite 1 #define LockLevel_NoWrite 1
#define LockLevel_NoUpdate 2 #define LockLevel_NoUpdate 2
@ -3879,6 +3895,63 @@ app_single_number_input_step(System_Functions *system, Key_Event_Data key, Strin
return result; return result;
} }
internal void
append_label(String *string, i32 indent_level, char *message){
i32 r = 0;
for (r = 0; r < indent_level; ++r){
append(string, '>');
}
append(string, message);
}
internal void
show_gui_line(GUI_Target *target, String *string,
i32 indent_level, i32 h_align, char *message, char *follow_up){
string->size = 0;
append_label(string, indent_level, message);
if (follow_up){
append_padding(string, '-', h_align);
append(string, ' ');
append(string, follow_up);
}
gui_do_text_field(target, *string, string_zero());
}
internal void
show_gui_int(GUI_Target *target, String *string,
i32 indent_level, i32 h_align, char *message, i32 x){
string->size = 0;
append_label(string, indent_level, message);
append_padding(string, '-', h_align);
append(string, ' ');
append_int_to_str(string, x);
gui_do_text_field(target, *string, string_zero());
}
internal void
show_gui_int_int(GUI_Target *target, String *string,
i32 indent_level, i32 h_align, char *message, i32 x, i32 m){
string->size = 0;
append_label(string, indent_level, message);
append_padding(string, '-', h_align);
append(string, ' ');
append_int_to_str(string, x);
append(string, '/');
append_int_to_str(string, m);
gui_do_text_field(target, *string, string_zero());
}
internal void
show_gui_float(GUI_Target *target, String *string,
i32 indent_level, i32 h_align, char *message, float x){
string->size = 0;
append_label(string, indent_level, message);
append_padding(string, '-', h_align);
append(string, ' ');
append_float_to_str(string, x);
gui_do_text_field(target, *string, string_zero());
}
struct View_Step_Result{ struct View_Step_Result{
b32 animating; b32 animating;
b32 consume_keys; b32 consume_keys;
@ -4483,11 +4556,13 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su
} }
}break; }break;
#if FRED_INTERNAL
case VUI_Debug: case VUI_Debug:
{ {
GUI_id scroll_context = {0}; GUI_id scroll_context = {0};
scroll_context.id[1] = VUI_Debug + ((u64)view->interaction << 32); scroll_context.id[1] = VUI_Debug + ((u64)view->debug_vars.mode << 32);
GUI_id id = {0};
id.id[1] = VUI_Debug + ((u64)view->debug_vars.mode << 32);
view->current_scroll = &view->gui_scroll; view->current_scroll = &view->gui_scroll;
@ -4517,24 +4592,24 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su
} }
{ {
Debug_Mode prev_mode = view->debug_mode; i32 prev_mode = view->debug_vars.mode;
for (i32 i = 0; i < keys.count; ++i){ for (i32 i = 0; i < keys.count; ++i){
Key_Event_Data key = get_single_key(&keys, i); Key_Event_Data key = get_single_key(&keys, i);
if (key.modifiers[MDFR_CONTROL_INDEX] == 0 && if (key.modifiers[MDFR_CONTROL_INDEX] == 0 &&
key.modifiers[MDFR_ALT_INDEX] == 0){ key.modifiers[MDFR_ALT_INDEX] == 0){
if (key.keycode == 'i'){ if (key.keycode == 'i'){
view->debug_mode = DBG_Input; view->debug_vars.mode = DBG_Input;
} }
if (key.keycode == 'm'){ if (key.keycode == 'm'){
view->debug_mode = DBG_Threads_And_Memory; view->debug_vars.mode = DBG_Threads_And_Memory;
} }
if (key.keycode == 'v'){ if (key.keycode == 'v'){
view->debug_mode = DBG_View_Inspection; view->debug_vars.mode = DBG_View_Inspection;
} }
} }
} }
if (prev_mode != view->debug_mode){ if (prev_mode != view->debug_vars.mode){
result.consume_keys = 1; result.consume_keys = 1;
} }
} }
@ -4542,7 +4617,7 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su
gui_begin_scrollable(target, scroll_context, view->gui_scroll, gui_begin_scrollable(target, scroll_context, view->gui_scroll,
9.f * view->line_height, show_scrollbar); 9.f * view->line_height, show_scrollbar);
switch (view->debug_mode) switch (view->debug_vars.mode)
{ {
case DBG_Input: case DBG_Input:
{ {
@ -4688,37 +4763,132 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su
case DBG_View_Inspection: case DBG_View_Inspection:
{ {
i32 inspecting_id = view->debug_vars.inspecting_view_id;
View *views_to_inspect[16];
i32 view_count = 0;
b32 low_detail = true;
if (inspecting_id == 0){
Editing_Layout *layout = &models->layout; Editing_Layout *layout = &models->layout;
Panel *panel, *sentinel; Panel *panel, *sentinel;
sentinel = &layout->used_sentinel; sentinel = &layout->used_sentinel;
for (dll_items(panel, sentinel)){ for (dll_items(panel, sentinel)){
View *view = panel->view; View *view_ptr = panel->view;
views_to_inspect[view_count++] = view_ptr;
}
}
else if (inspecting_id >= 1 && inspecting_id <= 16){
Live_Views *live_set = models->live_set;
View *view_ptr = live_set->views + inspecting_id - 1;
views_to_inspect[view_count++] = view_ptr;
low_detail = false;
}
for (i32 i = 0; i < view_count; ++i){
View *view_ptr = views_to_inspect[i];
string.size = 0; string.size = 0;
append(&string, "view: "); append(&string, "view: ");
append_int_to_str(&string, view->persistent.id); append_int_to_str(&string, view_ptr->persistent.id + 1);
gui_do_text_field(target, string, empty_str); gui_do_text_field(target, string, empty_str);
string.size = 0; string.size = 0;
Editing_File *file = view->file_data.file; Editing_File *file = view_ptr->file_data.file;
append(&string, " > buffer: "); append(&string, " > buffer: ");
if (file){ if (file){
append(&string, file->name.live_name); append(&string, file->name.live_name);
gui_do_text_field(target, string, empty_str); gui_do_text_field(target, string, empty_str);
string.size = 0; string.size = 0;
append(&string, " > buffer-slot-id: "); append(&string, " >> buffer-slot-id: ");
append_int_to_str(&string, file->id.id); append_int_to_str(&string, file->id.id);
} }
else{ else{
append(&string, "*NULL*"); append(&string, "*NULL*");
gui_do_text_field(target, string, empty_str); gui_do_text_field(target, string, empty_str);
} }
if (low_detail){
string.size = 0;
append(&string, "inspect this");
id.id[0] = (u64)(view_ptr->persistent.id);
if (gui_do_button(target, id, string)){
view->debug_vars.inspecting_view_id = view_ptr->persistent.id + 1;
} }
}
else{
#define SHOW_GUI_BLANK() gui_do_text_field(target, empty_str, empty_str)
#define SHOW_GUI_LINE(n, str) show_gui_line(target, &string, n, 0, " " str, 0);
#define SHOW_GUI_STRING(n, h, str, mes) show_gui_line(target, &string, n, h, " " str " ", mes);
#define SHOW_GUI_INT(n, h, str, v) show_gui_int(target, &string, n, h, " " str " ", v);
#define SHOW_GUI_INT_INT(n, h, str, v, m) show_gui_int_int(target, &string, n, h, " " str " ", v, m);
#define SHOW_GUI_FLOAT(n, h, str, v) show_gui_float(target, &string, n, h, " " str " ", v);
#define SHOW_GUI_BOOL(n, h, str, v) do { if (v) { show_gui_line(target, &string, n, h, " " str " ", "true"); }\
else { show_gui_line(target, &string, n, h, " " str " ", "false"); } } while(false)
i32 h_align = 31;
SHOW_GUI_BLANK();
{
Command_Map *map = view_ptr->map;
#define MAP_LABEL "command map"
if (map == &models->map_top){
SHOW_GUI_STRING(1, h_align, MAP_LABEL, "global");
}
else if (map == &models->map_file){
SHOW_GUI_STRING(1, h_align, MAP_LABEL, "file");
}
else if (map == &models->map_ui){
SHOW_GUI_STRING(1, h_align, MAP_LABEL, "gui");
}
else{
i32 map_index = (i32)(view_ptr->map - models->user_maps);
i32 map_id = models->map_id_table[map_index];
SHOW_GUI_STRING(1, h_align, MAP_LABEL, "user");
SHOW_GUI_INT(2, h_align, "custom map id", map_id);
}
}
SHOW_GUI_BLANK();
SHOW_GUI_LINE(1, "file data:");
SHOW_GUI_BOOL(2, h_align, "has file", view_ptr->file_data.file);
SHOW_GUI_BOOL(2, h_align, "show temp highlight", view_ptr->file_data.show_temp_highlight);
SHOW_GUI_INT (2, h_align, "start temp highlight", view_ptr->file_data.temp_highlight.pos);
SHOW_GUI_INT (2, h_align, "end temp highlight", view_ptr->file_data.temp_highlight_end_pos);
SHOW_GUI_BOOL(2, h_align, "unwrapped lines", view_ptr->file_data.unwrapped_lines);
SHOW_GUI_BOOL(2, h_align, "show whitespace", view_ptr->file_data.show_whitespace);
SHOW_GUI_BOOL(2, h_align, "locked", view_ptr->file_data.file_locked);
SHOW_GUI_INT_INT(2, h_align, "line count",
view_ptr->file_data.line_count,
view_ptr->file_data.line_max);
GUI_Scroll_Vars scroll = *view_ptr->current_scroll;
SHOW_GUI_BLANK();
SHOW_GUI_LINE(1, "current scroll:");
SHOW_GUI_FLOAT(2, h_align, "scroll_y", scroll.scroll_y);
SHOW_GUI_FLOAT(2, h_align, "target_y", scroll.target_y);
SHOW_GUI_FLOAT(2, h_align, "prev_target_y", scroll.prev_target_y);
SHOW_GUI_FLOAT(2, h_align, "max_y", scroll.max_y);
SHOW_GUI_FLOAT(2, h_align, "scroll_x", scroll.scroll_x);
SHOW_GUI_FLOAT(2, h_align, "target_x", scroll.target_x);
SHOW_GUI_FLOAT(2, h_align, "prev_target_x", scroll.prev_target_x);
// TODO(allen): cursor
}
}
}break; }break;
} }
gui_end_scrollable(target); gui_end_scrollable(target);
}break; }break;
#endif
} }
} }
} }
@ -5933,12 +6103,6 @@ view_change_size(General_Memory *general, View *view){
} }
} }
struct Live_Views{
View *views;
View free_sentinel;
i32 count, max;
};
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

@ -263,10 +263,16 @@ gui_update_position(GUI_Item_Update *update, i32_Rect position){
internal void* internal void*
gui_push_item(GUI_Target *target, void *item, i32 size){ gui_push_item(GUI_Target *target, void *item, i32 size){
void *dest = partition_allocate(&target->push, size); void *dest = 0;
if (size == 0){
dest = partition_current(&target->push);
}
else{
dest = partition_allocate(&target->push, size);
if (dest && item){ if (dest && item){
memcpy(dest, item, size); memcpy(dest, item, size);
} }
}
return(dest); return(dest);
} }

View File

@ -102,6 +102,7 @@
; [X] add high DPI support ; [X] add high DPI support
; ;
; [] OS font rendering ; [] OS font rendering
; [] support full length unicode file names
; ;
; [] file status in custom API ; [] file status in custom API
; [] user file bar string ; [] user file bar string