Log grapher wrapped up, more flexible key matching in listers, i64 in markers
This commit is contained in:
parent
5f46a7611c
commit
8f8ad47f4e
|
@ -615,7 +615,7 @@ DOC_SEE(buffer_add_markers)
|
|||
*/
|
||||
STRUCT Marker{
|
||||
/* DOC(The current position of the marker measure in absolute byte positioning coordinates.) */
|
||||
i32 pos;
|
||||
i64 pos;
|
||||
/* DOC(When a marker is inside a range that gets edited, by default the marker 'leans_left' which means it goes to the beginning of the edited range. If the field lean_right is set to true, the marker will lean right with edits and will go to the end of edited range.) */
|
||||
b32 lean_right;
|
||||
};
|
||||
|
|
|
@ -20,6 +20,12 @@
|
|||
#define VERSION_TYPE
|
||||
#endif
|
||||
|
||||
// string
|
||||
#define VN__(a,b,c) #a "." #b "." #c
|
||||
#define VN_(a,b,c) VN__(a,b,c)
|
||||
#define VERSION_NUMBER VN_(MAJOR,MINOR,PATCH)
|
||||
#define VERSION_STRING "alpha " VERSION_NUMBER
|
||||
|
||||
#define VERSION VERSION_STRING VERSION_TYPE
|
||||
|
||||
#define WINDOW_NAME "4coder: " VERSION
|
||||
|
|
|
@ -8,9 +8,9 @@
|
|||
* This transition helper will be removed in a future version so it is recommended to get off sooner or laster.
|
||||
*
|
||||
* Tips on transitioning:
|
||||
*
|
||||
* Wrather than just try to inline this code everywhere, you can simplify things quite a lot by storing references
|
||||
* to buffers and views and Buffer_ID and View_ID instead of Buffer_Summary and View_Summary.
|
||||
*
|
||||
* Wrather than just try to inline this code everywhere, you can simplify things quite a lot by storing references
|
||||
* to buffers and views and Buffer_ID and View_ID instead of Buffer_Summary and View_Summary.
|
||||
* Just get the summaries when you need information in those structures.
|
||||
*
|
||||
* You will make your code simpler if you stick to String as much as possible, but whenever you want to you can switch
|
||||
|
|
|
@ -762,10 +762,12 @@ view_set_vertical_focus(Application_Links *app, View_Summary *view, i32 y_top, i
|
|||
view_set_vertical_focus(app, view==0?0:view->view_id, (f32)y_top, (f32)y_bot);
|
||||
}
|
||||
|
||||
#if 0
|
||||
static b32
|
||||
advance_cursor_in_jump_view(Application_Links *app, View_Summary *view, i32 skip_repeats, i32 skip_sub_error, i32 direction, Name_Line_Column_Location *location_out){
|
||||
return(advance_cursor_in_jump_view(app, view==0?0:view->view_id, skip_repeats, skip_sub_error, direction, location_out));
|
||||
}
|
||||
#endif
|
||||
|
||||
static Parsed_Jump
|
||||
seek_next_jump_in_view(Application_Links *app, Arena *arena, View_Summary *view, i32 skip_sub_errors, i32 direction, i32 *line_out){
|
||||
|
|
|
@ -314,16 +314,9 @@ CUSTOM_DOC("Reads the scroll wheel value from the mouse state and scrolls accord
|
|||
|
||||
////////////////////////////////
|
||||
|
||||
static void
|
||||
move_vertical(Application_Links *app, f32 line_multiplier){
|
||||
View_ID view = get_active_view(app, AccessProtected);
|
||||
|
||||
Buffer_ID buffer = view_get_buffer(app, view, AccessProtected);
|
||||
Face_ID face_id = get_face_id(app, buffer);
|
||||
Face_Metrics metrics = get_face_metrics(app, face_id);
|
||||
|
||||
f32 delta_y = line_multiplier*metrics.line_height;
|
||||
f32 new_y = get_view_y(app, view) + delta_y;
|
||||
internal void
|
||||
move_vertical_pixels(Application_Links *app, View_ID view, f32 pixels){
|
||||
f32 new_y = get_view_y(app, view) + pixels;
|
||||
f32 x = view_get_preferred_x(app, view);
|
||||
|
||||
view_set_cursor(app, view, seek_wrapped_xy(x, new_y, false), false);
|
||||
|
@ -335,7 +328,7 @@ move_vertical(Application_Links *app, f32 line_multiplier){
|
|||
GUI_Scroll_Vars scroll_vars = view_get_scroll_vars(app, view);
|
||||
if (scroll_vars.target_y < full_scroll_y){
|
||||
GUI_Scroll_Vars new_scroll_vars = scroll_vars;
|
||||
new_scroll_vars.target_y += (i32)delta_y;
|
||||
new_scroll_vars.target_y += (i32)pixels;
|
||||
new_scroll_vars.target_y = clamp_top(new_scroll_vars.target_y, (i32)full_scroll_y);
|
||||
view_set_scroll(app, view, new_scroll_vars);
|
||||
}
|
||||
|
@ -344,21 +337,34 @@ move_vertical(Application_Links *app, f32 line_multiplier){
|
|||
no_mark_snap_to_cursor_if_shift(app, view);
|
||||
}
|
||||
|
||||
static f32
|
||||
get_page_jump(Application_Links *app, View_ID view){
|
||||
Rect_f32 region = view_get_buffer_region(app, view);
|
||||
internal void
|
||||
move_vertical_pixels(Application_Links *app, f32 pixels){
|
||||
View_ID view = get_active_view(app, AccessProtected);
|
||||
move_vertical_pixels(app, view, pixels);
|
||||
}
|
||||
|
||||
internal void
|
||||
move_vertical_lines(Application_Links *app, View_ID view, f32 lines){
|
||||
Buffer_ID buffer = view_get_buffer(app, view, AccessProtected);
|
||||
Face_ID face_id = get_face_id(app, buffer);
|
||||
Face_Metrics metrics = get_face_metrics(app, face_id);
|
||||
f32 page_jump = 1.f;
|
||||
if (metrics.line_height > 0.f){
|
||||
f32 height = rect_height(region);
|
||||
f32 line_count = height/metrics.line_height;
|
||||
i32 line_count_rounded = (i32)line_count;
|
||||
page_jump = (f32)line_count_rounded - 3.f;
|
||||
page_jump = clamp_bot(1.f, page_jump);
|
||||
}
|
||||
return(page_jump);
|
||||
|
||||
f32 delta_y = lines*metrics.line_height;
|
||||
move_vertical_pixels(app, delta_y);
|
||||
}
|
||||
|
||||
internal void
|
||||
move_vertical_lines(Application_Links *app, f32 lines){
|
||||
View_ID view = get_active_view(app, AccessProtected);
|
||||
move_vertical_lines(app, view, lines);
|
||||
}
|
||||
|
||||
#define move_vertical move_vertical_lines
|
||||
|
||||
internal f32
|
||||
get_page_jump(Application_Links *app, View_ID view){
|
||||
Rect_f32 region = view_get_buffer_region(app, view);
|
||||
return(rect_height(region)*.9f);
|
||||
}
|
||||
|
||||
CUSTOM_COMMAND_SIG(move_up)
|
||||
|
@ -400,7 +406,7 @@ CUSTOM_DOC("Scrolls the view up one view height and moves the cursor up one view
|
|||
{
|
||||
View_ID view = get_active_view(app, AccessProtected);
|
||||
f32 page_jump = get_page_jump(app, view);
|
||||
move_vertical(app, -page_jump);
|
||||
move_vertical_pixels(app, -page_jump);
|
||||
}
|
||||
|
||||
CUSTOM_COMMAND_SIG(page_down)
|
||||
|
@ -408,7 +414,7 @@ CUSTOM_DOC("Scrolls the view down one view height and moves the cursor down one
|
|||
{
|
||||
View_ID view = get_active_view(app, AccessProtected);
|
||||
f32 page_jump = get_page_jump(app, view);
|
||||
move_vertical(app, page_jump);
|
||||
move_vertical_pixels(app, page_jump);
|
||||
}
|
||||
|
||||
internal void
|
||||
|
|
|
@ -1430,11 +1430,11 @@ operator!=(Vec4_f32 a, Vec4_f32 b){
|
|||
|
||||
static b32
|
||||
operator==(Rect_i32 a, Rect_i32 b){
|
||||
return(a.p0 == b.p0 && a.p0 == b.p0);
|
||||
return(a.p0 == b.p0 && a.p1 == b.p1);
|
||||
}
|
||||
static b32
|
||||
operator==(Rect_f32 a, Rect_f32 b){
|
||||
return(a.p0 == b.p0 && a.p0 == b.p0);
|
||||
return(a.p0 == b.p0 && a.p1 == b.p1);
|
||||
}
|
||||
|
||||
static b32
|
||||
|
|
|
@ -464,7 +464,7 @@ union SNode{
|
|||
#define dll_remove_multiple(n1,n2) (dll_remove_multiple_((n1),(n2)))
|
||||
|
||||
#define sll_stack_push_(h,n) n->next=h,h=n
|
||||
#define sll_stack_pop_(h) h->next=0,h=h->next
|
||||
#define sll_stack_pop_(h) h=h=h->next
|
||||
#define sll_queue_push_multiple_(f,l,ff,ll) if(ll){if(f){l->next=ff;}else{f=ff;}l=ll;l->next=0;}
|
||||
#define sll_queue_push_(f,l,n) sll_queue_push_multiple_(f,l,n,n)
|
||||
#define sll_queue_pop_(f,l) if (f==l) { f=l=0; } else { f->next=0;f=f->next; }
|
||||
|
|
|
@ -131,7 +131,7 @@ CUSTOM_DOC("Looks for a build.bat, build.sh, or makefile in the current and pare
|
|||
View_ID view = get_active_view(app, AccessAll);
|
||||
Buffer_ID buffer = view_get_buffer(app, view, AccessAll);
|
||||
standard_search_and_build(app, view, buffer);
|
||||
memset(&prev_location, 0, sizeof(prev_location));
|
||||
block_zero_struct(&prev_location);
|
||||
lock_jump_buffer(app, string_u8_litexpr("*compilation*"));
|
||||
}
|
||||
|
||||
|
@ -171,7 +171,7 @@ CUSTOM_DOC("Looks for a build.bat, build.sh, or makefile in the current and pare
|
|||
standard_search_and_build(app, build_view, buffer);
|
||||
set_fancy_compilation_buffer_font(app);
|
||||
|
||||
memset(&prev_location, 0, sizeof(prev_location));
|
||||
block_zero_struct(&prev_location);
|
||||
lock_jump_buffer(app, string_u8_litexpr("*compilation*"));
|
||||
}
|
||||
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
enum Default_Maps{
|
||||
default_code_map,
|
||||
default_lister_ui_map,
|
||||
default_log_graph_map,
|
||||
default_maps_count,
|
||||
};
|
||||
|
||||
|
@ -32,7 +33,7 @@ typedef ID_Line_Column_Jump_Location ID_Based_Jump_Location;
|
|||
|
||||
struct ID_Pos_Jump_Location{
|
||||
Buffer_ID buffer_id;
|
||||
i32 pos;
|
||||
i64 pos;
|
||||
};
|
||||
|
||||
struct Name_Line_Column_Location{
|
||||
|
|
|
@ -5,12 +5,12 @@ the default 4coder behavior.
|
|||
|
||||
// TOP
|
||||
|
||||
static Named_Mapping *named_maps = 0;
|
||||
static i32 named_map_count = 0;
|
||||
global Named_Mapping *named_maps = 0;
|
||||
global i32 named_map_count = 0;
|
||||
|
||||
static b32 allow_immediate_close_without_checking_for_changes = false;
|
||||
global b32 allow_immediate_close_without_checking_for_changes = false;
|
||||
|
||||
static char *default_extensions[] = {
|
||||
global char *default_extensions[] = {
|
||||
"cpp",
|
||||
"hpp",
|
||||
"c",
|
||||
|
@ -26,56 +26,56 @@ static char *default_extensions[] = {
|
|||
#if !defined(AUTO_CENTER_AFTER_JUMPS)
|
||||
#define AUTO_CENTER_AFTER_JUMPS true
|
||||
#endif
|
||||
static b32 auto_center_after_jumps = AUTO_CENTER_AFTER_JUMPS;
|
||||
static u8 locked_buffer_space[256];
|
||||
static String_Const_u8 locked_buffer = {};
|
||||
global b32 auto_center_after_jumps = AUTO_CENTER_AFTER_JUMPS;
|
||||
global u8 locked_buffer_space[256];
|
||||
global String_Const_u8 locked_buffer = {};
|
||||
|
||||
|
||||
static View_ID build_footer_panel_view_id = 0;
|
||||
global View_ID build_footer_panel_view_id = 0;
|
||||
|
||||
|
||||
static Managed_Variable_ID view_rewrite_loc = 0;
|
||||
static Managed_Variable_ID view_next_rewrite_loc = 0;
|
||||
static Managed_Variable_ID view_paste_index_loc = 0;
|
||||
static Managed_Variable_ID view_is_passive_loc = 0;
|
||||
static Managed_Variable_ID view_snap_mark_to_cursor = 0;
|
||||
static Managed_Variable_ID view_ui_data = 0;
|
||||
static Managed_Variable_ID view_highlight_range = 0;
|
||||
static Managed_Variable_ID view_highlight_buffer = 0;
|
||||
static Managed_Variable_ID view_render_hook = 0;
|
||||
global Managed_Variable_ID view_rewrite_loc = 0;
|
||||
global Managed_Variable_ID view_next_rewrite_loc = 0;
|
||||
global Managed_Variable_ID view_paste_index_loc = 0;
|
||||
global Managed_Variable_ID view_is_passive_loc = 0;
|
||||
global Managed_Variable_ID view_snap_mark_to_cursor = 0;
|
||||
global Managed_Variable_ID view_ui_data = 0;
|
||||
global Managed_Variable_ID view_highlight_range = 0;
|
||||
global Managed_Variable_ID view_highlight_buffer = 0;
|
||||
global Managed_Variable_ID view_render_hook = 0;
|
||||
|
||||
static Managed_Variable_ID sticky_jump_marker_handle = 0;
|
||||
global Managed_Variable_ID sticky_jump_marker_handle = 0;
|
||||
|
||||
static u8 out_buffer_space[1024];
|
||||
static u8 command_space[1024];
|
||||
static char hot_directory_space[1024];
|
||||
global u8 out_buffer_space[1024];
|
||||
global u8 command_space[1024];
|
||||
global char hot_directory_space[1024];
|
||||
|
||||
|
||||
static b32 highlight_line_at_cursor = true;
|
||||
static b32 do_matching_enclosure_highlight = true;
|
||||
static b32 do_matching_paren_highlight = true;
|
||||
static b32 do_colored_comment_keywords = true;
|
||||
static b32 suppressing_mouse = false;
|
||||
global b32 highlight_line_at_cursor = true;
|
||||
global b32 do_matching_enclosure_highlight = true;
|
||||
global b32 do_matching_paren_highlight = true;
|
||||
global b32 do_colored_comment_keywords = true;
|
||||
global b32 suppressing_mouse = false;
|
||||
|
||||
static b32 cursor_is_hidden = false;
|
||||
global b32 cursor_is_hidden = false;
|
||||
|
||||
static b32 show_fps_hud = false;
|
||||
global b32 show_fps_hud = false;
|
||||
|
||||
static Heap global_heap;
|
||||
global Heap global_heap;
|
||||
|
||||
enum{
|
||||
FCoderMode_Original = 0,
|
||||
FCoderMode_NotepadLike = 1,
|
||||
};
|
||||
static i32 fcoder_mode = FCoderMode_Original;
|
||||
global i32 fcoder_mode = FCoderMode_Original;
|
||||
|
||||
static ID_Line_Column_Jump_Location prev_location = {};
|
||||
global ID_Pos_Jump_Location prev_location = {};
|
||||
|
||||
|
||||
static Arena global_config_arena = {};
|
||||
static Config_Data global_config = {};
|
||||
global Arena global_config_arena = {};
|
||||
global Config_Data global_config = {};
|
||||
|
||||
static char previous_isearch_query[256] = {};
|
||||
global char previous_isearch_query[256] = {};
|
||||
|
||||
// BOTTOM
|
||||
|
||||
|
|
|
@ -742,27 +742,6 @@ default_buffer_render_caller(Application_Links *app, Frame_Info frame_info, View
|
|||
//managed_scope_clear_self_all_dependent_scopes(app, render_scope);
|
||||
}
|
||||
|
||||
static int_color
|
||||
get_margin_color(i32 level){
|
||||
int_color margin = 0;
|
||||
switch (level){
|
||||
default:
|
||||
case UIActivation_None:
|
||||
{
|
||||
margin = Stag_List_Item;
|
||||
}break;
|
||||
case UIActivation_Hover:
|
||||
{
|
||||
margin = Stag_List_Item_Hover;
|
||||
}break;
|
||||
case UIActivation_Active:
|
||||
{
|
||||
margin = Stag_List_Item_Active;
|
||||
}break;
|
||||
}
|
||||
return(margin);
|
||||
}
|
||||
|
||||
static void
|
||||
default_ui_render_caller(Application_Links *app, View_ID view_id, Rect_f32 rect_f32, Face_ID face_id){
|
||||
UI_Data *ui_data = 0;
|
||||
|
|
|
@ -8,7 +8,6 @@
|
|||
#define FCODER_DEFAULT_INCLUDE_CPP
|
||||
|
||||
// NOTE(allen): Defines before 4coder_default_include.cpp:
|
||||
// USE_OLD_STYLE_JUMPS -> use "old style" direct jumps instead of sticky jumps
|
||||
// REMOVE_TRANSITION_HELPER_31 -> does not include the transition helpers for the API changes in 4.0.31
|
||||
// REMOVE_OLD_STRING -> does not include the old 4coder_string.h library.
|
||||
// NOTE: You can only remove "old string" if you first remove the transition helper.
|
||||
|
@ -66,7 +65,6 @@
|
|||
|
||||
#include "4coder_default_framework_variables.cpp"
|
||||
#include "4coder_helper.cpp"
|
||||
#include "4coder_log_parser.cpp"
|
||||
#include "4coder_seek.cpp"
|
||||
#include "4coder_fancy.cpp"
|
||||
#include "4coder_ui_helper.cpp"
|
||||
|
@ -79,9 +77,9 @@
|
|||
#include "4coder_auto_indent.cpp"
|
||||
#include "4coder_search.cpp"
|
||||
#include "4coder_jumping.cpp"
|
||||
#include "4coder_jump_direct.cpp"
|
||||
#include "4coder_jump_sticky.cpp"
|
||||
#include "4coder_jump_lister.cpp"
|
||||
#include "4coder_log_parser.cpp"
|
||||
#include "4coder_clipboard.cpp"
|
||||
#include "4coder_system_command.cpp"
|
||||
#include "4coder_build_commands.cpp"
|
||||
|
|
|
@ -198,8 +198,9 @@ fancy_string_list_single(Fancy_String *fancy_string){
|
|||
return(list);
|
||||
}
|
||||
|
||||
static Vec2
|
||||
draw_fancy_string(Application_Links *app, Face_ID font_id, Fancy_String *string, Vec2 P, int_color fore, int_color back, u32 flags, Vec2 dP){
|
||||
static Vec2_f32
|
||||
draw_fancy_string(Application_Links *app, Face_ID font_id, Fancy_String *string, Vec2 P,
|
||||
int_color fore, int_color back, u32 flags, Vec2 dP){
|
||||
for (;string != 0;
|
||||
string = string->next){
|
||||
Face_ID use_font_id = (string->font_id) ? string->font_id : font_id;
|
||||
|
@ -219,10 +220,40 @@ draw_fancy_string(Application_Links *app, Face_ID font_id, Fancy_String *string,
|
|||
return(P);
|
||||
}
|
||||
|
||||
static Vec2
|
||||
draw_fancy_string(Application_Links *app, Face_ID font_id, Fancy_String *string, Vec2 P, int_color fore, int_color back){
|
||||
static Vec2_f32
|
||||
draw_fancy_string(Application_Links *app, Face_ID font_id, Fancy_String *string, Vec2 P,
|
||||
int_color fore, int_color back){
|
||||
return(draw_fancy_string(app, font_id, string, P, fore, back, 0, V2(1.f, 0.f)));
|
||||
}
|
||||
|
||||
static f32
|
||||
get_fancy_string_advance(Application_Links *app, Face_ID font_id, Fancy_String *string){
|
||||
f32 advance = 0.f;
|
||||
for (;string != 0;
|
||||
string = string->next){
|
||||
Face_ID use_font_id = (string->font_id) ? string->font_id : font_id;
|
||||
f32 adv = get_string_advance(app, use_font_id, string->value);
|
||||
Face_Metrics metrics = get_face_metrics(app, font_id);
|
||||
advance += (string->pre_margin + string->post_margin)*metrics.typical_character_width + adv;
|
||||
}
|
||||
return(advance);
|
||||
}
|
||||
|
||||
static void
|
||||
draw_rectangle(Application_Links *app, Rect_f32 rect, Fancy_Color fancy_color){
|
||||
int_color color = int_color_from(app, fancy_color);
|
||||
draw_rectangle(app, rect, color);
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
|
||||
global Fancy_Color white = fancy_rgba(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
global Fancy_Color light_gray = fancy_rgba(0.7f, 0.7f, 0.7f, 1.0f);
|
||||
global Fancy_Color gray = fancy_rgba(0.5f, 0.5f, 0.5f, 1.0f);
|
||||
global Fancy_Color dark_gray = fancy_rgba(0.3f, 0.3f, 0.3f, 1.0f);
|
||||
global Fancy_Color black = fancy_rgba(0.0f, 0.0f, 0.0f, 1.0f);
|
||||
global Fancy_Color pink = fancy_rgba(1.0f, 0.0f, 1.0f, 1.0f);
|
||||
global Fancy_Color green = fancy_rgba(0.0f, 1.0f, 0.0f, 1.0f);
|
||||
|
||||
// BOTTOM
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -15,9 +15,9 @@ bind(context, key_pause, MDFR_NONE, toggle_filebar);
|
|||
bind(context, key_caps, MDFR_NONE, toggle_filebar);
|
||||
bind(context, '.', MDFR_ALT, change_to_build_panel);
|
||||
bind(context, ',', MDFR_ALT, close_build_panel);
|
||||
bind(context, 'n', MDFR_ALT, goto_next_jump_sticky);
|
||||
bind(context, 'N', MDFR_ALT, goto_prev_jump_sticky);
|
||||
bind(context, 'M', MDFR_ALT, goto_first_jump_sticky);
|
||||
bind(context, 'n', MDFR_ALT, goto_next_jump);
|
||||
bind(context, 'N', MDFR_ALT, goto_prev_jump);
|
||||
bind(context, 'M', MDFR_ALT, goto_first_jump);
|
||||
bind(context, 'm', MDFR_ALT, build_in_build_panel);
|
||||
bind(context, 'b', MDFR_ALT, toggle_filebar);
|
||||
bind(context, 'z', MDFR_ALT, execute_any_cli);
|
||||
|
@ -120,8 +120,8 @@ bind(context, 'y', MDFR_CTRL, redo);
|
|||
bind(context, 'z', MDFR_CTRL, undo);
|
||||
bind(context, '1', MDFR_CTRL, view_buffer_other_panel);
|
||||
bind(context, '2', MDFR_CTRL, swap_buffers_between_panels);
|
||||
bind(context, '\n', MDFR_NONE, newline_or_goto_position_sticky);
|
||||
bind(context, '\n', MDFR_SHIFT, newline_or_goto_position_same_panel_sticky);
|
||||
bind(context, '\n', MDFR_NONE, newline_or_goto_position);
|
||||
bind(context, '\n', MDFR_SHIFT, newline_or_goto_position_same_panel);
|
||||
bind(context, '>', MDFR_CTRL, view_jump_list_with_lister);
|
||||
bind(context, ' ', MDFR_SHIFT, write_character);
|
||||
end_map(context);
|
||||
|
@ -200,9 +200,9 @@ bind(context, 'h', MDFR_CMND, project_go_to_root_directory);
|
|||
bind(context, 'S', MDFR_CMND, save_all_dirty_buffers);
|
||||
bind(context, '.', MDFR_CTRL, change_to_build_panel);
|
||||
bind(context, ',', MDFR_CTRL, close_build_panel);
|
||||
bind(context, 'n', MDFR_CTRL, goto_next_jump_sticky);
|
||||
bind(context, 'N', MDFR_CTRL, goto_prev_jump_sticky);
|
||||
bind(context, 'M', MDFR_CTRL, goto_first_jump_sticky);
|
||||
bind(context, 'n', MDFR_CTRL, goto_next_jump);
|
||||
bind(context, 'N', MDFR_CTRL, goto_prev_jump);
|
||||
bind(context, 'M', MDFR_CTRL, goto_first_jump);
|
||||
bind(context, 'm', MDFR_CTRL, build_in_build_panel);
|
||||
bind(context, 'b', MDFR_CTRL, toggle_filebar);
|
||||
bind(context, 'z', MDFR_CTRL, execute_any_cli);
|
||||
|
@ -304,8 +304,8 @@ bind(context, 'y', MDFR_CMND, redo);
|
|||
bind(context, 'z', MDFR_CMND, undo);
|
||||
bind(context, '1', MDFR_CMND, view_buffer_other_panel);
|
||||
bind(context, '2', MDFR_CMND, swap_buffers_between_panels);
|
||||
bind(context, '\n', MDFR_NONE, newline_or_goto_position_sticky);
|
||||
bind(context, '\n', MDFR_SHIFT, newline_or_goto_position_same_panel_sticky);
|
||||
bind(context, '\n', MDFR_NONE, newline_or_goto_position);
|
||||
bind(context, '\n', MDFR_SHIFT, newline_or_goto_position_same_panel);
|
||||
bind(context, '>', MDFR_CMND, view_jump_list_with_lister);
|
||||
bind(context, ' ', MDFR_SHIFT, write_character);
|
||||
end_map(context);
|
||||
|
@ -417,9 +417,9 @@ static Meta_Key_Bind fcoder_binds_for_default_mapid_global[43] = {
|
|||
{0, 55313, 0, "toggle_filebar", 14, LINK_PROCS(toggle_filebar)},
|
||||
{0, 46, 2, "change_to_build_panel", 21, LINK_PROCS(change_to_build_panel)},
|
||||
{0, 44, 2, "close_build_panel", 17, LINK_PROCS(close_build_panel)},
|
||||
{0, 110, 2, "goto_next_jump_sticky", 21, LINK_PROCS(goto_next_jump_sticky)},
|
||||
{0, 78, 2, "goto_prev_jump_sticky", 21, LINK_PROCS(goto_prev_jump_sticky)},
|
||||
{0, 77, 2, "goto_first_jump_sticky", 22, LINK_PROCS(goto_first_jump_sticky)},
|
||||
{0, 110, 2, "goto_next_jump", 14, LINK_PROCS(goto_next_jump)},
|
||||
{0, 78, 2, "goto_prev_jump", 14, LINK_PROCS(goto_prev_jump)},
|
||||
{0, 77, 2, "goto_first_jump", 15, LINK_PROCS(goto_first_jump)},
|
||||
{0, 109, 2, "build_in_build_panel", 20, LINK_PROCS(build_in_build_panel)},
|
||||
{0, 98, 2, "toggle_filebar", 14, LINK_PROCS(toggle_filebar)},
|
||||
{0, 122, 2, "execute_any_cli", 15, LINK_PROCS(execute_any_cli)},
|
||||
|
@ -522,8 +522,8 @@ static Meta_Key_Bind fcoder_binds_for_default_mapid_file[78] = {
|
|||
{0, 122, 1, "undo", 4, LINK_PROCS(undo)},
|
||||
{0, 49, 1, "view_buffer_other_panel", 23, LINK_PROCS(view_buffer_other_panel)},
|
||||
{0, 50, 1, "swap_buffers_between_panels", 27, LINK_PROCS(swap_buffers_between_panels)},
|
||||
{0, 10, 0, "newline_or_goto_position_sticky", 31, LINK_PROCS(newline_or_goto_position_sticky)},
|
||||
{0, 10, 8, "newline_or_goto_position_same_panel_sticky", 42, LINK_PROCS(newline_or_goto_position_same_panel_sticky)},
|
||||
{0, 10, 0, "newline_or_goto_position", 24, LINK_PROCS(newline_or_goto_position)},
|
||||
{0, 10, 8, "newline_or_goto_position_same_panel", 35, LINK_PROCS(newline_or_goto_position_same_panel)},
|
||||
{0, 62, 1, "view_jump_list_with_lister", 26, LINK_PROCS(view_jump_list_with_lister)},
|
||||
{0, 32, 8, "write_character", 15, LINK_PROCS(write_character)},
|
||||
};
|
||||
|
@ -605,9 +605,9 @@ static Meta_Key_Bind fcoder_binds_for_mac_default_mapid_global[40] = {
|
|||
{0, 83, 4, "save_all_dirty_buffers", 22, LINK_PROCS(save_all_dirty_buffers)},
|
||||
{0, 46, 1, "change_to_build_panel", 21, LINK_PROCS(change_to_build_panel)},
|
||||
{0, 44, 1, "close_build_panel", 17, LINK_PROCS(close_build_panel)},
|
||||
{0, 110, 1, "goto_next_jump_sticky", 21, LINK_PROCS(goto_next_jump_sticky)},
|
||||
{0, 78, 1, "goto_prev_jump_sticky", 21, LINK_PROCS(goto_prev_jump_sticky)},
|
||||
{0, 77, 1, "goto_first_jump_sticky", 22, LINK_PROCS(goto_first_jump_sticky)},
|
||||
{0, 110, 1, "goto_next_jump", 14, LINK_PROCS(goto_next_jump)},
|
||||
{0, 78, 1, "goto_prev_jump", 14, LINK_PROCS(goto_prev_jump)},
|
||||
{0, 77, 1, "goto_first_jump", 15, LINK_PROCS(goto_first_jump)},
|
||||
{0, 109, 1, "build_in_build_panel", 20, LINK_PROCS(build_in_build_panel)},
|
||||
{0, 98, 1, "toggle_filebar", 14, LINK_PROCS(toggle_filebar)},
|
||||
{0, 122, 1, "execute_any_cli", 15, LINK_PROCS(execute_any_cli)},
|
||||
|
@ -709,8 +709,8 @@ static Meta_Key_Bind fcoder_binds_for_mac_default_mapid_file[77] = {
|
|||
{0, 122, 4, "undo", 4, LINK_PROCS(undo)},
|
||||
{0, 49, 4, "view_buffer_other_panel", 23, LINK_PROCS(view_buffer_other_panel)},
|
||||
{0, 50, 4, "swap_buffers_between_panels", 27, LINK_PROCS(swap_buffers_between_panels)},
|
||||
{0, 10, 0, "newline_or_goto_position_sticky", 31, LINK_PROCS(newline_or_goto_position_sticky)},
|
||||
{0, 10, 8, "newline_or_goto_position_same_panel_sticky", 42, LINK_PROCS(newline_or_goto_position_same_panel_sticky)},
|
||||
{0, 10, 0, "newline_or_goto_position", 24, LINK_PROCS(newline_or_goto_position)},
|
||||
{0, 10, 8, "newline_or_goto_position_same_panel", 35, LINK_PROCS(newline_or_goto_position_same_panel)},
|
||||
{0, 62, 4, "view_jump_list_with_lister", 26, LINK_PROCS(view_jump_list_with_lister)},
|
||||
{0, 32, 8, "write_character", 15, LINK_PROCS(write_character)},
|
||||
};
|
||||
|
|
|
@ -2482,6 +2482,29 @@ split_rect(f32_Rect rect, View_Split_Kind kind, Coordinate coord, Side from_side
|
|||
|
||||
////////////////////////////////
|
||||
|
||||
static int_color
|
||||
get_margin_color(i32 level){
|
||||
int_color margin = 0;
|
||||
switch (level){
|
||||
default:
|
||||
case UIActivation_None:
|
||||
{
|
||||
margin = Stag_List_Item;
|
||||
}break;
|
||||
case UIActivation_Hover:
|
||||
{
|
||||
margin = Stag_List_Item_Hover;
|
||||
}break;
|
||||
case UIActivation_Active:
|
||||
{
|
||||
margin = Stag_List_Item_Active;
|
||||
}break;
|
||||
}
|
||||
return(margin);
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
|
||||
internal f32
|
||||
get_dpi_scaling_value(Application_Links *app){
|
||||
// TODO(casey): Allen, this should return the multiplier for the display relative to whatever 4coder
|
||||
|
@ -2492,6 +2515,13 @@ get_dpi_scaling_value(Application_Links *app){
|
|||
|
||||
////////////////////////////////
|
||||
|
||||
UI_QUIT_FUNCTION(ui_quit_clear_render_hook){
|
||||
Managed_Scope scope = view_get_managed_scope(app, view);
|
||||
managed_variable_set(app, scope, view_render_hook, 0);
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
|
||||
// TODO(allen): REWRITE THIS EXACTLY HOW YOU WANT IT --- start ---
|
||||
|
||||
internal Child_Process_Set_Target_Flags
|
||||
|
|
|
@ -1,138 +0,0 @@
|
|||
/*
|
||||
4coder_direct_jump.cpp - Commands and helpers for parsing jump locations from
|
||||
compiler errors and jumping to them in the corresponding buffer.
|
||||
*/
|
||||
|
||||
// TOP
|
||||
|
||||
CUSTOM_COMMAND_SIG(goto_jump_at_cursor_direct)
|
||||
CUSTOM_DOC("If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.")
|
||||
{
|
||||
Arena *scratch = context_get_arena(app);
|
||||
Temp_Memory temp = begin_temp(scratch);
|
||||
View_ID view = get_active_view(app, AccessProtected);
|
||||
Buffer_ID buffer = view_get_buffer(app, view, AccessProtected);
|
||||
i64 pos = view_get_cursor_pos(app, view);
|
||||
Full_Cursor cursor = view_compute_cursor(app, view, seek_pos(pos));
|
||||
|
||||
Parsed_Jump jump = parse_jump_from_buffer_line(app, scratch, buffer, cursor.line, false);
|
||||
if (jump.success){
|
||||
change_active_panel(app);
|
||||
View_ID target_view = get_active_view(app, AccessAll);
|
||||
if (get_jump_buffer(app, &buffer, &jump.location)){
|
||||
switch_to_existing_view(app, target_view, buffer);
|
||||
jump_to_location(app, target_view, buffer, jump.location);
|
||||
}
|
||||
}
|
||||
|
||||
end_temp(temp);
|
||||
}
|
||||
|
||||
CUSTOM_COMMAND_SIG(goto_jump_at_cursor_same_panel_direct)
|
||||
CUSTOM_DOC("If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list..")
|
||||
{
|
||||
Arena *scratch = context_get_arena(app);
|
||||
Temp_Memory temp = begin_temp(scratch);
|
||||
View_ID view = get_active_view(app, AccessProtected);
|
||||
Buffer_ID buffer = view_get_buffer(app, view, AccessProtected);
|
||||
i64 pos = view_get_cursor_pos(app, view);
|
||||
Full_Cursor cursor = view_compute_cursor(app, view, seek_pos(pos));
|
||||
|
||||
Parsed_Jump jump = parse_jump_from_buffer_line(app, scratch, buffer, cursor.line, false);
|
||||
if (jump.success){
|
||||
View_ID target_view = view;
|
||||
if (get_jump_buffer(app, &buffer, &jump.location)){
|
||||
jump_to_location(app, target_view, buffer, jump.location);
|
||||
}
|
||||
}
|
||||
|
||||
end_temp(temp);
|
||||
}
|
||||
|
||||
CUSTOM_COMMAND_SIG(goto_next_jump_direct)
|
||||
CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.")
|
||||
{
|
||||
b32 skip_repeats = true;
|
||||
b32 skip_sub_errors = true;
|
||||
i32 dir = 1;
|
||||
seek_jump(app, skip_repeats, skip_sub_errors, dir);
|
||||
}
|
||||
|
||||
CUSTOM_COMMAND_SIG(goto_prev_jump_direct)
|
||||
CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations.")
|
||||
{
|
||||
b32 skip_repeats = true;
|
||||
b32 skip_sub_errors = true;
|
||||
i32 dir = -1;
|
||||
seek_jump(app, skip_repeats, skip_sub_errors, dir);
|
||||
}
|
||||
|
||||
CUSTOM_COMMAND_SIG(goto_next_jump_no_skips_direct)
|
||||
CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.")
|
||||
{
|
||||
b32 skip_repeats = false;
|
||||
b32 skip_sub_errors = true;
|
||||
i32 dir = 1;
|
||||
seek_jump(app, skip_repeats, skip_sub_errors, dir);
|
||||
}
|
||||
|
||||
CUSTOM_COMMAND_SIG(goto_prev_jump_no_skips_direct)
|
||||
CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.")
|
||||
{
|
||||
b32 skip_repeats = false;
|
||||
b32 skip_sub_errors = true;
|
||||
i32 dir = -1;
|
||||
seek_jump(app, skip_repeats, skip_sub_errors, dir);
|
||||
}
|
||||
|
||||
CUSTOM_COMMAND_SIG(goto_first_jump_direct)
|
||||
CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.")
|
||||
{
|
||||
View_ID view = get_view_for_locked_jump_buffer(app);
|
||||
if (view != 0){
|
||||
view_set_cursor(app, view, seek_pos(0), true);
|
||||
memset(&prev_location, 0, sizeof(prev_location));
|
||||
seek_jump(app, false, true, 1);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Insert Newline or Tigger Jump on Read Only Buffer
|
||||
//
|
||||
|
||||
CUSTOM_COMMAND_SIG(newline_or_goto_position_direct)
|
||||
CUSTOM_DOC("If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.")
|
||||
{
|
||||
View_ID view = get_active_view(app, AccessProtected);
|
||||
Buffer_ID buffer = view_get_buffer(app, view, AccessOpen);
|
||||
if (buffer != 0){
|
||||
write_character(app);
|
||||
}
|
||||
else{
|
||||
buffer = view_get_buffer(app, view, AccessProtected);
|
||||
if (buffer != 0){
|
||||
goto_jump_at_cursor_direct(app);
|
||||
lock_jump_buffer(app, buffer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CUSTOM_COMMAND_SIG(newline_or_goto_position_same_panel_direct)
|
||||
CUSTOM_DOC("If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.")
|
||||
{
|
||||
View_ID view = get_active_view(app, AccessProtected);
|
||||
Buffer_ID buffer = view_get_buffer(app, view, AccessOpen);
|
||||
if (buffer != 0){
|
||||
write_character(app);
|
||||
}
|
||||
else{
|
||||
buffer = view_get_buffer(app, view, AccessProtected);
|
||||
if (buffer != 0){
|
||||
goto_jump_at_cursor_same_panel_direct(app);
|
||||
lock_jump_buffer(app, buffer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// BOTTOM
|
||||
|
|
@ -5,12 +5,12 @@ compiler errors, sticking markers on jump locations, and jumping to them.
|
|||
|
||||
// TOP
|
||||
|
||||
static Marker_List_Node *marker_list_first = 0;
|
||||
static Marker_List_Node *marker_list_last = 0;
|
||||
global Marker_List_Node *marker_list_first = 0;
|
||||
global Marker_List_Node *marker_list_last = 0;
|
||||
|
||||
////////////////////////////////
|
||||
|
||||
static i32
|
||||
internal i32
|
||||
binary_search(i64 *array, i32 stride, i32 count, i64 x){
|
||||
u8 *raw = (u8*)array;
|
||||
i32 i = 0;
|
||||
|
@ -38,7 +38,7 @@ binary_search(i64 *array, i32 stride, i32 count, i64 x){
|
|||
return(i);
|
||||
}
|
||||
|
||||
static Sticky_Jump_Array
|
||||
internal Sticky_Jump_Array
|
||||
parse_buffer_to_jump_array(Application_Links *app, Arena *arena, Buffer_ID buffer){
|
||||
Sticky_Jump_Node *jump_first = 0;;
|
||||
Sticky_Jump_Node *jump_last = 0;
|
||||
|
@ -101,7 +101,7 @@ parse_buffer_to_jump_array(Application_Links *app, Arena *arena, Buffer_ID buffe
|
|||
return(result);
|
||||
}
|
||||
|
||||
static void
|
||||
internal void
|
||||
init_marker_list(Application_Links *app, Heap *heap, Buffer_ID buffer, Marker_List *list){
|
||||
Arena *scratch = context_get_arena(app);
|
||||
Temp_Memory temp = begin_temp(scratch);
|
||||
|
@ -185,17 +185,17 @@ init_marker_list(Application_Links *app, Heap *heap, Buffer_ID buffer, Marker_Li
|
|||
end_temp(temp);
|
||||
}
|
||||
|
||||
static void
|
||||
internal void
|
||||
delete_marker_list(Marker_List_Node *node){
|
||||
zdll_remove(marker_list_first, marker_list_last, node);
|
||||
}
|
||||
|
||||
static void
|
||||
internal void
|
||||
delete_marker_list(Marker_List *list){
|
||||
delete_marker_list(CastFromMember(Marker_List_Node, list, list));
|
||||
}
|
||||
|
||||
static Marker_List*
|
||||
internal Marker_List*
|
||||
make_new_marker_list_for_buffer(Heap *heap, i32 buffer_id){
|
||||
Marker_List_Node *new_node = heap_array(heap, Marker_List_Node, 1);
|
||||
zdll_push_back(marker_list_first, marker_list_last, new_node);
|
||||
|
@ -205,7 +205,7 @@ make_new_marker_list_for_buffer(Heap *heap, i32 buffer_id){
|
|||
return(result);
|
||||
}
|
||||
|
||||
static Marker_List*
|
||||
internal Marker_List*
|
||||
get_marker_list_for_buffer(Buffer_ID buffer_id){
|
||||
for (Marker_List_Node *node = marker_list_first;
|
||||
node != 0;
|
||||
|
@ -217,7 +217,7 @@ get_marker_list_for_buffer(Buffer_ID buffer_id){
|
|||
return(0);
|
||||
}
|
||||
|
||||
static Marker_List*
|
||||
internal Marker_List*
|
||||
get_or_make_list_for_buffer(Application_Links *app, Heap *heap, Buffer_ID buffer_id){
|
||||
Marker_List *result = get_marker_list_for_buffer(buffer_id);
|
||||
if (result != 0){
|
||||
|
@ -239,7 +239,7 @@ get_or_make_list_for_buffer(Application_Links *app, Heap *heap, Buffer_ID buffer
|
|||
return(result);
|
||||
}
|
||||
|
||||
static b32
|
||||
internal b32
|
||||
get_stored_jump_from_list(Application_Links *app, Marker_List *list, i32 index,
|
||||
Sticky_Jump_Stored *stored_out){
|
||||
Sticky_Jump_Stored stored = {};
|
||||
|
@ -252,7 +252,7 @@ get_stored_jump_from_list(Application_Links *app, Marker_List *list, i32 index,
|
|||
return(false);
|
||||
}
|
||||
|
||||
static Sticky_Jump_Stored*
|
||||
internal Sticky_Jump_Stored*
|
||||
get_all_stored_jumps_from_list(Application_Links *app, Arena *arena, Marker_List *list){
|
||||
Sticky_Jump_Stored *stored = 0;
|
||||
if (list != 0){
|
||||
|
@ -268,7 +268,7 @@ get_all_stored_jumps_from_list(Application_Links *app, Arena *arena, Marker_List
|
|||
return(stored);
|
||||
}
|
||||
|
||||
static b32
|
||||
internal b32
|
||||
get_jump_from_list(Application_Links *app, Marker_List *list, i32 index, ID_Pos_Jump_Location *location){
|
||||
b32 result = false;
|
||||
Sticky_Jump_Stored stored = {};
|
||||
|
@ -292,7 +292,7 @@ get_jump_from_list(Application_Links *app, Marker_List *list, i32 index, ID_Pos_
|
|||
return(result);
|
||||
}
|
||||
|
||||
static i64
|
||||
internal i64
|
||||
get_line_from_list(Application_Links *app, Marker_List *list, i32 index){
|
||||
i64 result = 0;
|
||||
if (list != 0){
|
||||
|
@ -304,7 +304,7 @@ get_line_from_list(Application_Links *app, Marker_List *list, i32 index){
|
|||
return(result);
|
||||
}
|
||||
|
||||
static b32
|
||||
internal b32
|
||||
get_is_sub_error_from_list(Application_Links *app, Marker_List *list, i32 index){
|
||||
b32 result = false;
|
||||
if (list != 0){
|
||||
|
@ -316,7 +316,7 @@ get_is_sub_error_from_list(Application_Links *app, Marker_List *list, i32 index)
|
|||
return(result);
|
||||
}
|
||||
|
||||
static i32
|
||||
internal i32
|
||||
get_index_nearest_from_list(Application_Links *app, Marker_List *list, i64 line){
|
||||
i32 result = -1;
|
||||
if (list != 0){
|
||||
|
@ -331,7 +331,7 @@ get_index_nearest_from_list(Application_Links *app, Marker_List *list, i64 line)
|
|||
return(result);
|
||||
}
|
||||
|
||||
static i32
|
||||
internal i32
|
||||
get_index_exact_from_list(Application_Links *app, Marker_List *list, i64 line){
|
||||
i32 result = -1;
|
||||
if (list != 0){
|
||||
|
@ -349,7 +349,7 @@ get_index_exact_from_list(Application_Links *app, Marker_List *list, i64 line){
|
|||
return(result);
|
||||
}
|
||||
|
||||
CUSTOM_COMMAND_SIG(goto_jump_at_cursor_sticky)
|
||||
CUSTOM_COMMAND_SIG(goto_jump_at_cursor)
|
||||
CUSTOM_DOC("If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.")
|
||||
{
|
||||
Heap *heap = &global_heap;
|
||||
|
@ -376,7 +376,7 @@ CUSTOM_DOC("If the cursor is found to be on a jump location, parses the jump loc
|
|||
}
|
||||
}
|
||||
|
||||
CUSTOM_COMMAND_SIG(goto_jump_at_cursor_same_panel_sticky)
|
||||
CUSTOM_COMMAND_SIG(goto_jump_at_cursor_same_panel)
|
||||
CUSTOM_DOC("If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list.")
|
||||
{
|
||||
Heap *heap = &global_heap;
|
||||
|
@ -401,7 +401,7 @@ CUSTOM_DOC("If the cursor is found to be on a jump location, parses the jump loc
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
internal void
|
||||
goto_jump_in_order(Application_Links *app, Marker_List *list, View_ID jump_view, ID_Pos_Jump_Location location){
|
||||
Buffer_ID buffer = {};
|
||||
if (get_jump_buffer(app, &buffer, &location)){
|
||||
|
@ -412,26 +412,16 @@ goto_jump_in_order(Application_Links *app, Marker_List *list, View_ID jump_view,
|
|||
}
|
||||
switch_to_existing_view(app, target_view, buffer);
|
||||
jump_to_location(app, target_view, buffer, location);
|
||||
prev_location.buffer_id = location.buffer_id;
|
||||
prev_location.line = location.pos;
|
||||
prev_location.column = 0;
|
||||
prev_location = location;
|
||||
}
|
||||
}
|
||||
|
||||
static b32
|
||||
jump_is_repeat(ID_Line_Column_Jump_Location prev, ID_Pos_Jump_Location location){
|
||||
b32 skip = false;
|
||||
// NOTE(allen): This looks wrong, but it is correct. The prev_location is a line column type
|
||||
// because that is how the old-style direct jumps worked, and they are still supported. All code paths
|
||||
// in the sticky jump system treat line as the field for pos and ignore column. When the time has
|
||||
// passed and the direct jump legacy system is gone then this can be corrected.
|
||||
if (prev.buffer_id == location.buffer_id && prev.line == location.pos){
|
||||
skip = true;
|
||||
}
|
||||
return(skip);
|
||||
internal b32
|
||||
jump_is_repeat(ID_Pos_Jump_Location prev, ID_Pos_Jump_Location location){
|
||||
return(prev.buffer_id == location.buffer_id && prev.pos == location.pos);
|
||||
}
|
||||
|
||||
static void
|
||||
internal void
|
||||
goto_next_filtered_jump(Application_Links *app, Marker_List *list, View_ID jump_view, i32 list_index, i32 direction, b32 skip_repeats, b32 skip_sub_errors){
|
||||
Assert(direction == 1 || direction == -1);
|
||||
|
||||
|
@ -460,7 +450,7 @@ goto_next_filtered_jump(Application_Links *app, Marker_List *list, View_ID jump_
|
|||
}
|
||||
}
|
||||
|
||||
static Locked_Jump_State
|
||||
internal Locked_Jump_State
|
||||
get_locked_jump_state(Application_Links *app, Heap *heap){
|
||||
Locked_Jump_State result = {};
|
||||
result.view = get_view_for_locked_jump_buffer(app);
|
||||
|
@ -475,7 +465,7 @@ get_locked_jump_state(Application_Links *app, Heap *heap){
|
|||
return(result);
|
||||
}
|
||||
|
||||
CUSTOM_COMMAND_SIG(goto_next_jump_sticky)
|
||||
CUSTOM_COMMAND_SIG(goto_next_jump)
|
||||
CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.")
|
||||
{
|
||||
Heap *heap = &global_heap;
|
||||
|
@ -492,7 +482,7 @@ CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to th
|
|||
}
|
||||
}
|
||||
|
||||
CUSTOM_COMMAND_SIG(goto_prev_jump_sticky)
|
||||
CUSTOM_COMMAND_SIG(goto_prev_jump)
|
||||
CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations."){
|
||||
Heap *heap = &global_heap;
|
||||
|
||||
|
@ -505,7 +495,7 @@ CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to th
|
|||
}
|
||||
}
|
||||
|
||||
CUSTOM_COMMAND_SIG(goto_next_jump_no_skips_sticky)
|
||||
CUSTOM_COMMAND_SIG(goto_next_jump_no_skips)
|
||||
CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.")
|
||||
{
|
||||
Heap *heap = &global_heap;
|
||||
|
@ -522,7 +512,7 @@ CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to th
|
|||
}
|
||||
}
|
||||
|
||||
CUSTOM_COMMAND_SIG(goto_prev_jump_no_skips_sticky)
|
||||
CUSTOM_COMMAND_SIG(goto_prev_jump_no_skips)
|
||||
CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.")
|
||||
{
|
||||
Heap *heap = &global_heap;
|
||||
|
@ -536,7 +526,7 @@ CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to th
|
|||
}
|
||||
}
|
||||
|
||||
CUSTOM_COMMAND_SIG(goto_first_jump_sticky)
|
||||
CUSTOM_COMMAND_SIG(goto_first_jump)
|
||||
CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.")
|
||||
{
|
||||
Heap *heap = &global_heap;
|
||||
|
@ -575,7 +565,7 @@ CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to th
|
|||
// Insert Newline or Tigger Jump on Read Only Buffer
|
||||
//
|
||||
|
||||
CUSTOM_COMMAND_SIG(newline_or_goto_position_sticky)
|
||||
CUSTOM_COMMAND_SIG(newline_or_goto_position)
|
||||
CUSTOM_DOC("If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.")
|
||||
{
|
||||
View_ID view = get_active_view(app, AccessProtected);
|
||||
|
@ -586,13 +576,13 @@ CUSTOM_DOC("If the buffer in the active view is writable, inserts a character, o
|
|||
else{
|
||||
buffer = view_get_buffer(app, view, AccessProtected);
|
||||
if (buffer != 0){
|
||||
goto_jump_at_cursor_sticky(app);
|
||||
goto_jump_at_cursor(app);
|
||||
lock_jump_buffer(app, buffer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CUSTOM_COMMAND_SIG(newline_or_goto_position_same_panel_sticky)
|
||||
CUSTOM_COMMAND_SIG(newline_or_goto_position_same_panel)
|
||||
CUSTOM_DOC("If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.")
|
||||
{
|
||||
View_ID view = get_active_view(app, AccessProtected);
|
||||
|
@ -603,7 +593,7 @@ CUSTOM_DOC("If the buffer in the active view is writable, inserts a character, o
|
|||
else{
|
||||
buffer = view_get_buffer(app, view, AccessProtected);
|
||||
if (buffer != 0){
|
||||
goto_jump_at_cursor_same_panel_sticky(app);
|
||||
goto_jump_at_cursor_same_panel(app);
|
||||
lock_jump_buffer(app, buffer);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -324,6 +324,7 @@ skip_this_jump(ID_Line_Column_Jump_Location prev, ID_Line_Column_Jump_Location j
|
|||
return(result);
|
||||
}
|
||||
|
||||
#if 0
|
||||
static b32
|
||||
advance_cursor_in_jump_view(Application_Links *app, View_ID view, b32 skip_repeats, b32 skip_sub_error, Scan_Direction direction, Name_Line_Column_Location *location_out){
|
||||
b32 result = true;
|
||||
|
@ -360,7 +361,7 @@ advance_cursor_in_jump_view(Application_Links *app, View_ID view, b32 skip_repea
|
|||
}
|
||||
|
||||
static b32
|
||||
seek_jump(Application_Links *app, b32 skip_repeats, b32 skip_sub_errors, i32 direction){
|
||||
seek_jump_(Application_Links *app, b32 skip_repeats, b32 skip_sub_errors, i32 direction){
|
||||
b32 result = false;
|
||||
|
||||
View_ID view = get_view_for_locked_jump_buffer(app);
|
||||
|
@ -383,41 +384,7 @@ seek_jump(Application_Links *app, b32 skip_repeats, b32 skip_sub_errors, i32 dir
|
|||
|
||||
return(result);
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
|
||||
#if defined(USE_OLD_STYLE_JUMPS)
|
||||
|
||||
#define goto_jump_at_cursor CUSTOM_ALIAS(goto_jump_at_cursor_direct)
|
||||
#define goto_jump_at_cursor_same_panel CUSTOM_ALIAS(goto_jump_at_cursor_same_panel_direct)
|
||||
#define goto_next_jump CUSTOM_ALIAS(goto_next_jump_direct)
|
||||
#define goto_prev_jump CUSTOM_ALIAS(goto_prev_jump_direct)
|
||||
#define goto_next_jump_no_skips CUSTOM_ALIAS(goto_next_jump_no_skips_direct)
|
||||
#define goto_prev_jump_no_skips CUSTOM_ALIAS(goto_prev_jump_no_skips_direct)
|
||||
#define goto_first_jump CUSTOM_ALIAS(goto_first_jump_direct)
|
||||
#define newline_or_goto_position CUSTOM_ALIAS(newline_or_goto_position_direct)
|
||||
#define newline_or_goto_position_same_panel CUSTOM_ALIAS(newline_or_goto_position_same_panel_direct)
|
||||
|
||||
#else
|
||||
|
||||
#define goto_jump_at_cursor CUSTOM_ALIAS(goto_jump_at_cursor_sticky)
|
||||
#define goto_jump_at_cursor_same_panel CUSTOM_ALIAS(goto_jump_at_cursor_same_panel_sticky)
|
||||
#define goto_next_jump CUSTOM_ALIAS(goto_next_jump_sticky)
|
||||
#define goto_prev_jump CUSTOM_ALIAS(goto_prev_jump_sticky)
|
||||
#define goto_next_jump_no_skips CUSTOM_ALIAS(goto_next_jump_no_skips_sticky)
|
||||
#define goto_prev_jump_no_skips CUSTOM_ALIAS(goto_prev_jump_no_skips_sticky)
|
||||
#define goto_first_jump CUSTOM_ALIAS(goto_first_jump_sticky)
|
||||
#define newline_or_goto_position CUSTOM_ALIAS(newline_or_goto_position_sticky)
|
||||
#define newline_or_goto_position_same_panel CUSTOM_ALIAS(newline_or_goto_position_same_panel_sticky)
|
||||
|
||||
#endif
|
||||
|
||||
#define seek_error CUSTOM_ALIAS(seek_jump)
|
||||
#define goto_next_error CUSTOM_ALIAS(goto_next_jump)
|
||||
#define goto_prev_error CUSTOM_ALIAS(goto_prev_jump)
|
||||
#define goto_next_error_no_skips CUSTOM_ALIAS(goto_next_jump_no_skips)
|
||||
#define goto_prev_error_no_skips CUSTOM_ALIAS(goto_prev_jump_no_skips)
|
||||
#define goto_first_error CUSTOM_ALIAS(goto_first_jump)
|
||||
|
||||
// BOTTOM
|
||||
|
||||
|
|
|
@ -136,6 +136,18 @@ log_parse__get_or_make_list_tag_value(Log_Parse *parse, Log_Tag *tag){
|
|||
return(result);
|
||||
}
|
||||
|
||||
internal Log_Event_List*
|
||||
log_parse_get_list_tag_name(Log_Parse *parse, u64 name){
|
||||
Log_Event_List *result = 0;
|
||||
Table_Lookup lookup = table_lookup(&parse->tag_name_to_event_list_table, name);
|
||||
if (lookup.found_match){
|
||||
u64 val = 0;
|
||||
table_read(&parse->tag_name_to_event_list_table, lookup, &val);
|
||||
result = (Log_Event_List*)IntAsPtr(val);
|
||||
}
|
||||
return(result);
|
||||
}
|
||||
|
||||
internal Log_Event_List*
|
||||
log_parse__get_or_make_list_tag_name(Log_Parse *parse, Log_Tag *tag){
|
||||
Log_Event_List *result = 0;
|
||||
|
@ -354,65 +366,690 @@ log_event_array_from_list(Arena *arena, Log_Event_List list){
|
|||
|
||||
////////////////////////////////
|
||||
|
||||
CUSTOM_COMMAND_SIG(parse_the_log)
|
||||
CUSTOM_DOC("Tests the log parser")
|
||||
{
|
||||
Buffer_ID log_buffer = get_buffer_by_name(app, string_u8_litexpr("*log*"), AccessAll);
|
||||
Scratch_Block scratch(app);
|
||||
String_Const_u8 log_text = push_whole_buffer(app, scratch, log_buffer);
|
||||
Log_Parse parse = make_log_parse(scratch, log_text);
|
||||
global View_ID log_view = 0;
|
||||
global Arena log_arena = {};
|
||||
global Log_Parse log_parse = {};
|
||||
global Log_Graph log_graph = {};
|
||||
global Log_Filter_Set log_filter_set = {};
|
||||
global Log_Filter_Set log_preview_set = {};
|
||||
|
||||
u64 buffer_code = log_parse__string_code(&parse, string_u8_litexpr("buffer"),
|
||||
LogParse_ExternalString);
|
||||
u64 thread_code = log_parse__string_code(&parse, string_u8_litexpr("thread"),
|
||||
LogParse_ExternalString);
|
||||
|
||||
Log_Tag_Value value = {};
|
||||
value.kind = LogTagKind_Integer;
|
||||
value.value_s = 10;
|
||||
Log_Event_List *list = log_parse_get_list_tag_value(&parse, buffer_code, value);
|
||||
|
||||
Log_Event_Ptr_Array array = log_event_array_from_list(scratch, *list);
|
||||
log_events_sort_by_tag(scratch, array, thread_code);
|
||||
|
||||
for (i32 i = 0; i < array.count; i += 1){
|
||||
Log_Event *event = array.events[i];
|
||||
String_Const_u8 src_name = log_parse__get_string(&parse, event->src_file_name);
|
||||
String_Const_u8 event_name = log_parse__get_string(&parse, event->event_name);
|
||||
u64 line_number = event->line_number;
|
||||
|
||||
List_String_Const_u8 line = {};
|
||||
string_list_pushf(scratch, &line, "%.*s:%llu: %.*s",
|
||||
string_expand(src_name), line_number, string_expand(event_name));
|
||||
|
||||
for (Log_Tag *node = event->first_tag;
|
||||
node != 0;
|
||||
node = node->next){
|
||||
String_Const_u8 tag_name = log_parse__get_string(&parse, node->name);
|
||||
|
||||
switch (node->value.kind){
|
||||
case LogTagKind_Integer:
|
||||
{
|
||||
string_list_pushf(scratch, &line, " [%.*s:%lld]",
|
||||
string_expand(tag_name), node->value.value_s);
|
||||
}break;
|
||||
|
||||
case LogTagKind_String:
|
||||
{
|
||||
String_Const_u8 string_value = log_parse__get_string(&parse, node->value.value);
|
||||
string_list_pushf(scratch, &line, " [%.*s:%.*s]",
|
||||
string_expand(tag_name), string_expand(string_value));
|
||||
}break;
|
||||
}
|
||||
}
|
||||
|
||||
string_list_push(scratch, &line, string_u8_litexpr("\n"));
|
||||
|
||||
String_Const_u8 line_string = string_list_flatten(scratch, line);
|
||||
print_message(app, line_string);
|
||||
internal void
|
||||
log_filter_set_init(Log_Filter_Set *set){
|
||||
block_zero_struct(set);
|
||||
for (i32 i = ArrayCount(set->filters_memory) - 1; i >= 0; i -= 1){
|
||||
sll_stack_push(set->free_filters, &set->filters_memory[i]);
|
||||
}
|
||||
}
|
||||
|
||||
internal Log_Filter_Set*
|
||||
log_filter_set_from_tab(Log_Graph_List_Tab tab){
|
||||
Log_Filter_Set *result = 0;
|
||||
switch (tab){
|
||||
case LogTab_Filters:
|
||||
{
|
||||
result = &log_filter_set;
|
||||
}break;
|
||||
case LogTab_Previews:
|
||||
{
|
||||
result = &log_preview_set;
|
||||
}break;
|
||||
}
|
||||
return(result);
|
||||
}
|
||||
|
||||
internal Log_Filter*
|
||||
log_filter_set__new_filter(Log_Filter_Set *set, Log_Filter *prototype){
|
||||
Log_Filter *result = set->free_filters;
|
||||
if (result != 0){
|
||||
for (Log_Filter *filter = set->first;
|
||||
filter != 0;
|
||||
filter = filter->next){
|
||||
if (filter->kind == prototype->kind &&
|
||||
filter->tag_name_code == prototype->tag_name_code &&
|
||||
block_match_struct(&filter->tag_value, &prototype->tag_value)){
|
||||
result = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (result != 0){
|
||||
sll_stack_pop(set->free_filters);
|
||||
block_copy_struct(result, prototype);
|
||||
zdll_push_back(set->first, set->last, result);
|
||||
set->count += 1;
|
||||
set->alter_counter += 1;
|
||||
}
|
||||
}
|
||||
return(result);
|
||||
}
|
||||
|
||||
internal void
|
||||
log_filter_set__free_filter(Log_Filter_Set *set, Log_Filter *filter){
|
||||
zdll_remove(set->first, set->last, filter);
|
||||
set->count -= 1;
|
||||
set->alter_counter += 1;
|
||||
sll_stack_push(set->free_filters, filter);
|
||||
}
|
||||
|
||||
internal void
|
||||
log_graph_fill(Application_Links *app, Rect_f32 layout_region, Face_ID face_id){
|
||||
if (log_parse.arena != 0){
|
||||
if (log_graph.holding_temp){
|
||||
end_temp(log_graph.temp);
|
||||
}
|
||||
block_zero_struct(&log_graph);
|
||||
log_graph.holding_temp = true;
|
||||
log_graph.temp = begin_temp(&log_arena);
|
||||
log_graph.layout_region = layout_region;
|
||||
log_graph.face_id = face_id;
|
||||
log_graph.filter_alter_counter = log_filter_set.alter_counter;
|
||||
log_graph.preview_alter_counter = log_preview_set.alter_counter;
|
||||
log_graph.tab = LogTab_Filters;
|
||||
|
||||
f32 details_h = rect_height(layout_region)*.22f;
|
||||
details_h = clamp_top(details_h, 250.f);
|
||||
|
||||
Rect_f32 details_region = Rf32(layout_region.x0, layout_region.y0,
|
||||
layout_region.x1, layout_region.y0 + details_h);
|
||||
Rect_f32 event_list_region = Rf32(layout_region.x0, layout_region.y0 + details_h,
|
||||
layout_region.x1, layout_region.y1);
|
||||
|
||||
log_graph.details_region = details_region;
|
||||
log_graph.details_region.p0 -= layout_region.p0;
|
||||
log_graph.details_region.p1 -= layout_region.p0;
|
||||
|
||||
u64 thread_code = log_parse__string_code(&log_parse, string_u8_litexpr("thread"),
|
||||
LogParse_ExternalString);
|
||||
|
||||
if (log_filter_set.count == 0){
|
||||
// NOTE(allen): everything goes into the filtered list
|
||||
for (Log_Event *event = log_parse.first_event;
|
||||
event != 0;
|
||||
event = event->next){
|
||||
Log_Event_Ptr_Node *node = push_array(&log_arena, Log_Event_Ptr_Node, 1);
|
||||
node->event = event;
|
||||
sll_queue_push(log_graph.filtered_list.first, log_graph.filtered_list.last, node);
|
||||
log_graph.filtered_list.count += 1;
|
||||
}
|
||||
}
|
||||
else{
|
||||
for (Log_Filter *filter = log_filter_set.first;
|
||||
filter != 0;
|
||||
filter = filter->next){
|
||||
Log_Event_List *filter_list = 0;
|
||||
if (filter->kind == LogFilter_TagValue){
|
||||
filter_list = log_parse_get_list_tag_value(&log_parse, filter->tag_name_code,
|
||||
filter->tag_value);
|
||||
}
|
||||
else if (filter->kind == LogFilter_Tag){
|
||||
filter_list = log_parse_get_list_tag_name(&log_parse, filter->tag_name_code);
|
||||
}
|
||||
|
||||
// NOTE(allen): combine with existing result
|
||||
if (filter == log_filter_set.first){
|
||||
for (Log_Event_Ptr_Node *node = filter_list->first;
|
||||
node != 0;
|
||||
node = node->next){
|
||||
Log_Event_Ptr_Node *new_node = push_array(&log_arena, Log_Event_Ptr_Node, 1);
|
||||
new_node->event = node->event;
|
||||
sll_queue_push(log_graph.filtered_list.first, log_graph.filtered_list.last, new_node);
|
||||
log_graph.filtered_list.count += 1;
|
||||
}
|
||||
}
|
||||
else{
|
||||
Log_Event_Ptr_Node **fixup_ptr = &log_graph.filtered_list.first;
|
||||
log_graph.filtered_list.last = 0;
|
||||
for (Log_Event_Ptr_Node *node_a = log_graph.filtered_list.first, *next = 0;
|
||||
node_a != 0;
|
||||
node_a = next){
|
||||
next = node_a->next;
|
||||
|
||||
b32 remove_node_a = true;
|
||||
for (Log_Event_Ptr_Node *node_b = filter_list->first;
|
||||
node_b != 0;
|
||||
node_b = node_b->next){
|
||||
if (node_a->event == node_b->event){
|
||||
remove_node_a = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (remove_node_a){
|
||||
*fixup_ptr = next;
|
||||
}
|
||||
else{
|
||||
fixup_ptr = &node_a->next;
|
||||
log_graph.filtered_list.last = node_a;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
log_graph.event_array = log_event_array_from_list(&log_arena,
|
||||
log_graph.filtered_list);
|
||||
log_events_sort_by_tag(&log_arena, log_graph.event_array, thread_code);
|
||||
|
||||
b32 had_a_tag = true;
|
||||
u64 thread_id_value = 0;
|
||||
Log_Graph_Thread_Bucket *prev_bucket = 0;
|
||||
|
||||
for (i32 i = 0; i < log_graph.event_array.count; i += 1){
|
||||
Table_u64_u64 *tag_table = &log_graph.event_array.events[i]->tag_name_to_tag_ptr_table;
|
||||
Table_Lookup lookup = table_lookup(tag_table, thread_code);
|
||||
|
||||
b32 emit_next_bucket = false;
|
||||
if (!lookup.found_match){
|
||||
if (had_a_tag){
|
||||
had_a_tag = false;
|
||||
thread_id_value = 0;
|
||||
emit_next_bucket = true;
|
||||
}
|
||||
}
|
||||
else{
|
||||
u64 read_val = 0;
|
||||
table_read(tag_table, lookup, &read_val);
|
||||
Log_Tag *tag = (Log_Tag*)IntAsPtr(read_val);
|
||||
if (!had_a_tag){
|
||||
had_a_tag = true;
|
||||
thread_id_value = tag->value.value;
|
||||
emit_next_bucket = true;
|
||||
}
|
||||
else if (thread_id_value != tag->value.value){
|
||||
thread_id_value = tag->value.value;
|
||||
emit_next_bucket = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (emit_next_bucket){
|
||||
Log_Graph_Thread_Bucket *bucket = push_array(&log_arena, Log_Graph_Thread_Bucket, 1);
|
||||
sll_queue_push(log_graph.first_bucket, log_graph.last_bucket, bucket);
|
||||
log_graph.bucket_count += 1;
|
||||
bucket->range.first = i;
|
||||
bucket->had_a_tag = had_a_tag;
|
||||
bucket->thread_id_value = thread_id_value;
|
||||
if (prev_bucket != 0){
|
||||
prev_bucket->range.one_past_last = i;
|
||||
}
|
||||
prev_bucket = bucket;
|
||||
}
|
||||
}
|
||||
if (prev_bucket != 0){
|
||||
prev_bucket->range.one_past_last = log_graph.event_array.count;
|
||||
}
|
||||
|
||||
Face_Metrics metrics = get_face_metrics(app, face_id);
|
||||
f32 line_height = metrics.line_height;
|
||||
f32 box_h = f32_floor32(line_height*1.5f);
|
||||
f32 box_w = f32_floor32(rect_width(event_list_region)/log_graph.bucket_count);
|
||||
f32 y_cursor = event_list_region.y0 - layout_region.y0;
|
||||
|
||||
if (log_graph.bucket_count > 0){
|
||||
f32 y_bottom = 0.f;
|
||||
|
||||
for (;;){
|
||||
i32 smallest_event_number = max_i32;
|
||||
i32 bucket_with_next_event_index = -1;
|
||||
Log_Graph_Thread_Bucket *bucket_with_next_event = 0;
|
||||
Log_Event *next_event = 0;
|
||||
i32 iteration_counter = 0;
|
||||
for (Log_Graph_Thread_Bucket *bucket = log_graph.first_bucket;
|
||||
bucket != 0;
|
||||
bucket = bucket->next, iteration_counter += 1){
|
||||
if (bucket->range.first < bucket->range.one_past_last){
|
||||
Log_Event *event = log_graph.event_array.events[bucket->range.first];
|
||||
if (event->event_number < smallest_event_number){
|
||||
smallest_event_number = event->event_number;
|
||||
bucket_with_next_event_index = iteration_counter;
|
||||
bucket_with_next_event = bucket;
|
||||
next_event = event;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (bucket_with_next_event == 0){
|
||||
break;
|
||||
}
|
||||
|
||||
bucket_with_next_event->range.first += 1;
|
||||
|
||||
Log_Graph_Box *box_node = push_array(&log_arena, Log_Graph_Box, 1);
|
||||
sll_queue_push(log_graph.first_box, log_graph.last_box, box_node);
|
||||
log_graph.box_count += 1;
|
||||
Rect_f32 rect = Rf32(box_w*bucket_with_next_event_index , y_cursor,
|
||||
box_w*(bucket_with_next_event_index + 1), y_cursor + box_h);
|
||||
box_node->rect = rect;
|
||||
box_node->event = next_event;
|
||||
|
||||
y_bottom = Max(y_bottom, rect.y1);
|
||||
|
||||
y_cursor += box_h;
|
||||
}
|
||||
|
||||
log_graph.max_y_scroll = clamp_bot(line_height, y_bottom - rect_height(event_list_region)*0.5f);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal void
|
||||
log_parse_fill(Application_Links *app, Buffer_ID buffer){
|
||||
if (log_arena.base_allocator == 0){
|
||||
log_arena = make_arena_app_links(app);
|
||||
}
|
||||
|
||||
linalloc_clear(&log_arena);
|
||||
block_zero_struct(&log_graph);
|
||||
log_filter_set_init(&log_filter_set);
|
||||
log_filter_set_init(&log_preview_set);
|
||||
|
||||
String_Const_u8 log_text = push_whole_buffer(app, &log_arena, buffer);
|
||||
log_parse = make_log_parse(&log_arena, log_text);
|
||||
}
|
||||
|
||||
internal void
|
||||
log_graph_render__tag(Arena *arena, Fancy_String_List *line, Log_Parse *log_parse, Log_Tag *tag){
|
||||
String_Const_u8 tag_name = log_parse__get_string(log_parse, tag->name);
|
||||
push_fancy_stringf(arena, line, white, "[");
|
||||
push_fancy_string(arena, line, green, tag_name);
|
||||
push_fancy_stringf(arena, line, white, "=");
|
||||
if (tag->value.kind == LogTagKind_Integer){
|
||||
push_fancy_stringf(arena, line, pink, "0x%llx", tag->value.value_s);
|
||||
}
|
||||
else if (tag->value.kind == LogTagKind_String){
|
||||
String_Const_u8 value = log_parse__get_string(log_parse, tag->value.value);
|
||||
push_fancy_string(arena, line, pink, value);
|
||||
}
|
||||
push_fancy_stringf(arena, line, white, "]");
|
||||
}
|
||||
|
||||
internal void
|
||||
log_graph_render(Application_Links *app, View_ID view, Frame_Info frame_info, Rect_f32 inner){
|
||||
if (log_parse.arena != 0){
|
||||
Face_ID face_id = get_face_id(app, 0);
|
||||
f32 y_scroll = log_graph.y_scroll;
|
||||
Log_Event *selected_event = log_graph.selected_event;
|
||||
if (!log_graph.holding_temp ||
|
||||
inner != log_graph.layout_region ||
|
||||
face_id != log_graph.face_id ||
|
||||
log_filter_set.alter_counter != log_graph.filter_alter_counter){
|
||||
log_graph_fill(app, inner, face_id);
|
||||
}
|
||||
log_graph.y_scroll = clamp(0.f, y_scroll, log_graph.max_y_scroll);
|
||||
log_graph.selected_event = selected_event;
|
||||
|
||||
Mouse_State mouse = get_mouse_state(app);
|
||||
Vec2_f32 m_p = V2f32(mouse.p) - inner.p0;
|
||||
|
||||
Face_Metrics metrics = get_face_metrics(app, log_graph.face_id);
|
||||
f32 line_height = metrics.line_height;
|
||||
|
||||
Log_Event *hover_event = 0;
|
||||
|
||||
b32 in_details_region = (rect_contains_point(log_graph.details_region, m_p));
|
||||
|
||||
for (Log_Graph_Box *box_node = log_graph.first_box;
|
||||
box_node != 0;
|
||||
box_node = box_node->next){
|
||||
Scratch_Block scratch(app);
|
||||
|
||||
Rect_f32 box = box_node->rect;
|
||||
box.y0 -= log_graph.y_scroll;
|
||||
box.y1 -= log_graph.y_scroll;
|
||||
|
||||
Rect_f32 box_inner = rect_inner(box, 3.f);
|
||||
|
||||
Fancy_Color margin_color = dark_gray;
|
||||
if (!in_details_region && hover_event == 0 && rect_contains_point(box, m_p)){
|
||||
margin_color = gray;
|
||||
hover_event = box_node->event;
|
||||
}
|
||||
if (box_node->event == log_graph.selected_event){
|
||||
margin_color = light_gray;
|
||||
}
|
||||
|
||||
draw_rectangle(app, box , margin_color);
|
||||
draw_rectangle(app, box_inner, black );
|
||||
|
||||
Log_Event *event = box_node->event;
|
||||
|
||||
String_Const_u8 event_name = log_parse__get_string(&log_parse, event->event_name);
|
||||
Fancy_String_List line = {};
|
||||
push_fancy_string(scratch, &line, white, event_name);
|
||||
|
||||
for (Log_Filter *filter = log_preview_set.first;
|
||||
filter != 0;
|
||||
filter = filter->next){
|
||||
Table_u64_u64 *table = &event->tag_name_to_tag_ptr_table;
|
||||
Table_Lookup lookup = table_lookup(table, filter->tag_name_code);
|
||||
if (lookup.found_match){
|
||||
u64 val = 0;
|
||||
table_read(table, lookup, &val);
|
||||
Log_Tag *tag = (Log_Tag*)IntAsPtr(val);
|
||||
push_fancy_string(scratch, &line, string_u8_litexpr(" "));
|
||||
log_graph_render__tag(scratch, &line, &log_parse, tag);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Vec2_f32 p = V2f32(box_inner.x0 + 3.f,
|
||||
(f32_round32((box_inner.y0 + box_inner.y1 - line_height)*0.5f)));
|
||||
draw_fancy_string(app, log_graph.face_id, line.first, p, 0, 0, 0, V2f32(1.f, 0.f));
|
||||
}
|
||||
|
||||
{
|
||||
Scratch_Block scratch(app);
|
||||
|
||||
Rect_f32 box = log_graph.details_region;
|
||||
Rect_f32 box_inner = rect_inner(box, 3.f);
|
||||
|
||||
Log_Graph_List_Tab current_tab = log_graph.tab;
|
||||
Log_Filter_Set *viewing_filter_set = log_filter_set_from_tab(current_tab);
|
||||
|
||||
draw_rectangle(app, box , dark_gray);
|
||||
draw_rectangle(app, box_inner, black );
|
||||
|
||||
{
|
||||
f32 y_cursor = box_inner.y0 + 3.f;
|
||||
if (y_cursor + line_height > box_inner.y1) goto finish_list_display;
|
||||
|
||||
{
|
||||
f32 x_cursor = box_inner.x0 + 3.f;
|
||||
for (i32 i = LogTab_ERROR + 1; i < LogTab_COUNT; i += 1){
|
||||
Fancy_Color color = (i == current_tab)?white:gray;
|
||||
Fancy_String_List line = {};
|
||||
switch (i){
|
||||
case LogTab_Filters:
|
||||
{
|
||||
push_fancy_stringf(scratch, &line, color, "filters");
|
||||
}break;
|
||||
case LogTab_Previews:
|
||||
{
|
||||
push_fancy_stringf(scratch, &line, color, "previews");
|
||||
}break;
|
||||
}
|
||||
|
||||
Vec2_f32 p = V2f32(x_cursor, y_cursor);
|
||||
f32 advance = get_fancy_string_advance(app, log_graph.face_id, line.first);
|
||||
draw_fancy_string(app, log_graph.face_id, line.first, p,
|
||||
Stag_Default, Stag_Back, 0, V2f32(1.f, 0.f));
|
||||
x_cursor += advance + metrics.typical_character_width;
|
||||
|
||||
if (log_graph.has_unused_click){
|
||||
Rect_f32 click_rect = Rf32(p.x, p.y, p.x + advance, p.y + line_height);
|
||||
if (rect_contains_point(click_rect, log_graph.unused_click)){
|
||||
log_graph.has_unused_click = false;
|
||||
log_graph.tab = i;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (viewing_filter_set != 0){
|
||||
for (Log_Filter *filter = viewing_filter_set->first, *next = 0;
|
||||
filter != 0;
|
||||
filter = next){
|
||||
next = filter->next;
|
||||
|
||||
y_cursor += line_height;
|
||||
if (y_cursor + line_height > box_inner.y1) goto finish_list_display;
|
||||
|
||||
Fancy_String_List line = {};
|
||||
|
||||
if (filter->kind == LogFilter_TagValue){
|
||||
push_fancy_stringf(scratch, &line, white, "val [");
|
||||
String_Const_u8 tag_name = log_parse__get_string(&log_parse, filter->tag_name_code);
|
||||
push_fancy_stringf(scratch, &line, green, "%.*s", string_expand(tag_name));
|
||||
push_fancy_stringf(scratch, &line, white, "=");
|
||||
if (filter->tag_value.kind == LogTagKind_Integer){
|
||||
push_fancy_stringf(scratch, &line, pink, "0x%llx", filter->tag_value.value_s);
|
||||
}
|
||||
else if (filter->tag_value.kind == LogTagKind_String){
|
||||
String_Const_u8 value = log_parse__get_string(&log_parse, filter->tag_value.value);
|
||||
push_fancy_stringf(scratch, &line, pink, "%.*s", string_expand(value));
|
||||
}
|
||||
push_fancy_stringf(scratch, &line, white, "]");
|
||||
}
|
||||
else{
|
||||
push_fancy_stringf(scratch, &line, white, "name [");
|
||||
String_Const_u8 tag_name = log_parse__get_string(&log_parse, filter->tag_name_code);
|
||||
push_fancy_stringf(scratch, &line, green, "%.*s", string_expand(tag_name));
|
||||
push_fancy_stringf(scratch, &line, white, "]");
|
||||
}
|
||||
|
||||
Vec2_f32 p = V2f32(box_inner.x0 + 3.f, y_cursor);
|
||||
f32 advance = get_fancy_string_advance(app, log_graph.face_id, line.first);
|
||||
draw_fancy_string(app, log_graph.face_id, line.first, p, Stag_Default, Stag_Back,
|
||||
0, V2f32(1.f, 0.f));
|
||||
|
||||
if (log_graph.has_unused_click){
|
||||
Rect_f32 click_rect = Rf32(p.x, p.y, p.x + advance, p.y + line_height);
|
||||
if (rect_contains_point(click_rect, log_graph.unused_click)){
|
||||
log_graph.has_unused_click = false;
|
||||
log_filter_set__free_filter(viewing_filter_set, filter);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
finish_list_display:;
|
||||
}
|
||||
|
||||
Log_Event *view_event = (hover_event!=0)?hover_event:log_graph.selected_event;
|
||||
if (view_event != 0){
|
||||
f32 y_cursor = box_inner.y0 + 3.f;
|
||||
if (y_cursor + line_height > box_inner.y1) goto finish_event_display;
|
||||
|
||||
{
|
||||
Fancy_String_List line = {};
|
||||
String_Const_u8 file_name = log_parse__get_string(&log_parse, view_event->src_file_name);
|
||||
push_fancy_stringf(scratch, &line, green, "[%d] ", view_event->event_number);
|
||||
push_fancy_stringf(scratch, &line, white, "%.*s:", string_expand(file_name));
|
||||
push_fancy_stringf(scratch, &line, pink, "%llu", view_event->line_number);
|
||||
|
||||
Vec2_f32 right_p = V2f32(box_inner.x1 - 3.f, y_cursor);
|
||||
f32 advance = get_fancy_string_advance(app, log_graph.face_id, line.first);
|
||||
Vec2 p = V2f32(right_p.x - advance, right_p.y);
|
||||
draw_fancy_string(app, log_graph.face_id, line.first, p, Stag_Default, Stag_Back,
|
||||
0, V2(1.f, 0.f));
|
||||
}
|
||||
|
||||
for (Log_Tag *tag = view_event->first_tag;
|
||||
tag != 0;
|
||||
tag = tag->next){
|
||||
y_cursor += line_height;
|
||||
if (y_cursor + line_height > box_inner.y1) goto finish_event_display;
|
||||
|
||||
{
|
||||
Fancy_String_List line = {};
|
||||
log_graph_render__tag(scratch, &line, &log_parse, tag);
|
||||
|
||||
Vec2_f32 right_p = V2f32(box_inner.x1 - 3.f, y_cursor);
|
||||
f32 advance = get_fancy_string_advance(app, log_graph.face_id, line.first);
|
||||
Vec2 p = V2f32(right_p.x - advance, right_p.y);
|
||||
draw_fancy_string(app, log_graph.face_id, line.first, p,
|
||||
Stag_Default, Stag_Back, 0, V2(1.f, 0.f));
|
||||
|
||||
if (log_graph.has_unused_click){
|
||||
Rect_f32 click_rect = Rf32(p.x, p.y, right_p.x, p.y + line_height);
|
||||
if (rect_contains_point(click_rect, log_graph.unused_click)){
|
||||
log_graph.has_unused_click = false;
|
||||
Log_Filter filter = {};
|
||||
switch (log_graph.tab){
|
||||
case LogTab_Filters:
|
||||
{
|
||||
filter.kind = LogFilter_TagValue;
|
||||
filter.tag_name_code = tag->name;
|
||||
filter.tag_value = tag->value;
|
||||
}break;
|
||||
case LogTab_Previews:
|
||||
{
|
||||
filter.kind = LogFilter_Tag;
|
||||
filter.tag_name_code = tag->name;
|
||||
}break;
|
||||
}
|
||||
if (filter.kind != LogTab_ERROR){
|
||||
log_filter_set__new_filter(viewing_filter_set, &filter);
|
||||
animate_in_n_milliseconds(app, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
finish_event_display:;
|
||||
}
|
||||
}
|
||||
|
||||
log_graph.has_unused_click = false;
|
||||
}
|
||||
}
|
||||
|
||||
CUSTOM_COMMAND_SIG(log_graph__escape)
|
||||
CUSTOM_DOC("Ends the log grapher")
|
||||
{
|
||||
if (log_view != 0){
|
||||
Managed_Scope scope = view_get_managed_scope(app, log_view);
|
||||
managed_variable_set(app, scope, view_render_hook, 0);
|
||||
view_end_ui_mode(app, log_view);
|
||||
log_view = 0;
|
||||
}
|
||||
}
|
||||
|
||||
CUSTOM_COMMAND_SIG(log_graph__scroll_wheel)
|
||||
CUSTOM_DOC("Scrolls the log graph")
|
||||
{
|
||||
if (log_view != 0){
|
||||
Mouse_State mouse = get_mouse_state(app);
|
||||
if (mouse.wheel != 0){
|
||||
log_graph.y_scroll += mouse.wheel;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CUSTOM_COMMAND_SIG(log_graph__page_up)
|
||||
CUSTOM_DOC("Scroll the log graph up one whole page")
|
||||
{
|
||||
if (log_view != 0){
|
||||
log_graph.y_scroll -= get_page_jump(app, log_view);
|
||||
}
|
||||
}
|
||||
|
||||
CUSTOM_COMMAND_SIG(log_graph__page_down)
|
||||
CUSTOM_DOC("Scroll the log graph down one whole page")
|
||||
{
|
||||
if (log_view != 0){
|
||||
log_graph.y_scroll += get_page_jump(app, log_view);
|
||||
}
|
||||
}
|
||||
|
||||
internal Log_Graph_Box*
|
||||
log_graph__get_box_at_point(Log_Graph *log_graph, Vec2_f32 p){
|
||||
Log_Graph_Box *result = 0;
|
||||
if (!rect_contains_point(log_graph->details_region, p)){
|
||||
for (Log_Graph_Box *box_node = log_graph->first_box;
|
||||
box_node != 0;
|
||||
box_node = box_node->next){
|
||||
Rect_f32 box = box_node->rect;
|
||||
box.y0 -= log_graph->y_scroll;
|
||||
box.y1 -= log_graph->y_scroll;
|
||||
if (rect_contains_point(box, p)){
|
||||
result = box_node;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return(result);
|
||||
}
|
||||
|
||||
internal Log_Graph_Box*
|
||||
log_graph__get_box_at_mouse_point(Application_Links *app, Log_Graph *log_graph){
|
||||
Mouse_State mouse = get_mouse_state(app);
|
||||
Vec2_f32 m_p = V2f32(mouse.p) - log_graph->layout_region.p0;
|
||||
return(log_graph__get_box_at_point(log_graph, m_p));
|
||||
}
|
||||
|
||||
CUSTOM_COMMAND_SIG(log_graph__click_select_event)
|
||||
CUSTOM_DOC("Select the event record at the mouse point in the log graph")
|
||||
{
|
||||
if (log_view != 0){
|
||||
if (log_graph.holding_temp){
|
||||
Mouse_State mouse = get_mouse_state(app);
|
||||
Vec2_f32 m_p = V2f32(mouse.p) - log_graph.layout_region.p0;
|
||||
Log_Graph_Box *box_node = log_graph__get_box_at_point(&log_graph, m_p);
|
||||
if (box_node != 0){
|
||||
log_graph.selected_event = box_node->event;
|
||||
}
|
||||
else{
|
||||
log_graph.has_unused_click = true;
|
||||
log_graph.unused_click = m_p;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CUSTOM_COMMAND_SIG(log_graph__click_jump_to_event_source)
|
||||
CUSTOM_DOC("Jump to the code that logged the event record at the mouse point in the log graph")
|
||||
{
|
||||
if (log_view != 0){
|
||||
if (log_graph.holding_temp){
|
||||
Mouse_State mouse = get_mouse_state(app);
|
||||
Vec2_f32 m_p = V2f32(mouse.p) - log_graph.layout_region.p0;
|
||||
Log_Graph_Box *box_node = log_graph__get_box_at_point(&log_graph, m_p);
|
||||
if (box_node != 0){
|
||||
Log_Event *event = box_node->event;
|
||||
log_graph.selected_event = event;
|
||||
|
||||
View_ID target_view = get_next_view_looped_primary_panels(app, log_view, AccessProtected);
|
||||
if (target_view != 0){
|
||||
String_Const_u8 file_name = log_parse__get_string(&log_parse, event->src_file_name);
|
||||
Buffer_ID target_buffer = get_buffer_by_file_name(app, file_name, AccessAll);
|
||||
if (target_buffer == 0){
|
||||
target_buffer = get_buffer_by_name(app, file_name, AccessAll);
|
||||
}
|
||||
if (target_buffer != 0){
|
||||
if (target_view == log_view){
|
||||
view_end_ui_mode(app, target_view);
|
||||
}
|
||||
set_view_to_location(app, target_view, target_buffer,
|
||||
seek_line_char(event->line_number, 1));
|
||||
}
|
||||
}
|
||||
}
|
||||
else{
|
||||
log_graph.has_unused_click = true;
|
||||
log_graph.unused_click = m_p;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal void
|
||||
fill_log_graph_command_map(Bind_Helper *context){
|
||||
begin_map(context, default_log_graph_map);
|
||||
bind(context, key_esc, MDFR_NONE, log_graph__escape);
|
||||
bind(context, key_mouse_wheel, MDFR_NONE, log_graph__scroll_wheel);
|
||||
bind(context, key_mouse_left, MDFR_NONE, log_graph__click_jump_to_event_source);
|
||||
bind(context, key_mouse_right, MDFR_NONE, log_graph__click_select_event);
|
||||
bind(context, key_page_up, MDFR_NONE, log_graph__page_up);
|
||||
bind(context, key_page_down, MDFR_NONE, log_graph__page_down);
|
||||
end_map(context);
|
||||
}
|
||||
|
||||
CUSTOM_COMMAND_SIG(show_the_log_graph)
|
||||
CUSTOM_DOC("Parser *log* and displays the 'log graph' UI")
|
||||
{
|
||||
Buffer_ID log_buffer = get_buffer_by_name(app, string_u8_litexpr("*log*"), AccessAll);
|
||||
log_parse_fill(app, log_buffer);
|
||||
|
||||
if (log_view == 0){
|
||||
log_view = get_active_view(app, AccessAll);
|
||||
}
|
||||
Managed_Scope scope = view_get_managed_scope(app, log_view);
|
||||
u64 render_hook_value = (u64)PtrAsInt(log_graph_render);
|
||||
managed_variable_set(app, scope, view_render_hook, render_hook_value);
|
||||
view_set_setting(app, log_view, ViewSetting_UICommandMap, default_log_graph_map);
|
||||
view_begin_ui_mode(app, log_view);
|
||||
view_set_quit_ui_handler(app, log_view, ui_quit_clear_render_hook);
|
||||
}
|
||||
|
||||
// BOTTOM
|
||||
|
||||
|
|
|
@ -100,6 +100,77 @@ struct Log_Parse{
|
|||
Table_u64_u64 tag_name_to_event_list_table;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
|
||||
struct Log_Graph_Thread_Bucket{
|
||||
Log_Graph_Thread_Bucket *next;
|
||||
Range_i32 range;
|
||||
b32 had_a_tag;
|
||||
u64 thread_id_value;
|
||||
};
|
||||
|
||||
struct Log_Graph_Box{
|
||||
Log_Graph_Box *next;
|
||||
Rect_f32 rect;
|
||||
Log_Event *event;
|
||||
};
|
||||
|
||||
typedef i32 Log_Filter_Kind;
|
||||
enum{
|
||||
LogFilter_ERROR,
|
||||
LogFilter_TagValue,
|
||||
LogFilter_Tag,
|
||||
};
|
||||
|
||||
struct Log_Filter{
|
||||
Log_Filter *next;
|
||||
Log_Filter *prev;
|
||||
Log_Filter_Kind kind;
|
||||
u64 tag_name_code;
|
||||
Log_Tag_Value tag_value;
|
||||
};
|
||||
|
||||
struct Log_Filter_Set{
|
||||
Log_Filter filters_memory[20];
|
||||
Log_Filter *free_filters;
|
||||
Log_Filter *first;
|
||||
Log_Filter *last;
|
||||
i32 count;
|
||||
i32 alter_counter;
|
||||
};
|
||||
|
||||
typedef i32 Log_Graph_List_Tab;
|
||||
enum{
|
||||
LogTab_ERROR,
|
||||
LogTab_Filters,
|
||||
LogTab_Previews,
|
||||
LogTab_COUNT,
|
||||
};
|
||||
|
||||
struct Log_Graph{
|
||||
b32 holding_temp;
|
||||
Temp_Memory temp;
|
||||
Rect_f32 layout_region;
|
||||
Face_ID face_id;
|
||||
i32 filter_alter_counter;
|
||||
i32 preview_alter_counter;
|
||||
Log_Graph_List_Tab tab;
|
||||
Rect_f32 details_region;
|
||||
Log_Event_List filtered_list;
|
||||
Log_Event_Ptr_Array event_array;
|
||||
Log_Graph_Thread_Bucket *first_bucket;
|
||||
Log_Graph_Thread_Bucket *last_bucket;
|
||||
i32 bucket_count;
|
||||
Log_Graph_Box *first_box;
|
||||
Log_Graph_Box *last_box;
|
||||
i32 box_count;
|
||||
f32 y_scroll;
|
||||
f32 max_y_scroll;
|
||||
Log_Event *selected_event;
|
||||
b32 has_unused_click;
|
||||
Vec2_f32 unused_click;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
// BOTTOM
|
||||
|
|
|
@ -17,11 +17,13 @@ in the set of default maps.
|
|||
void
|
||||
default_keys(Bind_Helper *context){
|
||||
fill_keys_default(context);
|
||||
fill_log_graph_command_map(context);
|
||||
}
|
||||
|
||||
void
|
||||
mac_default_keys(Bind_Helper *context){
|
||||
fill_keys_mac_default(context);
|
||||
fill_log_graph_command_map(context);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -365,33 +365,42 @@ lister_update_ui(Application_Links *app, View_ID view, Lister_State *state){
|
|||
Lister_Node_Ptr_Array substring_matches = {};
|
||||
substring_matches.node_ptrs = push_array(scratch, Lister_Node*, node_count);
|
||||
|
||||
String_Const_u8 key = state->lister.data.key_string.string;
|
||||
List_String_Const_u8 absolutes = {};
|
||||
string_list_push(scratch, &absolutes, string_u8_litexpr(""));
|
||||
List_String_Const_u8 splits = string_split(scratch, key, (u8*)"*", 1);
|
||||
b32 has_wildcard = (splits.node_count > 1);
|
||||
string_list_push(&absolutes, &splits);
|
||||
string_list_push(scratch, &absolutes, string_u8_litexpr(""));
|
||||
{
|
||||
Temp_Memory temp = begin_temp(scratch);
|
||||
String_Const_u8 key = state->lister.data.key_string.string;
|
||||
key = push_string_copy(scratch, key);
|
||||
string_mod_replace_character(key, '_', '*');
|
||||
string_mod_replace_character(key, ' ', '*');
|
||||
|
||||
for (Lister_Node *node = state->lister.data.options.first;
|
||||
node != 0;
|
||||
node = node->next){
|
||||
if (key.size == 0 ||
|
||||
string_wildcard_match_insensitive(absolutes, node->string)){
|
||||
List_String_Const_u8 absolutes = {};
|
||||
string_list_push(scratch, &absolutes, string_u8_litexpr(""));
|
||||
List_String_Const_u8 splits = string_split(scratch, key, (u8*)"*", 1);
|
||||
b32 has_wildcard = (splits.node_count > 1);
|
||||
string_list_push(&absolutes, &splits);
|
||||
string_list_push(scratch, &absolutes, string_u8_litexpr(""));
|
||||
|
||||
for (Lister_Node *node = state->lister.data.options.first;
|
||||
node != 0;
|
||||
node = node->next){
|
||||
String_Const_u8 node_string = node->string;
|
||||
if (string_match_insensitive(node_string, key) && exact_matches.count == 0){
|
||||
exact_matches.node_ptrs[exact_matches.count++] = node;
|
||||
}
|
||||
else if (!has_wildcard &&
|
||||
string_match_insensitive(string_prefix(node_string, key.size), key) &&
|
||||
node->string.size > key.size &&
|
||||
node->string.str[key.size] == '.'){
|
||||
before_extension_matches.node_ptrs[before_extension_matches.count++] = node;
|
||||
}
|
||||
else{
|
||||
substring_matches.node_ptrs[substring_matches.count++] = node;
|
||||
|
||||
if (key.size == 0 || string_wildcard_match_insensitive(absolutes, node_string)){
|
||||
if (string_match_insensitive(node_string, key) && exact_matches.count == 0){
|
||||
exact_matches.node_ptrs[exact_matches.count++] = node;
|
||||
}
|
||||
else if (!has_wildcard &&
|
||||
string_match_insensitive(string_prefix(node_string, key.size), key) &&
|
||||
node->string.size > key.size &&
|
||||
node->string.str[key.size] == '.'){
|
||||
before_extension_matches.node_ptrs[before_extension_matches.count++] = node;
|
||||
}
|
||||
else{
|
||||
substring_matches.node_ptrs[substring_matches.count++] = node;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
end_temp(temp);
|
||||
}
|
||||
|
||||
Lister_Node_Ptr_Array node_ptr_arrays[] = {
|
||||
|
|
|
@ -14,9 +14,9 @@
|
|||
//
|
||||
|
||||
internal void
|
||||
write_cursor_with_index(Cursor_With_Index *positions, i32 *count, i32 pos){
|
||||
positions[(*count)].index = *count;
|
||||
positions[(*count)].pos = pos;
|
||||
write_cursor_with_index(Cursor_With_Index *positions, i32 *count, i64 pos){
|
||||
positions[*count].index = *count;
|
||||
positions[*count].pos = pos;
|
||||
++(*count);
|
||||
}
|
||||
|
||||
|
@ -29,7 +29,7 @@ write_cursor_with_index(Cursor_With_Index *positions, i32 *count, i32 pos){
|
|||
internal void
|
||||
buffer_quick_sort_cursors(Cursor_With_Index *positions, i32 start, i32 pivot){
|
||||
i32 mid = start;
|
||||
i32 pivot_pos = positions[pivot].pos;
|
||||
i64 pivot_pos = positions[pivot].pos;
|
||||
for (i32 i = mid; i < pivot; ++i){
|
||||
if (positions[i].pos < pivot_pos){
|
||||
CursorSwap__(positions[mid], positions[i]);
|
||||
|
|
|
@ -19,7 +19,7 @@ enum{
|
|||
};
|
||||
|
||||
struct Cursor_With_Index{
|
||||
i32 pos;
|
||||
i64 pos;
|
||||
i32 index;
|
||||
};
|
||||
|
||||
|
|
|
@ -167,7 +167,7 @@ edit_fix_markers(System_Functions *system, Models *models, Editing_File *file, E
|
|||
panel = layout_get_next_open_panel(layout, panel)){
|
||||
View *view = panel->view;
|
||||
if (view->file == file){
|
||||
i32 cursor_pos = cursors[cursor_count++].pos;
|
||||
i64 cursor_pos = cursors[cursor_count++].pos;
|
||||
Full_Cursor new_cursor = file_compute_cursor(models, file, seek_pos(cursor_pos));
|
||||
|
||||
File_Edit_Positions edit_pos = view_get_edit_pos(view);
|
||||
|
@ -176,8 +176,8 @@ edit_fix_markers(System_Functions *system, Models *models, Editing_File *file, E
|
|||
view->mark = cursors[cursor_count++].pos;
|
||||
|
||||
i32 line_height = (i32)face->height;
|
||||
i32 top_left_pos = cursors[cursor_count++].pos;
|
||||
i32 top_left_target_pos = cursors[cursor_count++].pos;
|
||||
i64 top_left_pos = cursors[cursor_count++].pos;
|
||||
i64 top_left_target_pos = cursors[cursor_count++].pos;
|
||||
f32 new_y_val_aligned = 0;
|
||||
if (view->temp_view_top_left_pos != top_left_pos){
|
||||
Full_Cursor new_position_cursor = file_compute_cursor(models, file, seek_pos(top_left_pos));
|
||||
|
|
|
@ -482,7 +482,7 @@ file_create_from_string(System_Functions *system, Models *models, Editing_File *
|
|||
String_Const_u8 name = SCu8(file->unique_name.name_space, file->unique_name.name_size);
|
||||
name = string_escape(scratch, name);
|
||||
LogEventF(log_string(M), scratch, file->id, 0, system->thread_get_id(),
|
||||
"init file [last_write_time=0x%llx] [name=\"%.*s\"]",
|
||||
"init file [lwt=0x%llx] [name=\"%.*s\"]",
|
||||
attributes.last_write_time, string_expand(name));
|
||||
end_temp(temp);
|
||||
}
|
||||
|
|
|
@ -742,6 +742,7 @@ view_quit_ui(System_Functions *system, Models *models, View *view){
|
|||
view->ui_mode = false;
|
||||
if (view->ui_quit != 0){
|
||||
view->ui_quit(&models->app_links, view_get_id(&models->live_set, view));
|
||||
view->ui_quit = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -28,7 +28,7 @@ file_change_notification_check(System_Functions *system, Arena *scratch, Working
|
|||
file_add_dirty_flag(file, DirtyState_UnloadedChanges);
|
||||
if (file->external_mod_node.next == 0){
|
||||
LogEventF(log_string(M), &working_set->arena, file->id, 0, system->thread_get_id(),
|
||||
"external modification [last_write_time=0x%llx]", attributes.last_write_time);
|
||||
"external modification [lwt=0x%llx]", attributes.last_write_time);
|
||||
dll_insert_back(&working_set->has_external_mod_sentinel, &file->external_mod_node);
|
||||
system->signal_step(0);
|
||||
}
|
||||
|
|
|
@ -452,9 +452,9 @@ generate_remapping_code_and_data(Arena *arena){
|
|||
|
||||
bind(arena, mappings, '.', MDFR_ALT, change_to_build_panel);
|
||||
bind(arena, mappings, ',', MDFR_ALT, close_build_panel);
|
||||
bind(arena, mappings, 'n', MDFR_ALT, goto_next_jump_sticky);
|
||||
bind(arena, mappings, 'N', MDFR_ALT, goto_prev_jump_sticky);
|
||||
bind(arena, mappings, 'M', MDFR_ALT, goto_first_jump_sticky);
|
||||
bind(arena, mappings, 'n', MDFR_ALT, goto_next_jump);
|
||||
bind(arena, mappings, 'N', MDFR_ALT, goto_prev_jump);
|
||||
bind(arena, mappings, 'M', MDFR_ALT, goto_first_jump);
|
||||
bind(arena, mappings, 'm', MDFR_ALT, build_in_build_panel);
|
||||
bind(arena, mappings, 'b', MDFR_ALT, toggle_filebar);
|
||||
|
||||
|
@ -579,8 +579,8 @@ generate_remapping_code_and_data(Arena *arena){
|
|||
bind(arena, mappings, '1', MDFR_CTRL, view_buffer_other_panel);
|
||||
bind(arena, mappings, '2', MDFR_CTRL, swap_buffers_between_panels);
|
||||
|
||||
bind(arena, mappings, '\n', MDFR_NONE, newline_or_goto_position_sticky);
|
||||
bind(arena, mappings, '\n', MDFR_SHIFT, newline_or_goto_position_same_panel_sticky);
|
||||
bind(arena, mappings, '\n', MDFR_NONE, newline_or_goto_position);
|
||||
bind(arena, mappings, '\n', MDFR_SHIFT, newline_or_goto_position_same_panel);
|
||||
bind(arena, mappings, '>', MDFR_CTRL, view_jump_list_with_lister);
|
||||
bind(arena, mappings, ' ', MDFR_SHIFT, write_character);
|
||||
|
||||
|
@ -680,9 +680,9 @@ generate_remapping_code_and_data(Arena *arena){
|
|||
|
||||
bind(arena, mappings, '.', MDFR_CTRL, change_to_build_panel);
|
||||
bind(arena, mappings, ',', MDFR_CTRL, close_build_panel);
|
||||
bind(arena, mappings, 'n', MDFR_CTRL, goto_next_jump_sticky);
|
||||
bind(arena, mappings, 'N', MDFR_CTRL, goto_prev_jump_sticky);
|
||||
bind(arena, mappings, 'M', MDFR_CTRL, goto_first_jump_sticky);
|
||||
bind(arena, mappings, 'n', MDFR_CTRL, goto_next_jump);
|
||||
bind(arena, mappings, 'N', MDFR_CTRL, goto_prev_jump);
|
||||
bind(arena, mappings, 'M', MDFR_CTRL, goto_first_jump);
|
||||
bind(arena, mappings, 'm', MDFR_CTRL, build_in_build_panel);
|
||||
bind(arena, mappings, 'b', MDFR_CTRL, toggle_filebar);
|
||||
|
||||
|
@ -806,8 +806,8 @@ generate_remapping_code_and_data(Arena *arena){
|
|||
bind(arena, mappings, '1', MDFR_CMND, view_buffer_other_panel);
|
||||
bind(arena, mappings, '2', MDFR_CMND, swap_buffers_between_panels);
|
||||
|
||||
bind(arena, mappings, '\n', MDFR_NONE, newline_or_goto_position_sticky);
|
||||
bind(arena, mappings, '\n', MDFR_SHIFT, newline_or_goto_position_same_panel_sticky);
|
||||
bind(arena, mappings, '\n', MDFR_NONE, newline_or_goto_position);
|
||||
bind(arena, mappings, '\n', MDFR_SHIFT, newline_or_goto_position_same_panel);
|
||||
bind(arena, mappings, '>', MDFR_CMND, view_jump_list_with_lister);
|
||||
bind(arena, mappings, ' ', MDFR_SHIFT, write_character);
|
||||
|
||||
|
|
|
@ -914,8 +914,10 @@ win32_thread_wrapper(void *ptr){
|
|||
Win32_Object *object = (Win32_Object*)ptr;
|
||||
Thread_Function *proc = object->thread.proc;
|
||||
void *object_ptr = object->thread.ptr;
|
||||
EnterCriticalSection(&win32vars.thread_launch_mutex);
|
||||
win32vars.waiting_for_launch = false;
|
||||
WakeConditionVariable(&win32vars.thread_launch_cv);
|
||||
LeaveCriticalSection(&win32vars.thread_launch_mutex);
|
||||
proc(object_ptr);
|
||||
return(0);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue