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 5592e56390e6de7fe7a3f88f393bc6ce2fcbfacd..1549a51aefd16996e294ce5460ac70256d6f6847 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; 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 a58ea5bea3324e5c02a515edfffa8d523473e0e5..48d782b3177379349f1f6d090e09bdc0b8733f9c 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 e5f17deae16a7b752e7cba338908f4c511e6aaad..8c0afa7c2bf7d3a34ac4113c3e488f370678c547 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 acf3641ca26b91cf1b62251ffec8b4f3bc2fb353..032960cef9df2a901c245cdfb68b5812ccc008e4 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 e109794a824ab51fd8d05fbb7e568d56826041b5..bb27a6e87a96311a03122549a32eb86b52e0d68a 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 6d4ddc74e2852777d0d950b207ffa492a49f24c8..263706d2972095363a79516300ced609e2bd55e2 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 eacbd72a6c445c13a0f30b003dc8628afca3aec0..a24aefe44a3f4fe31ef0f0f3ed84b027441a37df 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 fe437bc2b531116b4ccc0077c4bfd82058c7c2bc..9dd631d1e543bdc8a193a06be6ca7c2d070a1eae 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 be9c12914521316f89cf71323c6a0678fb6ad15c..b0a802dfb54576b5224f11028e08dabc7f51ca74 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 b2ebebdacc112f9afa182d58021b4c7f5624a5bb..ca8058da21f17ad0a78c91a3f1b9553b615edc5e 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