---
title: "QuartzUILayerStack: declaration reference"
description: "Quartz UI 0.57.0-dev: QuartzUILayerStack: declaration reference. Source-reviewed guidance, usage and limitations."
status: approved
visibility: public
sourceRevision: fe5b709ec900e282b50e58b819a25041945005f9
reviewedAt: 2026-09-24
---

# QuartzUILayerStack: declaration reference

> **0.57.0-dev · beta source documentation.** Native, Blueprint, Editor and rendering examples are source-reviewed, not executed in Unreal during this scan. See [validation and limits](https://betterbuilt.games/docs/quartz-ui/evidence).

Pinned source (source: `Source/QuartzUIRuntime/Public/QuartzUILayerStack.h`) · [integration recipe](https://betterbuilt.games/docs/quartz-ui/inventory#quartzuilayerstack) · [practical guide](https://betterbuilt.games/docs/quartz-ui/views-input)

## FQuartzUILayerStackChangedNative

**Public delegate.** Layer Stack Changed Native: callback signature for per-player ordered layer policy, retained views and back dismissal.

**Prerequisites / integration:** Exact local player and configured app; Slate/UMG dependencies for native presentation work. Use the [QuartzUILayerStack recipe](https://betterbuilt.games/docs/quartz-ui/inventory#quartzuilayerstack) in the host module `QuartzUIRuntime`.

**Minimal example / lifecycle:** RegisterLayer with FQuartzUILayerDefinition; PushView; PopView. Close may defer for exit animation; covered views remain retained.

**Avoid:** Mutating another player's stack or forgetting close after nonclosing pop. Match the exact declaration below; dependent DTOs/enums are values used by this owner, not independent systems.

Exact source line (source: `Source/QuartzUIRuntime/Public/QuartzUILayerStack.h#L13`)

## FQuartzUILayerTransitionDefinition

**Public type.** Bounded native composition animation; web content remains free to animate independently.

**Prerequisites / integration:** Exact local player and configured app; Slate/UMG dependencies for native presentation work. Use the [QuartzUILayerStack recipe](https://betterbuilt.games/docs/quartz-ui/inventory#quartzuilayerstack) in the host module `QuartzUIRuntime`.

**Minimal example / lifecycle:** RegisterLayer with FQuartzUILayerDefinition; PushView; PopView. Close may defer for exit animation; covered views remain retained.

**Avoid:** Mutating another player's stack or forgetting close after nonclosing pop. Match the exact declaration below; dependent DTOs/enums are values used by this owner, not independent systems.

Exact source line (source: `Source/QuartzUIRuntime/Public/QuartzUILayerStack.h#L17`)

## FQuartzUILayerDefinition

**Public type.** Host-independent layer policy; later adapters may map IDs to CommonUI gameplay tags.

**Prerequisites / integration:** Exact local player and configured app; Slate/UMG dependencies for native presentation work. Use the [QuartzUILayerStack recipe](https://betterbuilt.games/docs/quartz-ui/inventory#quartzuilayerstack) in the host module `QuartzUIRuntime`.

**Minimal example / lifecycle:** RegisterLayer with FQuartzUILayerDefinition; PushView; PopView. Close may defer for exit animation; covered views remain retained.

**Avoid:** Mutating another player's stack or forgetting close after nonclosing pop. Match the exact declaration below; dependent DTOs/enums are values used by this owner, not independent systems.

Exact source line (source: `Source/QuartzUIRuntime/Public/QuartzUILayerStack.h#L38`)

## FQuartzUILayerCloseRequestNative

**Public delegate.** Layer Close Request Native: callback signature for per-player ordered layer policy, retained views and back dismissal.

**Prerequisites / integration:** Exact local player and configured app; Slate/UMG dependencies for native presentation work. Use the [QuartzUILayerStack recipe](https://betterbuilt.games/docs/quartz-ui/inventory#quartzuilayerstack) in the host module `QuartzUIRuntime`.

**Minimal example / lifecycle:** RegisterLayer with FQuartzUILayerDefinition; PushView; PopView. Close may defer for exit animation; covered views remain retained.

**Avoid:** Mutating another player's stack or forgetting close after nonclosing pop. Match the exact declaration below; dependent DTOs/enums are values used by this owner, not independent systems.

Exact source line (source: `Source/QuartzUIRuntime/Public/QuartzUILayerStack.h#L69`)

## FQuartzUILayerEntry

**Internal type.** Layer Entry: a declared type in per-player ordered layer policy, retained views and back dismissal; use its exact fields/operations below.

**Prerequisites / integration:** Exact local player and configured app; Slate/UMG dependencies for native presentation work. Use the [QuartzUILayerStack recipe](https://betterbuilt.games/docs/quartz-ui/inventory#quartzuilayerstack) in the host module `QuartzUIRuntime`.

**Minimal example / lifecycle:** RegisterLayer with FQuartzUILayerDefinition; PushView; PopView. Close may defer for exit animation; covered views remain retained.

**Avoid:** Mutating another player's stack or forgetting close after nonclosing pop. This named helper is runtime-owned; inspect/use it through the owner above rather than constructing it in gameplay.

Exact source line (source: `Source/QuartzUIRuntime/Public/QuartzUILayerStack.h#L77`)

## UQuartzUILayerStack

**Public type.** One ordered UI-layer registry for exactly one local player.

**Prerequisites / integration:** Exact local player and configured app; Slate/UMG dependencies for native presentation work. Use the [QuartzUILayerStack recipe](https://betterbuilt.games/docs/quartz-ui/inventory#quartzuilayerstack) in the host module `QuartzUIRuntime`.

**Minimal example / lifecycle:** RegisterLayer with FQuartzUILayerDefinition; PushView; PopView. Close may defer for exit animation; covered views remain retained.

**Avoid:** Mutating another player's stack or forgetting close after nonclosing pop. Match the exact declaration below; dependent DTOs/enums are values used by this owner, not independent systems.

Exact source line (source: `Source/QuartzUIRuntime/Public/QuartzUILayerStack.h#L90`)

## Complete header

Source snapshot, not an additional example. Unreal annotations distinguish exposed Blueprint nodes from native-only/private methods.

```cpp
#pragma once

#include "CoreMinimal.h"
#include "UObject/Object.h"
#include "QuartzUIInput.h"

#include "QuartzUILayerStack.generated.h"

class ULocalPlayer;
class UQuartzUISubsystem;
class UQuartzUIView;

DECLARE_MULTICAST_DELEGATE(FQuartzUILayerStackChangedNative);

/** Bounded native composition animation; web content remains free to animate independently. */
USTRUCT(BlueprintType)
struct QUARTZUIRUNTIME_API FQuartzUILayerTransitionDefinition
{
	GENERATED_BODY()

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "QuartzUI|Layers", meta = (ClampMin = "0.0", ClampMax = "2.0"))
	float EnterDurationSeconds = 0.0f;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "QuartzUI|Layers", meta = (ClampMin = "0.0", ClampMax = "2.0"))
	float ExitDurationSeconds = 0.0f;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "QuartzUI|Layers", meta = (ClampMin = "0.5", ClampMax = "1.5"))
	float EnterScale = 1.0f;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "QuartzUI|Layers", meta = (ClampMin = "0.5", ClampMax = "1.5"))
	float ExitScale = 1.0f;

	bool IsValid() const;
};

/** Host-independent layer policy; later adapters may map IDs to CommonUI gameplay tags. */
USTRUCT(BlueprintType)
struct QUARTZUIRUNTIME_API FQuartzUILayerDefinition
{
	GENERATED_BODY()

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "QuartzUI|Layers")
	FName LayerId;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "QuartzUI|Layers")
	int32 ZOrder = 0;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "QuartzUI|Layers")
	bool bReceivesInput = false;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "QuartzUI|Layers")
	bool bModal = false;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "QuartzUI|Layers")
	bool bDismissTopOnBack = false;

	/** CommonUI-style input/cursor policy activated with this layer. */
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "QuartzUI|Layers")
	FQuartzUIInputConfig InputConfig;

	/** When true, routed gamepad navigation does not continue into gameplay. */
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "QuartzUI|Layers")
	bool bConsumeNavigationInput = true;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "QuartzUI|Layers")
	FQuartzUILayerTransitionDefinition Transition;
};

DECLARE_DELEGATE_RetVal_ThreeParams(
	bool,
	FQuartzUILayerCloseRequestNative,
	UQuartzUIView*,
	const FQuartzUILayerDefinition&,
	bool /* bWasVisible */);

USTRUCT()
struct FQuartzUILayerEntry
{
	GENERATED_BODY()

	UPROPERTY(Transient)
	FQuartzUILayerDefinition Definition;

	UPROPERTY(Transient)
	TArray<TObjectPtr<UQuartzUIView>> Views;
};

/** One ordered UI-layer registry for exactly one local player. */
UCLASS(BlueprintType)
class QUARTZUIRUNTIME_API UQuartzUILayerStack final : public UObject
{
	GENERATED_BODY()

public:
	UFUNCTION(BlueprintPure, Category = "QuartzUI|Layers")
	ULocalPlayer* GetOwningLocalPlayer() const { return OwningLocalPlayer; }

	UFUNCTION(BlueprintCallable, Category = "QuartzUI|Layers")
	bool RegisterLayer(const FQuartzUILayerDefinition& Definition);

	UFUNCTION(BlueprintPure, Category = "QuartzUI|Layers")
	bool HasLayer(FName LayerId) const;

	UFUNCTION(BlueprintPure, Category = "QuartzUI|Layers")
	bool GetLayerDefinition(FName LayerId, FQuartzUILayerDefinition& OutDefinition) const;

	UFUNCTION(BlueprintPure, Category = "QuartzUI|Layers")
	bool GetLayerDefinitionForView(UQuartzUIView* View, FQuartzUILayerDefinition& OutDefinition) const;

	/**
	 * Updates only the validated input ownership fields of an existing layer.
	 * The retained views and their browser documents are never moved or recreated.
	 */
	UFUNCTION(BlueprintCallable, Category = "QuartzUI|Layers")
	bool SetLayerInputConfig(
		FName LayerId,
		const FQuartzUIInputConfig& InputConfig,
		bool bReceivesInput);

	UFUNCTION(BlueprintCallable, Category = "QuartzUI|Layers")
	bool PushView(FName LayerId, UQuartzUIView* View);

	UFUNCTION(BlueprintCallable, Category = "QuartzUI|Layers")
	UQuartzUIView* PopView(FName LayerId, bool bCloseView = true);

	UFUNCTION(BlueprintCallable, Category = "QuartzUI|Layers")
	bool RemoveView(UQuartzUIView* View, bool bCloseView = true);

	UFUNCTION(BlueprintPure, Category = "QuartzUI|Layers")
	UQuartzUIView* GetTopView(FName LayerId) const;

	UFUNCTION(BlueprintPure, Category = "QuartzUI|Layers")
	TArray<UQuartzUIView*> GetLayerViews(FName LayerId) const;

	/** Returns one top view per non-empty layer, ordered from lowest to highest Z. */
	UFUNCTION(BlueprintPure, Category = "QuartzUI|Layers")
	TArray<UQuartzUIView*> GetVisibleViews() const;

	/** Returns every retained view in render order, including covered views. */
	UFUNCTION(BlueprintPure, Category = "QuartzUI|Layers")
	TArray<UQuartzUIView*> GetPresentationViews() const;

	UFUNCTION(BlueprintPure, Category = "QuartzUI|Layers")
	bool IsViewVisible(const UQuartzUIView* View) const;

	UFUNCTION(BlueprintPure, Category = "QuartzUI|Layers")
	bool IsViewInteractive(const UQuartzUIView* View) const;

	UQuartzUIView* GetTopInteractiveView() const;

	EQuartzUIInputMode GetDesiredInputMode() const;

	FQuartzUIInputConfig GetDesiredInputConfig() const;

	bool ShouldConsumeNavigationInput() const;

	/** Pops the highest back-dismissible layer. Passive HUD layers are skipped. */
	UFUNCTION(BlueprintCallable, Category = "QuartzUI|Layers")
	bool HandleBack();

	UFUNCTION(BlueprintPure, Category = "QuartzUI|Layers")
	int32 GetViewCount() const;

	/** True while the presentation host retains a removed view for its exit animation. */
	bool IsCloseDeferred(const UQuartzUIView* View) const;

	static FName GetDefaultHudLayerId();

	static FName GetDefaultMenuLayerId();

	static FName GetDefaultModalLayerId();

	/** Native presentation hosts subscribe here; logical policy remains UMG-independent. */
	FQuartzUILayerStackChangedNative& OnStackChanged() { return StackChanged; }

	/** Exactly one visual host may coordinate deferred closes for a player stack. */
	bool ClaimPresentationHost(UObject* Owner, FQuartzUILayerCloseRequestNative CloseRequest);
	void ReleasePresentationHost(UObject* Owner);
	bool CompleteDeferredClose(UObject* Owner, UQuartzUIView* View);

private:
	friend class UQuartzUISubsystem;

	void Initialize(UQuartzUISubsystem* InSubsystem, ULocalPlayer* InOwningLocalPlayer);
	void Shutdown();
	void ResetViews();
	FQuartzUILayerEntry* FindLayer(FName LayerId);
	const FQuartzUILayerEntry* FindLayer(FName LayerId) const;
	bool RequestDeferredClose(UQuartzUIView* View, const FQuartzUILayerDefinition& Definition, bool bWasVisible);
	void CancelDeferredClose(UQuartzUIView* View);
	void FlushDeferredCloses();
	void BroadcastStackChanged();

	UPROPERTY(Transient)
	TObjectPtr<ULocalPlayer> OwningLocalPlayer;

	UPROPERTY(Transient)
	TArray<FQuartzUILayerEntry> Layers;

	TWeakObjectPtr<UObject> PresentationHostOwner;
	FQuartzUILayerCloseRequestNative PresentationCloseRequest;
	TSet<TWeakObjectPtr<UQuartzUIView>> DeferredCloseViews;

	FQuartzUILayerStackChangedNative StackChanged;
};
```

Canonical HTML: https://betterbuilt.games/docs/quartz-ui/reference-quartzuilayerstack
