UnrealImGui/Source/ImGui/Public/ImGuiDelegates.h
Sebastian 4a9d66889b Added ImGui early debug events:
- Added to FImGuiDelegates interface early debug delegates called during world tick start.
- Delegates are called in fixed order: multi-context early debug, world early debug (called during world tick start), world debug, multi-context debug (called during world post actor tick or if not available, during world tick start).
- Removed from build script configuration of debug delegates.
2019-04-14 12:16:15 +01:00

116 lines
3.4 KiB
C++

// Distributed under the MIT License (MIT) (see accompanying LICENSE file)
#pragma once
#include <Core.h>
/**
* Delegates to ImGui debug events. World delegates are called once per frame during world updates and have invocation
* lists cleared after their worlds become invalid. Multi-context delegates are called once for every updated world.
* Early debug delegates are called during world tick start and debug delegates are called during world post actor tick
* or in engine versions below 4.18 during world tick start.
*
* Order of events is defined in a way that multi-context delegates can be used to draw headers and/or footers:
* multi-context early debug, world early debug, world debug, multi-context debug.
*/
class IMGUI_API FImGuiDelegates
{
public:
/**
* Get a delegate to ImGui world early debug event for current world (GWorld).
* @returns Simple multicast delegate to debug events called once per frame to debug current world
*/
static FSimpleMulticastDelegate& OnWorldEarlyDebug();
/**
* Get a delegate to ImGui world early debug event for given world.
* @param World - World for which we need a delegate
* @returns Simple multicast delegate to debug events called once per frame to debug given world
*/
static FSimpleMulticastDelegate& OnWorldEarlyDebug(UWorld* World);
/**
* Get a delegate to ImGui multi-context early debug event.
* @returns Simple multicast delegate to debug events called once per frame for every world to debug
*/
static FSimpleMulticastDelegate& OnMultiContextEarlyDebug();
/**
* Get a delegate to ImGui world debug event for current world (GWorld).
* @returns Simple multicast delegate to debug events called once per frame to debug current world
*/
static FSimpleMulticastDelegate& OnWorldDebug();
/**
* Get a delegate to ImGui world debug event for given world.
* @param World - World for which we need a delegate
* @returns Simple multicast delegate to debug events called once per frame to debug given world
*/
static FSimpleMulticastDelegate& OnWorldDebug(UWorld* World);
/**
* Get a delegate to ImGui multi-context debug event.
* @returns Simple multicast delegate to debug events called once per frame for every world to debug
*/
static FSimpleMulticastDelegate& OnMultiContextDebug();
};
/** Enable to support legacy ImGui delegates API. */
#define IMGUI_WITH_OBSOLETE_DELEGATES 1
#if IMGUI_WITH_OBSOLETE_DELEGATES
/** Delegate that allows to subscribe for ImGui events. */
typedef FSimpleMulticastDelegate::FDelegate FImGuiDelegate;
/**
* Handle to ImGui delegate. Contains additional information locating delegates in different contexts.
*/
class FImGuiDelegateHandle
{
public:
FImGuiDelegateHandle() = default;
bool IsValid() const
{
return Handle.IsValid();
}
void Reset()
{
Handle.Reset();
Index = 0;
}
private:
FImGuiDelegateHandle(const FDelegateHandle& InHandle, int32 InCategory, int32 InIndex = 0)
: Handle(InHandle)
, Category(InCategory)
, Index(InIndex)
{
}
friend bool operator==(const FImGuiDelegateHandle& Lhs, const FImGuiDelegateHandle& Rhs)
{
return Lhs.Handle == Rhs.Handle && Lhs.Category == Rhs.Category && Lhs.Index == Rhs.Index;
}
friend bool operator!=(const FImGuiDelegateHandle& Lhs, const FImGuiDelegateHandle& Rhs)
{
return !(Lhs == Rhs);
}
FDelegateHandle Handle;
int32 Category = 0;
int32 Index = 0;
friend class FImGuiModule;
};
#endif // IMGUI_WITH_OBSOLETE_DELEGATES