vn/code/vn_workspace_view.cpp

376 lines
13 KiB
C++
Raw Normal View History

2023-06-17 17:00:55 +00:00
//- sixten: Views
2023-08-22 03:19:51 +00:00
inline workspace_view *W_CreateNewView(workspace_view_type Type, workspace_panel *Parent)
2023-06-17 17:00:55 +00:00
{
arena *Arena = ArenaAlloc(Kilobytes(4), true);
2023-07-19 15:09:41 +00:00
workspace_view *View = PushStruct(Arena, workspace_view);
View->Arena = Arena;
2023-06-17 17:00:55 +00:00
View->Type = Type;
View->Parent = Parent;
switch(View->Type)
{
2023-08-22 03:19:51 +00:00
case W_View_Settings:
2023-07-24 13:50:57 +00:00
{
View->Data = PushStruct(View->Arena, workspace_view_settings);
} break;
2023-08-22 03:19:51 +00:00
case W_View_TextEditor:
2023-07-19 15:09:41 +00:00
{
View->Data = PushStruct(View->Arena, workspace_view_text_editor);
2023-07-24 13:50:57 +00:00
2023-07-19 15:09:41 +00:00
workspace_view_text_editor *Editor = (workspace_view_text_editor *)View->Data;
Editor->ProcessingArena = ArenaAlloc(Gigabytes(1));
2023-07-24 13:50:57 +00:00
Editor->Text = MutableStringAllocate(Gigabytes(1));
Editor->HistoryArena = ArenaAlloc(Gigabytes(1));
2023-07-24 13:50:57 +00:00
SenDLLInit(&Editor->History.Sentinel);
Editor->History.At = &Editor->History.Sentinel;
2023-08-22 03:19:51 +00:00
Editor->SavePoint = Editor->History.At;
2023-07-24 13:50:57 +00:00
Editor->SelectedItem = -1;
2023-08-22 03:19:51 +00:00
workspace_text_data TextData = W_TextDataFromString(Editor->ProcessingArena, Editor->Text.String);
2023-07-24 13:50:57 +00:00
Editor->Tokens = TextData.Tokens;
Editor->Lines = TextData.Lines;
2023-07-19 15:09:41 +00:00
} break;
2023-09-05 17:50:49 +00:00
default: break;
2023-06-17 17:00:55 +00:00
}
2023-06-17 21:06:25 +00:00
DLLInsertLast(Parent->FirstView, Parent->LastView, View);
if(View->Parent)
{
Parent->CurrentView = View;
}
2023-06-17 17:00:55 +00:00
return(View);
}
2023-08-22 03:19:51 +00:00
inline void W_DestroyView(workspace_view *View)
2023-06-17 17:00:55 +00:00
{
2023-07-24 13:50:57 +00:00
switch(View->Type)
{
2023-08-22 03:19:51 +00:00
case W_View_TextEditor:
2023-07-24 13:50:57 +00:00
{
workspace_view_text_editor *Editor = (workspace_view_text_editor *)View->Data;
ArenaRelease(Editor->ProcessingArena);
MutableStringRelease(&Editor->Text);
ArenaRelease(Editor->HistoryArena);
} break;
2023-09-05 17:50:49 +00:00
default: break;
2023-07-24 13:50:57 +00:00
}
2023-06-17 17:00:55 +00:00
// sixten(NOTE): This function does not ensure that the view is not being used anywhere else.
2023-07-19 15:09:41 +00:00
ArenaRelease(View->Arena);
2023-06-17 17:00:55 +00:00
}
2023-08-22 03:19:51 +00:00
inline b32 W_ViewIsCurrent(workspace_view *View)
2023-06-17 17:00:55 +00:00
{
2023-08-22 03:19:51 +00:00
workspace *Workspace = W_GetState();
2023-07-19 15:09:41 +00:00
2023-06-17 17:00:55 +00:00
b32 Result = (Workspace->CurrentPanel && Workspace->CurrentPanel->CurrentView == View);
return(Result);
}
2023-08-22 03:19:51 +00:00
inline string W_GetViewName(workspace_view *View)
2023-06-17 17:00:55 +00:00
{
string Result = StrLit("Unnamed view");
switch(View->Type)
{
2023-08-22 03:19:51 +00:00
case W_View_Startup: { Result = StrLit("Welcome"); } break;
case W_View_Settings: { Result = StrLit("Settings"); } break;
case W_View_TextEditor:
{
workspace_view_text_editor *Editor = (workspace_view_text_editor *)View->Data;
if(AreEqual(Editor->FileName, StrLit("")))
{
Result = StrLit("Open File");
}
else
{
2023-08-22 03:19:51 +00:00
//if(Editor->History.At == &Editor->History.Sentinel)
if(Editor->History.At == Editor->SavePoint)
{
2023-08-22 03:19:51 +00:00
Result = PushString(W_FrameArena(), Editor->FileName);
}
else
{
2023-08-22 03:19:51 +00:00
Result = PushFormat(W_FrameArena(), "* %S", Editor->FileName);
}
}
} break;
2023-08-22 03:19:51 +00:00
case W_View_SceneView: { Result = StrLit("Scene View"); } break;
2023-06-17 17:00:55 +00:00
}
return(Result);
}
//- sixten: Builder code
2023-08-22 03:19:51 +00:00
static void W_BuildSettingsTabButton(workspace_view_settings *Settings, char *Name, workspace_settings_category Category)
2023-06-17 17:00:55 +00:00
{
b32 IsSelected = (Settings->Category == Category);
2023-08-22 03:19:51 +00:00
v4 Color = LinearBlend(Theme_TextColor, Theme_HighlightBorderColor, AC_AnimateValueF(IsSelected, IsSelected, 0.3, "Workspace Settings %s %p", Name, Settings));
2023-06-17 17:00:55 +00:00
UI_SetNextFont(Font_Bold);
UI_SetNextHeight(UI_TextContent(0, 1));
UI_SetNextTextColor(Color);
ui_box *Box = UI_MakeBoxF(UI_BoxFlag_DrawText |
UI_BoxFlag_Clickable,
Name);
ui_signal Signal = UI_SignalFromBox(Box);
if(Signal.Hovering)
{
Platform.SetCursor(PlatformCursor_Hand);
}
2023-06-18 10:09:36 +00:00
if(Signal.Pressed)
2023-06-17 17:00:55 +00:00
{
Settings->Category = Category;
}
}
2023-06-17 21:06:25 +00:00
static b32 UI_DropdownSelection(char **Alternatives, s32 AlternativeCount, b32 *Open, s32 *Selected)
2023-06-17 17:00:55 +00:00
{
2023-06-17 21:06:25 +00:00
b32 Result = false;
2023-06-17 17:00:55 +00:00
UI_SetNextLayoutAxis(Axis2_X);
UI_Parent(UI_MakeBoxF(0, ""))
{
UI_LabelF("Refresh Rate:");
UI_Spacer(UI_Pixels(10, 1));
2023-06-17 21:06:25 +00:00
b32 ActiveInDropdown = false;
2023-06-17 17:00:55 +00:00
UI_SetNextWidth(UI_Pixels(200, 1));
UI_SetNextCornerRadius(4);
UI_SetNextLayoutAxis(Axis2_X);
ui_box *DropdownBox = UI_MakeBoxF(UI_BoxFlag_DrawBackground |
UI_BoxFlag_DrawBorder |
UI_BoxFlag_HotAnimation |
UI_BoxFlag_ActiveAnimation |
UI_BoxFlag_Clickable,
"Dropdown");
UI_Parent(DropdownBox)
{
UI_Width(UI_Percent(1, 0)) UI_LabelF(Alternatives[*Selected]);
UI_BackgroundColor(Theme_BorderColor) UI_Width(UI_Pixels(1, 1)) UI_MakeBoxF(UI_BoxFlag_DrawBackground, "");
UI_Width(UI_Pixels(25, 1)) UI_Font(Font_Icons) UI_LabelF("%U", FontIcon_DownDir);
}
2023-06-17 21:06:25 +00:00
ui_signal DropdownSignal = UI_SignalFromBox(DropdownBox);
if(DropdownSignal.Pressed)
2023-06-17 17:00:55 +00:00
{
2023-06-17 21:06:25 +00:00
*Open = !(*Open);
2023-06-17 17:00:55 +00:00
}
2023-09-13 04:42:11 +00:00
if(AreEqual(UI_ActiveKey(), DropdownBox->Key))
2023-06-17 21:06:25 +00:00
{
ActiveInDropdown = true;
}
2023-08-22 03:19:51 +00:00
r32 OpenTransition = AC_AnimateValueF(*Open, 0, 0.175, "UI Dropdown %p%p", Alternatives, Open);
2023-06-17 21:06:25 +00:00
if(OpenTransition > 0.1)
2023-06-17 17:00:55 +00:00
{
UI_Tooltip
{
UI_SetNextFixedP(V2(DropdownBox->Rect.Min.x, DropdownBox->Rect.Max.y));
UI_SetNextCornerRadius(4);
UI_SetNextWidth(UI_Pixels(200, 1));
2023-06-17 21:06:25 +00:00
UI_SetNextHeight(UI_ChildrenSum(OpenTransition, 1));
2023-06-17 17:00:55 +00:00
UI_Parent(UI_MakeBoxF(UI_BoxFlag_Clip |
UI_BoxFlag_DrawDropShadow |
UI_BoxFlag_FloatingX |
UI_BoxFlag_FloatingY, "Dropdown Contents"))
{
2023-06-17 21:06:25 +00:00
UI_PushWidth(UI_Percent(1, 1));
2023-06-17 17:00:55 +00:00
for(s64 Index = 0;
2023-06-17 21:06:25 +00:00
Index < Round(AlternativeCount*OpenTransition);
2023-06-17 17:00:55 +00:00
++Index)
{
2023-06-17 21:06:25 +00:00
ui_signal ButtonSignal = UI_ButtonF(Alternatives[Index]);
2023-09-13 04:42:11 +00:00
if(AreEqual(UI_ActiveKey(), ButtonSignal.Box->Key))
2023-06-17 21:06:25 +00:00
{
ActiveInDropdown = true;
}
if(ButtonSignal.Pressed)
{
*Selected = Index;
Result = true;
}
2023-06-17 17:00:55 +00:00
}
2023-06-17 21:06:25 +00:00
UI_PopWidth();
2023-06-17 17:00:55 +00:00
}
}
}
2023-06-17 21:06:25 +00:00
2023-09-13 04:42:11 +00:00
if(!ActiveInDropdown && !AreEqual(UI_ActiveKey(), UI_EmptyKey()))
2023-06-17 21:06:25 +00:00
{
*Open = false;
}
2023-06-17 17:00:55 +00:00
}
2023-06-17 21:06:25 +00:00
return(Result);
2023-06-17 17:00:55 +00:00
}
2023-08-22 03:19:51 +00:00
static void W_BuildSceneView(workspace_view *View)
{
workspace *Workspace = W_GetState();
SV_BuildSceneView(Workspace->Input);
}
static void W_BuildSettings(workspace_view *View)
2023-06-17 17:00:55 +00:00
{
workspace_view_settings *Settings = (workspace_view_settings *)View->Data;
2023-08-22 03:19:51 +00:00
workspace *Workspace = W_GetState();
2023-07-19 15:09:41 +00:00
2023-06-17 17:00:55 +00:00
UI_Height(UI_ChildrenSum(1, 1))
2023-06-27 14:14:28 +00:00
UI_Column() UI_Padding(UI_Pixels(50, 0))
UI_Row() UI_Padding(UI_Pixels(50, 0))
2023-06-17 17:00:55 +00:00
{
UI_Size(UI_TextContent(0, 1), UI_TextContent(10, 1))
UI_Font(Font_Bold) UI_FontSize(36)
UI_LabelF("Settings");
}
UI_LayoutAxis(Axis2_X)
UI_Size(UI_Percent(1, 0), UI_Percent(1, 0))
UI_Parent(UI_MakeBoxF(0, ""))
{
UI_Width(UI_Pixels(300, 1))
UI_Parent(UI_MakeBoxF(0, "Navigation"))
{
2023-06-27 14:14:28 +00:00
UI_Row() UI_Padding(UI_Pixels(50, 1))
UI_Width(UI_Percent(1, 0)) UI_Column() UI_Padding(UI_Percent(1, 0))
2023-06-17 17:00:55 +00:00
UI_Height(UI_ChildrenSum(1, 1)) UI_LayoutAxis(Axis2_Y) UI_Parent(UI_MakeBoxF(0, ""))
{
2023-08-22 03:19:51 +00:00
W_BuildSettingsTabButton(Settings, "All", W_Settings_All);
2023-06-17 17:00:55 +00:00
UI_Spacer(UI_Pixels(30, 1));
2023-08-22 03:19:51 +00:00
W_BuildSettingsTabButton(Settings, "General", W_Settings_General);
2023-06-17 17:00:55 +00:00
UI_Spacer(UI_Pixels(30, 1));
2023-08-22 03:19:51 +00:00
W_BuildSettingsTabButton(Settings, "Developer", W_Settings_Developer);
2023-06-17 17:00:55 +00:00
UI_Spacer(UI_Pixels(150, 1));
}
}
UI_CornerRadius(5)
UI_Width(UI_Pixels(1.25, 1))
UI_BackgroundColor(Color_Grey)
UI_MakeBoxF(UI_BoxFlag_DrawBackground, "Separator");
UI_Padding(UI_Pixels(70, 0))
UI_LayoutAxis(Axis2_Y)
UI_Width(UI_Percent(1, 0))
UI_Parent(UI_MakeBoxF(0, "Tab"))
UI_Size(UI_TextContent(0, 1), UI_TextContent(10, 1))
{
2023-08-22 03:19:51 +00:00
UI_SetNextSize(UI_Percent(1, 0), UI_Percent(1, 0));
UI_Scroll(0, &Settings->GlobalScroll, UI_BoxFlag_Clip)
2023-06-17 17:00:55 +00:00
{
2023-08-22 03:19:51 +00:00
workspace_settings_category Category = Settings->Category;
if(!Category || (Category == W_Settings_General))
2023-06-19 17:12:26 +00:00
{
2023-08-22 03:19:51 +00:00
UI_Font(Font_Bold) UI_FontSize(36) UI_LabelF("General");
2023-09-05 17:50:49 +00:00
char *Alternatives[] = {"15 Hz", "30 Hz", "60 Hz", "120 Hz", "144 Hz", "Uncapped", "V-Sync"};
s64 AlternativeMapping[] = {15, 30, 60, 120, 144, -1, 0};
2023-08-22 03:19:51 +00:00
s32 DropdownSelected;
FindIndexOfElement(DropdownSelected, AlternativeMapping, 0, Workspace->Input->RefreshRate);
if(UI_DropdownSelection(Alternatives, ArrayCount(Alternatives),
&Settings->GeneralDropdownOpen, &DropdownSelected))
{
Workspace->Input->RefreshRate = AlternativeMapping[DropdownSelected];
Settings->GeneralDropdownOpen = false;
}
UI_Spacer(UI_Pixels(50, 1));
2023-06-19 17:12:26 +00:00
}
2023-06-17 21:06:25 +00:00
2023-08-22 03:19:51 +00:00
if(!Category || (Category == W_Settings_Developer))
{
UI_Font(Font_Bold) UI_FontSize(36) UI_LabelF("Developer");
UI_Checkbox(&DEBUG_DebugSettings->RenderUIDebugRects, StrLit("Render UI Debug Rects"));
UI_Spacer(UI_Pixels(5, 1));
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));
}
2023-06-17 17:00:55 +00:00
}
}
}
UI_Spacer(UI_Pixels(50, 1));
}
2023-08-22 03:19:51 +00:00
static void W_BuildView(workspace_view *View)
2023-06-17 17:00:55 +00:00
{
r32 ViewHighlightTransition =
2023-08-22 03:19:51 +00:00
AC_AnimateValueF(W_ViewIsCurrent(View), 0, 0.25, "Workspace View Highlight %p", View);
2023-06-17 17:00:55 +00:00
UI_SetNextBorderColor(LinearBlend(Theme_BorderColor, Theme_HighlightBorderColor, ViewHighlightTransition));
2023-06-23 12:38:15 +00:00
UI_PushBackgroundColor(Theme_BackgroundColor);
2023-06-17 17:00:55 +00:00
UI_SetNextCornerRadius(3);
ui_box *ViewBox = UI_MakeBoxF(UI_BoxFlag_Clickable |
UI_BoxFlag_DrawBackground |
UI_BoxFlag_DrawBorder |
UI_BoxFlag_Clip,
"Workspace View %p", View);
UI_Parent(ViewBox)
UI_Size(UI_Percent(1, 0), UI_Percent(1, 0))
{
2023-09-05 17:50:49 +00:00
switch(View->Type)
2023-06-17 17:00:55 +00:00
{
2023-09-05 17:50:49 +00:00
case W_View_Startup:
2023-06-17 17:00:55 +00:00
{
2023-09-05 17:50:49 +00:00
UI_Row() UI_Padding(UI_Pixels(50, 0))
UI_Width(UI_ChildrenSum(1, 1)) UI_Column() UI_Padding(UI_Pixels(50, 0))
2023-06-17 17:00:55 +00:00
{
2023-09-05 17:50:49 +00:00
UI_Size(UI_TextContent(0, 1), UI_TextContent(10, 1))
{
UI_Font(Font_Bold) UI_FontSize(36)
UI_LabelF("Welcome to VN");
UI_TextColor(Theme_BorderColor) UI_LabelF("An impractical way to make a game");
UI_Spacer(UI_Percent(1, 0));
UI_Checkbox(&DEBUG_DebugSettings->ShowWelcomeMessage, StrLit("Show this message on startup"));
}
2023-06-17 17:00:55 +00:00
}
2023-09-05 17:50:49 +00:00
} break;
case W_View_Settings:
{
W_BuildSettings(View);
} break;
case W_View_TextEditor:
{
W_BuildTextEditor(View);
} break;
case W_View_SceneView:
{
W_BuildSceneView(View);
} break;
2023-06-17 17:00:55 +00:00
}
}
2023-06-23 12:38:15 +00:00
UI_PopBackgroundColor();
2023-06-17 17:00:55 +00:00
UI_SignalFromBox(ViewBox);
}