From 688b4e2083494ec26e5b33d3d4cfab6aad04e7e0 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Thu, 14 Nov 2019 18:36:31 -0800 Subject: [PATCH] HMS Demo code fully ready --- custom/4coder_tutorial.cpp | 117 ++++++++++++++++++++-------- custom/4coder_tutorial.h | 2 + custom/generated/command_metadata.h | 18 +++-- 3 files changed, 100 insertions(+), 37 deletions(-) diff --git a/custom/4coder_tutorial.cpp b/custom/4coder_tutorial.cpp index 79b5b811..e4041e45 100644 --- a/custom/4coder_tutorial.cpp +++ b/custom/4coder_tutorial.cpp @@ -17,8 +17,9 @@ CUSTOM_DOC("If there is an active tutorial, kill it.") view_close(app, tutorial.view); } -function void -tutorial_activate(Application_Links *app){ +CUSTOM_COMMAND_SIG(tutorial_maximize) +CUSTOM_DOC("Expand the tutorial window") +{ if (!tutorial.in_tutorial){ return; } @@ -30,8 +31,9 @@ tutorial_activate(Application_Links *app){ tutorial.is_active = true; } -function void -tutorial_deactivate(Application_Links *app){ +CUSTOM_COMMAND_SIG(tutorial_minimize) +CUSTOM_DOC("Shrink the tutorial window") +{ if (!tutorial.in_tutorial){ return; } @@ -50,6 +52,16 @@ tutorial_deactivate(Application_Links *app){ function void tutorial_action(Application_Links *app, Tutorial_Action action){ switch (action){ + case TutorialAction_Minimize: + { + tutorial_minimize(app); + }break; + + case TutorialAction_Maximize: + { + tutorial_maximize(app); + }break; + case TutorialAction_Prev: { tutorial.slide_index -= 1; @@ -121,17 +133,6 @@ tutorial_render(Application_Links *app, Frame_Info frame_info, View_ID view_id){ Vec2_f32 title_p = V2f32(region.x0, panel_y0 + (metrics.line_height*2.f) - title_height*0.5f); - if (is_active_view){ - if (!tutorial.is_active){ - view_enqueue_command_function(app, view_id, tutorial_activate); - } - } - else{ - if (tutorial.is_active){ - view_enqueue_command_function(app, view_id, tutorial_deactivate); - } - } - tutorial.hover_action = TutorialAction_None; if (tutorial.is_active){ draw_fancy_block(app, 0, fcolor_zero(), &slide.long_details, title_p); @@ -147,6 +148,15 @@ tutorial_render(Application_Links *app, Frame_Info frame_info, View_ID view_id){ Mouse_State mouse = get_mouse_state(app); Vec2_f32 m_p = V2f32(mouse.p); + { + Rect_f32_Pair pair = rect_split_left_right(footer, b_width); + footer = pair.max; + footer.x0 += 10.f; + if (draw_button(app, pair.min, m_p, face, string_u8_litexpr("minimize"))){ + tutorial.hover_action = TutorialAction_Minimize; + } + } + { Rect_f32_Pair pair = rect_split_left_right(footer, b_width); footer = pair.max; @@ -196,8 +206,7 @@ tutorial_render(Application_Links *app, Frame_Info frame_info, View_ID view_id){ } function void -tutorial_run_loop(Application_Links *app) -{ +tutorial_run_loop(Application_Links *app){ View_ID view = get_this_ctx_view(app, Access_Always); View_Context ctx = view_current_context(app, view); ctx.render_caller = tutorial_render; @@ -206,6 +215,7 @@ tutorial_run_loop(Application_Links *app) tutorial.in_tutorial = true; tutorial.view = view; + tutorial_maximize(app); for (;;){ User_Input in = get_next_input(app, EventPropertyGroup_Any, 0); @@ -217,6 +227,7 @@ tutorial_run_loop(Application_Links *app) switch (in.event.kind){ case InputEventKind_MouseButton: { + tutorial_maximize(app); if (in.event.mouse.code == MouseCode_Left){ tutorial.depressed_action = tutorial.hover_action; } @@ -236,12 +247,7 @@ tutorial_run_loop(Application_Links *app) switch (in.event.core.code){ case CoreCode_ClickActivateView: { - tutorial_activate(app); - }break; - - case CoreCode_ClickDeactivateView: - { - tutorial_deactivate(app); + tutorial_maximize(app); }break; default: @@ -286,7 +292,6 @@ run_tutorial(Application_Links *app, Tutorial_Slide_Function **slides, i32 slide Panel_ID tutorial_panel = panel_get_child(app, root_panel, Side_Min); tutorial.view = panel_get_view(app, tutorial_panel, Access_Always); view_set_passive(app, tutorial.view, true); - tutorial_activate(app); tutorial.slide_index = 0; tutorial.slide_func_ptrs = slides; tutorial.slide_count = slide_count; @@ -603,19 +608,21 @@ hms_demo_tutorial_slide_6(Application_Links *app, Arena *arena){ string_u8_litexpr("\tBuffers that are indexed with information about nest structures can be equiped with the virtual whitespace layout algorithm.")); push_fancy_line(arena, long_details, face, fcolor_id(Stag_Default), + string_u8_litexpr("\tThe on screen layout of text is independent of the actual whitespace contents of the underlying text.")); + + push_fancy_line(arena, long_details, face, fcolor_id(Stag_Default), string_u8_litexpr("")); + + push_fancy_line(arena, long_details, face, fcolor_id(Stag_Keyword), string_u8_litexpr("\tTry inserting new scopes and parenthetical sections in a code file.")); push_fancy_line(arena, long_details, face, fcolor_id(Stag_Default), - string_u8_litexpr("\tObserve that indentation is updated automatically.")); + string_u8_litexpr("\t\tObserve that indentation is updated automatically.")); - push_fancy_line(arena, long_details, face, fcolor_id(Stag_Default), + push_fancy_line(arena, long_details, face, fcolor_id(Stag_Keyword), string_u8_litexpr("\tTry creating a line that is long enough to wrap around the edge.")); push_fancy_line(arena, long_details, face, fcolor_id(Stag_Default), - string_u8_litexpr("\tObserve that wrapped lines obey the same indentation rules as literal lines.")); - - push_fancy_line(arena, long_details, face, fcolor_id(Stag_Default), - string_u8_litexpr("\tThe on screen layout of text is independent of the actual whitespace contents of the underlying text.")); + string_u8_litexpr("\t\tObserve that wrapped lines obey the same indentation rules as literal lines.")); { Fancy_Line *line = push_fancy_line(arena, long_details, face, fcolor_id(Stag_Default)); @@ -624,6 +631,13 @@ hms_demo_tutorial_slide_6(Application_Links *app, Arena *arena){ push_fancy_stringf(arena, line, " to turn this feature on and off"); } + { + Fancy_Line *line = push_fancy_line(arena, long_details, face, fcolor_id(Stag_Default)); + push_fancy_stringf(arena, line, "\tUse the command "); + push_fancy_stringf(arena, line, fcolor_id(Stag_Pop2), "toggle_line_wrap"); + push_fancy_stringf(arena, line, " to see how layout changes with line wrapping on and off"); + } + push_fancy_line(arena, long_details, face, fcolor_id(Stag_Pop1), string_u8_litexpr("Auto Indentation:")); hms_demo_tutorial_binding_line(app, arena, long_details, face, @@ -702,7 +716,10 @@ hms_demo_tutorial_slide_8(Application_Links *app, Arena *arena){ string_u8_litexpr("Probably the biggest feature in 4coder is that so many things about it can be customized.")); push_fancy_line(arena, long_details, face, fcolor_id(Stag_Default), - string_u8_litexpr("The code project loaded for this demo is the 'default custom layer' everything here can be done differently as you see fit.")); + string_u8_litexpr("The project loaded for this demo is the 'default custom layer' everything here could be done differently, as you see fit.")); + + push_fancy_line(arena, long_details, face, fcolor_id(Stag_Default), + string_u8_litexpr("")); push_fancy_line(arena, long_details, face, fcolor_id(Stag_Pop1), string_u8_litexpr("Search for these commands to see some of the features available to customization:")); @@ -815,6 +832,42 @@ hms_demo_tutorial_slide_10(Application_Links *app, Arena *arena){ hms_demo_tutorial_binding_line(app, arena, long_details, face, "", "Tab", "in a code file this triggers the cyclic word complete, often a handy command"); + hms_demo_tutorial_binding_line(app, arena, long_details, face, + "Control", "F/R", "forward/reverse iterative search"); + + hms_demo_tutorial_binding_line(app, arena, long_details, face, + "Control", "A", "replace all instances of a string in the range"); + + hms_demo_tutorial_binding_line(app, arena, long_details, face, + "Control", "0", "insert an assignment to an empty struct or array"); + + hms_demo_tutorial_binding_line(app, arena, long_details, face, + "Alt", "0", "insert a #if 0 / #endif pair at the cursor and mark"); + + hms_demo_tutorial_binding_line(app, arena, long_details, face, + "Alt", "2", "open the corresponding .h/.cpp file to the current buffer in the second panel"); + + return(result); +} + +function Tutorial_Slide +hms_demo_tutorial_slide_11(Application_Links *app, Arena *arena){ + Tutorial_Slide result = {}; + + Face_ID face = get_face_id(app, 0); + tutorial_init_title_face(app); + + hms_demo_tutorial_short_details(app, arena, &result.short_details); + + Fancy_Block *long_details = &result.long_details; + hms_demo_tutorial_long_start(app, arena, long_details); + + push_fancy_line(arena, long_details, face, fcolor_id(Stag_Pop1), string_u8_litexpr("")); + + push_fancy_line(arena, long_details, face, fcolor_id(Stag_Pop1), string_u8_litexpr("")); + + push_fancy_line(arena, long_details, face, fcolor_id(Stag_Pop1), string_u8_litexpr("\t\tThanks for checking out the demo!")); + return(result); } @@ -842,6 +895,8 @@ CUSTOM_DOC("Tutorial for built in 4coder bindings and features.") hms_demo_tutorial_slide_9, // miscellanea hms_demo_tutorial_slide_10, + // end + hms_demo_tutorial_slide_11, }; run_tutorial(app, slides, ArrayCount(slides)); } diff --git a/custom/4coder_tutorial.h b/custom/4coder_tutorial.h index 3c58272f..f5a1c46b 100644 --- a/custom/4coder_tutorial.h +++ b/custom/4coder_tutorial.h @@ -10,6 +10,8 @@ typedef i32 Tutorial_Action; enum{ TutorialAction_None, + TutorialAction_Minimize, + TutorialAction_Maximize, TutorialAction_Prev, TutorialAction_Next, TutorialAction_Exit, diff --git a/custom/generated/command_metadata.h b/custom/generated/command_metadata.h index fab2f335..b7c6e889 100644 --- a/custom/generated/command_metadata.h +++ b/custom/generated/command_metadata.h @@ -2,7 +2,7 @@ #define command_id(c) (fcoder_metacmd_ID_##c) #define command_metadata(c) (&fcoder_metacmd_table[command_id(c)]) #define command_metadata_by_id(id) (&fcoder_metacmd_table[id]) -#define command_one_past_last_id 217 +#define command_one_past_last_id 219 #if defined(CUSTOM_COMMAND_SIG) #define PROC_LINKS(x,y) x #else @@ -223,6 +223,8 @@ CUSTOM_COMMAND_SIG(miblo_increment_time_stamp_minute); CUSTOM_COMMAND_SIG(miblo_decrement_time_stamp_minute); CUSTOM_COMMAND_SIG(profile_inspect); CUSTOM_COMMAND_SIG(kill_tutorial); +CUSTOM_COMMAND_SIG(tutorial_maximize); +CUSTOM_COMMAND_SIG(tutorial_minimize); CUSTOM_COMMAND_SIG(hms_demo_tutorial); CUSTOM_COMMAND_SIG(default_startup); CUSTOM_COMMAND_SIG(default_try_exit); @@ -238,7 +240,7 @@ char *source_name; i32 source_name_len; i32 line_number; }; -static Command_Metadata fcoder_metacmd_table[217] = { +static Command_Metadata fcoder_metacmd_table[219] = { { PROC_LINKS(default_view_input_handler, 0), false, "default_view_input_handler", 26, "Input consumption loop for default view behavior", 48, "w:\\4ed\\code\\custom\\4coder_default_hooks.cpp", 43, 56 }, { PROC_LINKS(profile_enable, 0), false, "profile_enable", 14, "Allow 4coder's self profiler to gather new profiling information.", 65, "w:\\4ed\\code\\custom\\4coder_profile.cpp", 37, 207 }, { PROC_LINKS(profile_disable, 0), false, "profile_disable", 15, "Prevent 4coder's self profiler from gathering new profiling information.", 72, "w:\\4ed\\code\\custom\\4coder_profile.cpp", 37, 214 }, @@ -453,7 +455,9 @@ static Command_Metadata fcoder_metacmd_table[217] = { { PROC_LINKS(miblo_decrement_time_stamp_minute, 0), false, "miblo_decrement_time_stamp_minute", 33, "Decrement a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "w:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 249 }, { PROC_LINKS(profile_inspect, 0), true, "profile_inspect", 15, "Inspect all currently collected profiling information in 4coder's self profiler.", 80, "w:\\4ed\\code\\custom\\4coder_profile_inspect.cpp", 45, 779 }, { PROC_LINKS(kill_tutorial, 0), false, "kill_tutorial", 13, "If there is an active tutorial, kill it.", 40, "w:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 9 }, -{ PROC_LINKS(hms_demo_tutorial, 0), false, "hms_demo_tutorial", 17, "Tutorial for built in 4coder bindings and features.", 51, "w:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 821 }, +{ PROC_LINKS(tutorial_maximize, 0), false, "tutorial_maximize", 17, "Expand the tutorial window", 26, "w:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 20 }, +{ PROC_LINKS(tutorial_minimize, 0), false, "tutorial_minimize", 17, "Shrink the tutorial window", 26, "w:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 34 }, +{ PROC_LINKS(hms_demo_tutorial, 0), false, "hms_demo_tutorial", 17, "Tutorial for built in 4coder bindings and features.", 51, "w:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 874 }, { PROC_LINKS(default_startup, 0), false, "default_startup", 15, "Default command for responding to a startup event", 49, "w:\\4ed\\code\\custom\\4coder_default_hooks.cpp", 43, 7 }, { PROC_LINKS(default_try_exit, 0), false, "default_try_exit", 16, "Default command for responding to a try-exit event", 50, "w:\\4ed\\code\\custom\\4coder_default_hooks.cpp", 43, 22 }, }; @@ -671,7 +675,9 @@ static i32 fcoder_metacmd_ID_miblo_increment_time_stamp_minute = 210; static i32 fcoder_metacmd_ID_miblo_decrement_time_stamp_minute = 211; static i32 fcoder_metacmd_ID_profile_inspect = 212; static i32 fcoder_metacmd_ID_kill_tutorial = 213; -static i32 fcoder_metacmd_ID_hms_demo_tutorial = 214; -static i32 fcoder_metacmd_ID_default_startup = 215; -static i32 fcoder_metacmd_ID_default_try_exit = 216; +static i32 fcoder_metacmd_ID_tutorial_maximize = 214; +static i32 fcoder_metacmd_ID_tutorial_minimize = 215; +static i32 fcoder_metacmd_ID_hms_demo_tutorial = 216; +static i32 fcoder_metacmd_ID_default_startup = 217; +static i32 fcoder_metacmd_ID_default_try_exit = 218; #endif