CogEngine: Improve various windows widgets usability

- Implement ImGui Copy Paste, and OpenInShell backend.
- Fix ColorEdit4
- Fix Hand and NotAllowed cursors
- Make the reset of windows configuration automatic (but optional) when getting a config.
- Console Window: Improve usability
- Stat Window: Add configuration of of MaxFPS, Pings, and PacketLoss. Improve widget usability.
- Time Scale Window: Add configuration of time scale. Improve widget usability.
- Output Log Window: Fix the Copy.
- Selection Window: The Pick button now uses an icon
This commit is contained in:
Arnaud Jamin
2025-02-04 01:26:19 -05:00
parent cb758450be
commit 9bf32b2d86
57 changed files with 1056 additions and 582 deletions
@@ -12,7 +12,6 @@ public:
UCogCommonConfig()
{
Reset();
}
virtual void Reset()
@@ -15,6 +15,7 @@ public class CogEngine : ModuleRules
PrivateDependencyModuleNames.AddRange(
new []
{
"ApplicationCore",
"CogCommon",
"CogImgui",
"CogWindow",
@@ -90,14 +90,6 @@ void FCogEngineWindow_Cheats::UpdateCheatColor(const FCogEngineCheat& Cheat) con
}
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_Cheats::ResetConfig()
{
Super::ResetConfig();
Config->Reset();
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_Cheats::GameTick(float DeltaTime)
{
@@ -25,14 +25,6 @@ void FCogEngineWindow_CollisionTester::RenderHelp()
ImGui::Text("This window is used to test a collision query.");
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_CollisionTester::ResetConfig()
{
Super::ResetConfig();
Config->Reset();
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_CollisionTester::RenderContent()
{
@@ -32,14 +32,6 @@ void FCogEngineWindow_CollisionViewer::RenderHelp()
);
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_CollisionViewer::ResetConfig()
{
Super::ResetConfig();
Config->Reset();
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_CollisionViewer::RenderContent()
{
@@ -4,6 +4,10 @@
#include "CogWindowManager.h"
#include "CogWindowWidgets.h"
#include "imgui.h"
#include "imgui.h"
#include "imgui.h"
#include "imgui.h"
#include "imgui.h"
#include "imgui_internal.h"
//--------------------------------------------------------------------------------------------------------------------------
@@ -28,6 +32,12 @@ void FCogEngineWindow_Console::Initialize()
RefreshCommandList();
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_Console::PreRender(ImGuiWindowFlags& WindowFlags)
{
WindowFlags |= ImGuiWindowFlags_NoScrollbar;
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_Console::RenderContent()
{
@@ -57,39 +67,16 @@ void FCogEngineWindow_Console::RenderContent()
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_Console::RenderMainMenuWidget()
void FCogEngineWindow_Console::RenderTick(float DeltaTime)
{
bIsRenderingWidget = true;
const ImGuiContext& g = *GImGui;
const ImGuiStyle& Style = g.Style;
const ImGuiWindow* Window = ImGui::GetCurrentWindow();
ImVec2 TooltipPos = Window->DC.CursorPos;
TooltipPos.y += Window->MenuBarHeight;
ImGui::SetNextItemWidth(Config->WidgetWidth);
RenderInput();
const bool IsTextInputActive = ImGui::IsItemActive();
if (Config->FocusWidgetWhenAppearing && ImGui::IsWindowAppearing())
{
SelectedCommandIndex = -1;
RefreshCommandList();
ImGui::ActivateItemByID(InputIdOnWidgetMode);
}
if (ImGui::BeginPopupContextItem())
{
RenderMenu();
ImGui::EndPopup();
}
if (bPopupCommandListOnWidgetMode)
if (WidgetMode_OpenCommandList)
{
bIsWidgetMode = true;
const ImGuiContext& g = *GImGui;
ImGui::SetNextWindowBgAlpha(g.Style.Colors[ImGuiCol_PopupBg].w * 0.90f);
ImGui::SetNextWindowSize(ImVec2(Config->WidgetWidth, ImGui::GetFontSize() * 30), ImGuiCond_FirstUseEver);
ImGui::SetNextWindowPos(TooltipPos, ImGuiCond_Always);
ImGui::SetNextWindowPos(WidgetMode_CommandListPosition, ImGuiCond_Always);
ImGuiWindowFlags flags =
ImGuiWindowFlags_NoTitleBar
@@ -97,28 +84,83 @@ void FCogEngineWindow_Console::RenderMainMenuWidget()
| ImGuiWindowFlags_NoFocusOnAppearing; // We want the console input text to keep the focus.
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0));
if (ImGui::Begin("ConsoleTooltip", nullptr, flags))
const bool IsCommandListWindowVisible = ImGui::Begin("ConsoleCommandList", nullptr, flags);
ImGui::PopStyleVar();
if (IsCommandListWindowVisible)
{
ImGui::Spacing();
RenderCommandList();
if (ImGui::BeginPopupContextWindow())
if (ImGui::BeginPopupContextWindow("ConsoleCommandListPopup"))
{
RenderMenu();
ImGui::EndPopup();
}
const bool IsWindowFocused = ImGui::IsWindowFocused(ImGuiFocusedFlags_RootAndChildWindows);
if (IsTextInputActive == false && IsWindowFocused == false && bRequestInputFocus == false)
if (IsWindowFocused)
{
bPopupCommandListOnWidgetMode = false;
if (ImGui::IsKeyPressed(ImGuiKey_DownArrow))
{
SelectNextCommand();
ActivateInputText();
}
else if (ImGui::IsKeyPressed(ImGuiKey_UpArrow))
{
SelectPreviousCommand();
ActivateInputText();
}
else if (ImGui::IsKeyPressed(ImGuiKey_Tab))
{
SelectNextCommand();
ActivateInputText();
}
else if (ImGui::IsKeyPressed(ImGuiKey_Escape))
{
WidgetMode_OpenCommandList = false;
}
}
if (IsWindowFocused == false && WidgetMode_IsTextInputActive == false)
{
WidgetMode_OpenCommandList = false;
}
}
ImGui::End();
ImGui::PopStyleVar();
bIsWidgetMode = false;
}
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_Console::RenderMainMenuWidget()
{
bIsWidgetMode = true;
const ImGuiWindow* Window = ImGui::GetCurrentWindow();
WidgetMode_CommandListPosition = Window->DC.CursorPos;
WidgetMode_CommandListPosition.y += Window->MenuBarHeight;
ImGui::SetNextItemWidth(Config->WidgetWidth);
RenderInput();
WidgetMode_IsTextInputActive = ImGui::IsItemActive();
if (Config->FocusWidgetWhenAppearing && ImGui::IsWindowAppearing())
{
SelectedCommandIndex = -1;
RefreshCommandList();
ActivateInputText();
}
bIsRenderingWidget = false;
if (ImGui::BeginPopupContextItem())
{
RenderMenu();
ImGui::EndPopup();
}
bIsWidgetMode = false;
}
//--------------------------------------------------------------------------------------------------------------------------
@@ -127,6 +169,8 @@ void FCogEngineWindow_Console::RenderMenu()
if (ImGui::BeginMenu("Options"))
{
FCogWindowWidgets::ThinSeparatorText("General");
ImGui::Checkbox("Show Help", &Config->ShowHelp);
if (ImGui::Checkbox("Sort Commands", &Config->SortCommands))
{
@@ -172,7 +216,7 @@ void FCogEngineWindow_Console::RenderMenu()
ImGui::EndMenu();
}
if (bIsRenderingWidget == false && Config->DockInputInMenuBar)
if (bIsWidgetMode == false && Config->DockInputInMenuBar)
{
ImGui::SetNextItemWidth(-1);
RenderInput();
@@ -192,17 +236,15 @@ void FCogEngineWindow_Console::RenderInput()
| ImGuiInputTextFlags_CallbackEdit
| ImGuiInputTextFlags_CallbackAlways;
if (FCogWindowWidgets::InputTextWithHint("##Command", "Command", CurrentUserInput, InputFlags, &OnTextInputCallbackStub, this))
const bool IsEnterPressed = FCogWindowWidgets::InputTextWithHint("##Command", "Command", CurrentUserInput, InputFlags, &OnTextInputCallbackStub, this);
InputTextId = ImGui::GetItemID();
if (IsEnterPressed)
{
ExecuteCommand(CurrentUserInput);
bRequestInputFocus = true;
ActivateInputText();
}
if (bIsRenderingWidget)
{
InputIdOnWidgetMode = ImGui::GetItemID();
}
ImGui::SetItemDefaultFocus();
//-------------------------------------------------------------------------------------------------
@@ -211,19 +253,33 @@ void FCogEngineWindow_Console::RenderInput()
// we want the text input to always have focus so the user can directly type text if he wants to,
// but if he doesn't the command list should not clutter the screen.
//-------------------------------------------------------------------------------------------------
if (bIsRenderingWidget && ImGui::IsItemActive() && ImGui::IsMouseClicked(ImGuiMouseButton_Left))
if (bIsWidgetMode && ImGui::IsItemActive() && ImGui::IsMouseClicked(ImGuiMouseButton_Left))
{
bPopupCommandListOnWidgetMode = true;
}
if (ImGui::IsItemActive() == false && bRequestInputFocus)
{
ImGui::SetKeyboardFocusHere(-1);
WidgetMode_OpenCommandList = true;
}
}
if (ImGui::IsItemActive())
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_Console::SelectNextCommand()
{
SelectedCommandIndex += 1;
bScroll = true;
if (SelectedCommandIndex >= CommandList.Num())
{
bRequestInputFocus = false;
SelectedCommandIndex = 0;
}
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_Console::SelectPreviousCommand()
{
SelectedCommandIndex -= 1;
bScroll = true;
if (SelectedCommandIndex < 0)
{
SelectedCommandIndex = CommandList.Num() - 1;
}
}
@@ -233,43 +289,32 @@ int FCogEngineWindow_Console::OnTextInputCallback(ImGuiInputTextCallbackData* In
bool DoCompletion = false;
if (InData->EventFlag == ImGuiInputTextFlags_CallbackHistory)
{
DoCompletion = true;
if (InData->EventKey == ImGuiKey_UpArrow)
{
SelectedCommandIndex -= 1;
bScroll = true;
if (SelectedCommandIndex < 0)
{
SelectedCommandIndex = CommandList.Num() - 1;
}
SelectPreviousCommand();
}
else if (InData->EventKey == ImGuiKey_DownArrow)
{
SelectedCommandIndex += 1;
bScroll = true;
if (SelectedCommandIndex >= CommandList.Num())
{
SelectedCommandIndex = 0;
}
SelectNextCommand();
}
DoCompletion = true;
}
else if (InData->EventFlag == ImGuiInputTextFlags_CallbackCompletion)
{
SelectNextCommand();
DoCompletion = true;
}
else if (InData->EventFlag == ImGuiInputTextFlags_CallbackEdit)
{
CurrentUserInput = FString(InData->Buf);
RefreshCommandList();
RefreshCommandList();
if (bIsRenderingWidget)
if (bIsWidgetMode)
{
bPopupCommandListOnWidgetMode = true;
WidgetMode_OpenCommandList = true;
}
}
}
else if (InData->EventFlag == ImGuiInputTextFlags_CallbackAlways)
{
if (bSetBufferToSelectedCommand)
@@ -288,9 +333,9 @@ int FCogEngineWindow_Console::OnTextInputCallback(ImGuiInputTextCallbackData* In
InData->InsertChars(0, CommandStr.Get());
InData->InsertChars(InData->CursorPos, " ");
if (bIsRenderingWidget)
if (bIsWidgetMode)
{
bPopupCommandListOnWidgetMode = true;
WidgetMode_OpenCommandList = true;
}
}
@@ -304,25 +349,39 @@ int FCogEngineWindow_Console::OnTextInputCallbackStub(ImGuiInputTextCallbackData
return ConsoleWindow.OnTextInputCallback(InData);
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_Console::RenderCommandHelp()
{
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_Console::RenderCommandList()
{
const float HelpHeight = ImGui::GetFontSize() * 5;
const float HelpHeight = Config->ShowHelp ? ImGui::GetFontSize() * 5 : 0.0f;
const float Indent = ImGui::GetFontSize() * 0.5f;
const ImVec2 Size = IsWindowRenderedInMainMenu() ? ImVec2(0, ImGui::GetFontSize() * 20) : ImVec2(0.0f, ImGui::GetContentRegionAvail().y - HelpHeight);
const ImVec2 Size = IsWindowRenderedInMainMenu() ? ImVec2(0, ImGui::GetFontSize() * 20) : ImVec2(0.0f, -HelpHeight);
if (ImGui::BeginChild("Commands", Size, ImGuiChildFlags_NavFlattened | ImGuiChildFlags_ResizeY))
if (ImGui::BeginChild("Commands", Size, ImGuiChildFlags_None))
{
ImGui::Indent(Indent);
//--------------------------------------------------------------------
// Gather the child window region min max so we can check if the
// selected command is clipped to know if we should scroll.
//--------------------------------------------------------------------
const float RegionMinY = ImGui::GetItemRectMin().y;
const float RegionMaxY = RegionMinY + ImGui::GetContentRegionAvail().y;
//--------------------------------------------------------------------
// Reset the scroll when the command list reappear, otherwise we
// keep the previous scroll which can be confusing.
//--------------------------------------------------------------------
if (ImGui::IsWindowAppearing())
{
ImGui::SetScrollHereY(0.0f);
SelectedCommandIndex = -1;
}
int32 Index = 0;
//--------------------------------------------------------------------
// TODO: The Clipper is currently not working correctly
//--------------------------------------------------------------------
ImGuiListClipper Clipper;
Clipper.Begin(CommandList.Num());
while (Clipper.Step())
@@ -336,7 +395,7 @@ void FCogEngineWindow_Console::RenderCommandList()
{
ImGui::PushID(Index);
const FString& CommandName = CommandList[Index];
RenderCommand(CommandName, Index);
RenderCommand(CommandName, Index, RegionMinY, RegionMaxY);
ImGui::PopID();
}
}
@@ -346,13 +405,16 @@ void FCogEngineWindow_Console::RenderCommandList()
}
Clipper.End();
// If any is available, draw an additional command below the clipper to be able to scroll when pressing bottom
//--------------------------------------------------------------------
// If any is available, draw an additional command below the clipper
// to be able to scroll when pressing bottom
//--------------------------------------------------------------------
if (CommandList.IsValidIndex(Index + 1))
{
const FString& Command = CommandList[Index + 1];
RenderCommand(Command, Index);
RenderCommand(Command, Index, RegionMinY, RegionMaxY);
}
ImGui::Unindent(Indent);
}
ImGui::EndChild();
@@ -360,29 +422,31 @@ void FCogEngineWindow_Console::RenderCommandList()
//--------------------------------------------------------------------
// Render Help
//--------------------------------------------------------------------
ImGui::PushStyleColor(ImGuiCol_ChildBg, ImVec4(0.2f, 0.2f, 0.2f, 0.5f));
if (ImGui::BeginChild("Help", ImVec2(0.0f, ImGui::GetContentRegionAvail().y)))
if (Config->ShowHelp)
{
ImGui::Spacing();
ImGui::BeginDisabled();
ImGui::Indent(Indent);
if (CommandList.IsValidIndex(SelectedCommandIndex))
ImGui::PushStyleColor(ImGuiCol_ChildBg, ImVec4(0.2f, 0.2f, 0.2f, 0.5f));
if (ImGui::BeginChild("Help", ImVec2(0.0f, ImGui::GetContentRegionAvail().y)))
{
const FString SelectedCommand = CommandList[SelectedCommandIndex];
const FString Help = GetConsoleCommandHelp(SelectedCommand);
const auto& HelpStr = StringCast<ANSICHAR>(*Help);
ImGui::TextWrapped(HelpStr.Get());
ImGui::Spacing();
ImGui::BeginDisabled();
ImGui::Indent(Indent);
if (CommandList.IsValidIndex(SelectedCommandIndex))
{
const FString SelectedCommand = CommandList[SelectedCommandIndex];
const FString Help = GetConsoleCommandHelp(SelectedCommand);
const auto& HelpStr = StringCast<ANSICHAR>(*Help);
ImGui::TextWrapped(HelpStr.Get());
}
ImGui::Unindent(Indent);
ImGui::EndDisabled();
}
ImGui::Unindent(Indent);
ImGui::EndDisabled();
ImGui::EndChild();
ImGui::PopStyleColor();
}
ImGui::EndChild();
ImGui::PopStyleColor();
}
//--------------------------------------------------------------------------------------------------------------------------
FString FCogEngineWindow_Console::GetConsoleCommandHelp(const FString& InCommandName)
{
@@ -404,7 +468,7 @@ FString FCogEngineWindow_Console::GetConsoleCommandHelp(const FString& InCommand
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_Console::RenderCommand(const FString& CommandName, const int32 Index)
void FCogEngineWindow_Console::RenderCommand(const FString& CommandName, const int32 Index, float RegionMinY, float RegionMaxY)
{
const auto& CommandNameStr = StringCast<ANSICHAR>(*CommandName);
@@ -421,17 +485,25 @@ void FCogEngineWindow_Console::RenderCommand(const FString& CommandName, const i
ImGuiSelectableFlags Flags =
ImGuiSelectableFlags_AllowDoubleClick // Double click executes the selected command
| ImGuiSelectableFlags_SelectOnClick; // Need to focus the console text input right away, otherwise the Selectable take back the focus on mouse release
if (ImGui::Selectable(CommandNameStr.Get(), &IsSelected, Flags))
const bool Pressed = ImGui::Selectable(CommandNameStr.Get(), &IsSelected, Flags);
const int32 IsClippedTop = ImGui::GetItemRectMin().y < RegionMinY;
const int32 IsClippedBottom = ImGui::GetItemRectMax().y > RegionMaxY;
if (Pressed)
{
SelectedCommandIndex = Index;
bRequestInputFocus = true;
bSetBufferToSelectedCommand = true;
if (ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left))
{
ExecuteCommand(CommandName);
}
else
{
bSetBufferToSelectedCommand = true;
}
ActivateInputText();
}
if (ImGui::BeginItemTooltip())
@@ -455,13 +527,19 @@ void FCogEngineWindow_Console::RenderCommand(const FString& CommandName, const i
ImGui::Separator();
}
if (IsSelected)
{
if (bScroll)
if (IsSelected && bScroll)
{
if (IsClippedBottom)
{
ImGui::SetScrollHereY(1.0f);
bScroll = false;
}
if (IsClippedTop)
{
ImGui::SetScrollHereY(0.0f);
}
bScroll = false;
}
}
@@ -530,6 +608,12 @@ void FCogEngineWindow_Console::RefreshCommandList()
SelectedCommandIndex = -1;
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_Console::ActivateInputText() const
{
return ImGui::ActivateItemByID(InputTextId);
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_Console::ExecuteCommand(const FString& InCommand)
{
@@ -540,9 +624,9 @@ void FCogEngineWindow_Console::ExecuteCommand(const FString& InCommand)
GEngine->DeferredCommands.Add(CleanupCommand);
}
if (bIsRenderingWidget)
if (bIsWidgetMode)
{
bPopupCommandListOnWidgetMode = false;
WidgetMode_OpenCommandList = false;
}
CurrentUserInput = FString();
@@ -27,14 +27,6 @@ void FCogEngineWindow_DebugSettings::Initialize()
FCogDebug::SetIsFilteringBySelection(GetWorld(), Config->Data.bIsFilteringBySelection);
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_DebugSettings::ResetConfig()
{
Super::ResetConfig();
Config->Reset();
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_DebugSettings::PreSaveConfig()
{
@@ -27,14 +27,6 @@ void FCogEngineWindow_Metrics::RenderHelp()
);
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_Metrics::ResetConfig()
{
Super::ResetConfig();
Config->Reset();
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_Metrics::PreSaveConfig()
{
@@ -1,6 +1,7 @@
#include "CogEngineWindow_NetEmulation.h"
#include "CogEngineWindow_Stats.h"
#include "CogImguiHelper.h"
#include "CogWindowWidgets.h"
#include "Engine/Engine.h"
#include "Engine/NetConnection.h"
@@ -16,6 +17,25 @@ void FCogEngineWindow_NetEmulation::RenderHelp()
ImGui::Text("This window is used to configure the network emulation.");
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_NetEmulation::Initialize()
{
Super::Initialize();
Config = GetConfig<UCogEngineWindowConfig_Stats>();
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_NetEmulation::RenderContextMenu()
{
Config->RenderColorConfig();
Config->RenderPingConfig();
Config->RenderPacketLossConfig();
ImGui::Separator();
FCogWindow::RenderContextMenu();
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_NetEmulation::RenderContent()
{
@@ -42,7 +62,7 @@ void FCogEngineWindow_NetEmulation::DrawStats()
const float Ping = PlayerState->GetPingInMilliseconds();
ImGui::Text("Ping ");
ImGui::SameLine();
ImGui::TextColored(FCogEngineWindow_Stats::GetPingColor(Ping), "%0.0fms", Ping);
ImGui::TextColored(Config->GetPingColor(Ping), "%0.0fms", Ping);
}
if (UNetConnection* Connection = PlayerController->GetNetConnection())
@@ -50,12 +70,12 @@ void FCogEngineWindow_NetEmulation::DrawStats()
const float OutPacketLost = Connection->GetOutLossPercentage().GetAvgLossPercentage() * 100.0f;
ImGui::Text("Packet Loss Out ");
ImGui::SameLine();
ImGui::TextColored(FCogEngineWindow_Stats::GetPacketLossColor(OutPacketLost), "%0.0f%%", OutPacketLost);
ImGui::TextColored(Config->GetPacketLossColor(OutPacketLost), "%0.0f%%", OutPacketLost);
const float InPacketLost = Connection->GetInLossPercentage().GetAvgLossPercentage() * 100.0f;
ImGui::Text("Packet Loss In ");
ImGui::SameLine();
ImGui::TextColored(FCogEngineWindow_Stats::GetPacketLossColor(InPacketLost), "%0.0f%%", InPacketLost);
ImGui::TextColored(Config->GetPacketLossColor(InPacketLost), "%0.0f%%", InPacketLost);
}
}
@@ -76,13 +76,6 @@ void FCogEngineWindow_NetImgui::Shutdown()
CloseServer();
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_NetImgui::ResetConfig()
{
Super::ResetConfig();
Config->Reset();
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_NetImgui::RenderHelp()
{
@@ -1,8 +1,10 @@
#include "CogEngineWindow_OutputLog.h"
#include "CogDebugHelper.h"
#include "CogImguiHelper.h"
#include "CogWindowWidgets.h"
#include "Engine/Engine.h"
#include "HAL/PlatformApplicationMisc.h"
#include "Misc/StringBuilder.h"
//--------------------------------------------------------------------------------------------------------------------------
@@ -25,14 +27,6 @@ void FCogEngineWindow_OutputLog::RenderHelp()
);
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_OutputLog::ResetConfig()
{
Super::ResetConfig();
Config->Reset();
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_OutputLog::Clear()
{
@@ -61,7 +55,6 @@ void FCogEngineWindow_OutputLog::AddLog(const TCHAR* Message, ELogVerbosity::Typ
TextBuffer.append(Format.GetData(), Format.GetData() + Format.Len());
LineInfo.End = TextBuffer.size();
}
//--------------------------------------------------------------------------------------------------------------------------
@@ -70,9 +63,9 @@ void FCogEngineWindow_OutputLog::DrawRow(const char* BufferStart, const FLineInf
ImU32 Color;
switch (LineInfo.Verbosity)
{
case ELogVerbosity::Error: Color = IM_COL32(255, 0, 0, 255); break;
case ELogVerbosity::Warning: Color = IM_COL32(255, 200, 0, 255); break;
default: Color = IM_COL32(200, 200, 200, 255); break;
case ELogVerbosity::Error: Color = FCogImguiHelper::ToImColor(Config->ErrorColor); break;
case ELogVerbosity::Warning: Color = FCogImguiHelper::ToImColor(Config->WarningColor); break;
default: Color = FCogImguiHelper::ToImColor(Config->DefaultColor); break;
}
ImGui::PushStyleColor(ImGuiCol_Text, Color);
@@ -132,21 +125,37 @@ void FCogEngineWindow_OutputLog::DrawRow(const char* BufferStart, const FLineInf
ImGui::PopStyleColor();
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_OutputLog::Copy() const
{
const auto Buffer = StringCast<TCHAR>(TextBuffer.c_str());
const wchar_t* BufferData = Buffer.Get();
if (BufferData == nullptr)
{ return; }
FStringBuilderBase StringBuilder;
for (const FLineInfo& LineInfo : LineInfos)
{
StringBuilder.Append(FString::Printf(TEXT("[%3d] [%s] [%s] "), LineInfo.Frame, *LineInfo.Category.ToString(), ToString(LineInfo.Verbosity)));
StringBuilder.Append(BufferData + LineInfo.Start, LineInfo.End - LineInfo.Start);
StringBuilder.Append("\n");
};
FPlatformApplicationMisc::ClipboardCopy(StringBuilder.ToString());
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_OutputLog::RenderContent()
{
Super::RenderContent();
bool ClearPressed = false;
bool CopyPressed = false;
if (ImGui::BeginMenuBar())
{
if (ImGui::BeginMenu("Options"))
{
if (ImGui::MenuItem("Copy"))
{
ImGui::LogToClipboard();
Copy();
}
ImGui::Separator();
@@ -156,6 +165,20 @@ void FCogEngineWindow_OutputLog::RenderContent()
ImGui::Checkbox("Show Verbosity", &Config->ShowVerbosity);
ImGui::Checkbox("Show As Table", &Config->ShowAsTable);
ImGui::Separator();
constexpr ImGuiColorEditFlags ColorEditFlags = ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_AlphaPreviewHalf;
FCogImguiHelper::ColorEdit4("Default Color", Config->DefaultColor, ColorEditFlags);
FCogImguiHelper::ColorEdit4("Warning Color", Config->WarningColor, ColorEditFlags);
FCogImguiHelper::ColorEdit4("Error Color", Config->ErrorColor, ColorEditFlags);
ImGui::Separator();
if (ImGui::Button("Reset Settings", ImVec2(-1, 0)))
{
ResetConfig();
}
ImGui::EndMenu();
}
@@ -247,8 +270,6 @@ void FCogEngineWindow_OutputLog::RenderContent()
if (LineInfo.Verbosity <= (ELogVerbosity::Type)Config->VerbosityFilter)
{
const char* LineStart = BufferStart + LineInfo.Start;
const char* LineEnd = BufferStart + LineInfo.End;
DrawRow(BufferStart, LineInfo, IsTableShown);
}
}
@@ -292,6 +313,11 @@ void FCogEngineWindow_OutputLog::RenderContent()
Clear();
}
if (ImGui::MenuItem("Copy"))
{
Copy();
}
ImGui::EndPopup();
}
}
@@ -38,8 +38,6 @@ void FCogEngineWindow_Plots::ResetConfig()
{
Super::ResetConfig();
Config->Reset();
RefreshPlotSettings();
}
@@ -60,14 +60,6 @@ void FCogEngineWindow_Selection::Shutdown()
{
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_Selection::ResetConfig()
{
Super::ResetConfig();
Config->Reset();
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_Selection::PreSaveConfig()
{
@@ -298,17 +290,23 @@ void FCogEngineWindow_Selection::TickSelectionMode()
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_Selection::RenderMainMenuWidget()
{
if (ImGui::MenuItem("Pick"))
ImGui::PushStyleVarX(ImGuiStyleVar_ItemSpacing, 0);
ImGui::PushStyleColor(ImGuiCol_Button, IM_COL32(0, 0, 0, 0));
if (FCogWindowWidgets::PickButton("##Pick", ImVec2(20, 20)))
{
GetOwner()->SetActivateSelectionMode(true);
HackWaitInputRelease();
}
RenderPickButtonTooltip();
//TODO: Could be replaced by a BeginMenu
ImGui::PopStyleColor();
ImGui::PopStyleVar();
RenderPickButtonTooltip();
ImGui::SetNextItemWidth(ImGui::GetFontSize() * 15);
AActor* NewSelection = nullptr;
//TODO: Could be replaced by a BeginMenu
if (FCogWindowWidgets::MenuActorsCombo(
"MenuActorSelection",
NewSelection,
@@ -317,7 +315,7 @@ void FCogEngineWindow_Selection::RenderMainMenuWidget()
Config->SelectedClassIndex,
&Filter,
GetLocalPlayerPawn(),
[this](AActor& Actor) { RenderActorContextMenu(Actor); }))
[this](AActor& Actor) { RenderActorContextMenu(Actor); }))
{
SetGlobalSelection(NewSelection);
}
@@ -338,9 +336,11 @@ void FCogEngineWindow_Selection::SetGlobalSelection(AActor* Value) const
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_Selection::RenderPickButtonTooltip()
{
if (ImGui::IsItemHovered(ImGuiHoveredFlags_Stationary))
if (FCogWindowWidgets::BeginItemTooltipWrappedText())
{
const FString Shortcut = FCogImguiInputHelper::KeyInfoToString(GetOwner()->GetSettings()->ToggleSelectionShortcut);
ImGui::SetTooltip("Enter picking mode to pick an actor on screen. %s", TCHAR_TO_ANSI(*Shortcut));
ImGui::Text("Enter selection mode to select an actor on screen. Change which actor type is selectable by clicking the selection combobox\n"
"%s", TCHAR_TO_ANSI(*Shortcut));
FCogWindowWidgets::EndItemTooltipWrappedText();
}
}
@@ -1,5 +1,6 @@
#include "CogEngineWindow_Stats.h"
#include "CogImguiHelper.h"
#include "CogWindowWidgets.h"
#include "Engine/Engine.h"
#include "Engine/NetConnection.h"
@@ -8,9 +9,7 @@
#include "GameFramework/PlayerController.h"
#include "GameFramework/PlayerState.h"
ImVec4 StatRedColor(1.0f, 0.4f, 0.3f, 1.0f);
ImVec4 StatOrangeColor(1.0f, 0.7f, 0.4f, 1.0f);
ImVec4 StatGreenColor(0.5f, 1.0f, 0.6f, 1.0f);
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_Stats::Initialize()
@@ -19,6 +18,8 @@ void FCogEngineWindow_Stats::Initialize()
bHasWidget = true;
bIsWidgetVisible = true;
Config = GetConfig<UCogEngineWindowConfig_Stats>();
}
//--------------------------------------------------------------------------------------------------------------------------
@@ -29,6 +30,15 @@ void FCogEngineWindow_Stats::RenderHelp()
);
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_Stats::RenderContextMenu()
{
Config->RenderAllConfigs();
ImGui::Separator();
FCogWindow::RenderContextMenu();
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_Stats::RenderContent()
{
@@ -37,7 +47,7 @@ void FCogEngineWindow_Stats::RenderContent()
extern ENGINE_API float GAverageFPS;
ImGui::Text("FPS ");
ImGui::SameLine();
ImGui::TextColored(GetFpsColor(GAverageFPS), "%0.0f", GAverageFPS);
ImGui::TextColored(Config->GetFpsColor(GAverageFPS), "%0.0f", GAverageFPS);
if (const APlayerController* PlayerController = GetLocalPlayerController())
{
@@ -46,7 +56,7 @@ void FCogEngineWindow_Stats::RenderContent()
const float Ping = PlayerState->GetPingInMilliseconds();
ImGui::Text("Ping ");
ImGui::SameLine();
ImGui::TextColored(GetPingColor(Ping), "%0.0fms", Ping);
ImGui::TextColored(Config->GetPingColor(Ping), "%0.0fms", Ping);
}
if (const UNetConnection* Connection = PlayerController->GetNetConnection())
@@ -54,12 +64,12 @@ void FCogEngineWindow_Stats::RenderContent()
const float OutPacketLost = Connection->GetOutLossPercentage().GetAvgLossPercentage() * 100.0f;
ImGui::Text("Packet Loss Out ");
ImGui::SameLine();
ImGui::TextColored(GetPacketLossColor(OutPacketLost), "%0.0f%%", OutPacketLost);
ImGui::TextColored(Config->GetPacketLossColor(OutPacketLost), "%0.0f%%", OutPacketLost);
const float InPacketLost = Connection->GetInLossPercentage().GetAvgLossPercentage() * 100.0f;
ImGui::Text("Packet Loss In ");
ImGui::SameLine();
ImGui::TextColored(GetPacketLossColor(InPacketLost), "%0.0f%%", InPacketLost);
ImGui::TextColored(Config->GetPacketLossColor(InPacketLost), "%0.0f%%", InPacketLost);
}
}
}
@@ -68,129 +78,169 @@ void FCogEngineWindow_Stats::RenderContent()
void FCogEngineWindow_Stats::RenderMainMenuWidget()
{
const APlayerController* PlayerController = GetLocalPlayerController();
const UNetConnection* Connection = PlayerController != nullptr ? PlayerController->GetNetConnection() : nullptr;
RenderMainMenuWidgetFramerate(FCogWindowWidgets::GetFontWidth() * 8);
RenderMainMenuWidgetPing(Connection != nullptr ? FCogWindowWidgets::GetFontWidth() * 7 : 0.0f);
RenderMainMenuWidgetPacketLoss(Connection != nullptr ? FCogWindowWidgets::GetFontWidth() * 7 : 0.0f);
RenderMainMenuWidgetFrameRate();
const UNetConnection* Connection = PlayerController != nullptr ? PlayerController->GetNetConnection() : nullptr;
if (Connection != nullptr)
{
RenderMainMenuWidgetPing();
RenderMainMenuWidgetPacketLoss();
}
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_Stats::RenderMainMenuWidgetFramerate(const float Width)
void FCogEngineWindow_Stats::RenderMainMenuWidgetFrameRate()
{
extern ENGINE_API float GAverageFPS;
const int32 Fps = (int32)GAverageFPS;
const int32 Fps = static_cast<int32>(GAverageFPS);
ImGui::PushStyleColor(ImGuiCol_Button, IM_COL32(0, 0, 0, 0));
ImGui::PushStyleColor(ImGuiCol_Text, GetFpsColor(Fps));
const bool Open = ImGui::BeginMenu(TCHAR_TO_ANSI(*FString::Printf(TEXT("%3dfps###FramerateButton"), Fps)));
ImGui::PopStyleColor(2);
ImGui::PushStyleColor(ImGuiCol_Text, Config->GetFpsColor(Fps));
const bool Open = ImGui::BeginMenu(TCHAR_TO_ANSI(*FString::Printf(TEXT("%3dfps###FrameRateButton"), Fps)));
const float Width = ImGui::GetItemRectSize().x;
ImGui::PopStyleColor(1);
if (Open)
if (ImGui::BeginPopupContextItem())
{
ImGui::Text("Fps");
ImGui::SameLine();
int32 MaxFps = GEngine->GetMaxFPS();
TArray<int32> Values{ 0, 10, 20, 30, 60, 120 };
if (FCogWindowWidgets::MultiChoiceButtonsInt(Values, MaxFps, ImVec2(3.5f * FCogWindowWidgets::GetFontWidth(), 0)))
{
GEngine->SetMaxFPS(MaxFps);
}
ImGui::EndMenu();
Config->RenderColorConfig();
Config->RenderFrameRateConfig();
Super::RenderContextMenu();
ImGui::EndPopup();
}
ImGui::SetItemTooltip("Framerate");
if (Open == false)
{
ImGui::SetItemTooltip("Frame Rate");
}
if (Open)
{
const int32 MaxFps = GEngine->GetMaxFPS();
for (int32 i = 0; i < Config->FrameRates.Num(); ++i)
{
ImGui::PushID(i);
const float Value = Config->FrameRates[i];
const auto ValueText = StringCast<ANSICHAR>(*FCogWindowWidgets::FormatSmallFloat(Value));
if (ImGui::Selectable(ValueText.Get(), Value == MaxFps, ImGuiSelectableFlags_None, ImVec2(Width, 0)))
{
GEngine->SetMaxFPS(Value);
}
ImGui::PopID();
}
ImGui::EndMenu();
}
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_Stats::RenderMainMenuWidgetPing(const float Width)
void FCogEngineWindow_Stats::RenderMainMenuWidgetPing()
{
const APlayerController* PlayerController = GetLocalPlayerController();
const APlayerState* PlayerState = PlayerController != nullptr ? PlayerController->GetPlayerState<APlayerState>() : nullptr;
if (PlayerState == nullptr)
{ return; }
const int32 Ping = static_cast<int32>(PlayerState->GetPingInMilliseconds());
ImGui::PushStyleColor(ImGuiCol_Text, Config->GetPingColor(Ping));
const bool Open = ImGui::BeginMenu(TCHAR_TO_ANSI(*FString::Printf(TEXT("%3dms###PingButton"), Ping)));
const float Width = ImGui::GetItemRectSize().x;
ImGui::PopStyleColor(1);
if (ImGui::BeginPopupContextItem())
{
return;
Config->RenderColorConfig();
Config->RenderPingConfig();
Super::RenderContextMenu();
ImGui::EndPopup();
}
const float Ping = PlayerState->GetPingInMilliseconds();
ImGui::PushStyleColor(ImGuiCol_Button, IM_COL32(0, 0, 0, 0));
ImGui::PushStyleColor(ImGuiCol_Text, GetPingColor(Ping));
const bool Open = ImGui::BeginMenu(TCHAR_TO_ANSI(*FString::Printf(TEXT("%3dms###PingButton"), (int32)Ping)));
ImGui::PopStyleColor(2);
ImGui::SetItemTooltip("Ping");
if (Open == false)
{
ImGui::SetItemTooltip("Ping");
}
#if DO_ENABLE_NET_TEST
if (Open)
{
FWorldContext& WorldContext = GEngine->GetWorldContextFromWorldChecked(GetWorld());
if (WorldContext.ActiveNetDrivers.Num() > 0)
{
ImGui::Text("Ping");
ImGui::SameLine();
const FNamedNetDriver* SelectedNetDriver = &WorldContext.ActiveNetDrivers[0];
FPacketSimulationSettings Settings = SelectedNetDriver->NetDriver->PacketSimulationSettings;
TArray<int32> Values{ 0, 50, 100, 200, 500, 1000 };
if (FCogWindowWidgets::MultiChoiceButtonsInt(Values, Settings.PktIncomingLagMin, ImVec2(4.5f * FCogWindowWidgets::GetFontWidth(), 0)))
for (int32 i = 0; i < Config->Pings.Num(); ++i)
{
SelectedNetDriver->NetDriver->SetPacketSimulationSettings(Settings);
ImGui::PushID(i);
const float Value = Config->Pings[i];
const auto ValueText = StringCast<ANSICHAR>(*FCogWindowWidgets::FormatSmallFloat(Value));
if (ImGui::Selectable(ValueText.Get(), Value == Settings.PktIncomingLagMin, ImGuiSelectableFlags_None, ImVec2(Width, 0)))
{
Settings.PktIncomingLagMin = Value;
SelectedNetDriver->NetDriver->SetPacketSimulationSettings(Settings);
}
ImGui::PopID();
}
}
ImGui::EndMenu();
}
#endif //DO_ENABLE_NET_TEST
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_Stats::RenderMainMenuWidgetPacketLoss(const float Width)
void FCogEngineWindow_Stats::RenderMainMenuWidgetPacketLoss()
{
const APlayerController* PlayerController = GetLocalPlayerController();
const UNetConnection* Connection = PlayerController != nullptr ? PlayerController->GetNetConnection() : nullptr;
if (Connection == nullptr)
{
return;
}
{ return; }
const float OutPacketLost = Connection->GetOutLossPercentage().GetAvgLossPercentage() * 100.0f;
const float InPacketLost = Connection->GetInLossPercentage().GetAvgLossPercentage() * 100.0f;
const float TotalPacketLost = (OutPacketLost + InPacketLost) / 2;
ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0.0f, 0.0f));
ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(0.0f, 0.5f));
ImGui::PushStyleColor(ImGuiCol_Button, IM_COL32(0, 0, 0, 0));
ImGui::PushStyleColor(ImGuiCol_Text, GetPacketLossColor(TotalPacketLost));
ImGui::PushStyleColor(ImGuiCol_Text, Config->GetPacketLossColor(TotalPacketLost));
const bool Open = ImGui::BeginMenu(TCHAR_TO_ANSI(*FString::Printf(TEXT("%2d%% ###PacketLossButton"), (int32)TotalPacketLost)));
const float Width = ImGui::GetItemRectSize().x;
ImGui::PopStyleColor(1);
if (ImGui::Button(TCHAR_TO_ANSI(*FString::Printf(TEXT("%2d%%###PacketLossButton"), (int32)TotalPacketLost)), ImVec2(Width, 0.0f)))
if (ImGui::BeginPopupContextItem())
{
ImGui::OpenPopup("PacketLossPopup");
Config->RenderColorConfig();
Config->RenderPacketLossConfig();
Super::RenderContextMenu();
ImGui::EndPopup();
}
ImGui::PopStyleColor(2);
ImGui::PopStyleVar(2);
ImGui::SetItemTooltip("Packet Loss");
if (Open == false)
{
ImGui::SetItemTooltip("Packet Loss");
}
#if DO_ENABLE_NET_TEST
if (ImGui::BeginPopup("PacketLossPopup"))
if (Open)
{
FWorldContext& WorldContext = GEngine->GetWorldContextFromWorldChecked(GetWorld());
if (WorldContext.ActiveNetDrivers.Num() > 0)
{
ImGui::Text("Packet Loss");
ImGui::SameLine();
const FNamedNetDriver* SelectedNetDriver = &WorldContext.ActiveNetDrivers[0];
FPacketSimulationSettings Settings = SelectedNetDriver->NetDriver->PacketSimulationSettings;
TArray<int32> Values{ 0, 5, 10, 20, 30, 40, 50 };
if (FCogWindowWidgets::MultiChoiceButtonsInt(Values, Settings.PktIncomingLoss, ImVec2(3.5f * FCogWindowWidgets::GetFontWidth(), 0)))
for (int32 i = 0; i < Config->PacketLosses.Num(); ++i)
{
Settings.PktLoss = Settings.PktIncomingLoss;
SelectedNetDriver->NetDriver->SetPacketSimulationSettings(Settings);
ImGui::PushID(i);
const float Value = Config->PacketLosses[i];
const auto ValueText = StringCast<ANSICHAR>(*FCogWindowWidgets::FormatSmallFloat(Value));
if (ImGui::Selectable(ValueText.Get(), Value == Settings.PktIncomingLagMin, ImGuiSelectableFlags_None, ImVec2(Width, 0)))
{
Settings.PktIncomingLoss = Value;
Settings.PktLoss = Settings.PktIncomingLoss;
SelectedNetDriver->NetDriver->SetPacketSimulationSettings(Settings);
}
ImGui::PopID();
}
}
ImGui::EndPopup();
@@ -198,50 +248,98 @@ void FCogEngineWindow_Stats::RenderMainMenuWidgetPacketLoss(const float Width)
#endif //DO_ENABLE_NET_TEST
}
//--------------------------------------------------------------------------------------------------------------------------
ImVec4 FCogEngineWindow_Stats::GetFpsColor(const float Value, const float Good /*= 50.0f*/, const float Medium /*= 30.0f*/)
ImVec4 UCogEngineWindowConfig_Stats::GetFpsColor(const float Value) const
{
if (Value > Good)
{
return StatGreenColor;
}
if (Value > GoodFrameRate)
{ return FCogImguiHelper::ToImVec4(GoodColor); }
if (Value > Medium)
{
return StatOrangeColor;
}
if (Value > MediumFrameRate)
{ return FCogImguiHelper::ToImVec4(MediumColor); }
return StatRedColor;
return FCogImguiHelper::ToImVec4(BadColor);
}
//--------------------------------------------------------------------------------------------------------------------------
ImVec4 FCogEngineWindow_Stats::GetPingColor(const float Value, const float Good /*= 100.0f*/, const float Medium /*= 200.0f*/)
ImVec4 UCogEngineWindowConfig_Stats::GetPingColor(const float Value) const
{
if (Value > Medium)
{
return StatRedColor;
}
if (Value > MediumPing)
{ return FCogImguiHelper::ToImVec4(BadColor); }
if (Value > Good)
{
return StatOrangeColor;
}
if (Value > GoodPing)
{ return FCogImguiHelper::ToImVec4(MediumColor); }
return StatGreenColor;
return FCogImguiHelper::ToImVec4(GoodColor);
}
//--------------------------------------------------------------------------------------------------------------------------
ImVec4 FCogEngineWindow_Stats::GetPacketLossColor(const float Value, const float Good /*= 10.0f*/, const float Medium /*= 20.0f*/)
ImVec4 UCogEngineWindowConfig_Stats::GetPacketLossColor(const float Value) const
{
if (Value > Medium)
{
return StatRedColor;
}
if (Value > MediumPacketLoss)
{ return FCogImguiHelper::ToImVec4(BadColor); }
if (Value > Good)
{
return StatOrangeColor;
}
if (Value > GoodPacketLoss)
{ return FCogImguiHelper::ToImVec4(MediumColor); }
return StatGreenColor;
}
return FCogImguiHelper::ToImVec4(GoodColor);
}
//--------------------------------------------------------------------------------------------------------------------------
void UCogEngineWindowConfig_Stats::RenderAllConfigs()
{
RenderColorConfig();
RenderFrameRateConfig();
RenderPingConfig();
RenderPacketLossConfig();
}
//--------------------------------------------------------------------------------------------------------------------------
void UCogEngineWindowConfig_Stats::RenderColorConfig()
{
if (ImGui::CollapsingHeader("Display", ImGuiTreeNodeFlags_DefaultOpen))
{
constexpr ImGuiColorEditFlags ColorEditFlags = ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_AlphaPreviewHalf;
FCogImguiHelper::ColorEdit4("Good Color", GoodColor, ColorEditFlags);
ImGui::SetItemTooltip("Color of a stat with a good value.");
FCogImguiHelper::ColorEdit4("Medium Color", MediumColor, ColorEditFlags);
ImGui::SetItemTooltip("Color of a stat with a medium value.");
FCogImguiHelper::ColorEdit4("Bad Color", BadColor, ColorEditFlags);
ImGui::SetItemTooltip("Color of a stat with a bad value.");
}
}
//--------------------------------------------------------------------------------------------------------------------------
void UCogEngineWindowConfig_Stats::RenderFrameRateConfig()
{
if (ImGui::CollapsingHeader("Frame Rate", ImGuiTreeNodeFlags_DefaultOpen))
{
ImGui::InputInt("Good Frame Rate", &GoodFrameRate);
ImGui::InputInt("Medium Frame Rate", &MediumFrameRate);
FCogWindowWidgets::IntArray("Max Frame Rate", FrameRates, 10, ImVec2(0, ImGui::GetFontSize() * 10));
}
}
//--------------------------------------------------------------------------------------------------------------------------
void UCogEngineWindowConfig_Stats::RenderPingConfig()
{
if (ImGui::CollapsingHeader("Ping", ImGuiTreeNodeFlags_DefaultOpen))
{
ImGui::InputInt("Good Ping", &GoodPing);
ImGui::InputInt("Medium Ping", &MediumPing);
FCogWindowWidgets::IntArray("Ping Emulation", Pings, 10, ImVec2(0, ImGui::GetFontSize() * 10));
}
}
//--------------------------------------------------------------------------------------------------------------------------
void UCogEngineWindowConfig_Stats::RenderPacketLossConfig()
{
if (ImGui::CollapsingHeader("Packet Loss", ImGuiTreeNodeFlags_DefaultOpen))
{
ImGui::InputInt("Good Packet Loss", &GoodPacketLoss);
ImGui::InputInt("Medium Packet Loss", &MediumPacketLoss);
FCogWindowWidgets::IntArray("Packet Loss Emulation", PacketLosses, 10, ImVec2(0, ImGui::GetFontSize() * 10));
}
}
@@ -1,6 +1,7 @@
#include "CogEngineWindow_TimeScale.h"
#include "CogEngineReplicator.h"
#include "CogImguiHelper.h"
#include "CogWindowWidgets.h"
#include "Engine/Engine.h"
#include "Engine/World.h"
@@ -10,14 +11,10 @@ void FCogEngineWindow_TimeScale::Initialize()
{
Super::Initialize();
TimingScales.Add(0.00f);
TimingScales.Add(0.01f);
TimingScales.Add(0.10f);
TimingScales.Add(0.50f);
TimingScales.Add(1.00f);
TimingScales.Add(2.00f);
TimingScales.Add(5.00f);
TimingScales.Add(10.0f);
bHasWidget = true;
bIsWidgetVisible = true;
Config = GetConfig<UCogEngineWindowConfig_TimeScale>();
}
//--------------------------------------------------------------------------------------------------------------------------
@@ -41,10 +38,84 @@ void FCogEngineWindow_TimeScale::RenderContent()
return;
}
RenderTimeScaleChoices(Replicator);
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_TimeScale::RenderContextMenu()
{
if (IsWindowRenderedInMainMenu() == false)
{
ImGui::Checkbox("Inline", &Config->Inline);
}
FCogImguiHelper::ColorEdit4("Time Scale Modified Color", Config->TimeScaleModifiedColor, ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_AlphaPreviewHalf);
ImGui::SetItemTooltip("Color of the current time scale, in widget mode, when the time scale in not 1.");
FCogWindowWidgets::FloatArray("Time Scales", Config->TimeScales, 10, ImVec2(0, ImGui::GetFontSize() * 10));
ImGui::Separator();
FCogWindow::RenderContextMenu();
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_TimeScale::RenderMainMenuWidget()
{
Super::RenderMainMenuWidget();
ACogEngineReplicator* Replicator = ACogEngineReplicator::GetLocalReplicator(*GetWorld());
if (Replicator == nullptr)
{
ImGui::TextDisabled("Invalid Replicator");
return;
}
const float CurrentValue = Replicator->GetTimeDilation();
if (CurrentValue != 1.0f)
{
ImGui::PushStyleColor(ImGuiCol_Text, FCogImguiHelper::ToImVec4(Config->TimeScaleModifiedColor));
}
const auto CurrentValueText = StringCast<ANSICHAR>(*FString::Printf(TEXT("x%g"), CurrentValue));
const bool Open = ImGui::BeginMenu(CurrentValueText.Get());
if (CurrentValue != 1)
{
ImGui::PopStyleColor();
}
if (ImGui::BeginPopupContextItem())
{
RenderContextMenu();
ImGui::EndPopup();
}
if (Open)
{
for (int32 i = 0; i < Config->TimeScales.Num(); ++i)
{
const float Value = Config->TimeScales[i];
const auto ValueText = StringCast<ANSICHAR>(*FString::Printf(TEXT("%g"), Value));
if (ImGui::Selectable(ValueText.Get(), Value == Replicator->GetTimeDilation()))
{
Replicator->SetTimeDilation(Value);
}
}
ImGui::EndMenu();
}
else
{
ImGui::SetItemTooltip("Time Scale");
}
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_TimeScale::RenderTimeScaleChoices(ACogEngineReplicator* Replicator)
{
float Value = Replicator->GetTimeDilation();
if (FCogWindowWidgets::MultiChoiceButtonsFloat(TimingScales, Value, ImVec2(3.5f * FCogWindowWidgets::GetFontWidth(), 0)))
if (FCogWindowWidgets::MultiChoiceButtonsFloat(Config->TimeScales, Value, ImVec2(3.5f * FCogWindowWidgets::GetFontWidth(), 0), Config->Inline))
{
Replicator->SetTimeDilation(Value);
}
}
}
@@ -23,8 +23,6 @@ protected:
virtual void GameTick(float DeltaTime) override;
virtual void ResetConfig() override;
virtual void RenderHelp() override;
virtual void RenderContent() override;
@@ -25,8 +25,6 @@ public:
protected:
virtual void ResetConfig() override;
virtual void RenderHelp() override;
virtual void RenderContent() override;
@@ -20,8 +20,6 @@ public:
protected:
virtual void ResetConfig() override;
virtual void RenderHelp() override;
virtual void RenderContent() override;
@@ -11,18 +11,20 @@ class COGENGINE_API FCogEngineWindow_Console : public FCogWindow
{
typedef FCogWindow Super;
public:
protected:
virtual void RenderHelp() override;
virtual void Initialize() override;
virtual void PreRender(ImGuiWindowFlags& WindowFlags) override;
virtual void RenderMainMenuWidget() override;
virtual void RenderContent() override;
virtual void RenderTick(float DeltaTime) override;
private:
@@ -31,6 +33,8 @@ private:
void RenderMenu();
void RenderInput();
void SelectNextCommand();
void SelectPreviousCommand();
int OnTextInputCallback(ImGuiInputTextCallbackData* InData);
@@ -38,15 +42,15 @@ private:
void RenderCommandList();
void RenderCommand(const FString& CommandName, int32 Index);
void RenderCommand(const FString& CommandName, int32 Index, float RegionMinY, float RegionMaxY);
void RefreshCommandList();
void RenderCommandHelp();
void ActivateInputText() const;
void ExecuteCommand(const FString& InCommand);
int32 SelectedCommandIndex = -1;
int32 SelectedCommandIndex = INDEX_NONE;
TArray<FString> CommandList;
@@ -56,18 +60,20 @@ private:
bool bScroll = false;
bool bRequestInputFocus = false;
bool bIsWindowFocused = false;
bool bPopupCommandListOnWidgetMode = false;
ImGuiID InputIdOnWidgetMode = 0;
bool bIsRenderingWidget = false;
bool bSetBufferToSelectedCommand = false;
bool bIsWidgetMode = false;
ImGuiID InputTextId = 0;
bool WidgetMode_OpenCommandList = false;
ImVec2 WidgetMode_CommandListPosition = ImVec2(0, 0);
bool WidgetMode_IsTextInputActive = false;
TWeakObjectPtr<UCogEngineConfig_Console> Config;
};
@@ -93,6 +99,9 @@ public:
UPROPERTY(Config)
bool UseClipper = false;
UPROPERTY(Config)
bool ShowHelp = true;
UPROPERTY(Config)
int32 NumHistoryCommands = 10;
@@ -17,8 +17,6 @@ public:
protected:
virtual void ResetConfig() override;
virtual void RenderHelp() override;
virtual void PreSaveConfig() override;
@@ -19,8 +19,6 @@ public:
protected:
virtual void ResetConfig() override;
virtual void PreSaveConfig() override;
virtual void RenderHelp() override;
@@ -3,6 +3,8 @@
#include "CoreMinimal.h"
#include "CogWindow.h"
class UCogEngineWindowConfig_Stats;
class COGENGINE_API FCogEngineWindow_NetEmulation : public FCogWindow
{
typedef FCogWindow Super;
@@ -11,12 +13,15 @@ protected:
virtual void RenderHelp() override;
virtual void Initialize() override;
virtual void RenderContextMenu() override;
virtual void RenderContent() override;
virtual void DrawStats();
virtual void DrawControls();
private:
TWeakObjectPtr<UCogEngineWindowConfig_Stats> Config;
};
@@ -27,13 +27,11 @@ public:
protected:
virtual void ResetConfig() override;
virtual void RenderHelp() override;
virtual void RenderContent() override;
virtual void RenderTick(float DeltaTime);
virtual void RenderTick(float DeltaTime) override;
void ConnectTo();
@@ -41,8 +39,6 @@ protected:
void Disconnect();
void TryStartup();
void RunServer();
void CloseServer();
@@ -7,7 +7,6 @@
#include "Misc/OutputDevice.h"
#include "CogEngineWindow_OutputLog.generated.h"
class FCogEngineWindow_OutputLog;
class UCogEngineConfig_OutputLog;
//--------------------------------------------------------------------------------------------------------------------------
@@ -17,7 +16,7 @@ public:
friend class FCogEngineWindow_OutputLog;
FCogLogOutputDevice();
~FCogLogOutputDevice();
virtual ~FCogLogOutputDevice() override;
virtual void Serialize(const TCHAR* Message, ELogVerbosity::Type Verbosity, const FName& Category) override;
@@ -37,12 +36,12 @@ public:
void Clear();
void Copy() const;
protected:
virtual void RenderHelp() override;
virtual void ResetConfig() override;
virtual void RenderContent() override;
private:
@@ -66,7 +65,7 @@ private:
FCogLogOutputDevice OutputDevice;
TObjectPtr<UCogEngineConfig_OutputLog> Config = nullptr;
TWeakObjectPtr<UCogEngineConfig_OutputLog> Config = nullptr;
};
//--------------------------------------------------------------------------------------------------------------------------
@@ -95,6 +94,15 @@ public:
UPROPERTY(Config)
int32 VerbosityFilter = ELogVerbosity::VeryVerbose;
UPROPERTY(Config)
FColor DefaultColor = FColor::White;
UPROPERTY(Config)
FColor WarningColor = FColor::White;
UPROPERTY(Config)
FColor ErrorColor = FColor::White;
virtual void Reset() override
{
Super::Reset();
@@ -105,5 +113,8 @@ public:
ShowVerbosity = false;
ShowAsTable = false;
VerbosityFilter = ELogVerbosity::VeryVerbose;
DefaultColor = FColor(200, 200, 200, 255);
WarningColor = FColor(255, 200, 0, 255);
ErrorColor = FColor(255, 0, 0, 255);
}
};
@@ -35,8 +35,6 @@ protected:
virtual void TryReapplySelection() const;
virtual void ResetConfig() override;
virtual void PreSaveConfig() override;
virtual void RenderHelp() override;
@@ -2,32 +2,113 @@
#include "CoreMinimal.h"
#include "CogWindow.h"
#include "CogEngineWindow_Stats.generated.h"
class UCogEngineWindowConfig_Stats;
//--------------------------------------------------------------------------------------------------------------------------
class COGENGINE_API FCogEngineWindow_Stats : public FCogWindow
{
typedef FCogWindow Super;
public:
static ImVec4 GetFpsColor(float Value, float Good = 50.0f, float Medium = 30.0f);
static ImVec4 GetPingColor(float Value, float Good = 100.0f, float Medium = 200.0f);
static ImVec4 GetPacketLossColor(float Value, float Good = 10.0f, float Medium = 20.0f);
protected:
virtual void Initialize() override;
virtual void RenderHelp() override;
virtual void RenderContextMenu() override;
virtual void RenderContent() override;
virtual void RenderMainMenuWidget() override;
virtual void RenderMainMenuWidgetPacketLoss(float Width);
virtual void RenderMainMenuWidgetPacketLoss();
virtual void RenderMainMenuWidgetPing(float Width);
virtual void RenderMainMenuWidgetPing();
virtual void RenderMainMenuWidgetFramerate(float Width);
virtual void RenderMainMenuWidgetFrameRate();
TWeakObjectPtr<UCogEngineWindowConfig_Stats> Config;
};
//--------------------------------------------------------------------------------------------------------------------------
UCLASS(Config = Cog)
class UCogEngineWindowConfig_Stats : public UCogCommonConfig
{
GENERATED_BODY()
public:
virtual void Reset() override
{
UCogCommonConfig::Reset();
GoodColor = FColor(30, 255, 60, 255);
MediumColor = FColor(255, 200,0, 255);
BadColor = FColor(255, 80, 80, 255);
FrameRates = { 0, 10, 20, 30, 60, 120 };
Pings = { 0, 50, 100, 200, 500, 1000 };
PacketLosses = { 0, 5, 10, 20, 30, 40, 50 };
GoodFrameRate = 60;
MediumFrameRate = 30;
GoodPing = 100;
MediumPing = 200;
GoodPacketLoss = 5;
MediumPacketLoss = 10;
}
ImVec4 GetFpsColor(float Value) const;
ImVec4 GetPingColor(float Value) const;
ImVec4 GetPacketLossColor(float Value) const;
void RenderAllConfigs();
void RenderColorConfig();
void RenderFrameRateConfig();
void RenderPingConfig();
void RenderPacketLossConfig();
UPROPERTY(Config)
TArray<int> FrameRates;
UPROPERTY(Config)
int GoodFrameRate = 0;
UPROPERTY(Config)
int MediumFrameRate = 0;
UPROPERTY(Config)
TArray<int> Pings;
UPROPERTY(Config)
int GoodPing = 0;
UPROPERTY(Config)
int MediumPing = 0;
UPROPERTY(Config)
TArray<int> PacketLosses;
UPROPERTY(Config)
int GoodPacketLoss = 0;
UPROPERTY(Config)
int MediumPacketLoss = 0;
UPROPERTY(Config)
FColor GoodColor = FColor();
UPROPERTY(Config)
FColor MediumColor = FColor();
UPROPERTY(Config)
FColor BadColor = FColor();
};
@@ -1,24 +1,62 @@
#pragma once
#include "CoreMinimal.h"
#include "CogEngineReplicator.h"
#include "CogWindow.h"
#include "CogEngineWindow_TimeScale.generated.h"
class UCogEngineWindowConfig_TimeScale;
//--------------------------------------------------------------------------------------------------------------------------
class COGENGINE_API FCogEngineWindow_TimeScale : public FCogWindow
{
typedef FCogWindow Super;
public:
void Initialize();
virtual void Initialize() override;
protected:
virtual void RenderHelp() override;
virtual void RenderContent() override;
virtual void RenderContextMenu() override;
TArray<float> TimingScales;
virtual void RenderMainMenuWidget() override;
private:
virtual void RenderTimeScaleChoices(ACogEngineReplicator* Replicator);
TWeakObjectPtr<UCogEngineWindowConfig_TimeScale> Config;
};
//--------------------------------------------------------------------------------------------------------------------------
UCLASS(Config = Cog)
class UCogEngineWindowConfig_TimeScale : public UCogCommonConfig
{
GENERATED_BODY()
public:
virtual void Reset() override
{
UCogCommonConfig::Reset();
TimeScale = 1.0f;
Inline = true;
TimeScales = { 0.00f, 0.01f, 0.10f, 0.50f, 1.00f, 2.00f, 5.00f, 10.0f };
TimeScaleModifiedColor = FColor(255, 30, 210, 255);
}
UPROPERTY(Config)
float TimeScale = 1.0f;
UPROPERTY(Config)
TArray<float> TimeScales;
UPROPERTY(Config)
bool Inline = true;
UPROPERTY(Config)
FColor TimeScaleModifiedColor = FColor();
};
@@ -14,6 +14,7 @@
#include "Framework/Application/SlateUser.h"
#include "GameFramework/PlayerController.h"
#include "GameFramework/PlayerInput.h"
#include "HAL/PlatformApplicationMisc.h"
#include "imgui.h"
#include "imgui_internal.h"
#include "implot.h"
@@ -31,7 +32,7 @@ FCogImGuiContextScope::FCogImGuiContextScope(FCogImguiContext& CogImguiContext)
PrevContext = ImGui::GetCurrentContext();
PrevPlotContext = ImPlot::GetCurrentContext();
ImGui::SetCurrentContext(CogImguiContext.ImGuiContext);
ImGui::SetCurrentContext(CogImguiContext.Context);
ImPlot::SetCurrentContext(CogImguiContext.PlotContext);
}
@@ -53,7 +54,7 @@ FCogImGuiContextScope::~FCogImGuiContextScope()
}
//--------------------------------------------------------------------------------------------------------------------------
bool FCogImguiContext::bIsNetImguiInitialized = false;
bool FCogImguiContext::bIsNetImGuiInitialized = false;
//--------------------------------------------------------------------------------------------------------------------------
void FCogImguiContext::Initialize()
@@ -71,10 +72,10 @@ void FCogImguiContext::Initialize()
GameViewport->AddViewportWidgetContent(InputCatcherWidget.ToSharedRef(), -TNumericLimits<int32>::Max());
}
ImGuiContext = ImGui::CreateContext();
Context = ImGui::CreateContext();
PlotContext = ImPlot::CreateContext();
ImGui::SetCurrentContext(ImGuiContext);
ImPlot::SetImGuiContext(ImGuiContext);
ImGui::SetCurrentContext(Context);
ImPlot::SetImGuiContext(Context);
ImPlot::SetCurrentContext(PlotContext);
ImGuiIO& IO = ImGui::GetIO();
@@ -121,6 +122,11 @@ void FCogImguiContext::Initialize()
PlatformIO.Platform_SetWindowTitle = ImGui_SetWindowTitle;
PlatformIO.Platform_SetWindowAlpha = ImGui_SetWindowAlpha;
PlatformIO.Platform_RenderWindow = ImGui_RenderWindow;
PlatformIO.Platform_ClipboardUserData = &ClipboardBuffer;
PlatformIO.Platform_GetClipboardTextFn = ImGui_GetClipboardTextFn;
PlatformIO.Platform_SetClipboardTextFn = ImGui_SetClipboardTextFn;
PlatformIO.Platform_OpenInShellFn = ImGui_OpenInShell;
if (FSlateApplication::IsInitialized())
{
@@ -143,10 +149,10 @@ void FCogImguiContext::Initialize()
}
#if NETIMGUI_ENABLED
if (bIsNetImguiInitialized == false)
if (bIsNetImGuiInitialized == false)
{
NetImgui::Startup();
bIsNetImguiInitialized = true;
bIsNetImGuiInitialized = true;
}
#endif
}
@@ -154,16 +160,16 @@ void FCogImguiContext::Initialize()
//--------------------------------------------------------------------------------------------------------------------------
void FCogImguiContext::Shutdown()
{
FCogImGuiContextScope ImGuiContextScope(ImGuiContext, PlotContext);
FCogImGuiContextScope ImGuiContextScope(Context, PlotContext);
//------------------------------------------------------------------
// NetImgui must be shutdown before imgui as it uses context hooks
//------------------------------------------------------------------
#if NETIMGUI_ENABLED
if (bIsNetImguiInitialized)
if (bIsNetImGuiInitialized)
{
NetImgui::Shutdown();
bIsNetImguiInitialized = false;
bIsNetImGuiInitialized = false;
}
#endif
@@ -196,17 +202,17 @@ void FCogImguiContext::Shutdown()
PlotContext = nullptr;
}
if (ImGuiContext)
if (Context)
{
ImGui::DestroyContext(ImGuiContext);
ImGuiContext = nullptr;
ImGui::DestroyContext(Context);
Context = nullptr;
}
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogImguiContext::OnDisplayMetricsChanged(const FDisplayMetrics& DisplayMetrics) const
{
FCogImGuiContextScope ImGuiContextScope(ImGuiContext, PlotContext);
FCogImGuiContextScope ImGuiContextScope(Context, PlotContext);
ImGuiPlatformIO& PlatformIO = ImGui::GetPlatformIO();
PlatformIO.Monitors.resize(0);
@@ -234,7 +240,7 @@ void FCogImguiContext::OnDisplayMetricsChanged(const FDisplayMetrics& DisplayMet
//--------------------------------------------------------------------------------------------------------------------------
bool FCogImguiContext::BeginFrame(float InDeltaTime)
{
FCogImGuiContextScope ImGuiContextScope(ImGuiContext, PlotContext);
FCogImGuiContextScope ImGuiContextScope(Context, PlotContext);
//-------------------------------------------------------------------------------------------------------
// Skip the first frame, to let the main widget update its TickSpaceGeometry which is returned by the
@@ -376,7 +382,7 @@ ImVec2 FCogImguiContext::GetImguiMousePos()
//--------------------------------------------------------------------------------------------------------------------------
void FCogImguiContext::EndFrame()
{
FCogImGuiContextScope ImGuiContextScope(ImGuiContext, PlotContext);
FCogImGuiContextScope ImGuiContextScope(Context, PlotContext);
ImGui::Render();
//NetImgui::EndFrame();
@@ -646,6 +652,36 @@ void FCogImguiContext::ImGui_RenderWindow(ImGuiViewport* Viewport, void* Data)
}
}
//--------------------------------------------------------------------------------------------------------------------------
const char* FCogImguiContext::ImGui_GetClipboardTextFn(ImGuiContext* InImGuiContext)
{
TArray<char>* ClipboardBuffer = static_cast<TArray<char>*>(InImGuiContext->PlatformIO.Platform_ClipboardUserData);
if (ClipboardBuffer)
{
FString ClipboardText;
FPlatformApplicationMisc::ClipboardPaste(ClipboardText);
ClipboardBuffer->SetNumUninitialized(FPlatformString::ConvertedLength<UTF8CHAR>(*ClipboardText));
FPlatformString::Convert(reinterpret_cast<UTF8CHAR*>(ClipboardBuffer->GetData()), ClipboardBuffer->Num(), *ClipboardText, ClipboardText.Len() + 1);
return ClipboardBuffer->GetData();
}
return nullptr;
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogImguiContext::ImGui_SetClipboardTextFn(ImGuiContext* InImGuiContext, const char* ClipboardText)
{
FPlatformApplicationMisc::ClipboardCopy(UTF8_TO_TCHAR(ClipboardText));
}
//--------------------------------------------------------------------------------------------------------------------------
bool FCogImguiContext::ImGui_OpenInShell(ImGuiContext* Context, const char* Path)
{
return FPlatformProcess::LaunchFileInDefaultExternalApplication(UTF8_TO_TCHAR(Path));
}
//--------------------------------------------------------------------------------------------------------------------------
static APlayerController* GetLocalPlayerController(const UWorld* World)
{
@@ -688,7 +724,7 @@ static UPlayerInput* GetPlayerInput(const UWorld* World)
//--------------------------------------------------------------------------------------------------------------------------
void FCogImguiContext::SetEnableInput(bool Value)
{
FCogImGuiContextScope ImGuiContextScope(ImGuiContext, PlotContext);
FCogImGuiContextScope ImGuiContextScope(Context, PlotContext);
bEnableInput = Value;
@@ -805,7 +841,7 @@ void FCogImguiContext::SetDPIScale(float Value)
//--------------------------------------------------------------------------------------------------------------------------
void FCogImguiContext::BuildFont()
{
FCogImGuiContextScope ImGuiContextScope(ImGuiContext, PlotContext);
FCogImGuiContextScope ImGuiContextScope(Context, PlotContext);
if (FontAtlasTexture != nullptr)
{
@@ -243,8 +243,14 @@ bool FCogImguiHelper::DragFVector2D(const char* Label, FVector2D& Vector, float
//--------------------------------------------------------------------------------------------------------------------------
bool FCogImguiHelper::ColorEdit4(const char* Label, FColor& Color, ImGuiColorEditFlags Flags)
{
FLinearColor Linear(Color);
const bool Result = ImGui::ColorEdit4(Label, &Linear.R, Flags);
Color = Linear.ToFColor(true);
ImColor c = ToImColor(Color);
const bool Result = ImGui::ColorEdit4(Label, &c.Value.x, Flags);
Color = ToFColor(c);
return Result;
}
//--------------------------------------------------------------------------------------------------------------------------
bool FCogImguiHelper::ColorEdit4(const char* Label, FLinearColor& Color, ImGuiColorEditFlags Flags)
{
return ImGui::ColorEdit4(Label, &Color.R, Flags);
}
@@ -287,17 +287,19 @@ EMouseCursor::Type FCogImguiInputHelper::ToSlateMouseCursor(ImGuiMouseCursor Mou
{
switch (MouseCursor)
{
case ImGuiMouseCursor_Arrow: return EMouseCursor::Default;
case ImGuiMouseCursor_TextInput: return EMouseCursor::TextEditBeam;
case ImGuiMouseCursor_ResizeAll: return EMouseCursor::CardinalCross;
case ImGuiMouseCursor_ResizeNS: return EMouseCursor::ResizeUpDown;
case ImGuiMouseCursor_ResizeEW: return EMouseCursor::ResizeLeftRight;
case ImGuiMouseCursor_ResizeNESW: return EMouseCursor::ResizeSouthWest;
case ImGuiMouseCursor_ResizeNWSE: return EMouseCursor::ResizeSouthEast;
case ImGuiMouseCursor_Arrow: return EMouseCursor::Default;
case ImGuiMouseCursor_TextInput: return EMouseCursor::TextEditBeam;
case ImGuiMouseCursor_ResizeAll: return EMouseCursor::CardinalCross;
case ImGuiMouseCursor_ResizeNS: return EMouseCursor::ResizeUpDown;
case ImGuiMouseCursor_ResizeEW: return EMouseCursor::ResizeLeftRight;
case ImGuiMouseCursor_ResizeNESW: return EMouseCursor::ResizeSouthWest;
case ImGuiMouseCursor_ResizeNWSE: return EMouseCursor::ResizeSouthEast;
case ImGuiMouseCursor_Hand: return EMouseCursor::Hand;
case ImGuiMouseCursor_NotAllowed: return EMouseCursor::SlashedCircle;
case ImGuiMouseCursor_None:
default:
return EMouseCursor::None;
case ImGuiMouseCursor_None:
default:
return EMouseCursor::None;
}
}
@@ -83,7 +83,7 @@ public:
TSharedPtr<const SCogImguiWidget> GetMainWidget() const { return MainWidget; }
static bool GetIsNetImguiInitialized() { return bIsNetImguiInitialized; }
static bool GetIsNetImguiInitialized() { return bIsNetImGuiInitialized; }
private:
@@ -127,7 +127,12 @@ private:
static void ImGui_RenderWindow(ImGuiViewport* Viewport, void* Data);
UPROPERTY()
static const char* ImGui_GetClipboardTextFn(ImGuiContext* InImGuiContext);
static void ImGui_SetClipboardTextFn(ImGuiContext* InImGuiContext, const char* Arg);
static bool ImGui_OpenInShell(ImGuiContext* Context, const char* Path);
UTexture2D* FontAtlasTexture = nullptr;
TMap<TWeakPtr<SWindow>, ImGuiID> WindowToViewportMap;
@@ -144,12 +149,14 @@ private:
TObjectPtr<UGameViewportClient> GameViewport = nullptr;
ImGuiContext* ImGuiContext = nullptr;
ImGuiContext* Context = nullptr;
ImPlotContext* PlotContext = nullptr;
char IniFilename[512] = {};
TArray<char> ClipboardBuffer;
bool bEnableInput = false;
bool bShareMouse = false;
@@ -174,6 +181,6 @@ private:
bool bSkipRendering = false;
static bool bIsNetImguiInitialized;
static bool bIsNetImGuiInitialized;
};
@@ -73,4 +73,6 @@ public:
static bool DragFVector2D(const char* Label, FVector2D& Vector, float Speed = 1.0f, double Min = 0.0f, double Max = 0.0f, const char* Format = "%.3f", ImGuiSliderFlags Flags = 0);
static bool ColorEdit4(const char* Label, FColor& Color, ImGuiColorEditFlags Flags = 0);
static bool ColorEdit4(const char* Label, FLinearColor& Color, ImGuiColorEditFlags Flags = 0);
};
@@ -52,6 +52,25 @@ bool FCogWindow::CheckEditorVisibility()
return true;
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogWindow::RenderMainMenuWidget()
{
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogWindow::RenderContextMenu()
{
if (bHasMenu)
{
ImGui::Checkbox("Show Menu", &bShowMenu);
}
if (ImGui::Button("Reset Settings", ImVec2(-1, 0)))
{
ResetConfig();
}
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogWindow::Render(float DeltaTime)
{
@@ -79,16 +98,7 @@ void FCogWindow::Render(float DeltaTime)
if (ImGui::BeginPopupContextWindow())
{
if (bHasMenu)
{
ImGui::Checkbox("Show Menu", &bShowMenu);
}
if (ImGui::Button("Reset Settings"))
{
ResetConfig();
}
RenderContextMenu();
ImGui::EndPopup();
}
@@ -139,7 +149,6 @@ void FCogWindow::SetSelection(AActor* NewSelection)
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogWindow::SetIsVisible(const bool Value)
{
if (bIsVisible == Value)
@@ -189,9 +198,28 @@ ULocalPlayer* FCogWindow::GetLocalPlayer() const
}
//--------------------------------------------------------------------------------------------------------------------------
UCogCommonConfig* FCogWindow::GetConfig(const TSubclassOf<UCogCommonConfig> ConfigClass) const
UCogCommonConfig* FCogWindow::GetConfig(const TSubclassOf<UCogCommonConfig>& InConfigClass, bool InResetConfigOnRequest) const
{
return GetOwner()->GetConfig(ConfigClass);
UCogCommonConfig* Config = GetOwner()->GetConfig(InConfigClass);
if (Config != nullptr && InResetConfigOnRequest)
{
ConfigsToResetOnRequest.AddUnique(Config);
}
return Config;
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogWindow::ResetConfig()
{
for (auto& Config : ConfigsToResetOnRequest)
{
if (Config != nullptr)
{
Config->Reset();
}
}
}
//--------------------------------------------------------------------------------------------------------------------------
@@ -211,3 +239,4 @@ bool FCogWindow::IsWindowRenderedInMainMenu()
{
return Owner->IsRenderingMainMenu();
}
@@ -475,7 +475,7 @@ void UCogWindowManager::RenderWidgets()
}
}
ImGui::PushStyleVarX(ImGuiStyleVar_CellPadding, 0.0f);
//ImGui::PushStyleVarX(ImGuiStyleVar_CellPadding, 0.0f);
if (ImGui::BeginTable("Widgets", NumColumns, Flags))
{
@@ -501,9 +501,14 @@ void UCogWindowManager::RenderWidgets()
ImGui::TableNextColumn();
}
for (int i = 0; i < Widgets.Num(); ++i)
//---------------------------------------------------------------------
// Widgets
//---------------------------------------------------------------------
for (int column = 0; column < Widgets.Num(); ++column)
{
FCogWindow* Window = Widgets[i];
ImGui::PushID(column);
FCogWindow* Window = Widgets[column];
if (Window->GetIsWidgetVisible() == false)
{ continue; }
@@ -511,17 +516,17 @@ void UCogWindowManager::RenderWidgets()
ImGui::AlignTextToFramePadding();
ImGui::SetCursorPosY(ImGui::GetCursorPosY() - 2);
Window->RenderMainMenuWidget();
ImGui::PopID();
}
if (AddRightColumn)
{
ImGui::TableNextColumn();
}
ImGui::EndTable();
}
ImGui::PopStyleVar();
//ImGui::PopStyleVar();
}
//--------------------------------------------------------------------------------------------------------------------------
@@ -801,6 +806,9 @@ UCogCommonConfig* UCogWindowManager::GetConfig(const TSubclassOf<UCogCommonConfi
}
UCogCommonConfig* Config = NewObject<UCogCommonConfig>(this, Class);
Config->Reset();
Config->ReloadConfig();
Configs.Add(Config);
return Config;
}
@@ -41,17 +41,33 @@ void FCogWindowWidgets::EndTableTooltip()
}
//--------------------------------------------------------------------------------------------------------------------------
bool FCogWindowWidgets::ItemTooltipWrappedText(const char* InText)
bool FCogWindowWidgets::BeginItemTooltipWrappedText()
{
bool result = ImGui::BeginItemTooltip();
const bool result = ImGui::BeginItemTooltip();
if (result == false)
{ return false; }
ImGui::PushTextWrapPos(ImGui::GetFontSize() * 35.0f);
ImGui::TextUnformatted(InText);
return true;
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogWindowWidgets::EndItemTooltipWrappedText()
{
ImGui::PopTextWrapPos();
ImGui::EndTooltip();
return true;
}
//--------------------------------------------------------------------------------------------------------------------------
bool FCogWindowWidgets::ItemTooltipWrappedText(const char* InText)
{
const bool result = BeginItemTooltipWrappedText();
if (result)
{
ImGui::TextUnformatted(InText);
EndItemTooltipWrappedText();
}
return result;
}
//--------------------------------------------------------------------------------------------------------------------------
@@ -647,7 +663,7 @@ bool FCogWindowWidgets::MultiChoiceButton(const char* Label, bool IsSelected, co
}
//--------------------------------------------------------------------------------------------------------------------------
bool FCogWindowWidgets::MultiChoiceButtonsInt(TArray<int32>& Values, int32& Value, const ImVec2& Size)
bool FCogWindowWidgets::MultiChoiceButtonsInt(TArray<int32>& InValues, int32& InCurrentValue, const ImVec2& InSize, bool InInline)
{
ImGuiStyle& Style = ImGui::GetStyle();
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(Style.WindowPadding.x * 0.40f, (float)(int)(Style.WindowPadding.y * 0.60f)));
@@ -656,18 +672,18 @@ bool FCogWindowWidgets::MultiChoiceButtonsInt(TArray<int32>& Values, int32& Valu
ImGui::PushStyleColor(ImGuiCol_Border, IM_COL32(255, 255, 255, 180));
bool IsPressed = false;
for (int32 i = 0; i < Values.Num(); ++i)
for (int32 i = 0; i < InValues.Num(); ++i)
{
int32 ButtonValue = Values[i];
int32 ButtonValue = InValues[i];
const auto Text = StringCast<ANSICHAR>(*FString::Printf(TEXT("%d"), ButtonValue));
if (MultiChoiceButton(Text.Get(), ButtonValue == Value, Size))
if (MultiChoiceButton(Text.Get(), ButtonValue == InCurrentValue, InSize))
{
IsPressed = true;
Value = ButtonValue;
InCurrentValue = ButtonValue;
}
if (i < Values.Num() - 1)
if (InInline && i < InValues.Num() - 1)
{
ImGui::SameLine();
}
@@ -680,7 +696,19 @@ bool FCogWindowWidgets::MultiChoiceButtonsInt(TArray<int32>& Values, int32& Valu
}
//--------------------------------------------------------------------------------------------------------------------------
bool FCogWindowWidgets::MultiChoiceButtonsFloat(TArray<float>& Values, float& Value, const ImVec2& Size)
FString FCogWindowWidgets::RemoveFirstZero(const FString& InText)
{
return InText.Replace(TEXT("0."), TEXT("."));
}
//--------------------------------------------------------------------------------------------------------------------------
FString FCogWindowWidgets::FormatSmallFloat(float InValue)
{
return RemoveFirstZero(FString::Printf(TEXT("%g"), InValue));
}
//--------------------------------------------------------------------------------------------------------------------------
bool FCogWindowWidgets::MultiChoiceButtonsFloat(TArray<float>& InValues, float& InValue, const ImVec2& InSize, bool InInline)
{
ImGuiStyle& Style = ImGui::GetStyle();
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(Style.WindowPadding.x * 0.40f, (float)(int)(Style.WindowPadding.y * 0.60f)));
@@ -689,18 +717,21 @@ bool FCogWindowWidgets::MultiChoiceButtonsFloat(TArray<float>& Values, float& Va
ImGui::PushStyleColor(ImGuiCol_Border, IM_COL32(255, 255, 255, 180));
bool IsPressed = false;
for (int32 i = 0; i < Values.Num(); ++i)
for (int32 i = 0; i < InValues.Num(); ++i)
{
float ButtonValue = Values[i];
float ButtonValue = InValues[i];
const auto Text = StringCast<ANSICHAR>(*FString::Printf(TEXT("%g"), ButtonValue).Replace(TEXT("0."), TEXT(".")));
if (MultiChoiceButton(Text.Get(), ButtonValue == Value, Size))
const auto Text = StringCast<ANSICHAR>(*FormatSmallFloat(ButtonValue));
ImGui::PushID(i);
if (MultiChoiceButton(Text.Get(), ButtonValue == InValue, InSize))
{
IsPressed = true;
Value = ButtonValue;
InValue = ButtonValue;
}
ImGui::PopID();
if (i < Values.Num() - 1)
if (InInline && i < InValues.Num() - 1)
{
ImGui::SameLine();
}
@@ -1278,7 +1309,19 @@ bool FCogWindowWidgets::OpenObjectAssetButton(const UObject* InObject, const ImV
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogWindowWidgets::RenderClosebutton(const ImVec2& InPos)
void FCogWindowWidgets::FloatArray(const char* InLabel, TArray<float>& InArray, int32 InMaxEntries, const ImVec2& Size)
{
ScalarArray(InLabel, ImGuiDataType_Float, InArray, InMaxEntries, Size);
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogWindowWidgets::IntArray(const char* InLabel, TArray<int>& InArray, int32 InMaxEntries, const ImVec2& Size)
{
ScalarArray(InLabel, ImGuiDataType_S32, InArray, InMaxEntries, Size);
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogWindowWidgets::RenderCloseButton(const ImVec2& InPos)
{
ImGuiContext& g = *GImGui;
ImGuiWindow* window = g.CurrentWindow;
@@ -1294,31 +1337,38 @@ void FCogWindowWidgets::RenderClosebutton(const ImVec2& InPos)
window->DrawList->AddLine(cross_center + ImVec2(+cross_extent, -cross_extent), cross_center + ImVec2(-cross_extent, +cross_extent), cross_col, 1.0f);
}
// //--------------------------------------------------------------------------------------------------------------------------
// bool ImGui::ArrowButtonEx(const char* str_id, ImGuiDir dir, ImVec2 size, ImGuiButtonFlags flags)
// {
// ImGuiContext& g = *GImGui;
// ImGuiWindow* window = GetCurrentWindow();
// if (window->SkipItems)
// return false;
//
// const ImGuiID id = window->GetID(str_id);
// const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size);
// const float default_size = GetFrameHeight();
// ItemSize(size, (size.y >= default_size) ? g.Style.FramePadding.y : -1.0f);
// if (!ItemAdd(bb, id))
// return false;
//
// bool hovered, held;
// bool pressed = ButtonBehavior(bb, id, &hovered, &held, flags);
//
// // Render
// const ImU32 bg_col = GetColorU32((held && hovered) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button);
// const ImU32 text_col = GetColorU32(ImGuiCol_Text);
// RenderNavCursor(bb, id);
// RenderFrame(bb.Min, bb.Max, bg_col, true, g.Style.FrameRounding);
// RenderArrow(window->DrawList, bb.Min + ImVec2(ImMax(0.0f, (size.x - g.FontSize) * 0.5f), ImMax(0.0f, (size.y - g.FontSize) * 0.5f)), text_col, dir);
//
// IMGUI_TEST_ENGINE_ITEM_INFO(id, str_id, g.LastItemData.StatusFlags);
// return pressed;
// }
//--------------------------------------------------------------------------------------------------------------------------
bool FCogWindowWidgets::PickButton(const char* InLabel, const ImVec2& InSize, ImGuiButtonFlags InFlags)
{
ImGuiContext& g = *GImGui;
ImGuiWindow* window = ImGui::GetCurrentWindow();
if (window->SkipItems)
return false;
const ImGuiID id = window->GetID(InLabel);
const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + InSize);
const float default_size = ImGui::GetFrameHeight();
ImGui::ItemSize(InSize, (InSize.y >= default_size) ? g.Style.FramePadding.y : -1.0f);
if (!ImGui::ItemAdd(bb, id))
return false;
bool hovered, held;
bool pressed = ImGui::ButtonBehavior(bb, id, &hovered, &held, InFlags);
// Render
const ImU32 bg_col = ImGui::GetColorU32((held && hovered) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button);
const ImU32 text_col = ImGui::GetColorU32(ImGuiCol_Text);
ImGui::RenderNavCursor(bb, id);
ImGui::RenderFrame(bb.Min, bb.Max, bg_col, true, g.Style.FrameRounding);
ImVec2 pos = bb.Min + ImVec2(ImMax(0.0f, (InSize.x - g.FontSize) * 0.5f), ImMax(0.0f, (InSize.y - g.FontSize) * 0.5f));
float scale = 1.0f;
const float h = window->DrawList->_Data->FontSize * 1.00f;
float r = h * 0.40f * scale;
ImVec2 center = pos + ImVec2(h * 0.50f, h * 0.50f * scale);
window->DrawList->AddCircle(center, r, text_col, 0, 1);
window->DrawList->AddCircleFilled(center, r * 0.3f, text_col);
return pressed;
}
@@ -49,14 +49,6 @@ void FCogWindow_Settings::PreSaveConfig()
Config->bShareMouseWithGameplay = Context.GetShareMouseWithGameplay();
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogWindow_Settings::ResetConfig()
{
Super::ResetConfig();
Config->Reset();
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogWindow_Settings::RenderContent()
{
@@ -24,7 +24,7 @@ public:
virtual void Shutdown() {}
virtual void ResetConfig() {}
virtual void ResetConfig();
virtual void PreSaveConfig() {}
@@ -38,7 +38,7 @@ public:
virtual void GameTick(float DeltaTime);
/** */
virtual void RenderMainMenuWidget() {}
virtual void RenderMainMenuWidget();
ImGuiID GetID() const { return ID; }
@@ -73,9 +73,9 @@ public:
UCogWindowManager* GetOwner() const { return Owner; }
template<class T>
T* GetConfig() const { return Cast<T>(GetConfig(T::StaticClass())); }
T* GetConfig(bool InResetConfigOnRequest = true) const { return Cast<T>(GetConfig(T::StaticClass(), InResetConfigOnRequest)); }
UCogCommonConfig* GetConfig(const TSubclassOf<UCogCommonConfig> ConfigClass) const;
UCogCommonConfig* GetConfig(const TSubclassOf<UCogCommonConfig>& InConfigClass, bool InResetConfigOnRequest = true) const;
template<class T>
const T* GetAsset() const { return Cast<T>(GetAsset(T::StaticClass())); }
@@ -100,6 +100,8 @@ protected:
virtual bool CheckEditorVisibility();
virtual void RenderContextMenu();
virtual void OnWindowVisibilityChanged(bool NewVisibility) { }
virtual void OnSelectionChanged(AActor* OldSelection, AActor* NewSelection) {}
@@ -141,5 +143,7 @@ protected:
TWeakObjectPtr<AActor> CurrentSelection;
TWeakObjectPtr<AActor> OverridenSelection;
mutable TArray<TWeakObjectPtr<UCogCommonConfig>> ConfigsToResetOnRequest;
};
@@ -28,6 +28,10 @@ public:
static void EndTableTooltip();
static bool ItemTooltipWrappedText(const char* InText);
static bool BeginItemTooltipWrappedText();
static void EndItemTooltipWrappedText();
static bool BeginItemTableTooltip();
@@ -47,9 +51,9 @@ public:
static bool MultiChoiceButton(const char* Label, bool IsSelected, const ImVec2& Size = ImVec2(0, 0));
static bool MultiChoiceButtonsInt(TArray<int32>& Values, int32& Value, const ImVec2& Size = ImVec2(0, 0));
static bool MultiChoiceButtonsInt(TArray<int32>& Values, int32& Value, const ImVec2& Size = ImVec2(0, 0), bool InInline = true);
static bool MultiChoiceButtonsFloat(TArray<float>& Values, float& Value, const ImVec2& Size = ImVec2(0, 0));
static bool MultiChoiceButtonsFloat(TArray<float>& InValues, float& InValue, const ImVec2& InSize = ImVec2(0, 0), bool InInline = true);
static void SliderWithReset(const char* Name, float* Value, float Min, float Max, const float& ResetValue, const char* Format);
@@ -135,8 +139,20 @@ public:
static bool OpenObjectAssetButton(const UObject* InObject, const ImVec2& InSize = ImVec2(0, 0));
static void RenderClosebutton(const ImVec2& InPos);
static void RenderCloseButton(const ImVec2& InPos);
static bool PickButton(const char* InLabel, const ImVec2& InSize, ImGuiButtonFlags InFlags = ImGuiButtonFlags_None);
static FString RemoveFirstZero(const FString& InText);
static FString FormatSmallFloat(float InValue);
static void FloatArray(const char* InLabel, TArray<float>& InArray, int32 InMaxEntries = 0, const ImVec2& Size = ImVec2(0, 0));
static void IntArray(const char* InLabel, TArray<int>& InArray, int32 InMaxEntries = 0, const ImVec2& Size = ImVec2(0, 0));
template<typename T>
static bool ScalarArray(const char* InLabel, ImGuiDataType InDataType, TArray<T>& InArray, int32 InMaxEntries = 0, const ImVec2& Size = ImVec2(0, 0));
};
template<typename EnumType>
@@ -156,4 +172,44 @@ template<typename EnumType>
bool FCogWindowWidgets::ComboboxEnum(const char* Label, EnumType& Value)
{
return ComboboxEnum(Label, Value, Value);
}
template<typename T>
bool FCogWindowWidgets::ScalarArray(const char* InLabel, ImGuiDataType InDataType, TArray<T>& InArray, int32 InMaxEntries, const ImVec2& Size)
{
bool Result = false;
ImGui::PushID(InLabel);
if (ImGui::BeginChild("##Entries", Size, ImGuiChildFlags_Borders | ImGuiChildFlags_ResizeY, ImGuiWindowFlags_MenuBar))
{
if (ImGui::BeginMenuBar())
{
ImGui::TextUnformatted(InLabel);
int32 NumEntries = InArray.Num();
SetNextItemToShortWidth();
if (ImGui::SliderInt("##Size", &NumEntries, 0, InMaxEntries))
{
InArray.SetNum(NumEntries);
Result = true;
}
ImGui::EndMenuBar();
}
for (int32 i = 0; i < InArray.Num(); i++)
{
ImGui::PushID(i);
ImGui::SetNextItemWidth(-1);
if (ImGui::InputScalar("##Entry", InDataType, &InArray[i]))
{
Result = true;
}
ImGui::PopID();
}
}
ImGui::EndChild();
ImGui::PopID();
return Result;
}
@@ -30,8 +30,6 @@ protected:
virtual void PreSaveConfig() override;
virtual void ResetConfig() override;
virtual void RenderShortcut(const char* Label, FCogImGuiKeyInfo& KeyInfo);
TObjectPtr<UCogWindowConfig_Settings> Config = nullptr;
@@ -25,14 +25,6 @@ void FCogAIWindow_Blackboard::RenderHelp()
);
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogAIWindow_Blackboard::ResetConfig()
{
Super::ResetConfig();
Config->Reset();
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogAIWindow_Blackboard::RenderContent()
{
@@ -18,8 +18,6 @@ public:
protected:
virtual void ResetConfig() override;
virtual void RenderHelp() override;
virtual void RenderContent() override;
@@ -36,14 +36,6 @@ void FCogAbilityWindow_Abilities::RenderHelp()
, TCHAR_TO_ANSI(*GetNameSafe(Asset.Get())));
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogAbilityWindow_Abilities::ResetConfig()
{
Super::ResetConfig();
Config->Reset();
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogAbilityWindow_Abilities::RenderTick(float DeltaTime)
{
@@ -35,14 +35,6 @@ void FCogAbilityWindow_Attributes::RenderHelp()
);
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogAbilityWindow_Attributes::ResetConfig()
{
Super::ResetConfig();
Config->Reset();
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogAbilityWindow_Attributes::RenderTick(float DeltaTime)
{
@@ -38,15 +38,6 @@ void FCogAbilityWindow_Cheats::RenderHelp()
);
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogAbilityWindow_Cheats::ResetConfig()
{
Super::ResetConfig();
Config->Reset();
AlignmentConfig->Reset();
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogAbilityWindow_Cheats::GameTick(float DeltaTime)
{
@@ -32,15 +32,6 @@ void FCogAbilityWindow_Effects::RenderHelp()
);
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogAbilityWindow_Effects::ResetConfig()
{
Super::ResetConfig();
Config->Reset();
AlignmentConfig->Reset();
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogAbilityWindow_Effects::RenderTick(float DeltaTime)
{
@@ -14,14 +14,6 @@ void FCogAbilityWindow_Tags::Initialize()
bNoPadding = true;
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogAbilityWindow_Tags::ResetConfig()
{
Super::ResetConfig();
Config->Reset();
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogAbilityWindow_Tags::RenderHelp()
{
@@ -26,14 +26,6 @@ void FCogAbilityWindow_Tasks::RenderHelp()
"This window displays the gameplay tasks. ");
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogAbilityWindow_Tasks::ResetConfig()
{
Super::ResetConfig();
Config->Reset();
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogAbilityWindow_Tasks::RenderTick(float DetlaTime)
{
@@ -22,8 +22,6 @@ public:
protected:
virtual void ResetConfig() override;
virtual void RenderHelp() override;
virtual void RenderTick(float DeltaTime) override;
@@ -24,11 +24,9 @@ public:
protected:
virtual void ResetConfig() override;
virtual void RenderHelp() override;
virtual void RenderTick(float DeltaTime);
virtual void RenderTick(float DeltaTime) override;
virtual void RenderContent() override;
@@ -22,15 +22,14 @@ public:
protected:
virtual void GameTick(float DeltaTime);
virtual void ResetConfig() override;
virtual void GameTick(float DeltaTime) override;
virtual void RenderHelp() override;
virtual void RenderContent() override;
virtual void TryReapplyCheats();
APawn* GetCheatInstigator();
virtual bool AddCheat(AActor* ControlledActor, AActor* TargetActor, const FCogAbilityCheat& CheatEffect, bool IsPersistent);
@@ -34,8 +34,6 @@ protected:
virtual void RenderTick(float DeltaTime) override;
virtual void ResetConfig() override;
virtual void RenderEffectsTable();
virtual void RenderEffectRow(UAbilitySystemComponent& AbilitySystemComponent, const FActiveGameplayEffectHandle& ActiveHandle, int32 Index, int32& Selected);
@@ -23,8 +23,6 @@ protected:
virtual void GetTagContainer(FGameplayTagContainer& TagContainer) {}
virtual void ResetConfig();
virtual void RenderHelp() override;
virtual void RenderContent() override;
@@ -19,8 +19,6 @@ public:
protected:
virtual void ResetConfig() override;
virtual void RenderHelp() override;
virtual void RenderTick(float DetlaTime) override;
@@ -27,14 +27,6 @@ void FCogInputWindow_Actions::RenderHelp()
"It can also be used to inject inputs to help debugging.");
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogInputWindow_Actions::ResetConfig()
{
Super::ResetConfig();
Config->Reset();
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogInputWindow_Actions::RenderContent()
{
@@ -29,17 +29,6 @@ void FCogInputWindow_Gamepad::PreRender(ImGuiWindowFlags& WindowFlags)
}
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogInputWindow_Gamepad::ResetConfig()
{
Super::ResetConfig();
if (Config != nullptr)
{
Config->Reset();
}
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogInputWindow_Gamepad::RenderButtonContextMenu(const FKey& Key, FCogInputActionInfo* ActionInfoButton)
{
@@ -20,8 +20,6 @@ public:
protected:
virtual void ResetConfig() override;
virtual void RenderHelp() override;
virtual void RenderContent() override;
@@ -25,8 +25,6 @@ public:
protected:
virtual void ResetConfig() override;
virtual void PreRender(ImGuiWindowFlags& WindowFlags) override;
virtual void RenderContent() override;