From 11f26e178bc0061e54de675933ce54ca694825ab Mon Sep 17 00:00:00 2001 From: zoulinken Date: Wed, 3 Apr 2024 17:27:10 +0800 Subject: [PATCH] =?UTF-8?q?C-API=20Scroll=E5=B1=9E=E6=80=A7get=E8=A1=A5?= =?UTF-8?q?=E5=85=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zoulinken Change-Id: Ib0176a04f82527224cd56085a9acff0384a2ffe5 --- .../core/components_ng/base/view_abstract.cpp | 5 ++- .../pattern/list/list_model_ng.cpp | 16 +++++---- .../pattern/scroll/scroll_model_ng.cpp | 35 +++++++++++++++---- .../pattern/scroll/scroll_model_ng.h | 2 +- .../scrollable/scrollable_paint_property.cpp | 1 + .../scrollable/scrollable_paint_property.h | 4 +-- .../scrollable/scrollable_properties.h | 7 ++++ .../core/interfaces/arkoala/arkoala_api.h | 5 +-- .../native/node/node_scroll_modifier.cpp | 19 ++++++++++ interfaces/native/node/style_modifier.cpp | 18 +++++++++- 10 files changed, 92 insertions(+), 20 deletions(-) diff --git a/frameworks/core/components_ng/base/view_abstract.cpp b/frameworks/core/components_ng/base/view_abstract.cpp index 2a710b23766..8bc64ee7f7c 100755 --- a/frameworks/core/components_ng/base/view_abstract.cpp +++ b/frameworks/core/components_ng/base/view_abstract.cpp @@ -3060,7 +3060,10 @@ void ViewAbstract::SetOnAreaChanged(FrameNode* frameNode, std::functionGetEventHub(); CHECK_NULL_VOID(eventHub); - eventHub->SetOnAreaChanged(std::move(onAreaChanged)); + auto pipeline = PipelineContext::GetCurrentContext(); + CHECK_NULL_VOID(pipeline); + frameNode->SetOnAreaChangeCallback(std::move(onAreaChanged)); + pipeline->AddOnAreaChangeNode(frameNode->GetId()); } void ViewAbstract::SetOnFocus(FrameNode* frameNode, OnFocusFunc &&onFocusCallback) diff --git a/frameworks/core/components_ng/pattern/list/list_model_ng.cpp b/frameworks/core/components_ng/pattern/list/list_model_ng.cpp index 8f41adad764..4534fe7f9de 100644 --- a/frameworks/core/components_ng/pattern/list/list_model_ng.cpp +++ b/frameworks/core/components_ng/pattern/list/list_model_ng.cpp @@ -18,6 +18,7 @@ #include "base/utils/utils.h" #include "core/components_ng/base/frame_node.h" #include "core/components_ng/base/view_stack_processor.h" +#include "core/components_ng/pattern/list/list_layout_property.h" #include "core/components_ng/pattern/list/list_pattern.h" #include "core/components_ng/pattern/list/list_position_controller.h" #include "core/components_ng/pattern/scroll/inner/scroll_bar.h" @@ -208,8 +209,11 @@ void ListModelNG::SetMultiSelectable(bool selectable) int32_t ListModelNG::GetScrollEnabled(FrameNode* frameNode) { CHECK_NULL_RETURN(frameNode, 0); - int32_t value = 0; - ACE_GET_NODE_LAYOUT_PROPERTY(ListLayoutProperty, ScrollEnabled, value, frameNode); + int32_t value = true; + auto layoutProperty = frameNode->GetLayoutProperty(); + if (layoutProperty->GetScrollEnabled()) { + value = layoutProperty->GetScrollEnabledValue(); + } return value; } @@ -505,8 +509,8 @@ void ListModelNG::SetListScrollBar(FrameNode* frameNode, int32_t barState) float ListModelNG::GetScrollBarWidth(FrameNode* frameNode) { CHECK_NULL_RETURN(frameNode, 0.0f); - auto value = frameNode->GetPaintProperty()->GetScrollBarWidth(); - return value->ConvertToVp(); + auto value = frameNode->GetPaintProperty()->GetBarWidth(); + return value.ConvertToVp(); } void ListModelNG::SetListScrollBarWidth(FrameNode* frameNode, const std::string& value) @@ -517,8 +521,8 @@ void ListModelNG::SetListScrollBarWidth(FrameNode* frameNode, const std::string& uint32_t ListModelNG::GetScrollBarColor(FrameNode* frameNode) { CHECK_NULL_RETURN(frameNode, 0); - auto value = frameNode->GetPaintProperty()->GetScrollBarColor(); - return value->GetValue(); + auto value = frameNode->GetPaintProperty()->GetBarColor(); + return value.GetValue(); } void ListModelNG::SetListScrollBarColor(FrameNode* frameNode, const std::string& value) diff --git a/frameworks/core/components_ng/pattern/scroll/scroll_model_ng.cpp b/frameworks/core/components_ng/pattern/scroll/scroll_model_ng.cpp index 11d2f650dd4..95b22fb40dc 100644 --- a/frameworks/core/components_ng/pattern/scroll/scroll_model_ng.cpp +++ b/frameworks/core/components_ng/pattern/scroll/scroll_model_ng.cpp @@ -131,7 +131,12 @@ RefPtr ScrollModelNG::CreateScrollBarProxy() int32_t ScrollModelNG::GetAxis(FrameNode *frameNode) { CHECK_NULL_RETURN(frameNode, 0); - return static_cast(frameNode->GetLayoutProperty()->GetAxisValue()); + int32_t value = 0; + auto layoutProperty = frameNode->GetLayoutProperty(); + if (layoutProperty->GetAxis()) { + value = static_cast(layoutProperty->GetAxisValue()); + } + return value; } void ScrollModelNG::SetAxis(Axis axis) @@ -321,6 +326,19 @@ void ScrollModelNG::SetFriction(FrameNode* frameNode, double friction) pattern->SetFriction(friction); } +ScrollSnapOptions ScrollModelNG::GetScrollSnap(FrameNode* frameNode) +{ + ScrollSnapOptions snapOptions; + CHECK_NULL_RETURN(frameNode, snapOptions); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_RETURN(pattern, snapOptions); + snapOptions.enableSnapToStart = pattern->GetEnableSnapToSide().first; + snapOptions.enableSnapToEnd = pattern->GetEnableSnapToSide().second; + snapOptions.snapAlign = static_cast(pattern->GetScrollSnapAlign()); + snapOptions.paginationParams = pattern->GetSnapPaginations(); + return snapOptions; +} + void ScrollModelNG::SetScrollSnap(FrameNode* frameNode, ScrollSnapAlign scrollSnapAlign, const Dimension& intervalSize, const std::vector& snapPaginations, const std::pair& enableSnapToSide) { @@ -340,8 +358,11 @@ void ScrollModelNG::SetScrollSnap(FrameNode* frameNode, ScrollSnapAlign scrollSn int32_t ScrollModelNG::GetScrollEnabled(FrameNode* frameNode) { CHECK_NULL_RETURN(frameNode, 0); - int32_t value = 0; - ACE_GET_NODE_LAYOUT_PROPERTY(ScrollLayoutProperty, ScrollEnabled, value, frameNode); + int32_t value = true; + auto layoutProperty = frameNode->GetLayoutProperty(); + if (layoutProperty->GetScrollEnabled()) { + value = layoutProperty->GetScrollEnabledValue(); + } return value; } @@ -353,8 +374,8 @@ void ScrollModelNG::SetScrollEnabled(FrameNode* frameNode, bool scrollEnabled) float ScrollModelNG::GetScrollBarWidth(FrameNode* frameNode) { CHECK_NULL_RETURN(frameNode, 0.0f); - auto value = frameNode->GetPaintProperty()->GetScrollBarWidth(); - return value->ConvertToVp(); + auto value = frameNode->GetPaintProperty()->GetBarWidth(); + return value.ConvertToVp(); } void ScrollModelNG::SetScrollBarWidth(const Dimension& dimension) @@ -365,8 +386,8 @@ void ScrollModelNG::SetScrollBarWidth(const Dimension& dimension) uint32_t ScrollModelNG::GetScrollBarColor(FrameNode* frameNode) { CHECK_NULL_RETURN(frameNode, 0); - auto value = frameNode->GetPaintProperty()->GetScrollBarColor(); - return value->GetValue(); + auto value = frameNode->GetPaintProperty()->GetBarColor(); + return value.GetValue(); } void ScrollModelNG::SetScrollBarColor(const Color& color) diff --git a/frameworks/core/components_ng/pattern/scroll/scroll_model_ng.h b/frameworks/core/components_ng/pattern/scroll/scroll_model_ng.h index 100d68c0a4c..e33a0c66a5b 100644 --- a/frameworks/core/components_ng/pattern/scroll/scroll_model_ng.h +++ b/frameworks/core/components_ng/pattern/scroll/scroll_model_ng.h @@ -66,7 +66,7 @@ public: static void SetScrollEnabled(FrameNode* frameNode, bool scrollEnabled); static float GetFriction(FrameNode* frameNode); static void SetFriction(FrameNode* frameNode, double friction); - static int32_t GetScrollSnap(FrameNode* frameNode); + static ScrollSnapOptions GetScrollSnap(FrameNode* frameNode); static void SetScrollSnap(FrameNode* frameNode, ScrollSnapAlign scrollSnapAlign, const Dimension& intervalSize, const std::vector& snapPaginations, const std::pair& enableSnapToSide); static int32_t GetScrollBar(FrameNode* frameNode); diff --git a/frameworks/core/components_ng/pattern/scrollable/scrollable_paint_property.cpp b/frameworks/core/components_ng/pattern/scrollable/scrollable_paint_property.cpp index e20a73aea3a..bdef1188dff 100644 --- a/frameworks/core/components_ng/pattern/scrollable/scrollable_paint_property.cpp +++ b/frameworks/core/components_ng/pattern/scrollable/scrollable_paint_property.cpp @@ -49,6 +49,7 @@ Dimension ScrollablePaintProperty::GetBarWidth() const auto scrollBarTheme = themeManager->GetTheme(); CHECK_NULL_RETURN(scrollBarTheme, Dimension()); auto defaultScrollBarWidth = scrollBarTheme->GetNormalWidth(); + LOGI("kkk GetBarWidth"); return propScrollBarProperty_ ? propScrollBarProperty_->propScrollBarWidth.value_or(defaultScrollBarWidth) : defaultScrollBarWidth; } diff --git a/frameworks/core/components_ng/pattern/scrollable/scrollable_paint_property.h b/frameworks/core/components_ng/pattern/scrollable/scrollable_paint_property.h index 33515e81126..084f421a834 100644 --- a/frameworks/core/components_ng/pattern/scrollable/scrollable_paint_property.h +++ b/frameworks/core/components_ng/pattern/scrollable/scrollable_paint_property.h @@ -57,10 +57,10 @@ public: ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(ScrollBarProperty, ScrollBarMode, DisplayMode, PROPERTY_UPDATE_RENDER); ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(ScrollBarProperty, ScrollBarWidth, Dimension, PROPERTY_UPDATE_RENDER); ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(ScrollBarProperty, ScrollBarColor, Color, PROPERTY_UPDATE_RENDER); + Dimension GetBarWidth() const; + Color GetBarColor() const; private: - Color GetBarColor() const; - Dimension GetBarWidth() const; std::string GetBarStateString() const; }; } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/scrollable/scrollable_properties.h b/frameworks/core/components_ng/pattern/scrollable/scrollable_properties.h index 764ddaecafd..5eb8d697526 100644 --- a/frameworks/core/components_ng/pattern/scrollable/scrollable_properties.h +++ b/frameworks/core/components_ng/pattern/scrollable/scrollable_properties.h @@ -88,6 +88,13 @@ struct ScrollFrameResult { } }; +struct ScrollSnapOptions { + int32_t snapAlign; + int32_t enableSnapToStart; + int32_t enableSnapToEnd; + std::vector paginationParams; +}; + struct NestedScrollOptions { NestedScrollMode forward; NestedScrollMode backward; diff --git a/frameworks/core/interfaces/arkoala/arkoala_api.h b/frameworks/core/interfaces/arkoala/arkoala_api.h index e80b38d4ed2..f5c1d916660 100644 --- a/frameworks/core/interfaces/arkoala/arkoala_api.h +++ b/frameworks/core/interfaces/arkoala/arkoala_api.h @@ -26,10 +26,10 @@ extern "C" { #endif -#define ARKUI_FULL_API_VERSION 87 +#define ARKUI_FULL_API_VERSION 88 // When changing ARKUI_BASIC_API_VERSION, ARKUI_FULL_API_VERSION must be // increased as well. -#define ARKUI_NODE_API_VERSION 87 +#define ARKUI_NODE_API_VERSION 88 #define ARKUI_BASIC_API_VERSION 7 #define ARKUI_EXTENDED_API_VERSION 7 @@ -1895,6 +1895,7 @@ struct ArkUIScrollModifier { ArkUI_Float32 (*getScrollFriction)(ArkUINodeHandle node); void (*setScrollFriction)(ArkUINodeHandle node, ArkUI_Float32 value); void (*resetScrollFriction)(ArkUINodeHandle node); + ArkUI_Int32 (*getScrollScrollSnap)(ArkUINodeHandle node, ArkUI_Int32* values); void (*setScrollScrollSnap)(ArkUINodeHandle node, const ArkUI_Float32* paginationValue, ArkUI_Int32 paginationSize, const ArkUI_Int32* paginationParam, ArkUI_Int32 paramSize); void (*resetScrollScrollSnap)(ArkUINodeHandle node); diff --git a/frameworks/core/interfaces/native/node/node_scroll_modifier.cpp b/frameworks/core/interfaces/native/node/node_scroll_modifier.cpp index 30922905b68..b6219662d06 100644 --- a/frameworks/core/interfaces/native/node/node_scroll_modifier.cpp +++ b/frameworks/core/interfaces/native/node/node_scroll_modifier.cpp @@ -14,10 +14,12 @@ */ #include "core/interfaces/native/node/node_scroll_modifier.h" +#include "base/utils/utils.h" #include "core/components/common/layout/constants.h" #include "core/components/scroll/scroll_bar_theme.h" #include "core/components_ng/base/frame_node.h" #include "core/components_ng/pattern/scroll/scroll_model_ng.h" +#include "core/components_ng/pattern/scrollable/scrollable_properties.h" #include "core/interfaces/native/node/node_api.h" #include "frameworks/bridge/common/utils/utils.h" #include "core/components/scroll/scroll_position_controller.h" @@ -126,6 +128,22 @@ void ResetScrollFriction(ArkUINodeHandle node) ScrollModelNG::SetFriction(frameNode, FRICTION_DEFAULT); } +ArkUI_Int32 GetScrollScrollSnap(ArkUINodeHandle node, ArkUI_Int32* values) +{ + auto* frameNode = reinterpret_cast(node); + CHECK_NULL_RETURN(frameNode, 0); + ScrollSnapOptions options = ScrollModelNG::GetScrollSnap(frameNode); + values[0] = static_cast(options.snapAlign); + values[1] = static_cast(options.enableSnapToStart); + values[2] = static_cast(options.enableSnapToEnd); + auto index = 3; + for (auto item : options.paginationParams) { + values[index] = item.ConvertToVp(); + index++; + } + return index; +} + void SetScrollScrollSnap(ArkUINodeHandle node, const ArkUI_Float32* paginationValue, ArkUI_Int32 paginationSize, const int32_t* paginationParam, ArkUI_Int32 paramSize) { @@ -425,6 +443,7 @@ const ArkUIScrollModifier* GetScrollModifier() GetScrollFriction, SetScrollFriction, ResetScrollFriction, + GetScrollScrollSnap, SetScrollScrollSnap, ResetScrollScrollSnap, GetScrollScrollBar, diff --git a/interfaces/native/node/style_modifier.cpp b/interfaces/native/node/style_modifier.cpp index 844204ecf7b..d3c9480e312 100644 --- a/interfaces/native/node/style_modifier.cpp +++ b/interfaces/native/node/style_modifier.cpp @@ -3468,6 +3468,22 @@ void ResetScrollFriction(ArkUI_NodeHandle node) } } +const ArkUI_AttributeItem* GetScrollScrollSnap(ArkUI_NodeHandle node) +{ + ArkUI_Int32 values[32]; + auto size = GetFullImpl()->getNodeModifiers()->getScrollModifier()->getScrollScrollSnap(node->uiNodeHandle, values); + + //size index + g_numberValues[0].i32 = values[0]; + g_numberValues[1].i32 = values[1]; + g_numberValues[2].i32 = values[2]; + for (auto i = 0; i < size - 3; i++) { + g_numberValues[i].i32 = values[i]; + } + g_attributeItem.size = size; + return &g_attributeItem; +} + int32_t SetScrollScrollSnap(ArkUI_NodeHandle node, const ArkUI_AttributeItem* item) { auto actualSize = CheckAttributeItemArray(item, REQUIRED_FOUR_PARAM); @@ -9468,7 +9484,7 @@ const ArkUI_AttributeItem* GetScrollAttribute(ArkUI_NodeHandle node, int32_t sub { static Getter* getters[] = { GetScrollScrollBar, GetScrollScrollBarWidth, GetScrollScrollBarColor, GetScrollScrollable, GetScrollEdgeEffect, GetScrollEnableScrollInteraction, GetScrollFriction, - nullptr, GetScrollNestedScroll, GetScrollOffset, GetScrollEdge, GetScrollEnablePaging }; + GetScrollScrollSnap, GetScrollNestedScroll, GetScrollOffset, GetScrollEdge, GetScrollEnablePaging }; if (subTypeId >= sizeof(getters) / sizeof(Getter*)) { TAG_LOGE(AceLogTag::ACE_NATIVE_NODE, "slider node attribute: %{public}d NOT IMPLEMENT", subTypeId); return nullptr; -- Gitee