Integrate State into ARTSurfaceViewShadowNode
Summary: This diff integrates ART state into ARTSurfaceViewShadowNode changelog: [Internal] Reviewed By: shergin Differential Revision: D21657611 fbshipit-source-id: 06bd4d610e2c52e0ef3bca423b93c9ad2318e8df
This commit is contained in:
Родитель
493d616521
Коммит
b7ab3aaf61
|
@ -6,11 +6,46 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <react/components/art/ARTSurfaceViewShadowNode.h>
|
#include <react/components/art/ARTSurfaceViewShadowNode.h>
|
||||||
|
#include <react/components/art/ARTBaseShadowNode.h>
|
||||||
|
#include <react/components/art/ARTGroupShadowNode.h>
|
||||||
|
#include <react/components/art/ARTSurfaceViewState.h>
|
||||||
|
|
||||||
namespace facebook {
|
namespace facebook {
|
||||||
namespace react {
|
namespace react {
|
||||||
|
|
||||||
|
using Content = ARTSurfaceViewShadowNode::Content;
|
||||||
|
|
||||||
extern const char ARTSurfaceViewComponentName[] = "ARTSurfaceView";
|
extern const char ARTSurfaceViewComponentName[] = "ARTSurfaceView";
|
||||||
|
|
||||||
|
void ARTSurfaceViewShadowNode::layout(LayoutContext layoutContext) {
|
||||||
|
ensureUnsealed();
|
||||||
|
auto content = getContent();
|
||||||
|
updateStateIfNeeded(content);
|
||||||
|
}
|
||||||
|
|
||||||
|
Content const &ARTSurfaceViewShadowNode::getContent() const {
|
||||||
|
if (content_.has_value()) {
|
||||||
|
return content_.value();
|
||||||
|
}
|
||||||
|
ensureUnsealed();
|
||||||
|
auto elements = Element::ListOfShared{};
|
||||||
|
ARTBaseShadowNode::buildElements(*this, elements);
|
||||||
|
content_ = Content{elements};
|
||||||
|
return content_.value();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ARTSurfaceViewShadowNode::updateStateIfNeeded(Content const &content) {
|
||||||
|
ensureUnsealed();
|
||||||
|
|
||||||
|
// TODO T64130144: Compare to make sure it is needed.
|
||||||
|
// auto &state = getStateData();
|
||||||
|
// if (state.attributedString == content.attributedString &&
|
||||||
|
// state.layoutManager == textLayoutManager_) {
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
|
||||||
|
setStateData(ARTSurfaceViewState{content.elements});
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace react
|
} // namespace react
|
||||||
} // namespace facebook
|
} // namespace facebook
|
||||||
|
|
|
@ -7,8 +7,9 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <folly/Optional.h>
|
|
||||||
#include <react/components/art/ARTSurfaceViewProps.h>
|
#include <react/components/art/ARTSurfaceViewProps.h>
|
||||||
|
#include <react/components/art/ARTSurfaceViewState.h>
|
||||||
|
#include <react/components/art/Element.h>
|
||||||
#include <react/components/view/ConcreteViewShadowNode.h>
|
#include <react/components/view/ConcreteViewShadowNode.h>
|
||||||
#include <react/core/ConcreteShadowNode.h>
|
#include <react/core/ConcreteShadowNode.h>
|
||||||
#include <react/core/LayoutContext.h>
|
#include <react/core/LayoutContext.h>
|
||||||
|
@ -19,16 +20,17 @@ namespace react {
|
||||||
|
|
||||||
extern const char ARTSurfaceViewComponentName[];
|
extern const char ARTSurfaceViewComponentName[];
|
||||||
|
|
||||||
using ParagraphEventEmitter = ViewEventEmitter;
|
using ARTSurfaceViewEventEmitter = ViewEventEmitter;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* `ShadowNode` for <Paragraph> component, represents <View>-like component
|
* `ShadowNode` for <ARTSurfaceViewState> component, represents <View>-like
|
||||||
* containing and displaying text. Text content is represented as nested <Text>
|
* component containing that will be used to display ARTElements.
|
||||||
* and <RawText> components.
|
|
||||||
*/
|
*/
|
||||||
class ARTSurfaceViewShadowNode : public ConcreteViewShadowNode<
|
class ARTSurfaceViewShadowNode : public ConcreteViewShadowNode<
|
||||||
ARTSurfaceViewComponentName,
|
ARTSurfaceViewComponentName,
|
||||||
ARTSurfaceViewProps> {
|
ARTSurfaceViewProps,
|
||||||
|
ARTSurfaceViewEventEmitter,
|
||||||
|
ARTSurfaceViewState> {
|
||||||
public:
|
public:
|
||||||
using ConcreteViewShadowNode::ConcreteViewShadowNode;
|
using ConcreteViewShadowNode::ConcreteViewShadowNode;
|
||||||
|
|
||||||
|
@ -37,6 +39,23 @@ class ARTSurfaceViewShadowNode : public ConcreteViewShadowNode<
|
||||||
traits.set(ShadowNodeTraits::Trait::LeafYogaNode);
|
traits.set(ShadowNodeTraits::Trait::LeafYogaNode);
|
||||||
return traits;
|
return traits;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class Content final {
|
||||||
|
public:
|
||||||
|
Element::ListOfShared elements{};
|
||||||
|
};
|
||||||
|
|
||||||
|
void layout(LayoutContext layoutContext) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Content const &getContent() const;
|
||||||
|
|
||||||
|
void updateStateIfNeeded(Content const &content);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Cached content of the subtree started from the node.
|
||||||
|
*/
|
||||||
|
mutable better::optional<Content> content_{};
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace react
|
} // namespace react
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
/*
|
||||||
|
* 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 <react/components/art/ARTSurfaceViewState.h>
|
||||||
|
#include <react/debug/debugStringConvertibleUtils.h>
|
||||||
|
|
||||||
|
namespace facebook {
|
||||||
|
namespace react {
|
||||||
|
|
||||||
|
#ifdef ANDROID
|
||||||
|
folly::dynamic ARTSurfaceViewState::getDynamic() const {
|
||||||
|
return folly::dynamic::object();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
} // namespace react
|
||||||
|
} // namespace facebook
|
|
@ -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 <react/components/art/Element.h>
|
||||||
|
|
||||||
|
#ifdef ANDROID
|
||||||
|
#include <folly/dynamic.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace facebook {
|
||||||
|
namespace react {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* State for <ARTSurfaceViewState> component.
|
||||||
|
* Represents what to render and how to render.
|
||||||
|
*/
|
||||||
|
class ARTSurfaceViewState final {
|
||||||
|
public:
|
||||||
|
Element::ListOfShared elements{};
|
||||||
|
|
||||||
|
#ifdef ANDROID
|
||||||
|
ARTSurfaceViewState(Element::ListOfShared const &elements)
|
||||||
|
: elements(elements) {}
|
||||||
|
ARTSurfaceViewState() = default;
|
||||||
|
ARTSurfaceViewState(
|
||||||
|
ARTSurfaceViewState const &previousState,
|
||||||
|
folly::dynamic const &data) {
|
||||||
|
assert(false && "Not supported");
|
||||||
|
};
|
||||||
|
folly::dynamic getDynamic() const;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace react
|
||||||
|
} // namespace facebook
|
Загрузка…
Ссылка в новой задаче