diff --git a/frameworks/core/components_ng/pattern/text/span_node.h b/frameworks/core/components_ng/pattern/text/span_node.h index 012ef0fe785f86a1648b0d2c42b07829b97636c5..5443a7127d549ecacba348f4e1fe4fb08c3c59b2 100644 --- a/frameworks/core/components_ng/pattern/text/span_node.h +++ b/frameworks/core/components_ng/pattern/text/span_node.h @@ -599,6 +599,57 @@ public: std::optional> onDraw; }; +class ACE_EXPORT CustomSpanNode : public FrameNode { + DECLARE_ACE_TYPE(CustomSpanNode, FrameNode); + +public: + static RefPtr CreateFrameNode(int32_t nodeId) + { + auto customSpanNode = AceType::MakeRefPtr( + V2::CUSTOM_SPAN_NODE_ETS_TAG, nodeId); + customSpanNode->InitializePatternAndContext(); + ElementRegister::GetInstance()->AddUINode(customSpanNode); + return customSpanNode; + } + + static RefPtr GetOrCreateSpanNode( + const std::string& tag, int32_t nodeId) + { + auto frameNode = GetFrameNode(tag, nodeId); + CHECK_NULL_RETURN(!frameNode, AceType::DynamicCast(frameNode)); + auto customSpanNode = AceType::MakeRefPtr(tag, nodeId); + customSpanNode->InitializePatternAndContext(); + ElementRegister::GetInstance()->AddUINode(customSpanNode); + return customSpanNode; + } + + CustomSpanNode(const std::string& tag, int32_t nodeId) : + FrameNode(tag, nodeId, AceType::MakeRefPtr()) {} + ~CustomSpanNode() override = default; + + const RefPtr& GetSpanItem() const + { + return customSpanItem_; + } + + bool IsAtomicNode() const override + { + return false; + } + + void DumpInfo() override + { + FrameNode::DumpInfo(); + CHECK_NULL_VOID(customSpanItem_); + customSpanItem_->DumpInfo(); + } + +private: + RefPtr customSpanItem_ = MakeRefPtr(); + + ACE_DISALLOW_COPY_AND_MOVE(CustomSpanNode); +}; + struct ImageSpanItem : public PlaceholderSpanItem { DECLARE_ACE_TYPE(ImageSpanItem, PlaceholderSpanItem); diff --git a/frameworks/core/components_ng/pattern/text/text_pattern.cpp b/frameworks/core/components_ng/pattern/text/text_pattern.cpp index fe387e5d9cf01e774d43f802d58e30d6b60acc1e..afd1a2a89633cea8cd15f70119de4a63d8c2f6f6 100644 --- a/frameworks/core/components_ng/pattern/text/text_pattern.cpp +++ b/frameworks/core/components_ng/pattern/text/text_pattern.cpp @@ -2552,6 +2552,10 @@ void TextPattern::CollectSpanNodes(std::stack nodes, bool& isSpanH if (tag == V2::PLACEHOLDER_SPAN_ETS_TAG) { continue; } + if (tag == V2::CUSTOM_SPAN_NODE_ETS_TAG) { + AddChildSpanItem(current.node); + childNodes_.emplace_back(current.node); + } const auto& nextChildren = current.node->GetChildren(); if (nextChildren.empty()) { continue; @@ -2706,6 +2710,13 @@ void TextPattern::AddChildSpanItem(const RefPtr& child) placeholderSpan->placeholderSpanNodeId = placeholderSpanNode->GetId(); spans_.emplace_back(placeholderSpan); } + } else if (child->GetTag() == V2::CUSTOM_SPAN_NODE_ETS_TAG) { + auto customSpanNode = DynamicCast(child); + if (customSpanNode) { + auto customSpan = customSpanNode->GetSpanItem(); + customSpan->placeholderSpanNodeId = customSpanNode->GetId(); + spans_.emplace_back(customSpan); + } } } diff --git a/frameworks/core/components_v2/inspector/inspector_constants.cpp b/frameworks/core/components_v2/inspector/inspector_constants.cpp index 2c218919a90de23b92c1fee1bb1f8f428ba8a86f..13efe56e99095ce072cbeabf11c29162b78e8522 100644 --- a/frameworks/core/components_v2/inspector/inspector_constants.cpp +++ b/frameworks/core/components_v2/inspector/inspector_constants.cpp @@ -606,4 +606,7 @@ const char MOVING_PHOTO_ETS_TAG[] = "MovingPhoto"; // LinearIndicator const char LINEARINDICATOR_COMPONENT_TAG[] = "LinearIndicatorComponent"; const char LINEARINDICATOR_ETS_TAG[] = "LinearIndicator"; + +// CustomSpanNode +const char CUSTOM_SPAN_NODE_ETS_TAG[] = "CustomSpanNode"; } // namespace OHOS::Ace::V2 diff --git a/frameworks/core/components_v2/inspector/inspector_constants.h b/frameworks/core/components_v2/inspector/inspector_constants.h index fe4b0fdcd8e925ee1527160b1a6ddf6bc896cad7..c039743620f1549601d5e2a460c1f12ff8996ab6 100644 --- a/frameworks/core/components_v2/inspector/inspector_constants.h +++ b/frameworks/core/components_v2/inspector/inspector_constants.h @@ -615,5 +615,8 @@ ACE_FORCE_EXPORT extern const char MOVING_PHOTO_ETS_TAG[]; // LinearIndicator ACE_EXPORT extern const char LINEARINDICATOR_COMPONENT_TAG[]; ACE_EXPORT extern const char LINEARINDICATOR_ETS_TAG[]; + +// CustomSpanNode +ACE_EXPORT extern const char CUSTOM_SPAN_NODE_ETS_TAG[]; } // namespace OHOS::Ace::V2 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_V2_INSPECTOR_INSPECTOR_CONSTANTS_H diff --git a/frameworks/core/interfaces/arkoala/arkoala_api.h b/frameworks/core/interfaces/arkoala/arkoala_api.h index 074704b95b06ae917c4c2a5d003d3a4b95819b8c..b434dff00de73906265cbdffc04bf171922001c9 100644 --- a/frameworks/core/interfaces/arkoala/arkoala_api.h +++ b/frameworks/core/interfaces/arkoala/arkoala_api.h @@ -685,7 +685,8 @@ enum ArkUINodeType { ARKUI_IMAGE_ANIMATOR, ARKUI_CIRCLE, ARKUI_TAB_CONTENT, - ARKUI_NAVIGATION + ARKUI_NAVIGATION, + ARKUI_CUSTOM_SPAN, }; enum ArkUIEventCategory { @@ -1092,6 +1093,8 @@ struct ArkUICustomNodeEvent { ArkUI_Int64 extraParam; ArkUI_Int64 canvas; ArkUI_Int32 data[8]; + ArkUIEventCallbackArg numberData[ARKUI_ASYNC_EVENT_ARGS_COUNT]; + ArkUIEventCallbackArg numberReturnData[ARKUI_ASYNC_EVENT_ARGS_COUNT]; }; struct ArkUIExpectedFrameRateRange { @@ -4752,6 +4755,7 @@ struct ArkUIExtendedNodeAPI { ArkUI_Int32 (*getCustomMethodFlag)(ArkUINodeHandle node); void (*registerCustomNodeAsyncEvent)(ArkUINodeHandle nodePtr, ArkUI_Int32 kind, void* extraParam); + void (*registerCustomSpanAsyncEvent)(ArkUINodeHandle nodePtr, ArkUI_Int32 kind, void* extraParam); ArkUI_Int32 (*unregisterCustomNodeAsyncEvent)(ArkUINodeHandle nodePtr, ArkUI_Int32 kind); void (*registerCustomNodeAsyncEventReceiver)(void (*eventReceiver)(ArkUICustomNodeEvent* event)); diff --git a/frameworks/core/interfaces/native/node/node_api.cpp b/frameworks/core/interfaces/native/node/node_api.cpp index b4e12954c8e0c8a0da6bb8f911767e7e8becb2df..ff3318484041c3d9e47ee5d3f3ebda8aa1238610 100644 --- a/frameworks/core/interfaces/native/node/node_api.cpp +++ b/frameworks/core/interfaces/native/node/node_api.cpp @@ -51,6 +51,7 @@ #include "core/interfaces/native/node/node_scroll_modifier.h" #include "core/interfaces/native/node/node_slider_modifier.h" #include "core/interfaces/native/node/node_swiper_modifier.h" +#include "core/interfaces/native/node/node_span_modifier.h" #include "core/interfaces/native/node/node_text_area_modifier.h" #include "core/interfaces/native/node/node_text_input_modifier.h" #include "core/interfaces/native/node/node_text_modifier.h" @@ -1323,6 +1324,20 @@ void RegisterCustomNodeAsyncEvent(ArkUINodeHandle node, int32_t eventType, void* } } +void RegisterCustomSpanAsyncEvent(ArkUINodeHandle node, int32_t eventType, void* extraParam) +{ + switch (eventType) { + case ArkUIAPINodeFlags::CUSTOM_MEASURE: + NodeModifier::SetCustomSpanOnMeasure(node, extraParam); + break; + case ArkUIAPINodeFlags::CUSTOM_DRAW: + NodeModifier::SetCustomSpanOnDraw(node, extraParam); + break; + default: + break; + } +} + ArkUI_Int32 UnregisterCustomNodeEvent(ArkUINodeHandle node, ArkUI_Int32 eventType) { auto companion = ViewModel::GetCompanion(node); @@ -1763,6 +1778,7 @@ ArkUIExtendedNodeAPI impl_extended = { SetCustomMethodFlag, GetCustomMethodFlag, RegisterCustomNodeAsyncEvent, + RegisterCustomSpanAsyncEvent, UnregisterCustomNodeEvent, RegisterCustomNodeEventReceiver, SetCustomCallback, // setCustomCallback diff --git a/frameworks/core/interfaces/native/node/node_span_modifier.cpp b/frameworks/core/interfaces/native/node/node_span_modifier.cpp index acc452c513e15b24c8715dd62088a5a765123ca9..0a967b302c6b5b7ce8aa1581bb8b3fc3b29c8a2c 100644 --- a/frameworks/core/interfaces/native/node/node_span_modifier.cpp +++ b/frameworks/core/interfaces/native/node/node_span_modifier.cpp @@ -44,6 +44,7 @@ constexpr int NUM_0 = 0; constexpr int NUM_1 = 1; constexpr int NUM_2 = 2; constexpr int NUM_3 = 3; +constexpr int NUM_32 = 32; constexpr int DEFAULT_LENGTH = 4; void SetSpanContent(ArkUINodeHandle node, const char* value) { @@ -458,6 +459,49 @@ const ArkUISpanModifier* GetSpanModifier() ResetTextTextShadow, GetTextShadow }; return &modifier; } + +void SetCustomSpanOnMeasure(ArkUINodeHandle node, void* extraParam) +{ + auto* frameNode = reinterpret_cast(node); + CHECK_NULL_VOID(frameNode); + std::function onMeasureFunc = + [node, extraParam](CustomSpanMeasureInfo customSpanMeasureInfo) -> CustomSpanMetrics { + ArkUICustomNodeEvent event; + event.kind = ArkUIAPINodeFlags::CUSTOM_MEASURE; + event.extraParam = reinterpret_cast(extraParam); + event.numberData[0].f32 = customSpanMeasureInfo.fontSize; + SendArkUIAsyncCustomEvent(&event); + float width = event.numberReturnData[0].f32; + float height = event.numberReturnData[1].f32; + return { width, height }; + }; + frameNode->GetSpanItem()->onMeasure = onMeasureFunc; +} + +void SetCustomSpanOnDraw(ArkUINodeHandle node, void* extraParam) +{ + auto* frameNode = reinterpret_cast(node); + CHECK_NULL_VOID(frameNode); + std::function onDrawFunc = + [node, extraParam](NG::DrawingContext& context, CustomSpanOptions customSpanOptions) { + auto canvas = reinterpret_cast(&context.canvas); + ArkUICustomNodeEvent event; + event.kind = ArkUIAPINodeFlags::CUSTOM_DRAW; + event.extraParam = reinterpret_cast(extraParam); + event.data[NUM_0] = (ArkUI_Int32)(canvas & 0xffffffff); + event.data[NUM_1] = + (ArkUI_Int32)((static_cast(canvas) >> NUM_32) & 0xffffffff); + event.data[NUM_2] = context.width; + event.data[NUM_3] = context.height; + event.canvas = reinterpret_cast(&context.canvas); + event.numberData[0].f32 = customSpanOptions.x; + event.numberData[1].f32 = customSpanOptions.lineTop; + event.numberData[2].f32 = customSpanOptions.lineBottom; + event.numberData[3].f32 = customSpanOptions.baseline; + SendArkUIAsyncCustomEvent(&event); + }; + frameNode->GetSpanItem()->onDraw = onDrawFunc; +} } // namespace NodeModifier } // namespace OHOS::Ace::NG \ No newline at end of file diff --git a/frameworks/core/interfaces/native/node/node_span_modifier.h b/frameworks/core/interfaces/native/node/node_span_modifier.h index d2992a1ee155aeb8537ff110163da4954a500ba7..f6beead145df5873e2821580756d5b06645427b3 100644 --- a/frameworks/core/interfaces/native/node/node_span_modifier.h +++ b/frameworks/core/interfaces/native/node/node_span_modifier.h @@ -19,6 +19,8 @@ #include "core/interfaces/native/node/node_api.h" namespace OHOS::Ace::NG::NodeModifier { -const ArkUISpanModifier* GetSpanModifier(); + const ArkUISpanModifier* GetSpanModifier(); + void SetCustomSpanOnMeasure(ArkUINodeHandle node, void* extraParam); + void SetCustomSpanOnDraw(ArkUINodeHandle node, void* extraParam); } #endif \ No newline at end of file diff --git a/frameworks/core/interfaces/native/node/view_model.cpp b/frameworks/core/interfaces/native/node/view_model.cpp index 34c9e3f047a934900f6012b30424323640a9f180..04561fdce59979214dbca00772e9f149f9fc5248 100644 --- a/frameworks/core/interfaces/native/node/view_model.cpp +++ b/frameworks/core/interfaces/native/node/view_model.cpp @@ -37,6 +37,7 @@ #include "core/components_ng/pattern/stack/stack_model_ng.h" #include "core/components_ng/pattern/tabs/tab_content_model_ng.h" #include "core/components_ng/pattern/tabs/tabs_model_ng.h" +#include "core/components_ng/pattern/text/span/span_object.h" #include "core/components_ng/pattern/text_field/text_field_model_ng.h" #include "core/components_ng/pattern/text/image_span_view.h" #include "core/components_ng/pattern/text/text_model_ng.h" @@ -478,6 +479,14 @@ void* createTabContentNode(ArkUI_Int32 nodeId) return AceType::RawPtr(frameNode); } +void* createCustomSpanNode(ArkUI_Int32 nodeId) +{ + auto customSpanNode = CustomSpanNode::CreateFrameNode(nodeId); + CHECK_NULL_RETURN(customSpanNode, nullptr); + customSpanNode->IncRefCount(); + return AceType::RawPtr(customSpanNode); +} + using createArkUIFrameNode = void*(ArkUI_Int32 nodeId); void* CreateNode(ArkUINodeType tag, ArkUI_Int32 nodeId) { @@ -539,6 +548,7 @@ void* CreateNode(ArkUINodeType tag, ArkUI_Int32 nodeId) createCircleNode, createTabContentNode, createNavigationNode, + createCustomSpanNode, }; if (tag >= sizeof(createArkUIFrameNodes) / sizeof(createArkUIFrameNode*)) { TAG_LOGE(AceLogTag::ACE_NATIVE_NODE, "fail to create %{public}d type of node", tag); diff --git a/interfaces/native/libace.ndk.json b/interfaces/native/libace.ndk.json index a8bc0a8421df067d6718ddad536a3add1f66dc89..28294f0de18e5c451e690244017717c75f27faa1 100644 --- a/interfaces/native/libace.ndk.json +++ b/interfaces/native/libace.ndk.json @@ -1982,5 +1982,69 @@ { "first_introduced": "12", "name": "OH_ArkUI_DialogDismissEvent_GetDismissReason" + }, + { + "first_introduced": "12", + "name": "OH_ArkUI_NodeCustomEvent_GetCustomSpanMeasureInfo" + }, + { + "first_introduced": "12", + "name": "OH_ArkUI_NodeCustomEvent_SetCustomSpanMetrics" + }, + { + "first_introduced": "12", + "name": "OH_ArkUI_NodeCustomEvent_GetCustomSpanDrawInfo" + }, + { + "first_introduced": "12", + "name": "OH_ArkUI_CustomSpanMeasureInfo_Create" + }, + { + "first_introduced": "12", + "name": "OH_ArkUI_CustomSpanMeasureInfo_Dispose" + }, + { + "first_introduced": "12", + "name": "OH_ArkUI_CustomSpanMeasureInfo_GetFontSize" + }, + { + "first_introduced": "12", + "name": "OH_ArkUI_CustomSpanMetrics_Create" + }, + { + "first_introduced": "12", + "name": "OH_ArkUI_CustomSpanMetrics_Dispose" + }, + { + "first_introduced": "12", + "name": "OH_ArkUI_CustomSpanMetrics_SetWidth" + }, + { + "first_introduced": "12", + "name": "OH_ArkUI_CustomSpanMetrics_SetHeight" + }, + { + "first_introduced": "12", + "name": "OH_ArkUI_CustomSpanDrawInfo_Create" + }, + { + "first_introduced": "12", + "name": "OH_ArkUI_CustomSpanDrawInfo_Dispose" + }, + { + "first_introduced": "12", + "name": "OH_ArkUI_CustomSpanDrawInfo_GetXOffset" + }, + { + "first_introduced": "12", + "name": "OH_ArkUI_CustomSpanDrawInfo_GetLineTop" + }, + { + "first_introduced": "12", + "name": "OH_ArkUI_CustomSpanDrawInfo_GetLineBottom" + }, + { + "first_introduced": "12", + "name": "OH_ArkUI_CustomSpanDrawInfo_GetBaseLine" } ] diff --git a/interfaces/native/native_node.h b/interfaces/native/native_node.h index a80b9e03c7b67aa4520fd44c4c811c6cdce64c8e..b096713c38fb3ad8d5b96d3efd924f7e0ad910ee 100644 --- a/interfaces/native/native_node.h +++ b/interfaces/native/native_node.h @@ -121,6 +121,8 @@ typedef enum { ARKUI_NODE_GRID, /** Grid item. */ ARKUI_NODE_GRID_ITEM, + /** Custom_Span. */ + ARKUI_NODE_CUSTOM_SPAN, } ArkUI_NodeType; /** @@ -7130,6 +7132,45 @@ ArkUI_NodeHandle OH_ArkUI_NodeCustomEvent_GetNodeHandle(ArkUI_NodeCustomEvent* e */ ArkUI_NodeCustomEventType OH_ArkUI_NodeCustomEvent_GetEventType(ArkUI_NodeCustomEvent* event); +/** +* @brief 通过自定义组件事件获取自定义段落组件的测量信息。 +* +* @param event 自定义组件事件。 +* @param info 需要获取的测量信息。 +* @return 错误码。 +* {@link ARKUI_ERROR_CODE_NO_ERROR} 成功。 +* {@link ARKUI_ERROR_CODE_PARAM_INVALID} 函数参数异常。 +* @since 12 +*/ +int32_t OH_ArkUI_NodeCustomEvent_GetCustomSpanMeasureInfo( + ArkUI_NodeCustomEvent* event, ArkUI_CustomSpanMeasureInfo* info); + +/** +* @brief 通过自定义组件事件设置自定义段落的度量指标。 +* +* @param event 自定义组件事件。 +* @param metrics 需要获取的度量指标信息。 +* @return 错误码。 +* {@link ARKUI_ERROR_CODE_NO_ERROR} 成功。 +* {@link ARKUI_ERROR_CODE_PARAM_INVALID} 函数参数异常。 +* @since 12 +*/ +int32_t OH_ArkUI_NodeCustomEvent_SetCustomSpanMetrics( + ArkUI_NodeCustomEvent* event, ArkUI_CustomSpanMetrics* metrics); + +/** +* @brief 通过自定义组件事件获取自定义段落组件的绘制信息。 +* +* @param event 自定义组件事件。 +* @param event 需要获取的绘制信息。 +* @return 错误码。 +* {@link ARKUI_ERROR_CODE_NO_ERROR} 成功。 +* {@link ARKUI_ERROR_CODE_PARAM_INVALID} 函数参数异常。 +* @since 12 +*/ +int32_t OH_ArkUI_NodeCustomEvent_GetCustomSpanDrawInfo( + ArkUI_NodeCustomEvent* event, ArkUI_CustomSpanDrawInfo* info); + /** * @brief Adds a component to a node content. * diff --git a/interfaces/native/native_type.h b/interfaces/native/native_type.h index d09d089fcc1ebd91168d8d4eae278e89df7c6c80..b0a715dc0ca8cc7e4a8c67b123cfdd259a3a1902 100644 --- a/interfaces/native/native_type.h +++ b/interfaces/native/native_type.h @@ -2039,6 +2039,27 @@ typedef struct { float perspective; } ArkUI_RotationOptions; +/** + * @brief defines the measure info of the custom span. + * + * @since 12 + */ +typedef struct ArkUI_CustomSpanMeasureInfo ArkUI_CustomSpanMeasureInfo; + +/** + * @brief defines the metrics of the custom span. + * + * @since 12 + */ +typedef struct ArkUI_CustomSpanMetrics ArkUI_CustomSpanMetrics; + +/** + * @brief defines the draw info of the custom span. + * + * @since 12 + */ +typedef struct ArkUI_CustomSpanDrawInfo ArkUI_CustomSpanDrawInfo; + /** * @brief Creates a size constraint. * @@ -3587,6 +3608,120 @@ int32_t OH_ArkUI_ListChildrenMainSizeOption_UpdateSize(ArkUI_ListChildrenMainSiz * @since 12 */ float OH_ArkUI_ListChildrenMainSizeOption_GetMainSize(ArkUI_ListChildrenMainSize* option, int32_t index); + +/** + * @brief 创建自定义段落组件测量信息。 + * + * @return CustomSpanMeasureInfo实例。 + * @since 12 +*/ +ArkUI_CustomSpanMeasureInfo* OH_ArkUI_CustomSpanMeasureInfo_Create(); + +/** + * @brief 销毁自定义段落组件测量信息。 + * + * @since 12 +*/ +void OH_ArkUI_CustomSpanMeasureInfo_Dispose(ArkUI_CustomSpanMeasureInfo* info); + +/** + * @brief 获取自定义段落组件的字体大小。 + * + * @param info 自定义段落组件测量信息指针。 + * @return 字体大小。若函数参数异常,返回-1.0f。 + * @since 12 +*/ +float OH_ArkUI_CustomSpanMeasureInfo_GetFontSize(ArkUI_CustomSpanMeasureInfo* info); + +/** + * @brief 创建自定义段落组件度量信息。 + * + * @return CustomSpanMetrics实例。 + * @since 12 +*/ +ArkUI_CustomSpanMetrics* OH_ArkUI_CustomSpanMetrics_Create(); + +/** + * @brief 销毁自定义段落组件度量信息。 + * + * @since 12 +*/ +void OH_ArkUI_CustomSpanMetrics_Dispose(ArkUI_CustomSpanMetrics* metrics); + +/** + * @brief 设置自定义段落组件的宽度。 + * + * @param metrics CustomSpanMetrics实例。 + * @param width 宽度大小,单位为px。 + * @return 错误码。 + * {@link ARKUI_ERROR_CODE_NO_ERROR} 成功。 + * {@link ARKUI_ERROR_CODE_PARAM_INVALID} 函数参数异常。 + * @since 12 +*/ +int32_t OH_ArkUI_CustomSpanMetrics_SetWidth(ArkUI_CustomSpanMetrics* metrics, float width); + +/** + * @brief 设置自定义段落组件的高度。 + * + * @param metrics CustomSpanMetrics实例。 + * @param height 高度大小,单位为px。 + * @return 错误码。 + * {@link ARKUI_ERROR_CODE_NO_ERROR} 成功。 + * {@link ARKUI_ERROR_CODE_PARAM_INVALID} 函数参数异常。 + * @since 12 +*/ +int32_t OH_ArkUI_CustomSpanMetrics_SetHeight(ArkUI_CustomSpanMetrics* metrics, float height); + +/** + * @brief 创建自定义段落组件绘制信息。 + * + * @return CustomSpanDrawInfo实例。 + * @since 12 +*/ +ArkUI_CustomSpanDrawInfo* OH_ArkUI_CustomSpanDrawInfo_Create(); + +/** + * @brief 销毁自定义段落组件绘制信息。 + * + * @since 12 +*/ +void OH_ArkUI_CustomSpanDrawInfo_Dispose(ArkUI_CustomSpanDrawInfo* info); + +/** + * @brief 获取自定义段落组件相对于挂载组件的x轴偏移值。 + * + * @param info 自定义段落组件绘制信息指针。 + * @return x轴偏移值。若函数参数异常,返回0.0f。 + * @since 12 +*/ +float OH_ArkUI_CustomSpanDrawInfo_GetXOffset(ArkUI_CustomSpanDrawInfo* info); + +/** + * @brief 获取自定义段落组件相对于挂载组件的上边距。 + * + * @param info 自定义段落组件绘制信息指针。 + * @return 上边距值。若函数参数异常,返回0.0f。 + * @since 12 +*/ +float OH_ArkUI_CustomSpanDrawInfo_GetLineTop(ArkUI_CustomSpanDrawInfo* info); + +/** + * @brief 获取自定义段落组件相对于挂载组件的下边距。 + * + * @param info 自定义段落组件绘制信息指针。 + * @return 下边距值。若函数参数异常,返回0.0f。 + * @since 12 +*/ +float OH_ArkUI_CustomSpanDrawInfo_GetLineBottom(ArkUI_CustomSpanDrawInfo* info); + +/** + * @brief 获取自定义段落组件相对于挂载组件的基线偏移量。 + * + * @param info 自定义段落组件绘制信息指针。 + * @return 基线偏移量值。若函数参数异常,返回0.0f。 + * @since 12 +*/ +float OH_ArkUI_CustomSpanDrawInfo_GetBaseLine(ArkUI_CustomSpanDrawInfo* info); #ifdef __cplusplus }; #endif diff --git a/interfaces/native/node/native_node_extented.cpp b/interfaces/native/node/native_node_extented.cpp index c9addd4de2d5195b6f73e7f60689bb92b138f10f..bf444f6d1cd87b195f433cde63d87780d0e3ef85 100644 --- a/interfaces/native/node/native_node_extented.cpp +++ b/interfaces/native/node/native_node_extented.cpp @@ -114,6 +114,143 @@ ArkUI_NodeCustomEventType OH_ArkUI_NodeCustomEvent_GetEventType(ArkUI_NodeCustom return static_cast(event->event->kind); } +int32_t OH_ArkUI_NodeCustomEvent_GetCustomSpanMeasureInfo( + ArkUI_NodeCustomEvent* event, ArkUI_CustomSpanMeasureInfo* info) +{ + if (!event || !info || !event->event) { + return ARKUI_ERROR_CODE_PARAM_INVALID; + } + info->fontSize = event->event->numberData[0].f32; + return ARKUI_ERROR_CODE_NO_ERROR; +} + +int32_t OH_ArkUI_NodeCustomEvent_SetCustomSpanMetrics( + ArkUI_NodeCustomEvent* event, ArkUI_CustomSpanMetrics* metrics) +{ + if (!event || !metrics || !event->event) { + return ARKUI_ERROR_CODE_PARAM_INVALID; + } + event->event->numberReturnData[0].f32 = metrics->width; + event->event->numberReturnData[1].f32 = metrics->height; + return ARKUI_ERROR_CODE_NO_ERROR; +} + +int32_t OH_ArkUI_NodeCustomEvent_GetCustomSpanDrawInfo( + ArkUI_NodeCustomEvent* event, ArkUI_CustomSpanDrawInfo* info) +{ + if (!event || !info || !event->event) { + return ARKUI_ERROR_CODE_PARAM_INVALID; + } + info->optionsX = event->event->numberData[0].f32; + info->optionsLineTop = event->event->numberData[1].f32; + info->optionsLineBottom = event->event->numberData[2].f32; + info->optionsBaseLine = event->event->numberData[3].f32; + return ARKUI_ERROR_CODE_NO_ERROR; +} + +ArkUI_CustomSpanMeasureInfo* OH_ArkUI_CustomSpanMeasureInfo_Create() +{ + ArkUI_CustomSpanMeasureInfo* info = new ArkUI_CustomSpanMeasureInfo { 0 }; + return info; +} + +void OH_ArkUI_CustomSpanMeasureInfo_Dispose(ArkUI_CustomSpanMeasureInfo* info) +{ + if (!info) { + return; + } + delete info; + info = nullptr; +} + +float OH_ArkUI_CustomSpanMeasureInfo_GetFontSize(ArkUI_CustomSpanMeasureInfo* info) +{ + if (!info) { + return 0.0f; + } + return info->fontSize; +} + +ArkUI_CustomSpanMetrics* OH_ArkUI_CustomSpanMetrics_Create() +{ + ArkUI_CustomSpanMetrics* metrics = new ArkUI_CustomSpanMetrics { 0, 0 }; + return metrics; +} + +void OH_ArkUI_CustomSpanMetrics_Dispose(ArkUI_CustomSpanMetrics* metrics) +{ + if (!metrics) { + return; + } + delete metrics; + metrics = nullptr; +} + +int32_t OH_ArkUI_CustomSpanMetrics_SetWidth(ArkUI_CustomSpanMetrics* metrics, float width) +{ + if (!metrics) { + return ARKUI_ERROR_CODE_PARAM_INVALID; + } + metrics->width = width; + return ARKUI_ERROR_CODE_NO_ERROR; +} + +int32_t OH_ArkUI_CustomSpanMetrics_SetHeight(ArkUI_CustomSpanMetrics* metrics, float height) +{ + if (!metrics) { + return ARKUI_ERROR_CODE_PARAM_INVALID; + } + metrics->height = height; + return ARKUI_ERROR_CODE_NO_ERROR; +} + +ArkUI_CustomSpanDrawInfo* OH_ArkUI_CustomSpanDrawInfo_Create() +{ + ArkUI_CustomSpanDrawInfo* info = new ArkUI_CustomSpanDrawInfo { 0, 0, 0, 0 }; + return info; +} + +void OH_ArkUI_CustomSpanDrawInfo_Dispose(ArkUI_CustomSpanDrawInfo* info) +{ + if (!info) { + return; + } + delete info; + info = nullptr; +} + +float OH_ArkUI_CustomSpanDrawInfo_GetXOffset(ArkUI_CustomSpanDrawInfo* info) +{ + if (!info) { + return 0.0f; + } + return info->optionsX; +} + +float OH_ArkUI_CustomSpanDrawInfo_GetLineTop(ArkUI_CustomSpanDrawInfo* info) +{ + if (!info) { + return 0.0f; + } + return info->optionsLineTop; +} + +float OH_ArkUI_CustomSpanDrawInfo_GetLineBottom(ArkUI_CustomSpanDrawInfo* info) +{ + if (!info) { + return 0.0f; + } + return info->optionsLineBottom; +} + +float OH_ArkUI_CustomSpanDrawInfo_GetBaseLine(ArkUI_CustomSpanDrawInfo* info) +{ + if (!info) { + return 0.0f; + } + return info->optionsBaseLine; +} + int32_t OH_ArkUI_LayoutConstraint_GetMaxWidth(const ArkUI_LayoutConstraint* constraint) { CHECK_NULL_RETURN(constraint, -1); diff --git a/interfaces/native/node/node_extened.cpp b/interfaces/native/node/node_extened.cpp index c6ecd9596db125594740d2814fcdae390b2b62b9..a1dea25b25a74fc68cb0da94f3486e70e2e655d7 100644 --- a/interfaces/native/node/node_extened.cpp +++ b/interfaces/native/node/node_extened.cpp @@ -68,7 +68,7 @@ int32_t RegisterNodeCustomEvent(ArkUI_NodeHandle node, ArkUI_NodeCustomEventType } if (eventType & ARKUI_NODE_CUSTOM_EVENT_ON_MEASURE) { - if (node->type == ARKUI_NODE_CUSTOM) { + if (node->type == ARKUI_NODE_CUSTOM || node->type == ARKUI_NODE_CUSTOM_SPAN) { NodeAddExtraData(node, ARKUI_NODE_CUSTOM_EVENT_ON_MEASURE, targetId, userData); } else { return ERROR_CODE_NATIVE_IMPL_TYPE_NOT_SUPPORTED; @@ -95,8 +95,13 @@ int32_t RegisterNodeCustomEvent(ArkUI_NodeHandle node, ArkUI_NodeCustomEventType NodeAddExtraData(node, ARKUI_NODE_CUSTOM_EVENT_ON_OVERLAY_DRAW, targetId, userData); } auto* impl = GetFullImpl(); - impl->getExtendedAPI()->registerCustomNodeAsyncEvent( - node->uiNodeHandle, eventType, reinterpret_cast(node)); + if (node->type == ARKUI_NODE_CUSTOM_SPAN) { + impl->getExtendedAPI()->registerCustomSpanAsyncEvent( + node->uiNodeHandle, eventType, reinterpret_cast(node)); + } else { + impl->getExtendedAPI()->registerCustomNodeAsyncEvent( + node->uiNodeHandle, eventType, reinterpret_cast(node)); + } return ERROR_CODE_NO_ERROR; } diff --git a/interfaces/native/node/node_extened.h b/interfaces/native/node/node_extened.h index 9485dbd9d617c6c6a270b5c9243135a982864a99..da161ccb6b8bf74b5af65b4d6f98def493082a33 100644 --- a/interfaces/native/node/node_extened.h +++ b/interfaces/native/node/node_extened.h @@ -140,6 +140,22 @@ struct ArkUI_AccessibilityValue { ArkUI_OptionalCharPtr text; }; +struct ArkUI_CustomSpanMeasureInfo { + float fontSize; +}; + +struct ArkUI_CustomSpanMetrics { + float width; + float height; +}; + +struct ArkUI_CustomSpanDrawInfo { + float optionsX; + float optionsLineTop; + float optionsLineBottom; + float optionsBaseLine; +}; + #ifdef __cplusplus }; #endif diff --git a/interfaces/native/node/node_model.cpp b/interfaces/native/node/node_model.cpp index 006d9993c070c8e6b2d918f415a5552247565e45..5e680d4846bced698f42f25fea6634d11d5e1b3b 100644 --- a/interfaces/native/node/node_model.cpp +++ b/interfaces/native/node/node_model.cpp @@ -147,7 +147,8 @@ ArkUI_NodeHandle CreateNode(ArkUI_NodeType type) ARKUI_CHECKBOX, ARKUI_XCOMPONENT, ARKUI_DATE_PICKER, ARKUI_TIME_PICKER, ARKUI_TEXT_PICKER, ARKUI_CALENDAR_PICKER, ARKUI_SLIDER, ARKUI_RADIO, ARKUI_IMAGE_ANIMATOR, ARKUI_STACK, ARKUI_SWIPER, ARKUI_SCROLL, ARKUI_LIST, ARKUI_LIST_ITEM, ARKUI_LIST_ITEM_GROUP, ARKUI_COLUMN, ARKUI_ROW, ARKUI_FLEX, - ARKUI_REFRESH, ARKUI_WATER_FLOW, ARKUI_FLOW_ITEM, ARKUI_RELATIVE_CONTAINER, ARKUI_GRID, ARKUI_GRID_ITEM }; + ARKUI_REFRESH, ARKUI_WATER_FLOW, ARKUI_FLOW_ITEM, ARKUI_RELATIVE_CONTAINER, ARKUI_GRID, ARKUI_GRID_ITEM, + ARKUI_CUSTOM_SPAN }; // already check in entry point. uint32_t nodeType = type < MAX_NODE_SCOPE_NUM ? type : (type - MAX_NODE_SCOPE_NUM + BASIC_COMPONENT_NUM); auto* impl = GetFullImpl(); diff --git a/interfaces/native/node/style_modifier.cpp b/interfaces/native/node/style_modifier.cpp index cd76222822bc0ab2cd43a701fe553a8ed9b50141..abbbd2234dae33fc0996ef9c1280157e8e68937d 100644 --- a/interfaces/native/node/style_modifier.cpp +++ b/interfaces/native/node/style_modifier.cpp @@ -273,6 +273,7 @@ std::unordered_map ACCESSIBILITY_ROLE_CONVERT_PROPERTY_MA { static_cast(ARKUI_NODE_RELATIVE_CONTAINER), "RelativeContainer" }, { static_cast(ARKUI_NODE_GRID), "Grid" }, { static_cast(ARKUI_NODE_GRID_ITEM), "GridItem" }, + { static_cast(ARKUI_NODE_CUSTOM_SPAN), "CustomSpan" }, }; std::unordered_map ACCESSIBILITY_ROLE_CONVERT_NATIVE_MAP = { @@ -310,6 +311,7 @@ std::unordered_map ACCESSIBILITY_ROLE_CONVERT_NATIVE_MAP { "RelativeContainer", static_cast(ARKUI_NODE_RELATIVE_CONTAINER) }, { "Grid", static_cast(ARKUI_NODE_GRID) }, { "GridItem", static_cast(ARKUI_NODE_GRID_ITEM) }, + { "CustomSpan", static_cast(ARKUI_NODE_CUSTOM_SPAN) }, }; void ResetAttributeItem() @@ -12479,6 +12481,9 @@ bool CheckIfAttributeLegal(ArkUI_NodeHandle node, int32_t type) auto it = SPAN_ATTRIBUTES_MAP.find(type); return it != SPAN_ATTRIBUTES_MAP.end(); } + if (node->type == ARKUI_NODE_CUSTOM_SPAN) { + return false; + } return true; }