// Engine/Source/Runtime/WebBrowser/Private/SWebBrowser.cpp #include "SWebInterfaceBrowser.h" #include "Widgets/Text/STextBlock.h" #include "Widgets/Input/SEditableTextBox.h" #include "Widgets/Input/SButton.h" #include "Widgets/Images/SThrobber.h" #define LOCTEXT_NAMESPACE "WebInterfaceBrowser" SWebInterfaceBrowser::SWebInterfaceBrowser() { } SWebInterfaceBrowser::~SWebInterfaceBrowser() { } void SWebInterfaceBrowser::Construct(const FArguments& InArgs, const TSharedPtr& BrowserWindow) { OnLoadCompleted = InArgs._OnLoadCompleted; OnLoadError = InArgs._OnLoadError; OnLoadStarted = InArgs._OnLoadStarted; OnTitleChanged = InArgs._OnTitleChanged; OnUrlChanged = InArgs._OnUrlChanged; OnBeforeNavigation = InArgs._OnBeforeNavigation; OnLoadUrl = InArgs._OnLoadUrl; OnShowDialog = InArgs._OnShowDialog; OnDismissAllDialogs = InArgs._OnDismissAllDialogs; OnBeforePopup = InArgs._OnBeforePopup; OnConsoleMessage = InArgs._OnConsoleMessage; OnCreateWindow = InArgs._OnCreateWindow; OnCloseWindow = InArgs._OnCloseWindow; bShowInitialThrobber = InArgs._ShowInitialThrobber; ChildSlot [ SNew(SVerticalBox) +SVerticalBox::Slot() .AutoHeight() [ SNew(SHorizontalBox) .Visibility((InArgs._ShowControls || InArgs._ShowAddressBar) ? EVisibility::Visible : EVisibility::Collapsed) + SHorizontalBox::Slot() .Padding(0, 5) .AutoWidth() [ SNew(SHorizontalBox) .Visibility(InArgs._ShowControls ? EVisibility::Visible : EVisibility::Collapsed) +SHorizontalBox::Slot() .AutoWidth() [ SNew(SButton) .Text(LOCTEXT("Back","Back")) .IsEnabled(this, &SWebInterfaceBrowser::CanGoBack) .OnClicked(this, &SWebInterfaceBrowser::OnBackClicked) ] +SHorizontalBox::Slot() .AutoWidth() [ SNew(SButton) .Text(LOCTEXT("Forward", "Forward")) .IsEnabled(this, &SWebInterfaceBrowser::CanGoForward) .OnClicked(this, &SWebInterfaceBrowser::OnForwardClicked) ] +SHorizontalBox::Slot() .AutoWidth() [ SNew(SButton) .Text(this, &SWebInterfaceBrowser::GetReloadButtonText) .OnClicked(this, &SWebInterfaceBrowser::OnReloadClicked) ] +SHorizontalBox::Slot() .FillWidth(1.0f) .VAlign(VAlign_Center) .HAlign(HAlign_Right) .Padding(5) [ SNew(STextBlock) .Visibility(InArgs._ShowAddressBar ? EVisibility::Collapsed : EVisibility::Visible ) .Text(this, &SWebInterfaceBrowser::GetTitleText) .Justification(ETextJustify::Right) ] ] +SHorizontalBox::Slot() .VAlign(VAlign_Center) .HAlign(HAlign_Fill) .Padding(5.f, 5.f) [ // @todo: A proper addressbar widget should go here, for now we use a simple textbox. SAssignNew(InputText, SEditableTextBox) .Visibility(InArgs._ShowAddressBar ? EVisibility::Visible : EVisibility::Collapsed) .OnTextCommitted(this, &SWebInterfaceBrowser::OnUrlTextCommitted) .Text(this, &SWebInterfaceBrowser::GetAddressBarUrlText) .SelectAllTextWhenFocused(true) .ClearKeyboardFocusOnCommit(true) .RevertTextOnEscape(true) ] ] +SVerticalBox::Slot() [ SNew(SOverlay) + SOverlay::Slot() [ SAssignNew(BrowserView, SWebInterfaceBrowserView, BrowserWindow) .ParentWindow(InArgs._ParentWindow) .InitialURL(InArgs._InitialURL) .ContentsToLoad(InArgs._ContentsToLoad) .ShowErrorMessage(InArgs._ShowErrorMessage) .SupportsTransparency(InArgs._SupportsTransparency) .SupportsThumbMouseButtonNavigation(InArgs._SupportsThumbMouseButtonNavigation) .BackgroundColor(InArgs._BackgroundColor) .PopupMenuMethod(InArgs._PopupMenuMethod) .ViewportSize(InArgs._ViewportSize) .OnLoadCompleted(OnLoadCompleted) .OnLoadError(OnLoadError) .OnLoadStarted(OnLoadStarted) .OnTitleChanged(OnTitleChanged) .OnUrlChanged(OnUrlChanged) .OnBeforePopup(OnBeforePopup) .OnCreateWindow(OnCreateWindow) .OnCloseWindow(OnCloseWindow) .OnBeforeNavigation(OnBeforeNavigation) .OnLoadUrl(OnLoadUrl) .OnShowDialog(OnShowDialog) .OnDismissAllDialogs(OnDismissAllDialogs) .Visibility(this, &SWebInterfaceBrowser::GetViewportVisibility) .OnSuppressContextMenu(InArgs._OnSuppressContextMenu) .OnDragWindow(InArgs._OnDragWindow) .OnConsoleMessage(OnConsoleMessage) .BrowserFrameRate(InArgs._BrowserFrameRate) ] + SOverlay::Slot() .HAlign(HAlign_Center) .VAlign(VAlign_Center) [ SNew(SCircularThrobber) .Radius(10.0f) .ToolTipText(LOCTEXT("LoadingThrobberToolTip", "Loading page...")) .Visibility(this, &SWebInterfaceBrowser::GetLoadingThrobberVisibility) ] ] ]; } void SWebInterfaceBrowser::LoadURL(FString NewURL) { if (BrowserView.IsValid()) { BrowserView->LoadURL(NewURL); } } void SWebInterfaceBrowser::LoadString(FString Contents, FString DummyURL) { if (BrowserView.IsValid()) { BrowserView->LoadString(Contents, DummyURL); } } void SWebInterfaceBrowser::Reload() { if (BrowserView.IsValid()) { BrowserView->Reload(); } } void SWebInterfaceBrowser::StopLoad() { if (BrowserView.IsValid()) { BrowserView->StopLoad(); } } FText SWebInterfaceBrowser::GetTitleText() const { if (BrowserView.IsValid()) { return BrowserView->GetTitleText(); } return LOCTEXT("InvalidWindow", "Browser Window is not valid/supported"); } FString SWebInterfaceBrowser::GetUrl() const { if (BrowserView.IsValid()) { return BrowserView->GetUrl(); } return FString(); } FText SWebInterfaceBrowser::GetAddressBarUrlText() const { if(BrowserView.IsValid()) { return BrowserView->GetAddressBarUrlText(); } return FText::GetEmpty(); } bool SWebInterfaceBrowser::IsLoaded() const { if (BrowserView.IsValid()) { return BrowserView->IsLoaded(); } return false; } bool SWebInterfaceBrowser::IsLoading() const { if (BrowserView.IsValid()) { return BrowserView->IsLoading(); } return false; } bool SWebInterfaceBrowser::CanGoBack() const { if (BrowserView.IsValid()) { return BrowserView->CanGoBack(); } return false; } void SWebInterfaceBrowser::GoBack() { if (BrowserView.IsValid()) { BrowserView->GoBack(); } } FReply SWebInterfaceBrowser::OnBackClicked() { GoBack(); return FReply::Handled(); } bool SWebInterfaceBrowser::CanGoForward() const { if (BrowserView.IsValid()) { return BrowserView->CanGoForward(); } return false; } void SWebInterfaceBrowser::GoForward() { if (BrowserView.IsValid()) { BrowserView->GoForward(); } } FReply SWebInterfaceBrowser::OnForwardClicked() { GoForward(); return FReply::Handled(); } FText SWebInterfaceBrowser::GetReloadButtonText() const { static FText ReloadText = LOCTEXT("Reload", "Reload"); static FText StopText = LOCTEXT("StopText", "Stop"); if (BrowserView.IsValid()) { if (BrowserView->IsLoading()) { return StopText; } } return ReloadText; } FReply SWebInterfaceBrowser::OnReloadClicked() { if (IsLoading()) { StopLoad(); } else { Reload(); } return FReply::Handled(); } void SWebInterfaceBrowser::OnUrlTextCommitted( const FText& NewText, ETextCommit::Type CommitType ) { if(CommitType == ETextCommit::OnEnter) { LoadURL(NewText.ToString()); } } EVisibility SWebInterfaceBrowser::GetViewportVisibility() const { if (!bShowInitialThrobber || BrowserView->IsInitialized()) { return EVisibility::Visible; } return EVisibility::Hidden; } EVisibility SWebInterfaceBrowser::GetLoadingThrobberVisibility() const { if (bShowInitialThrobber && !BrowserView->IsInitialized()) { return EVisibility::Visible; } return EVisibility::Hidden; } void SWebInterfaceBrowser::ExecuteJavascript(const FString& ScriptText) { if (BrowserView.IsValid()) { BrowserView->ExecuteJavascript(ScriptText); } } void SWebInterfaceBrowser::GetSource(TFunction Callback) const { if (BrowserView.IsValid()) { BrowserView->GetSource(Callback); } } void SWebInterfaceBrowser::BindUObject(const FString& Name, UObject* Object, bool bIsPermanent) { if (BrowserView.IsValid()) { BrowserView->BindUObject(Name, Object, bIsPermanent); } } void SWebInterfaceBrowser::UnbindUObject(const FString& Name, UObject* Object, bool bIsPermanent) { if (BrowserView.IsValid()) { BrowserView->UnbindUObject(Name, Object, bIsPermanent); } } void SWebInterfaceBrowser::BindAdapter(const TSharedRef& Adapter) { if (BrowserView.IsValid()) { BrowserView->BindAdapter(Adapter); } } void SWebInterfaceBrowser::UnbindAdapter(const TSharedRef& Adapter) { if (BrowserView.IsValid()) { BrowserView->UnbindAdapter(Adapter); } } void SWebInterfaceBrowser::BindInputMethodSystem(ITextInputMethodSystem* TextInputMethodSystem) { if (BrowserView.IsValid()) { BrowserView->BindInputMethodSystem(TextInputMethodSystem); } } void SWebInterfaceBrowser::UnbindInputMethodSystem() { if (BrowserView.IsValid()) { BrowserView->UnbindInputMethodSystem(); } } void SWebInterfaceBrowser::SetParentWindow(TSharedPtr Window) { if (BrowserView.IsValid()) { BrowserView->SetParentWindow(Window); } } #undef LOCTEXT_NAMESPACE