UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
InteractiveTool.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "Containers/Array.h"
6#include "Containers/Map.h"
8#include "CoreMinimal.h"
10#include "HAL/Platform.h"
11#include "InputBehaviorSet.h"
15#include "Misc/Optional.h"
16#include "Shader.h"
17#include "Templates/EnableIf.h"
18#include "Templates/Function.h"
19#include "Templates/Models.h"
20#include "Templates/UniquePtr.h"
23#include "UObject/Class.h"
24#include "UObject/Object.h"
26#include "UObject/ObjectPtr.h"
27#include "UObject/Package.h"
29
30#include "InteractiveTool.generated.h"
31
32class FCanvas;
34class FProperty;
36class UInputBehavior;
40struct FSlateBrush;
41
43UENUM(BlueprintType)
45{
47 Completed = 0,
49 Accept = 1,
51 Cancel = 2
52};
53
56{
58 Unspecified = 0,
60 SwitchTool = 1
61};
62
75
76
78{
79public:
80 //
81 // Property watching infrastructure
82 //
84 {
85 public:
86 virtual ~FPropertyWatcher() = default;
87 virtual void CheckAndUpdate() = 0;
88 virtual void SilentUpdate() = 0;
89 };
90
91 template <typename PropType>
93 {
94 public:
97 using FNotEqualTestFunction = TFunction<bool(const PropType&, const PropType&)>; // Define "!=" for PropType
98
104 {
105 template <typename T>
106 auto Requires(bool& Result, const T& A, const T& B) -> decltype(
107 Result = A != B
108 );
109 };
110
111 // If PropType is CInequalityComparable, allow the two-argument constructor and default to using the type's
112 // existing != operator.
113 // If PropType is not CInequalityComparable, the caller must use the three-argument constructor to provide a
114 // "not equal" function.
115
116 // Two-argument constructor, enabled only if PropType is CInequalityComparable
117 template<typename Q = PropType, typename = typename TEnableIf<TModels_V<CInequalityComparable, Q>>::Type>
120 : Cached(),
121 GetValue([&Property]() {return Property; }),
122 OnChanged(MoveTemp(OnChangedIn)),
123 NotEqual([](const PropType& A, const PropType& B) { return A != B; })
124 {}
125
126 // Two-argument constructor, enabled only if PropType is CInequalityComparable
127 template<typename Q = PropType, typename = typename TEnableIf<TModels_V<CInequalityComparable, Q>>::Type>
130 : Cached(),
131 GetValue(MoveTemp(GetValueIn)),
132 OnChanged(MoveTemp(OnChangedIn)),
133 NotEqual([](const PropType& A, const PropType& B) { return A != B; })
134 {}
135
139 : Cached(),
140 GetValue([&Property]() {return Property; }),
141 OnChanged(MoveTemp(OnChangedIn)),
142 NotEqual(MoveTemp(NotEqualIn))
143 {}
144
153
154 void CheckAndUpdate() final
155 {
156 PropType Value = GetValue();
157 if ((!Cached.IsSet()) || NotEqual(Cached.GetValue(), Value))
158 {
159 Cached = Value;
160 OnChanged(Cached.GetValue());
161 }
162 }
163
164 void SilentUpdate() final
165 {
166 Cached = GetValue();
167 }
168
169 private:
170 TOptional<PropType> Cached;
171 FValueGetter GetValue;
172 FChangedCallback OnChanged;
173 FNotEqualTestFunction NotEqual;
174 };
175
179
181 {
182 for ( auto& PropWatcher : PropertyWatchers )
183 {
184 PropWatcher->CheckAndUpdate();
185 }
186 }
188 {
189 for ( auto& PropWatcher : PropertyWatchers )
190 {
191 PropWatcher->SilentUpdate();
192 }
193 }
200 {
201 check(i >= 0 && i < PropertyWatchers.Num());
202 PropertyWatchers[i]->SilentUpdate();
203 }
204
206 template <typename PropType>
213 template <typename PropType>
219
221 template <typename PropType>
229 template <typename PropType>
236
237private:
238 TArray<TUniquePtr<FPropertyWatcher>> PropertyWatchers;
239};
240
243
244
255UCLASS(Transient, MinimalAPI)
257{
259
260public:
263 {
264 return OnModified;
265 }
266
269 {
270 return bIsPropertySetEnabled;
271 }
272
273 //
274 // Setting saving/serialization
275 //
299 INTERACTIVETOOLSFRAMEWORK_API virtual void SaveProperties(UInteractiveTool* SaveFromTool, const FString& CacheIdentifier = TEXT(""));
300
305 INTERACTIVETOOLSFRAMEWORK_API virtual void RestoreProperties(UInteractiveTool* RestoreToTool, const FString& CacheIdentifier = TEXT(""));
306
307protected:
308 // Utility func used to implement the default Save/RestoreProperties funcs
309 INTERACTIVETOOLSFRAMEWORK_API virtual void SaveRestoreProperties(UInteractiveTool* RestoreToTool, const FString& CacheIdentifier, bool bSaving);
310
318
319public:
320#if WITH_EDITOR
326 INTERACTIVETOOLSFRAMEWORK_API virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent);
327#endif
328
329protected:
330 UPROPERTY(Transient, DuplicateTransient, NonTransactional, SkipSerialization)
331 TMap<FString, TObjectPtr<UInteractiveToolPropertySet>> CachedPropertiesMap;
332
333 // Controls whether a property set is shown in the UI. Transient so that disabling a PropertySet in one tool doesn't disable it in others.
334 UPROPERTY(Transient, DuplicateTransient, SkipSerialization, meta=(TransientToolProperty))
335 bool bIsPropertySetEnabled = true;
336
337 friend class UInteractiveTool; // so that tool can enable/disable
338
340};
341
342
362UCLASS(Transient, MinimalAPI)
364{
366
367public:
369
373 INTERACTIVETOOLSFRAMEWORK_API virtual void Setup();
374
380
386
393
398 INTERACTIVETOOLSFRAMEWORK_API virtual void Tick(float DeltaTime) final;
399
403 INTERACTIVETOOLSFRAMEWORK_API virtual UInteractiveToolManager* GetToolManager() const;
404
405
409 INTERACTIVETOOLSFRAMEWORK_API virtual bool HasCancel() const;
410
414 INTERACTIVETOOLSFRAMEWORK_API virtual bool HasAccept() const;
415
419 INTERACTIVETOOLSFRAMEWORK_API virtual bool CanAccept() const;
420
421
422
423 //
424 // Input Behaviors support
425 //
426
433 INTERACTIVETOOLSFRAMEWORK_API virtual void AddInputBehavior(UInputBehavior* Behavior, void* Source = nullptr);
434
441 INTERACTIVETOOLSFRAMEWORK_API virtual void RemoveInputBehaviorsBySource(void* Source);
442
446 INTERACTIVETOOLSFRAMEWORK_API virtual const UInputBehaviorSet* GetInputBehaviors() const;
447
448
449 //
450 // Property support
451 //
452
456 INTERACTIVETOOLSFRAMEWORK_API virtual TArray<UObject*> GetToolProperties(bool bEnabledOnly = true) const;
457
463
475
484
485
486protected:
487
489 UPROPERTY(Transient, DuplicateTransient, NonTransactional, SkipSerialization)
491
493 UPROPERTY(Transient, DuplicateTransient, NonTransactional, SkipSerialization)
494 TArray<TObjectPtr<UObject>> ToolPropertyObjects;
495
500 INTERACTIVETOOLSFRAMEWORK_API virtual void AddToolPropertySource(UObject* PropertyObject);
501
507
514
523
530 INTERACTIVETOOLSFRAMEWORK_API virtual bool SetToolPropertySourceEnabled(UInteractiveToolPropertySet* PropertySet, bool bEnabled);
531
538 INTERACTIVETOOLSFRAMEWORK_API virtual void NotifyOfPropertyChangeByTool(UInteractiveToolPropertySet* PropertySet) const;
539
541 {
543 EmptyForbidden
544 };
545
553 INTERACTIVETOOLSFRAMEWORK_API virtual void UpdateAcceptWarnings(EAcceptWarning Warning);
554
555private:
556 // Tracks whether the UpdateAcceptWarnings function showed a warning the last time it was called.
557 // Used to avoid clearing the tool display message in cases where it was not set by this function.
558 bool bLastShowedAcceptWarning = false;
559
560
561
562protected:
567 virtual void OnTick(float DeltaTime){};
568
569
570
571 //
572 // Action support/system
573 //
574 // Your Tool subclass can register a set of "Actions" it can execute
575 // by overloading RegisterActions(). Then external systems can use GetActionSet() to
576 // find out what Actions your Tool supports, and ExecuteAction() to run those actions.
577 //
578public:
584
589 INTERACTIVETOOLSFRAMEWORK_API virtual void ExecuteAction(int32 ActionID);
590
591
592protected:
599
600
601private:
606 FInteractiveToolActionSet* ToolActionSet = nullptr;
607
608
609
610 //
611 // Tool Information (name, icon, help text, etc)
612 //
613
614
615public:
620 {
621 return DefaultToolInfo;
622 }
623
628 {
629 DefaultToolInfo = NewInfo;
630 }
631
635 virtual void SetToolDisplayName(const FText& NewName)
636 {
637 DefaultToolInfo.ToolDisplayName = NewName;
638 }
639
644 {
645 DefaultToolInfo.ToolDisplayMessage = NewDisplayMessage;
646 }
647
651 virtual void SetToolIcon(const FSlateBrush* NewIcon)
652 {
653 DefaultToolInfo.ToolIcon = NewIcon;
654 }
655
656private:
660 FInteractiveToolInfo DefaultToolInfo;
661
662
663
664private:
665
666 // InteractionMechanic needs to be able to talk to Tool internals, eg property sets, behaviors, etc
668};
669
670
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define check(expr)
Definition AssertionMacros.h:314
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define DECLARE_MULTICAST_DELEGATE_TwoParams(DelegateName, Param1Type, Param2Type)
Definition DelegateCombinations.h:58
return true
Definition ExternalRpcRegistry.cpp:601
EToolShutdownType
Definition InteractiveTool.h:45
EToolShutdownReason
Definition InteractiveTool.h:56
const bool
Definition NetworkReplayStreaming.h:178
#define UPROPERTY(...)
UObject definition macros.
Definition ObjectMacros.h:744
#define GENERATED_BODY(...)
Definition ObjectMacros.h:765
#define UCLASS(...)
Definition ObjectMacros.h:776
#define UENUM(...)
Definition ObjectMacros.h:749
UE_FORCEINLINE_HINT TUniquePtr< T > MakeUnique(TArgs &&... Args)
Definition UniquePtr.h:918
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
uint8_t uint8
Definition binka_ue_file_header.h:8
Definition CanvasTypes.h:211
Definition InteractiveToolActionSet.h:91
Definition UnrealType.h:174
Definition Text.h:385
static CORE_API const FText & GetEmpty()
Definition Text.cpp:252
Definition InteractiveTool.h:84
Definition InteractiveTool.h:93
TFunction< bool(const PropType &, const PropType &)> FNotEqualTestFunction
Definition InteractiveTool.h:97
TFunction< PropType(void)> FValueGetter
Definition InteractiveTool.h:95
void CheckAndUpdate() final
Definition InteractiveTool.h:154
TPropertyWatcher(const PropType &Property, FChangedCallback OnChangedIn)
Definition InteractiveTool.h:118
TFunction< void(const PropType &)> FChangedCallback
Definition InteractiveTool.h:96
void SilentUpdate() final
Definition InteractiveTool.h:164
TPropertyWatcher(const PropType &Property, FChangedCallback OnChangedIn, FNotEqualTestFunction NotEqualIn)
Definition InteractiveTool.h:136
TPropertyWatcher(FValueGetter GetValueIn, FChangedCallback OnChangedIn, FNotEqualTestFunction NotEqualIn)
Definition InteractiveTool.h:145
TPropertyWatcher(FValueGetter GetValueIn, FChangedCallback OnChangedIn)
Definition InteractiveTool.h:128
Definition InteractiveTool.h:78
int32 WatchProperty(typename TPropertyWatcher< PropType >::FValueGetter GetValueIn, typename TPropertyWatcher< PropType >::FChangedCallback OnChangedIn)
Definition InteractiveTool.h:214
FWatchablePropertySet & operator=(const FWatchablePropertySet &)=delete
int32 WatchProperty(typename TPropertyWatcher< PropType >::FValueGetter GetValueIn, typename TPropertyWatcher< PropType >::FChangedCallback OnChangedIn, typename TPropertyWatcher< PropType >::FNotEqualTestFunction NotEqualsIn)
Definition InteractiveTool.h:230
int32 WatchProperty(const PropType &ValueIn, typename TPropertyWatcher< PropType >::FChangedCallback OnChangedIn)
Definition InteractiveTool.h:207
int32 WatchProperty(const PropType &ValueIn, typename TPropertyWatcher< PropType >::FChangedCallback OnChangedIn, typename TPropertyWatcher< PropType >::FNotEqualTestFunction NotEqualsIn)
Definition InteractiveTool.h:222
FWatchablePropertySet(const FWatchablePropertySet &)=delete
void CheckAndUpdateWatched()
Definition InteractiveTool.h:180
void SilentUpdateWatcherAtIndex(int32 i)
Definition InteractiveTool.h:199
FWatchablePropertySet()=default
void SilentUpdateWatched()
Definition InteractiveTool.h:187
Definition InputBehaviorSet.h:177
Definition ToolContextInterfaces.h:427
Definition Array.h:670
Definition UnrealString.h.inl:34
Definition InputBehaviorSet.h:59
Definition InputBehavior.h:249
Definition InteractionMechanic.h:30
Definition InteractiveToolManager.h:79
Definition InteractiveTool.h:257
FInteractiveToolPropertySetModifiedSignature & GetOnModified()
Definition InteractiveTool.h:262
bool IsPropertySetEnabled() const
Definition InteractiveTool.h:268
Definition InteractiveTool.h:364
virtual void SetToolIcon(const FSlateBrush *NewIcon)
Definition InteractiveTool.h:651
virtual void SetToolInfo(const FInteractiveToolInfo &NewInfo)
Definition InteractiveTool.h:627
EAcceptWarning
Definition InteractiveTool.h:541
@ NoWarning
Definition InteractiveTool.h:542
DECLARE_MULTICAST_DELEGATE(OnInteractiveToolPropertySetsModified)
virtual void OnPropertyModified(UObject *PropertySet, FProperty *Property)
Definition InteractiveTool.h:481
virtual FInteractiveToolInfo GetToolInfo() const
Definition InteractiveTool.h:619
virtual void OnTick(float DeltaTime)
Definition InteractiveTool.h:567
OnInteractiveToolPropertySetsModified OnPropertySetsModified
Definition InteractiveTool.h:462
OnInteractiveToolPropertyInternallyModified OnPropertyModifiedDirectlyByTool
Definition InteractiveTool.h:474
DECLARE_MULTICAST_DELEGATE_OneParam(OnInteractiveToolPropertyInternallyModified, UObject *)
virtual void SetToolDisplayName(const FText &NewName)
Definition InteractiveTool.h:635
virtual void SetToolDisplayMessage(const FText &NewDisplayMessage)
Definition InteractiveTool.h:643
Definition Object.h:95
Definition InteractiveTool.h:67
const FSlateBrush * ToolIcon
Definition InteractiveTool.h:73
FText ToolDisplayName
Definition InteractiveTool.h:69
FText ToolDisplayMessage
Definition InteractiveTool.h:71
Definition UnrealType.h:6865
Definition SlateBrush.h:239
auto Requires(bool &Result, const T &A, const T &B) -> decltype(Result=A !=B)
Definition ObjectPtr.h:488
Definition Optional.h:131
constexpr OptionalType & GetValue()
Definition Optional.h:443
constexpr bool IsSet() const
Definition Optional.h:69