Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
fc99f82
get files building
TatianaKapos Feb 17, 2023
8efac65
try to add something to screen
TatianaKapos Feb 23, 2023
68ed62a
Merge branch 'main' of https://github.com/TatianaKapos/react-native-w…
TatianaKapos Mar 16, 2023
8f71aa5
sync upstream
TatianaKapos Mar 21, 2023
bbc36af
restore build state
TatianaKapos Mar 22, 2023
3b3129b
link to managerModule
TatianaKapos Mar 23, 2023
9ff2cdc
Merge branch 'main' of https://github.com/TatianaKapos/react-native-w…
TatianaKapos Apr 7, 2023
707d374
get a basic circle on the page
TatianaKapos Apr 11, 2023
f530262
circles are responsive to color
TatianaKapos Apr 11, 2023
87a412c
add static loading circles
TatianaKapos Apr 11, 2023
9edf2dc
clean up code
TatianaKapos Apr 11, 2023
eeccdca
restore vscode settings
TatianaKapos Apr 11, 2023
0e0fb5c
fix
TatianaKapos Apr 11, 2023
a69ccdf
Change files
TatianaKapos Apr 12, 2023
b4bf2e7
address feedback
TatianaKapos Apr 12, 2023
892266f
get a circle moving around a ring
TatianaKapos Apr 25, 2023
b776b10
create simple animated activityIndicator
TatianaKapos Apr 28, 2023
e71d543
add color
TatianaKapos Apr 28, 2023
764806e
clean up code
TatianaKapos Apr 29, 2023
a42603c
Merge branch 'main' of https://github.com/TatianaKapos/react-native-w…
TatianaKapos Apr 29, 2023
76ae931
fix merge
TatianaKapos Apr 29, 2023
926c95d
format
TatianaKapos Apr 29, 2023
e0acd72
remove unneccesary code
TatianaKapos May 1, 2023
efb6533
remove drawingSurface and update updateProps
TatianaKapos May 2, 2023
f6f6cc6
switch from ShapeVisual
TatianaKapos May 2, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"type": "prerelease",
"comment": "add default static activityIndicator",
"packageName": "react-native-windows",
"email": "tatianakapos@microsoft.com",
"dependentChangeType": "patch"
}
8 changes: 8 additions & 0 deletions vnext/Microsoft.ReactNative/CompositionSwitcher.idl
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,13 @@ namespace Microsoft.ReactNative.Composition
void TryUpdatePosition(Windows.Foundation.Numerics.Vector3 position, Boolean animate);
}

[webhosthidden]
[experimental]
runtimeclass ActivityVisual : IVisual
{
void updateColor(Windows.UI.Color color);
}

[webhosthidden]
[uuid("a74bfffc-7f2d-432f-8291-654782ab0d52")] // uuid needed for empty interfaces
[version(1)]
Expand Down Expand Up @@ -129,6 +136,7 @@ namespace Microsoft.ReactNative.Composition

SpriteVisual CreateSpriteVisual();
ScrollVisual CreateScrollerVisual();
ActivityVisual CreateActivityVisual();
ICaretVisual CreateCaretVisual();
IFocusVisual CreateFocusVisual();
IDropShadow CreateDropShadow();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

#pragma once

#include "ActivityIndicatorComponentView.h"
#include "CompositionDynamicAutomationProvider.h"

#include <Windows.UI.Composition.h>
#include <Windows.h>
#include "CompositionContextHelper.h"

namespace Microsoft::ReactNative {

std::shared_ptr<ActivityIndicatorComponentView> ActivityIndicatorComponentView::Create(
const winrt::Microsoft::ReactNative::Composition::ICompositionContext &compContext,
facebook::react::Tag tag,
winrt::Microsoft::ReactNative::ReactContext const &reactContext) noexcept {
return std::shared_ptr<ActivityIndicatorComponentView>(
new ActivityIndicatorComponentView(compContext, tag, reactContext));
}

ActivityIndicatorComponentView::ActivityIndicatorComponentView(
const winrt::Microsoft::ReactNative::Composition::ICompositionContext &compContext,
facebook::react::Tag tag,
winrt::Microsoft::ReactNative::ReactContext const &reactContext)
: Super(compContext, tag), m_context(reactContext) {
m_props = std::make_shared<facebook::react::ActivityIndicatorViewProps const>();
}

void ActivityIndicatorComponentView::mountChildComponentView(
IComponentView &childComponentView,
uint32_t index) noexcept {
assert(false);
}

void ActivityIndicatorComponentView::unmountChildComponentView(
IComponentView &childComponentView,
uint32_t index) noexcept {
assert(false);
}

void ActivityIndicatorComponentView::handleCommand(std::string const &commandName, folly::dynamic const &arg) noexcept {
Super::handleCommand(commandName, arg);
}

void ActivityIndicatorComponentView::updateProps(
facebook::react::Props::Shared const &props,
facebook::react::Props::Shared const &oldProps) noexcept {
const auto oldViewProps = std::static_pointer_cast<const facebook::react::ActivityIndicatorViewProps>(m_props);
const auto newViewProps = std::static_pointer_cast<const facebook::react::ActivityIndicatorViewProps>(props);

ensureVisual();

// update color if needed
if (newViewProps->color && (!oldProps || newViewProps->color != oldViewProps->color)) {
m_ActivityIndicatorVisual.updateColor(newViewProps->color.AsWindowsColor());
}

updateBorderProps(*oldViewProps, *newViewProps);
m_props = std::static_pointer_cast<facebook::react::ViewProps const>(props);
}

void ActivityIndicatorComponentView::updateState(
facebook::react::State::Shared const &state,
facebook::react::State::Shared const &oldState) noexcept {}

void ActivityIndicatorComponentView::updateLayoutMetrics(
facebook::react::LayoutMetrics const &layoutMetrics,
facebook::react::LayoutMetrics const &oldLayoutMetrics) noexcept {
// Set Position & Size Properties
ensureVisual();

if ((layoutMetrics.displayType != m_layoutMetrics.displayType)) {
OuterVisual().IsVisible(layoutMetrics.displayType != facebook::react::DisplayType::None);
}

updateBorderLayoutMetrics(layoutMetrics, *m_props);
m_layoutMetrics = layoutMetrics;

UpdateCenterPropertySet();
m_visual.Size(
{layoutMetrics.frame.size.width * layoutMetrics.pointScaleFactor,
layoutMetrics.frame.size.height * layoutMetrics.pointScaleFactor});
}

void ActivityIndicatorComponentView::finalizeUpdates(RNComponentViewUpdateMask updateMask) noexcept {}

void ActivityIndicatorComponentView::prepareForRecycle() noexcept {}

facebook::react::Props::Shared ActivityIndicatorComponentView::props() noexcept {
return m_props;
}

void ActivityIndicatorComponentView::ensureVisual() noexcept {
if (!m_visual) {
m_visual = m_compContext.CreateSpriteVisual();
m_ActivityIndicatorVisual = m_compContext.CreateActivityVisual(); // creates COM control

OuterVisual().InsertAt(m_ActivityIndicatorVisual, 0);
OuterVisual().InsertAt(m_visual, 0);
}
}

facebook::react::Tag ActivityIndicatorComponentView::hitTest(
facebook::react::Point pt,
facebook::react::Point &localPt,
bool ignorePointerEvents) const noexcept {
facebook::react::Point ptLocal{pt.x - m_layoutMetrics.frame.origin.x, pt.y - m_layoutMetrics.frame.origin.y};

if ((ignorePointerEvents || m_props->pointerEvents == facebook::react::PointerEventsMode::Auto ||
m_props->pointerEvents == facebook::react::PointerEventsMode::BoxOnly) &&
ptLocal.x >= 0 && ptLocal.x <= m_layoutMetrics.frame.size.width && ptLocal.y >= 0 &&
ptLocal.y <= m_layoutMetrics.frame.size.height) {
localPt = ptLocal;
return tag();
}
return -1;
}

winrt::Microsoft::ReactNative::Composition::IVisual ActivityIndicatorComponentView::Visual() const noexcept {
return m_visual;
}

bool ActivityIndicatorComponentView::focusable() const noexcept {
return false;
}

} // namespace Microsoft::ReactNative
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

#pragma once

#include <Fabric/ComponentView.h>
#include <Microsoft.ReactNative.Cxx/ReactContext.h>

#include "CompositionViewComponentView.h"

#include <react/components/rnwcore/ShadowNodes.h>

namespace Microsoft::ReactNative {

struct ActivityIndicatorComponentView;

struct ActivityIndicatorComponentView : CompositionBaseComponentView {
using Super = CompositionBaseComponentView;

[[nodiscard]] static std::shared_ptr<ActivityIndicatorComponentView> Create(
const winrt::Microsoft::ReactNative::Composition::ICompositionContext &compContext,
facebook::react::Tag tag,
winrt::Microsoft::ReactNative::ReactContext const &reactContext) noexcept;

void mountChildComponentView(IComponentView &childComponentView, uint32_t index) noexcept override;
void unmountChildComponentView(IComponentView &childComponentView, uint32_t index) noexcept override;
void handleCommand(std::string const &commandName, folly::dynamic const &arg) noexcept override;
void updateProps(facebook::react::Props::Shared const &props, facebook::react::Props::Shared const &oldProps) noexcept
override;
void updateState(facebook::react::State::Shared const &state, facebook::react::State::Shared const &oldState) noexcept
override;
void updateLayoutMetrics(
facebook::react::LayoutMetrics const &layoutMetrics,
facebook::react::LayoutMetrics const &oldLayoutMetrics) noexcept override;
void finalizeUpdates(RNComponentViewUpdateMask updateMask) noexcept override;
void prepareForRecycle() noexcept override;
facebook::react::Props::Shared props() noexcept override;
bool focusable() const noexcept override;

facebook::react::Tag hitTest(facebook::react::Point pt, facebook::react::Point &localPt, bool ignorePointerEvents)
const noexcept override;
winrt::Microsoft::ReactNative::Composition::IVisual Visual() const noexcept override;

private:
ActivityIndicatorComponentView(
const winrt::Microsoft::ReactNative::Composition::ICompositionContext &compContext,
facebook::react::Tag tag,
winrt::Microsoft::ReactNative::ReactContext const &reactContext);

void ensureVisual() noexcept;

winrt::Microsoft::ReactNative::Composition::SpriteVisual m_visual{nullptr};
winrt::Microsoft::ReactNative::Composition::ActivityVisual m_ActivityIndicatorVisual{nullptr};
winrt::Microsoft::ReactNative::ReactContext m_context;
facebook::react::SharedViewProps m_props;
};

} // namespace Microsoft::ReactNative
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include <react/renderer/components/view/ViewShadowNode.h>

#include <Fabric/Composition/AbiCompositionViewComponentView.h>
#include <Fabric/Composition/ActivityIndicatorComponentView.h>
#include <Fabric/Composition/CompositionHelpers.h>
#include <Fabric/Composition/CompositionViewComponentView.h>
#include <Fabric/Composition/ImageComponentView.h>
Expand Down Expand Up @@ -57,6 +58,8 @@ ComponentViewDescriptor const &ComponentViewRegistry::dequeueComponentViewWithCo
view = WindowsTextInputComponentView::Create(compContext, tag, m_context);
} else if (componentHandle == facebook::react::SwitchShadowNode::Handle()) {
view = SwitchComponentView::Create(compContext, tag, m_context);
} else if (componentHandle == facebook::react::ActivityIndicatorViewShadowNode::Handle()) {
view = ActivityIndicatorComponentView::Create(compContext, tag, m_context);
} else if (componentHandle == facebook::react::RootShadowNode::Handle()) {
view = RootComponentView::Create(compContext, tag, m_context);
} else if (
Expand Down
Loading