WebInterfaceBrowserViewport.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. // Engine/Source/Runtime/WebBrowser/Private/WebBrowserViewport.cpp
  2. #include "WebInterfaceBrowserViewport.h"
  3. #include "Textures/SlateShaderResource.h"
  4. #include "Widgets/SWidget.h"
  5. #include "IWebInterfaceBrowserWindow.h"
  6. #include "Layout/WidgetPath.h"
  7. #if WITH_CEF3
  8. #include "CEF/CEFWebInterfaceBrowserWindow.h"
  9. #endif
  10. FIntPoint FWebInterfaceBrowserViewport::GetSize() const
  11. {
  12. return (WebBrowserWindow->GetTexture(bIsPopup) != nullptr)
  13. ? FIntPoint(WebBrowserWindow->GetTexture(bIsPopup)->GetWidth(), WebBrowserWindow->GetTexture(bIsPopup)->GetHeight())
  14. : FIntPoint();
  15. }
  16. FSlateShaderResource* FWebInterfaceBrowserViewport::GetViewportRenderTargetTexture() const
  17. {
  18. return WebBrowserWindow->GetTexture(bIsPopup);
  19. }
  20. void FWebInterfaceBrowserViewport::Tick( const FGeometry& AllottedGeometry, double InCurrentTime, float DeltaTime )
  21. {
  22. if (!bIsPopup)
  23. {
  24. const float DPI = (WebBrowserWindow->GetParentWindow().IsValid() ? WebBrowserWindow->GetParentWindow()->GetNativeWindow()->GetDPIScaleFactor() : 1.0f);
  25. const float DPIScale = AllottedGeometry.Scale / DPI;
  26. FVector2D AbsoluteSize = AllottedGeometry.GetLocalSize() * DPIScale;
  27. WebBrowserWindow->SetViewportSize(AbsoluteSize.IntPoint(), AllottedGeometry.GetAbsolutePosition().IntPoint());
  28. #if WITH_CEF3
  29. // Forward the AllottedGeometry to the WebBrowserWindow so the IME implementation can use it
  30. TSharedPtr<FCEFWebInterfaceBrowserWindow> CefWebBrowserWindow = StaticCastSharedPtr<FCEFWebInterfaceBrowserWindow>(WebBrowserWindow);
  31. CefWebBrowserWindow->UpdateCachedGeometry(AllottedGeometry);
  32. #endif
  33. }
  34. }
  35. bool FWebInterfaceBrowserViewport::RequiresVsync() const
  36. {
  37. return false;
  38. }
  39. FCursorReply FWebInterfaceBrowserViewport::OnCursorQuery( const FGeometry& MyGeometry, const FPointerEvent& CursorEvent )
  40. {
  41. return WebBrowserWindow->OnCursorQuery(MyGeometry, CursorEvent);
  42. }
  43. FReply FWebInterfaceBrowserViewport::OnMouseButtonDown(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent)
  44. {
  45. // Capture mouse on left button down so that you can drag out of the viewport
  46. FReply Reply = WebBrowserWindow->OnMouseButtonDown(MyGeometry, MouseEvent, bIsPopup);
  47. if (MouseEvent.GetEffectingButton() == EKeys::LeftMouseButton)
  48. {
  49. const FWidgetPath* Path = MouseEvent.GetEventPath();
  50. if (Path->IsValid())
  51. {
  52. TSharedRef<SWidget> TopWidget = Path->Widgets.Last().Widget;
  53. return Reply.CaptureMouse(TopWidget);
  54. }
  55. }
  56. return Reply;
  57. }
  58. FReply FWebInterfaceBrowserViewport::OnMouseButtonUp(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent)
  59. {
  60. // Release mouse capture when left button released
  61. FReply Reply = WebBrowserWindow->OnMouseButtonUp(MyGeometry, MouseEvent, bIsPopup);
  62. if (MouseEvent.GetEffectingButton() == EKeys::LeftMouseButton)
  63. {
  64. return Reply.ReleaseMouseCapture();
  65. }
  66. return Reply;
  67. }
  68. void FWebInterfaceBrowserViewport::OnMouseEnter(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent)
  69. {
  70. }
  71. void FWebInterfaceBrowserViewport::OnMouseLeave(const FPointerEvent& MouseEvent)
  72. {
  73. WebBrowserWindow->OnMouseLeave(MouseEvent);
  74. }
  75. FReply FWebInterfaceBrowserViewport::OnMouseMove(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent)
  76. {
  77. return WebBrowserWindow->OnMouseMove(MyGeometry, MouseEvent, bIsPopup);
  78. }
  79. FReply FWebInterfaceBrowserViewport::OnMouseWheel(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent)
  80. {
  81. return WebBrowserWindow->OnMouseWheel(MyGeometry, MouseEvent, bIsPopup);
  82. }
  83. FReply FWebInterfaceBrowserViewport::OnTouchGesture(const FGeometry& MyGeometry, const FPointerEvent& GestureEvent)
  84. {
  85. return WebBrowserWindow->OnTouchGesture(MyGeometry, GestureEvent, bIsPopup);
  86. }
  87. FReply FWebInterfaceBrowserViewport::OnMouseButtonDoubleClick(const FGeometry& InMyGeometry, const FPointerEvent& InMouseEvent)
  88. {
  89. FReply Reply = WebBrowserWindow->OnMouseButtonDoubleClick(InMyGeometry, InMouseEvent, bIsPopup);
  90. return Reply;
  91. }
  92. FReply FWebInterfaceBrowserViewport::OnKeyDown(const FGeometry& MyGeometry, const FKeyEvent& InKeyEvent)
  93. {
  94. return WebBrowserWindow->OnKeyDown(InKeyEvent) ? FReply::Handled() : FReply::Unhandled();
  95. }
  96. FReply FWebInterfaceBrowserViewport::OnKeyUp(const FGeometry& MyGeometry, const FKeyEvent& InKeyEvent)
  97. {
  98. return WebBrowserWindow->OnKeyUp(InKeyEvent) ? FReply::Handled() : FReply::Unhandled();
  99. }
  100. FReply FWebInterfaceBrowserViewport::OnKeyChar( const FGeometry& MyGeometry, const FCharacterEvent& InCharacterEvent )
  101. {
  102. return WebBrowserWindow->OnKeyChar(InCharacterEvent) ? FReply::Handled() : FReply::Unhandled();
  103. }
  104. FReply FWebInterfaceBrowserViewport::OnFocusReceived(const FFocusEvent& InFocusEvent)
  105. {
  106. WebBrowserWindow->OnFocus(true, bIsPopup);
  107. return FReply::Handled();
  108. }
  109. void FWebInterfaceBrowserViewport::OnFocusLost(const FFocusEvent& InFocusEvent)
  110. {
  111. WebBrowserWindow->OnFocus(false, bIsPopup);
  112. }