CogAbility: Add menu to sort and filter Tags window

This commit is contained in:
Arnaud Jamin
2023-11-03 23:38:53 -04:00
parent 31d5fa9db8
commit 429123dbd3
4 changed files with 154 additions and 65 deletions
@@ -238,7 +238,7 @@ void FCogAbilityWindow_Abilities::RenderAbilitiesTable(UAbilitySystemComponent&
| ImGuiTableFlags_Reorderable
| ImGuiTableFlags_Hideable))
{
ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed);
ImGui::TableSetupColumn("##Activation", ImGuiTableColumnFlags_WidthFixed);
ImGui::TableSetupScrollFreeze(0, 1);
ImGui::TableSetupColumn("Ability");
ImGui::TableSetupColumn("Level");
@@ -10,7 +10,17 @@ void FCogAbilityWindow_Tags::Initialize()
{
Super::Initialize();
bHasMenu = false;
bHasMenu = true;
Config = GetConfig<UCogAbilityConfig_Tags>();
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogAbilityWindow_Tags::ResetConfig()
{
Super::ResetConfig();
Config->Reset();
}
//--------------------------------------------------------------------------------------------------------------------------
@@ -24,6 +34,8 @@ void FCogAbilityWindow_Tags::RenderContent()
{
Super::RenderContent();
RenderMenu();
UAbilitySystemComponent* AbilitySystemComponent = UAbilitySystemGlobals::GetAbilitySystemComponentFromActor(GetSelection(), true);
if (AbilitySystemComponent == nullptr)
{
@@ -34,11 +46,113 @@ void FCogAbilityWindow_Tags::RenderContent()
AbilitySystemComponent->GetOwnedGameplayTags(OwnedTags);
AbilitySystemComponent->GetBlockedAbilityTags(BlockedTags);
DrawTagContainer("Owned Tags", *AbilitySystemComponent, OwnedTags);
RenderTagContainer("Owned Tags", *AbilitySystemComponent, OwnedTags);
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogAbilityWindow_Tags::DrawTag(const UAbilitySystemComponent& AbilitySystemComponent, const FGameplayTag& Tag)
void FCogAbilityWindow_Tags::RenderMenu()
{
if (ImGui::BeginMenuBar())
{
if (ImGui::BeginMenu("Options"))
{
ImGui::Checkbox("Sort by Name", &Config->SortByName);
ImGui::Separator();
if (ImGui::MenuItem("Reset"))
{
ResetConfig();
}
ImGui::EndMenu();
}
FCogWindowWidgets::MenuSearchBar(Filter);
ImGui::EndMenuBar();
}
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogAbilityWindow_Tags::RenderTagContainer(const FString& TagContainerName, const UAbilitySystemComponent& AbilitySystemComponent, FGameplayTagContainer& TagContainer)
{
if (ImGui::BeginTable(TCHAR_TO_ANSI(*TagContainerName), 2, ImGuiTableFlags_SizingFixedFit
| ImGuiTableFlags_Resizable
| ImGuiTableFlags_NoBordersInBodyUntilResize
| ImGuiTableFlags_ScrollY
| ImGuiTableFlags_RowBg
| ImGuiTableFlags_BordersOuter
| ImGuiTableFlags_BordersV
| ImGuiTableFlags_Reorderable
| ImGuiTableFlags_Hideable))
{
ImGui::TableSetupScrollFreeze(0, 1);
ImGui::TableSetupColumn("Count");
ImGui::TableSetupColumn(TCHAR_TO_ANSI(*TagContainerName));
ImGui::TableHeadersRow();
TArray<FGameplayTag> Tags;
TagContainer.GetGameplayTagArray(Tags);
Tags.RemoveAll([&](const FGameplayTag& Tag)
{
return Filter.PassFilter(TCHAR_TO_ANSI(*Tag.GetTagName().ToString())) == false;
});
if (Config->SortByName)
{
Tags.Sort([](const FGameplayTag& Tag1, const FGameplayTag& Tag2)
{
return Tag1.GetTagName().Compare(Tag2.GetTagName()) < 0;
});
}
static int Selected = -1;
int Index = 0;
for (const FGameplayTag& Tag : Tags)
{
ImGui::TableNextRow();
ImGui::PushID(Index);
//------------------------
// Count
//------------------------
ImGui::TableNextColumn();
const int32 TagCount = AbilitySystemComponent.GetTagCount(Tag);
ImGui::TextColored(TagCount > 1 ? ImVec4(1.0f, 1.0f, 0.0f, 1.0f) : ImVec4(1.0f, 1.0f, 1.0f, 1.0f), "%d", TagCount);
//------------------------
// Name
//------------------------
ImGui::TableNextColumn();
if (ImGui::Selectable(TCHAR_TO_ANSI(*Tag.GetTagName().ToString()), Selected == Index, ImGuiSelectableFlags_SpanAllColumns | ImGuiSelectableFlags_AllowItemOverlap | ImGuiSelectableFlags_AllowDoubleClick))
{
Selected = Index;
}
//------------------------
// Tooltip
//------------------------
if (ImGui::IsItemHovered())
{
FCogWindowWidgets::BeginTableTooltip();
RenderTag(AbilitySystemComponent, Tag);
FCogWindowWidgets::EndTableTooltip();
}
ImGui::PopID();
Index++;
}
ImGui::EndTable();
}
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogAbilityWindow_Tags::RenderTag(const UAbilitySystemComponent& AbilitySystemComponent, const FGameplayTag& Tag)
{
if (ImGui::BeginTable("Tag", 2, ImGuiTableFlags_Borders))
{
@@ -91,61 +205,6 @@ void FCogAbilityWindow_Tags::DrawTag(const UAbilitySystemComponent& AbilitySyste
}
}
ImGui::EndTable();
}
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogAbilityWindow_Tags::DrawTagContainer(const FString& TagContainerName, const UAbilitySystemComponent& AbilitySystemComponent, FGameplayTagContainer& TagContainer)
{
if (ImGui::BeginTable(TCHAR_TO_ANSI(*TagContainerName), 2, ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_Resizable | ImGuiTableFlags_NoBordersInBodyUntilResize | ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuterH | ImGuiTableFlags_BordersOuterV))
{
ImGui::TableSetupColumn("Count");
ImGui::TableSetupColumn(TCHAR_TO_ANSI(*TagContainerName));
ImGui::TableHeadersRow();
TArray<FGameplayTag> Tags;
TagContainer.GetGameplayTagArray(Tags);
static int Selected = -1;
int index = 0;
for (const FGameplayTag& Tag : Tags)
{
ImGui::TableNextRow();
ImGui::PushID(index);
//------------------------
// Count
//------------------------
ImGui::TableNextColumn();
const int32 TagCount = AbilitySystemComponent.GetTagCount(Tag);
ImGui::TextColored(TagCount > 1 ? ImVec4(1.0f, 1.0f, 0.0f, 1.0f) : ImVec4(1.0f, 1.0f, 1.0f, 1.0f), "%d", TagCount);
//------------------------
// Name
//------------------------
ImGui::TableNextColumn();
if (ImGui::Selectable(TCHAR_TO_ANSI(*Tag.GetTagName().ToString()), Selected == index, ImGuiSelectableFlags_SpanAllColumns | ImGuiSelectableFlags_AllowItemOverlap | ImGuiSelectableFlags_AllowDoubleClick))
{
Selected = index;
}
//------------------------
// Tooltip
//------------------------
if (ImGui::IsItemHovered())
{
FCogWindowWidgets::BeginTableTooltip();
DrawTag(AbilitySystemComponent, Tag);
FCogWindowWidgets::EndTableTooltip();
}
ImGui::PopID();
index++;
}
ImGui::EndTable();
}
}
@@ -2,10 +2,13 @@
#include "CoreMinimal.h"
#include "CogWindow.h"
#include "CogWindowConfig.h"
#include "CogAbilityWindow_Tags.generated.h"
class UAbilitySystemComponent;
struct FGameplayTagContainer;
struct FGameplayTag;
class UCogAbilityConfig_Tags;
class UAbilitySystemComponent;
//--------------------------------------------------------------------------------------------------------------------------
class COGABILITY_API FCogAbilityWindow_Tags : public FCogWindow
@@ -18,11 +21,38 @@ public:
protected:
virtual void ResetConfig();
virtual void RenderHelp() override;
virtual void RenderContent() override;
virtual void DrawTagContainer(const FString& TagContainerName, const UAbilitySystemComponent& AbilitySystemComponent, FGameplayTagContainer& TagContainer);
virtual void RenderTagContainer(const FString& TagContainerName, const UAbilitySystemComponent& AbilitySystemComponent, FGameplayTagContainer& TagContainer);
virtual void DrawTag(const UAbilitySystemComponent& AbilitySystemComponent, const FGameplayTag& Tag);
virtual void RenderTag(const UAbilitySystemComponent& AbilitySystemComponent, const FGameplayTag& Tag);
virtual void RenderMenu();
TObjectPtr<UCogAbilityConfig_Tags> Config = nullptr;
ImGuiTextFilter Filter;
};
//--------------------------------------------------------------------------------------------------------------------------
UCLASS(Config = Cog)
class UCogAbilityConfig_Tags : public UCogWindowConfig
{
GENERATED_BODY()
public:
UPROPERTY(Config)
bool SortByName = false;
virtual void Reset() override
{
Super::Reset();
SortByName = false;
}
};
+3 -3
View File
@@ -3,6 +3,8 @@
- CogWindow: Add reset window position menu item or reset layout (window can get far away)
- CogWindow: Try to remove CogWindow dependency to cogimgui. Should only depends on imgui (currently use setdpiscale of cogimgui)
- CogWindow: Overlay window should have achnoring options (top bottom left right center mid)
- CogWindow: Hide menu is not saved anymore
- CogEngine: More stats in the stats window
- CogEngine: Overlay mode of stats.
@@ -22,6 +24,4 @@
- CogSample: Add more debug for area (change color on tick, duration ...)
- CogDebug: Check KismetExecutionMessage for warnings. As an exemple it is used by GEngine::GetWorldFromContextObject.
- CogDebug: Rework Tickness and Duration params.
- CogInput: Add gamepad stick drag to set their values
- CogDebug: Rework Thickness and Duration params.