From 3849e8fdddc46d632d13591e1fd0cdcfac8c3416 Mon Sep 17 00:00:00 2001 From: lvzikai Date: Mon, 7 Jul 2025 22:07:47 +0800 Subject: [PATCH 1/2] Navigation api adapt Signed-off-by: lvzikai Change-Id: I63f97766c4d4e627278936c7f7f90208ecf2e505 --- .../navigation/navigation_model_static.cpp | 8 ++++ .../navigation/navigation_model_static.h | 1 + .../navrouter/navdestination_model_static.cpp | 18 ++++++++ .../navrouter/navdestination_model_static.h | 2 + .../nav_destination_modifier.cpp | 24 +++++++++-- .../implementation/navigation_modifier.cpp | 4 ++ .../interfaces/native/utility/converter.cpp | 38 ++++++++++++++++ .../interfaces/native/utility/converter.h | 4 ++ .../native/utility/converter_enums.cpp | 43 +++++++++++++++++++ 9 files changed, 138 insertions(+), 4 deletions(-) diff --git a/frameworks/core/components_ng/pattern/navigation/navigation_model_static.cpp b/frameworks/core/components_ng/pattern/navigation/navigation_model_static.cpp index a58ea5bea33..48d782b3177 100644 --- a/frameworks/core/components_ng/pattern/navigation/navigation_model_static.cpp +++ b/frameworks/core/components_ng/pattern/navigation/navigation_model_static.cpp @@ -710,6 +710,14 @@ void NavigationModelStatic::SetToolbarMorebuttonOptions(FrameNode* frameNode, Mo NavigationToolbarUtil::SetToolbarMoreButtonOptions(navBarNode, std::move(opt)); } +void NavigationModelStatic::SetHideItemText(FrameNode* frameNode, bool isHideItemText) +{ + auto navigationGroupNode = AceType::DynamicCast(frameNode); + CHECK_NULL_VOID(navigationGroupNode); + auto navBarNode = AceType::DynamicCast(navigationGroupNode->GetNavBarNode()); + NavigationToolbarUtil::SetHideItemText(navBarNode, isHideItemText); +} + void NavigationModelStatic::SetToolbarOptions(FrameNode* frameNode, NavigationToolbarOptions&& opt) { auto navigationGroupNode = AceType::DynamicCast(frameNode); diff --git a/frameworks/core/components_ng/pattern/navigation/navigation_model_static.h b/frameworks/core/components_ng/pattern/navigation/navigation_model_static.h index e5f17deae16..8c0afa7c2bf 100644 --- a/frameworks/core/components_ng/pattern/navigation/navigation_model_static.h +++ b/frameworks/core/components_ng/pattern/navigation/navigation_model_static.h @@ -54,6 +54,7 @@ public: static void SetToolBarItems(FrameNode* frameNode, std::vector&& toolBarItems); static void SetToolbarConfiguration(FrameNode* frameNode, std::vector&& toolBarItems); + static void SetHideItemText(FrameNode* frameNode, bool isHideItemText); static void SetToolbarOptions(FrameNode* frameNode, NavigationToolbarOptions&& opt); static void SetToolbarMorebuttonOptions(FrameNode* frameNode, MoreButtonOptions&& opt); static void ParseCommonTitle( diff --git a/frameworks/core/components_ng/pattern/navrouter/navdestination_model_static.cpp b/frameworks/core/components_ng/pattern/navrouter/navdestination_model_static.cpp index acf3641ca26..032960cef9d 100644 --- a/frameworks/core/components_ng/pattern/navrouter/navdestination_model_static.cpp +++ b/frameworks/core/components_ng/pattern/navrouter/navdestination_model_static.cpp @@ -176,6 +176,15 @@ void NavDestinationModelStatic::SetOnInactive(FrameNode* frameNode, std::functio eventHub->SetOnInactive(onInactive); } +void NavDestinationModelStatic::SetCustomTransition(FrameNode* frameNode, + NG::NavDestinationTransitionDelegate transitionDelegate) +{ + CHECK_NULL_VOID(frameNode && transitionDelegate); + auto node = AceType::DynamicCast(Referenced::Claim(frameNode)); + CHECK_NULL_VOID(node); + node->SetNavDestinationTransitionDelegate(std::move(transitionDelegate)); +} + void NavDestinationModelStatic::SetMenuOptions(FrameNode* frameNode, NavigationMenuOptions&& opt) { // CHECK_NULL_VOID(frameNode); @@ -627,4 +636,13 @@ void NavDestinationModelStatic::SetEnableStatusBar( CHECK_NULL_VOID(node); node->SetStatusBarConfig(statusBar); } + +void NavDestinationModelStatic::SetEnableNavigationIndicator(FrameNode* frameNode, + const std::optional& navigationIndicator) +{ + CHECK_NULL_VOID(frameNode); + auto node = AceType::DynamicCast(Referenced::Claim(frameNode)); + CHECK_NULL_VOID(node); + node->SetNavigationIndicatorConfig(navigationIndicator); +} } // namespace OHOS::Ace::NG \ No newline at end of file diff --git a/frameworks/core/components_ng/pattern/navrouter/navdestination_model_static.h b/frameworks/core/components_ng/pattern/navrouter/navdestination_model_static.h index e109794a824..bb27a6e87a9 100644 --- a/frameworks/core/components_ng/pattern/navrouter/navdestination_model_static.h +++ b/frameworks/core/components_ng/pattern/navrouter/navdestination_model_static.h @@ -40,6 +40,7 @@ public: static void SetSystemTransitionType(FrameNode* frameNode, NG::NavigationSystemTransitionType type); static void SetOnActive(FrameNode* frameNode, std::function&& onActive); static void SetOnInactive(FrameNode* frameNode, std::function&& onInactive); + static void SetCustomTransition(FrameNode* frameNode, NG::NavDestinationTransitionDelegate transitionDelegate); static void SetHideTitleBar(FrameNode* frameNode, bool hideTitleBar, bool animated = false); static void SetOnShown(FrameNode* frameNode, std::function&& onShow); static void SetOnHidden(FrameNode* frameNode, std::function&& onHidden); @@ -64,6 +65,7 @@ public: static void SetTitleHeight(FrameNode* frameNode, const Dimension& titleHeight, bool isValid = true); static void SetHideBackButton(FrameNode* frameNode, bool hideBackButton); static void SetEnableStatusBar(FrameNode* frameNode, const std::optional>& statusBar); + static void SetEnableNavigationIndicator(FrameNode* frameNode, const std::optional& navigationIndicator); }; } // namespace OHOS::Ace::NG diff --git a/frameworks/core/interfaces/native/implementation/nav_destination_modifier.cpp b/frameworks/core/interfaces/native/implementation/nav_destination_modifier.cpp index 6d4ddc74e28..263706d2972 100644 --- a/frameworks/core/interfaces/native/implementation/nav_destination_modifier.cpp +++ b/frameworks/core/interfaces/native/implementation/nav_destination_modifier.cpp @@ -493,8 +493,21 @@ void CustomTransitionImpl(Ark_NativePointer node, { auto frameNode = reinterpret_cast(node); CHECK_NULL_VOID(frameNode); - // auto convValue = value ? Converter::OptConvert(*value) : std::nullopt; - // NavDestinationModelNG::SetCustomTransition(frameNode, convValue); + CHECK_NULL_VOID(value); + if (value->tag == InteropTag::INTEROP_TAG_UNDEFINED) { + return; + } + auto onNavigationAnimation = [callback = CallbackHelper(value->value)](NG::NavigationOperation operation, + bool isEnter)-> std::optional> { + std::vector allTransitions; + auto navOperation = static_cast(operation); + auto arkIsEnter = Converter::ArkValue(isEnter); + auto resultOpt = callback.InvokeWithOptConvertResult>, + Opt_Array_NavDestinationTransition, + Callback_Opt_Array_NavDestinationTransition_Void>(navOperation, arkIsEnter); + return resultOpt.value_or(allTransitions); + }; + NavDestinationModelStatic::SetCustomTransition(frameNode, onNavigationAnimation); } void OnNewParamImpl(Ark_NativePointer node, const Opt_Callback_Object_Void* value) @@ -517,8 +530,11 @@ void EnableNavigationIndicatorImpl(Ark_NativePointer node, { auto frameNode = reinterpret_cast(node); CHECK_NULL_VOID(frameNode); - // auto convValue = value ? Converter::OptConvert(*value) : std::nullopt; - // NavDestinationModelNG::SetEnableNavigationIndicator(frameNode, convValue); + auto enabled = false; + if (value->tag != InteropTag::INTEROP_TAG_UNDEFINED) { + enabled = Converter::OptConvert(*value).value_or(false); + } + NavDestinationModelStatic::SetEnableNavigationIndicator(frameNode, enabled); } void TitleImpl(Ark_NativePointer node, const Opt_Type_NavDestinationAttribute_title_value* value, diff --git a/frameworks/core/interfaces/native/implementation/navigation_modifier.cpp b/frameworks/core/interfaces/native/implementation/navigation_modifier.cpp index eacbd72a6c4..a24aefe44a3 100644 --- a/frameworks/core/interfaces/native/implementation/navigation_modifier.cpp +++ b/frameworks/core/interfaces/native/implementation/navigation_modifier.cpp @@ -641,6 +641,10 @@ void ToolbarConfigurationImpl(Ark_NativePointer node, } } + if (options->tag != InteropTag::INTEROP_TAG_UNDEFINED) { + auto isHideItemText = Converter::OptConvert(options->value.hideItemValue).value_or(false); + NavigationModelStatic::SetHideItemText(frameNode, isHideItemText); + } if (options->tag != InteropTag::INTEROP_TAG_UNDEFINED) { NG::NavigationBackgroundOptions bgOptions = Converter::Convert(options->value); diff --git a/frameworks/core/interfaces/native/utility/converter.cpp b/frameworks/core/interfaces/native/utility/converter.cpp index fe437bc2b53..9dd631d1e54 100644 --- a/frameworks/core/interfaces/native/utility/converter.cpp +++ b/frameworks/core/interfaces/native/utility/converter.cpp @@ -53,6 +53,7 @@ namespace { constexpr float GRADIENT_MIN_POSITION = 0.0f; constexpr float GRADIENT_DEFAULT_MIN_POSITION = 0.0f; constexpr uint16_t UTF16_BOM = 0xFEFF; + constexpr int32_t DEFAULT_NAVDESTINATION_TRANSITION_DURATION = 1000; int32_t ConvertToVariableFontWeight(OHOS::Ace::FontWeight fontWeight) { OHOS::Ace::FontWeight convertValue; @@ -3066,6 +3067,9 @@ void AssignCast(std::optional& dst, const Ark_Navigat dst = NavigationTitlebarOptions(); dst->bgOptions = Converter::Convert(value); dst->brOptions = Converter::Convert(value); + if (value.enableHoverMode.tag != InteropTag::INTEROP_TAG_UNDEFINED) { + dst->enableHoverMode = Converter::OptConvert(value.enableHoverMode).value_or(false); + } } template<> @@ -3162,6 +3166,40 @@ void AssignCast(std::optional& dst, const Opt_Navigati dst->transition = std::move(transitionCallback); } +template<> +void AssignCast(std::optional>& dst, + const Opt_Array_NavDestinationTransition& src) +{ + std::vector allTransitions; + if (src.tag == InteropTag::INTEROP_TAG_UNDEFINED) { + return; + } + int length = src.value.length; + for (int i = 0; i < length; i++) { + NG::NavDestinationTransition indexValue = Converter::Convert(src.value.array[i]); + allTransitions.push_back(indexValue); + } + dst = allTransitions; +} + +template<> +NG::NavDestinationTransition Convert(const Ark_NavDestinationTransition& src) +{ + NG::NavDestinationTransition dst; + dst.event = [callback = CallbackHelper(src.event)]() { + callback.Invoke(); + }; + if (src.onTransitionEnd.tag != InteropTag::INTEROP_TAG_UNDEFINED) { + dst.onTransitionEnd = [callback = CallbackHelper(src.onTransitionEnd.value)]() { + callback.Invoke(); + }; + } + dst.duration = Converter::OptConvert(src.duration).value_or(DEFAULT_NAVDESTINATION_TRANSITION_DURATION); + dst.delay = Converter::OptConvert(src.delay).value_or(0); + dst.curve = Converter::OptConvert>(src.curve).value_or(Curves::EASE_IN_OUT); + return dst; +} + template<> void AssignCast(std::optional& dst, const Opt_ShapePoint& src) { diff --git a/frameworks/core/interfaces/native/utility/converter.h b/frameworks/core/interfaces/native/utility/converter.h index be9c1291452..b0a802dfb54 100644 --- a/frameworks/core/interfaces/native/utility/converter.h +++ b/frameworks/core/interfaces/native/utility/converter.h @@ -539,6 +539,7 @@ namespace Converter { template<> ListItemGroupIndex Convert(const Ark_VisibleListContentInfo& src); template<> ListItemIndex Convert(const Ark_VisibleListContentInfo& src); template<> MenuOptionsParam Convert(const Ark_TextMenuItem& src); + template<> NG::NavDestinationTransition Convert(const Ark_NavDestinationTransition& src); template<> NG::NavToolbarItemStatus Convert(const Opt_ToolbarItemStatus& src); template<> NG::NavigationBackgroundOptions Convert(const Ark_MoreButtonOptions& src); template<> NG::NavigationBackgroundOptions Convert(const Ark_NavigationTitleOptions& src); @@ -671,6 +672,7 @@ namespace Converter { template<> void AssignCast(std::optional& dst, const Ark_ControlSize& src); template<> void AssignCast(std::optional& dst, const Ark_CopyOptions& src); template<> void AssignCast(std::optional& dst, const Ark_CrownSensitivity& src); + template<> void AssignCast(std::optional>& dst, const Ark_Curve& src); template<> void AssignCast(std::optional& dst, const Ark_DataPanelType& src); template<> void AssignCast(std::optional& dst, const Ark_DateTimeOptions& src); template<> void AssignCast(std::optional& dst, const Ark_DialogAlignment& src); @@ -728,6 +730,8 @@ namespace Converter { template<> void AssignCast(std::optional& dst, const Ark_ModalTransition& src); template<> void AssignCast(std::optional& dst, const Ark_ModifierKey& src); template<> void AssignCast(std::optional& dst, const Opt_NavigationAnimatedTransition& src); + template<> void AssignCast(std::optional>& dst, + const Opt_Array_NavDestinationTransition& src); template<> void AssignCast(std::optional& dst, const Ark_NavDestinationMode& src); template<> void AssignCast(std::optional& dst, const Ark_NavRouteMode& src); template<> void AssignCast(std::optional& dst, const Ark_NavigationOptions& src); diff --git a/frameworks/core/interfaces/native/utility/converter_enums.cpp b/frameworks/core/interfaces/native/utility/converter_enums.cpp index b2ebebdacc1..ca8058da21f 100644 --- a/frameworks/core/interfaces/native/utility/converter_enums.cpp +++ b/frameworks/core/interfaces/native/utility/converter_enums.cpp @@ -2303,4 +2303,47 @@ void AssignCast(std::optional& dst, const Ark_DividerMode& src) } } } + +template<> +void AssignCast(std::optional& dst, const Ark_LevelMode& src) +{ + switch (src) { + case ARK_LEVEL_MODE_OVERLAY: dst = LevelMode::OVERLAY; break; + case ARK_LEVEL_MODE_EMBEDDED: dst = LevelMode::EMBEDDED; break; + default: LOGE("Unexpected enum value in Ark_LevelMode: %{public}d", src); + } +} +template<> +void AssignCast(std::optional& dst, const Ark_ImmersiveMode& src) +{ + switch (src) { + case ARK_IMMERSIVE_MODE_DEFAULT: dst = ImmersiveMode::DEFAULT; break; + case ARK_IMMERSIVE_MODE_EXTEND: dst = ImmersiveMode::EXTEND; break; + default: LOGE("Unexpected enum value in Ark_ImmersiveMode: %{public}d", src); + } +} + +template<> +void AssignCast(std::optional>& dst, const Ark_Curve& src) +{ + switch (src) { + case ARK_CURVE_LINEAR: dst = Curves::LINEAR; break; + case ARK_CURVE_EASE: dst = Curves::EASE; break; + case ARK_CURVE_EASE_IN: dst = Curves::EASE_IN; break; + case ARK_CURVE_EASE_OUT: dst = Curves::EASE_OUT; break; + case ARK_CURVE_EASE_IN_OUT: dst = Curves::EASE_IN_OUT; break; + case ARK_CURVE_FAST_OUT_SLOW_IN: dst = Curves::FAST_OUT_SLOW_IN; break; + case ARK_CURVE_LINEAR_OUT_SLOW_IN: dst = Curves::LINEAR_OUT_SLOW_IN; break; + case ARK_CURVE_FAST_OUT_LINEAR_IN: dst = Curves::FAST_OUT_LINEAR_IN; break; + case ARK_CURVE_EXTREME_DECELERATION: dst = Curves::EXTREME_DECELERATION; break; + case ARK_CURVE_SHARP: dst = Curves::SHARP; break; + case ARK_CURVE_RHYTHM: dst = Curves::RHYTHM; break; + case ARK_CURVE_SMOOTH: dst = Curves::SMOOTH; break; + case ARK_CURVE_FRICTION: dst = Curves::FRICTION; break; + default: { + LOGE("Unexpected enum value in Ark_Curve: %{public}d", src); + dst = std::nullopt; + } + } +} } // namespace OHOS::Ace::NG::Converter -- Gitee From 2175e1bd3eba479f9bd035ef995b4bf7bda558bd Mon Sep 17 00:00:00 2001 From: lvzikai Date: Wed, 16 Jul 2025 20:51:17 +0800 Subject: [PATCH 2/2] Repair navDestination customTransition Signed-off-by: lvzikai Change-Id: Ifc5f54bce7c5098dde1c7a129d5d5422cd7628b3 --- .../arkoala-arkts/arkui-ohos/src/component/navDestination.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/navDestination.ts b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/navDestination.ts index 5592e56390e..1549a51aefd 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/navDestination.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/navDestination.ts @@ -801,11 +801,11 @@ export interface NestedScrollInfo { child: Scroller; } export interface NavDestinationTransition { - onTransitionEnd?: (() => void); + onTransitionEnd?: Callback; duration?: number; curve?: Curve; delay?: number; - event: (() => void); + event: Callback; } export type Callback_Boolean = () => boolean; export type Callback_Object_Void = (parameter: Object) => void; -- Gitee