From 4dd7703810dd32b38854bcbd0d67565f7e079f01 Mon Sep 17 00:00:00 2001 From: sixtenhugosson Date: Tue, 27 Jun 2023 16:14:28 +0200 Subject: [PATCH] Addded scrollable boxes. --- code/core/core_math.cpp | 36 +++++ code/core/core_math.h | 12 ++ code/core/core_string.cpp | 2 +- code/gen.cpp | 2 +- code/gen_ui.cpp | 2 + code/generated/vn_generated_ui.cpp | 86 ++++++++++++ code/generated/vn_generated_ui.h | 6 + code/vn.cpp | 15 ++- code/vn_font.cpp | 1 + code/vn_font.h | 1 + code/vn_render.cpp | 2 +- code/vn_render.h | 3 + code/vn_ui.cpp | 105 +++++++++------ code/vn_ui.h | 67 ++++++---- code/vn_ui_utils.cpp | 204 +++++++++++++++++++++++++---- code/vn_ui_utils.h | 56 ++++++++ code/vn_workspace.cpp | 12 +- code/vn_workspace_view.cpp | 55 ++++---- code/vn_workspace_view.h | 6 + config.vn | 1 + fonts/PatrickHand-Regular.ttf | Bin 0 -> 212112 bytes todo.txt | 5 +- 22 files changed, 558 insertions(+), 121 deletions(-) create mode 100644 code/vn_ui_utils.h create mode 100644 fonts/PatrickHand-Regular.ttf diff --git a/code/core/core_math.cpp b/code/core/core_math.cpp index 591d999..a99a57f 100644 --- a/code/core/core_math.cpp +++ b/code/core/core_math.cpp @@ -507,6 +507,12 @@ inline r32 DimOfRange(range1_r32 Range) return(Result); } +inline range1_r32 Intersection(range1_r32 A, range1_r32 B) +{ + range1_r32 Result = {Max(A.Min, B.Min), Min(A.Max, B.Max)}; + return(Result); +} + inline range1_s32 Range1S32(s32 Min, s32 Max) { range1_s32 Result = {Min, Max}; @@ -525,6 +531,12 @@ inline s32 DimOfRange(range1_s32 Range) return(Result); } +inline range1_s32 Intersection(range1_s32 A, range1_s32 B) +{ + range1_s32 Result = {Max(A.Min, B.Min), Min(A.Max, B.Max)}; + return(Result); +} + inline range1_s64 Range1S64(s64 Min, s64 Max) { range1_s64 Result = {Min, Max}; @@ -543,6 +555,12 @@ inline s64 DimOfRange(range1_s64 Range) return(Result); } +inline range1_s64 Intersection(range1_s64 A, range1_s64 B) +{ + range1_s64 Result = {Max(A.Min, B.Min), Min(A.Max, B.Max)}; + return(Result); +} + inline range2_r32 Range2R32(v2_r32 Min, v2_r32 Max) { range2_r32 Result = {Min, Max}; @@ -562,6 +580,12 @@ inline v2_r32 DimOfRange(range2_r32 Range) return(Result); } +inline range2_r32 Intersection(range2_r32 A, range2_r32 B) +{ + range2_r32 Result = {Max(A.Min, B.Min), Min(A.Max, B.Max)}; + return(Result); +} + inline range2_s32 Range2S32(v2_s32 Min, v2_s32 Max) { range2_s32 Result = {Min, Max}; @@ -581,6 +605,12 @@ inline v2_s32 DimOfRange(range2_s32 Range) return(Result); } +inline range2_s32 Intersection(range2_s32 A, range2_s32 B) +{ + range2_s32 Result = {Max(A.Min, B.Min), Min(A.Max, B.Max)}; + return(Result); +} + inline range2_s64 Range2S64(v2_s64 Min, v2_s64 Max) { range2_s64 Result = {Min, Max}; @@ -598,4 +628,10 @@ inline v2_s64 DimOfRange(range2_s64 Range) { v2_s64 Result = Range.Max - Range.Min; return(Result); +} + +inline range2_s64 Intersection(range2_s64 A, range2_s64 B) +{ + range2_s64 Result = {Max(A.Min, B.Min), Min(A.Max, B.Max)}; + return(Result); } \ No newline at end of file diff --git a/code/core/core_math.h b/code/core/core_math.h index 3f580fe..3294946 100644 --- a/code/core/core_math.h +++ b/code/core/core_math.h @@ -209,6 +209,12 @@ inline r32 LinearBlend(r32 a, r32 b, r32 x) { r32 Result = a + (b-a)*x; return(R inline r32 Min(r32 A, r32 B) { r32 Result = Minimum(A, B); return(Result); } inline r32 Max(r32 A, r32 B) { r32 Result = Maximum(A, B); return(Result); } +inline s32 Min(s32 A, s32 B) { s32 Result = Minimum(A, B); return(Result); } +inline s32 Max(s32 A, s32 B) { s32 Result = Maximum(A, B); return(Result); } + +inline s64 Min(s64 A, s64 B) { s64 Result = Minimum(A, B); return(Result); } +inline s64 Max(s64 A, s64 B) { s64 Result = Maximum(A, B); return(Result); } + //- sixten: Vector functions inline v2_r32 V2R32(r32 x, r32 y); @@ -322,26 +328,32 @@ inline v4_s64 Max(v4_s64 A, v4_s64 B); inline range1_r32 Range1R32(r32 Min, r32 Max); inline b32 InRange(range1_r32 Range, r32 Value); inline r32 DimOfRange(range1_r32 Range); +inline range1_r32 Intersection(range1_r32 A, range1_r32 B); inline range1_s32 Range1S32(s32 Min, s32 Max); inline b32 InRange(range1_s32 Range, s32 Value); inline s32 DimOfRange(range1_s32 Range); +inline range1_s32 Intersection(range1_s32 A, range1_s32 B); inline range1_s64 Range1S64(s64 Min, s64 Max); inline b32 InRange(range1_s64 Range, s64 Value); inline s64 DimOfRange(range1_s64 Range); +inline range1_s64 Intersection(range1_s64 A, range1_s64 B); inline range2_r32 Range2R32(v2_r32 Min, v2_r32 Max); inline b32 InRange(range2_r32 Range, v2_r32 Value); inline v2_r32 DimOfRange(range2_r32 Range); +inline range2_r32 Intersection(range2_r32 A, range2_r32 B); inline range2_s32 Range2S32(v2_s32 Min, v2_s32 Max); inline b32 InRange(range2_s32 Range, v2_s32 Value); inline v2_s32 DimOfRange(range2_s32 Range); +inline range2_s32 Intersection(range2_s32 A, range2_s32 B); inline range2_s64 Range2S64(v2_s64 Min, v2_s64 Max); inline b32 InRange(range2_s64 Range, v2_s64 Value); inline v2_s64 DimOfRange(range2_s64 Range); +inline range2_s64 Intersection(range2_s64 A, range2_s64 B); //- sixten: Shorthand base types diff --git a/code/core/core_string.cpp b/code/core/core_string.cpp index c7edf34..88349a1 100644 --- a/code/core/core_string.cpp +++ b/code/core/core_string.cpp @@ -262,7 +262,7 @@ static string ConvertS64ToString(memory_arena *Arena, s64 Value) Value = -Value; } - s64 DigitCount = (s64)Floor(Log(Max(Value, 1)) / Log(10)) + 1; + s64 DigitCount = (s64)Floor(Log(Max(Value, 1LL)) / Log(10)) + 1; s64 TotalBufferCount = DigitCount + IsNegative; diff --git a/code/gen.cpp b/code/gen.cpp index efbd7f5..0de6dd2 100644 --- a/code/gen.cpp +++ b/code/gen.cpp @@ -1,4 +1,4 @@ -#include "vn_core.h" +#include "core/core.h" #include #define ArrayCount(Array) (sizeof(Array)/sizeof((Array)[0])) diff --git a/code/gen_ui.cpp b/code/gen_ui.cpp index f37d52c..00daa6f 100644 --- a/code/gen_ui.cpp +++ b/code/gen_ui.cpp @@ -20,6 +20,8 @@ ui_style_stack UIStyleStacks[] = { "CornerRadius", "r32", "CornerRadius" }, { "Font", "font_id", "Font" }, { "FontSize", "r32", "FontSize" }, + { "OffsetX", "r32", "Offset.x" }, + { "OffsetY", "r32", "Offset.y" }, }; static void GenUI(void) diff --git a/code/generated/vn_generated_ui.cpp b/code/generated/vn_generated_ui.cpp index 83ca56b..d275bb9 100644 --- a/code/generated/vn_generated_ui.cpp +++ b/code/generated/vn_generated_ui.cpp @@ -453,6 +453,76 @@ inline r32 UI_TopFontSize(void) #define UI_FontSize(Element) DeferLoop(UI_PushFontSize(Element), UI_PopFontSize()) +inline void UI_PushOffsetX(r32 Element) +{ + ui *UI = UI_GetState(); + Assert(UI->Stacks.OffsetXStackUsed + 1 < ArrayCount(UI->Stacks.OffsetXStack)); + UI->Stacks.OffsetXStack[UI->Stacks.OffsetXStackUsed++] = Element; +} + +inline void UI_PopOffsetX(void) +{ + ui *UI = UI_GetState(); + Assert(UI->Stacks.OffsetXStackUsed > 0); + --UI->Stacks.OffsetXStackUsed; +} + +inline void UI_SetNextOffsetX(r32 Element) +{ + ui *UI = UI_GetState(); + UI_PushOffsetX(Element); + UI->Stacks.AutoPopOffsetX = true; +} + +inline r32 UI_FirstOffsetX(void) +{ + ui *UI = UI_GetState(); + return(UI->Stacks.OffsetXStack[0]); +} + +inline r32 UI_TopOffsetX(void) +{ + ui *UI = UI_GetState(); + return(UI->Stacks.OffsetXStack[UI->Stacks.OffsetXStackUsed - 1]); +} + +#define UI_OffsetX(Element) DeferLoop(UI_PushOffsetX(Element), UI_PopOffsetX()) + +inline void UI_PushOffsetY(r32 Element) +{ + ui *UI = UI_GetState(); + Assert(UI->Stacks.OffsetYStackUsed + 1 < ArrayCount(UI->Stacks.OffsetYStack)); + UI->Stacks.OffsetYStack[UI->Stacks.OffsetYStackUsed++] = Element; +} + +inline void UI_PopOffsetY(void) +{ + ui *UI = UI_GetState(); + Assert(UI->Stacks.OffsetYStackUsed > 0); + --UI->Stacks.OffsetYStackUsed; +} + +inline void UI_SetNextOffsetY(r32 Element) +{ + ui *UI = UI_GetState(); + UI_PushOffsetY(Element); + UI->Stacks.AutoPopOffsetY = true; +} + +inline r32 UI_FirstOffsetY(void) +{ + ui *UI = UI_GetState(); + return(UI->Stacks.OffsetYStack[0]); +} + +inline r32 UI_TopOffsetY(void) +{ + ui *UI = UI_GetState(); + return(UI->Stacks.OffsetYStack[UI->Stacks.OffsetYStackUsed - 1]); +} + +#define UI_OffsetY(Element) DeferLoop(UI_PushOffsetY(Element), UI_PopOffsetY()) + inline void UI_ApplyStyles(ui_box *Box) { @@ -561,4 +631,20 @@ inline void UI_ApplyStyles(ui_box *Box) UI->Stacks.AutoPopFontSize = false; } + Assert(UI->Stacks.OffsetXStackUsed > 0); + Box->Offset.x = UI->Stacks.OffsetXStack[UI->Stacks.OffsetXStackUsed - 1]; + if(UI->Stacks.AutoPopOffsetX) + { + UI_PopOffsetX(); + UI->Stacks.AutoPopOffsetX = false; + } + + Assert(UI->Stacks.OffsetYStackUsed > 0); + Box->Offset.y = UI->Stacks.OffsetYStack[UI->Stacks.OffsetYStackUsed - 1]; + if(UI->Stacks.AutoPopOffsetY) + { + UI_PopOffsetY(); + UI->Stacks.AutoPopOffsetY = false; + } + } diff --git a/code/generated/vn_generated_ui.h b/code/generated/vn_generated_ui.h index a4f025f..44cbece 100644 --- a/code/generated/vn_generated_ui.h +++ b/code/generated/vn_generated_ui.h @@ -39,4 +39,10 @@ struct ui_style_stacks r32 FontSizeStack[64]; s32 FontSizeStackUsed; b32 AutoPopFontSize; + r32 OffsetXStack[64]; + s32 OffsetXStackUsed; + b32 AutoPopOffsetX; + r32 OffsetYStack[64]; + s32 OffsetYStackUsed; + b32 AutoPopOffsetY; }; diff --git a/code/vn.cpp b/code/vn.cpp index be0cd34..fd45005 100644 --- a/code/vn.cpp +++ b/code/vn.cpp @@ -7,6 +7,7 @@ struct debug_settings { b32 RenderUIDebugRects; b32 RenderFPSCounter; + b32 ListHotAndActive; }; per_thread debug_settings *DEBUG_DebugSettings = 0; @@ -18,6 +19,7 @@ per_thread debug_settings *DEBUG_DebugSettings = 0; #include "vn_font.h" #include "vn_text_op.h" #include "vn_ui.h" +#include "vn_ui_utils.h" #include "vn_workspace.h" #include "vn_theme_dark.h" #include "vn_animation_curve.h" @@ -66,6 +68,7 @@ VN_UPDATE_AND_RENDER(VN_UpdateAndRender) #if VN_INTERNAL Config_BindB32(State->Config, StrLit("Dev/RenderUIDebugRects"), &State->DebugSettings.RenderUIDebugRects, 0); Config_BindB32(State->Config, StrLit("Dev/RenderFPSCounter"), &State->DebugSettings.RenderFPSCounter, 0); + Config_BindB32(State->Config, StrLit("Dev/ListHotAndActive"), &State->DebugSettings.ListHotAndActive, 0); #endif Config_ReadFile(State->Config, StrLit("config.vn")); @@ -79,13 +82,13 @@ VN_UPDATE_AND_RENDER(VN_UpdateAndRender) #endif AnimationCurve_NewFrame(&State->AnimationCurveState, Input->dtForFrame); - UI_NewFrame(&State->UI, Input->EventList, Input->MouseP); + UI_NewFrame(&State->UI, Input->EventList, Input->MouseP, State->GlyphAtlas); UI_BeginBuild(RenderCommands->RenderDim); { Workspace_Update(&State->Workspace, RenderCommands, Input, State->GlyphAtlas); } - UI_EndBuild(State->GlyphAtlas); + UI_EndBuild(); for(platform_event *Event = Input->EventList->First; @@ -105,4 +108,12 @@ VN_UPDATE_AND_RENDER(VN_UpdateAndRender) PushClear(&Group, V3(0.1, 0.1, 0.1)); UI_RenderFrame(&Group, State->GlyphAtlas); + + if(DEBUG_DebugSettings->ListHotAndActive) + { + PushText(&Group, State->GlyphAtlas, Font_Regular, V2(5, RenderCommands->RenderDim.y - 20), 15, Color_Grey, + PushFormat(&State->UI.FrameArena, "Hot: %S:%llu", UI_GetBoxNameByKey(UI_GetHot()), UI_GetHot())); + PushText(&Group, State->GlyphAtlas, Font_Regular, V2(5, RenderCommands->RenderDim.y - 40), 15, Color_Grey, + PushFormat(&State->UI.FrameArena, "Active: %S:%llu", UI_GetBoxNameByKey(UI_GetActive()), UI_GetActive())); + } } \ No newline at end of file diff --git a/code/vn_font.cpp b/code/vn_font.cpp index 68d2124..eb8368e 100644 --- a/code/vn_font.cpp +++ b/code/vn_font.cpp @@ -116,6 +116,7 @@ static glyph_atlas *CreateGlyphAtlas(vn_render_commands *RenderCommands, Atlas->Fonts[Font_Regular].Data = Platform_ReadEntireFile(&Atlas->Arena, StrLit("fonts/Roboto-Regular.ttf")); Atlas->Fonts[Font_Bold].Data = Platform_ReadEntireFile(&Atlas->Arena, StrLit("fonts/Roboto-Bold.ttf")); Atlas->Fonts[Font_Monospace].Data = Platform_ReadEntireFile(&Atlas->Arena, StrLit("fonts/Liberation-Mono.ttf")); + Atlas->Fonts[Font_Hand].Data = Platform_ReadEntireFile(&Atlas->Arena, StrLit("fonts/PatrickHand-Regular.ttf")); Atlas->Fonts[Font_Icons].Data = Platform_ReadEntireFile(&Atlas->Arena, StrLit("fonts/icons.ttf")); for(s32 FontIndex = 0; diff --git a/code/vn_font.h b/code/vn_font.h index da4fdca..8d33dbb 100644 --- a/code/vn_font.h +++ b/code/vn_font.h @@ -8,6 +8,7 @@ enum font_id Font_Regular, Font_Bold, Font_Monospace, + Font_Hand, Font_Icons, Font_Count, diff --git a/code/vn_render.cpp b/code/vn_render.cpp index 3b62690..09ab620 100644 --- a/code/vn_render.cpp +++ b/code/vn_render.cpp @@ -127,7 +127,7 @@ inline void PushTexturedQuad(render_group *Group, v2 DestMin = Max(Dest.Min, Clip.Min); v2 DestMax = Min(Dest.Max, Clip.Max); - //if(InRange(Clip, P) || InRange(Clip, P + Dim)) + if(InRange(Clip, P) || InRange(Clip, P + Dim)) { v2 HalfSize = Dim*0.5; diff --git a/code/vn_render.h b/code/vn_render.h index eae4e40..6375b57 100644 --- a/code/vn_render.h +++ b/code/vn_render.h @@ -8,6 +8,9 @@ #define ColorFromHex(Value) V4((((Value) >> 24) & 0xFF) / 255.0, (((Value) >> 16) & 0xFF) / 255.0, (((Value) >> 8) & 0xFF) / 255.0, (((Value) >> 0) & 0xFF) / 255.0) +#define Brighten(Color, Amount) (Color*(Amount)) +#define Darken(Color, Amount) (Color*(1.0/(Amount))) + read_only v4 Color_Black = V4(0, 0, 0, 1); read_only v4 Color_White = V4(1, 1, 1, 1); read_only v4 Color_Grey = V4(0.5, 0.5, 0.5, 1); diff --git a/code/vn_ui.cpp b/code/vn_ui.cpp index aad2251..391bf84 100644 --- a/code/vn_ui.cpp +++ b/code/vn_ui.cpp @@ -30,7 +30,6 @@ inline ui_size UI_ChildrenSum(r32 Value, r32 Strictness) return(Result); } - per_thread ui *ThreadLocal_UI; inline void UI_SetState(ui *UI) @@ -304,26 +303,36 @@ inline void UI_SetNextHot(ui_key Key) } } -inline b32 UI_ChildrenContainsP(ui_box *Box, v2 P) +// sixten(NOTE): ClippingRect = Intersection(TrueClippingRect, Parent->Rect); +static b32 UI_ChildrenContainsP(ui_box *Parent, v2 P, range2_r32 Clip) { b32 Result = false; - if(Box->Flags & UI_BoxFlag_Clickable && InRange(Box->Rect, P)) + for(ui_box *Child = Parent->First; + Child != 0; + Child = Child->Next) { - Result = true; - } - else - { - if(Box->First) - { - Result = UI_ChildrenContainsP(Box->First, P); - } + range2_r32 IntersectionRect = Intersection(Clip, Child->Rect); - if(!Result) + if(Child->Flags & UI_BoxFlag_Clickable && InRange(IntersectionRect, P)) { - if(Box->Next) + Result = true; + break; + } + else + { + if(Child->Flags & UI_BoxFlag_Clip) { - Result = UI_ChildrenContainsP(Box->Next, P); + Result = UI_ChildrenContainsP(Child, P, IntersectionRect); + } + else + { + Result = UI_ChildrenContainsP(Child, P, Clip); + } + + if(Result) + { + break; } } } @@ -337,9 +346,19 @@ static ui_signal UI_SignalFromBox(ui_box *Box) ui_signal Signal = {}; - Signal.Hovering = InRange(Box->Rect, UI->MouseP) && - !(Box->First && UI_ChildrenContainsP(Box->First, UI->MouseP)) && - !(Box->Next && UI_ChildrenContainsP(Box->Next, UI->MouseP)); + // sixten: Gather the clipping rects of all the parents. + range2_r32 ClippedRect = Box->Rect; + for(ui_box *Parent = Box->Parent; + Parent != 0; + Parent = Parent->Parent) + { + if(Parent->Flags & UI_BoxFlag_Clip) + { + ClippedRect = Intersection(ClippedRect, Parent->Rect); + } + } + + Signal.Hovering = InRange(ClippedRect, UI->MouseP) && !UI_ChildrenContainsP(Box, UI->MouseP, ClippedRect); // sixten: Make sure the tooltip is not overlapping. { @@ -356,9 +375,10 @@ static ui_signal UI_SignalFromBox(ui_box *Box) } } - if(!FoundTooltip && UI->TooltipNode->First) + if(!FoundTooltip) { - Signal.Hovering &= ~UI_ChildrenContainsP(UI->TooltipNode->First, UI->MouseP); + Signal.Hovering &= ~UI_ChildrenContainsP(UI->TooltipNode, UI->MouseP, + Range2R32(V2(0, 0), V2(InfinityR32, InfinityR32))); } } @@ -585,7 +605,8 @@ static void UI_DrawBox(ui_box *Box, render_group *Group, glyph_atlas *GlyphAtlas if(Box->Flags & UI_BoxFlag_Clip) { - PushClip(Group, Box->Rect); + range2_r32 Rect = Intersection(Group->ClipStack[Group->ClipStackUsed], Box->Rect); + PushClip(Group, Rect); } for(ui_box *Child = Box->First; @@ -622,12 +643,13 @@ static void UI_DrawBox(ui_box *Box, render_group *Group, glyph_atlas *GlyphAtlas } } -static r32 UI_CalculateChildrenSum(ui_box *Box, axis2 Axis, glyph_atlas *Atlas); +static r32 UI_CalculateChildrenSum(ui_box *Box, axis2 Axis); -static r32 UI_CalculateBoxSize(ui_box *Box, axis2 Axis, glyph_atlas *Atlas) +static r32 UI_CalculateBoxSize(ui_box *Box, axis2 Axis) { r32 Result = 0; + ui *UI = UI_GetState(); ui_box *Parent = Box->Parent; switch(Box->SemanticSize[Axis].Type) @@ -639,6 +661,8 @@ static r32 UI_CalculateBoxSize(ui_box *Box, axis2 Axis, glyph_atlas *Atlas) case UI_SizeType_TextContent: { + glyph_atlas *Atlas = UI->GlyphAtlas; + Result = ((Axis == Axis2_X) ? CalculateRasterizedTextWidth(Atlas, Box->Font, Box->FontSize, Box->String) : CalculateRasterizedTextHeight(Atlas, Box->Font, Box->FontSize, Box->String)) + @@ -661,7 +685,7 @@ static r32 UI_CalculateBoxSize(ui_box *Box, axis2 Axis, glyph_atlas *Atlas) case UI_SizeType_ChildrenSum: { - Result = UI_CalculateChildrenSum(Box, Axis, Atlas)*Box->SemanticSize[Axis].Value; + Result = UI_CalculateChildrenSum(Box, Axis)*Box->SemanticSize[Axis].Value; } break; InvalidDefaultCase; @@ -670,7 +694,7 @@ static r32 UI_CalculateBoxSize(ui_box *Box, axis2 Axis, glyph_atlas *Atlas) return(Result); } -static r32 UI_CalculateChildrenSum(ui_box *Box, axis2 Axis, glyph_atlas *Atlas) +static r32 UI_CalculateChildrenSum(ui_box *Box, axis2 Axis) { r32 Result = 0; @@ -680,7 +704,7 @@ static r32 UI_CalculateChildrenSum(ui_box *Box, axis2 Axis, glyph_atlas *Atlas) Child != 0; Child = Child->Next) { - Result += UI_CalculateBoxSize(Child, Axis, Atlas); + Result += UI_CalculateBoxSize(Child, Axis); } } else @@ -689,31 +713,33 @@ static r32 UI_CalculateChildrenSum(ui_box *Box, axis2 Axis, glyph_atlas *Atlas) Child != 0; Child = Child->Next) { - Result = Max(Result, UI_CalculateBoxSize(Child, Axis, Atlas)); + Result = Max(Result, UI_CalculateBoxSize(Child, Axis)); } } return(Result); } -static void UI_LayoutBox(ui_box *Box, axis2 Axis, glyph_atlas *Atlas) +static void UI_LayoutBox(ui_box *Box) { for(ui_box *Child = Box->First; Child != 0; Child = Child->Next) { - Child->ComputedDim.E[Axis] = UI_CalculateBoxSize(Child, Axis, Atlas); + Child->ComputedDim.E[Axis2_X] = UI_CalculateBoxSize(Child, Axis2_X); + Child->ComputedDim.E[Axis2_Y] = UI_CalculateBoxSize(Child, Axis2_Y); } - UI_SolveSizeViolations(Box, Axis); + UI_SolveSizeViolations(Box, Axis2_X); + UI_SolveSizeViolations(Box, Axis2_Y); for(ui_box *Child = Box->First; - Child; + Child != 0; Child = Child->Next) { - Child->Rect.Min.E[Axis] = Box->Rect.Min.E[Axis] + Child->ComputedRelativeP.E[Axis]; - Child->Rect.Max.E[Axis] = Child->Rect.Min.E[Axis] + Child->ComputedDim.E[Axis]; + Child->Rect.Min = Box->Rect.Min + Child->ComputedRelativeP + Box->Offset; + Child->Rect.Max = Child->Rect.Min + Child->ComputedDim; - UI_LayoutBox(Child, Axis, Atlas); + UI_LayoutBox(Child); } } @@ -734,6 +760,8 @@ static void UI_BeginBuild(v2 ScreenDim) UI_PushCornerRadius(0); UI_PushFont(Font_Regular); UI_PushFontSize(15.0f); + UI_PushOffsetX(0); + UI_PushOffsetY(0); UI->RootNode = UI_MakeBox(UI_BoxFlag_DrawBackground, StrLit("UI Root Node")); UI->Stacks.ParentStack[0] = UI->RootNode; @@ -746,7 +774,7 @@ static void UI_BeginBuild(v2 ScreenDim) UI->NextHotSet = false; } -static void UI_EndBuild(glyph_atlas *GlyphAtlas) +static void UI_EndBuild(void) { ui *UI = UI_GetState(); @@ -770,9 +798,10 @@ static void UI_EndBuild(glyph_atlas *GlyphAtlas) UI_PopCornerRadius(); UI_PopFont(); UI_PopFontSize(); + UI_PopOffsetX(); + UI_PopOffsetY(); - UI_LayoutBox(UI->RootNode, Axis2_X, GlyphAtlas); - UI_LayoutBox(UI->RootNode, Axis2_Y, GlyphAtlas); + UI_LayoutBox(UI->RootNode); } static void UI_RenderFrame(render_group *Group, glyph_atlas *GlyphAtlas) @@ -804,7 +833,7 @@ inline void UI_ScanForHotAndActive(ui_box *Box, b32 *FoundHot, b32 *FoundActive) } } -static void UI_NewFrame(ui *UI, platform_event_list *EventList, v2 MouseP) +static void UI_NewFrame(ui *UI, platform_event_list *EventList, v2 MouseP, glyph_atlas *GlyphAtlas) { UI_SetState(UI); @@ -818,6 +847,8 @@ static void UI_NewFrame(ui *UI, platform_event_list *EventList, v2 MouseP) UI->EventList = EventList; UI->MouseP = MouseP; + UI->GlyphAtlas = GlyphAtlas; + // sixten: Make sure that the hot and active boxes are valid. if(UI->RootNode) { diff --git a/code/vn_ui.h b/code/vn_ui.h index 0684e91..f029bae 100644 --- a/code/vn_ui.h +++ b/code/vn_ui.h @@ -3,6 +3,7 @@ #ifndef VN_UI_H #define VN_UI_H +//- sixten: Keying struct ui_key { u64 Value; @@ -14,23 +15,7 @@ inline b32 AreEqual(ui_key A, ui_key B) return(Result); } -enum -{ - UI_BoxFlag_Clickable = (1 << 0), - UI_BoxFlag_DrawText = (1 << 1), - UI_BoxFlag_DrawBorder = (1 << 2), - UI_BoxFlag_DrawBackground = (1 << 3), - UI_BoxFlag_DrawDropShadow = (1 << 4), - UI_BoxFlag_Clip = (1 << 5), - UI_BoxFlag_HotAnimation = (1 << 6), - UI_BoxFlag_ActiveAnimation = (1 << 7), - UI_BoxFlag_OverflowX = (1 << 8), - UI_BoxFlag_OverflowY = (1 << 9), - UI_BoxFlag_FloatingX = (1 << 10), - UI_BoxFlag_FloatingY = (1 << 11), -}; -typedef u32 ui_box_flags; - +//- sixten: Semantic sizing enum ui_size_type { UI_SizeType_Pixels, @@ -52,6 +37,24 @@ inline ui_size UI_TextContent(r32 Value, r32 Strictness); inline ui_size UI_Percent(r32 Value, r32 Strictness); inline ui_size UI_ChildrenSum(r32 Value, r32 Strictness); +//- sixten: UI core +enum +{ + UI_BoxFlag_Clickable = (1 << 0), + UI_BoxFlag_DrawText = (1 << 1), + UI_BoxFlag_DrawBorder = (1 << 2), + UI_BoxFlag_DrawBackground = (1 << 3), + UI_BoxFlag_DrawDropShadow = (1 << 4), + UI_BoxFlag_Clip = (1 << 5), + UI_BoxFlag_HotAnimation = (1 << 6), + UI_BoxFlag_ActiveAnimation = (1 << 7), + UI_BoxFlag_OverflowX = (1 << 8), + UI_BoxFlag_OverflowY = (1 << 9), + UI_BoxFlag_FloatingX = (1 << 10), + UI_BoxFlag_FloatingY = (1 << 11), +}; +typedef u32 ui_box_flags; + typedef void ui_draw_callback(render_group *Group, glyph_atlas *Atlas, struct ui_box *Box, void *Data); struct ui_box @@ -81,6 +84,7 @@ struct ui_box r32 CornerRadius; font_id Font; r32 FontSize; + v2 Offset; ui_draw_callback *DrawCallback; void *DrawCallbackData; @@ -136,13 +140,15 @@ struct ui ui_key NextHot; b32 NextHotSet; - platform_event_list *EventList; - v2 MouseP; - u64 DragData[8]; v2 DragStartP; ui_style_stacks Stacks; + + platform_event_list *EventList; + v2 MouseP; + + glyph_atlas *GlyphAtlas; }; //- sixten: State management @@ -166,20 +172,23 @@ inline void UI_StoreDragPointer(void *Data); inline void *UI_GetDragDataPointer(void); //- sixten: Key functions -inline ui_key UI_EmptyKey(void); -inline ui_key UI_SeedKey(ui_key Key, ui_key Seed); -inline ui_key UI_GenerateKeyFromString(string String); +static ui_key UI_EmptyKey(void); +static ui_key UI_SeedKey(ui_key Key, ui_key Seed); +static ui_key UI_GenerateKeyFromString(string String); static string UI_GetBoxNameByKey(ui_key Key); -inline ui_box *UI_GetBoxByKey(ui *UI, ui_key Key); +static ui_box *UI_GetBoxByKey(ui *UI, ui_key Key); //- sixten: Box creation -inline ui_box *UI_MakeBox(ui_box_flags Flags, string String); -inline ui_box *UI_MakeBoxF(ui_box_flags Flags, char *Format, ...); +static ui_box *UI_MakeBox(ui_box_flags Flags, string String); +static ui_box *UI_MakeBoxF(ui_box_flags Flags, char *Format, ...); + +//- sixten: User interaction +static ui_signal UI_SignalFromBox(ui_box *Box); //- sixten: Building and rendering static void UI_BeginBuild(ui *UI, v2 ScreenDim); -static void UI_EndBuild(glyph_atlas *GlyphAtlas); -static void UI_RenderFrame(render_group *RenderGroup, glyph_atlas *GlyphAtlas); -static void UI_NewFrame(ui *UI, platform_event_list *EventList, v2 MouseP); +static void UI_EndBuild(void); +static void UI_RenderFrame(render_group *RenderGroup); +static void UI_NewFrame(ui *UI, platform_event_list *EventList, v2 MouseP, glyph_atlas *GlyphAtlas); #endif //VN_UI_H diff --git a/code/vn_ui_utils.cpp b/code/vn_ui_utils.cpp index 620de29..fdd88d3 100644 --- a/code/vn_ui_utils.cpp +++ b/code/vn_ui_utils.cpp @@ -1,8 +1,8 @@ -// sixten: Rows and columns. -inline void UI_RowBegin(void) +//- sixten: Rows and columns. +inline void UI_RowBegin(u32 Flags, string Name) { UI_SetNextLayoutAxis(Axis2_X); - ui_box *Box = UI_MakeBox(0, StrLit("")); + ui_box *Box = UI_MakeBox(Flags, Name); UI_PushParent(Box); } @@ -11,10 +11,10 @@ inline void UI_RowEnd(void) UI_PopParent(); } -inline void UI_ColumnBegin(void) +inline void UI_ColumnBegin(u32 Flags, string Name) { UI_SetNextLayoutAxis(Axis2_Y); - ui_box *Box = UI_MakeBox(0, StrLit("")); + ui_box *Box = UI_MakeBox(Flags, Name); UI_PushParent(Box); } @@ -23,10 +23,7 @@ inline void UI_ColumnEnd(void) UI_PopParent(); } -#define UI_Row DeferLoop(UI_RowBegin(), UI_RowEnd()) -#define UI_Column DeferLoop(UI_ColumnBegin(), UI_ColumnEnd()) - -// sixten: Compositions +//- sixten: Compositions inline void UI_PushAxisSize(axis2 Axis, ui_size Size) { if(Axis == Axis2_X) @@ -63,17 +60,7 @@ inline void UI_SetNextAxisSize(axis2 Axis, ui_size Size) } } -#define UI_AxisSize(Axis, Size) DeferLoop(UI_PushAxisSize(Axis, Size), UI_PopAxisSize(Axis)) - -#define UI_Size(Width, Height) UI_Width(Width) UI_Height(Height) -#define UI_PushSize(Width, Height) UI_PushWidth(Width); UI_PushHeight(Height) -#define UI_PopSize() UI_PopWidth(); UI_PopHeight() -#define UI_SetNextSize(Width, Height) UI_SetNextWidth(Width); UI_SetNextHeight(Height) - -#define UI_FixedP(Value) UI_FixedX(Value.x) UI_FixedY(Value.y) -#define UI_SetNextFixedP(Value) UI_SetNextFixedX(Value.x); UI_SetNextFixedY(Value.y) - -// sixten: Spacing +//- sixten: Spacing static ui_box *UI_NamedSpacer(ui_size Size, string String) { ui_box *Parent = UI_TopParent(); @@ -104,9 +91,10 @@ static void UI_Spacer(ui_size Size) UI_NamedSpacer(Size, StrLit("")); } -#define UI_Padding(Size) DeferLoop(UI_Spacer(Size), UI_Spacer(Size)) +//- sixten: Scrollable regions -// sixten: Common widgets + +//- sixten: Common widgets static ui_box *UI_Label(string String) { ui_box *Box = UI_MakeBox(UI_BoxFlag_DrawText, String); @@ -165,7 +153,7 @@ static ui_signal UI_ButtonF(char *Format, ...) return(Signal); } -static ui_signal UI_Checkbox(string String, b32 *Checked) +static ui_signal UI_Checkbox(b32 *Checked, string String) { UI_SetNextSize(UI_ChildrenSum(1, 1), UI_ChildrenSum(1, 1)); UI_SetNextLayoutAxis(Axis2_X); @@ -196,4 +184,174 @@ static ui_signal UI_Checkbox(string String, b32 *Checked) } return(Signal); +} + +//- sixten: Scrollable regions +static ui_signal UI_Scrollbar(axis2 Axis, string Name, r32 Size, r32 Offset) +{ + ui_signal Signal; + + UI_SetNextAxisSize(Axis, UI_Percent(1, 0)); + UI_SetNextAxisSize(Opposite(Axis), UI_Em(1, 1)); + UI_SetNextBackgroundColor(Darken(UI_TopBackgroundColor(), 2)); + UI_SetNextLayoutAxis(Axis); + UI_Parent(UI_MakeBox(UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground, Name)) + { + UI_SetNextSize(UI_Em(1, 1), UI_Em(1, 1)); + UI_SetNextFont(Font_Icons); + UI_MakeBoxF(UI_BoxFlag_DrawText, "%U", Axis?FontIcon_UpDir:FontIcon_LeftDir); + + UI_Spacer(UI_Pixels(Offset, 1)); + + UI_SetNextAxisSize(Axis, UI_Pixels(Size, 1)); + UI_SetNextAxisSize(Opposite(Axis), UI_Percent(1, 1)); + + Signal = UI_SignalFromBox(UI_MakeBox(UI_BoxFlag_DrawBorder | + UI_BoxFlag_DrawBackground | + UI_BoxFlag_Clickable | + UI_BoxFlag_HotAnimation | + UI_BoxFlag_ActiveAnimation, + StrLit("Slider"))); + + UI_Spacer(UI_Percent(1, 0)); + + UI_SetNextSize(UI_Em(1, 1), UI_Em(1, 1)); + UI_SetNextFont(Font_Icons); + UI_MakeBoxF(UI_BoxFlag_DrawText, "%U", Axis?FontIcon_DownDir:FontIcon_RightDir); + } + + return(Signal); +} + +/* + +Goal for next week: Be able to make basic dialog trees. +Goal for tomorrow: Scrollable regions and basic text editing (with line wrapping). + +*/ + +static void UI_ScrollBegin(r32 *X, r32 *Y, string Name) +{ + u32 Flags = 0; + + b32 AllowOnX = (X != 0); + b32 AllowOnY = (Y != 0); + + UI_RowBegin(UI_BoxFlag_Clip|UI_BoxFlag_DrawBorder, Name); + { + UI_SetNextSize(UI_Percent(1, 0), UI_Percent(1, 0)); + UI_ColumnBegin(); + { + if(AllowOnX) + { + Flags |= UI_BoxFlag_OverflowX; + UI_SetNextOffsetX(-(*X)); + } + + if(AllowOnY) + { + Flags |= UI_BoxFlag_OverflowY; + UI_SetNextOffsetY(-(*Y)); + } + + UI_SetNextSize(AllowOnX?UI_ChildrenSum(1, 1):UI_Percent(1, 0), + AllowOnY?UI_ChildrenSum(1, 1):UI_Percent(1, 0)); + + ui_box *ScrollableBox = UI_MakeBox(Flags, StrLit("Scrollable Box")); + + UI_PushParent(ScrollableBox); + } + } +} + +static void UI_ScrollEnd(r32 *X, r32 *Y) +{ + b32 AllowOnX = (X != 0); + b32 AllowOnY = (Y != 0); + + ui_box *ScrollableBox = UI_TopParent(); + { + { + UI_PopParent(); + + if(AllowOnX) + { + r32 TotalWidth = UI_CalculateBoxSize(ScrollableBox, Axis2_X); + r32 ViewWidth = UI_CalculateBoxSize(ScrollableBox->Parent->Parent, Axis2_X); + + if(ViewWidth / TotalWidth < 1) + { + r32 TotalScrollWidth = ViewWidth - ScrollableBox->FontSize*2; + r32 ScrollScale = TotalScrollWidth / TotalWidth; + + // sixten(TODO): Add a max of 1 em, and figure out the associated algebra. + r32 ScrollWidth = ViewWidth*ScrollScale; + r32 ScrollOffset = (*X)*ScrollScale; + + ui_signal Signal = UI_Scrollbar(Axis2_X, StrLit("Scroll X"), ScrollWidth, ScrollOffset); + { + if(Signal.Dragging) + { + if(Signal.Pressed) + { + UI_StoreDragR32(*X); + } + + r32 StartOffset = UI_GetDragR32(); + r32 EndOffset = StartOffset + Signal.DragDelta.x/ScrollScale; + + AnimationCurve_AnimateValueDirect(EndOffset, 0.2, X); + } + } + } + *X = Clamp(*X, 0, Max(0.0, TotalWidth - ViewWidth)); + } + } + UI_ColumnEnd(); + + if(AllowOnY) + { + UI_SetNextSize(UI_ChildrenSum(1, 1), UI_Percent(1, 0)); + UI_Column() + { + r32 TotalHeight = UI_CalculateBoxSize(ScrollableBox, Axis2_Y); + r32 ViewHeight = UI_CalculateBoxSize(ScrollableBox->Parent->Parent, Axis2_Y); + + if(ViewHeight / TotalHeight < 1) + { + r32 TotalScrollHeight = ViewHeight - ScrollableBox->FontSize*2; + r32 ScrollScale = TotalScrollHeight / TotalHeight; + + // sixten(TODO): Add a max of 1 em, and figure out the associated algebra. + r32 ScrollHeight = ViewHeight*ScrollScale; + r32 ScrollOffset = (*Y)*ScrollScale; + + ui_signal Signal = UI_Scrollbar(Axis2_Y, StrLit("Scroll Y"), ScrollHeight, ScrollOffset); + { + if(Signal.Dragging) + { + if(Signal.Pressed) + { + UI_StoreDragR32(*Y); + } + + r32 StartOffset = UI_GetDragR32(); + r32 EndOffset = StartOffset + Signal.DragDelta.y/ScrollScale; + + AnimationCurve_AnimateValueDirect(EndOffset, 0.2, Y); + } + } + } + *Y = Clamp(*Y, 0, Max(0.0, TotalHeight - ViewHeight)); + } + // sixten: Add padding + if(AllowOnX && AllowOnY) + { + UI_SetNextSize(UI_Em(1, 1), UI_Em(1, 1)); + UI_SetNextBackgroundColor(Darken(UI_TopBackgroundColor(), 2)); + UI_MakeBox(UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground, StrLit("Padding")); + } + } + } + UI_RowEnd(); } \ No newline at end of file diff --git a/code/vn_ui_utils.h b/code/vn_ui_utils.h new file mode 100644 index 0000000..4915f37 --- /dev/null +++ b/code/vn_ui_utils.h @@ -0,0 +1,56 @@ +/* date = June 24th 2023 9:43 pm */ + +#ifndef VN_UI_UTILS_H +#define VN_UI_UTILS_H + +//- sixten: Rows and columns. +inline void UI_RowBegin(u32 Flags = 0, string Name = StrLit("")); +inline void UI_RowEnd(void); +inline void UI_ColumnBegin(u32 Flags = 0, string Name = StrLit("")); +inline void UI_ColumnEnd(void); + +#define UI_Row(...) DeferLoop(UI_RowBegin(__VA_ARGS__), UI_RowEnd()) +#define UI_Column(...) DeferLoop(UI_ColumnBegin(__VA_ARGS__), UI_ColumnEnd()) + +//- sixten: Compositions +inline void UI_PushAxisSize(axis2 Axis, ui_size Size); +inline void UI_PopAxisSize(axis2 Axis); +inline void UI_SetNextAxisSize(axis2 Axis, ui_size Size); + +#define UI_AxisSize(Axis, Size) DeferLoop(UI_PushAxisSize(Axis, Size), UI_PopAxisSize(Axis)) + +#define UI_Size(Width, Height) UI_Width(Width) UI_Height(Height) +#define UI_PushSize(Width, Height) UI_PushWidth(Width); UI_PushHeight(Height) +#define UI_PopSize() UI_PopWidth(); UI_PopHeight() +#define UI_SetNextSize(Width, Height) UI_SetNextWidth(Width); UI_SetNextHeight(Height) + +#define UI_Offset(x, y) UI_OffsetX(x) UI_OffsetY(y) +#define UI_PushOffset(x, y) UI_PushOffsetX(x); UI_PushOffsetY(y) +#define UI_PopOffset() UI_PopOffsetX(); UI_PopOffsetY() +#define UI_SetNextOffset(x, y) UI_SetNextOffsetX(x); UI_SetNextOffsetY(y) + +#define UI_FixedP(Value) UI_FixedX(Value.x) UI_FixedY(Value.y) +#define UI_SetNextFixedP(Value) UI_SetNextFixedX(Value.x); UI_SetNextFixedY(Value.y) + +//- sixten: Spacing +static ui_box *UI_NamedSpacer(ui_size Size, string String); +static ui_box *UI_NamedSpacerF(ui_size Size, char *Format, ...); + +#define UI_Padding(Size) DeferLoop(UI_Spacer(Size), UI_Spacer(Size)) + +//- sixten: Scrollable regions +static void UI_ScrollBegin(r32 *X, r32 *Y, string Name = StrLit("Scrollable Region Container")); +static void UI_ScrollEnd(r32 *X, r32 *Y, string Name); + +#define UI_Scroll(...) DeferLoop(UI_ScrollBegin(__VA_ARGS__), UI_ScrollEnd(__VA_ARGS__)) + +//- sixten: Common widgets +static ui_box *UI_Label(string String); +static ui_box *UI_LabelF(char *Format, ...); + +static ui_signal UI_Button(string String); +static ui_signal UI_ButtonF(char *Format, ...); + +static ui_signal UI_Checkbox(b32 *Checked, string String); + +#endif //VN_UI_UTILS_H diff --git a/code/vn_workspace.cpp b/code/vn_workspace.cpp index c0057e8..18327b4 100644 --- a/code/vn_workspace.cpp +++ b/code/vn_workspace.cpp @@ -205,6 +205,12 @@ static void Workspace_BuildToolbar(workspace *Workspace, r32 dtForFrame) Workspace->Menu = ToolbarMenu_None; } + if(Workspace_BuildMenuItem(FontIcon_None, "Command Palette", "").Clicked) + { + Workspace_CreateNewView(Workspace_View_CommandPalette, CurrentPanel); + + Workspace->Menu = ToolbarMenu_None; + } if(Workspace_BuildMenuItem(FontIcon_Wrench, "Settings", "").Clicked) { Workspace_CreateNewView(Workspace_View_Settings, CurrentPanel); @@ -419,6 +425,8 @@ static void Workspace_BuildPanelHeader(workspace *Workspace, workspace_panel *Pa Workspace_BuildTabItem(Workspace, Panel, View); } + UI_Spacer(UI_Percent(1, 0)); + // sixten: Panel Close Button if(Panel != Workspace->RootPanel) { @@ -500,8 +508,8 @@ static void Workspace_BuildPanel(workspace *Workspace, workspace_panel *Panel) } else { - UI_Column UI_Padding(UI_Percent(1, 0)) - UI_Height(UI_ChildrenSum(1, 1)) UI_Row UI_Padding(UI_Percent(1, 0)) + UI_Column() UI_Padding(UI_Percent(1, 0)) + UI_Height(UI_ChildrenSum(1, 1)) UI_Row() UI_Padding(UI_Percent(1, 0)) { UI_Size(UI_TextContent(0, 1), UI_TextContent(10, 1)) { diff --git a/code/vn_workspace_view.cpp b/code/vn_workspace_view.cpp index f6852a0..03479d0 100644 --- a/code/vn_workspace_view.cpp +++ b/code/vn_workspace_view.cpp @@ -146,7 +146,7 @@ static void Workspace_BuildViewTypeLister(workspace *Workspace, workspace_view * ui_box *InputTextBox = UI_MakeBox(UI_BoxFlag_DrawText, StrLit("Workspace View Lister")); InputTextBox->String = MakeString(CommandPalette->ListerInput, CommandPalette->ListerInputUsed); InputTextBox->DrawCallback = Workspace_ViewListerInputCallback; - InputTextBox->DrawCallbackData = View; + InputTextBox->DrawCallbackData = CommandPalette; } UI_Spacer(UI_Pixels(4, 1)); @@ -338,8 +338,8 @@ static void Workspace_BuildSettings(workspace *Workspace, workspace_view *View) workspace_view_settings *Settings = (workspace_view_settings *)View->Data; UI_Height(UI_ChildrenSum(1, 1)) - UI_Column UI_Padding(UI_Pixels(50, 0)) - UI_Row UI_Padding(UI_Pixels(50, 0)) + UI_Column() UI_Padding(UI_Pixels(50, 0)) + UI_Row() UI_Padding(UI_Pixels(50, 0)) { UI_Size(UI_TextContent(0, 1), UI_TextContent(10, 1)) UI_Font(Font_Bold) UI_FontSize(36) @@ -353,8 +353,8 @@ static void Workspace_BuildSettings(workspace *Workspace, workspace_view *View) UI_Width(UI_Pixels(300, 1)) UI_Parent(UI_MakeBoxF(0, "Navigation")) { - UI_Row UI_Padding(UI_Pixels(50, 1)) - UI_Width(UI_Percent(1, 0)) UI_Column UI_Padding(UI_Percent(1, 0)) + UI_Row() UI_Padding(UI_Pixels(50, 1)) + UI_Width(UI_Percent(1, 0)) UI_Column() UI_Padding(UI_Percent(1, 0)) UI_Height(UI_ChildrenSum(1, 1)) UI_LayoutAxis(Axis2_Y) UI_Parent(UI_MakeBoxF(0, "")) { Workspace_BuildSettingsTabButton(Settings, "All", Workspace_Settings_All); @@ -391,12 +391,11 @@ static void Workspace_BuildSettings(workspace *Workspace, workspace_view *View) s32 DropdownSelected; FindIndexOfElement(DropdownSelected, AlternativeMapping, 0, Workspace->Input->RefreshRate); - persist b32 DropdownOpen = false; - - if(UI_DropdownSelection(Alternatives, ArrayCount(Alternatives), &DropdownOpen, &DropdownSelected)) + if(UI_DropdownSelection(Alternatives, ArrayCount(Alternatives), + &Settings->GeneralDropdownOpen, &DropdownSelected)) { Workspace->Input->RefreshRate = AlternativeMapping[DropdownSelected]; - DropdownOpen = false; + Settings->GeneralDropdownOpen = false; } UI_Spacer(UI_Pixels(50, 1)); @@ -406,19 +405,25 @@ static void Workspace_BuildSettings(workspace *Workspace, workspace_view *View) { UI_Font(Font_Bold) UI_FontSize(36) UI_LabelF("Theme"); - UI_SetNextSize(UI_Percent(1, 1), UI_ChildrenSum(1, 1)); - UI_SetNextCornerRadius(3); + UI_SetNextSize(UI_Percent(1, 1), UI_Em(13, 1)); - UI_Parent(UI_MakeBoxF(UI_BoxFlag_DrawBorder, "Theme Lister")) - UI_Size(UI_Percent(1, 1), UI_Em(2, 1)) + UI_Scroll(0, &Settings->ThemeScroll) { - UI_ButtonF("Hello"); - UI_ButtonF("Line"); - UI_ButtonF("Paint"); - UI_ButtonF("Color"); - UI_ButtonF("Design"); - UI_ButtonF("Address"); - UI_ButtonF("Brightness"); + UI_Size(UI_Percent(1, 1), UI_Em(2, 1)) + { + for(s32 Index = 0; + Index < 2; + ++Index) + { + UI_ButtonF("Hello#%i", Index); + UI_ButtonF("Line#%i", Index); + UI_ButtonF("Paint#%i", Index); + UI_ButtonF("Color#%i", Index); + UI_ButtonF("Design#%i", Index); + UI_ButtonF("Address#%i", Index); + UI_ButtonF("Brightness#%i", Index); + } + } } UI_Spacer(UI_Pixels(50, 1)); @@ -427,9 +432,11 @@ static void Workspace_BuildSettings(workspace *Workspace, workspace_view *View) if(!Category || (Category == Workspace_Settings_Developer)) { UI_Font(Font_Bold) UI_FontSize(36) UI_LabelF("Developer"); - UI_Checkbox(StrLit("Render UI Debug Rects"), &DEBUG_DebugSettings->RenderUIDebugRects); + UI_Checkbox(&DEBUG_DebugSettings->RenderUIDebugRects, StrLit("Render UI Debug Rects")); UI_Spacer(UI_Pixels(5, 1)); - UI_Checkbox(StrLit("Render FPS Counter"), &DEBUG_DebugSettings->RenderFPSCounter); + UI_Checkbox(&DEBUG_DebugSettings->RenderFPSCounter, StrLit("Render FPS Counter")); + UI_Spacer(UI_Pixels(5, 1)); + UI_Checkbox(&DEBUG_DebugSettings->ListHotAndActive, StrLit("List Hot & Active")); UI_Spacer(UI_Pixels(50, 1)); } @@ -459,8 +466,8 @@ static void Workspace_BuildView(workspace *Workspace, workspace_view *View) { if(View->Type == Workspace_View_Startup) { - UI_Row UI_Padding(UI_Pixels(50, 0)) - UI_Width(UI_ChildrenSum(1, 1)) UI_Column UI_Padding(UI_Pixels(50, 0)) + UI_Row() UI_Padding(UI_Pixels(50, 0)) + UI_Width(UI_ChildrenSum(1, 1)) UI_Column() UI_Padding(UI_Pixels(50, 0)) { UI_Size(UI_TextContent(0, 1), UI_TextContent(10, 1)) { diff --git a/code/vn_workspace_view.h b/code/vn_workspace_view.h index d0c031b..a90eef0 100644 --- a/code/vn_workspace_view.h +++ b/code/vn_workspace_view.h @@ -53,6 +53,12 @@ enum workspace_settings_category struct workspace_view_settings { workspace_settings_category Category; + + // sixten: General + b32 GeneralDropdownOpen; + + // sixten: Theme + r32 ThemeScroll; }; //- sixten: Views diff --git a/config.vn b/config.vn index f749c5c..f6daacd 100644 --- a/config.vn +++ b/config.vn @@ -7,4 +7,5 @@ Dev { RenderUIDebugRects = false; RenderFPSCounter = false; + ListHotAndActive = true; } \ No newline at end of file diff --git a/fonts/PatrickHand-Regular.ttf b/fonts/PatrickHand-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a1b90baea72502a3cdaba26c2c27a8a667aad45c GIT binary patch literal 212112 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
4=L=yOya+FxmcRmi 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 _j5 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 literal 0 HcmV?d00001 diff --git a/todo.txt b/todo.txt index 28efaf3..cbf17de 100644 --- a/todo.txt +++ b/todo.txt @@ -1,9 +1,12 @@ This is a list of things that needs doing in a SUGGESTED order. * UI - - Settings / Preferences view. (Including saving and loading of these settings/preferences) + - Incorrect behaviour when closing panels in a certain order, most likely some things are not being copied over properly. * Rendering - Fix texture clipping - Control over each corner when rounding +Completed +* UI + - Settings / Preferences view. (Including saving and loading of these settings/preferences) \ No newline at end of file