react-native-windows 0.75.4 → 0.75.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Microsoft.ReactNative/ComponentView.idl +11 -0
- package/Microsoft.ReactNative/Composition.Input.idl +1 -0
- package/Microsoft.ReactNative/CompositionSwitcher.idl +3 -0
- package/Microsoft.ReactNative/Fabric/ComponentView.cpp +19 -9
- package/Microsoft.ReactNative/Fabric/ComponentView.h +8 -6
- package/Microsoft.ReactNative/Fabric/Composition/Composition.Input.cpp +4 -0
- package/Microsoft.ReactNative/Fabric/Composition/Composition.Input.h +1 -0
- package/Microsoft.ReactNative/Fabric/Composition/CompositionContextHelper.cpp +44 -13
- package/Microsoft.ReactNative/Fabric/Composition/CompositionDynamicAutomationProvider.cpp +76 -1
- package/Microsoft.ReactNative/Fabric/Composition/CompositionDynamicAutomationProvider.h +8 -2
- package/Microsoft.ReactNative/Fabric/Composition/CompositionHwndHost.cpp +1 -0
- package/Microsoft.ReactNative/Fabric/Composition/CompositionViewComponentView.cpp +35 -8
- package/Microsoft.ReactNative/Fabric/Composition/CompositionViewComponentView.h +4 -3
- package/Microsoft.ReactNative/Fabric/Composition/DebuggingOverlayComponentView.cpp +8 -6
- package/Microsoft.ReactNative/Fabric/Composition/DebuggingOverlayComponentView.h +1 -2
- package/Microsoft.ReactNative/Fabric/Composition/FocusManager.cpp +20 -6
- package/Microsoft.ReactNative/Fabric/Composition/FocusManager.h +13 -6
- package/Microsoft.ReactNative/Fabric/Composition/Modal/WindowsModalHostViewComponentView.cpp +2 -3
- package/Microsoft.ReactNative/Fabric/Composition/Modal/WindowsModalHostViewComponentView.h +1 -2
- package/Microsoft.ReactNative/Fabric/Composition/ReactNativeIsland.cpp +80 -57
- package/Microsoft.ReactNative/Fabric/Composition/ReactNativeIsland.h +15 -4
- package/Microsoft.ReactNative/Fabric/Composition/RootComponentView.cpp +37 -8
- package/Microsoft.ReactNative/Fabric/Composition/RootComponentView.h +7 -2
- package/Microsoft.ReactNative/Fabric/Composition/ScrollViewComponentView.cpp +18 -7
- package/Microsoft.ReactNative/Fabric/Composition/ScrollViewComponentView.h +1 -2
- package/Microsoft.ReactNative/Fabric/Composition/SwitchComponentView.cpp +6 -6
- package/Microsoft.ReactNative/Fabric/Composition/SwitchComponentView.h +1 -2
- package/Microsoft.ReactNative/Fabric/Composition/TextDrawing.cpp +1 -2
- package/Microsoft.ReactNative/Fabric/Composition/TextDrawing.h +1 -1
- package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputComponentView.cpp +97 -140
- package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputComponentView.h +8 -4
- package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputShadowNode.cpp +14 -11
- package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputShadowNode.h +4 -4
- package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputState.cpp +0 -13
- package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputState.h +0 -3
- package/Microsoft.ReactNative/Fabric/Composition/Theme.cpp +12 -4
- package/Microsoft.ReactNative/Fabric/Composition/TooltipService.cpp +338 -0
- package/Microsoft.ReactNative/Fabric/Composition/TooltipService.h +66 -0
- package/Microsoft.ReactNative/Fabric/Composition/UiaHelpers.cpp +37 -4
- package/Microsoft.ReactNative/Fabric/Composition/UiaHelpers.h +3 -0
- package/Microsoft.ReactNative/Fabric/Composition/UnimplementedNativeViewComponentView.cpp +1 -2
- package/Microsoft.ReactNative/Fabric/Composition/UnimplementedNativeViewComponentView.h +1 -2
- package/Microsoft.ReactNative/Fabric/FabricUIManagerModule.cpp +31 -3
- package/Microsoft.ReactNative/Fabric/ReactTaggedView.h +4 -0
- package/Microsoft.ReactNative/Fabric/platform/react/renderer/components/view/HostPlatformViewProps.cpp +5 -0
- package/Microsoft.ReactNative/Fabric/platform/react/renderer/components/view/HostPlatformViewProps.h +1 -1
- package/Microsoft.ReactNative/Fabric/platform/react/renderer/components/view/HostPlatformViewTraitsInitializer.h +1 -1
- package/Microsoft.ReactNative/Fabric/platform/react/renderer/textlayoutmanager/TextLayoutManager.cpp +9 -2
- package/Microsoft.ReactNative/IReactViewComponentBuilder.idl +8 -1
- package/Microsoft.ReactNative/Microsoft.ReactNative.vcxproj +1 -1
- package/Microsoft.ReactNative/Modules/LogBoxModule.cpp +9 -0
- package/Microsoft.ReactNative/Modules/LogBoxModule.h +2 -0
- package/Microsoft.ReactNative/Modules/SampleTurboModule.cpp +104 -0
- package/Microsoft.ReactNative/Modules/SampleTurboModule.h +78 -0
- package/Microsoft.ReactNative/ReactCoreInjection.h +0 -1
- package/Microsoft.ReactNative/ReactHost/MsoReactContext.cpp +0 -7
- package/Microsoft.ReactNative/ReactHost/MsoReactContext.h +0 -5
- package/Microsoft.ReactNative/ReactHost/ReactInstanceWin.cpp +17 -1
- package/Microsoft.ReactNative/ReactInstanceSettingsBuilder.cpp +59 -0
- package/Microsoft.ReactNative/ReactInstanceSettingsBuilder.h +23 -0
- package/Microsoft.ReactNative/ReactNativeAppBuilder.cpp +179 -0
- package/Microsoft.ReactNative/ReactNativeAppBuilder.h +35 -0
- package/Microsoft.ReactNative/ReactNativeAppBuilder.idl +69 -0
- package/Microsoft.ReactNative/ReactNativeIsland.idl +2 -0
- package/Microsoft.ReactNative/ReactNativeWin32App.cpp +82 -0
- package/Microsoft.ReactNative/ReactNativeWin32App.h +38 -0
- package/Microsoft.ReactNative/packages.lock.json +67 -40
- package/PropertySheets/Generated/PackageVersion.g.props +3 -3
- package/Shared/Shared.vcxitems +36 -0
- package/Shared/Shared.vcxitems.filters +3 -0
- package/Shared/TurboModuleManager.cpp +0 -3
- package/package.json +3 -3
- package/templates/cpp-app/windows/MyApp/MyApp.cpp +1 -0
|
@@ -41,8 +41,8 @@ class WindowsTextInputShadowNode final : public ConcreteViewShadowNode<
|
|
|
41
41
|
/*
|
|
42
42
|
* Returns a `AttributedString` which represents text content of the node.
|
|
43
43
|
*/
|
|
44
|
-
AttributedString getAttributedString() const;
|
|
45
|
-
AttributedString getPlaceholderAttributedString() const;
|
|
44
|
+
AttributedString getAttributedString(const LayoutContext &layoutContext) const;
|
|
45
|
+
AttributedString getPlaceholderAttributedString(const LayoutContext &layoutContext) const;
|
|
46
46
|
|
|
47
47
|
/*
|
|
48
48
|
* Associates a shared TextLayoutManager with the node.
|
|
@@ -62,13 +62,13 @@ class WindowsTextInputShadowNode final : public ConcreteViewShadowNode<
|
|
|
62
62
|
/**
|
|
63
63
|
* Get the most up-to-date attributed string for measurement and State.
|
|
64
64
|
*/
|
|
65
|
-
AttributedString getMostRecentAttributedString() const;
|
|
65
|
+
AttributedString getMostRecentAttributedString(const LayoutContext &layoutContext) const;
|
|
66
66
|
|
|
67
67
|
/*
|
|
68
68
|
* Creates a `State` object (with `AttributedText` and
|
|
69
69
|
* `TextLayoutManager`) if needed.
|
|
70
70
|
*/
|
|
71
|
-
void updateStateIfNeeded();
|
|
71
|
+
void updateStateIfNeeded(const LayoutContext &layoutContext);
|
|
72
72
|
|
|
73
73
|
SharedTextLayoutManager m_textLayoutManager;
|
|
74
74
|
|
|
@@ -31,17 +31,4 @@ WindowsTextInputState::WindowsTextInputState(
|
|
|
31
31
|
defaultThemePaddingTop(defaultThemePaddingTop),
|
|
32
32
|
defaultThemePaddingBottom(defaultThemePaddingBottom) {}
|
|
33
33
|
|
|
34
|
-
WindowsTextInputState::WindowsTextInputState(const WindowsTextInputState &previousState, const folly::dynamic &data)
|
|
35
|
-
: mostRecentEventCount(data.getDefault("mostRecentEventCount", previousState.mostRecentEventCount).getInt()),
|
|
36
|
-
cachedAttributedStringId(data.getDefault("opaqueCacheId", previousState.cachedAttributedStringId).getInt()),
|
|
37
|
-
attributedString(previousState.attributedString),
|
|
38
|
-
reactTreeAttributedString(previousState.reactTreeAttributedString),
|
|
39
|
-
paragraphAttributes(previousState.paragraphAttributes),
|
|
40
|
-
defaultThemePaddingStart(
|
|
41
|
-
data.getDefault("themePaddingStart", previousState.defaultThemePaddingStart).getDouble()),
|
|
42
|
-
defaultThemePaddingEnd(data.getDefault("themePaddingEnd", previousState.defaultThemePaddingEnd).getDouble()),
|
|
43
|
-
defaultThemePaddingTop(data.getDefault("themePaddingTop", previousState.defaultThemePaddingTop).getDouble()),
|
|
44
|
-
defaultThemePaddingBottom(
|
|
45
|
-
data.getDefault("themePaddingBottom", previousState.defaultThemePaddingBottom).getDouble()){};
|
|
46
|
-
|
|
47
34
|
} // namespace facebook::react
|
|
@@ -66,9 +66,6 @@ class WindowsTextInputState final {
|
|
|
66
66
|
double defaultThemePaddingBottom);
|
|
67
67
|
|
|
68
68
|
WindowsTextInputState() = default;
|
|
69
|
-
WindowsTextInputState(const WindowsTextInputState &previousState, const folly::dynamic &data);
|
|
70
|
-
folly::dynamic getDynamic() const;
|
|
71
|
-
MapBuffer getMapBuffer() const;
|
|
72
69
|
};
|
|
73
70
|
|
|
74
71
|
} // namespace facebook::react
|
|
@@ -296,7 +296,9 @@ bool Theme::TryGetPlatformColor(const std::string &platformColor, winrt::Windows
|
|
|
296
296
|
{"ScrollBarThumbFillDisabled", "ControlStrongFillColorDisabled"},
|
|
297
297
|
{"ScrollBarTrackFill",
|
|
298
298
|
"AcrylicInAppFillColorDefault"}, // TODO make AcrylicInAppFillColorDefault a real acrylic brush
|
|
299
|
-
|
|
299
|
+
{"ToolTipBackground", "SystemChromeMediumLowColor"},
|
|
300
|
+
{"ToolTipForeground", "SystemControlForegroundBaseHighColor"},
|
|
301
|
+
{"ToolTipBorderBrush", "SystemControlTransientBorderColor"}};
|
|
300
302
|
|
|
301
303
|
static std::unordered_map<std::string, winrt::Windows::UI::Color, std::hash<std::string_view>, std::equal_to<>>
|
|
302
304
|
s_lightColors = {
|
|
@@ -326,7 +328,9 @@ bool Theme::TryGetPlatformColor(const std::string &platformColor, winrt::Windows
|
|
|
326
328
|
{"ControlStrongFillColorDefault", {0x72, 0x00, 0x00, 0x00}},
|
|
327
329
|
{"ControlStrongFillColorDisabled", {0x51, 0x00, 0x00, 0x00}},
|
|
328
330
|
{"AcrylicInAppFillColorDefault", {0x9E, 0xFF, 0xFF, 0xFF}},
|
|
329
|
-
|
|
331
|
+
{"SystemChromeMediumLowColor", {0xFF, 0xF2, 0xF2, 0xF2}},
|
|
332
|
+
{"SystemControlForegroundBaseHighColor", {0xFF, 0x00, 0x00, 0x00}},
|
|
333
|
+
{"SystemControlTransientBorderColor", {0x24, 0x00, 0x00, 0x00}}};
|
|
330
334
|
|
|
331
335
|
static std::unordered_map<std::string, winrt::Windows::UI::Color, std::hash<std::string_view>, std::equal_to<>>
|
|
332
336
|
s_darkColors = {
|
|
@@ -356,7 +360,9 @@ bool Theme::TryGetPlatformColor(const std::string &platformColor, winrt::Windows
|
|
|
356
360
|
{"ControlStrongFillColorDefault", {0x8B, 0xFF, 0xFF, 0xFF}},
|
|
357
361
|
{"ControlStrongFillColorDisabled", {0x3F, 0xFF, 0xFF, 0xFF}},
|
|
358
362
|
{"AcrylicInAppFillColorDefault", {0x9E, 0x00, 0x00, 0x00}},
|
|
359
|
-
|
|
363
|
+
{"SystemChromeMediumLowColor", {0xFF, 0x2B, 0x2B, 0x2B}},
|
|
364
|
+
{"SystemControlForegroundBaseHighColor", {0xFF, 0xFF, 0xFF, 0xFF}},
|
|
365
|
+
{"SystemControlTransientBorderColor", {0x5C, 0x00, 0x00, 0x00}}};
|
|
360
366
|
|
|
361
367
|
static std::unordered_map<
|
|
362
368
|
std::string,
|
|
@@ -391,7 +397,9 @@ bool Theme::TryGetPlatformColor(const std::string &platformColor, winrt::Windows
|
|
|
391
397
|
{"SubtleFillColorSecondary", {winrt::Windows::UI::ViewManagement::UIElementType::ButtonFace, {}}},
|
|
392
398
|
{"ControlStrongFillColorDefault", {winrt::Windows::UI::ViewManagement::UIElementType::ButtonFace, {}}},
|
|
393
399
|
{"ControlStrongFillColorDisabled", {winrt::Windows::UI::ViewManagement::UIElementType::ButtonFace, {}}},
|
|
394
|
-
|
|
400
|
+
{"SystemChromeMediumLowColor", {winrt::Windows::UI::ViewManagement::UIElementType::ButtonFace, {}}},
|
|
401
|
+
{"SystemControlForegroundBaseHighColor", {winrt::Windows::UI::ViewManagement::UIElementType::ButtonText, {}}},
|
|
402
|
+
{"SystemControlTransientBorderColor", {winrt::Windows::UI::ViewManagement::UIElementType::ButtonText, {}}}};
|
|
395
403
|
|
|
396
404
|
auto alias = s_xamlAliasedColors.find(platformColor);
|
|
397
405
|
if (alias != s_xamlAliasedColors.end()) {
|
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
|
|
2
|
+
// Copyright (c) Microsoft Corporation.
|
|
3
|
+
// Licensed under the MIT License.
|
|
4
|
+
|
|
5
|
+
#include "TooltipService.h"
|
|
6
|
+
|
|
7
|
+
#include <CompositionSwitcher.Experimental.interop.h>
|
|
8
|
+
#include <Fabric/Composition/CompositionViewComponentView.h>
|
|
9
|
+
#include <react/renderer/attributedstring/AttributedStringBox.h>
|
|
10
|
+
#include <react/renderer/core/LayoutConstraints.h>
|
|
11
|
+
#include <react/renderer/textlayoutmanager/TextLayoutManager.h>
|
|
12
|
+
#include <winrt/Microsoft.ReactNative.Composition.h>
|
|
13
|
+
#include "TextDrawing.h"
|
|
14
|
+
#include "dwmapi.h"
|
|
15
|
+
|
|
16
|
+
namespace winrt::Microsoft::ReactNative {
|
|
17
|
+
|
|
18
|
+
constexpr PCWSTR c_tooltipWindowClassName = L"RN_TOOLTIP";
|
|
19
|
+
constexpr auto TooltipDataProperty = L"TooltipData";
|
|
20
|
+
constexpr float tooltipFontSize = 12;
|
|
21
|
+
constexpr float tooltipMaxHeight = 1000;
|
|
22
|
+
constexpr float tooltipMaxWidth = 320;
|
|
23
|
+
constexpr float tooltipHorizontalPadding = 8;
|
|
24
|
+
constexpr float tooltipTopPadding = 5;
|
|
25
|
+
constexpr float tooltipBottomPadding = 7;
|
|
26
|
+
constexpr float toolTipBorderThickness = 1;
|
|
27
|
+
constexpr int toolTipPlacementMargin = 12;
|
|
28
|
+
constexpr int toolTipAnimationTimeMs = 200;
|
|
29
|
+
constexpr int toolTipTimeToShowMs = 1000;
|
|
30
|
+
|
|
31
|
+
struct TooltipData {
|
|
32
|
+
TooltipData(const winrt::Microsoft::ReactNative::ComponentView &view) : view(view) {}
|
|
33
|
+
|
|
34
|
+
static TooltipData *GetFromWindow(HWND hwnd) {
|
|
35
|
+
auto data = reinterpret_cast<TooltipData *>(GetProp(hwnd, TooltipDataProperty));
|
|
36
|
+
return data;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
int width;
|
|
40
|
+
int height;
|
|
41
|
+
::Microsoft::ReactNative::ReactTaggedView view;
|
|
42
|
+
winrt::com_ptr<::IDWriteTextLayout> textLayout;
|
|
43
|
+
facebook::react::AttributedStringBox attributedString;
|
|
44
|
+
winrt::Microsoft::ReactNative::Composition::Experimental::ICompositionContext compositionContext;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
facebook::react::AttributedStringBox CreateTooltipAttributedString(const std::string &tooltip) noexcept {
|
|
48
|
+
auto attributedString = facebook::react::AttributedString{};
|
|
49
|
+
auto fragment = facebook::react::AttributedString::Fragment{};
|
|
50
|
+
fragment.string = tooltip;
|
|
51
|
+
fragment.textAttributes.fontSize = tooltipFontSize;
|
|
52
|
+
attributedString.appendFragment(fragment);
|
|
53
|
+
return facebook::react::AttributedStringBox{attributedString};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
LRESULT CALLBACK TooltipWndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) noexcept {
|
|
57
|
+
switch (message) {
|
|
58
|
+
case WM_DESTROY: {
|
|
59
|
+
delete TooltipData::GetFromWindow(hwnd);
|
|
60
|
+
SetProp(hwnd, TooltipDataProperty, 0);
|
|
61
|
+
return 0;
|
|
62
|
+
}
|
|
63
|
+
case WM_PRINTCLIENT:
|
|
64
|
+
case WM_PAINT: {
|
|
65
|
+
HDC hdc;
|
|
66
|
+
PAINTSTRUCT ps;
|
|
67
|
+
|
|
68
|
+
if (message != WM_PRINTCLIENT)
|
|
69
|
+
hdc = BeginPaint(hwnd, &ps);
|
|
70
|
+
else
|
|
71
|
+
hdc = (HDC)wparam;
|
|
72
|
+
auto data = TooltipData::GetFromWindow(hwnd);
|
|
73
|
+
|
|
74
|
+
if (auto view = data->view.view()) {
|
|
75
|
+
auto scaleFactor = view.LayoutMetrics().PointScaleFactor;
|
|
76
|
+
|
|
77
|
+
auto ccInterop = data->compositionContext
|
|
78
|
+
.as<::Microsoft::ReactNative::Composition::Experimental::ICompositionContextInterop>();
|
|
79
|
+
winrt::com_ptr<ID2D1Factory1> factory;
|
|
80
|
+
ccInterop->D2DFactory(factory.put());
|
|
81
|
+
|
|
82
|
+
winrt::com_ptr<ID2D1DCRenderTarget> renderTarget;
|
|
83
|
+
|
|
84
|
+
D2D1_RENDER_TARGET_PROPERTIES props = D2D1::RenderTargetProperties(
|
|
85
|
+
D2D1_RENDER_TARGET_TYPE_DEFAULT,
|
|
86
|
+
D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_IGNORE),
|
|
87
|
+
0,
|
|
88
|
+
0,
|
|
89
|
+
D2D1_RENDER_TARGET_USAGE_NONE,
|
|
90
|
+
D2D1_FEATURE_LEVEL_DEFAULT);
|
|
91
|
+
winrt::check_hresult(factory->CreateDCRenderTarget(&props, renderTarget.put()));
|
|
92
|
+
RECT rc;
|
|
93
|
+
GetClientRect(hwnd, &rc);
|
|
94
|
+
winrt::check_hresult(renderTarget->BindDC(hdc, &rc));
|
|
95
|
+
auto theme = view.as<winrt::Microsoft::ReactNative::Composition::ComponentView>().Theme();
|
|
96
|
+
auto selfTheme = winrt::get_self<winrt::Microsoft::ReactNative::Composition::implementation::Theme>(theme);
|
|
97
|
+
|
|
98
|
+
renderTarget->BeginDraw();
|
|
99
|
+
renderTarget->Clear(selfTheme->D2DPlatformColor("ToolTipBackground"));
|
|
100
|
+
|
|
101
|
+
auto textAttributes = facebook::react::TextAttributes{};
|
|
102
|
+
facebook::react::Color fgColor;
|
|
103
|
+
fgColor.m_platformColor.push_back("ToolTipForeground");
|
|
104
|
+
textAttributes.foregroundColor = fgColor;
|
|
105
|
+
|
|
106
|
+
winrt::Microsoft::ReactNative::Composition::RenderText(
|
|
107
|
+
*renderTarget,
|
|
108
|
+
*data->textLayout,
|
|
109
|
+
data->attributedString.getValue(),
|
|
110
|
+
textAttributes,
|
|
111
|
+
{std::round(tooltipHorizontalPadding * scaleFactor), std::round(tooltipTopPadding * scaleFactor)},
|
|
112
|
+
scaleFactor,
|
|
113
|
+
*selfTheme);
|
|
114
|
+
|
|
115
|
+
auto hr = renderTarget->EndDraw();
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
if (message != WM_PRINTCLIENT)
|
|
119
|
+
EndPaint(hwnd, &ps);
|
|
120
|
+
return 0;
|
|
121
|
+
}
|
|
122
|
+
case WM_NCCREATE: {
|
|
123
|
+
auto cs = reinterpret_cast<CREATESTRUCT *>(lparam);
|
|
124
|
+
auto data = static_cast<TooltipData *>(cs->lpCreateParams);
|
|
125
|
+
WINRT_ASSERT(data);
|
|
126
|
+
SetProp(hwnd, TooltipDataProperty, reinterpret_cast<HANDLE>(data));
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return DefWindowProc(hwnd, message, wparam, lparam);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
void RegisterTooltipWndClass() noexcept {
|
|
135
|
+
static bool registered = false;
|
|
136
|
+
if (registered) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
HINSTANCE hInstance =
|
|
141
|
+
GetModuleHandle(NULL); // returns a handle to the file used to create the calling process (.exe file)
|
|
142
|
+
|
|
143
|
+
WNDCLASSEX wcex = {}; // contains window class information
|
|
144
|
+
wcex.cbSize = sizeof(wcex); // size of windows class (bytes)
|
|
145
|
+
wcex.style = CS_HREDRAW | CS_VREDRAW; // class style (redraw window on size adjustment)
|
|
146
|
+
wcex.lpfnWndProc = &TooltipWndProc; // pointer to windows procedure
|
|
147
|
+
wcex.cbClsExtra = DLGWINDOWEXTRA; // extra bytes to allocate
|
|
148
|
+
wcex.cbWndExtra = sizeof(TooltipData *); // extra bytes to allocate
|
|
149
|
+
wcex.hInstance = hInstance;
|
|
150
|
+
wcex.hCursor = LoadCursor(nullptr, IDC_ARROW); // handle to class cursor
|
|
151
|
+
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); // background color
|
|
152
|
+
wcex.lpszClassName = c_tooltipWindowClassName; // specify resource name
|
|
153
|
+
ATOM classId = RegisterClassEx(&wcex); // register new windows class
|
|
154
|
+
WINRT_VERIFY(classId); // 0 = fail
|
|
155
|
+
winrt::check_win32(!classId);
|
|
156
|
+
|
|
157
|
+
registered = true;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
TooltipTracker::TooltipTracker(
|
|
161
|
+
const winrt::Microsoft::ReactNative::ComponentView &view,
|
|
162
|
+
const winrt::Microsoft::ReactNative::ReactPropertyBag &properties,
|
|
163
|
+
TooltipService *outer)
|
|
164
|
+
: m_view(view), m_properties(properties), m_outer(outer) {
|
|
165
|
+
view.PointerEntered({this, &TooltipTracker::OnPointerEntered});
|
|
166
|
+
view.PointerExited({this, &TooltipTracker::OnPointerExited});
|
|
167
|
+
view.PointerMoved({this, &TooltipTracker::OnPointerMoved});
|
|
168
|
+
view.Unmounted({this, &TooltipTracker::OnUnmounted});
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
TooltipTracker::~TooltipTracker() {
|
|
172
|
+
DestroyTimer();
|
|
173
|
+
DestroyTooltip();
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
facebook::react::Tag TooltipTracker::Tag() const noexcept {
|
|
177
|
+
return m_view.Tag();
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
void TooltipTracker::OnPointerEntered(
|
|
181
|
+
const winrt::Windows::Foundation::IInspectable &sender,
|
|
182
|
+
const winrt::Microsoft::ReactNative::Composition::Input::PointerRoutedEventArgs &args) noexcept {
|
|
183
|
+
if (args.Pointer().PointerDeviceType() !=
|
|
184
|
+
winrt::Microsoft::ReactNative::Composition::Input::PointerDeviceType::Mouse &&
|
|
185
|
+
args.Pointer().PointerDeviceType() != winrt::Microsoft::ReactNative::Composition::Input::PointerDeviceType::Pen)
|
|
186
|
+
return;
|
|
187
|
+
|
|
188
|
+
auto pp = args.GetCurrentPoint(-1);
|
|
189
|
+
m_pos = pp.Position();
|
|
190
|
+
|
|
191
|
+
m_timer = winrt::Microsoft::ReactNative::Timer::Create(m_properties.Handle());
|
|
192
|
+
m_timer.Interval(std::chrono::milliseconds(toolTipTimeToShowMs));
|
|
193
|
+
m_timer.Tick({this, &TooltipTracker::OnTick});
|
|
194
|
+
m_timer.Start();
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
void TooltipTracker::OnPointerMoved(
|
|
198
|
+
const winrt::Windows::Foundation::IInspectable &sender,
|
|
199
|
+
const winrt::Microsoft::ReactNative::Composition::Input::PointerRoutedEventArgs &args) noexcept {
|
|
200
|
+
if (args.Pointer().PointerDeviceType() !=
|
|
201
|
+
winrt::Microsoft::ReactNative::Composition::Input::PointerDeviceType::Mouse &&
|
|
202
|
+
args.Pointer().PointerDeviceType() != winrt::Microsoft::ReactNative::Composition::Input::PointerDeviceType::Pen)
|
|
203
|
+
return;
|
|
204
|
+
|
|
205
|
+
auto pp = args.GetCurrentPoint(-1);
|
|
206
|
+
m_pos = pp.Position();
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
void TooltipTracker::OnTick(
|
|
210
|
+
const winrt::Windows::Foundation::IInspectable &,
|
|
211
|
+
const winrt::Windows::Foundation::IInspectable &) noexcept {
|
|
212
|
+
ShowTooltip(m_view.view());
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
void TooltipTracker::OnPointerExited(
|
|
216
|
+
const winrt::Windows::Foundation::IInspectable &sender,
|
|
217
|
+
const winrt::Microsoft::ReactNative::Composition::Input::PointerRoutedEventArgs &args) noexcept {
|
|
218
|
+
if (args.Pointer().PointerDeviceType() !=
|
|
219
|
+
winrt::Microsoft::ReactNative::Composition::Input::PointerDeviceType::Mouse &&
|
|
220
|
+
args.Pointer().PointerDeviceType() != winrt::Microsoft::ReactNative::Composition::Input::PointerDeviceType::Pen)
|
|
221
|
+
return;
|
|
222
|
+
DestroyTimer();
|
|
223
|
+
DestroyTooltip();
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
void TooltipTracker::OnUnmounted(
|
|
227
|
+
const winrt::Windows::Foundation::IInspectable &,
|
|
228
|
+
const winrt::Microsoft::ReactNative::ComponentView &) noexcept {
|
|
229
|
+
DestroyTimer();
|
|
230
|
+
DestroyTooltip();
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
void TooltipTracker::ShowTooltip(const winrt::Microsoft::ReactNative::ComponentView &view) noexcept {
|
|
234
|
+
auto viewCompView = view.as<winrt::Microsoft::ReactNative::Composition::ViewComponentView>();
|
|
235
|
+
|
|
236
|
+
auto selfView =
|
|
237
|
+
winrt::get_self<winrt::Microsoft::ReactNative::Composition::implementation::ViewComponentView>(viewCompView);
|
|
238
|
+
auto parentHwnd = selfView->GetHwndForParenting();
|
|
239
|
+
DestroyTimer();
|
|
240
|
+
|
|
241
|
+
if (!m_hwndTip) {
|
|
242
|
+
auto tooltipData = std::make_unique<TooltipData>(view);
|
|
243
|
+
tooltipData->attributedString = CreateTooltipAttributedString(*selfView->viewProps()->tooltip);
|
|
244
|
+
|
|
245
|
+
tooltipData->compositionContext = selfView->CompositionContext();
|
|
246
|
+
tooltipData->view = view;
|
|
247
|
+
|
|
248
|
+
auto scaleFactor = view.LayoutMetrics().PointScaleFactor;
|
|
249
|
+
facebook::react::LayoutConstraints layoutConstraints;
|
|
250
|
+
layoutConstraints.layoutDirection = facebook::react::LayoutDirection::Undefined;
|
|
251
|
+
layoutConstraints.maximumSize.height = tooltipMaxHeight * scaleFactor;
|
|
252
|
+
layoutConstraints.maximumSize.width = tooltipMaxWidth * scaleFactor;
|
|
253
|
+
layoutConstraints.minimumSize.height = 0;
|
|
254
|
+
layoutConstraints.minimumSize.width = 0;
|
|
255
|
+
|
|
256
|
+
facebook::react::TextLayoutManager::GetTextLayout(
|
|
257
|
+
tooltipData->attributedString, {} /*paragraphAttributes*/, layoutConstraints, tooltipData->textLayout);
|
|
258
|
+
|
|
259
|
+
DWRITE_TEXT_METRICS tm;
|
|
260
|
+
winrt::check_hresult(tooltipData->textLayout->GetMetrics(&tm));
|
|
261
|
+
|
|
262
|
+
tooltipData->width =
|
|
263
|
+
static_cast<int>(tm.width + ((tooltipHorizontalPadding + tooltipHorizontalPadding) * scaleFactor));
|
|
264
|
+
tooltipData->height = static_cast<int>(tm.height + ((tooltipTopPadding + tooltipBottomPadding) * scaleFactor));
|
|
265
|
+
|
|
266
|
+
POINT pt = {static_cast<LONG>(m_pos.X), static_cast<LONG>(m_pos.Y)};
|
|
267
|
+
ClientToScreen(parentHwnd, &pt);
|
|
268
|
+
|
|
269
|
+
RegisterTooltipWndClass();
|
|
270
|
+
HINSTANCE hInstance = GetModuleHandle(NULL);
|
|
271
|
+
m_hwndTip = CreateWindow(
|
|
272
|
+
c_tooltipWindowClassName,
|
|
273
|
+
L"Tooltip",
|
|
274
|
+
WS_POPUP,
|
|
275
|
+
pt.x - tooltipData->width / 2,
|
|
276
|
+
static_cast<int>(pt.y - tooltipData->height - (toolTipPlacementMargin * scaleFactor)),
|
|
277
|
+
tooltipData->width,
|
|
278
|
+
tooltipData->height,
|
|
279
|
+
parentHwnd,
|
|
280
|
+
NULL,
|
|
281
|
+
hInstance,
|
|
282
|
+
tooltipData.get());
|
|
283
|
+
|
|
284
|
+
DWM_WINDOW_CORNER_PREFERENCE preference = DWMWCP_ROUNDSMALL;
|
|
285
|
+
UINT borderThickness = 0;
|
|
286
|
+
DwmSetWindowAttribute(m_hwndTip, DWMWA_WINDOW_CORNER_PREFERENCE, &preference, sizeof(preference));
|
|
287
|
+
|
|
288
|
+
tooltipData.release();
|
|
289
|
+
AnimateWindow(m_hwndTip, toolTipAnimationTimeMs, AW_BLEND);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
void TooltipTracker::DestroyTooltip() noexcept {
|
|
294
|
+
if (m_hwndTip) {
|
|
295
|
+
AnimateWindow(m_hwndTip, toolTipAnimationTimeMs, AW_BLEND | AW_HIDE);
|
|
296
|
+
DestroyWindow(m_hwndTip);
|
|
297
|
+
m_hwndTip = nullptr;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
void TooltipTracker::DestroyTimer() noexcept {
|
|
302
|
+
if (m_timer) {
|
|
303
|
+
m_timer.Stop();
|
|
304
|
+
m_timer = nullptr;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
TooltipService::TooltipService(const winrt::Microsoft::ReactNative::ReactPropertyBag &properties)
|
|
309
|
+
: m_properties(properties) {}
|
|
310
|
+
|
|
311
|
+
void TooltipService::StartTracking(const winrt::Microsoft::ReactNative::ComponentView &view) noexcept {
|
|
312
|
+
m_trackers.push_back(std::make_shared<TooltipTracker>(view, m_properties, this));
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
void TooltipService::StopTracking(const winrt::Microsoft::ReactNative::ComponentView &view) noexcept {
|
|
316
|
+
for (auto it = m_trackers.begin(); it != m_trackers.end();) {
|
|
317
|
+
if ((*it)->Tag() == view.Tag())
|
|
318
|
+
it = m_trackers.erase(it);
|
|
319
|
+
else
|
|
320
|
+
++it;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
static const ReactPropertyId<winrt::Microsoft::ReactNative::ReactNonAbiValue<std::shared_ptr<TooltipService>>>
|
|
325
|
+
&TooltipServicePropertyId() noexcept {
|
|
326
|
+
static const ReactPropertyId<winrt::Microsoft::ReactNative::ReactNonAbiValue<std::shared_ptr<TooltipService>>> prop{
|
|
327
|
+
L"ReactNative", L"TooltipService"};
|
|
328
|
+
return prop;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
std::shared_ptr<TooltipService> TooltipService::GetCurrent(
|
|
332
|
+
const winrt::Microsoft::ReactNative::ReactPropertyBag &properties) noexcept {
|
|
333
|
+
return *properties.GetOrCreate(TooltipServicePropertyId(), [properties]() -> std::shared_ptr<TooltipService> {
|
|
334
|
+
return std::make_shared<TooltipService>(properties);
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
} // namespace winrt::Microsoft::ReactNative
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
|
|
2
|
+
// Copyright (c) Microsoft Corporation.
|
|
3
|
+
// Licensed under the MIT License.
|
|
4
|
+
|
|
5
|
+
#pragma once
|
|
6
|
+
|
|
7
|
+
#include <Fabric/ReactTaggedView.h>
|
|
8
|
+
#include <winrt/Microsoft.ReactNative.h>
|
|
9
|
+
|
|
10
|
+
namespace winrt::Microsoft::ReactNative {
|
|
11
|
+
|
|
12
|
+
struct TooltipService;
|
|
13
|
+
|
|
14
|
+
struct TooltipTracker {
|
|
15
|
+
TooltipTracker(
|
|
16
|
+
const winrt::Microsoft::ReactNative::ComponentView &view,
|
|
17
|
+
const winrt::Microsoft::ReactNative::ReactPropertyBag &properties,
|
|
18
|
+
TooltipService *outer);
|
|
19
|
+
~TooltipTracker();
|
|
20
|
+
|
|
21
|
+
void OnPointerEntered(
|
|
22
|
+
const winrt::Windows::Foundation::IInspectable &sender,
|
|
23
|
+
const winrt::Microsoft::ReactNative::Composition::Input::PointerRoutedEventArgs &args) noexcept;
|
|
24
|
+
void OnPointerMoved(
|
|
25
|
+
const winrt::Windows::Foundation::IInspectable &sender,
|
|
26
|
+
const winrt::Microsoft::ReactNative::Composition::Input::PointerRoutedEventArgs &args) noexcept;
|
|
27
|
+
void OnPointerExited(
|
|
28
|
+
const winrt::Windows::Foundation::IInspectable &sender,
|
|
29
|
+
const winrt::Microsoft::ReactNative::Composition::Input::PointerRoutedEventArgs &args) noexcept;
|
|
30
|
+
void OnTick(
|
|
31
|
+
const winrt::Windows::Foundation::IInspectable &,
|
|
32
|
+
const winrt::Windows::Foundation::IInspectable &) noexcept;
|
|
33
|
+
void OnUnmounted(
|
|
34
|
+
const winrt::Windows::Foundation::IInspectable &,
|
|
35
|
+
const winrt::Microsoft::ReactNative::ComponentView &) noexcept;
|
|
36
|
+
|
|
37
|
+
facebook::react::Tag Tag() const noexcept;
|
|
38
|
+
|
|
39
|
+
private:
|
|
40
|
+
void ShowTooltip(const winrt::Microsoft::ReactNative::ComponentView &view) noexcept;
|
|
41
|
+
void DestroyTimer() noexcept;
|
|
42
|
+
void DestroyTooltip() noexcept;
|
|
43
|
+
|
|
44
|
+
TooltipService *m_outer;
|
|
45
|
+
winrt::Windows::Foundation::Point m_pos;
|
|
46
|
+
::Microsoft::ReactNative::ReactTaggedView m_view;
|
|
47
|
+
winrt::Microsoft::ReactNative::ITimer m_timer;
|
|
48
|
+
HWND m_hwndTip{nullptr};
|
|
49
|
+
winrt::Microsoft::ReactNative::ReactPropertyBag m_properties;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
struct TooltipService {
|
|
53
|
+
TooltipService(const winrt::Microsoft::ReactNative::ReactPropertyBag &properties);
|
|
54
|
+
void StartTracking(const winrt::Microsoft::ReactNative::ComponentView &view) noexcept;
|
|
55
|
+
void StopTracking(const winrt::Microsoft::ReactNative::ComponentView &view) noexcept;
|
|
56
|
+
|
|
57
|
+
static std::shared_ptr<TooltipService> GetCurrent(
|
|
58
|
+
const winrt::Microsoft::ReactNative::ReactPropertyBag &properties) noexcept;
|
|
59
|
+
|
|
60
|
+
private:
|
|
61
|
+
std::vector<std::shared_ptr<TooltipTracker>> m_enteredTrackers;
|
|
62
|
+
std::vector<std::shared_ptr<TooltipTracker>> m_trackers;
|
|
63
|
+
winrt::Microsoft::ReactNative::ReactPropertyBag m_properties;
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
} // namespace winrt::Microsoft::ReactNative
|
|
@@ -72,9 +72,10 @@ HRESULT UiaNavigateHelper(
|
|
|
72
72
|
auto parentCV = view.Parent().as<winrt::Microsoft::ReactNative::Composition::implementation::ComponentView>();
|
|
73
73
|
if (parentCV != nullptr) {
|
|
74
74
|
auto children = parentCV->Children();
|
|
75
|
-
for (auto
|
|
76
|
-
|
|
77
|
-
|
|
75
|
+
for (auto i = children.Size() - 1; i > 0; i--) {
|
|
76
|
+
auto child = children.GetAt(i);
|
|
77
|
+
if (child == view) {
|
|
78
|
+
uiaProvider = children.GetAt(i - 1)
|
|
78
79
|
.as<winrt::Microsoft::ReactNative::Composition::implementation::ComponentView>()
|
|
79
80
|
->EnsureUiaProvider();
|
|
80
81
|
break;
|
|
@@ -121,7 +122,9 @@ HRESULT UiaSetFocusHelper(::Microsoft::ReactNative::ReactTaggedView &view) noexc
|
|
|
121
122
|
if (rootCV == nullptr)
|
|
122
123
|
return UIA_E_ELEMENTNOTAVAILABLE;
|
|
123
124
|
|
|
124
|
-
return rootCV->TrySetFocusedComponent(strongView)
|
|
125
|
+
return rootCV->TrySetFocusedComponent(strongView, winrt::Microsoft::ReactNative::FocusNavigationDirection::None)
|
|
126
|
+
? S_OK
|
|
127
|
+
: E_FAIL;
|
|
125
128
|
}
|
|
126
129
|
|
|
127
130
|
bool WasUiaPropertyAdvised(winrt::com_ptr<IRawElementProviderSimple> &providerSimple, PROPERTYID propId) noexcept {
|
|
@@ -181,4 +184,34 @@ std::string extractAccessibilityValue(const facebook::react::AccessibilityValue
|
|
|
181
184
|
}
|
|
182
185
|
}
|
|
183
186
|
|
|
187
|
+
void DispatchAccessibilityAction(::Microsoft::ReactNative::ReactTaggedView &view, const std::string &action) noexcept {
|
|
188
|
+
auto strongView = view.view();
|
|
189
|
+
|
|
190
|
+
if (!strongView)
|
|
191
|
+
return;
|
|
192
|
+
|
|
193
|
+
auto baseView = strongView.try_as<winrt::Microsoft::ReactNative::Composition::implementation::ComponentView>();
|
|
194
|
+
if (baseView == nullptr)
|
|
195
|
+
return;
|
|
196
|
+
|
|
197
|
+
auto props = std::static_pointer_cast<const facebook::react::ViewProps>(baseView->props());
|
|
198
|
+
if (props == nullptr)
|
|
199
|
+
return;
|
|
200
|
+
|
|
201
|
+
auto accessibilityActions = props->accessibilityActions;
|
|
202
|
+
for (size_t i = 0; i < accessibilityActions.size(); i++) {
|
|
203
|
+
if (accessibilityActions[i].name == action) {
|
|
204
|
+
baseView->GetEventEmitter()->onAccessibilityAction(action);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
ExpandCollapseState GetExpandCollapseState(const bool &expanded) noexcept {
|
|
210
|
+
if (expanded) {
|
|
211
|
+
return ExpandCollapseState_Expanded;
|
|
212
|
+
} else {
|
|
213
|
+
return ExpandCollapseState_Collapsed;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
184
217
|
} // namespace winrt::Microsoft::ReactNative::implementation
|
|
@@ -33,4 +33,7 @@ long GetLiveSetting(const std::string &liveRegion) noexcept;
|
|
|
33
33
|
|
|
34
34
|
std::string extractAccessibilityValue(const facebook::react::AccessibilityValue &value) noexcept;
|
|
35
35
|
|
|
36
|
+
void DispatchAccessibilityAction(::Microsoft::ReactNative::ReactTaggedView &view, const std::string &action) noexcept;
|
|
37
|
+
|
|
38
|
+
ExpandCollapseState GetExpandCollapseState(const bool &expanded) noexcept;
|
|
36
39
|
} // namespace winrt::Microsoft::ReactNative::implementation
|
|
@@ -37,8 +37,7 @@ winrt::Microsoft::ReactNative::ComponentView UnimplementedNativeViewComponentVie
|
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
void UnimplementedNativeViewComponentView::HandleCommand(
|
|
40
|
-
winrt::
|
|
41
|
-
const winrt::Microsoft::ReactNative::IJSValueReader &args) noexcept {
|
|
40
|
+
const winrt::Microsoft::ReactNative::HandleCommandArgs &args) noexcept {
|
|
42
41
|
// Do not call base to avoid unknown command asserts
|
|
43
42
|
}
|
|
44
43
|
|
|
@@ -25,8 +25,7 @@ struct UnimplementedNativeViewComponentView
|
|
|
25
25
|
facebook::react::LayoutMetrics const &layoutMetrics,
|
|
26
26
|
facebook::react::LayoutMetrics const &oldLayoutMetrics) noexcept override;
|
|
27
27
|
|
|
28
|
-
void HandleCommand(
|
|
29
|
-
override;
|
|
28
|
+
void HandleCommand(const winrt::Microsoft::ReactNative::HandleCommandArgs &args) noexcept override;
|
|
30
29
|
|
|
31
30
|
UnimplementedNativeViewComponentView(
|
|
32
31
|
const winrt::Microsoft::ReactNative::Composition::Experimental::ICompositionContext &compContext,
|
|
@@ -2,12 +2,15 @@
|
|
|
2
2
|
// Licensed under the MIT License.
|
|
3
3
|
|
|
4
4
|
#include "pch.h"
|
|
5
|
+
#include "HandleCommandArgs.g.cpp"
|
|
6
|
+
#include "HandleCommandArgs.g.h"
|
|
5
7
|
#include <AsynchronousEventBeat.h>
|
|
6
8
|
#include <DynamicReader.h>
|
|
7
9
|
#include <DynamicWriter.h>
|
|
8
10
|
#include <Fabric/ComponentView.h>
|
|
9
11
|
#include <Fabric/Composition/CompositionUIService.h>
|
|
10
12
|
#include <Fabric/Composition/CompositionViewComponentView.h>
|
|
13
|
+
#include <Fabric/Composition/ReactNativeIsland.h>
|
|
11
14
|
#include <Fabric/Composition/RootComponentView.h>
|
|
12
15
|
#include <Fabric/FabricUIManagerModule.h>
|
|
13
16
|
#include <Fabric/ReactNativeConfigProperties.h>
|
|
@@ -148,7 +151,7 @@ void FabricUIManager::startSurface(
|
|
|
148
151
|
|
|
149
152
|
facebook::react::LayoutContext layoutContext;
|
|
150
153
|
layoutContext.pointScaleFactor = rootView.ScaleFactor();
|
|
151
|
-
layoutContext.fontSizeMultiplier = rootView.
|
|
154
|
+
layoutContext.fontSizeMultiplier = rootView.FontSizeMultiplier();
|
|
152
155
|
|
|
153
156
|
m_surfaceManager->startSurface(
|
|
154
157
|
surfaceId,
|
|
@@ -161,6 +164,9 @@ void FabricUIManager::startSurface(
|
|
|
161
164
|
|
|
162
165
|
void FabricUIManager::stopSurface(facebook::react::SurfaceId surfaceId) noexcept {
|
|
163
166
|
m_surfaceManager->stopSurface(surfaceId);
|
|
167
|
+
auto &rootDescriptor = m_registry.componentViewDescriptorWithTag(surfaceId);
|
|
168
|
+
m_registry.enqueueComponentViewWithComponentHandle(
|
|
169
|
+
facebook::react::RootShadowNode::Handle(), surfaceId, rootDescriptor);
|
|
164
170
|
}
|
|
165
171
|
|
|
166
172
|
winrt::Microsoft::ReactNative::ReactNativeIsland FabricUIManager::GetReactNativeIsland(
|
|
@@ -377,6 +383,28 @@ void FabricUIManager::schedulerDidRequestPreliminaryViewAllocation(const faceboo
|
|
|
377
383
|
*/
|
|
378
384
|
}
|
|
379
385
|
|
|
386
|
+
struct HandleCommandArgs : public winrt::Microsoft::ReactNative::implementation::HandleCommandArgsT<HandleCommandArgs> {
|
|
387
|
+
HandleCommandArgs(winrt::hstring commandName, folly::dynamic const &arg) : m_commandName(commandName), m_args(arg) {}
|
|
388
|
+
|
|
389
|
+
winrt::hstring CommandName() const noexcept {
|
|
390
|
+
return m_commandName;
|
|
391
|
+
}
|
|
392
|
+
winrt::Microsoft::ReactNative::IJSValueReader CommandArgs() const noexcept {
|
|
393
|
+
return winrt::make<winrt::Microsoft::ReactNative::DynamicReader>(m_args);
|
|
394
|
+
}
|
|
395
|
+
bool Handled() const noexcept {
|
|
396
|
+
return m_handled;
|
|
397
|
+
}
|
|
398
|
+
void Handled(bool value) noexcept {
|
|
399
|
+
m_handled = value;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
private:
|
|
403
|
+
folly::dynamic const &m_args;
|
|
404
|
+
const winrt::hstring m_commandName;
|
|
405
|
+
bool m_handled{false};
|
|
406
|
+
};
|
|
407
|
+
|
|
380
408
|
void FabricUIManager::schedulerDidDispatchCommand(
|
|
381
409
|
facebook::react::ShadowView const &shadowView,
|
|
382
410
|
std::string const &commandName,
|
|
@@ -384,7 +412,7 @@ void FabricUIManager::schedulerDidDispatchCommand(
|
|
|
384
412
|
if (m_context.UIDispatcher().HasThreadAccess()) {
|
|
385
413
|
auto descriptor = m_registry.componentViewDescriptorWithTag(shadowView.tag);
|
|
386
414
|
winrt::get_self<winrt::Microsoft::ReactNative::implementation::ComponentView>(descriptor.view)
|
|
387
|
-
->HandleCommand(winrt::to_hstring(commandName),
|
|
415
|
+
->HandleCommand(winrt::make<HandleCommandArgs>(winrt::to_hstring(commandName), arg));
|
|
388
416
|
} else {
|
|
389
417
|
m_context.UIDispatcher().Post(
|
|
390
418
|
[wkThis = weak_from_this(), commandName, tag = shadowView.tag, args = folly::dynamic(arg)]() {
|
|
@@ -392,7 +420,7 @@ void FabricUIManager::schedulerDidDispatchCommand(
|
|
|
392
420
|
auto view = pThis->m_registry.findComponentViewWithTag(tag);
|
|
393
421
|
if (view) {
|
|
394
422
|
winrt::get_self<winrt::Microsoft::ReactNative::implementation::ComponentView>(view)->HandleCommand(
|
|
395
|
-
winrt::to_hstring(commandName),
|
|
423
|
+
winrt::make<HandleCommandArgs>(winrt::to_hstring(commandName), args));
|
|
396
424
|
}
|
|
397
425
|
}
|
|
398
426
|
});
|