A Demo Project for the UnrealEngineSDK
Loading...
Searching...
No Matches
DialogueGraphNode_Details.cpp
Go to the documentation of this file.
1// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.
3
4#include "DetailCategoryBuilder.h"
5#include "DetailLayoutBuilder.h"
6
7#include "Nodes/DlgNode.h"
16#include "Widgets/Input/SButton.h"
17
18#define LOCTEXT_NAMESPACE "DialoguGraphNode_Details"
19
20void FDialogueGraphNode_Details::CustomizeDetails(IDetailLayoutBuilder& DetailBuilder)
21{
22 TArray<TWeakObjectPtr<UObject>> ObjectsBeingCustomized;
23 DetailBuilder.GetObjectsBeingCustomized(ObjectsBeingCustomized);
24
25 // Only support one object being customized
26 if (ObjectsBeingCustomized.Num() != 1)
27 {
28 return;
29 }
30
31 TWeakObjectPtr<UDialogueGraphNode> WeakGraphNode = Cast<UDialogueGraphNode>(ObjectsBeingCustomized[0].Get());
32 if (!WeakGraphNode.IsValid())
33 {
34 return;
35 }
36
37 GraphNode = WeakGraphNode.Get();
38 if (!IsValid(GraphNode))
39 {
40 return;
41 }
42
43 DetailLayoutBuilder = &DetailBuilder;
45 const UDlgNode& DialogueNode = GraphNode->GetDialogueNode();
46 const bool bIsRootNode = GraphNode->IsRootNode();
47 const bool bIsEndNode = GraphNode->IsEndNode();
48 const bool bIsSpeechNode = GraphNode->IsSpeechNode();
49 const bool bIsSelectorNode = GraphNode->IsSelectorNode();;
50 const bool bIsSpeechSequenceNode = GraphNode->IsSpeechSequenceNode();
51 const bool bIsVirtualParentNode = GraphNode->IsVirtualParentNode();
52
53 // Hide the existing category
54 DetailLayoutBuilder->HideCategory(UDialogueGraphNode::StaticClass()->GetFName());
55
56 // Fill with the properties of the DialogueNode
57 IDetailCategoryBuilder& BaseDataCategory = DetailLayoutBuilder->EditCategory(TEXT("Base Node"), FText::GetEmpty(), ECategoryPriority::Important);
58 BaseDataCategory.InitiallyCollapsed(false);
59 const TSharedPtr<IPropertyHandle> PropertyDialogueNode =
60 DetailLayoutBuilder->GetProperty(UDialogueGraphNode::GetMemberNameDialogueNode(), UDialogueGraphNode::StaticClass());
61
62 if (!bIsRootNode)
63 {
64 // NodeIndex
65 BaseDataCategory.AddProperty(UDialogueGraphNode::GetMemberNameNodeIndex(), UDialogueGraphNode::StaticClass());
66
67 // OwnerName
68 {
69 const TSharedPtr<IPropertyHandle> ParticipantNamePropertyHandle =
70 PropertyDialogueNode->GetChildHandle(UDlgNode::GetMemberNameOwnerName());
71 FDetailWidgetRow* DetailWidgetRow = &BaseDataCategory.AddCustomRow(LOCTEXT("ParticipantNameSearcKey", "Participant Name"));
72
73 ParticipantNamePropertyRow = MakeShared<FDialogueTextPropertyPickList_CustomRowHelper>(DetailWidgetRow, ParticipantNamePropertyHandle);
74 ParticipantNamePropertyRow->SetTextPropertyPickListWidget(
76 .AvailableSuggestions(this, &Self::GetAllDialoguesParticipantNames)
77 .OnTextCommitted(this, &Self::HandleParticipantTextCommitted)
78 .HasContextCheckbox(true)
79 .IsContextCheckBoxChecked(true)
80 .CurrentContextAvailableSuggestions(this, &Self::GetCurrentDialogueParticipantNames)
81 )
82 .Update();
83 }
84
85 // End Nodes can't have children
86 if (!bIsEndNode)
87 {
88 BaseDataCategory.AddProperty(PropertyDialogueNode->GetChildHandle(UDlgNode::GetMemberNameCheckChildrenOnEvaluation()));
89 }
90
91 BaseDataCategory.AddProperty(PropertyDialogueNode->GetChildHandle(UDlgNode::GetMemberNameEnterConditions()))
92 .ShouldAutoExpand(true);
93 BaseDataCategory.AddProperty(PropertyDialogueNode->GetChildHandle(UDlgNode::GetMemberNameEnterEvents()))
94 .ShouldAutoExpand(true);
95 }
96
97 // GUID
98 BaseDataCategory.AddProperty(PropertyDialogueNode->GetChildHandle(UDlgNode::GetMemberNameGUID()))
99 .ShouldAutoExpand(true);
100
101 if (!bIsEndNode)
102 {
103 ChildrenPropertyRow = &BaseDataCategory.AddProperty(
104 PropertyDialogueNode->GetChildHandle(UDlgNode::GetMemberNameChildren())
105 );
106 ChildrenPropertyRow->ShouldAutoExpand(true);
108 }
109
110
111 // Do nothing
112 if (bIsRootNode)
113 {
114 return;
115 }
116
117 // NOTE: be careful here with the child handle names that are common. For example 'Text' so that we do not get the child
118 // property from some inner properties
119 if (bIsSpeechNode)
120 {
121 IDetailCategoryBuilder& SpeechCategory = DetailLayoutBuilder->EditCategory(TEXT("Speech Node"));
122 SpeechCategory.InitiallyCollapsed(false);
123
124 // bIsVirtualParent
126 IsVirtualParentPropertyHandle->SetOnPropertyValueChanged(FSimpleDelegate::CreateSP(this, &Self::OnIsVirtualParentChanged));
127 SpeechCategory.AddProperty(IsVirtualParentPropertyHandle);
128
129 // bVirtualParentFireDirectChildEnterEvents
130 if (bIsVirtualParentNode)
131 {
132 SpeechCategory.AddProperty(PropertyDialogueNode->GetChildHandle(UDlgNode_Speech::GetMemberNameVirtualParentFireDirectChildEnterEvents()))
133 .ShouldAutoExpand(true);
134 }
135
136 // Text
137 {
138 TextPropertyHandle = PropertyDialogueNode->GetChildHandle(UDlgNode_Speech::GetMemberNameText());
139 FDetailWidgetRow* DetailWidgetRow = &SpeechCategory.AddCustomRow(LOCTEXT("TextSearchKey", "Text"));
140
141 TextPropertyRow = MakeShared<FDialogueMultiLineEditableTextBox_CustomRowHelper>(DetailWidgetRow, TextPropertyHandle);
142 TextPropertyRow->SetPropertyUtils(DetailBuilder.GetPropertyUtilities());
143 TextPropertyRow->Update();
144
145 TextPropertyRow->OnTextCommittedEvent().AddRaw(this, &Self::HandleTextCommitted);
146 TextPropertyRow->OnTextChangedEvent().AddRaw(this, &Self::HandleTextChanged);
147 }
148
149 // Text arguments
150 SpeechCategory.AddProperty(PropertyDialogueNode->GetChildHandle(UDlgNode_Speech::GetMemberNameTextArguments()))
151 .ShouldAutoExpand(true);
152
153 //
154 // Data
155 //
156
157 IDetailCategoryBuilder& SpeechDataCategory = DetailLayoutBuilder->EditCategory(TEXT("Speech Node Data"));
158 SpeechDataCategory.InitiallyCollapsed(false);
159
160 // Speaker State
161 {
162 const TSharedPtr<IPropertyHandle> SpeakerStatePropertyHandle =
163 PropertyDialogueNode->GetChildHandle(UDlgNode_Speech::GetMemberNameSpeakerState());
164
165 FDetailWidgetRow* DetailWidgetRow = &SpeechDataCategory.AddCustomRow(LOCTEXT("SpeakerStateSearchKey", "Speaker State"));
166
167 SpeakerStatePropertyRow = MakeShared<FDialogueTextPropertyPickList_CustomRowHelper>(DetailWidgetRow, SpeakerStatePropertyHandle);
168 SpeakerStatePropertyRow->SetTextPropertyPickListWidget(
170 .AvailableSuggestions(this, &Self::GetAllDialoguesSpeakerStates)
171 .OnTextCommitted(this, &Self::HandleSpeakerStateCommitted)
172 .HasContextCheckbox(false)
173 )
175 .Update();
176 }
177
178 // Node Data that can be anything set by the user
179 NodeDataPropertyRow = &SpeechDataCategory.AddProperty(
180 PropertyDialogueNode->GetChildHandle(UDlgNode_Speech::GetMemberNameNodeData())
181 );
183 NodeDataPropertyRow->ShouldAutoExpand(true);
184 NodeDataPropertyRow->ShowPropertyButtons(true);
185
186 // Add Custom buttons
187 NodeDataPropertyRow_CustomDisplay = MakeShared<FDialogueObject_CustomRowHelper>(NodeDataPropertyRow);
189
190 // SoundWave
191 VoiceSoundWavePropertyRow = &SpeechDataCategory.AddProperty(
192 PropertyDialogueNode->GetChildHandle(UDlgNode_Speech::GetMemberNameVoiceSoundWave())
193 );
195
196 // DialogueWave
197 VoiceDialogueWavePropertyRow = &SpeechDataCategory.AddProperty(
198 PropertyDialogueNode->GetChildHandle(UDlgNode_Speech::GetMemberNameVoiceDialogueWave())
199 );
201
202 // Generic Data, can be FMOD sound
203 GenericDataPropertyRow = &SpeechDataCategory.AddProperty(
204 PropertyDialogueNode->GetChildHandle(UDlgNode_Speech::GetMemberNameGenericData())
205 );
207 }
208 else if (bIsSelectorNode)
209 {
210 IDetailCategoryBuilder& SpeechDataCategory = DetailLayoutBuilder->EditCategory(TEXT("Selector Node"));
211 SpeechDataCategory.InitiallyCollapsed(false);
212 SpeechDataCategory.AddProperty(PropertyDialogueNode->GetChildHandle(UDlgNode_Selector::GetMemberNameSelectorType()));
213 }
214 else if (bIsSpeechSequenceNode)
215 {
216 IDetailCategoryBuilder& SpeechSequenceDataCategory = DetailLayoutBuilder->EditCategory(TEXT("Speech Sequence Node"));
217 SpeechSequenceDataCategory.InitiallyCollapsed(false)
218 .RestoreExpansionState(true);
219 SpeechSequenceDataCategory.AddProperty(PropertyDialogueNode->GetChildHandle(UDlgNode_SpeechSequence::GetMemberNameSpeechSequence()))
220 .ShouldAutoExpand(true);;
221 }
222}
223
224void FDialogueGraphNode_Details::HandleTextCommitted(const FText& InText, ETextCommit::Type CommitInfo)
225{
226 // Text arguments already handled in node post change properties
227}
228
230{
231 if (GraphNode)
232 {
233 GraphNode->GetMutableDialogueNode()->RebuildTextArgumentsFromPreview(InText);
234 }
235}
236
237
242
244
245#undef LOCTEXT_NAMESPACE
#define CREATE_VISIBILITY_CALLBACK_STATIC(_StaticMethod)
void HandleParticipantTextCommitted(const FText &InSearchText, ETextCommit::Type CommitInfo)
TArray< FName > GetAllDialoguesSpeakerStates() const
TArray< FName > GetCurrentDialogueParticipantNames() const
TSharedPtr< FDialogueTextPropertyPickList_CustomRowHelper > ParticipantNamePropertyRow
void HandleTextCommitted(const FText &InText, ETextCommit::Type CommitInfo)
IDetailPropertyRow * VoiceDialogueWavePropertyRow
IDetailLayoutBuilder * DetailLayoutBuilder
void CustomizeDetails(IDetailLayoutBuilder &DetailBuilder) override
TSharedPtr< FDialogueTextPropertyPickList_CustomRowHelper > SpeakerStatePropertyRow
IDetailPropertyRow * GenericDataPropertyRow
TArray< FName > GetAllDialoguesParticipantNames() const
IDetailPropertyRow * VoiceSoundWavePropertyRow
TSharedPtr< FDialogueObject_CustomRowHelper > NodeDataPropertyRow_CustomDisplay
void HandleTextChanged(const FText &InText)
TSharedPtr< FDialogueMultiLineEditableTextBox_CustomRowHelper > TextPropertyRow
TSharedPtr< IPropertyHandle > TextPropertyHandle
TSharedPtr< IPropertyHandle > IsVirtualParentPropertyHandle
void HandleSpeakerStateCommitted(const FText &InSearchText, ETextCommit::Type CommitInfo)
UDlgDialogue * GetDialogue() const
bool IsSelectorNode() const
static FName GetMemberNameDialogueNode()
DlgNodeType * GetMutableDialogueNode()
static FName GetMemberNameNodeIndex()
bool IsVirtualParentNode() const
const DlgNodeType & GetDialogueNode() const
virtual bool IsRootNode() const
bool IsSpeechSequenceNode() const
static FName GetMemberNameSelectorType()
static FName GetMemberNameIsVirtualParent()
static FName GetMemberNameVoiceDialogueWave()
static FName GetMemberNameNodeData()
static FName GetMemberNameVirtualParentFireDirectChildEnterEvents()
static FName GetMemberNameTextArguments()
static FName GetMemberNameSpeakerState()
static FName GetMemberNameText()
static FName GetMemberNameVoiceSoundWave()
static FName GetMemberNameGenericData()
UCLASS(BlueprintType, Abstract, EditInlineNew, ClassGroup = "Dialogue")
Definition DlgNode.h:40
static FName GetMemberNameCheckChildrenOnEvaluation()
Definition DlgNode.h:330
static FName GetMemberNameOwnerName()
Definition DlgNode.h:329
static FName GetMemberNameGUID()
Definition DlgNode.h:334
static FName GetMemberNameEnterConditions()
Definition DlgNode.h:331
static FName GetMemberNameEnterEvents()
Definition DlgNode.h:332
static FName GetMemberNameChildren()
Definition DlgNode.h:333
static EVisibility GetChildrenVisibility()
static EVisibility GetVoiceSoundWaveVisibility()
static EVisibility GetNodeGenericDataVisibility()
static EVisibility GetNodeDataVisibility()
static EVisibility GetVoiceDialogueWaveVisibility()
static EVisibility GetSpeakerStateNodeVisibility()