CogWindow: Widgets can now be chosen and ordered by the user

This commit is contained in:
Arnaud Jamin
2023-11-03 21:08:54 -04:00
parent 4393709bbc
commit 31d5fa9db8
7 changed files with 142 additions and 27 deletions
@@ -21,6 +21,7 @@ void FCogEngineWindow_Selection::Initialize()
Super::Initialize();
bHasMenu = true;
bHasWidget = true;
ActorClasses = { AActor::StaticClass(), ACharacter::StaticClass() };
Config = GetConfig<UCogEngineConfig_Selection>();
@@ -11,6 +11,14 @@ 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()
{
Super::Initialize();
bHasWidget = true;
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogEngineWindow_Stats::RenderHelp()
{
@@ -17,6 +17,8 @@ public:
protected:
virtual void Initialize() override;
virtual void RenderHelp() override;
virtual void RenderContent() override;
@@ -205,6 +205,12 @@ void UCogWindowManager::AddWindow(FCogWindow* Window, const FString& Name, bool
Window->Initialize();
Windows.Add(Window);
if (Window->HasWidget())
{
Widgets.Add(Window);
//Widgets.Sort()
}
if (AddToMainMenu)
{
if (FMenu* Menu = AddMenu(Window->GetFullName()))
@@ -214,13 +220,6 @@ void UCogWindowManager::AddWindow(FCogWindow* Window, const FString& Name, bool
}
}
//--------------------------------------------------------------------------------------------------------------------------
void UCogWindowManager::AddMainMenuWidget(FCogWindow* Window)
{
Window->SetOwner(this);
MainMenuWidgets.Add(Window);
}
//--------------------------------------------------------------------------------------------------------------------------
FCogWindow* UCogWindowManager::FindWindowByID(ImGuiID ID)
{
@@ -388,6 +387,44 @@ void UCogWindowManager::RenderMainMenu()
ImGui::EndMenu();
}
if (ImGui::BeginMenu("Widgets"))
{
for (int32 i = 0; i < Widgets.Num(); ++i)
{
FCogWindow* Window = Widgets[i];
ImGui::PushID(i);
bool Visible = Window->GetIsWidgetVisible();
if (ImGui::Checkbox(TCHAR_TO_ANSI(*Window->GetName()), &Visible))
{
Window->SetIsWidgetVisible(Visible);
}
if (ImGui::IsItemActive() && ImGui::IsItemHovered() == false)
{
int iNext = i + (ImGui::GetMouseDragDelta(0).y < 0.f ? -1 : 1);
if (iNext >= 0 && iNext < Widgets.Num())
{
Widgets[i] = Widgets[iNext];
Widgets[iNext] = Window;
ImGui::ResetMouseDragDelta();
}
}
if (i == 0)
{
ImGui::SameLine();
FCogWindowWidgets::HelpMarker("Drag and drop the widget name to reorder them.");
}
ImGui::PopID();
}
ImGui::EndMenu();
}
ImGui::Separator();
RenderMenuItem(*SettingsWindow, "Settings");
@@ -398,9 +435,20 @@ void UCogWindowManager::RenderMainMenu()
const float MinCursorX = ImGui::GetCursorPosX();
float CursorX = ImGui::GetWindowWidth();
for (FCogWindow* Window : MainMenuWidgets)
//------------------------------------------------------------
// Render in reverse order because it makes more sense
// when looking at the widget ordered list in the UI.
//------------------------------------------------------------
for (int32 WindowIndex = Widgets.Num() - 1; WindowIndex >= 0; WindowIndex--)
{
FCogWindow* Window = Widgets[WindowIndex];
if (Window->GetIsWidgetVisible() == false)
{
continue;
}
TArray<float> SubWidgetsWidths;
float SimCursorX = CursorX;
for (int32 SubWidgetIndex = 0; ; ++SubWidgetIndex)
@@ -563,24 +611,62 @@ void UCogWindowManager::SettingsHandler_ClearAll(ImGuiContext* Context, ImGuiSet
//--------------------------------------------------------------------------------------------------------------------------
void UCogWindowManager::SettingsHandler_ApplyAll(ImGuiContext* Context, ImGuiSettingsHandler* Handler)
{
UCogWindowManager* Manager = (UCogWindowManager*)Handler->UserData;
Manager->Widgets.Sort([](const FCogWindow& Window1, const FCogWindow& Window2)
{
return Window1.GetWidgetOrderIndex() < Window2.GetWidgetOrderIndex();
});
}
//--------------------------------------------------------------------------------------------------------------------------
void* UCogWindowManager::SettingsHandler_ReadOpen(ImGuiContext* Context, ImGuiSettingsHandler* Handler, const char* Name)
{
return (void*)1;
if (strcmp(Name, "Windows") == 0)
{
return (void*)1;
}
if (strcmp(Name, "Widgets") == 0)
{
UCogWindowManager* Manager = (UCogWindowManager*)Handler->UserData;
Manager->WidgetsOrderIndex = 0;
return (void*)2;
}
return nullptr;
}
//--------------------------------------------------------------------------------------------------------------------------
void UCogWindowManager::SettingsHandler_ReadLine(ImGuiContext* Context, ImGuiSettingsHandler* Handler, void* Entry, const char* Line)
{
ImGuiID Id;
if (sscanf_s(Line, "0x%08X", &Id) == 1)
if (Entry == (void*)1)
{
UCogWindowManager* Manager = (UCogWindowManager*)Handler->UserData;
if (FCogWindow* Window = Manager->FindWindowByID(Id))
ImGuiID Id;
if (sscanf_s(Line, "0x%08X", &Id) == 1)
{
Window->SetIsVisible(true);
UCogWindowManager* Manager = (UCogWindowManager*)Handler->UserData;
if (FCogWindow* Window = Manager->FindWindowByID(Id))
{
Window->SetIsVisible(true);
}
}
}
else if (Entry == (void*)2)
{
ImGuiID Id;
int32 Visible = false;
if (sscanf_s(Line, "0x%08X %d", &Id, &Visible) == 2)
{
UCogWindowManager* Manager = (UCogWindowManager*)Handler->UserData;
if (FCogWindow* Window = Manager->FindWindowByID(Id))
{
Window->SetWidgetOrderIndex(Manager->WidgetsOrderIndex);
Window->SetIsWidgetVisible(Visible > 0);
}
Manager->WidgetsOrderIndex++;
}
}
}
@@ -598,6 +684,14 @@ void UCogWindowManager::SettingsHandler_WriteAll(ImGuiContext* Context, ImGuiSet
Buffer->appendf("0x%08X\n", Window->GetID());
}
}
Buffer->append("\n");
Buffer->appendf("[%s][Widgets]\n", Handler->TypeName);
for (FCogWindow* Window : Manager->Widgets)
{
Buffer->appendf("0x%08X %d\n", Window->GetID(), Window->GetIsWidgetVisible());
}
Buffer->append("\n");
}
//--------------------------------------------------------------------------------------------------------------------------
@@ -56,6 +56,16 @@ public:
void SetIsVisible(bool Value) { bIsVisible = Value; }
bool HasWidget() const { return bHasWidget; }
bool GetIsWidgetVisible() const { return bIsWidgetVisible; }
void SetIsWidgetVisible(bool Value) { bIsWidgetVisible = Value; }
int32 GetWidgetOrderIndex() const { return WidgetOrderIndex; }
void SetWidgetOrderIndex(int32 Value) { WidgetOrderIndex = Value; }
void SetOwner(UCogWindowManager* InOwner) { Owner = InOwner; }
UCogWindowManager* GetOwner() const { return Owner; }
@@ -98,13 +108,18 @@ protected:
protected:
UPROPERTY(Config)
bool bHideMenu = false;
bool bHasMenu = false;
bool bIsVisible = false;
bool bHasWidget = false;
bool bIsWidgetVisible = false;
int32 WidgetOrderIndex = -1;
ImGuiID ID;
FString FullName;
@@ -40,8 +40,6 @@ public:
virtual void AddWindow(FCogWindow* Window, const FString& Name, bool AddToMainMenu = true);
virtual void AddMainMenuWidget(FCogWindow* Window);
virtual FCogWindow* FindWindowByID(ImGuiID ID);
virtual void CloseAllWindows();
@@ -132,6 +130,8 @@ protected:
virtual void RenderSaveLayoutMenuItem(const UPlayerInput* PlayerInput, int LayoutIndex);
virtual void TickDPI();
static void SettingsHandler_ClearAll(ImGuiContext* ctx, ImGuiSettingsHandler*);
static void SettingsHandler_ApplyAll(ImGuiContext* ctx, ImGuiSettingsHandler*);
@@ -142,7 +142,6 @@ protected:
static void SettingsHandler_WriteAll(ImGuiContext* ctx, ImGuiSettingsHandler* handler, ImGuiTextBuffer* buf);
void TickDPI();
UPROPERTY()
mutable TArray<UCogWindowConfig*> Configs;
@@ -172,12 +171,14 @@ protected:
TArray<FCogWindow*> Windows;
TArray<FCogWindow*> Widgets;
int32 WidgetsOrderIndex = 0;
TArray<FCogWindow*> SpaceWindows;
FCogWindow_Settings* SettingsWindow = nullptr;
TArray<FCogWindow*> MainMenuWidgets;
FMenu MainMenu;
int32 LayoutToLoad = -1;
-6
View File
@@ -194,12 +194,6 @@ void ACogSampleGameState::InitializeCog()
CogWindowManager->AddWindow<FCogInputWindow_Actions>("Input.Actions");
CogWindowManager->AddWindow<FCogInputWindow_Gamepad>("Input.Gamepad");
//---------------------------------------
// Main Menu Widget
//---------------------------------------
CogWindowManager->AddMainMenuWidget(SelectionWindow);
CogWindowManager->AddMainMenuWidget(StatsWindow);
}
#endif //ENABLE_COG