vn/code/vn_workspace_nav_editor.cpp

160 lines
6.3 KiB
C++

UI_CUSTOM_DRAW_CALLBACK(BuildNavViewDrawCallback)
{
scene_view *SceneView = (scene_view *)Data;
SV_DrawBackground(SceneView, Box, Group);
}
static scene_nav_item_node *W_SceneNavItemNodeAlloc(arena *Arena, workspace_view_nav_editor *Editor)
{
scene_nav_item_node *Result = Editor->FirstFree;
if(Result)
{
DLLRemove(Editor->FirstFree, Editor->LastFree, Result);
*Result = {};
}
else
{
Result = PushStruct(Arena, scene_nav_item_node);
}
DLLInsertLast(Editor->Items.First, Editor->Items.Last, Result);
Editor->Items.Count += 1;
return(Result);
}
static void W_SceneNavItemNodeRelease(workspace_view_nav_editor *Editor, scene_nav_item_node *Node)
{
DLLInsertLast(Editor->FirstFree, Editor->LastFree, Node);
Editor->Items.Count -= 1;
}
static void W_SetupNavEditor(workspace_view *View, string FileContents)
{
//- sixten(TODO): deserialize data
}
static void W_BuildNavEditor(workspace_view *View)
{
workspace_view_nav_editor *Editor = (workspace_view_nav_editor *)View->Data;
scene_view *SceneView = SV_GetState();
UI_BackgroundColor(V4(0.25, 0.25, 0.25, 1))
UI_BorderColor(V4(0.45, 0.45, 0.45, 1))
UI_WidthFill UI_Height(UI_Em(2.0f, 1.0f))
UI_Parent(UI_MakeBoxF(UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawBorder, "Workspace Nav Editor Toolbar"))
{
UI_Width(UI_TextContent(10, 1.0f)) UI_Font(Font_Icons) if(UI_ButtonF("%U", FontIcon_UserPlus).Clicked)
{
scene_nav_item_node *NewNode = W_SceneNavItemNodeAlloc(View->Arena, Editor);
NewNode->Item = G_DefaultSceneNavItem;
}
}
UI_Row()
{
//- sixten: build inspector panel
UI_Width(UI_Percent(0.2f, 1.0f)) UI_HeightFill
UI_Parent(UI_MakeBox(UI_BoxFlag_DrawBorder, StrLit("Workspace Nav Editor Inspector")))
{
scene_nav_item_node *SelectedItem = Editor->SelectedItem;
if(SelectedItem)
{
}
else UI_WidthFill
{
UI_LabelF("No item selected.");
}
}
//- sixten: build nav view
UI_Row()
{
//- sixten: calculate nav view size
r32 VerticalPad = 0;
r32 HorizontalPad = 0;
{
ui_box *ParentBox = UI_TopParent();
v2_r32 ParentDim = DimOfRange(ParentBox->Rect);
r32 WidthOverHeight = ParentDim.x / ParentDim.y;
r32 TargetRatio = 16.0f / 9.0f;
if(WidthOverHeight > TargetRatio)
{
VerticalPad = ParentDim.x - ParentDim.y*TargetRatio;
}
else
{
HorizontalPad = ParentDim.y - ParentDim.x/TargetRatio;
}
}
//- sixten: do the building of the nav view
UI_Padding(UI_Pixels(VerticalPad/2, 1))
{
UI_Column() UI_Padding(UI_Pixels(HorizontalPad/2, 1))
{
UI_SetNextWidth(UI_Percent(1, 0));
UI_SetNextHeight(UI_Percent(1, 0));
UI_SetNextLayoutAxis(Axis2_Y);
ui_box *Box = UI_MakeBox(UI_BoxFlag_Clip, StrLit("Nav View"));
UI_EquipBoxCustomDrawCallback(Box, BuildNavViewDrawCallback, SceneView);
v2_r32 BoxDim = UI_CalculateBoxDim(Box);
r32 GlobalScale = CalculateGlobalScaleFromDim(BoxDim);
//- sixten: build all nav items
s32 ItemIndex = 0;
for(scene_nav_item_node *Node = Editor->Items.First; Node != 0; Node = Node->Next, ItemIndex += 1)
{
scene_nav_item *Item = &Node->Item;
//- sixten: calculate item position
r32 AppliedScale = GlobalScale*Item->Scale;
render_handle Texture = TextureFromAssetID(Item->TextureID);
v2_r32 TextureDim = ConvertV2ToR32(DimFromTexture(Texture));
v2_r32 TextureOrigin = Hadamard(TextureDim, Item->Origin);
v2_r32 Dim = TextureDim*AppliedScale;
v2_r32 OriginP = TextureOrigin*AppliedScale;
//- sixten: build the item
scene_nav_item_info *Data = PushStruct(UI_FrameArena(), scene_nav_item_info);
Data->Item = Item;
UI_SetNextHoverCursor(PlatformCursor_Hand);
UI_SetNextSize(UI_Pixels(Dim.x, 1), UI_Pixels(Dim.y, 1));
ui_box *ItemBox = UI_MakeBoxF(UI_BoxFlag_Clickable|UI_BoxFlag_FloatingX|UI_BoxFlag_FloatingY,
"View Item Box %i", ItemIndex);
UI_EquipBoxCustomDrawCallback(ItemBox, BuildNavItemDrawCallback, Data);
//- sixten: handle signals
{
ui_signal Signal = UI_SignalFromBox(ItemBox);
Data->Signal = Signal;
//- sixten: inspect pressed item
if(Signal.Pressed)
{
Editor->SelectedItem = Node;
}
//- sixten: handle dragging
if(Signal.Dragging)
{
if(Signal.Pressed)
{
UI_StoreDragV2(Item->P);
}
Item->P = UI_GetDragV2() + Signal.DragDelta/BoxDim*2;
}
}
//- sixten: apply the calculated position
v2_r32 OffsetP = BoxDim*(V2R32(1, 1) + Item->P)*0.5f;
ItemBox->FixedP = (OffsetP-OriginP);
}
}
}
}
}
}