diff --git a/React/Fabric/Mounting/ComponentViews/Text/RCTParagraphComponentView.mm b/React/Fabric/Mounting/ComponentViews/Text/RCTParagraphComponentView.mm index 9a64f5c30dce93..9497b406f536a6 100644 --- a/React/Fabric/Mounting/ComponentViews/Text/RCTParagraphComponentView.mm +++ b/React/Fabric/Mounting/ComponentViews/Text/RCTParagraphComponentView.mm @@ -8,8 +8,8 @@ #import "RCTParagraphComponentView.h" #import -#import #import +#import #import #import #import @@ -21,7 +21,7 @@ using namespace facebook::react; @implementation RCTParagraphComponentView { - SharedParagraphLocalData _paragraphLocalData; + ParagraphShadowNode::ConcreteState::Shared _state; ParagraphAttributes _paragraphAttributes; } @@ -63,32 +63,32 @@ - (void)updateProps:(SharedProps)props oldProps:(SharedProps)oldProps _paragraphAttributes = paragraphProps->paragraphAttributes; } -- (void)updateLocalData:(SharedLocalData)localData oldLocalData:(SharedLocalData)oldLocalData +- (void)updateState:(State::Shared)state oldState:(State::Shared)oldState { - _paragraphLocalData = std::static_pointer_cast(localData); - assert(_paragraphLocalData); + _state = std::static_pointer_cast(state); + assert(_state); [self setNeedsDisplay]; } - (void)prepareForRecycle { [super prepareForRecycle]; - _paragraphLocalData.reset(); + _state.reset(); } - (void)drawRect:(CGRect)rect { - if (!_paragraphLocalData) { + if (!_state) { return; } - SharedTextLayoutManager textLayoutManager = _paragraphLocalData->getTextLayoutManager(); + SharedTextLayoutManager textLayoutManager = _state->getData().layoutManager; RCTTextLayoutManager *nativeTextLayoutManager = (__bridge RCTTextLayoutManager *)textLayoutManager->getNativeTextLayoutManager(); CGRect frame = RCTCGRectFromRect(_layoutMetrics.getContentFrame()); - [nativeTextLayoutManager drawAttributedString:_paragraphLocalData->getAttributedString() + [nativeTextLayoutManager drawAttributedString:_state->getData().attributedString paragraphAttributes:_paragraphAttributes frame:frame]; } @@ -102,26 +102,26 @@ - (NSString *)accessibilityLabel return superAccessibilityLabel; } - if (!_paragraphLocalData) { + if (!_state) { return nil; } - return RCTNSStringFromString(_paragraphLocalData->getAttributedString().getString()); + return RCTNSStringFromString(_state->getData().attributedString.getString()); } - (SharedTouchEventEmitter)touchEventEmitterAtPoint:(CGPoint)point { - if (!_paragraphLocalData) { + if (!_state) { return _eventEmitter; } - SharedTextLayoutManager textLayoutManager = _paragraphLocalData->getTextLayoutManager(); + SharedTextLayoutManager textLayoutManager = _state->getData().layoutManager; RCTTextLayoutManager *nativeTextLayoutManager = (__bridge RCTTextLayoutManager *)textLayoutManager->getNativeTextLayoutManager(); CGRect frame = RCTCGRectFromRect(_layoutMetrics.getContentFrame()); SharedEventEmitter eventEmitter = - [nativeTextLayoutManager getEventEmitterWithAttributeString:_paragraphLocalData->getAttributedString() + [nativeTextLayoutManager getEventEmitterWithAttributeString:_state->getData().attributedString paragraphAttributes:_paragraphAttributes frame:frame atPoint:point]; diff --git a/ReactCommon/fabric/components/text/paragraph/ParagraphLocalData.cpp b/ReactCommon/fabric/components/text/paragraph/ParagraphLocalData.cpp deleted file mode 100644 index fb9426da9975f6..00000000000000 --- a/ReactCommon/fabric/components/text/paragraph/ParagraphLocalData.cpp +++ /dev/null @@ -1,58 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -#include "ParagraphLocalData.h" - -#include -#include - -namespace facebook { -namespace react { - -AttributedString ParagraphLocalData::getAttributedString() const { - return attributedString_; -} - -void ParagraphLocalData::setAttributedString( - AttributedString attributedString) { - ensureUnsealed(); - attributedString_ = attributedString; -} - -SharedTextLayoutManager ParagraphLocalData::getTextLayoutManager() const { - return textLayoutManager_; -} - -void ParagraphLocalData::setTextLayoutManager( - SharedTextLayoutManager textLayoutManager) { - ensureUnsealed(); - textLayoutManager_ = textLayoutManager; -} - -#ifdef ANDROID - -folly::dynamic ParagraphLocalData::getDynamic() const { - return toDynamic(*this); -} - -#endif - -#pragma mark - DebugStringConvertible - -#if RN_DEBUG_STRING_CONVERTIBLE -std::string ParagraphLocalData::getDebugName() const { - return "ParagraphLocalData"; -} - -SharedDebugStringConvertibleList ParagraphLocalData::getDebugProps() const { - return { - debugStringConvertibleItem("attributedString", attributedString_, "")}; -} -#endif - -} // namespace react -} // namespace facebook diff --git a/ReactCommon/fabric/components/text/paragraph/ParagraphLocalData.h b/ReactCommon/fabric/components/text/paragraph/ParagraphLocalData.h deleted file mode 100644 index 15e370573566ab..00000000000000 --- a/ReactCommon/fabric/components/text/paragraph/ParagraphLocalData.h +++ /dev/null @@ -1,58 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -#pragma once - -#include -#include -#include - -namespace facebook { -namespace react { - -class ParagraphLocalData; - -using SharedParagraphLocalData = std::shared_ptr; - -/* - * LocalData for component. - * Represents what to render and how to render. - */ -class ParagraphLocalData : public LocalData { - public: - /* - * All content of component represented as an `AttributedString`. - */ - AttributedString getAttributedString() const; - void setAttributedString(AttributedString attributedString); - - /* - * `TextLayoutManager` provides a connection to platform-specific - * text rendering infrastructure which is capable to render the - * `AttributedString`. - */ - SharedTextLayoutManager getTextLayoutManager() const; - void setTextLayoutManager(SharedTextLayoutManager textLayoutManager); - -#ifdef ANDROID - folly::dynamic getDynamic() const override; -#endif - -#pragma mark - DebugStringConvertible - -#if RN_DEBUG_STRING_CONVERTIBLE - std::string getDebugName() const override; - SharedDebugStringConvertibleList getDebugProps() const override; -#endif - - private: - AttributedString attributedString_; - SharedTextLayoutManager textLayoutManager_; -}; - -} // namespace react -} // namespace facebook diff --git a/ReactCommon/fabric/components/text/paragraph/ParagraphShadowNode.cpp b/ReactCommon/fabric/components/text/paragraph/ParagraphShadowNode.cpp index 028652ca5cbcc7..78dfb6f165c271 100644 --- a/ReactCommon/fabric/components/text/paragraph/ParagraphShadowNode.cpp +++ b/ReactCommon/fabric/components/text/paragraph/ParagraphShadowNode.cpp @@ -6,7 +6,7 @@ */ #include "ParagraphShadowNode.h" -#include "ParagraphLocalData.h" +#include "ParagraphState.h" #include "ParagraphMeasurementCache.h" namespace facebook { @@ -38,21 +38,16 @@ void ParagraphShadowNode::setMeasureCache( measureCache_ = cache; } -void ParagraphShadowNode::updateLocalDataIfNeeded() { +void ParagraphShadowNode::updateStateIfNeeded() { ensureUnsealed(); auto attributedString = getAttributedString(); - auto currentLocalData = - std::static_pointer_cast(getLocalData()); - if (currentLocalData && - currentLocalData->getAttributedString() == attributedString) { + auto const &state = getStateData(); + if (state.attributedString == attributedString) { return; } - auto localData = std::make_shared(); - localData->setAttributedString(std::move(attributedString)); - localData->setTextLayoutManager(textLayoutManager_); - setLocalData(localData); + setStateData({attributedString, textLayoutManager_}); } #pragma mark - LayoutableShadowNode @@ -83,7 +78,7 @@ Size ParagraphShadowNode::measure(LayoutConstraints layoutConstraints) const { } void ParagraphShadowNode::layout(LayoutContext layoutContext) { - updateLocalDataIfNeeded(); + updateStateIfNeeded(); ConcreteViewShadowNode::layout(layoutContext); } diff --git a/ReactCommon/fabric/components/text/paragraph/ParagraphShadowNode.h b/ReactCommon/fabric/components/text/paragraph/ParagraphShadowNode.h index 9d03af4a3a6006..4052b3c5f5781f 100644 --- a/ReactCommon/fabric/components/text/paragraph/ParagraphShadowNode.h +++ b/ReactCommon/fabric/components/text/paragraph/ParagraphShadowNode.h @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -32,7 +33,8 @@ using ParagraphEventEmitter = ViewEventEmitter; class ParagraphShadowNode : public ConcreteViewShadowNode< ParagraphComponentName, ParagraphProps, - ParagraphEventEmitter>, + ParagraphEventEmitter, + ParagraphState>, public BaseTextShadowNode { public: using ConcreteViewShadowNode::ConcreteViewShadowNode; @@ -45,7 +47,7 @@ class ParagraphShadowNode : public ConcreteViewShadowNode< /* * Associates a shared TextLayoutManager with the node. * `ParagraphShadowNode` uses the manager to measure text content - * and construct `ParagraphLocalData` objects. + * and construct `ParagraphState` objects. */ void setTextLayoutManager(SharedTextLayoutManager textLayoutManager); @@ -65,10 +67,10 @@ class ParagraphShadowNode : public ConcreteViewShadowNode< private: /* - * Creates a `LocalData` object (with `AttributedText` and + * Creates a `State` object (with `AttributedText` and * `TextLayoutManager`) if needed. */ - void updateLocalDataIfNeeded(); + void updateStateIfNeeded(); SharedTextLayoutManager textLayoutManager_; const ParagraphMeasurementCache *measureCache_; diff --git a/ReactCommon/fabric/components/text/paragraph/ParagraphState.cpp b/ReactCommon/fabric/components/text/paragraph/ParagraphState.cpp new file mode 100644 index 00000000000000..886bc73371929d --- /dev/null +++ b/ReactCommon/fabric/components/text/paragraph/ParagraphState.cpp @@ -0,0 +1,25 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include "ParagraphState.h" + +#include +#include + +namespace facebook { +namespace react { + +#ifdef ANDROID + +folly::dynamic ParagraphState::getDynamic() const { + return toDynamic(*this); +} + +#endif + +} // namespace react +} // namespace facebook diff --git a/ReactCommon/fabric/components/text/paragraph/ParagraphState.h b/ReactCommon/fabric/components/text/paragraph/ParagraphState.h new file mode 100644 index 00000000000000..ef4eab942c2233 --- /dev/null +++ b/ReactCommon/fabric/components/text/paragraph/ParagraphState.h @@ -0,0 +1,40 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +/* + * State for component. + * Represents what to render and how to render. + */ +class ParagraphState final { + public: + /* + * All content of component represented as an `AttributedString`. + */ + AttributedString attributedString; + + /* + * `TextLayoutManager` provides a connection to platform-specific + * text rendering infrastructure which is capable to render the + * `AttributedString`. + */ + SharedTextLayoutManager layoutManager; + +#ifdef ANDROID + folly::dynamic getDynamic() const; +#endif +}; + +} // namespace react +} // namespace facebook diff --git a/ReactCommon/fabric/components/text/paragraph/conversions.h b/ReactCommon/fabric/components/text/paragraph/conversions.h index dd507cefa0d7c3..fdb9b65bf04a59 100644 --- a/ReactCommon/fabric/components/text/paragraph/conversions.h +++ b/ReactCommon/fabric/components/text/paragraph/conversions.h @@ -5,19 +5,19 @@ #include #include -#include +#include namespace facebook { namespace react { #ifdef ANDROID -inline folly::dynamic toDynamic(const ParagraphLocalData ¶graphLocalData) { - folly::dynamic newLocalData = folly::dynamic::object(); - newLocalData["attributedString"] = - toDynamic(paragraphLocalData.getAttributedString()); - newLocalData["hash"] = newLocalData["attributedString"]["hash"]; - return newLocalData; +inline folly::dynamic toDynamic(const ParagraphState ¶graphState) { + folly::dynamic newState = folly::dynamic::object(); + newState["attributedString"] = + toDynamic(paragraphState->getData().attributedString); + newState["hash"] = newState["attributedString"]["hash"]; + return newState; } #endif