Skip to content

Commit 99d7a91

Browse files
committed
MultiLineEditableTextBox added which is needed to implement ConsoleWindow in JS
1 parent 40dd8e3 commit 99d7a91

File tree

4 files changed

+168
-0
lines changed

4 files changed

+168
-0
lines changed
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
#include "JavascriptUMG.h"
2+
#include "JavascriptMultiLineEditableTextBox.h"
3+
#include "BaseTextLayoutMarshaller.h"
4+
5+
struct FJavascriptTextLayoutMarshaller : FBaseTextLayoutMarshaller
6+
{
7+
FJavascriptTextLayoutMarshaller(UJavascriptMultiLineEditableTextBox* InParent)
8+
: Parent(InParent)
9+
{}
10+
11+
UJavascriptMultiLineEditableTextBox* Parent;
12+
13+
virtual void SetText(const FString& SourceString, FTextLayout& TargetTextLayout) override
14+
{
15+
FJavascriptTextLayout layout;
16+
layout.TextLayout = TargetTextLayout.AsShared();
17+
18+
Parent->SetTextDelegate.ExecuteIfBound(SourceString, layout);
19+
}
20+
21+
virtual void GetText(FString& TargetString, const FTextLayout& SourceTextLayout) override
22+
{
23+
FJavascriptTextLayout layout;
24+
layout.ConstTextLayout = SourceTextLayout.AsShared();
25+
26+
if (Parent->GetTextDelegate.IsBound())
27+
{
28+
TargetString = Parent->GetTextDelegate.Execute(layout);
29+
}
30+
}
31+
};
32+
33+
TSharedRef<SWidget> UJavascriptMultiLineEditableTextBox::RebuildWidget()
34+
{
35+
auto Marshaller = MakeShareable(new FJavascriptTextLayoutMarshaller(this));
36+
MyEditableTextBlock = SNew(SMultiLineEditableTextBox)
37+
.Style(&WidgetStyle)
38+
.TextStyle(&TextStyle)
39+
.Justification(Justification)
40+
.AutoWrapText(bAutoWrapText)
41+
.WrapTextAt(WrapTextAt)
42+
.Marshaller(Marshaller)
43+
.IsReadOnly(bIsReadOnly)
44+
.AlwaysShowScrollbars(bAlwaysShowScrollbars)
45+
// .MinDesiredWidth(MinimumDesiredWidth)
46+
// .Padding(Padding)
47+
// .IsCaretMovedWhenGainFocus(IsCaretMovedWhenGainFocus)
48+
// .SelectAllTextWhenFocused(SelectAllTextWhenFocused)
49+
// .RevertTextOnEscape(RevertTextOnEscape)
50+
// .ClearKeyboardFocusOnCommit(ClearKeyboardFocusOnCommit)
51+
// .SelectAllTextOnCommit(SelectAllTextOnCommit)
52+
.OnVScrollBarUserScrolled_Lambda([&](float Offset) { OnVScrollBarUserScrolled.Broadcast(Offset); })
53+
.OnTextChanged(BIND_UOBJECT_DELEGATE(FOnTextChanged, HandleOnTextChanged))
54+
.OnTextCommitted(BIND_UOBJECT_DELEGATE(FOnTextCommitted, HandleOnTextCommitted))
55+
;
56+
57+
return MyEditableTextBlock.ToSharedRef();
58+
}
59+
60+
void UJavascriptMultiLineEditableTextBox::ScrollTo(int32 Line, int32 Offset)
61+
{
62+
if (MyEditableTextBlock.IsValid())
63+
{
64+
MyEditableTextBlock->ScrollTo(FTextLocation(Line, Offset));
65+
}
66+
}
67+
68+
void UJavascriptMultiLineEditableTextBox::GoTo(int32 Line, int32 Offset)
69+
{
70+
if (MyEditableTextBlock.IsValid())
71+
{
72+
MyEditableTextBlock->GoTo(FTextLocation(Line, Offset));
73+
}
74+
}
75+
76+
void UJavascriptMultiLineEditableTextBox::Refresh()
77+
{
78+
if (MyEditableTextBlock.IsValid())
79+
{
80+
MyEditableTextBlock->Refresh();
81+
}
82+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
#pragma once
2+
3+
#include "MultiLineEditableTextBox.h"
4+
#include "JavascriptMultiLineEditableTextBox.generated.h"
5+
6+
USTRUCT()
7+
struct FJavascriptTextLayout
8+
{
9+
GENERATED_BODY()
10+
11+
TSharedPtr<FTextLayout> TextLayout;
12+
TSharedPtr<FTextLayout const> ConstTextLayout;
13+
};
14+
15+
/**
16+
*
17+
*/
18+
UCLASS()
19+
class JAVASCRIPTUMG_API UJavascriptMultiLineEditableTextBox : public UMultiLineEditableTextBox
20+
{
21+
GENERATED_BODY()
22+
23+
public:
24+
DECLARE_DYNAMIC_DELEGATE_RetVal_OneParam(FString, FGetText, const FJavascriptTextLayout&, TextLayout);
25+
DECLARE_DYNAMIC_DELEGATE_TwoParams(FSetText, FString, InText, const FJavascriptTextLayout&, TextLayout);
26+
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnVScrollBarUserScrolled, float, Offset);
27+
28+
/** Called whenever the text is committed. This happens when the user presses enter or the text box loses focus. */
29+
UPROPERTY(BlueprintAssignable, Category = "Widget Event")
30+
FOnVScrollBarUserScrolled OnVScrollBarUserScrolled;
31+
32+
UPROPERTY()
33+
FGetText GetTextDelegate;
34+
35+
UPROPERTY()
36+
FSetText SetTextDelegate;
37+
38+
UPROPERTY()
39+
bool bIsReadOnly;
40+
41+
UPROPERTY()
42+
bool bAlwaysShowScrollbars;
43+
44+
virtual TSharedRef<SWidget> RebuildWidget() override;
45+
46+
UFUNCTION(BlueprintCallable, Category = "Scripting | Javascript")
47+
void ScrollTo(int32 Line, int32 Offset);
48+
49+
UFUNCTION(BlueprintCallable, Category = "Scripting | Javascript")
50+
void GoTo(int32 Line, int32 Offset);
51+
52+
UFUNCTION(BlueprintCallable, Category = "Scripting | Javascript")
53+
void Refresh();
54+
};

Plugins/UnrealJS/Source/JavascriptUMG/JavascriptUMGBlueprintLibrary.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,26 @@ void UJavascriptUMGBlueprintLibrary::DrawSpaceSpline(UPARAM(ref) FPaintContext&
2828
InThickness * Transform.GetScale(),
2929
ESlateDrawEffect::None,
3030
InTint);
31+
}
32+
33+
FString UJavascriptUMGBlueprintLibrary::GetAsText(UPARAM(ref) const FJavascriptTextLayout& TextLayout)
34+
{
35+
FString String;
36+
TextLayout.ConstTextLayout->GetAsText(String);
37+
return String;
38+
}
39+
40+
void UJavascriptUMGBlueprintLibrary::ClearLines(UPARAM(ref) FJavascriptTextLayout& TextLayout)
41+
{
42+
TextLayout.TextLayout->ClearLines();
43+
}
44+
45+
void UJavascriptUMGBlueprintLibrary::AddLine(UPARAM(ref) FJavascriptTextLayout& TextLayout, const FString& String, const FTextBlockStyle& MessageTextStyle)
46+
{
47+
TSharedRef<FString> LineText(new FString(String));
48+
49+
TArray<TSharedRef<IRun>> Runs;
50+
Runs.Add(FSlateTextRun::Create(FRunInfo(), LineText, MessageTextStyle));
51+
52+
TextLayout.TextLayout->AddLine(LineText, Runs);
3153
}

Plugins/UnrealJS/Source/JavascriptUMG/JavascriptUMGBlueprintLibrary.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#pragma once
22

3+
#include "JavascriptMultiLineEditableTextBox.h"
34
#include "JavascriptUMGBlueprintLibrary.generated.h"
45

56
/**
@@ -19,4 +20,13 @@ class JAVASCRIPTUMG_API UJavascriptUMGBlueprintLibrary : public UBlueprintFuncti
1920

2021
UFUNCTION(BlueprintCallable, Category = "Painting")
2122
static void DrawSpaceSpline(UPARAM(ref) FPaintContext& Context, FVector2D InStart, FVector2D InStartDir, FVector2D InEnd, FVector2D InEndDir, float InThickness, FLinearColor InTint);
23+
24+
UFUNCTION(BlueprintCallable, Category = "Scripting | Javascript")
25+
static FString GetAsText(UPARAM(ref) const FJavascriptTextLayout& TextLayout);
26+
27+
UFUNCTION(BlueprintCallable, Category = "Scripting | Javascript")
28+
static void ClearLines(UPARAM(ref) FJavascriptTextLayout& TextLayout);
29+
30+
UFUNCTION(BlueprintCallable, Category = "Scripting | Javascript")
31+
static void AddLine(UPARAM(ref) FJavascriptTextLayout& TextLayout, const FString& String, const FTextBlockStyle& TextBlockStyle);
2232
};

0 commit comments

Comments
 (0)