SliderShadowNode.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. /*
  2. * Copyright (c) Facebook, Inc. and its affiliates.
  3. *
  4. * This source code is licensed under the MIT license found in the
  5. * LICENSE file in the root directory of this source tree.
  6. */
  7. #include "SliderShadowNode.h"
  8. #include <react/core/LayoutContext.h>
  9. namespace facebook {
  10. namespace react {
  11. extern const char SliderComponentName[] = "Slider";
  12. void SliderShadowNode::setImageManager(const SharedImageManager &imageManager) {
  13. ensureUnsealed();
  14. imageManager_ = imageManager;
  15. }
  16. void SliderShadowNode::setSliderMeasurementsManager(
  17. const std::shared_ptr<SliderMeasurementsManager> &measurementsManager) {
  18. ensureUnsealed();
  19. measurementsManager_ = measurementsManager;
  20. }
  21. void SliderShadowNode::updateStateIfNeeded() {
  22. const auto &newTrackImageSource = getTrackImageSource();
  23. const auto &newMinimumTrackImageSource = getMinimumTrackImageSource();
  24. const auto &newMaximumTrackImageSource = getMaximumTrackImageSource();
  25. const auto &newThumbImageSource = getThumbImageSource();
  26. auto const &currentState = getStateData();
  27. auto trackImageSource = currentState.getTrackImageSource();
  28. auto minimumTrackImageSource = currentState.getMinimumTrackImageSource();
  29. auto maximumTrackImageSource = currentState.getMaximumTrackImageSource();
  30. auto thumbImageSource = currentState.getThumbImageSource();
  31. bool anyChanged = newTrackImageSource != trackImageSource ||
  32. newMinimumTrackImageSource != minimumTrackImageSource ||
  33. newMaximumTrackImageSource != maximumTrackImageSource ||
  34. newThumbImageSource != thumbImageSource;
  35. if (!anyChanged) {
  36. return;
  37. }
  38. // Now we are about to mutate the Shadow Node.
  39. ensureUnsealed();
  40. // It is not possible to copy or move image requests from SliderLocalData,
  41. // so instead we recreate any image requests (that may already be in-flight?)
  42. // TODO: check if multiple requests are cached or if it's a net loss
  43. auto state = SliderState{
  44. newTrackImageSource,
  45. imageManager_->requestImage(newTrackImageSource, getSurfaceId()),
  46. newMinimumTrackImageSource,
  47. imageManager_->requestImage(newMinimumTrackImageSource, getSurfaceId()),
  48. newMaximumTrackImageSource,
  49. imageManager_->requestImage(newMaximumTrackImageSource, getSurfaceId()),
  50. newThumbImageSource,
  51. imageManager_->requestImage(newThumbImageSource, getSurfaceId())};
  52. setStateData(std::move(state));
  53. }
  54. ImageSource SliderShadowNode::getTrackImageSource() const {
  55. return getConcreteProps().trackImage;
  56. }
  57. ImageSource SliderShadowNode::getMinimumTrackImageSource() const {
  58. return getConcreteProps().minimumTrackImage;
  59. }
  60. ImageSource SliderShadowNode::getMaximumTrackImageSource() const {
  61. return getConcreteProps().maximumTrackImage;
  62. }
  63. ImageSource SliderShadowNode::getThumbImageSource() const {
  64. return getConcreteProps().thumbImage;
  65. }
  66. #pragma mark - LayoutableShadowNode
  67. Size SliderShadowNode::measure(LayoutConstraints layoutConstraints) const {
  68. if (SliderMeasurementsManager::shouldMeasureSlider()) {
  69. return measurementsManager_->measure(getSurfaceId(), layoutConstraints);
  70. }
  71. return {};
  72. }
  73. void SliderShadowNode::layout(LayoutContext layoutContext) {
  74. updateStateIfNeeded();
  75. ConcreteViewShadowNode::layout(layoutContext);
  76. }
  77. } // namespace react
  78. } // namespace facebook