more view debugging
This commit is contained in:
parent
c26bf843a9
commit
4abac7a639
|
@ -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 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(String s);
|
||||
FSTRING_LINK int32_t hexchar_to_int(char c);
|
||||
|
@ -800,6 +804,59 @@ append_u64_to_str(String *dest, uint64_t x){
|
|||
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
|
||||
str_to_int(char *str){
|
||||
|
|
12
4ed.cpp
12
4ed.cpp
|
@ -59,11 +59,13 @@ struct Command_Data{
|
|||
|
||||
struct App_Vars{
|
||||
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;
|
||||
|
||||
Live_Views live_set;
|
||||
|
||||
App_State state;
|
||||
App_State_Resizing resizing;
|
||||
Complete_State complete_state;
|
||||
|
@ -1247,10 +1249,8 @@ COMMAND_DECL(open_menu){
|
|||
|
||||
COMMAND_DECL(open_debug){
|
||||
USE_VIEW(view);
|
||||
#if FRED_INTERNAL
|
||||
view_show_GUI(view, VUI_Debug);
|
||||
view->debug_mode = DBG_Input;
|
||||
#endif
|
||||
view->debug_vars = debug_vars_zero();
|
||||
}
|
||||
|
||||
COMMAND_DECL(user_callback){
|
||||
|
@ -2847,6 +2847,8 @@ App_Init_Sig(app_init){
|
|||
i32 i = 0;
|
||||
i32 max = 0;
|
||||
|
||||
models->live_set = &vars->live_set;
|
||||
|
||||
vars->live_set.count = 0;
|
||||
vars->live_set.max = panel_max_count;
|
||||
|
||||
|
|
|
@ -69,6 +69,7 @@ struct Models{
|
|||
|
||||
Editing_Layout layout;
|
||||
Working_Set working_set;
|
||||
struct Live_Views *live_set;
|
||||
Editing_File *message_buffer;
|
||||
|
||||
char hot_dir_base_[256];
|
||||
|
|
|
@ -206,6 +206,16 @@ struct View_Persistent{
|
|||
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{
|
||||
View_Persistent persistent;
|
||||
|
||||
|
@ -266,7 +276,7 @@ struct View{
|
|||
|
||||
b32 reinit_scrolling;
|
||||
|
||||
Debug_Mode debug_mode;
|
||||
Debug_Vars debug_vars;
|
||||
};
|
||||
inline void*
|
||||
get_view_body(View *view){
|
||||
|
@ -284,6 +294,12 @@ struct View_And_ID{
|
|||
i32 id;
|
||||
};
|
||||
|
||||
struct Live_Views{
|
||||
View *views;
|
||||
View free_sentinel;
|
||||
i32 count, max;
|
||||
};
|
||||
|
||||
#define LockLevel_Open 0
|
||||
#define LockLevel_NoWrite 1
|
||||
#define LockLevel_NoUpdate 2
|
||||
|
@ -3879,6 +3895,63 @@ app_single_number_input_step(System_Functions *system, Key_Event_Data key, Strin
|
|||
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{
|
||||
b32 animating;
|
||||
b32 consume_keys;
|
||||
|
@ -4483,11 +4556,13 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su
|
|||
}
|
||||
}break;
|
||||
|
||||
#if FRED_INTERNAL
|
||||
case VUI_Debug:
|
||||
{
|
||||
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;
|
||||
|
||||
|
@ -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){
|
||||
Key_Event_Data key = get_single_key(&keys, i);
|
||||
|
||||
if (key.modifiers[MDFR_CONTROL_INDEX] == 0 &&
|
||||
key.modifiers[MDFR_ALT_INDEX] == 0){
|
||||
if (key.keycode == 'i'){
|
||||
view->debug_mode = DBG_Input;
|
||||
view->debug_vars.mode = DBG_Input;
|
||||
}
|
||||
if (key.keycode == 'm'){
|
||||
view->debug_mode = DBG_Threads_And_Memory;
|
||||
view->debug_vars.mode = DBG_Threads_And_Memory;
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
@ -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,
|
||||
9.f * view->line_height, show_scrollbar);
|
||||
|
||||
switch (view->debug_mode)
|
||||
switch (view->debug_vars.mode)
|
||||
{
|
||||
case DBG_Input:
|
||||
{
|
||||
|
@ -4688,37 +4763,132 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su
|
|||
|
||||
case DBG_View_Inspection:
|
||||
{
|
||||
Editing_Layout *layout = &models->layout;
|
||||
Panel *panel, *sentinel;
|
||||
sentinel = &layout->used_sentinel;
|
||||
for (dll_items(panel, sentinel)){
|
||||
View *view = panel->view;
|
||||
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;
|
||||
|
||||
Panel *panel, *sentinel;
|
||||
sentinel = &layout->used_sentinel;
|
||||
for (dll_items(panel, sentinel)){
|
||||
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;
|
||||
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);
|
||||
|
||||
string.size = 0;
|
||||
Editing_File *file = view->file_data.file;
|
||||
Editing_File *file = view_ptr->file_data.file;
|
||||
append(&string, " > buffer: ");
|
||||
if (file){
|
||||
append(&string, file->name.live_name);
|
||||
gui_do_text_field(target, string, empty_str);
|
||||
string.size = 0;
|
||||
append(&string, " > buffer-slot-id: ");
|
||||
append(&string, " >> buffer-slot-id: ");
|
||||
append_int_to_str(&string, file->id.id);
|
||||
}
|
||||
else{
|
||||
append(&string, "*NULL*");
|
||||
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;
|
||||
}
|
||||
|
||||
gui_end_scrollable(target);
|
||||
}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
|
||||
live_set_alloc_view(Live_Views *live_set, Panel *panel, Models *models){
|
||||
View_And_ID result = {};
|
||||
|
|
12
4ed_gui.cpp
12
4ed_gui.cpp
|
@ -263,9 +263,15 @@ gui_update_position(GUI_Item_Update *update, i32_Rect position){
|
|||
|
||||
internal void*
|
||||
gui_push_item(GUI_Target *target, void *item, i32 size){
|
||||
void *dest = partition_allocate(&target->push, size);
|
||||
if (dest && item){
|
||||
memcpy(dest, item, size);
|
||||
void *dest = 0;
|
||||
if (size == 0){
|
||||
dest = partition_current(&target->push);
|
||||
}
|
||||
else{
|
||||
dest = partition_allocate(&target->push, size);
|
||||
if (dest && item){
|
||||
memcpy(dest, item, size);
|
||||
}
|
||||
}
|
||||
return(dest);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue