jiuyiUniapp/service/node_modules/react-native/ReactCommon/react/renderer/uimanager/PointerHoverTracker.h

72 lines
2.1 KiB
C++

/*
* Copyright (c) Meta Platforms, Inc. and 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 <functional>
#include <initializer_list>
#include <memory>
#include <react/renderer/components/view/primitives.h>
#include <react/renderer/core/ReactPrimitives.h>
#include <react/renderer/core/ShadowNode.h>
#include <react/renderer/uimanager/UIManager.h>
namespace facebook::react {
class PointerHoverTracker {
public:
using Unique = std::unique_ptr<PointerHoverTracker>;
using EventPath = std::vector<std::reference_wrapper<const ShadowNode>>;
PointerHoverTracker(ShadowNode::Shared target, const UIManager& uiManager);
const ShadowNode* getTarget(const UIManager& uiManager) const;
bool hasSameTarget(const PointerHoverTracker& other) const;
bool areAnyTargetsListeningToEvents(
std::initializer_list<ViewEvents::Offset> eventTypes,
const UIManager& uiManager) const;
/**
* Performs a diff between the current and given trackers and returns a tuple
* containing [1]: the nodes that have been removed and [2]: the nodes that
* have been added. Note that the order of these lists are from parents ->
* children.
*/
std::tuple<EventPath, EventPath> diffEventPath(
const PointerHoverTracker& other,
const UIManager& uiManager) const;
void markAsOld();
private:
/**
* Flag that lets the tracker know if it needs to fetch the latest version of
* the shadow node or not.
*/
bool isOldTracker_ = false;
ShadowNode::Shared root_;
ShadowNode::Shared target_;
/**
* A thin wrapper around `UIManager::getNewestCloneOfShadowNode` that only
* actually gets the newest clone only if the tracker is marked as "old".
*/
const ShadowNode* getLatestNode(
const ShadowNode& node,
const UIManager& uiManager) const;
/**
* Retrieves the list of shadow node references in the event's path starting
* from the target node to the root node.
*/
EventPath getEventPathTargets() const;
};
} // namespace facebook::react