diff --git a/src/app/foldhaus_app.cpp b/src/app/foldhaus_app.cpp index 57ce966..1c429bb 100644 --- a/src/app/foldhaus_app.cpp +++ b/src/app/foldhaus_app.cpp @@ -139,7 +139,7 @@ INITIALIZE_APPLICATION(InitializeApplication) AddCodepointToFont(Font, Codepoint, 0, 0, CodepointW, CodepointH, CodepointX, CodepointY); } - State->Interface.Font = Font; + State->Interface_.Style.Font = Font; Font->BitmapTextureHandle = Context.PlatformGetGPUTextureHandle(Font->BitmapMemory, Font->BitmapWidth, Font->BitmapHeight); @@ -150,23 +150,21 @@ INITIALIZE_APPLICATION(InitializeApplication) } } - State->Interface.FontSize = FontSize; - State->Interface.PanelBGColors[0] = v4{.3f, .3f, .3f, 1}; - State->Interface.PanelBGColors[1] = v4{.4f, .4f, .4f, 1}; - State->Interface.PanelBGColors[2] = v4{.5f, .5f, .5f, 1}; - State->Interface.PanelBGColors[3] = v4{.6f, .6f, .6f, 1}; - State->Interface.ButtonColor_Inactive = BlackV4; - State->Interface.ButtonColor_Active = v4{.1f, .1f, .1f, 1}; - State->Interface.ButtonColor_Selected = v4{.1f, .1f, .3f, 1}; - State->Interface.TextColor = WhiteV4; - State->Interface.ListBGColors[0] = v4{ .16f, .16f, .16f, 1.f }; - State->Interface.ListBGColors[1] = v4{ .18f, .18f, .18f, 1.f }; - State->Interface.ListBGHover = v4{ .22f, .22f, .22f, 1.f }; - State->Interface.ListBGSelected = v4{.44f, .44f, .44f, 1.f }; - State->Interface.Margin = v2{5, 5}; - State->Interface.RowHeight = State->Interface.Font->PixelHeight + 2 * State->Interface.Margin.y; - - State->Interface_.Style = State->Interface; + State->Interface_.Style.FontSize = FontSize; + State->Interface_.Style.PanelBGColors[0] = v4{.3f, .3f, .3f, 1}; + State->Interface_.Style.PanelBGColors[1] = v4{.4f, .4f, .4f, 1}; + State->Interface_.Style.PanelBGColors[2] = v4{.5f, .5f, .5f, 1}; + State->Interface_.Style.PanelBGColors[3] = v4{.6f, .6f, .6f, 1}; + State->Interface_.Style.ButtonColor_Inactive = BlackV4; + State->Interface_.Style.ButtonColor_Active = v4{.1f, .1f, .1f, 1}; + State->Interface_.Style.ButtonColor_Selected = v4{.1f, .1f, .3f, 1}; + State->Interface_.Style.TextColor = WhiteV4; + State->Interface_.Style.ListBGColors[0] = v4{ .16f, .16f, .16f, 1.f }; + State->Interface_.Style.ListBGColors[1] = v4{ .18f, .18f, .18f, 1.f }; + State->Interface_.Style.ListBGHover = v4{ .22f, .22f, .22f, 1.f }; + State->Interface_.Style.ListBGSelected = v4{.44f, .44f, .44f, 1.f }; + State->Interface_.Style.Margin = v2{5, 5}; + State->Interface_.Style.RowHeight = ui_GetTextLineHeight(State->Interface_); State->SACN = InitializeSACN(Context); State->NetworkProtocolHeaderSize = STREAM_HEADER_SIZE; diff --git a/src/app/foldhaus_app.h b/src/app/foldhaus_app.h index 6fe067c..c0fbc66 100644 --- a/src/app/foldhaus_app.h +++ b/src/app/foldhaus_app.h @@ -72,7 +72,6 @@ struct app_state text_entry ActiveTextEntry; ui_interface Interface_; - interface_config Interface; animation_system AnimationSystem; gs_list_handle SelectedAnimationBlockHandle; diff --git a/src/app/interface.h b/src/app/interface.h index 653138f..33a50ac 100644 --- a/src/app/interface.h +++ b/src/app/interface.h @@ -339,10 +339,18 @@ ui_LayoutRemaining(ui_layout Layout) } return Result; } + // // Drawing Functions // +static r32 +ui_GetTextLineHeight(ui_interface Interface) +{ + r32 Result = Interface.Style.Font->PixelHeight + (2 * Interface.Style.Margin.y); + return Result; +} + static void ui_FillRect(ui_interface* Interface, rect Bounds, v4 Color) { @@ -430,6 +438,37 @@ ui_Button(ui_interface* Interface, string Text, rect Bounds) return ui_Button(Interface, Text, Bounds, BGColor, HoverColor, SelectedColor); } +struct list_item_colors +{ + v4 Hover; + v4 Selected; + v4 BGColor; +}; + +inline v4 +ui_GetListItemBGColor(interface_config Style, u32 ElementIndex) +{ + v4 Result = Style.ListBGColors[ElementIndex % LIST_BG_COLORS_COUNT]; + return Result; +} + +static list_item_colors +ui_GetListItemColors(ui_interface* Interface, u32 ListItemIndex) +{ + list_item_colors Result = {}; + Result.Hover = Interface->Style.ListBGHover; + Result.Selected = Interface->Style.ListBGSelected; + Result.BGColor = ui_GetListItemBGColor(Interface->Style, ListItemIndex); + return Result; +} + +static b32 +ui_ListButton(ui_interface* Interface, string Text, rect Bounds, u32 ListItemIndex) +{ + list_item_colors Colors = ui_GetListItemColors(Interface, ListItemIndex); + return ui_Button(Interface, Text, Bounds, Colors.Hover, Colors.Selected, Colors.BGColor); +} + static b32 ui_LayoutButton(ui_interface* Interface, ui_layout* Layout, string Text, v4 BGColor, v4 HoverColor, v4 SelectColor) { @@ -450,11 +489,11 @@ ui_LayoutButton(ui_interface* Interface, ui_layout* Layout, string Text) return ui_LayoutButton(Interface, Layout, Text, BGColor, HoverColor, SelectedColor); } -inline v4 -ui_GetListItemBGColor(interface_config Style, u32 ElementIndex) +static b32 +ui_LayoutListButton(ui_interface* Interface, ui_layout* Layout, string Text, u32 ListItemIndex) { - v4 Result = Style.ListBGColors[ElementIndex % LIST_BG_COLORS_COUNT]; - return Result; + list_item_colors Colors = ui_GetListItemColors(Interface, ListItemIndex); + return ui_LayoutButton(Interface, Layout, Text, Colors.Hover, Colors.Selected, Colors.BGColor); } static b32 diff --git a/src/app/panels/foldhaus_panel_animation_timeline.h b/src/app/panels/foldhaus_panel_animation_timeline.h index b4a2dfe..ff1999f 100644 --- a/src/app/panels/foldhaus_panel_animation_timeline.h +++ b/src/app/panels/foldhaus_panel_animation_timeline.h @@ -317,7 +317,7 @@ DrawFrameBar (animation_system* AnimationSystem, render_command_buffer* RenderBu r32 FramePercent = FrameToPercentRange(Frame, VisibleFrames); r32 FrameX = GSLerp(BarBounds.Min.x, BarBounds.Max.x, FramePercent); v2 FrameTextPos = v2{FrameX, BarBounds.Min.y + 2}; - DrawString(RenderBuffer, TempString, State->Interface.Font, FrameTextPos, WhiteV4); + DrawString(RenderBuffer, TempString, State->Interface_.Style.Font, FrameTextPos, WhiteV4); } // Time Slider @@ -335,7 +335,7 @@ DrawFrameBar (animation_system* AnimationSystem, render_command_buffer* RenderBu PushRenderQuad2D(RenderBuffer, HeadMin, HeadMax, TimeSliderColor); PrintF(&TempString, "%d", AnimationSystem->CurrentFrame); - DrawString(RenderBuffer, TempString, State->Interface.Font, HeadMin + v2{6, 4}, WhiteV4); + DrawString(RenderBuffer, TempString, State->Interface_.Style.Font, HeadMin + v2{6, 4}, WhiteV4); } } @@ -418,7 +418,7 @@ DrawLayerMenu(animation_system* AnimationSystem, rect PanelDim, render_command_b { PushRenderBoundingBox2D(RenderBuffer, gs_RectExpand(LayerBounds), 1, WhiteV4); } - DrawString(RenderBuffer, Layer->Name, State->Interface.Font, LayerTextPos, WhiteV4); + DrawString(RenderBuffer, Layer->Name, State->Interface_.Style.Font, LayerTextPos, WhiteV4); } } diff --git a/src/app/panels/foldhaus_panel_hierarchy.h b/src/app/panels/foldhaus_panel_hierarchy.h index cdb9e9a..4808cdb 100644 --- a/src/app/panels/foldhaus_panel_hierarchy.h +++ b/src/app/panels/foldhaus_panel_hierarchy.h @@ -30,42 +30,40 @@ internal void HierarchyView_Render(panel Panel, rect PanelBounds, render_command_buffer* RenderBuffer, app_state* State, context Context, mouse_state Mouse) { ui_layout Layout = ui_CreateLayout(State->Interface_, PanelBounds); - v4 ListItemHover = State->Interface_.Style.ListBGHover; - v4 ListItemSelected = State->Interface_.Style.ListBGSelected; - string TempString = PushString(&State->Transient, 256); - u32 LineCount = (u32)(gs_Height(PanelBounds) / Layout.RowHeight) + 1; - u32 LinesDrawn = 0; u32 AssembliesToDraw = GSMin(LineCount, State->Assemblies.Count); + rect* LineBounds = PushArray(&State->Transient, rect, LineCount); + + // Fill in alternating color rows for the backgrounds + for (u32 Line = 0; Line < LineCount; Line++) + { + LineBounds[Line] = ui_ReserveElementBounds(&Layout); + v4 ListItemBGColor = ui_GetListItemBGColor(State->Interface_.Style, Line); + ui_FillRect(&State->Interface_, LineBounds[Line], ListItemBGColor); + } + for (u32 AssemblyIndex = 0; AssemblyIndex < AssembliesToDraw; AssemblyIndex++) { - rect Bounds = ui_ReserveElementBounds(&Layout); - v4 ListItemBGColor = ui_GetListItemBGColor(State->Interface_.Style, AssemblyIndex); - ui_FillRect(&State->Interface_, Bounds, ListItemBGColor); - assembly Assembly = State->Assemblies.Values[AssemblyIndex]; PrintF(&TempString, "%S", Assembly.Name); - ui_layout ItemLayout = ui_CreateLayout(State->Interface_, Bounds); + ui_layout ItemLayout = ui_CreateLayout(State->Interface_, LineBounds[AssemblyIndex]); ui_StartRow(&ItemLayout, 2); { ui_LayoutDrawString(&State->Interface_, &ItemLayout, TempString, State->Interface_.Style.TextColor); - if (ui_LayoutButton(&State->Interface_, &ItemLayout, MakeStringLiteral("X"), ListItemBGColor, ListItemHover, ListItemSelected)) + if (ui_LayoutListButton(&State->Interface_, &ItemLayout, MakeStringLiteral("X"), AssemblyIndex)) { UnloadAssembly(AssemblyIndex, State, Context); } } ui_EndRow(&ItemLayout); - - LinesDrawn += 1; } - if (LinesDrawn < LineCount) + if (AssembliesToDraw < LineCount) { - v4 ListItemBGColor = ui_GetListItemBGColor(State->Interface_.Style, LinesDrawn++); PrintF(&TempString, "+ Add Assembly"); - if (ui_LayoutButton(&State->Interface_, &Layout, TempString, ListItemBGColor, ListItemHover, ListItemSelected)) + if (ui_ListButton(&State->Interface_, TempString, LineBounds[AssembliesToDraw], AssembliesToDraw)) { string FilePath = PushString(&State->Transient, 256); b32 Success = GetFilePath(Context, &FilePath, "Foldhaus Files\0*.fold\0\0"); @@ -74,13 +72,6 @@ HierarchyView_Render(panel Panel, rect PanelBounds, render_command_buffer* Rende LoadAssembly(&State->Assemblies, &State->LedSystem, &State->Transient, Context, FilePath, State->GlobalLog); } } - - for (; LinesDrawn < LineCount; LinesDrawn++) - { - rect Bounds = ui_ReserveElementBounds(&Layout); - ListItemBGColor = ui_GetListItemBGColor(State->Interface_.Style, LinesDrawn); - ui_FillRect(&State->Interface_, Bounds, ListItemBGColor); - } } } diff --git a/src/app/panels/foldhaus_panel_node_graph.h b/src/app/panels/foldhaus_panel_node_graph.h index 12ae92d..332257c 100644 --- a/src/app/panels/foldhaus_panel_node_graph.h +++ b/src/app/panels/foldhaus_panel_node_graph.h @@ -436,7 +436,7 @@ NodeGraph_Render(panel Panel, rect PanelBounds, render_command_buffer* RenderBuf r32 NodeWidth = 150; r32 LayerDistance = 100; - r32 LineHeight = (State->Interface.Font->PixelHeight + (2 * State->Interface.Margin.y)); + r32 LineHeight = ui_GetTextLineHeight(State->Interface_); if (GraphState->LayoutIsDirty) { @@ -477,7 +477,7 @@ NodeGraph_Render(panel Panel, rect PanelBounds, render_command_buffer* RenderBuf { visual_node VisualNode = GraphState->Layout.VisualNodes[i]; gs_list_handle NodeHandle = State->NodeWorkspace.SortedNodeHandles[i]; - DrawNode(VisualNode.Position + GraphState->ViewOffset, VisualNode.Spec, NodeHandle, NodeWidth, LineHeight, State->Interface, RenderBuffer, Mouse, &State->Transient); + DrawNode(VisualNode.Position + GraphState->ViewOffset, VisualNode.Spec, NodeHandle, NodeWidth, LineHeight, State->Interface_.Style, RenderBuffer, Mouse, &State->Transient); } for (u32 p = 0; p < GraphState->Layout.VisualPortsCount; p++) @@ -514,17 +514,17 @@ NodeGraph_Render(panel Panel, rect PanelBounds, render_command_buffer* RenderBuf List.ListBounds = NodeSelectionWindowBounds; List.ListElementDimensions = v2{ gs_Width(NodeSelectionWindowBounds), - (r32)(State->Interface.Font->PixelHeight + 8), + ui_GetTextLineHeight(State->Interface_) }; List.ElementLabelIndent = v2{10, 4}; string TitleString = MakeStringLiteral("Available Nodes"); - DrawListElement(TitleString, &List, Mouse, RenderBuffer, State->Interface); + DrawListElement(TitleString, &List, Mouse, RenderBuffer, State->Interface_.Style); for (u32 i = 0; i < NodeType_Count; i++) { node_specification_ Spec = NodeSpecifications[i]; - rect ElementBounds = DrawListElement(Spec.Identifier, &List, Mouse, RenderBuffer, State->Interface); + rect ElementBounds = DrawListElement(Spec.Identifier, &List, Mouse, RenderBuffer, State->Interface_.Style); if (MouseButtonTransitionedDown(Mouse.LeftButtonState) && gs_PointIsInRect(Mouse.DownPos, ElementBounds)) diff --git a/src/gs_libs/gs_font.h b/src/gs_libs/gs_font.h index 7570039..c901bf7 100644 --- a/src/gs_libs/gs_font.h +++ b/src/gs_libs/gs_font.h @@ -82,7 +82,7 @@ GetNextCodepointOffset (bitmap_font* Font, u32* X, u32* Y) } internal void -AddCodepointToFont (bitmap_font* Font, char Codepoint, +AddCodepointToFont (bitmap_font* Font, char Codepoint, s32 XOffset, s32 YOffset, s32 Width, s32 Height, s32 BitmapX, s32 BitmapY) { @@ -100,7 +100,7 @@ AddCodepointToFont (bitmap_font* Font, char Codepoint, Value->BitmapX = BitmapX; Value->BitmapY = BitmapY; Value->UVMin = v2{(r32)BitmapX / (r32)Font->BitmapWidth, (r32)BitmapY / (r32)Font->BitmapHeight}; - Value->UVMax = + Value->UVMax = Value->UVMin + v2{(r32)Width / (r32)Font->BitmapWidth, (r32)Height / (r32)Font->BitmapHeight}; }