From 3c0a638d189627a6194e0763fdb6f35d003eca8b Mon Sep 17 00:00:00 2001 From: wangxiuxiu96 Date: Thu, 5 Jun 2025 17:09:11 +0800 Subject: [PATCH] =?UTF-8?q?navigation=E6=B7=B1=E6=B5=85=E8=89=B2=E5=88=87?= =?UTF-8?q?=E6=8D=A2=E6=94=AF=E6=8C=81=E6=96=B0=E6=A1=86=E6=9E=B6=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=BC=82=E5=B8=B8=E5=80=BCreset?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wangxiuxiu96 Change-Id: I2fd0b5e1da4ed115b00febd04d83ce7ec379581c --- .../arkts_native_nav_destination_bridge.cpp | 9 + .../arkts_native_navigation_bridge.cpp | 5 + .../jsview/js_navdestination.cpp | 27 +- .../jsview/js_navigation.cpp | 18 + .../jsview/js_navigation_utils.cpp | 1 + .../jsview/js_side_bar.cpp | 21 + .../jsview/models/navigation_model_impl.cpp | 2 +- .../jsview/models/navigation_model_impl.h | 2 +- .../pattern/navigation/navigation_model.h | 11 +- .../navigation/navigation_model_ng.cpp | 573 ++++++++++++------ .../pattern/navigation/navigation_model_ng.h | 11 +- .../pattern/navigation/navigation_pattern.cpp | 1 + .../navigation/navigation_toolbar_util.cpp | 6 +- .../pattern/navrouter/navdestination_model.h | 7 +- .../navrouter/navdestination_model_ng.cpp | 347 +++++++---- .../navrouter/navdestination_model_ng.h | 8 +- .../side_bar/side_bar_container_model.h | 1 + .../side_bar/side_bar_container_model_ng.cpp | 477 ++++++++++----- .../side_bar/side_bar_container_model_ng.h | 4 +- .../native/node/nav_destination_modifier.cpp | 23 +- .../native/node/navigation_modifier.cpp | 27 +- .../node/side_bar_container_modifier.cpp | 22 + .../navigation/navigation_model_test_ng.cpp | 56 ++ 23 files changed, 1171 insertions(+), 488 deletions(-) diff --git a/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_nav_destination_bridge.cpp b/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_nav_destination_bridge.cpp index c89ad8f6a7f..16ec98ed178 100644 --- a/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_nav_destination_bridge.cpp +++ b/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_nav_destination_bridge.cpp @@ -111,6 +111,8 @@ ArkUINativeModuleValue NavDestinationBridge::SetToolBarConfiguration(ArkUIRuntim auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value()); auto* frameNode = reinterpret_cast(nativeNode); CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm)); + NavDestinationModelNG::ResetResObj( + frameNode, NavDestinationPatternType::NAV_DESTINATION, "navDestination.toolbarConfiguration"); using namespace OHOS::Ace::Framework; JsiCallbackInfo info = JsiCallbackInfo(runtimeCallInfo); bool hideText = false; @@ -154,6 +156,8 @@ ArkUINativeModuleValue NavDestinationBridge::SetToolBarConfiguration(ArkUIRuntim } } NG::NavigationToolbarOptions options; + NavDestinationModelNG::ResetResObj( + frameNode, NavDestinationPatternType::NAV_DESTINATION, "navigation.navigationToolbarOptions"); JSNavigationUtils::ParseToolbarOptions(info, options); NavDestinationModel::GetInstance()->SetToolBarOptions(std::move(options)); return panda::JSValueRef::Undefined(vm); @@ -235,6 +239,9 @@ ArkUINativeModuleValue NavDestinationBridge::SetBackButtonIcon(ArkUIRuntimeCallI Local firstArg = runtimeCallInfo->GetCallArgRef(0); auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value()); auto* frameNode = reinterpret_cast(nativeNode); + CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm)); + NavDestinationModelNG::ResetResObj( + frameNode, NavDestinationPatternType::TITLE_BAR, "navDestination.backButtonIcon.icon"); Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo); std::string src; @@ -292,6 +299,8 @@ ArkUINativeModuleValue NavDestinationBridge::ResetBackButtonIcon(ArkUIRuntimeCal Local firstArg = runtimeCallInfo->GetCallArgRef(0); auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value()); auto* frameNode = reinterpret_cast(nativeNode); + NavDestinationModelNG::ResetResObj( + frameNode, NavDestinationPatternType::TITLE_BAR, "navDestination.backButtonIcon.icon"); bool noPixMap = false; RefPtr pixMap = nullptr; std::string src; diff --git a/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_navigation_bridge.cpp b/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_navigation_bridge.cpp index daeb68fe80e..42233862d06 100644 --- a/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_navigation_bridge.cpp +++ b/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_navigation_bridge.cpp @@ -338,6 +338,7 @@ ArkUINativeModuleValue NavigationBridge::SetToolBarConfiguration(ArkUIRuntimeCal CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm)); auto* frameNode = reinterpret_cast(firstArg->ToNativePointer(vm)->Value()); CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm)); + NavigationModelNG::ResetResObj(frameNode, NavigationPatternType::NAV_BAR, "navigation.toolbarConfiguration"); using namespace OHOS::Ace::Framework; JsiCallbackInfo info = JsiCallbackInfo(runtimeCallInfo); bool hideText = false; @@ -381,6 +382,7 @@ ArkUINativeModuleValue NavigationBridge::SetToolBarConfiguration(ArkUIRuntimeCal } NG::NavigationToolbarOptions options; JSNavigationUtils::ParseToolbarOptions(info, options); + NavigationModelNG::ResetResObj(frameNode, NavigationPatternType::NAV_BAR, "navigation.navigationToolbarOptions"); NavigationModel::GetInstance()->SetToolbarOptions(std::move(options)); return panda::JSValueRef::Undefined(vm); } @@ -801,6 +803,8 @@ ArkUINativeModuleValue NavigationBridge::SetBackButtonIcon(ArkUIRuntimeCallInfo* Local firstArg = runtimeCallInfo->GetCallArgRef(0); auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value()); auto* frameNode = reinterpret_cast(nativeNode); + CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm)); + NavigationModelNG::ResetResObj(frameNode, NavigationPatternType::TITLE_BAR, "navigation.backButtonIcon.icon"); Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo); std::string src; @@ -842,6 +846,7 @@ ArkUINativeModuleValue NavigationBridge::ResetBackButtonIcon(ArkUIRuntimeCallInf Local firstArg = runtimeCallInfo->GetCallArgRef(0); auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value()); auto* frameNode = reinterpret_cast(nativeNode); + NavigationModelNG::ResetResObj(frameNode, NavigationPatternType::TITLE_BAR, "navigation.backButtonIcon.icon"); bool noPixMap = false; NG::ImageOption imageOption; imageOption.noPixMap = noPixMap; diff --git a/frameworks/bridge/declarative_frontend/jsview/js_navdestination.cpp b/frameworks/bridge/declarative_frontend/jsview/js_navdestination.cpp index eecc2b57501..af2ea35fd71 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_navdestination.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/js_navdestination.cpp @@ -337,6 +337,12 @@ void JSNavDestination::SetTitle(const JSCallbackInfo& info) // Resource and string type. std::string title; RefPtr mainResObj; + NavDestinationModel::GetInstance()->ResetResObj( + NavDestinationPatternType::TITLE_BAR, "navDestination.title.commonMainTitle"); + NavDestinationModel::GetInstance()->ResetResObj( + NavDestinationPatternType::TITLE_BAR, "navDestination.title.commonSubTitle"); + NavDestinationModel::GetInstance()->ResetResObj( + NavDestinationPatternType::TITLE_BAR, "navDestination.title.customtitle"); if (JSViewAbstract::ParseJsString(info[0], title, mainResObj)) { if (SystemProperties::ConfigChangePerform() && mainResObj) { NavDestinationModel::GetInstance()->ParseCommonTitle(false, true, nullptr, mainResObj); @@ -360,6 +366,8 @@ void JSNavDestination::SetTitle(const JSCallbackInfo& info) } NG::NavigationTitlebarOptions options; + NavDestinationModel::GetInstance()->ResetResObj( + NavDestinationPatternType::TITLE_BAR, "navDestination.navigationTitlebarOptions"); JSNavigationUtils::ParseTitleBarOptions(info, false, options); NavDestinationModel::GetInstance()->SetTitlebarOptions(std::move(options)); } @@ -370,6 +378,10 @@ void JSNavDestination::SetBackButtonIcon(const JSCallbackInfo& info) if (info.Length() < 1) { return; } + NavDestinationModel::GetInstance()->ResetResObj( + NavDestinationPatternType::TITLE_BAR, "navDestination.backButtonIcon.icon"); + NavDestinationModel::GetInstance()->ResetResObj( + NavDestinationPatternType::TITLE_BAR, "navDestination.backButtonIcon.accessibilityText"); std::string src; RefPtr backButtonIconResObj; auto noPixMap = ParseJsMedia(info[0], src, backButtonIconResObj); @@ -402,14 +414,13 @@ void JSNavDestination::SetBackButtonIcon(const JSCallbackInfo& info) bool configChange = SystemProperties::ConfigChangePerform(); if (info.Length() > 1) { if (!info[1]->IsNull() && !info[1]->IsUndefined()) { - ParseBackButtonText(info, pixMap, imageOption, iconSymbol, src, nameList, - backButtonIconResObj); + ParseBackButtonText(info, pixMap, imageOption, iconSymbol, src, nameList, backButtonIconResObj); return; } } if (configChange && backButtonIconResObj) { - NavDestinationModel::GetInstance()->SetBackButtonIcon(iconSymbol, backButtonIconResObj, imageOption, - pixMap, nameList); + NavDestinationModel::GetInstance()->SetBackButtonIcon( + iconSymbol, backButtonIconResObj, imageOption, pixMap, nameList); } else { NavDestinationModel::GetInstance()->SetBackButtonIcon(iconSymbol, src, imageOption, pixMap, nameList); } @@ -506,6 +517,10 @@ void JSNavDestination::SetMenus(const JSCallbackInfo& info) return; } + NavDestinationModel::GetInstance()->ResetResObj( + NavDestinationPatternType::NAV_DESTINATION, "navDestination.menuItems"); + NavDestinationModel::GetInstance()->ResetResObj( + NavDestinationPatternType::NAV_DESTINATION, "navDestination.navigationMenuOptions"); NG::NavigationMenuOptions options; if (info.Length() > 1 && info[1]->IsObject()) { auto optObj = JSRef::Cast(info[1]); @@ -663,6 +678,8 @@ void JSNavDestination::SetToolBarConfiguration(const JSCallbackInfo& info) bool hideText = false; JSNavigationUtils::ParseHideToolBarText(info, hideText); NavDestinationModel::GetInstance()->SetHideItemText(hideText); + NavDestinationModel::GetInstance()->ResetResObj( + NavDestinationPatternType::NAV_DESTINATION, "navDestination.toolbarConfiguration"); if (info[0]->IsUndefined() || info[0]->IsArray()) { std::vector toolBarItems; if (info[0]->IsArray()) { @@ -694,6 +711,8 @@ void JSNavDestination::SetToolBarConfiguration(const JSCallbackInfo& info) } } NG::NavigationToolbarOptions options; + NavDestinationModel::GetInstance()->ResetResObj( + NavDestinationPatternType::NAV_DESTINATION, "navigation.navigationToolbarOptions"); JSNavigationUtils::ParseToolbarOptions(info, options); NavDestinationModel::GetInstance()->SetToolBarOptions(std::move(options)); } diff --git a/frameworks/bridge/declarative_frontend/jsview/js_navigation.cpp b/frameworks/bridge/declarative_frontend/jsview/js_navigation.cpp index 6ac2029105e..3b3902570eb 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_navigation.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/js_navigation.cpp @@ -366,6 +366,9 @@ void JSNavigation::SetTitle(const JSCallbackInfo& info) if (info.Length() < 1) { return; } + NavigationModel::GetInstance()->ResetResObj(NavigationPatternType::TITLE_BAR, "navigation.title.commonMainTitle"); + NavigationModel::GetInstance()->ResetResObj(NavigationPatternType::TITLE_BAR, "navigation.title.commonSubTitle"); + NavigationModel::GetInstance()->ResetResObj(NavigationPatternType::TITLE_BAR, "navigation.title.customtitle"); // Resource and string type. std::string title; RefPtr mainResObj; @@ -392,6 +395,8 @@ void JSNavigation::SetTitle(const JSCallbackInfo& info) } NG::NavigationTitlebarOptions options; + NavigationModel::GetInstance()->ResetResObj( + NavigationPatternType::NAVIGATION, "navigation.navigationTitlebarOptions"); JSNavigationUtils::ParseTitleBarOptions(info, true, options); NavigationModel::GetInstance()->SetTitlebarOptions(std::move(options)); } @@ -487,6 +492,9 @@ void JSNavigation::SetBackButtonIcon(const JSCallbackInfo& info) if (info.Length() < 1) { return; } + NavigationModel::GetInstance()->ResetResObj(NavigationPatternType::TITLE_BAR, "navigation.backButtonIcon.icon"); + NavigationModel::GetInstance()->ResetResObj( + NavigationPatternType::TITLE_BAR, "navigation.backButtonIcon.accessibilityText"); std::string src; RefPtr backButtonIconResObj; auto noPixMap = ParseJsMedia(info[0], src, backButtonIconResObj); @@ -587,6 +595,7 @@ void JSNavigation::SetToolbarConfiguration(const JSCallbackInfo& info) bool hideText = false; JSNavigationUtils::ParseHideToolBarText(info, hideText); NavigationModel::GetInstance()->SetHideItemText(hideText); + NavigationModel::GetInstance()->ResetResObj(NavigationPatternType::NAV_BAR, "navigation.toolbarConfiguration"); if (info[0]->IsUndefined() || info[0]->IsArray()) { if (NavigationModel::GetInstance()->NeedSetItems()) { std::vector toolbarItems; @@ -627,6 +636,7 @@ void JSNavigation::SetToolbarConfiguration(const JSCallbackInfo& info) } NG::NavigationToolbarOptions options; + NavigationModel::GetInstance()->ResetResObj(NavigationPatternType::NAV_BAR, "navigation.navigationToolbarOptions"); JSNavigationUtils::ParseToolbarOptions(info, options); NavigationModel::GetInstance()->SetToolbarOptions(std::move(options)); } @@ -637,6 +647,8 @@ void JSNavigation::SetMenus(const JSCallbackInfo& info) return; } + NavigationModel::GetInstance()->ResetResObj(NavigationPatternType::NAV_BAR, "navigation.menuItems"); + NavigationModel::GetInstance()->ResetResObj(NavigationPatternType::NAV_BAR, "navigation.navigationMenuOptions"); NG::NavigationMenuOptions options; if (info.Length() > 1 && info[1]->IsObject()) { auto optObj = JSRef::Cast(info[1]); @@ -754,6 +766,7 @@ void JSNavigation::SetNavBarWidth(const JSCallbackInfo& info) return; } + NavigationModel::GetInstance()->ResetResObj(NavigationPatternType::NAVIGATION, "navigation.navBarWidth"); if (info[0]->IsObject()) { JSRef callbackObj = JSRef::Cast(info[0]); CalcDimension value; @@ -794,6 +807,7 @@ void JSNavigation::SetMinContentWidth(const JSCallbackInfo& info) return; } + NavigationModel::GetInstance()->ResetResObj(NavigationPatternType::NAVIGATION, "navigation.minContentWidth"); CalcDimension minContentWidth; RefPtr minContentWidthResObj; if (!ParseJsDimensionVp(info[0], minContentWidth, minContentWidthResObj)) { @@ -817,6 +831,10 @@ void JSNavigation::SetNavBarWidthRange(const JSCallbackInfo& info) if (info.Length() < 1) { return; } + NavigationModel::GetInstance()->ResetResObj( + NavigationPatternType::NAVIGATION, "navigation.navBarWidthRange.maxNavBarWidth"); + NavigationModel::GetInstance()->ResetResObj( + NavigationPatternType::NAVIGATION, "navigation.navBarWidthRange.minNavBarWidth"); if (info[0]->IsNull() || info[0]->IsUndefined()) { NavigationModel::GetInstance()->SetMinNavBarWidth(NG::DEFAULT_MIN_NAV_BAR_WIDTH); NavigationModel::GetInstance()->SetMaxNavBarWidth(NG::DEFAULT_MAX_NAV_BAR_WIDTH); diff --git a/frameworks/bridge/declarative_frontend/jsview/js_navigation_utils.cpp b/frameworks/bridge/declarative_frontend/jsview/js_navigation_utils.cpp index 5b788b54b9c..7b95b439f7b 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_navigation_utils.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/js_navigation_utils.cpp @@ -116,6 +116,7 @@ void ParseBackgroundOptions(const JSRef& obj, NG::NavigationBackgroundOpt options.color.reset(); options.blurStyleOption.reset(); options.effectOption.reset(); + options.resMap_.clear(); if (!obj->IsObject()) { return; } diff --git a/frameworks/bridge/declarative_frontend/jsview/js_side_bar.cpp b/frameworks/bridge/declarative_frontend/jsview/js_side_bar.cpp index 3e4cc13986a..63314948e41 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_side_bar.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/js_side_bar.cpp @@ -69,6 +69,19 @@ void ParseAndSetWidth(const JSCallbackInfo& info, WidthType widthType) if (info.Length() < 1) { return; } + switch (widthType) { + case WidthType::SIDEBAR_WIDTH: + SideBarContainerModel::GetInstance()->ResetResObj("sideBarContainer.sideBarWidth"); + break; + case WidthType::MIN_SIDEBAR_WIDTH: + SideBarContainerModel::GetInstance()->ResetResObj("sideBarContainer.minSideBarWidth"); + break; + case WidthType::MAX_SIDEBAR_WIDTH: + SideBarContainerModel::GetInstance()->ResetResObj("sideBarContainer.maxSideBarWidth"); + break; + default: + break; + } CalcDimension value; if (Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_TEN)) { @@ -337,6 +350,9 @@ void JSSideBar::JsControlButton(const JSCallbackInfo& info) if (info.Length() < 1) { return; } + SideBarContainerModel::GetInstance()->ResetResObj("sideBarContainer.buttonIconOptions.shown"); + SideBarContainerModel::GetInstance()->ResetResObj("sideBarContainer.buttonIconOptions.hidden"); + SideBarContainerModel::GetInstance()->ResetResObj("sideBarContainer.buttonIconOptions.switching"); if (info[0]->IsNull() || info[0]->IsUndefined()) { if (AceApplicationInfo::GetInstance().GreatOrEqualTargetAPIVersion(PlatformVersion::VERSION_TWELVE)) { // controlButton icon set default style and position when input illegal value @@ -427,6 +443,10 @@ void JSSideBar::JsDivider(const JSCallbackInfo& info) if (info.Length() < 1) { return; } + SideBarContainerModel::GetInstance()->ResetResObj("sideBarContainer.dividerStyle.strokeWidth"); + SideBarContainerModel::GetInstance()->ResetResObj("sideBarContainer.dividerStyle.color"); + SideBarContainerModel::GetInstance()->ResetResObj("sideBarContainer.dividerStyle.startMargin"); + SideBarContainerModel::GetInstance()->ResetResObj("sideBarContainer.dividerStyle.endMargin"); if (info[0]->IsNull() || info[0]->IsUndefined()) { if (AceApplicationInfo::GetInstance().GreatOrEqualTargetAPIVersion(PlatformVersion::VERSION_TWELVE)) { // sideBar divider set default width when input illegal value @@ -447,6 +467,7 @@ void JSSideBar::JsMinContentWidth(const JSCallbackInfo& info) if (info.Length() < 1) { return; } + SideBarContainerModel::GetInstance()->ResetResObj("sideBarContainer.minContentWidth"); if (info[0]->IsNull()) { SideBarContainerModel::GetInstance()->SetMinContentWidth(-1.0_vp); return; diff --git a/frameworks/bridge/declarative_frontend/jsview/models/navigation_model_impl.cpp b/frameworks/bridge/declarative_frontend/jsview/models/navigation_model_impl.cpp index bb1d81fd0bf..58038ca8a66 100644 --- a/frameworks/bridge/declarative_frontend/jsview/models/navigation_model_impl.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/models/navigation_model_impl.cpp @@ -56,7 +56,7 @@ void NavigationModelImpl::SetTitleHeight(const Dimension& height, bool isValid) return; } -void NavigationModelImpl::SetTitleHeight(const RefPtr& resObj, bool isValid) +void NavigationModelImpl::SetTitleHeight(const RefPtr& resObj) { return; } diff --git a/frameworks/bridge/declarative_frontend/jsview/models/navigation_model_impl.h b/frameworks/bridge/declarative_frontend/jsview/models/navigation_model_impl.h index ee5dcae0962..086c1323996 100644 --- a/frameworks/bridge/declarative_frontend/jsview/models/navigation_model_impl.h +++ b/frameworks/bridge/declarative_frontend/jsview/models/navigation_model_impl.h @@ -28,7 +28,7 @@ public: void SetTitle(const std::string& title, bool hasSubTitle = false) override; void SetCustomTitle(const RefPtr& customTitle) override; void SetTitleHeight(const Dimension& height, bool isValid = true) override; - void SetTitleHeight(const RefPtr& resObj, bool isValid = true) override; + void SetTitleHeight(const RefPtr& resObj) override; void SetTitleMode(NG::NavigationTitleMode mode) override; void SetSubtitle(const std::string& subtitle) override; void SetEnableModeChangeAnimation(bool isEnable) override; diff --git a/frameworks/core/components_ng/pattern/navigation/navigation_model.h b/frameworks/core/components_ng/pattern/navigation/navigation_model.h index 3386d199634..177c6511a88 100644 --- a/frameworks/core/components_ng/pattern/navigation/navigation_model.h +++ b/frameworks/core/components_ng/pattern/navigation/navigation_model.h @@ -31,6 +31,12 @@ #include "core/components_ng/pattern/navigation/title_bar_pattern.h" namespace OHOS::Ace { + +enum class NavigationPatternType { + TITLE_BAR = 0, + NAV_BAR, + NAVIGATION, +}; using NavigationTransitionEvent = std::function from, RefPtr to, NG::NavigationOperation operation)>; using OnNavBarWidthChangeEvent = std::function; @@ -55,7 +61,7 @@ public: virtual void SetTitlebarOptions(NG::NavigationTitlebarOptions&& opt) {} virtual void SetCustomTitle(const RefPtr& customNode) = 0; virtual void SetTitleHeight(const Dimension& height, bool isValid = true) = 0; - virtual void SetTitleHeight(const RefPtr& resObj, bool isValid = true) = 0; + virtual void SetTitleHeight(const RefPtr& resObj) = 0; virtual void SetTitleMode(NG::NavigationTitleMode mode) = 0; virtual void SetSubtitle(const std::string& subtitle) = 0; virtual void SetEnableModeChangeAnimation(bool isEnable) = 0; @@ -124,8 +130,9 @@ public: virtual void SetSystemBarStyle(const RefPtr& style) {}; virtual void SetRecoverable(bool recoverable) {} virtual void SetEnableDragBar(bool recoverable) {} + virtual void ResetResObj(NavigationPatternType type, const std::string& key) {} virtual bool ParseCommonTitle(bool hasSubTitle, bool hasMainTitle, const RefPtr& subResObj, - const RefPtr& mainResObj, bool ignoreMainTitle = false) {return false;}; + const RefPtr& mainResObj) {return false;}; virtual void UpdateMainTitle( const RefPtr& titleBarNode, const RefPtr& mainResObj) {}; virtual void UpdateSubTitle( diff --git a/frameworks/core/components_ng/pattern/navigation/navigation_model_ng.cpp b/frameworks/core/components_ng/pattern/navigation/navigation_model_ng.cpp index 309e8378b2c..a373e0f0698 100644 --- a/frameworks/core/components_ng/pattern/navigation/navigation_model_ng.cpp +++ b/frameworks/core/components_ng/pattern/navigation/navigation_model_ng.cpp @@ -500,8 +500,8 @@ bool NavigationModelNG::ParseCommonTitle( return true; } -bool NavigationModelNG::ParseCommonTitle(bool hasSubTitle, bool hasMainTitle, - const RefPtr& subResObj, const RefPtr& mainResObj, bool ignoreMainTitle) +bool NavigationModelNG::ParseCommonTitle(bool hasSubTitle, bool hasMainTitle, const RefPtr& subResObj, + const RefPtr& mainResObj) { if (!hasSubTitle && !hasMainTitle) { return false; @@ -528,45 +528,59 @@ bool NavigationModelNG::ParseCommonTitle(bool hasSubTitle, bool hasMainTitle, void NavigationModelNG::UpdateMainTitle( const RefPtr& titleBarNode, const RefPtr& mainResObj) { - auto&& updateFunc = [this, weak = AceType::WeakClaim(AceType::RawPtr(titleBarNode))] - (const RefPtr& mainResObj) mutable { + std::string key = "navigation.title.commonMainTitle"; + auto updateFunc = [this, key, weak = AceType::WeakClaim(AceType::RawPtr(titleBarNode))]( + const RefPtr& mainResObj) mutable { auto titleBarNode = weak.Upgrade(); CHECK_NULL_VOID(titleBarNode); - std::string title; - ResourceParseUtils::ParseResString(mainResObj, title); + auto titleBarPattern = titleBarNode->GetPattern(); + CHECK_NULL_VOID(titleBarPattern); + std::string title = titleBarPattern->GetResCacheMapByKey(key); + if (title.empty()) { + ResourceParseUtils::ParseResString(mainResObj, title); + titleBarPattern->AddResCache(key, title); + } auto mainTitle = AceType::DynamicCast(titleBarNode->GetTitle()); if (mainTitle) { auto textLayoutProperty = mainTitle->GetLayoutProperty(); textLayoutProperty->UpdateContent(title); + titleBarNode->MarkModifyDone(); + titleBarNode->MarkDirtyNode(); } - titleBarNode->MarkModifyDone(); - titleBarNode->MarkDirtyNode(); }; + CHECK_NULL_VOID(titleBarNode); auto titleBarPattern = titleBarNode->GetPattern(); CHECK_NULL_VOID(titleBarPattern); - titleBarPattern->AddResObj("navigation.title.commonMainTitle", mainResObj, std::move(updateFunc)); + titleBarPattern->AddResObj(key, mainResObj, std::move(updateFunc)); } void NavigationModelNG::UpdateSubTitle( const RefPtr& titleBarNode, const RefPtr& resObj) { - auto&& updateFunc = [weak = AceType::WeakClaim(AceType::RawPtr(titleBarNode))]( - const RefPtr& resObj) { + std::string key = "navigation.title.commonSubTitle"; + auto updateFunc = [key, weak = AceType::WeakClaim(AceType::RawPtr(titleBarNode))]( + const RefPtr& resObj) { auto titleBarNode = weak.Upgrade(); CHECK_NULL_VOID(titleBarNode); - std::string subtitle; - ResourceParseUtils::ParseResString(resObj, subtitle); + auto titleBarPattern = titleBarNode->GetPattern(); + CHECK_NULL_VOID(titleBarPattern); + std::string subTitleValue = titleBarPattern->GetResCacheMapByKey(key); + if (subTitleValue.empty()) { + ResourceParseUtils::ParseResString(resObj, subTitleValue); + titleBarPattern->AddResCache(key, subTitleValue); + } auto subTitle = AceType::DynamicCast(titleBarNode->GetSubtitle()); if (subTitle) { auto textLayoutProperty = subTitle->GetLayoutProperty(); - textLayoutProperty->UpdateContent(subtitle); + textLayoutProperty->UpdateContent(subTitleValue); + titleBarNode->MarkModifyDone(); + titleBarNode->MarkDirtyNode(); } - titleBarNode->MarkModifyDone(); - titleBarNode->MarkDirtyNode(); }; + CHECK_NULL_VOID(titleBarNode); auto titleBarPattern = titleBarNode->GetPattern(); CHECK_NULL_VOID(titleBarPattern); - titleBarPattern->AddResObj("navigation.title.commonSubTitle", resObj, std::move(updateFunc)); + titleBarPattern->AddResObj(key, resObj, std::move(updateFunc)); } void NavigationModelNG::SetTitle(const std::string& title, bool hasSubTitle) {} @@ -625,7 +639,7 @@ void NavigationModelNG::SetTitleHeight(const Dimension& height, bool isValid) navBarLayoutProperty->UpdateTitleMode(static_cast(NavigationTitleMode::MINI)); } -void NavigationModelNG::SetTitleHeight(const RefPtr& resObj, bool isValid) +void NavigationModelNG::SetTitleHeight(const RefPtr& resObj) { CalcDimension height = ParseTitleHeight(resObj); SetTitleHeight(height); @@ -637,8 +651,8 @@ void NavigationModelNG::SetTitleHeight(const RefPtr& resObj, boo CHECK_NULL_VOID(navBarNode); auto titleBarNode = AceType::DynamicCast(navBarNode->GetTitleBarNode()); CHECK_NULL_VOID(titleBarNode); - auto&& updateFunc = [this, weak = AceType::WeakClaim(AceType::RawPtr(titleBarNode))]( - const RefPtr& resObj) { + auto updateFunc = [this, weak = AceType::WeakClaim(AceType::RawPtr(titleBarNode))]( + const RefPtr& resObj) { auto titleBarNode = weak.Upgrade(); CHECK_NULL_VOID(titleBarNode); auto titleBarLayoutProperty = titleBarNode->GetLayoutProperty(); @@ -656,20 +670,40 @@ void NavigationModelNG::SetTitleHeight(const RefPtr& resObj, boo CalcDimension NavigationModelNG::ParseTitleHeight(const RefPtr& resObj) { + auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); + CHECK_NULL_RETURN(frameNode, Dimension()); + auto navigationGroupNode = AceType::DynamicCast(frameNode); + CHECK_NULL_RETURN(navigationGroupNode, Dimension()); + auto navBarNode = AceType::DynamicCast(navigationGroupNode->GetNavBarNode()); + CHECK_NULL_RETURN(navBarNode, Dimension()); + auto titleBarNode = AceType::DynamicCast(navBarNode->GetTitleBarNode()); + CHECK_NULL_RETURN(titleBarNode, Dimension()); + auto titleBarPattern = titleBarNode->GetPattern(); + CHECK_NULL_RETURN(titleBarPattern, Dimension()); std::string heightValue; - if (ResourceParseUtils::ParseResString(resObj, heightValue)) { - if (heightValue == NG::TITLE_MAIN_WITH_SUB) { - return NG::DOUBLE_LINE_TITLEBAR_HEIGHT; - } - if (heightValue == NG::TITLE_MAIN) { - return NG::SINGLE_LINE_TITLEBAR_HEIGHT; - } + std::string key = "navigation.title.customtitle"; + std::string heightString = titleBarPattern->GetResCacheMapByKey(key); + if (heightString.empty() && ResourceParseUtils::ParseResString(resObj, heightValue)) { + titleBarPattern->AddResCache(key, heightValue); + } else { + heightValue = heightString; + } + if (heightValue == NG::TITLE_MAIN_WITH_SUB) { + return NG::DOUBLE_LINE_TITLEBAR_HEIGHT; + } + if (heightValue == NG::TITLE_MAIN) { + return NG::SINGLE_LINE_TITLEBAR_HEIGHT; } CalcDimension height; - bool isValid = ResourceParseUtils::ParseResDimensionVpNG(resObj, height); - if (!isValid || height.Value() < 0) { - height = Dimension(); + if (heightString.empty()) { + bool isValid = ResourceParseUtils::ParseResDimensionVpNG(resObj, height); + titleBarPattern->AddResCache(key, height.ToString()); + if (!isValid || height.Value() < 0) { + return Dimension(); + } + } else { + height = StringUtils::StringToCalcDimension(heightString); } return height; } @@ -972,28 +1006,37 @@ void NavigationModelNG::SetBackButtonIcon(const std::functionGetMainFrameNode(); CHECK_NULL_VOID(frameNode); - auto&& updateFunc = [nameList, weak = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { - auto frameNode = weak.Upgrade(); - CHECK_NULL_VOID(frameNode); - auto navigationGroupNode = AceType::DynamicCast(frameNode); - CHECK_NULL_VOID(navigationGroupNode); - auto navBarNode = AceType::DynamicCast(navigationGroupNode->GetNavBarNode()); - CHECK_NULL_VOID(navBarNode); - auto titleBarNode = AceType::DynamicCast(navBarNode->GetTitleBarNode()); + auto navigationGroupNode = AceType::DynamicCast(frameNode); + CHECK_NULL_VOID(navigationGroupNode); + auto navBarNode = AceType::DynamicCast(navigationGroupNode->GetNavBarNode()); + CHECK_NULL_VOID(navBarNode); + auto titleBarNode = AceType::DynamicCast(navBarNode->GetTitleBarNode()); + CHECK_NULL_VOID(titleBarNode); + std::string key = "navigation.backButtonIcon.icon"; + auto updateFunc = [key, nameList, weakTitleBarNode = AceType::WeakClaim(AceType::RawPtr(titleBarNode)), + weakFrameNode = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { + auto titleBarNode = weakTitleBarNode.Upgrade(); CHECK_NULL_VOID(titleBarNode); - auto titleBarLayoutProperty = titleBarNode->GetLayoutProperty(); - CHECK_NULL_VOID(titleBarLayoutProperty); - std::string result; - ResourceParseUtils::ParseResMedia(resObj, result); + auto titleBarPattern = titleBarNode->GetPattern(); + CHECK_NULL_VOID(titleBarPattern); + std::string result = titleBarPattern->GetResCacheMapByKey(key); + if (result.empty()) { + ResourceParseUtils::ParseResMedia(resObj, result); + titleBarPattern->AddResCache(key, result); + } ImageSourceInfo imageSourceInfo(result, nameList[0], nameList[1]); + auto frameNode = weakFrameNode.Upgrade(); + CHECK_NULL_VOID(frameNode); ACE_UPDATE_NODE_LAYOUT_PROPERTY(NavigationLayoutProperty, ImageSource, imageSourceInfo, frameNode); + auto titleBarLayoutProperty = titleBarNode->GetLayoutProperty(); + CHECK_NULL_VOID(titleBarLayoutProperty); titleBarLayoutProperty->UpdateImageSource(imageSourceInfo); titleBarNode->MarkModifyDone(); titleBarNode->MarkDirtyNode(); }; - auto pattern = frameNode->GetPattern(); - CHECK_NULL_VOID(pattern); - pattern->AddResObj("navigation.backButtonIcon.icon", resObj, std::move(updateFunc)); + auto titleBarPattern = titleBarNode->GetPattern(); + CHECK_NULL_VOID(titleBarPattern); + titleBarPattern->AddResObj(key, resObj, std::move(updateFunc)); } void NavigationModelNG::SetBackButtonIconSrcAndTextRes(const std::function)>& symbolApply, @@ -1026,42 +1069,58 @@ void NavigationModelNG::SetBackButtonIconSrcAndTextRes(const std::function& nameList, NG::FrameNode* frameNode, const RefPtr& backButtonIconResObj) { - auto&& updateFunc = [nameList, weak = AceType::WeakClaim(frameNode)]( - const RefPtr& backButtonIconResObj) { - auto frameNode = weak.Upgrade(); - CHECK_NULL_VOID(frameNode); - auto navigationGroupNode = AceType::DynamicCast(frameNode); - CHECK_NULL_VOID(navigationGroupNode); - auto navBarNode = AceType::DynamicCast(navigationGroupNode->GetNavBarNode()); - CHECK_NULL_VOID(navBarNode); - auto titleBarNode = AceType::DynamicCast(navBarNode->GetTitleBarNode()); + CHECK_NULL_VOID(frameNode); + auto navigationGroupNode = AceType::DynamicCast(frameNode); + CHECK_NULL_VOID(navigationGroupNode); + auto navBarNode = AceType::DynamicCast(navigationGroupNode->GetNavBarNode()); + CHECK_NULL_VOID(navBarNode); + auto titleBarNode = AceType::DynamicCast(navBarNode->GetTitleBarNode()); + CHECK_NULL_VOID(titleBarNode); + std::string key = "navigation.backButtonIcon.icon"; + auto updateFunc = [key, nameList, weakFrameNode = AceType::WeakClaim(frameNode), + weakTitleBarNode = AceType::WeakClaim(AceType::RawPtr(titleBarNode))]( + const RefPtr& backButtonIconResObj) { + auto titleBarNode = weakTitleBarNode.Upgrade(); CHECK_NULL_VOID(titleBarNode); - auto titleBarLayoutProperty = titleBarNode->GetLayoutProperty(); - CHECK_NULL_VOID(titleBarLayoutProperty); - std::string result; - ResourceParseUtils::ParseResMedia(backButtonIconResObj, result); + auto titleBarPattern = titleBarNode->GetPattern(); + CHECK_NULL_VOID(titleBarPattern); + std::string result = titleBarPattern->GetResCacheMapByKey(key); + if (result.empty()) { + ResourceParseUtils::ParseResMedia(backButtonIconResObj, result); + titleBarPattern->AddResCache(key, result); + } ImageSourceInfo imageSourceInfo(result, nameList[0], nameList[1]); + auto frameNode = weakFrameNode.Upgrade(); + CHECK_NULL_VOID(frameNode); ACE_UPDATE_NODE_LAYOUT_PROPERTY(NavigationLayoutProperty, ImageSource, imageSourceInfo, frameNode); + auto titleBarLayoutProperty = titleBarNode->GetLayoutProperty(); + CHECK_NULL_VOID(titleBarLayoutProperty); titleBarLayoutProperty->UpdateImageSource(imageSourceInfo); titleBarNode->MarkModifyDone(); titleBarNode->MarkDirtyNode(); }; - auto pattern = frameNode->GetPattern(); - CHECK_NULL_VOID(pattern); - pattern->AddResObj("navigation.backButtonIcon.icon", backButtonIconResObj, std::move(updateFunc)); + auto titleBarPattern = titleBarNode->GetPattern(); + CHECK_NULL_VOID(titleBarPattern); + titleBarPattern->AddResObj(key, backButtonIconResObj, std::move(updateFunc)); } void NavigationModelNG::UpdateBackButtonIconText(bool userDefinedAccessibilityText, const RefPtr& titleBarNode, const RefPtr& backButtonTextResObj) { - auto&& updateFunc = [userDefinedAccessibilityText, weak = AceType::WeakClaim(AceType::RawPtr(titleBarNode))]( - const RefPtr& backButtonTextResObj) { + std::string key = "navigation.backButtonIcon.accessibilityText"; + auto updateFunc = [key, userDefinedAccessibilityText, weak = AceType::WeakClaim(AceType::RawPtr(titleBarNode))]( + const RefPtr& backButtonTextResObj) { auto titleBarNode = weak.Upgrade(); CHECK_NULL_VOID(titleBarNode); auto backButtonNode = AceType::DynamicCast(titleBarNode->GetBackButton()); CHECK_NULL_VOID(backButtonNode); - std::string backButtonAccessibilityText; - ResourceParseUtils::ParseResString(backButtonTextResObj, backButtonAccessibilityText); + auto titleBarPattern = titleBarNode->GetPattern(); + CHECK_NULL_VOID(titleBarPattern); + std::string backButtonAccessibilityText = titleBarPattern->GetResCacheMapByKey(key); + if (backButtonAccessibilityText.empty()) { + ResourceParseUtils::ParseResString(backButtonTextResObj, backButtonAccessibilityText); + titleBarPattern->AddResCache(key, backButtonAccessibilityText); + } if (userDefinedAccessibilityText) { NavigationTitleUtil::SetAccessibility(backButtonNode, backButtonAccessibilityText); } else { @@ -1073,8 +1132,7 @@ void NavigationModelNG::UpdateBackButtonIconText(bool userDefinedAccessibilityTe }; auto titleBarPattern = titleBarNode->GetPattern(); CHECK_NULL_VOID(titleBarPattern); - titleBarPattern->AddResObj( - "navigation.backButtonIcon.accessibilityText", backButtonTextResObj, std::move(updateFunc)); + titleBarPattern->AddResObj(key, backButtonTextResObj, std::move(updateFunc)); } void NavigationModelNG::SetBackButtonIconTextRes(const std::function)>& symbolApply, @@ -1093,14 +1151,20 @@ void NavigationModelNG::SetBackButtonIconTextRes(const std::function(navBarNode->GetTitleBarNode()); CHECK_NULL_VOID(titleBarNode); - auto&& updateFunc = [userDefinedAccessibilityText, weak = AceType::WeakClaim(AceType::RawPtr(titleBarNode))]( - const RefPtr& resObj) { + std::string key = "navigation.backButtonIcon.accessibilityText"; + auto updateFunc = [key, userDefinedAccessibilityText, weak = AceType::WeakClaim(AceType::RawPtr(titleBarNode))]( + const RefPtr& resObj) { auto titleBarNode = weak.Upgrade(); CHECK_NULL_VOID(titleBarNode); auto backButtonNode = AceType::DynamicCast(titleBarNode->GetBackButton()); CHECK_NULL_VOID(backButtonNode); - std::string backButtonAccessibilityText; - ResourceParseUtils::ParseResString(resObj, backButtonAccessibilityText); + auto titleBarPattern = titleBarNode->GetPattern(); + CHECK_NULL_VOID(titleBarPattern); + std::string backButtonAccessibilityText = titleBarPattern->GetResCacheMapByKey(key); + if (backButtonAccessibilityText.empty()) { + ResourceParseUtils::ParseResString(resObj, backButtonAccessibilityText); + titleBarPattern->AddResCache(key, backButtonAccessibilityText); + } if (userDefinedAccessibilityText) { NavigationTitleUtil::SetAccessibility(backButtonNode, backButtonAccessibilityText); } else { @@ -1112,7 +1176,7 @@ void NavigationModelNG::SetBackButtonIconTextRes(const std::functionGetPattern(); CHECK_NULL_VOID(titleBarPattern); - titleBarPattern->AddResObj("navigation.backButtonIcon.accessibilityText", resObj, std::move(updateFunc)); + titleBarPattern->AddResObj(key, resObj, std::move(updateFunc)); } void NavigationModelNG::SetHideBackButton(bool hideBackButton) @@ -1220,8 +1284,8 @@ void NavigationModelNG::SetToolbarConfiguration(std::vector&& toolB return; } RefPtr resObj = AceType::MakeRefPtr("", "", -1); - auto&& updateFunc = [enabled, fieldProperty, weakNavBarNode = AceType::WeakClaim(AceType::RawPtr(navBarNode)), - localToolBarItems, localOpt](const RefPtr& resObj) mutable { + auto updateFunc = [enabled, fieldProperty, weakNavBarNode = AceType::WeakClaim(AceType::RawPtr(navBarNode)), + localToolBarItems, localOpt](const RefPtr& resObj) mutable { auto navBarNode = weakNavBarNode.Upgrade(); CHECK_NULL_VOID(navBarNode); if (localOpt.bgOptions.blurStyleOption.has_value()) { @@ -1291,9 +1355,9 @@ void NavigationModelNG::SetMenuItems(std::vector&& menuItems) return; } RefPtr resObj = AceType::MakeRefPtr("", "", -1); - auto&& updateFunc = [wekNavBarNode = AceType::WeakClaim(AceType::RawPtr(navBarNode)), menuItems]( - const RefPtr& resObj) { - for (BarItem item : menuItems) { + auto updateFunc = [wekNavBarNode = AceType::WeakClaim(AceType::RawPtr(navBarNode)), menuItems]( + const RefPtr& resObj) mutable { + for (BarItem& item : menuItems) { item.ReloadResources(); } auto navBarNode = wekNavBarNode.Upgrade(); @@ -1304,9 +1368,7 @@ void NavigationModelNG::SetMenuItems(std::vector&& menuItems) navBarNode->MarkModifyDone(); navBarNode->MarkDirtyNode(); }; - auto pattern = navBarNode->GetPattern(); - CHECK_NULL_VOID(pattern); - pattern->AddResObj("navigation.menuItems", resObj, std::move(updateFunc)); + navBarPattern->AddResObj("navigation.menuItems", resObj, std::move(updateFunc)); } void NavigationModelNG::SetCustomMenu(const RefPtr& customNode) @@ -1407,19 +1469,26 @@ void NavigationModelNG::SetNavBarWidth(const RefPtr& navBarWidth SetNavBarWidth(navBarWidth, false); auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); CHECK_NULL_VOID(frameNode); - auto&& updateNavBarWidthFunc = [weak = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { - CalcDimension navBarWidth; - ResourceParseUtils::ParseResDimensionVpNG(resObj, navBarWidth); - if (navBarWidth.Value() <= 0) { - navBarWidth.SetValue(DEFAULT_NAV_BAR_WIDTH_VALUE); - } + std::string key = "navigation.navBarWidth"; + auto updateNavBarWidthFunc = [key, weak = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { auto frameNode = weak.Upgrade(); CHECK_NULL_VOID(frameNode); - ACE_UPDATE_NODE_LAYOUT_PROPERTY(NavigationLayoutProperty, NavBarWidth, navBarWidth, frameNode); auto navigationGroupNode = AceType::DynamicCast(frameNode); CHECK_NULL_VOID(navigationGroupNode); auto navigationPattern = navigationGroupNode->GetPattern(); CHECK_NULL_VOID(navigationPattern); + CalcDimension navBarWidth; + std::string navBarWidthString = navigationPattern->GetResCacheMapByKey(key); + if (navBarWidthString.empty()) { + ResourceParseUtils::ParseResDimensionVpNG(resObj, navBarWidth); + navigationPattern->AddResCache(key, navBarWidth.ToString()); + } else { + navBarWidth = StringUtils::StringToCalcDimension(navBarWidthString); + } + if (navBarWidth.Value() <= 0) { + navBarWidth.SetValue(DEFAULT_NAV_BAR_WIDTH_VALUE); + } + ACE_UPDATE_NODE_LAYOUT_PROPERTY(NavigationLayoutProperty, NavBarWidth, navBarWidth, frameNode); navigationPattern->SetUserSetNavBarWidthFlag(true); if (navigationPattern->GetInitNavBarWidth() != navBarWidth) { navigationPattern->SetInitNavBarWidth(navBarWidth); @@ -1427,9 +1496,9 @@ void NavigationModelNG::SetNavBarWidth(const RefPtr& navBarWidth navigationGroupNode->MarkModifyDone(); navigationGroupNode->MarkDirtyNode(); }; - auto pattern = frameNode->GetPattern(); + auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); - pattern->AddResObj("navigation.navBarWidth", navBarWidthResObj, std::move(updateNavBarWidthFunc)); + pattern->AddResObj(key, navBarWidthResObj, std::move(updateNavBarWidthFunc)); } void NavigationModelNG::SetMinNavBarWidth(const Dimension& value) @@ -1457,27 +1526,33 @@ void NavigationModelNG::SetMinNavBarWidth(const RefPtr& minNavBa SetMinNavBarWidth(minNavBarWidth); auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); CHECK_NULL_VOID(frameNode); - auto&& updateMinNavBarWidthFunc = [weak = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { - CalcDimension minNavBarWidth; - ResourceParseUtils::ParseResDimensionVpNG(resObj, minNavBarWidth); - if (LessNotEqual(minNavBarWidth.Value(), 0.0)) { - minNavBarWidth.SetValue(0); - } + std::string key = "navigation.navBarWidthRange.minNavBarWidth"; + auto updateMinNavBarWidthFunc = [key, weak = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { auto frameNode = weak.Upgrade(); CHECK_NULL_VOID(frameNode); auto navigationGroupNode = AceType::DynamicCast(frameNode); CHECK_NULL_VOID(navigationGroupNode); auto navigationPattern = navigationGroupNode->GetPattern(); CHECK_NULL_VOID(navigationPattern); + CalcDimension minNavBarWidth; + std::string minNavBarWidthString = navigationPattern->GetResCacheMapByKey(key); + if (minNavBarWidthString.empty()) { + ResourceParseUtils::ParseResDimensionVpNG(resObj, minNavBarWidth); + navigationPattern->AddResCache(key, minNavBarWidth.ToString()); + } else { + minNavBarWidth = StringUtils::StringToCalcDimension(minNavBarWidthString); + } + if (LessNotEqual(minNavBarWidth.Value(), 0.0)) { + minNavBarWidth.SetValue(0); + } navigationPattern->SetIfNeedInit(true); ACE_UPDATE_NODE_LAYOUT_PROPERTY(NavigationLayoutProperty, MinNavBarWidth, minNavBarWidth, frameNode); navigationGroupNode->MarkModifyDone(); navigationGroupNode->MarkDirtyNode(); }; - auto pattern = frameNode->GetPattern(); + auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); - pattern->AddResObj( - "navigation.navBarWidthRange.minNavBarWidth", minNavBarWidthResObj, std::move(updateMinNavBarWidthFunc)); + pattern->AddResObj(key, minNavBarWidthResObj, std::move(updateMinNavBarWidthFunc)); } void NavigationModelNG::SetMaxNavBarWidth(const Dimension& value) @@ -1505,27 +1580,33 @@ void NavigationModelNG::SetMaxNavBarWidth(const RefPtr& maxNavBa SetMaxNavBarWidth(maxNavBarWidth); auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); CHECK_NULL_VOID(frameNode); - auto&& updateMaxNavBarWidthFunc = [weak = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { - CalcDimension maxNavBarWidth; - ResourceParseUtils::ParseResDimensionVpNG(resObj, maxNavBarWidth); - if (LessNotEqual(maxNavBarWidth.Value(), 0.0)) { - maxNavBarWidth.SetValue(0); - } + std::string key = "navigation.navBarWidthRange.maxNavBarWidth"; + auto updateMaxNavBarWidthFunc = [key, weak = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { auto frameNode = weak.Upgrade(); CHECK_NULL_VOID(frameNode); auto navigationGroupNode = AceType::DynamicCast(frameNode); CHECK_NULL_VOID(navigationGroupNode); auto navigationPattern = navigationGroupNode->GetPattern(); CHECK_NULL_VOID(navigationPattern); + CalcDimension maxNavBarWidth; + std::string maxNavBarWidthString = navigationPattern->GetResCacheMapByKey(key); + if (maxNavBarWidthString.empty()) { + ResourceParseUtils::ParseResDimensionVpNG(resObj, maxNavBarWidth); + navigationPattern->AddResCache(key, maxNavBarWidth.ToString()); + } else { + maxNavBarWidth = StringUtils::StringToCalcDimension(maxNavBarWidthString); + } + if (LessNotEqual(maxNavBarWidth.Value(), 0.0)) { + maxNavBarWidth.SetValue(0); + } navigationPattern->SetIfNeedInit(true); ACE_UPDATE_NODE_LAYOUT_PROPERTY(NavigationLayoutProperty, MaxNavBarWidth, maxNavBarWidth, frameNode); navigationGroupNode->MarkModifyDone(); navigationGroupNode->MarkDirtyNode(); }; - auto pattern = frameNode->GetPattern(); + auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); - pattern->AddResObj( - "navigation.navBarWidthRange.maxNavBarWidth", maxNavBarWidthResObj, std::move(updateMaxNavBarWidthFunc)); + pattern->AddResObj(key, maxNavBarWidthResObj, std::move(updateMaxNavBarWidthFunc)); } void NavigationModelNG::SetMinContentWidth(const Dimension& value) @@ -1550,26 +1631,33 @@ void NavigationModelNG::SetMinContentWidth(const RefPtr& minCont SetMinContentWidth(minContentWidth); auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); CHECK_NULL_VOID(frameNode); - auto&& updateMinContentWidthFunc = [weak = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { - CalcDimension minContentWidth; - ResourceParseUtils::ParseResDimensionVpNG(resObj, minContentWidth); - if (LessNotEqual(minContentWidth.Value(), 0.0)) { - minContentWidth = DEFAULT_MIN_CONTENT_WIDTH; - } + std::string key = "navigation.minContentWidth"; + auto updateMinContentWidthFunc = [key, weak = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { auto frameNode = weak.Upgrade(); CHECK_NULL_VOID(frameNode); auto navigationGroupNode = AceType::DynamicCast(frameNode); CHECK_NULL_VOID(navigationGroupNode); auto navigationPattern = navigationGroupNode->GetPattern(); CHECK_NULL_VOID(navigationPattern); + CalcDimension minContentWidth; + std::string minContentWidthString = navigationPattern->GetResCacheMapByKey(key); + if (minContentWidthString.empty()) { + ResourceParseUtils::ParseResDimensionVpNG(resObj, minContentWidth); + navigationPattern->AddResCache(key, minContentWidth.ToString()); + } else { + minContentWidth = StringUtils::StringToCalcDimension(minContentWidthString); + } + if (LessNotEqual(minContentWidth.Value(), 0.0)) { + minContentWidth = DEFAULT_MIN_CONTENT_WIDTH; + } navigationPattern->SetIfNeedInit(true); ACE_UPDATE_NODE_LAYOUT_PROPERTY(NavigationLayoutProperty, MinContentWidth, minContentWidth, frameNode); navigationGroupNode->MarkModifyDone(); navigationGroupNode->MarkDirtyNode(); }; - auto pattern = frameNode->GetPattern(); + auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); - pattern->AddResObj("navigation.minContentWidth", minContentWidthResObj, std::move(updateMinContentWidthFunc)); + pattern->AddResObj(key, minContentWidthResObj, std::move(updateMinContentWidthFunc)); } void NavigationModelNG::SetOnNavBarStateChange(std::function&& onNavBarStateChange) @@ -1780,6 +1868,32 @@ void NavigationModelNG::SetHideToolBar(FrameNode* frameNode, bool hideToolBar, b navBarLayoutProperty->UpdateIsAnimatedToolBar(animated); } +void NavigationModelNG::ResetResObj(FrameNode* frameNode, NavigationPatternType type, const std::string& key) +{ + if (!SystemProperties::ConfigChangePerform()) { + return; + } + CHECK_NULL_VOID(frameNode); + auto navigationGroupNode = AceType::DynamicCast(frameNode); + CHECK_NULL_VOID(navigationGroupNode); + RefPtr pattern = nullptr; + if (type == NavigationPatternType::NAV_BAR) { + auto navBarNode = AceType::DynamicCast(navigationGroupNode->GetNavBarNode()); + CHECK_NULL_VOID(navBarNode); + pattern = navBarNode->GetPattern(); + } else if (type == NavigationPatternType::TITLE_BAR) { + auto navBarNode = AceType::DynamicCast(navigationGroupNode->GetNavBarNode()); + CHECK_NULL_VOID(navBarNode); + auto titleBarNode = AceType::DynamicCast(navBarNode->GetTitleBarNode()); + CHECK_NULL_VOID(titleBarNode); + pattern = titleBarNode->GetPattern(); + } else if (type == NavigationPatternType::NAVIGATION) { + pattern = navigationGroupNode->GetPattern(); + } + CHECK_NULL_VOID(pattern); + pattern->RemoveResObj(key); +} + void NavigationModelNG::SetMinContentWidth(FrameNode* frameNode, const Dimension& value) { auto navigationGroupNode = AceType::DynamicCast(frameNode); @@ -1799,18 +1913,25 @@ void NavigationModelNG::SetMinContentWidth(FrameNode* frameNode, const RefPtr& resObj) { - CalcDimension minContentWidth; - ResourceParseUtils::ParseResDimensionVpNG(resObj, minContentWidth); - if (LessNotEqual(minContentWidth.Value(), 0.0)) { - minContentWidth = DEFAULT_MIN_CONTENT_WIDTH; - } + std::string key = "navigation.minContentWidth"; + auto updateMinContentWidthFunc = [key, weak = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { auto frameNode = weak.Upgrade(); CHECK_NULL_VOID(frameNode); auto navigationGroupNode = AceType::DynamicCast(frameNode); CHECK_NULL_VOID(navigationGroupNode); auto navigationPattern = navigationGroupNode->GetPattern(); CHECK_NULL_VOID(navigationPattern); + CalcDimension minContentWidth; + std::string minContentWidthString = navigationPattern->GetResCacheMapByKey(key); + if (minContentWidthString.empty()) { + ResourceParseUtils::ParseResDimensionVpNG(resObj, minContentWidth); + navigationPattern->AddResCache(key, minContentWidth.ToString()); + } else { + minContentWidth = StringUtils::StringToCalcDimension(minContentWidthString); + } + if (LessNotEqual(minContentWidth.Value(), 0.0)) { + minContentWidth = DEFAULT_MIN_CONTENT_WIDTH; + } navigationPattern->SetIfNeedInit(true); ACE_UPDATE_NODE_LAYOUT_PROPERTY(NavigationLayoutProperty, MinContentWidth, minContentWidth, frameNode); navigationGroupNode->MarkModifyDone(); @@ -1818,7 +1939,7 @@ void NavigationModelNG::SetMinContentWidth(FrameNode* frameNode, const RefPtrGetPattern(); CHECK_NULL_VOID(pattern); - pattern->AddResObj("navigation.minContentWidth", minContentWidthResObj, std::move(updateMinContentWidthFunc)); + pattern->AddResObj(key, minContentWidthResObj, std::move(updateMinContentWidthFunc)); } void NavigationModelNG::SetMinNavBarWidth(FrameNode* frameNode, const Dimension& value) @@ -1843,18 +1964,25 @@ void NavigationModelNG::SetMinNavBarWidth(FrameNode* frameNode, const RefPtr& resObj) { - CalcDimension minNavBarWidth; - ResourceParseUtils::ParseResDimensionVpNG(resObj, minNavBarWidth); - if (LessNotEqual(minNavBarWidth.Value(), 0.0)) { - minNavBarWidth.SetValue(0); - } + std::string key = "navigation.navBarWidthRange.minNavBarWidth"; + auto updateMinNavBarWidthFunc = [key, weak = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { auto frameNode = weak.Upgrade(); CHECK_NULL_VOID(frameNode); auto navigationGroupNode = AceType::DynamicCast(frameNode); CHECK_NULL_VOID(navigationGroupNode); auto navigationPattern = navigationGroupNode->GetPattern(); CHECK_NULL_VOID(navigationPattern); + CalcDimension minNavBarWidth; + std::string minNavBarWidthString = navigationPattern->GetResCacheMapByKey(key); + if (minNavBarWidthString.empty()) { + ResourceParseUtils::ParseResDimensionVpNG(resObj, minNavBarWidth); + navigationPattern->AddResCache(key, minNavBarWidth.ToString()); + } else { + minNavBarWidth = StringUtils::StringToCalcDimension(minNavBarWidthString); + } + if (LessNotEqual(minNavBarWidth.Value(), 0.0)) { + minNavBarWidth.SetValue(0); + } navigationPattern->SetIfNeedInit(true); ACE_UPDATE_NODE_LAYOUT_PROPERTY(NavigationLayoutProperty, MinNavBarWidth, minNavBarWidth, frameNode); navigationGroupNode->MarkModifyDone(); @@ -1862,8 +1990,7 @@ void NavigationModelNG::SetMinNavBarWidth(FrameNode* frameNode, const RefPtrGetPattern(); CHECK_NULL_VOID(pattern); - pattern->AddResObj( - "navigation.navBarWidthRange.minNavBarWidth", minNavBarWidthResObj, std::move(updateMinNavBarWidthFunc)); + pattern->AddResObj(key, minNavBarWidthResObj, std::move(updateMinNavBarWidthFunc)); } void NavigationModelNG::SetMaxNavBarWidth(FrameNode* frameNode, const Dimension& value) @@ -1888,18 +2015,25 @@ void NavigationModelNG::SetMaxNavBarWidth(FrameNode* frameNode, const RefPtr& resObj) { - CalcDimension maxNavBarWidth; - ResourceParseUtils::ParseResDimensionVpNG(resObj, maxNavBarWidth); - if (LessNotEqual(maxNavBarWidth.Value(), 0.0)) { - maxNavBarWidth.SetValue(0); - } + std::string key = "navigation.navBarWidthRange.maxNavBarWidth"; + auto updateMaxNavBarWidthFunc = [key, weak = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { auto frameNode = weak.Upgrade(); CHECK_NULL_VOID(frameNode); auto navigationGroupNode = AceType::DynamicCast(frameNode); CHECK_NULL_VOID(navigationGroupNode); auto navigationPattern = navigationGroupNode->GetPattern(); CHECK_NULL_VOID(navigationPattern); + CalcDimension maxNavBarWidth; + std::string maxNavBarWidthString = navigationPattern->GetResCacheMapByKey(key); + if (maxNavBarWidthString.empty()) { + ResourceParseUtils::ParseResDimensionVpNG(resObj, maxNavBarWidth); + navigationPattern->AddResCache(key, maxNavBarWidth.ToString()); + } else { + maxNavBarWidth = StringUtils::StringToCalcDimension(maxNavBarWidthString); + } + if (LessNotEqual(maxNavBarWidth.Value(), 0.0)) { + maxNavBarWidth.SetValue(0); + } navigationPattern->SetIfNeedInit(true); ACE_UPDATE_NODE_LAYOUT_PROPERTY(NavigationLayoutProperty, MaxNavBarWidth, maxNavBarWidth, frameNode); navigationGroupNode->MarkModifyDone(); @@ -1907,8 +2041,7 @@ void NavigationModelNG::SetMaxNavBarWidth(FrameNode* frameNode, const RefPtrGetPattern(); CHECK_NULL_VOID(pattern); - pattern->AddResObj( - "navigation.navBarWidthRange.maxNavBarWidth", maxNavBarWidthResObj, std::move(updateMaxNavBarWidthFunc)); + pattern->AddResObj(key, maxNavBarWidthResObj, std::move(updateMaxNavBarWidthFunc)); } void NavigationModelNG::SetNavBarWidth(FrameNode* frameNode, const Dimension& value) @@ -1937,19 +2070,26 @@ void NavigationModelNG::SetNavBarWidth(FrameNode* frameNode, const RefPtr& resObj) { - CalcDimension navBarWidth; - ResourceParseUtils::ParseResDimensionVpNG(resObj, navBarWidth); - if (navBarWidth.Value() <= 0) { - navBarWidth.SetValue(DEFAULT_NAV_BAR_WIDTH_VALUE); - } + std::string key = "navigation.navBarWidth"; + auto updateNavBarWidthFunc = [key, weak = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { auto frameNode = weak.Upgrade(); CHECK_NULL_VOID(frameNode); - ACE_UPDATE_NODE_LAYOUT_PROPERTY(NavigationLayoutProperty, NavBarWidth, navBarWidth, frameNode); auto navigationGroupNode = AceType::DynamicCast(frameNode); CHECK_NULL_VOID(navigationGroupNode); auto navigationPattern = navigationGroupNode->GetPattern(); CHECK_NULL_VOID(navigationPattern); + CalcDimension navBarWidth; + std::string navBarWidthString = navigationPattern->GetResCacheMapByKey(key); + if (navBarWidthString.empty()) { + ResourceParseUtils::ParseResDimensionVpNG(resObj, navBarWidth); + navigationPattern->AddResCache(key, navBarWidth.ToString()); + } else { + navBarWidth = StringUtils::StringToCalcDimension(navBarWidthString); + } + if (navBarWidth.Value() <= 0) { + navBarWidth.SetValue(DEFAULT_NAV_BAR_WIDTH_VALUE); + } + ACE_UPDATE_NODE_LAYOUT_PROPERTY(NavigationLayoutProperty, NavBarWidth, navBarWidth, frameNode); navigationPattern->SetUserSetNavBarWidthFlag(true); if (navigationPattern->GetInitNavBarWidth() != navBarWidth) { navigationPattern->SetInitNavBarWidth(navBarWidth); @@ -1959,7 +2099,7 @@ void NavigationModelNG::SetNavBarWidth(FrameNode* frameNode, const RefPtrGetPattern(); CHECK_NULL_VOID(pattern); - pattern->AddResObj("navigation.navBarWidth", navBarWidthResObj, std::move(updateNavBarWidthFunc)); + pattern->AddResObj(key, navBarWidthResObj, std::move(updateNavBarWidthFunc)); } void NavigationModelNG::SetNavBarPosition(FrameNode* frameNode, NG::NavBarPosition mode) @@ -2006,28 +2146,38 @@ void NavigationModelNG::SetBackButtonIcon(FrameNode* frameNode, std::string result; ResourceParseUtils::ParseResMedia(backButtonIconResObj, result); SetBackButtonIcon(frameNode, symbolApply, result, imageOption, pixMap); - auto&& updateFunc = [weak = AceType::WeakClaim(frameNode)](const RefPtr& backButtonIconResObj) { - auto frameNode = weak.Upgrade(); - CHECK_NULL_VOID(frameNode); - auto navigationGroupNode = AceType::DynamicCast(frameNode); - CHECK_NULL_VOID(navigationGroupNode); - auto navBarNode = AceType::DynamicCast(navigationGroupNode->GetNavBarNode()); - CHECK_NULL_VOID(navBarNode); - auto titleBarNode = AceType::DynamicCast(navBarNode->GetTitleBarNode()); + auto navigationGroupNode = AceType::DynamicCast(frameNode); + CHECK_NULL_VOID(navigationGroupNode); + auto navBarNode = AceType::DynamicCast(navigationGroupNode->GetNavBarNode()); + CHECK_NULL_VOID(navBarNode); + auto titleBarNode = AceType::DynamicCast(navBarNode->GetTitleBarNode()); + CHECK_NULL_VOID(titleBarNode); + std::string key = "navigation.backButtonIcon.icon"; + auto updateFunc = [key, weakFrameNode = AceType::WeakClaim(frameNode), + weakTitleBarNode = AceType::WeakClaim(AceType::RawPtr(titleBarNode))]( + const RefPtr& backButtonIconResObj) { + auto titleBarNode = weakTitleBarNode.Upgrade(); CHECK_NULL_VOID(titleBarNode); - auto titleBarLayoutProperty = titleBarNode->GetLayoutProperty(); - CHECK_NULL_VOID(titleBarLayoutProperty); - std::string result; - ResourceParseUtils::ParseResMedia(backButtonIconResObj, result); + auto pattern = titleBarNode->GetPattern(); + CHECK_NULL_VOID(pattern); + std::string result = pattern->GetResCacheMapByKey(key); + if (result.empty()) { + ResourceParseUtils::ParseResMedia(backButtonIconResObj, result); + pattern->AddResCache(key, result); + } ImageSourceInfo imageSourceInfo(result); + auto frameNode = weakFrameNode.Upgrade(); + CHECK_NULL_VOID(frameNode); ACE_UPDATE_NODE_LAYOUT_PROPERTY(NavigationLayoutProperty, ImageSource, imageSourceInfo, frameNode); + auto titleBarLayoutProperty = titleBarNode->GetLayoutProperty(); + CHECK_NULL_VOID(titleBarLayoutProperty); titleBarLayoutProperty->UpdateImageSource(imageSourceInfo); titleBarNode->MarkModifyDone(); titleBarNode->MarkDirtyNode(); }; - auto pattern = frameNode->GetPattern(); + auto pattern = titleBarNode->GetPattern(); CHECK_NULL_VOID(pattern); - pattern->AddResObj("navigation.backButtonIcon.icon", backButtonIconResObj, std::move(updateFunc)); + pattern->AddResObj(key, backButtonIconResObj, std::move(updateFunc)); } void NavigationModelNG::SetHideNavBarInner( @@ -2296,6 +2446,33 @@ void NavigationModelNG::SetCustomTransition(NavigationTransitionEvent&& customTr pattern->SetNavigationTransition(std::move(customTransition)); } +void NavigationModelNG::ResetResObj(NavigationPatternType type, const std::string& key) +{ + if (!SystemProperties::ConfigChangePerform()) { + return; + } + auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); + CHECK_NULL_VOID(frameNode); + auto navigationGroupNode = AceType::DynamicCast(frameNode); + CHECK_NULL_VOID(navigationGroupNode); + RefPtr pattern = nullptr; + if (type == NavigationPatternType::NAV_BAR) { + auto navBarNode = AceType::DynamicCast(navigationGroupNode->GetNavBarNode()); + CHECK_NULL_VOID(navBarNode); + pattern = navBarNode->GetPattern(); + } else if (type == NavigationPatternType::TITLE_BAR) { + auto navBarNode = AceType::DynamicCast(navigationGroupNode->GetNavBarNode()); + CHECK_NULL_VOID(navBarNode); + auto titleBarNode = AceType::DynamicCast(navBarNode->GetTitleBarNode()); + CHECK_NULL_VOID(titleBarNode); + pattern = titleBarNode->GetPattern(); + } else if (type == NavigationPatternType::NAVIGATION) { + pattern = navigationGroupNode->GetPattern(); + } + CHECK_NULL_VOID(pattern); + pattern->RemoveResObj(key); +} + void NavigationModelNG::SetTitlebarOptions(NavigationTitlebarOptions&& opt) { auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); @@ -2315,9 +2492,9 @@ void NavigationModelNG::SetTitlebarOptions(NavigationTitlebarOptions&& opt) return; } RefPtr resObj = AceType::MakeRefPtr("", "", -1); - auto&& updateFunc = [weakFrameNode = AceType::WeakClaim(frameNode), - weakTitleBarPattern = AceType::WeakClaim(AceType::RawPtr(titleBarPattern)), - opt](const RefPtr& resObj) mutable { + auto updateFunc = [weakFrameNode = AceType::WeakClaim(frameNode), + weakTitleBarPattern = AceType::WeakClaim(AceType::RawPtr(titleBarPattern)), + opt](const RefPtr& resObj) mutable { opt.bgOptions.ReloadResources(); if (opt.bgOptions.blurStyleOption.has_value()) { opt.bgOptions.blurStyleOption->ReloadResources(); @@ -2384,9 +2561,9 @@ void NavigationModelNG::SetMenuOptions(NavigationMenuOptions&& opt) return; } RefPtr resObj = AceType::MakeRefPtr("", "", -1); - auto&& updateFunc = [weakFrameNode = AceType::WeakClaim(frameNode), - weakNavBarPattern = AceType::WeakClaim(AceType::RawPtr(navBarPattern)), - opt](const RefPtr& resObj) mutable { + auto updateFunc = [weakFrameNode = AceType::WeakClaim(frameNode), + weakNavBarPattern = AceType::WeakClaim(AceType::RawPtr(navBarPattern)), + opt](const RefPtr& resObj) mutable { opt.mbOptions.bgOptions.ReloadResources(); if (opt.mbOptions.bgOptions.blurStyleOption.has_value()) { opt.mbOptions.bgOptions.blurStyleOption->ReloadResources(); @@ -2404,9 +2581,7 @@ void NavigationModelNG::SetMenuOptions(NavigationMenuOptions&& opt) navigationGroupNode->MarkModifyDone(); navigationGroupNode->MarkDirtyNode(); }; - auto pattern = navigationGroupNode->GetPattern(); - CHECK_NULL_VOID(pattern); - pattern->AddResObj("navigation.navigationMenuOptions", resObj, std::move(updateFunc)); + navBarPattern->AddResObj("navigation.navigationMenuOptions", resObj, std::move(updateFunc)); } void NavigationModelNG::SetIgnoreLayoutSafeArea(const SafeAreaExpandOpts& opts) @@ -2585,8 +2760,8 @@ void NavigationModelNG::ParseCommonTitle(FrameNode* frameNode, const NG::Navigat return; } -void NavigationModelNG::ParseCommonTitle(FrameNode* frameNode, const NG::NavigationTitleInfo& titleInfo, - const RefPtr& titleResObj, const RefPtr& subtitleResObj, bool ignoreMainTitle) +void NavigationModelNG::ParseCommonTitle( + FrameNode* frameNode, const RefPtr& titleResObj, const RefPtr& subtitleResObj) { CHECK_NULL_VOID(frameNode); auto navigationGroupNode = AceType::DynamicCast(frameNode); @@ -2603,17 +2778,13 @@ void NavigationModelNG::ParseCommonTitle(FrameNode* frameNode, const NG::Navigat if (subtitleResObj) { hasSubTitle = ResourceParseUtils::ParseResString(subtitleResObj, subtitle); } - if (titleResObj) { - hasMainTitle = ResourceParseUtils::ParseResString(titleResObj, title); - } + hasMainTitle = ResourceParseUtils::ParseResString(titleResObj, title); if (!hasSubTitle && !hasMainTitle) { return; } NG::NavigationTitleInfo ngTitleInfo = { hasSubTitle, hasMainTitle, subtitle, title }; ParseCommonTitle(frameNode, ngTitleInfo); - if (titleResObj) { - UpdateMainTitleInfo(titleBarNode, titleResObj); - } + UpdateMainTitleInfo(titleBarNode, titleResObj); if (subtitleResObj) { UpdateSubTitleInfo(titleBarNode, subtitleResObj); } @@ -2624,46 +2795,58 @@ void NavigationModelNG::UpdateMainTitleInfo( const RefPtr& titleBarNode, const RefPtr& mainResObj) { CHECK_NULL_VOID(titleBarNode); - auto&& updateFunc = [weak = AceType::WeakClaim(AceType::RawPtr(titleBarNode))] - (const RefPtr& mainResObj) mutable { + std::string key = "navigation.title.commonMainTitle"; + auto updateFunc = [key, weak = AceType::WeakClaim(AceType::RawPtr(titleBarNode))]( + const RefPtr& mainResObj) mutable { auto titleBarNode = weak.Upgrade(); CHECK_NULL_VOID(titleBarNode); - std::string title; - ResourceParseUtils::ParseResString(mainResObj, title); + auto titleBarPattern = titleBarNode->GetPattern(); + CHECK_NULL_VOID(titleBarPattern); + std::string title = titleBarPattern->GetResCacheMapByKey(key); + if (title.empty()) { + ResourceParseUtils::ParseResString(mainResObj, title); + titleBarPattern->AddResCache(key, title); + } auto mainTitle = AceType::DynamicCast(titleBarNode->GetTitle()); if (mainTitle) { auto textLayoutProperty = mainTitle->GetLayoutProperty(); textLayoutProperty->UpdateContent(title); + titleBarNode->MarkModifyDone(); + titleBarNode->MarkDirtyNode(); } - titleBarNode->MarkModifyDone(); - titleBarNode->MarkDirtyNode(); }; auto titleBarPattern = titleBarNode->GetPattern(); CHECK_NULL_VOID(titleBarPattern); - titleBarPattern->AddResObj("navigation.title.commonMainTitle", mainResObj, std::move(updateFunc)); + titleBarPattern->AddResObj(key, mainResObj, std::move(updateFunc)); } void NavigationModelNG::UpdateSubTitleInfo( const RefPtr& titleBarNode, const RefPtr& resObj) { CHECK_NULL_VOID(titleBarNode); - auto&& updateFunc = [weak = AceType::WeakClaim(AceType::RawPtr(titleBarNode))]( - const RefPtr& resObj) { + std::string key = "navigation.title.commonSubTitle"; + auto updateFunc = [key, weak = AceType::WeakClaim(AceType::RawPtr(titleBarNode))]( + const RefPtr& resObj) { auto titleBarNode = weak.Upgrade(); CHECK_NULL_VOID(titleBarNode); - std::string subtitle; - ResourceParseUtils::ParseResString(resObj, subtitle); - auto subTitle = AceType::DynamicCast(titleBarNode->GetSubtitle()); - if (subTitle) { - auto textLayoutProperty = subTitle->GetLayoutProperty(); - textLayoutProperty->UpdateContent(subtitle); + auto titleBarPattern = titleBarNode->GetPattern(); + CHECK_NULL_VOID(titleBarPattern); + std::string subTitleValue = titleBarPattern->GetResCacheMapByKey(key); + if (subTitleValue.empty()) { + ResourceParseUtils::ParseResString(resObj, subTitleValue); + titleBarPattern->AddResCache(key, subTitleValue); + } + auto subTitleNode = AceType::DynamicCast(titleBarNode->GetSubtitle()); + if (subTitleNode) { + auto textLayoutProperty = subTitleNode->GetLayoutProperty(); + textLayoutProperty->UpdateContent(subTitleValue); + titleBarNode->MarkModifyDone(); + titleBarNode->MarkDirtyNode(); } - titleBarNode->MarkModifyDone(); - titleBarNode->MarkDirtyNode(); }; auto titleBarPattern = titleBarNode->GetPattern(); CHECK_NULL_VOID(titleBarPattern); - titleBarPattern->AddResObj("navigation.title.commonSubTitle", resObj, std::move(updateFunc)); + titleBarPattern->AddResObj(key, resObj, std::move(updateFunc)); } void NavigationModelNG::SetTitlebarOptions(FrameNode* frameNode, NavigationTitlebarOptions&& opt) diff --git a/frameworks/core/components_ng/pattern/navigation/navigation_model_ng.h b/frameworks/core/components_ng/pattern/navigation/navigation_model_ng.h index d6dc782c2d7..f59f3a3e85f 100644 --- a/frameworks/core/components_ng/pattern/navigation/navigation_model_ng.h +++ b/frameworks/core/components_ng/pattern/navigation/navigation_model_ng.h @@ -35,7 +35,7 @@ public: bool ParseCommonTitle(bool hasSubTitle, bool hasMainTitle, const std::string& subtitle, const std::string& title, bool ignoreMainTitle = false) override; bool ParseCommonTitle(bool hasSubTitle, bool hasMainTitle, const RefPtr& subResObj, - const RefPtr& mainResObj, bool ignoreMainTitle = false) override; + const RefPtr& mainResObj) override; void UpdateMainTitle( const RefPtr& titleBarNode, const RefPtr& mainResObj) override; void UpdateSubTitle( @@ -45,7 +45,7 @@ public: void SetTitlebarOptions(NavigationTitlebarOptions&& opt) override; void SetCustomTitle(const RefPtr& customNode) override; void SetTitleHeight(const Dimension& height, bool isValid = true) override; - void SetTitleHeight(const RefPtr& resObj, bool isValid = true) override; + void SetTitleHeight(const RefPtr& resObj) override; void SetTitleMode(NG::NavigationTitleMode mode) override; void SetSubtitle(const std::string& subtitle) override; void SetEnableModeChangeAnimation(bool isEnable) override; @@ -109,6 +109,7 @@ public: void SetIsCustomAnimation(bool isCustom) override; void SetRecoverable(bool recoverable) override; void SetEnableDragBar(bool enableDragBar) override; + void ResetResObj(NavigationPatternType type, const std::string& key) override; void ResetSplitPlaceholder() override; static RefPtr CreateFrameNode(int32_t nodeId); @@ -145,9 +146,8 @@ public: void SetSystemBarStyle(const RefPtr& style) override; static void ParseCommonTitle(FrameNode* frameNode, const NG::NavigationTitleInfo& titleInfo, bool ignoreMainTitle = false); - static void ParseCommonTitle(FrameNode* frameNode, const NG::NavigationTitleInfo& titleInfo, - const RefPtr& titleResObj, const RefPtr& subtitleResObj, - bool ignoreMainTitle = false); + static void ParseCommonTitle( + FrameNode* frameNode, const RefPtr& titleResObj, const RefPtr& subtitleResObj); static void UpdateMainTitleInfo( const RefPtr& titleBarNode, const RefPtr& mainResObj); static void UpdateSubTitleInfo( @@ -174,6 +174,7 @@ public: static RefPtr GetNavigationStack(FrameNode* frameNode); static void SetOnNavBarStateChange(FrameNode* frameNode, std::function&& onNavBarStateChange); static CalcDimension ParseTitleHeight(const RefPtr& resObj); + static void ResetResObj(FrameNode* frameNode, NavigationPatternType type, const std::string& key); private: bool CreatePrimaryContentIfNeeded(const RefPtr& navigationGroupNode); diff --git a/frameworks/core/components_ng/pattern/navigation/navigation_pattern.cpp b/frameworks/core/components_ng/pattern/navigation/navigation_pattern.cpp index 56282dbda78..ba99f2c32be 100644 --- a/frameworks/core/components_ng/pattern/navigation/navigation_pattern.cpp +++ b/frameworks/core/components_ng/pattern/navigation/navigation_pattern.cpp @@ -1207,6 +1207,7 @@ void NavigationPattern::UpdateColorModeForNodes( auto hostNode = AceType::DynamicCast(GetHost()); CHECK_NULL_VOID(hostNode); auto lastIndex = hostNode->GetLastStandardIndex(); + lastIndex = lastIndex < 0 ? 0 : lastIndex; auto pipelineContext = hostNode->GetContext(); CHECK_NULL_VOID(pipelineContext); auto colorMode = pipelineContext->GetColorMode() == ColorMode::DARK ? true : false; diff --git a/frameworks/core/components_ng/pattern/navigation/navigation_toolbar_util.cpp b/frameworks/core/components_ng/pattern/navigation/navigation_toolbar_util.cpp index 5c5d78818d5..321b04d5125 100644 --- a/frameworks/core/components_ng/pattern/navigation/navigation_toolbar_util.cpp +++ b/frameworks/core/components_ng/pattern/navigation/navigation_toolbar_util.cpp @@ -712,9 +712,9 @@ void NavigationToolbarUtil::SetToolbarOptions( return; } RefPtr resObj = AceType::MakeRefPtr("", "", -1); - auto&& updateFunc = [weakNodeBase = AceType::WeakClaim(AceType::RawPtr(nodeBase)), - weakToolBarPattern = AceType::WeakClaim(AceType::RawPtr(toolBarPattern)), - opt](const RefPtr& resObj) mutable { + auto updateFunc = [weakNodeBase = AceType::WeakClaim(AceType::RawPtr(nodeBase)), + weakToolBarPattern = AceType::WeakClaim(AceType::RawPtr(toolBarPattern)), + opt](const RefPtr& resObj) mutable { opt.bgOptions.ReloadResources(); if (opt.bgOptions.blurStyleOption.has_value()) { opt.bgOptions.blurStyleOption->ReloadResources(); diff --git a/frameworks/core/components_ng/pattern/navrouter/navdestination_model.h b/frameworks/core/components_ng/pattern/navrouter/navdestination_model.h index 214d7199922..153498bdad0 100644 --- a/frameworks/core/components_ng/pattern/navrouter/navdestination_model.h +++ b/frameworks/core/components_ng/pattern/navrouter/navdestination_model.h @@ -29,6 +29,10 @@ #include "core/components_ng/pattern/navigation/title_bar_pattern.h" namespace OHOS::Ace { +enum class NavDestinationPatternType { + TITLE_BAR = 0, + NAV_DESTINATION, +}; class ACE_FORCE_EXPORT NavDestinationModel { public: static NavDestinationModel* GetInstance(); @@ -114,8 +118,9 @@ public: virtual void SetPreferredOrientation(const std::optional& ori) {} virtual void SetEnableStatusBar(const std::optional>& statusBar) {} virtual void SetEnableNavigationIndicator(const std::optional& navigationIndicator) {} + virtual void ResetResObj(NavDestinationPatternType type, const std::string& key) {} virtual bool ParseCommonTitle(bool hasSubTitle, bool hasMainTitle, const RefPtr& subResObj, - const RefPtr& mainResObj, bool ignoreMainTitle = false) {return false;}; + const RefPtr& mainResObj) {return false;}; virtual void UpdateMainTitle( const RefPtr& titleBarNode, const RefPtr& mainResObj) {}; virtual void UpdateSubTitle( diff --git a/frameworks/core/components_ng/pattern/navrouter/navdestination_model_ng.cpp b/frameworks/core/components_ng/pattern/navrouter/navdestination_model_ng.cpp index 398f2f3116d..81bbbf0dfc9 100644 --- a/frameworks/core/components_ng/pattern/navrouter/navdestination_model_ng.cpp +++ b/frameworks/core/components_ng/pattern/navrouter/navdestination_model_ng.cpp @@ -126,7 +126,7 @@ bool NavDestinationModelNG::ParseCommonTitle( } bool NavDestinationModelNG::ParseCommonTitle(bool hasSubTitle, bool hasMainTitle, - const RefPtr& subResObj, const RefPtr& mainResObj, bool ignoreMainTitle) + const RefPtr& subResObj, const RefPtr& mainResObj) { if (!hasSubTitle && !hasMainTitle) { return false; @@ -151,45 +151,59 @@ bool NavDestinationModelNG::ParseCommonTitle(bool hasSubTitle, bool hasMainTitle void NavDestinationModelNG::UpdateMainTitle( const RefPtr& titleBarNode, const RefPtr& mainResObj) { - auto&& updateFunc = [this, weak = AceType::WeakClaim(AceType::RawPtr(titleBarNode))] - (const RefPtr& mainResObj) { + std::string key = "navDestination.title.commonMainTitle"; + auto updateFunc = [this, key, weak = AceType::WeakClaim(AceType::RawPtr(titleBarNode))]( + const RefPtr& mainResObj) { auto titleBarNode = weak.Upgrade(); CHECK_NULL_VOID(titleBarNode); - std::string title; - ResourceParseUtils::ParseResString(mainResObj, title); + auto titleBarPattern = titleBarNode->GetPattern(); + CHECK_NULL_VOID(titleBarPattern); + std::string title = titleBarPattern->GetResCacheMapByKey(key); + if (title.empty()) { + ResourceParseUtils::ParseResString(mainResObj, title); + titleBarPattern->AddResCache(key, title); + } auto mainTitle = AceType::DynamicCast(titleBarNode->GetTitle()); if (mainTitle) { auto textLayoutProperty = mainTitle->GetLayoutProperty(); textLayoutProperty->UpdateContent(title); + titleBarNode->MarkModifyDone(); + titleBarNode->MarkDirtyNode(); } - titleBarNode->MarkModifyDone(); - titleBarNode->MarkDirtyNode(); }; + CHECK_NULL_VOID(titleBarNode); auto titleBarPattern = titleBarNode->GetPattern(); CHECK_NULL_VOID(titleBarPattern); - titleBarPattern->AddResObj("navDestination.title.commonMainTitle", mainResObj, std::move(updateFunc)); + titleBarPattern->AddResObj(key, mainResObj, std::move(updateFunc)); } void NavDestinationModelNG::UpdateSubTitle( const RefPtr& titleBarNode, const RefPtr& subResObj) { - auto&& updateFunc = [weak = AceType::WeakClaim(AceType::RawPtr(titleBarNode))] - (const RefPtr& resObj) { + std::string key = "navDestination.title.commonSubTitle"; + auto updateFunc = [key, weak = AceType::WeakClaim(AceType::RawPtr(titleBarNode))]( + const RefPtr& resObj) { auto titleBarNode = weak.Upgrade(); CHECK_NULL_VOID(titleBarNode); - std::string subtitle; - ResourceParseUtils::ParseResString(resObj, subtitle); - auto subTitle = AceType::DynamicCast(titleBarNode->GetSubtitle()); - if (subTitle) { - auto textLayoutProperty = subTitle->GetLayoutProperty(); - textLayoutProperty->UpdateContent(subtitle); + auto titleBarPattern = titleBarNode->GetPattern(); + CHECK_NULL_VOID(titleBarPattern); + std::string subTitleValue = titleBarPattern->GetResCacheMapByKey(key); + if (subTitleValue.empty()) { + ResourceParseUtils::ParseResString(resObj, subTitleValue); + titleBarPattern->AddResCache(key, subTitleValue); + } + auto subTitleNode = AceType::DynamicCast(titleBarNode->GetSubtitle()); + if (subTitleNode) { + auto textLayoutProperty = subTitleNode->GetLayoutProperty(); + textLayoutProperty->UpdateContent(subTitleValue); + titleBarNode->MarkModifyDone(); + titleBarNode->MarkDirtyNode(); } - titleBarNode->MarkModifyDone(); - titleBarNode->MarkDirtyNode(); }; + CHECK_NULL_VOID(titleBarNode); auto titleBarPattern = titleBarNode->GetPattern(); CHECK_NULL_VOID(titleBarPattern); - titleBarPattern->AddResObj("navDestination.commonSubTitle", subResObj, std::move(updateFunc)); + titleBarPattern->AddResObj(key, subResObj, std::move(updateFunc)); } void CreateContentNode(const RefPtr& navDestinationNode) @@ -408,8 +422,8 @@ void NavDestinationModelNG::RegisterBackgroundColorUpdateCallback( auto pattern = navDestinationNode->GetPattern(); CHECK_NULL_VOID(pattern); auto resourceObject = AceType::MakeRefPtr("", "", 0); - auto&& updateFunc = [weakPattern = AceType::WeakClaim(AceType::RawPtr(pattern))]( - const RefPtr& resObj) { + auto updateFunc = [weakPattern = AceType::WeakClaim(AceType::RawPtr(pattern))]( + const RefPtr& resObj) { auto pattern = weakPattern.Upgrade(); CHECK_NULL_VOID(pattern); pattern->UpdateBackgroundColor(); @@ -511,9 +525,9 @@ void NavDestinationModelNG::SetTitlebarOptions(NavigationTitlebarOptions&& opt) return; } RefPtr resObj = AceType::MakeRefPtr("", "", -1); - auto&& updateFunc = [weakTitleBarNode = AceType::WeakClaim(AceType::RawPtr(titleBarNode)), - weakTitleBarPattern = AceType::WeakClaim(AceType::RawPtr(titleBarPattern)), - opt](const RefPtr& resObj) mutable { + auto updateFunc = [weakTitleBarNode = AceType::WeakClaim(AceType::RawPtr(titleBarNode)), + weakTitleBarPattern = AceType::WeakClaim(AceType::RawPtr(titleBarPattern)), + opt](const RefPtr& resObj) mutable { opt.bgOptions.ReloadResources(); if (opt.bgOptions.blurStyleOption.has_value()) { opt.bgOptions.blurStyleOption->ReloadResources(); @@ -577,28 +591,32 @@ void NavDestinationModelNG::SetBackButtonIcon(const std::functionGetMainFrameNode(); CHECK_NULL_VOID(frameNode); - auto navigationGroupNode = AceType::DynamicCast(frameNode); - CHECK_NULL_VOID(navigationGroupNode); - auto navBarNode = AceType::DynamicCast(navigationGroupNode->GetNavBarNode()); - CHECK_NULL_VOID(navBarNode); - auto titleBarNode = AceType::DynamicCast(navBarNode->GetTitleBarNode()); + auto navDestinationNode = AceType::DynamicCast(frameNode); + CHECK_NULL_VOID(navDestinationNode); + auto titleBarNode = AceType::DynamicCast(navDestinationNode->GetTitleBarNode()); CHECK_NULL_VOID(titleBarNode); - auto&& updateFunc = [nameList, weak = AceType::WeakClaim(AceType::RawPtr(titleBarNode))]( - const RefPtr& resObj) { + std::string key = "navDestination.backButtonIcon.icon"; + auto updateFunc = [nameList, key, weak = AceType::WeakClaim(AceType::RawPtr(titleBarNode))]( + const RefPtr& resObj) { auto titleBarNode = weak.Upgrade(); CHECK_NULL_VOID(titleBarNode); + auto titleBarPattern = titleBarNode->GetPattern(); + CHECK_NULL_VOID(titleBarPattern); + std::string result = titleBarPattern->GetResCacheMapByKey(key); + if (result.empty()) { + ResourceParseUtils::ParseResMedia(resObj, result); + titleBarPattern->AddResCache(key, result); + } + ImageSourceInfo imageSourceInfo(result, nameList[0], nameList[1]); auto titleBarLayoutProperty = titleBarNode->GetLayoutProperty(); CHECK_NULL_VOID(titleBarLayoutProperty); - std::string result; - ResourceParseUtils::ParseResMedia(resObj, result); - ImageSourceInfo imageSourceInfo(result, nameList[0], nameList[1]); titleBarLayoutProperty->UpdateImageSource(imageSourceInfo); titleBarNode->MarkModifyDone(); titleBarNode->MarkDirtyNode(); }; auto titleBarPattern = titleBarNode->GetPattern(); CHECK_NULL_VOID(titleBarPattern); - titleBarPattern->AddResObj("navDestination.backButtonIcon.icon", resObj, std::move(updateFunc)); + titleBarPattern->AddResObj(key, resObj, std::move(updateFunc)); } void NavDestinationModelNG::SetBackButtonIconSrcAndTextRes( @@ -626,35 +644,47 @@ void NavDestinationModelNG::SetBackButtonIconSrcAndTextRes( void NavDestinationModelNG::UpdateBackButtonIcon(const std::vector& nameList, const RefPtr& titleBarNode, const RefPtr& backButtonIconResObj) { - auto&& updateFunc = [nameList, weak = AceType::WeakClaim(AceType::RawPtr(titleBarNode))]( - const RefPtr& backButtonIconResObj) { + std::string key = "navDestination.backButtonIcon.icon"; + auto updateFunc = [nameList, key, weak = AceType::WeakClaim(AceType::RawPtr(titleBarNode))]( + const RefPtr& backButtonIconResObj) { auto titleBarNode = weak.Upgrade(); CHECK_NULL_VOID(titleBarNode); + auto titleBarPattern = titleBarNode->GetPattern(); + CHECK_NULL_VOID(titleBarPattern); + std::string result = titleBarPattern->GetResCacheMapByKey(key); + if (result.empty()) { + ResourceParseUtils::ParseResMedia(backButtonIconResObj, result); + titleBarPattern->AddResCache(key, result); + } + ImageSourceInfo imageSourceInfo(result, nameList[0], nameList[1]); auto titleBarLayoutProperty = titleBarNode->GetLayoutProperty(); CHECK_NULL_VOID(titleBarLayoutProperty); - std::string result; - ResourceParseUtils::ParseResMedia(backButtonIconResObj, result); - ImageSourceInfo imageSourceInfo(result, nameList[0], nameList[1]); titleBarLayoutProperty->UpdateImageSource(imageSourceInfo); titleBarNode->MarkModifyDone(); titleBarNode->MarkDirtyNode(); }; auto titleBarPattern = titleBarNode->GetPattern(); CHECK_NULL_VOID(titleBarPattern); - titleBarPattern->AddResObj("navDestination.backButtonIcon.icon", backButtonIconResObj, std::move(updateFunc)); + titleBarPattern->AddResObj(key, backButtonIconResObj, std::move(updateFunc)); } void NavDestinationModelNG::UpdateBackButtonIconText(bool userDefinedAccessibilityText, const RefPtr& titleBarNode, const RefPtr& backButtonTextResObj) { - auto&& updateFunc = [userDefinedAccessibilityText, weak = AceType::WeakClaim(AceType::RawPtr(titleBarNode))]( - const RefPtr& backButtonTextResObj) { + std::string key = "navDestination.backButtonIcon.accessibilityText"; + auto updateFunc = [userDefinedAccessibilityText, key, weak = AceType::WeakClaim(AceType::RawPtr(titleBarNode))]( + const RefPtr& backButtonTextResObj) { auto titleBarNode = weak.Upgrade(); CHECK_NULL_VOID(titleBarNode); auto backButtonNode = AceType::DynamicCast(titleBarNode->GetBackButton()); CHECK_NULL_VOID(backButtonNode); - std::string backButtonAccessibilityText; - ResourceParseUtils::ParseResString(backButtonTextResObj, backButtonAccessibilityText); + auto titleBarPattern = titleBarNode->GetPattern(); + CHECK_NULL_VOID(titleBarPattern); + std::string backButtonAccessibilityText = titleBarPattern->GetResCacheMapByKey(key); + if (backButtonAccessibilityText.empty()) { + ResourceParseUtils::ParseResString(backButtonTextResObj, backButtonAccessibilityText); + titleBarPattern->AddResCache(key, backButtonAccessibilityText); + } if (userDefinedAccessibilityText) { NavigationTitleUtil::SetAccessibility(backButtonNode, backButtonAccessibilityText); } else { @@ -666,8 +696,7 @@ void NavDestinationModelNG::UpdateBackButtonIconText(bool userDefinedAccessibili }; auto titleBarPattern = titleBarNode->GetPattern(); CHECK_NULL_VOID(titleBarPattern); - titleBarPattern->AddResObj( - "navDestination.backButtonIcon.accessibilityText", backButtonTextResObj, std::move(updateFunc)); + titleBarPattern->AddResObj(key, backButtonTextResObj, std::move(updateFunc)); } void NavDestinationModelNG::SetBackButtonIconTextRes(const std::function)>& symbolApply, @@ -681,20 +710,24 @@ void NavDestinationModelNG::SetBackButtonIconTextRes(const std::functionGetMainFrameNode(); CHECK_NULL_VOID(frameNode); - auto navigationGroupNode = AceType::DynamicCast(frameNode); - CHECK_NULL_VOID(navigationGroupNode); - auto navBarNode = AceType::DynamicCast(navigationGroupNode->GetNavBarNode()); - CHECK_NULL_VOID(navBarNode); - auto titleBarNode = AceType::DynamicCast(navBarNode->GetTitleBarNode()); + auto navDestinationNode = AceType::DynamicCast(frameNode); + CHECK_NULL_VOID(navDestinationNode); + auto titleBarNode = AceType::DynamicCast(navDestinationNode->GetTitleBarNode()); CHECK_NULL_VOID(titleBarNode); - auto&& updateFunc = [userDefinedAccessibilityText, weak = AceType::WeakClaim(AceType::RawPtr(titleBarNode))]( - const RefPtr& resObj) { + std::string key = "navDestination.backButtonIcon.accessibilityText"; + auto updateFunc = [userDefinedAccessibilityText, key, weak = AceType::WeakClaim(AceType::RawPtr(titleBarNode))]( + const RefPtr& resObj) { auto titleBarNode = weak.Upgrade(); CHECK_NULL_VOID(titleBarNode); auto backButtonNode = AceType::DynamicCast(titleBarNode->GetBackButton()); CHECK_NULL_VOID(backButtonNode); - std::string backButtonAccessibilityText; - ResourceParseUtils::ParseResString(resObj, backButtonAccessibilityText); + auto titleBarPattern = titleBarNode->GetPattern(); + CHECK_NULL_VOID(titleBarPattern); + std::string backButtonAccessibilityText = titleBarPattern->GetResCacheMapByKey(key); + if (backButtonAccessibilityText.empty()) { + ResourceParseUtils::ParseResString(resObj, backButtonAccessibilityText); + titleBarPattern->AddResCache(key, backButtonAccessibilityText); + } if (userDefinedAccessibilityText) { NavigationTitleUtil::SetAccessibility(backButtonNode, backButtonAccessibilityText); } else { @@ -706,7 +739,7 @@ void NavDestinationModelNG::SetBackButtonIconTextRes(const std::functionGetPattern(); CHECK_NULL_VOID(titleBarPattern); - titleBarPattern->AddResObj("navDestination.backButtonIcon.accessibilityText", resObj, std::move(updateFunc)); + titleBarPattern->AddResObj(key, resObj, std::move(updateFunc)); } void NavDestinationModelNG::SetSubtitle(const std::string& subtitle) @@ -784,20 +817,38 @@ void NavDestinationModelNG::SetTitleHeight(const RefPtr& resObj, CalcDimension NavDestinationModelNG::ParseTitleHeight(const RefPtr& resObj) { + auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); + CHECK_NULL_RETURN(frameNode, Dimension()); + auto navDestinationGroupNode = AceType::DynamicCast(frameNode); + CHECK_NULL_RETURN(navDestinationGroupNode, Dimension()); + auto titleBarNode = AceType::DynamicCast(navDestinationGroupNode->GetTitleBarNode()); + CHECK_NULL_RETURN(titleBarNode, Dimension()); + auto titleBarPattern = titleBarNode->GetPattern(); + CHECK_NULL_RETURN(titleBarPattern, Dimension()); + std::string key = "navDestination.title.customtitle"; + std::string heightString = titleBarPattern->GetResCacheMapByKey(key); std::string heightValue; - if (ResourceParseUtils::ParseResString(resObj, heightValue)) { - if (heightValue == NG::TITLE_MAIN_WITH_SUB) { - return NG::DOUBLE_LINE_TITLEBAR_HEIGHT; - } - if (heightValue == NG::TITLE_MAIN) { - return NG::SINGLE_LINE_TITLEBAR_HEIGHT; - } + if (heightString.empty() && ResourceParseUtils::ParseResString(resObj, heightValue)) { + titleBarPattern->AddResCache(key, heightValue); + } else { + heightValue = heightString; + } + if (heightValue == NG::TITLE_MAIN_WITH_SUB) { + return NG::DOUBLE_LINE_TITLEBAR_HEIGHT; + } + if (heightValue == NG::TITLE_MAIN) { + return NG::SINGLE_LINE_TITLEBAR_HEIGHT; } CalcDimension height; - bool isValid = ResourceParseUtils::ParseResDimensionVpNG(resObj, height); - if (!isValid || height.Value() < 0) { - height = Dimension(); + if (heightString.empty()) { + bool isValid = ResourceParseUtils::ParseResDimensionVpNG(resObj, height); + titleBarPattern->AddResCache(key, height.ToString()); + if (!isValid || height.Value() < 0) { + return Dimension(); + } + } else { + height = StringUtils::StringToCalcDimension(heightString); } return height; } @@ -805,8 +856,8 @@ CalcDimension NavDestinationModelNG::ParseTitleHeight(const RefPtr& titleBarNode, const RefPtr& resObj) { - auto&& updateFunc = [this, weak = AceType::WeakClaim(AceType::RawPtr(titleBarNode))]( - const RefPtr& resObj) { + auto updateFunc = [this, weak = AceType::WeakClaim(AceType::RawPtr(titleBarNode))]( + const RefPtr& resObj) { auto titleBarNode = weak.Upgrade(); CHECK_NULL_VOID(titleBarNode); auto titleBarLayoutProperty = titleBarNode->GetLayoutProperty(); @@ -931,6 +982,26 @@ void NavDestinationModelNG::SetHideBackButton(FrameNode* frameNode, bool hideBac navDestinationLayoutProperty->UpdateHideBackButton(hideBackButton); } +void NavDestinationModelNG::ResetResObj(FrameNode* frameNode, NavDestinationPatternType type, const std::string& key) +{ + if (!SystemProperties::ConfigChangePerform()) { + return; + } + CHECK_NULL_VOID(frameNode); + auto navDestinationNode = AceType::DynamicCast(frameNode); + CHECK_NULL_VOID(navDestinationNode); + RefPtr pattern = nullptr; + if (type == NavDestinationPatternType::TITLE_BAR) { + auto titleBarNode = AceType::DynamicCast(navDestinationNode->GetTitleBarNode()); + CHECK_NULL_VOID(titleBarNode); + pattern = titleBarNode->GetPattern(); + } else if (type == NavDestinationPatternType::NAV_DESTINATION) { + pattern = navDestinationNode->GetPattern(); + } + CHECK_NULL_VOID(pattern); + pattern->RemoveResObj(key); +} + void NavDestinationModelNG::SetBackButtonIcon( FrameNode* frameNode, const std::string& src, bool noPixMap, RefPtr& pixMap) { @@ -954,28 +1025,32 @@ void NavDestinationModelNG::SetBackButtonIcon( std::string result; ResourceParseUtils::ParseResMedia(backButtonIconResObj, result); SetBackButtonIcon(frameNode, result, noPixMap, pixMap); - auto navigationGroupNode = AceType::DynamicCast(frameNode); - CHECK_NULL_VOID(navigationGroupNode); - auto navBarNode = AceType::DynamicCast(navigationGroupNode->GetNavBarNode()); - CHECK_NULL_VOID(navBarNode); - auto titleBarNode = AceType::DynamicCast(navBarNode->GetTitleBarNode()); + auto navDestinationNode = AceType::DynamicCast(frameNode); + CHECK_NULL_VOID(navDestinationNode); + auto titleBarNode = AceType::DynamicCast(navDestinationNode->GetTitleBarNode()); CHECK_NULL_VOID(titleBarNode); - auto&& updateFunc = [weak = AceType::WeakClaim(AceType::RawPtr(titleBarNode))]( - const RefPtr& backButtonIconResObj) { + std::string key = "navDestination.backButtonIcon.icon"; + auto updateFunc = [key, weak = AceType::WeakClaim(AceType::RawPtr(titleBarNode))]( + const RefPtr& backButtonIconResObj) { auto titleBarNode = weak.Upgrade(); CHECK_NULL_VOID(titleBarNode); + auto titleBarPattern = titleBarNode->GetPattern(); + CHECK_NULL_VOID(titleBarPattern); + std::string result = titleBarPattern->GetResCacheMapByKey(key); + if (result.empty()) { + ResourceParseUtils::ParseResMedia(backButtonIconResObj, result); + titleBarPattern->AddResCache(key, result); + } + ImageSourceInfo imageSourceInfo(result); auto titleBarLayoutProperty = titleBarNode->GetLayoutProperty(); CHECK_NULL_VOID(titleBarLayoutProperty); - std::string result; - ResourceParseUtils::ParseResMedia(backButtonIconResObj, result); - ImageSourceInfo imageSourceInfo(result); titleBarLayoutProperty->UpdateImageSource(imageSourceInfo); titleBarNode->MarkModifyDone(); titleBarNode->MarkDirtyNode(); }; - auto pattern = frameNode->GetPattern(); - CHECK_NULL_VOID(pattern); - pattern->AddResObj("navDestination.backButtonIcon.icon", backButtonIconResObj, std::move(updateFunc)); + auto titleBarPattern = titleBarNode->GetPattern(); + CHECK_NULL_VOID(titleBarPattern); + titleBarPattern->AddResObj(key, backButtonIconResObj, std::move(updateFunc)); } void NavDestinationModelNG::SetNavDestinationMode(FrameNode* frameNode, NavDestinationMode mode) @@ -1034,10 +1109,10 @@ void NavDestinationModelNG::SetMenuItems(std::vector&& menuItems) if (!SystemProperties::ConfigChangePerform()) { return; } - RefPtr resObj; - auto&& updateFunc = [wekFrameNode = AceType::WeakClaim(frameNode), - menuItems](const RefPtr& resObj) { - for (BarItem item : menuItems) { + RefPtr resObj = AceType::MakeRefPtr("", "", -1); + auto updateFunc = [wekFrameNode = AceType::WeakClaim(frameNode), menuItems]( + const RefPtr& resObj) mutable { + for (BarItem& item : menuItems) { item.ReloadResources(); } auto frameNode = wekFrameNode.Upgrade(); @@ -1050,9 +1125,7 @@ void NavDestinationModelNG::SetMenuItems(std::vector&& menuItems) navDestinationGroupNode->MarkModifyDone(); navDestinationGroupNode->MarkDirtyNode(); }; - auto pattern = navDestinationGroupNode->GetPattern(); - CHECK_NULL_VOID(pattern); - pattern->AddResObj("navDestination.menuItems", resObj, std::move(updateFunc)); + navDestinationPattern->AddResObj("navDestination.menuItems", resObj, std::move(updateFunc)); } void NavDestinationModelNG::SetCustomMenu(const RefPtr& customNode) @@ -1093,9 +1166,9 @@ void NavDestinationModelNG::SetMenuOptions(NavigationMenuOptions&& opt) return; } RefPtr resObj = AceType::MakeRefPtr("", "", -1); - auto&& updateFunc = [weakFrameNode = AceType::WeakClaim(frameNode), - weakNavDestinationPattern = AceType::WeakClaim(AceType::RawPtr(navDestinationPattern)), - opt](const RefPtr& resObj) mutable { + auto updateFunc = [weakFrameNode = AceType::WeakClaim(frameNode), + weakNavDestinationPattern = AceType::WeakClaim(AceType::RawPtr(navDestinationPattern)), + opt](const RefPtr& resObj) mutable { opt.mbOptions.bgOptions.ReloadResources(); if (opt.mbOptions.bgOptions.blurStyleOption.has_value()) { opt.mbOptions.bgOptions.blurStyleOption->ReloadResources(); @@ -1113,10 +1186,7 @@ void NavDestinationModelNG::SetMenuOptions(NavigationMenuOptions&& opt) navDestinationNode->MarkModifyDone(); navDestinationNode->MarkDirtyNode(); }; - CHECK_NULL_VOID(frameNode); - auto pattern = frameNode->GetPattern(); - CHECK_NULL_VOID(pattern); - pattern->AddResObj("navDestination.navigationMenuOptions", resObj, std::move(updateFunc)); + navDestinationPattern->AddResObj("navDestination.navigationMenuOptions", resObj, std::move(updateFunc)); } void NavDestinationModelNG::SetBackgroundColor(const Color& color, bool isVaild) @@ -1261,6 +1331,27 @@ void NavDestinationModelNG::SetSystemBarStyle(const RefPtr& styl pattern->SetSystemBarStyle(style); } +void NavDestinationModelNG::ResetResObj(NavDestinationPatternType type, const std::string& key) +{ + if (!SystemProperties::ConfigChangePerform()) { + return; + } + auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); + CHECK_NULL_VOID(frameNode); + auto navDestinationNode = AceType::DynamicCast(frameNode); + CHECK_NULL_VOID(navDestinationNode); + RefPtr pattern = nullptr; + if (type == NavDestinationPatternType::TITLE_BAR) { + auto titleBarNode = AceType::DynamicCast(navDestinationNode->GetTitleBarNode()); + CHECK_NULL_VOID(titleBarNode); + pattern = titleBarNode->GetPattern(); + } else if (type == NavDestinationPatternType::NAV_DESTINATION) { + pattern = navDestinationNode->GetPattern(); + } + CHECK_NULL_VOID(pattern); + pattern->RemoveResObj(key); +} + void NavDestinationModelNG::ParseCommonTitle(FrameNode* frameNode, const NG::NavigationTitleInfo& titleInfo) { if (!titleInfo.hasSubTitle && !titleInfo.hasMainTitle) { @@ -1295,8 +1386,8 @@ void NavDestinationModelNG::ParseCommonTitle(FrameNode* frameNode, const NG::Nav return; } -void NavDestinationModelNG::ParseCommonTitle(FrameNode* frameNode, const NG::NavigationTitleInfo& titleInfo, - const RefPtr& titleResObj, const RefPtr& subtitleResObj) +void NavDestinationModelNG::ParseCommonTitle( + FrameNode* frameNode, const RefPtr& titleResObj, const RefPtr& subtitleResObj) { CHECK_NULL_VOID(frameNode); auto navDestinationNode = AceType::DynamicCast(frameNode); @@ -1310,17 +1401,13 @@ void NavDestinationModelNG::ParseCommonTitle(FrameNode* frameNode, const NG::Nav if (subtitleResObj) { hasSubTitle = ResourceParseUtils::ParseResString(subtitleResObj, subtitle); } - if (titleResObj) { - hasMainTitle = ResourceParseUtils::ParseResString(titleResObj, title); - } + hasMainTitle = ResourceParseUtils::ParseResString(titleResObj, title); if (!hasSubTitle && !hasMainTitle) { return; } NG::NavigationTitleInfo ngTitleInfo = { hasSubTitle, hasMainTitle, subtitle, title }; ParseCommonTitle(frameNode, ngTitleInfo); - if (titleResObj) { - UpdateMainTitleInfo(titleBarNode, titleResObj); - } + UpdateMainTitleInfo(titleBarNode, titleResObj); if (subtitleResObj) { UpdateSubTitleInfo(titleBarNode, subtitleResObj); } @@ -1331,46 +1418,58 @@ void NavDestinationModelNG::UpdateMainTitleInfo( const RefPtr& titleBarNode, const RefPtr& mainResObj) { CHECK_NULL_VOID(titleBarNode); - auto&& updateFunc = [weak = AceType::WeakClaim(AceType::RawPtr(titleBarNode))] - (const RefPtr& mainResObj) { + std::string key = "navDestination.title.commonMainTitle"; + auto updateFunc = [key, weak = AceType::WeakClaim(AceType::RawPtr(titleBarNode))]( + const RefPtr& mainResObj) { auto titleBarNode = weak.Upgrade(); CHECK_NULL_VOID(titleBarNode); - std::string title; - ResourceParseUtils::ParseResString(mainResObj, title); + auto titleBarPattern = titleBarNode->GetPattern(); + CHECK_NULL_VOID(titleBarPattern); + std::string title = titleBarPattern->GetResCacheMapByKey(key); + if (title.empty()) { + ResourceParseUtils::ParseResString(mainResObj, title); + titleBarPattern->AddResCache(key, title); + } auto mainTitle = AceType::DynamicCast(titleBarNode->GetTitle()); if (mainTitle) { auto textLayoutProperty = mainTitle->GetLayoutProperty(); textLayoutProperty->UpdateContent(title); + titleBarNode->MarkModifyDone(); + titleBarNode->MarkDirtyNode(); } - titleBarNode->MarkModifyDone(); - titleBarNode->MarkDirtyNode(); }; auto titleBarPattern = titleBarNode->GetPattern(); CHECK_NULL_VOID(titleBarPattern); - titleBarPattern->AddResObj("navDestination.title.commonMainTitle", mainResObj, std::move(updateFunc)); + titleBarPattern->AddResObj(key, mainResObj, std::move(updateFunc)); } void NavDestinationModelNG::UpdateSubTitleInfo( const RefPtr& titleBarNode, const RefPtr& subResObj) { CHECK_NULL_VOID(titleBarNode); - auto&& updateFunc = [weak = AceType::WeakClaim(AceType::RawPtr(titleBarNode))] - (const RefPtr& resObj) { + std::string key = "navDestination.title.commonSubTitle"; + auto updateFunc = [key, weak = AceType::WeakClaim(AceType::RawPtr(titleBarNode))]( + const RefPtr& resObj) { auto titleBarNode = weak.Upgrade(); CHECK_NULL_VOID(titleBarNode); - std::string subtitle; - ResourceParseUtils::ParseResString(resObj, subtitle); - auto subTitle = AceType::DynamicCast(titleBarNode->GetSubtitle()); - if (subTitle) { - auto textLayoutProperty = subTitle->GetLayoutProperty(); - textLayoutProperty->UpdateContent(subtitle); + auto titleBarPattern = titleBarNode->GetPattern(); + CHECK_NULL_VOID(titleBarPattern); + std::string subTitle = titleBarPattern->GetResCacheMapByKey(key); + if (subTitle.empty()) { + ResourceParseUtils::ParseResString(resObj, subTitle); + titleBarPattern->AddResCache(key, subTitle); + } + auto subTitleNode = AceType::DynamicCast(titleBarNode->GetSubtitle()); + if (subTitleNode) { + auto textLayoutProperty = subTitleNode->GetLayoutProperty(); + textLayoutProperty->UpdateContent(subTitle); + titleBarNode->MarkModifyDone(); + titleBarNode->MarkDirtyNode(); } - titleBarNode->MarkModifyDone(); - titleBarNode->MarkDirtyNode(); }; auto titleBarPattern = titleBarNode->GetPattern(); CHECK_NULL_VOID(titleBarPattern); - titleBarPattern->AddResObj("navDestination.title.commonSubTitle", subResObj, std::move(updateFunc)); + titleBarPattern->AddResObj(key, subResObj, std::move(updateFunc)); } void NavDestinationModelNG::SetTitlebarOptions(FrameNode* frameNode, NavigationTitlebarOptions&& opt) @@ -1432,8 +1531,8 @@ void NavDestinationModelNG::SetToolbarConfiguration(std::vector&& t return; } RefPtr resObj = AceType::MakeRefPtr("", "", -1); - auto&& updateFunc = [enabled, weak = AceType::WeakClaim(AceType::RawPtr(navdestinationGroupNode)), - fieldProperty, localToolBarItems, localOpt](const RefPtr& resObj) mutable { + auto updateFunc = [enabled, weak = AceType::WeakClaim(AceType::RawPtr(navdestinationGroupNode)), fieldProperty, + localToolBarItems, localOpt](const RefPtr& resObj) mutable { auto navdestinationGroupNode = weak.Upgrade(); CHECK_NULL_VOID(navdestinationGroupNode); if (localOpt.bgOptions.blurStyleOption.has_value()) { diff --git a/frameworks/core/components_ng/pattern/navrouter/navdestination_model_ng.h b/frameworks/core/components_ng/pattern/navrouter/navdestination_model_ng.h index a0a0a6e3eac..29a8d08a65e 100644 --- a/frameworks/core/components_ng/pattern/navrouter/navdestination_model_ng.h +++ b/frameworks/core/components_ng/pattern/navrouter/navdestination_model_ng.h @@ -97,8 +97,8 @@ public: void SetNavDestinationPathInfo(const std::string& moduleName, const std::string& pagePath) override; void SetSystemBarStyle(const RefPtr& style) override; static void ParseCommonTitle(FrameNode* frameNode, const NG::NavigationTitleInfo& titleInfo); - static void ParseCommonTitle(FrameNode* frameNode, const NG::NavigationTitleInfo& titleInfo, - const RefPtr& titleResObj, const RefPtr& subtitleResObj); + static void ParseCommonTitle( + FrameNode* frameNode, const RefPtr& titleResObj, const RefPtr& subtitleResObj); static void UpdateMainTitleInfo( const RefPtr& titleBarNode, const RefPtr& mainResObj); static void UpdateSubTitleInfo( @@ -140,13 +140,15 @@ public: void SetEnableNavigationIndicator(const std::optional& navigationIndicator) override; static void SetEnableNavigationIndicator( FrameNode* frameNode, const std::optional& navigationIndicator); + void ResetResObj(NavDestinationPatternType type, const std::string& key) override; bool ParseCommonTitle(bool hasSubTitle, bool hasMainTitle, const RefPtr& subResObj, - const RefPtr& mainResObj, bool ignoreMainTitle = false) override; + const RefPtr& mainResObj) override; void UpdateMainTitle( const RefPtr& titleBarNode, const RefPtr& mainResObj) override; void UpdateSubTitle( const RefPtr& titleBarNode, const RefPtr& subResObj) override; static CalcDimension ParseTitleHeight(const RefPtr& resObj); + static void ResetResObj(FrameNode* frameNode, NavDestinationPatternType type, const std::string& key); private: void CreateBackButton(const RefPtr& navDestinationNode); diff --git a/frameworks/core/components_ng/pattern/side_bar/side_bar_container_model.h b/frameworks/core/components_ng/pattern/side_bar/side_bar_container_model.h index dde06336d92..243010f070b 100644 --- a/frameworks/core/components_ng/pattern/side_bar/side_bar_container_model.h +++ b/frameworks/core/components_ng/pattern/side_bar/side_bar_container_model.h @@ -43,6 +43,7 @@ public: virtual void SetShowControlButton(bool showControlButton); virtual void ParseAndSetWidth(WidthType widthType, Dimension& width, bool isDoubleBind = false); virtual void ParseAndSetWidth(WidthType widthType, const RefPtr& resObj) {}; + virtual void ResetResObj(const std::string& key) {} virtual void SetSideBarWidth(const Dimension& sideBarWidth, bool isDoubleBind = false); virtual void SetMinSideBarWidth(const Dimension& minSideBarWidth); virtual void SetMaxSideBarWidth(const Dimension& maxSideBarWidth); diff --git a/frameworks/core/components_ng/pattern/side_bar/side_bar_container_model_ng.cpp b/frameworks/core/components_ng/pattern/side_bar/side_bar_container_model_ng.cpp index d7bb610d75f..1d326e3275c 100644 --- a/frameworks/core/components_ng/pattern/side_bar/side_bar_container_model_ng.cpp +++ b/frameworks/core/components_ng/pattern/side_bar/side_bar_container_model_ng.cpp @@ -160,64 +160,86 @@ void SideBarContainerModelNG::SetSideBarWidth(const RefPtr& resO { auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); CHECK_NULL_VOID(frameNode); - auto&& updateSideBarWidthFunc = [weak = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { + std::string key = "sideBarContainer.sideBarWidth"; + auto updateSideBarWidthFunc = [key, weak = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { auto frameNode = weak.Upgrade(); CHECK_NULL_VOID(frameNode); auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); pattern->MarkNeedInitRealSideBarWidth(true); CalcDimension sideBarWidth; - ResourceParseUtils::ParseResDimensionVpNG(resObj, sideBarWidth); + std::string sideBarWidthValue = pattern->GetResCacheMapByKey(key); + if (sideBarWidthValue.empty()) { + ResourceParseUtils::ParseResDimensionVpNG(resObj, sideBarWidth); + pattern->AddResCache(key, sideBarWidth.ToString()); + } else { + sideBarWidth = StringUtils::StringToCalcDimension(sideBarWidthValue); + } sideBarWidth = sideBarWidth.IsNonNegative() ? sideBarWidth : DEFAULT_SIDE_BAR_WIDTH; ACE_UPDATE_NODE_LAYOUT_PROPERTY(SideBarContainerLayoutProperty, SideBarWidth, sideBarWidth, frameNode); frameNode->MarkModifyDone(); frameNode->MarkDirtyNode(); }; - auto pattern = frameNode->GetPattern(); + auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); - pattern->AddResObj("sideBarContainer.sideBarWidth", resObj, std::move(updateSideBarWidthFunc)); + pattern->AddResObj(key, resObj, std::move(updateSideBarWidthFunc)); } void SideBarContainerModelNG::SetMinSideBarWidth(const RefPtr& resObj) { auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); CHECK_NULL_VOID(frameNode); - auto&& updateMinSideBarWidthFunc = [weak = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { + std::string key = "sideBarContainer.minSideBarWidth"; + auto updateMinSideBarWidthFunc = [key, weak = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { auto frameNode = weak.Upgrade(); CHECK_NULL_VOID(frameNode); auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); pattern->MarkNeedInitRealSideBarWidth(true); CalcDimension minSideBarWidth; - ResourceParseUtils::ParseResDimensionVpNG(resObj, minSideBarWidth); + std::string minSideBarWidthValue = pattern->GetResCacheMapByKey(key); + if (minSideBarWidthValue.empty()) { + ResourceParseUtils::ParseResDimensionVpNG(resObj, minSideBarWidth); + pattern->AddResCache(key, minSideBarWidth.ToString()); + } else { + minSideBarWidth = StringUtils::StringToCalcDimension(minSideBarWidthValue); + } minSideBarWidth = minSideBarWidth.IsNonNegative() ? minSideBarWidth : DEFAULT_MIN_SIDE_BAR_WIDTH; ACE_UPDATE_NODE_LAYOUT_PROPERTY(SideBarContainerLayoutProperty, MinSideBarWidth, minSideBarWidth, frameNode); frameNode->MarkModifyDone(); frameNode->MarkDirtyNode(); }; - auto pattern = frameNode->GetPattern(); + auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); - pattern->AddResObj("sideBarContainer.minSideBarWidth", resObj, std::move(updateMinSideBarWidthFunc)); + pattern->AddResObj(key, resObj, std::move(updateMinSideBarWidthFunc)); } void SideBarContainerModelNG::SetMaxSideBarWidth(const RefPtr& resObj) { auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); CHECK_NULL_VOID(frameNode); - auto&& updateMaxSideBarWidthFunc = [weak = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { + std::string key = "sideBarContainer.maxSideBarWidth"; + auto updateMaxSideBarWidthFunc = [key, weak = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { auto frameNode = weak.Upgrade(); CHECK_NULL_VOID(frameNode); auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); pattern->MarkNeedInitRealSideBarWidth(true); CalcDimension maxSideBarWidth; + std::string maxSideBarWidthValue = pattern->GetResCacheMapByKey(key); + if (maxSideBarWidthValue.empty()) { + ResourceParseUtils::ParseResDimensionVpNG(resObj, maxSideBarWidth); + pattern->AddResCache(key, maxSideBarWidth.ToString()); + } else { + maxSideBarWidth = StringUtils::StringToCalcDimension(maxSideBarWidthValue); + } ResourceParseUtils::ParseResDimensionVpNG(resObj, maxSideBarWidth); maxSideBarWidth = maxSideBarWidth.IsNonNegative() ? maxSideBarWidth : DEFAULT_MAX_SIDE_BAR_WIDTH; ACE_UPDATE_NODE_LAYOUT_PROPERTY(SideBarContainerLayoutProperty, MaxSideBarWidth, maxSideBarWidth, frameNode); frameNode->MarkModifyDone(); frameNode->MarkDirtyNode(); }; - auto pattern = frameNode->GetPattern(); + auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); pattern->AddResObj("sideBarContainer.maxSideBarWidth", resObj, std::move(updateMaxSideBarWidthFunc)); } @@ -295,14 +317,20 @@ void SideBarContainerModelNG::SetControlButtonShowIconInfo( SetControlButtonShowIconInfo(showIconStr, isPixelMap, pixMap); auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); CHECK_NULL_VOID(frameNode); - auto&& updateShowIconFunc = [weakFrameNode = AceType::WeakClaim(frameNode), isPixelMap, - weakPixMap = AceType::WeakClaim(AceType::RawPtr(pixMap))]( - const RefPtr& resObj) { - std::string showIconStr; - ResourceParseUtils::ParseResMedia(resObj, showIconStr); - auto pixMap = weakPixMap.Upgrade(); + std::string key = "sideBarContainer.buttonIconOptions.shown"; + auto updateShowIconFunc = [key, weakFrameNode = AceType::WeakClaim(frameNode), isPixelMap, + weakPixMap = AceType::WeakClaim(AceType::RawPtr(pixMap))]( + const RefPtr& resObj) { auto frameNode = weakFrameNode.Upgrade(); CHECK_NULL_VOID(frameNode); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_VOID(pattern); + std::string showIconStr = pattern->GetResCacheMapByKey(key); + if (showIconStr.empty()) { + ResourceParseUtils::ParseResMedia(resObj, showIconStr); + pattern->AddResCache(key, showIconStr); + } + auto pixMap = weakPixMap.Upgrade(); auto controlButtonShowIconInfo = CreateSourceInfo(showIconStr, isPixelMap, pixMap); if (controlButtonShowIconInfo.IsValid()) { ACE_UPDATE_NODE_LAYOUT_PROPERTY( @@ -311,9 +339,9 @@ void SideBarContainerModelNG::SetControlButtonShowIconInfo( frameNode->MarkModifyDone(); frameNode->MarkDirtyNode(); }; - auto pattern = frameNode->GetPattern(); + auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); - pattern->AddResObj("sideBarContainer.buttonIconOptions.shown", showIconResObj, std::move(updateShowIconFunc)); + pattern->AddResObj(key, showIconResObj, std::move(updateShowIconFunc)); } void SideBarContainerModelNG::SetControlButtonHiddenIconInfo( @@ -324,14 +352,20 @@ void SideBarContainerModelNG::SetControlButtonHiddenIconInfo( SetControlButtonHiddenIconInfo(hiddenIconStr, isPixelMap, pixMap); auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); CHECK_NULL_VOID(frameNode); - auto&& updateHiddenIconFunc = [weakFrameNode = AceType::WeakClaim(frameNode), isPixelMap, - weakPixMap = AceType::WeakClaim(AceType::RawPtr(pixMap))]( - const RefPtr& resObj) { - std::string hiddenIconStr; - ResourceParseUtils::ParseResMedia(resObj, hiddenIconStr); - auto pixMap = weakPixMap.Upgrade(); + std::string key = "sideBarContainer.buttonIconOptions.hidden"; + auto updateHiddenIconFunc = [key, weakFrameNode = AceType::WeakClaim(frameNode), isPixelMap, + weakPixMap = AceType::WeakClaim(AceType::RawPtr(pixMap))]( + const RefPtr& resObj) { auto frameNode = weakFrameNode.Upgrade(); CHECK_NULL_VOID(frameNode); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_VOID(pattern); + std::string hiddenIconStr = pattern->GetResCacheMapByKey(key); + if (hiddenIconStr.empty()) { + ResourceParseUtils::ParseResMedia(resObj, hiddenIconStr); + pattern->AddResCache(key, hiddenIconStr); + } + auto pixMap = weakPixMap.Upgrade(); auto controlButtonHiddenIconInfo = CreateSourceInfo(hiddenIconStr, isPixelMap, pixMap); if (controlButtonHiddenIconInfo.IsValid()) { ACE_UPDATE_NODE_LAYOUT_PROPERTY( @@ -340,9 +374,9 @@ void SideBarContainerModelNG::SetControlButtonHiddenIconInfo( frameNode->MarkModifyDone(); frameNode->MarkDirtyNode(); }; - auto pattern = frameNode->GetPattern(); + auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); - pattern->AddResObj("sideBarContainer.buttonIconOptions.hidden", hiddenIconResObj, std::move(updateHiddenIconFunc)); + pattern->AddResObj(key, hiddenIconResObj, std::move(updateHiddenIconFunc)); } void SideBarContainerModelNG::SetControlButtonSwitchingIconInfo( @@ -353,14 +387,20 @@ void SideBarContainerModelNG::SetControlButtonSwitchingIconInfo( SetControlButtonSwitchingIconInfo(switchingIconStr, isPixelMap, pixMap); auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); CHECK_NULL_VOID(frameNode); - auto&& updateSwitchingIconFunc = [weakFrameNode = AceType::WeakClaim(frameNode), isPixelMap, - weakPixMap = AceType::WeakClaim(AceType::RawPtr(pixMap))]( - const RefPtr& resObj) { - std::string switchingIconStr; - ResourceParseUtils::ParseResMedia(resObj, switchingIconStr); - auto pixMap = weakPixMap.Upgrade(); + std::string key = "sideBarContainer.buttonIconOptions.switching"; + auto updateSwitchingIconFunc = [key, weakFrameNode = AceType::WeakClaim(frameNode), isPixelMap, + weakPixMap = AceType::WeakClaim(AceType::RawPtr(pixMap))]( + const RefPtr& resObj) { auto frameNode = weakFrameNode.Upgrade(); CHECK_NULL_VOID(frameNode); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_VOID(pattern); + std::string switchingIconStr = pattern->GetResCacheMapByKey(key); + if (switchingIconStr.empty()) { + ResourceParseUtils::ParseResMedia(resObj, switchingIconStr); + pattern->AddResCache(key, switchingIconStr); + } + auto pixMap = weakPixMap.Upgrade(); auto controlButtonSwitchingIconInfo = CreateSourceInfo(switchingIconStr, isPixelMap, pixMap); if (controlButtonSwitchingIconInfo.IsValid()) { ACE_UPDATE_NODE_LAYOUT_PROPERTY(SideBarContainerLayoutProperty, ControlButtonSwitchingIconInfo, @@ -369,10 +409,9 @@ void SideBarContainerModelNG::SetControlButtonSwitchingIconInfo( frameNode->MarkModifyDone(); frameNode->MarkDirtyNode(); }; - auto pattern = frameNode->GetPattern(); + auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); - pattern->AddResObj( - "sideBarContainer.buttonIconOptions.switching", switchingIconResObj, std::move(updateSwitchingIconFunc)); + pattern->AddResObj(key, switchingIconResObj, std::move(updateSwitchingIconFunc)); } void SideBarContainerModelNG::ResetControlButtonIconInfo() @@ -405,6 +444,29 @@ void SideBarContainerModelNG::SetDividerEndMargin(const Dimension& endMargin) ACE_UPDATE_LAYOUT_PROPERTY(SideBarContainerLayoutProperty, DividerEndMargin, endMargin); } +void SideBarContainerModelNG::ResetResObj(const std::string& key) +{ + if (!SystemProperties::ConfigChangePerform()) { + return; + } + auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); + CHECK_NULL_VOID(frameNode); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_VOID(pattern); + pattern->RemoveResObj(key); +} + +void SideBarContainerModelNG::ResetResObj(FrameNode* frameNode, const std::string& key) +{ + if (!SystemProperties::ConfigChangePerform()) { + return; + } + CHECK_NULL_VOID(frameNode); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_VOID(pattern); + pattern->RemoveResObj(key); +} + void SideBarContainerModelNG::SetDividerStrokeWidth(const RefPtr& strokeWidthResObj) { CalcDimension strokeWidth; @@ -412,20 +474,28 @@ void SideBarContainerModelNG::SetDividerStrokeWidth(const RefPtr ACE_UPDATE_LAYOUT_PROPERTY(SideBarContainerLayoutProperty, DividerStrokeWidth, strokeWidth); auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); CHECK_NULL_VOID(frameNode); - auto&& updateDividerStrokeWidthFunc = [weakFrameNode = AceType::WeakClaim(frameNode)]( - const RefPtr& strokeWidthResObj) { - CalcDimension strokeWidth; - ResourceParseUtils::ParseResDimensionVpNG(strokeWidthResObj, strokeWidth); + std::string key = "sideBarContainer.dividerStyle.strokeWidth"; + auto updateDividerStrokeWidthFunc = [key, weakFrameNode = AceType::WeakClaim(frameNode)]( + const RefPtr& strokeWidthResObj) { auto frameNode = weakFrameNode.Upgrade(); CHECK_NULL_VOID(frameNode); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_VOID(pattern); + CalcDimension strokeWidth; + std::string strokeWidthValue = pattern->GetResCacheMapByKey(key); + if (strokeWidthValue.empty()) { + ResourceParseUtils::ParseResDimensionVpNG(strokeWidthResObj, strokeWidth); + pattern->AddResCache(key, strokeWidth.ToString()); + } else { + strokeWidth = StringUtils::StringToCalcDimension(strokeWidthValue); + } ACE_UPDATE_NODE_LAYOUT_PROPERTY(SideBarContainerLayoutProperty, DividerStrokeWidth, strokeWidth, frameNode); frameNode->MarkModifyDone(); frameNode->MarkDirtyNode(); }; - auto pattern = frameNode->GetPattern(); + auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); - pattern->AddResObj( - "sideBarContainer.dividerStyle.strokeWidth", strokeWidthResObj, std::move(updateDividerStrokeWidthFunc)); + pattern->AddResObj(key, strokeWidthResObj, std::move(updateDividerStrokeWidthFunc)); } void SideBarContainerModelNG::SetDividerColor(const RefPtr& colorResObj) @@ -435,19 +505,28 @@ void SideBarContainerModelNG::SetDividerColor(const RefPtr& colo ACE_UPDATE_LAYOUT_PROPERTY(SideBarContainerLayoutProperty, DividerColor, color); auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); CHECK_NULL_VOID(frameNode); - auto&& updateDividerColorFunc = [weakFrameNode = AceType::WeakClaim(frameNode)]( - const RefPtr& colorResObj) { - Color color; - ResourceParseUtils::ParseResColor(colorResObj, color); + std::string key = "sideBarContainer.dividerStyle.color"; + auto updateDividerColorFunc = [key, weakFrameNode = AceType::WeakClaim(frameNode)]( + const RefPtr& colorResObj) { auto frameNode = weakFrameNode.Upgrade(); CHECK_NULL_VOID(frameNode); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_VOID(pattern); + Color color; + std::string colorValue = pattern->GetResCacheMapByKey(key); + if (colorValue.empty()) { + ResourceParseUtils::ParseResColor(colorResObj, color); + pattern->AddResCache(key, color.ColorToString()); + } else { + Color::ParseColorString(colorValue, color); + } ACE_UPDATE_NODE_LAYOUT_PROPERTY(SideBarContainerLayoutProperty, DividerColor, color, frameNode); frameNode->MarkModifyDone(); frameNode->MarkDirtyNode(); }; - auto pattern = frameNode->GetPattern(); + auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); - pattern->AddResObj("sideBarContainer.dividerStyle.color", colorResObj, std::move(updateDividerColorFunc)); + pattern->AddResObj(key, colorResObj, std::move(updateDividerColorFunc)); } void SideBarContainerModelNG::SetDividerStartMargin(const RefPtr& startMarginResObj) @@ -457,20 +536,28 @@ void SideBarContainerModelNG::SetDividerStartMargin(const RefPtr ACE_UPDATE_LAYOUT_PROPERTY(SideBarContainerLayoutProperty, DividerStartMargin, startMargin); auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); CHECK_NULL_VOID(frameNode); - auto&& updateDividerStartMarginFunc = [weakFrameNode = AceType::WeakClaim(frameNode)]( - const RefPtr& startMarginResObj) { - CalcDimension startMargin; - ResourceParseUtils::ParseResDimensionVpNG(startMarginResObj, startMargin); + std::string key = "sideBarContainer.dividerStyle.startMargin"; + auto updateDividerStartMarginFunc = [key, weakFrameNode = AceType::WeakClaim(frameNode)]( + const RefPtr& startMarginResObj) { auto frameNode = weakFrameNode.Upgrade(); CHECK_NULL_VOID(frameNode); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_VOID(pattern); + CalcDimension startMargin; + std::string startMarginValue = pattern->GetResCacheMapByKey(key); + if (startMarginValue.empty()) { + ResourceParseUtils::ParseResDimensionVpNG(startMarginResObj, startMargin); + pattern->AddResCache(key, startMargin.ToString()); + } else { + startMargin = StringUtils::StringToCalcDimension(startMarginValue); + } ACE_UPDATE_NODE_LAYOUT_PROPERTY(SideBarContainerLayoutProperty, DividerStartMargin, startMargin, frameNode); frameNode->MarkModifyDone(); frameNode->MarkDirtyNode(); }; auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); - pattern->AddResObj( - "sideBarContainer.dividerStyle.startMargin", startMarginResObj, std::move(updateDividerStartMarginFunc)); + pattern->AddResObj(key, startMarginResObj, std::move(updateDividerStartMarginFunc)); } void SideBarContainerModelNG::SetDividerEndMargin(const RefPtr& endMarginResObj) @@ -480,20 +567,28 @@ void SideBarContainerModelNG::SetDividerEndMargin(const RefPtr& ACE_UPDATE_LAYOUT_PROPERTY(SideBarContainerLayoutProperty, DividerEndMargin, endMargin); auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); CHECK_NULL_VOID(frameNode); - auto&& updateDividerEndMarginFunc = [weakFrameNode = AceType::WeakClaim(frameNode)]( - const RefPtr& endMarginResObj) { - CalcDimension endMargin; - ResourceParseUtils::ParseResDimensionVpNG(endMarginResObj, endMargin); + std::string key = "sideBarContainer.dividerStyle.endMargin"; + auto updateDividerEndMarginFunc = [key, weakFrameNode = AceType::WeakClaim(frameNode)]( + const RefPtr& endMarginResObj) { auto frameNode = weakFrameNode.Upgrade(); CHECK_NULL_VOID(frameNode); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_VOID(pattern); + CalcDimension endMargin; + std::string endMarginValue = pattern->GetResCacheMapByKey(key); + if (endMarginValue.empty()) { + ResourceParseUtils::ParseResDimensionVpNG(endMarginResObj, endMargin); + pattern->AddResCache(key, endMargin.ToString()); + } else { + endMargin = StringUtils::StringToCalcDimension(endMarginValue); + } ACE_UPDATE_NODE_LAYOUT_PROPERTY(SideBarContainerLayoutProperty, DividerEndMargin, endMargin, frameNode); frameNode->MarkModifyDone(); frameNode->MarkDirtyNode(); }; auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); - pattern->AddResObj( - "sideBarContainer.dividerStyle.endMargin", endMarginResObj, std::move(updateDividerEndMarginFunc)); + pattern->AddResObj(key, endMarginResObj, std::move(updateDividerEndMarginFunc)); } void SideBarContainerModelNG::SetMinContentWidth(const Dimension& minContentWidth) @@ -512,19 +607,34 @@ void SideBarContainerModelNG::SetMinContentWidth(const RefPtr& r SetMinContentWidth(minContentWidth); auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); CHECK_NULL_VOID(frameNode); - auto&& updateMinContentFunc = [weakFrameNode = AceType::WeakClaim(frameNode)]( - const RefPtr& resObj) { - CalcDimension minContentWidth; - ResourceParseUtils::ParseResDimensionVpNG(resObj, minContentWidth); + std::string key = "sideBarContainer.minContentWidth"; + auto updateMinContentFunc = [key, weakFrameNode = AceType::WeakClaim(frameNode)]( + const RefPtr& resObj) { auto frameNode = weakFrameNode.Upgrade(); CHECK_NULL_VOID(frameNode); - ACE_UPDATE_NODE_LAYOUT_PROPERTY(SideBarContainerLayoutProperty, MinContentWidth, minContentWidth, frameNode); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_VOID(pattern); + CalcDimension minContentWidth; + std::string minContentWidthValue = pattern->GetResCacheMapByKey(key); + if (minContentWidthValue.empty()) { + ResourceParseUtils::ParseResDimensionVpNG(resObj, minContentWidth); + pattern->AddResCache(key, minContentWidth.ToString()); + } else { + minContentWidth = StringUtils::StringToCalcDimension(minContentWidthValue); + } + if (minContentWidth.IsNonNegative()) { + ACE_UPDATE_NODE_LAYOUT_PROPERTY( + SideBarContainerLayoutProperty, MinContentWidth, minContentWidth, frameNode); + } else { + ACE_UPDATE_NODE_LAYOUT_PROPERTY( + SideBarContainerLayoutProperty, MinContentWidth, DEFAULT_MIN_CONTENT_WIDTH, frameNode); + } frameNode->MarkModifyDone(); frameNode->MarkDirtyNode(); }; - auto pattern = frameNode->GetPattern(); + auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); - pattern->AddResObj("sideBarContainer.minContentWidth", resObj, std::move(updateMinContentFunc)); + pattern->AddResObj(key, resObj, std::move(updateMinContentFunc)); } void SideBarContainerModelNG::SetOnChange(std::function&& onChange) @@ -602,21 +712,29 @@ void SideBarContainerModelNG::SetSideBarWidth(FrameNode* frameNode, const RefPtr DEFAULT_SIDE_BAR_WIDTH_V10 : DEFAULT_SIDE_BAR_WIDTH; SetSideBarWidth(frameNode, sideBarWidth.IsNonNegative() ? sideBarWidth : defaultSiderBarWidth); CHECK_NULL_VOID(frameNode); - auto&& updateSideBarWidthFunc = [weak = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { + std::string key = "sideBarContainer.sideBarWidth"; + auto updateSideBarWidthFunc = [key, weak = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { auto frameNode = weak.Upgrade(); CHECK_NULL_VOID(frameNode); auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); pattern->MarkNeedInitRealSideBarWidth(true); CalcDimension sideBarWidth; - ResourceParseUtils::ParseResDimensionVpNG(resObj, sideBarWidth); + std::string sideBarWidthValue = pattern->GetResCacheMapByKey(key); + if (sideBarWidthValue.empty()) { + ResourceParseUtils::ParseResDimensionVpNG(resObj, sideBarWidth); + pattern->AddResCache(key, sideBarWidth.ToString()); + } else { + sideBarWidth = StringUtils::StringToCalcDimension(sideBarWidthValue); + } + ACE_UPDATE_NODE_LAYOUT_PROPERTY(SideBarContainerLayoutProperty, SideBarWidth, sideBarWidth, frameNode); sideBarWidth = sideBarWidth.IsNonNegative() ? sideBarWidth : DEFAULT_SIDE_BAR_WIDTH; frameNode->MarkModifyDone(); frameNode->MarkDirtyNode(); }; - auto pattern = frameNode->GetPattern(); + auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); - pattern->AddResObj("sideBarContainer.sideBarWidth", resObj, std::move(updateSideBarWidthFunc)); + pattern->AddResObj(key, resObj, std::move(updateSideBarWidthFunc)); } void SideBarContainerModelNG::SetMinSideBarWidth(FrameNode* frameNode, const RefPtr& resObj) @@ -628,22 +746,29 @@ void SideBarContainerModelNG::SetMinSideBarWidth(FrameNode* frameNode, const Ref DEFAULT_MIN_SIDE_BAR_WIDTH_V10 : DEFAULT_MIN_SIDE_BAR_WIDTH; SetMinSideBarWidth(frameNode, minSideBarWidth.IsNonNegative() ? minSideBarWidth : defaultMinSideBarWidth); CHECK_NULL_VOID(frameNode); - auto&& updateSideBarWidthFunc = [weak = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { + std::string key = "sideBarContainer.minSideBarWidth"; + auto updateSideBarWidthFunc = [key, weak = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { auto frameNode = weak.Upgrade(); CHECK_NULL_VOID(frameNode); auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); pattern->MarkNeedInitRealSideBarWidth(true); - CalcDimension sideBarWidth; - ResourceParseUtils::ParseResDimensionVpNG(resObj, sideBarWidth); - sideBarWidth = sideBarWidth.IsNonNegative() ? sideBarWidth : DEFAULT_SIDE_BAR_WIDTH; - ACE_UPDATE_NODE_LAYOUT_PROPERTY(SideBarContainerLayoutProperty, SideBarWidth, sideBarWidth, frameNode); + CalcDimension minSideBarWidth; + std::string minSideBarWidthValue = pattern->GetResCacheMapByKey(key); + if (minSideBarWidthValue.empty()) { + ResourceParseUtils::ParseResDimensionVpNG(resObj, minSideBarWidth); + pattern->AddResCache(key, minSideBarWidth.ToString()); + } else { + minSideBarWidth = StringUtils::StringToCalcDimension(minSideBarWidthValue); + } + minSideBarWidth = minSideBarWidth.IsNonNegative() ? minSideBarWidth : DEFAULT_SIDE_BAR_WIDTH; + ACE_UPDATE_NODE_LAYOUT_PROPERTY(SideBarContainerLayoutProperty, MinSideBarWidth, minSideBarWidth, frameNode); frameNode->MarkModifyDone(); frameNode->MarkDirtyNode(); }; - auto pattern = frameNode->GetPattern(); + auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); - pattern->AddResObj("sideBarContainer.minSideBarWidth", resObj, std::move(updateSideBarWidthFunc)); + pattern->AddResObj(key, resObj, std::move(updateSideBarWidthFunc)); } void SideBarContainerModelNG::SetMaxSideBarWidth(FrameNode* frameNode, const RefPtr& resObj) @@ -652,22 +777,29 @@ void SideBarContainerModelNG::SetMaxSideBarWidth(FrameNode* frameNode, const Ref ResourceParseUtils::ParseResDimensionVpNG(resObj, maxSideBarWidth); SetMaxSideBarWidth(frameNode, maxSideBarWidth.IsNonNegative() ? maxSideBarWidth : DEFAULT_MAX_SIDE_BAR_WIDTH); CHECK_NULL_VOID(frameNode); - auto&& updateMaxSideBarWidthFunc = [weak = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { + std::string key = "sideBarContainer.maxSideBarWidth"; + auto updateMaxSideBarWidthFunc = [key, weak = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { auto frameNode = weak.Upgrade(); CHECK_NULL_VOID(frameNode); auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); pattern->MarkNeedInitRealSideBarWidth(true); CalcDimension maxSideBarWidth; - ResourceParseUtils::ParseResDimensionVpNG(resObj, maxSideBarWidth); + std::string maxSideBarWidthValue = pattern->GetResCacheMapByKey(key); + if (maxSideBarWidthValue.empty()) { + ResourceParseUtils::ParseResDimensionVpNG(resObj, maxSideBarWidth); + pattern->AddResCache(key, maxSideBarWidth.ToString()); + } else { + maxSideBarWidth = StringUtils::StringToCalcDimension(maxSideBarWidthValue); + } maxSideBarWidth = maxSideBarWidth.IsNonNegative() ? maxSideBarWidth : DEFAULT_MAX_SIDE_BAR_WIDTH; ACE_UPDATE_NODE_LAYOUT_PROPERTY(SideBarContainerLayoutProperty, MaxSideBarWidth, maxSideBarWidth, frameNode); frameNode->MarkModifyDone(); frameNode->MarkDirtyNode(); }; - auto pattern = frameNode->GetPattern(); + auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); - pattern->AddResObj("sideBarContainer.maxSideBarWidth", resObj, std::move(updateMaxSideBarWidthFunc)); + pattern->AddResObj(key, resObj, std::move(updateMaxSideBarWidthFunc)); } void SideBarContainerModelNG::SetMinContentWidth(FrameNode* frameNode, const RefPtr& resObj) @@ -676,19 +808,34 @@ void SideBarContainerModelNG::SetMinContentWidth(FrameNode* frameNode, const Ref ResourceParseUtils::ParseResDimensionVpNG(resObj, minContentWidth); SetMinContentWidth(frameNode, minContentWidth); CHECK_NULL_VOID(frameNode); - auto&& updateMinContentFunc = [weakFrameNode = AceType::WeakClaim(frameNode)]( - const RefPtr& resObj) { - CalcDimension minContentWidth; - ResourceParseUtils::ParseResDimensionVpNG(resObj, minContentWidth); + std::string key = "sideBarContainer.minContentWidth"; + auto updateMinContentFunc = [key, weakFrameNode = AceType::WeakClaim(frameNode)]( + const RefPtr& resObj) { auto frameNode = weakFrameNode.Upgrade(); CHECK_NULL_VOID(frameNode); - ACE_UPDATE_NODE_LAYOUT_PROPERTY(SideBarContainerLayoutProperty, MinContentWidth, minContentWidth, frameNode); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_VOID(pattern); + CalcDimension minContentWidth; + std::string minContentWidthValue = pattern->GetResCacheMapByKey(key); + if (minContentWidthValue.empty()) { + ResourceParseUtils::ParseResDimensionVpNG(resObj, minContentWidth); + pattern->AddResCache(key, minContentWidth.ToString()); + } else { + minContentWidth = StringUtils::StringToCalcDimension(minContentWidthValue); + } + if (minContentWidth.IsNonNegative()) { + ACE_UPDATE_NODE_LAYOUT_PROPERTY( + SideBarContainerLayoutProperty, MinContentWidth, minContentWidth, frameNode); + } else { + ACE_UPDATE_NODE_LAYOUT_PROPERTY( + SideBarContainerLayoutProperty, MinContentWidth, DEFAULT_MIN_CONTENT_WIDTH, frameNode); + } frameNode->MarkModifyDone(); frameNode->MarkDirtyNode(); }; - auto pattern = frameNode->GetPattern(); + auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); - pattern->AddResObj("sideBarContainer.minContentWidth", resObj, std::move(updateMinContentFunc)); + pattern->AddResObj(key, resObj, std::move(updateMinContentFunc)); } void SideBarContainerModelNG::SetControlButtonWidth(FrameNode* frameNode, const Dimension& width) @@ -718,14 +865,20 @@ void SideBarContainerModelNG::SetControlButtonShowIconInfo( ResourceParseUtils::ParseResMedia(showIconResObj, showIconStr); SetControlButtonShowIconInfo(frameNode, showIconStr, isPixelMap, pixMap); CHECK_NULL_VOID(frameNode); - auto&& updateShowIconFunc = [weakFrameNode = AceType::WeakClaim(frameNode), isPixelMap, - weakPixMap = AceType::WeakClaim(AceType::RawPtr(pixMap))]( - const RefPtr& resObj) { - std::string showIconStr; - ResourceParseUtils::ParseResMedia(resObj, showIconStr); - auto pixMap = weakPixMap.Upgrade(); + std::string key = "sideBarContainer.buttonIconOptions.shown"; + auto updateShowIconFunc = [key, weakFrameNode = AceType::WeakClaim(frameNode), isPixelMap, + weakPixMap = AceType::WeakClaim(AceType::RawPtr(pixMap))]( + const RefPtr& resObj) { auto frameNode = weakFrameNode.Upgrade(); CHECK_NULL_VOID(frameNode); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_VOID(pattern); + std::string showIconStr = pattern->GetResCacheMapByKey(key); + if (showIconStr.empty()) { + ResourceParseUtils::ParseResMedia(resObj, showIconStr); + pattern->AddResCache(key, showIconStr); + } + auto pixMap = weakPixMap.Upgrade(); auto controlButtonShowIconInfo = CreateSourceInfo(showIconStr, isPixelMap, pixMap); if (controlButtonShowIconInfo.IsValid()) { ACE_UPDATE_NODE_LAYOUT_PROPERTY( @@ -734,9 +887,9 @@ void SideBarContainerModelNG::SetControlButtonShowIconInfo( frameNode->MarkModifyDone(); frameNode->MarkDirtyNode(); }; - auto pattern = frameNode->GetPattern(); + auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); - pattern->AddResObj("sideBarContainer.buttonIconOptions.shown", showIconResObj, std::move(updateShowIconFunc)); + pattern->AddResObj(key, showIconResObj, std::move(updateShowIconFunc)); } void SideBarContainerModelNG::SetControlButtonHiddenIconInfo( @@ -746,14 +899,20 @@ void SideBarContainerModelNG::SetControlButtonHiddenIconInfo( ResourceParseUtils::ParseResMedia(hiddenIconResObj, hiddenIconStr); SetControlButtonHiddenIconInfo(frameNode, hiddenIconStr, isPixelMap, pixMap); CHECK_NULL_VOID(frameNode); - auto&& updateHiddenIconFunc = [weakFrameNode = AceType::WeakClaim(frameNode), isPixelMap, - weakPixMap = AceType::WeakClaim(AceType::RawPtr(pixMap))]( - const RefPtr& resObj) { - std::string hiddenIconStr; - ResourceParseUtils::ParseResMedia(resObj, hiddenIconStr); - auto pixMap = weakPixMap.Upgrade(); + std::string key = "sideBarContainer.buttonIconOptions.hidden"; + auto updateHiddenIconFunc = [key, weakFrameNode = AceType::WeakClaim(frameNode), isPixelMap, + weakPixMap = AceType::WeakClaim(AceType::RawPtr(pixMap))]( + const RefPtr& resObj) { auto frameNode = weakFrameNode.Upgrade(); CHECK_NULL_VOID(frameNode); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_VOID(pattern); + std::string hiddenIconStr = pattern->GetResCacheMapByKey(key); + if (hiddenIconStr.empty()) { + ResourceParseUtils::ParseResMedia(resObj, hiddenIconStr); + pattern->AddResCache(key, hiddenIconStr); + } + auto pixMap = weakPixMap.Upgrade(); auto controlButtonHiddenIconInfo = CreateSourceInfo(hiddenIconStr, isPixelMap, pixMap); if (controlButtonHiddenIconInfo.IsValid()) { ACE_UPDATE_NODE_LAYOUT_PROPERTY( @@ -762,9 +921,9 @@ void SideBarContainerModelNG::SetControlButtonHiddenIconInfo( frameNode->MarkModifyDone(); frameNode->MarkDirtyNode(); }; - auto pattern = frameNode->GetPattern(); + auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); - pattern->AddResObj("sideBarContainer.buttonIconOptions.hidden", hiddenIconResObj, std::move(updateHiddenIconFunc)); + pattern->AddResObj(key, hiddenIconResObj, std::move(updateHiddenIconFunc)); } void SideBarContainerModelNG::SetControlButtonSwitchingIconInfo( @@ -774,14 +933,20 @@ void SideBarContainerModelNG::SetControlButtonSwitchingIconInfo( ResourceParseUtils::ParseResMedia(switchingIconResObj, switchingIconStr); SetControlButtonSwitchingIconInfo(frameNode, switchingIconStr, isPixelMap, pixMap); CHECK_NULL_VOID(frameNode); - auto&& updateSwitchingIconFunc = [weakFrameNode = AceType::WeakClaim(frameNode), isPixelMap, - weakPixMap = AceType::WeakClaim(AceType::RawPtr(pixMap))]( - const RefPtr& resObj) { - std::string switchingIconStr; - ResourceParseUtils::ParseResMedia(resObj, switchingIconStr); - auto pixMap = weakPixMap.Upgrade(); + std::string key = "sideBarContainer.buttonIconOptions.switching"; + auto updateSwitchingIconFunc = [key, weakFrameNode = AceType::WeakClaim(frameNode), isPixelMap, + weakPixMap = AceType::WeakClaim(AceType::RawPtr(pixMap))]( + const RefPtr& resObj) { auto frameNode = weakFrameNode.Upgrade(); CHECK_NULL_VOID(frameNode); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_VOID(pattern); + std::string switchingIconStr = pattern->GetResCacheMapByKey(key); + if (switchingIconStr.empty()) { + ResourceParseUtils::ParseResMedia(resObj, switchingIconStr); + pattern->AddResCache(key, switchingIconStr); + } + auto pixMap = weakPixMap.Upgrade(); auto controlButtonSwitchingIconInfo = CreateSourceInfo(switchingIconStr, isPixelMap, pixMap); if (controlButtonSwitchingIconInfo.IsValid()) { ACE_UPDATE_NODE_LAYOUT_PROPERTY(SideBarContainerLayoutProperty, ControlButtonSwitchingIconInfo, @@ -790,10 +955,9 @@ void SideBarContainerModelNG::SetControlButtonSwitchingIconInfo( frameNode->MarkModifyDone(); frameNode->MarkDirtyNode(); }; - auto pattern = frameNode->GetPattern(); + auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); - pattern->AddResObj( - "sideBarContainer.buttonIconOptions.switching", switchingIconResObj, std::move(updateSwitchingIconFunc)); + pattern->AddResObj(key, switchingIconResObj, std::move(updateSwitchingIconFunc)); } void SideBarContainerModelNG::SetControlButtonShowIconInfo( @@ -883,20 +1047,28 @@ void SideBarContainerModelNG::SetDividerStrokeWidth( ResourceParseUtils::ParseResDimensionVpNG(strokeWidthResObj, strokeWidth); ACE_UPDATE_NODE_LAYOUT_PROPERTY(SideBarContainerLayoutProperty, DividerStrokeWidth, strokeWidth, frameNode); CHECK_NULL_VOID(frameNode); - auto&& updateDividerStrokeWidthFunc = [weakFrameNode = AceType::WeakClaim(frameNode)]( - const RefPtr& strokeWidthResObj) { - CalcDimension strokeWidth; - ResourceParseUtils::ParseResDimensionVpNG(strokeWidthResObj, strokeWidth); + std::string key = "sideBarContainer.dividerStyle.strokeWidth"; + auto updateDividerStrokeWidthFunc = [key, weakFrameNode = AceType::WeakClaim(frameNode)]( + const RefPtr& strokeWidthResObj) { auto frameNode = weakFrameNode.Upgrade(); CHECK_NULL_VOID(frameNode); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_VOID(pattern); + CalcDimension strokeWidth; + std::string strokeWidthValue = pattern->GetResCacheMapByKey(key); + if (strokeWidthValue.empty()) { + ResourceParseUtils::ParseResDimensionVpNG(strokeWidthResObj, strokeWidth); + pattern->AddResCache(key, strokeWidth.ToString()); + } else { + strokeWidth = StringUtils::StringToCalcDimension(strokeWidthValue); + } ACE_UPDATE_NODE_LAYOUT_PROPERTY(SideBarContainerLayoutProperty, DividerStrokeWidth, strokeWidth, frameNode); frameNode->MarkModifyDone(); frameNode->MarkDirtyNode(); }; - auto pattern = frameNode->GetPattern(); + auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); - pattern->AddResObj( - "sideBarContainer.dividerStyle.strokeWidth", strokeWidthResObj, std::move(updateDividerStrokeWidthFunc)); + pattern->AddResObj(key, strokeWidthResObj, std::move(updateDividerStrokeWidthFunc)); } void SideBarContainerModelNG::SetDividerColor(FrameNode* frameNode, const RefPtr& colorResObj) @@ -905,19 +1077,28 @@ void SideBarContainerModelNG::SetDividerColor(FrameNode* frameNode, const RefPtr ResourceParseUtils::ParseResColor(colorResObj, color); ACE_UPDATE_NODE_LAYOUT_PROPERTY(SideBarContainerLayoutProperty, DividerColor, color, frameNode); CHECK_NULL_VOID(frameNode); - auto&& updateDividerColorFunc = [weakFrameNode = AceType::WeakClaim(frameNode)]( - const RefPtr& colorResObj) { - Color color; - ResourceParseUtils::ParseResColor(colorResObj, color); + std::string key = "sideBarContainer.dividerStyle.color"; + auto updateDividerColorFunc = [key, weakFrameNode = AceType::WeakClaim(frameNode)]( + const RefPtr& colorResObj) { auto frameNode = weakFrameNode.Upgrade(); CHECK_NULL_VOID(frameNode); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_VOID(pattern); + Color color; + std::string colorValue = pattern->GetResCacheMapByKey(key); + if (colorValue.empty()) { + ResourceParseUtils::ParseResColor(colorResObj, color); + pattern->AddResCache(key, color.ColorToString()); + } else { + Color::ParseColorString(colorValue, color); + } ACE_UPDATE_NODE_LAYOUT_PROPERTY(SideBarContainerLayoutProperty, DividerColor, color, frameNode); frameNode->MarkModifyDone(); frameNode->MarkDirtyNode(); }; - auto pattern = frameNode->GetPattern(); + auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); - pattern->AddResObj("sideBarContainer.dividerStyle.color", colorResObj, std::move(updateDividerColorFunc)); + pattern->AddResObj(key, colorResObj, std::move(updateDividerColorFunc)); } void SideBarContainerModelNG::SetDividerStartMargin( @@ -927,20 +1108,28 @@ void SideBarContainerModelNG::SetDividerStartMargin( ResourceParseUtils::ParseResDimensionVpNG(startMarginResObj, startMargin); ACE_UPDATE_NODE_LAYOUT_PROPERTY(SideBarContainerLayoutProperty, DividerStartMargin, startMargin, frameNode); CHECK_NULL_VOID(frameNode); - auto&& updateDividerStartMarginFunc = [weakFrameNode = AceType::WeakClaim(frameNode)]( - const RefPtr& startMarginResObj) { - CalcDimension startMargin; - ResourceParseUtils::ParseResDimensionVpNG(startMarginResObj, startMargin); + std::string key = "sideBarContainer.dividerStyle.startMargin"; + auto updateDividerStartMarginFunc = [key, weakFrameNode = AceType::WeakClaim(frameNode)]( + const RefPtr& startMarginResObj) { auto frameNode = weakFrameNode.Upgrade(); CHECK_NULL_VOID(frameNode); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_VOID(pattern); + CalcDimension startMargin; + std::string startMarginValue = pattern->GetResCacheMapByKey(key); + if (startMarginValue.empty()) { + ResourceParseUtils::ParseResDimensionVpNG(startMarginResObj, startMargin); + pattern->AddResCache(key, startMargin.ToString()); + } else { + startMargin = StringUtils::StringToCalcDimension(startMarginValue); + } ACE_UPDATE_NODE_LAYOUT_PROPERTY(SideBarContainerLayoutProperty, DividerStartMargin, startMargin, frameNode); frameNode->MarkModifyDone(); frameNode->MarkDirtyNode(); }; - auto pattern = frameNode->GetPattern(); + auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); - pattern->AddResObj( - "sideBarContainer.dividerStyle.startMargin", startMarginResObj, std::move(updateDividerStartMarginFunc)); + pattern->AddResObj(key, startMarginResObj, std::move(updateDividerStartMarginFunc)); } void SideBarContainerModelNG::SetDividerEndMargin(FrameNode* frameNode, const RefPtr& endMarginResObj) @@ -949,20 +1138,28 @@ void SideBarContainerModelNG::SetDividerEndMargin(FrameNode* frameNode, const Re ResourceParseUtils::ParseResDimensionVpNG(endMarginResObj, endMargin); ACE_UPDATE_NODE_LAYOUT_PROPERTY(SideBarContainerLayoutProperty, DividerEndMargin, endMargin, frameNode); CHECK_NULL_VOID(frameNode); - auto&& updateDividerEndMarginFunc = [weakFrameNode = AceType::WeakClaim(frameNode)]( - const RefPtr& endMarginResObj) { - CalcDimension endMargin; - ResourceParseUtils::ParseResDimensionVpNG(endMarginResObj, endMargin); + std::string key = "sideBarContainer.dividerStyle.endMargin"; + auto updateDividerEndMarginFunc = [key, weakFrameNode = AceType::WeakClaim(frameNode)]( + const RefPtr& endMarginResObj) { auto frameNode = weakFrameNode.Upgrade(); CHECK_NULL_VOID(frameNode); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_VOID(pattern); + CalcDimension endMargin; + std::string endMarginValue = pattern->GetResCacheMapByKey(key); + if (endMarginValue.empty()) { + ResourceParseUtils::ParseResDimensionVpNG(endMarginResObj, endMargin); + pattern->AddResCache(key, endMargin.ToString()); + } else { + endMargin = StringUtils::StringToCalcDimension(endMarginValue); + } ACE_UPDATE_NODE_LAYOUT_PROPERTY(SideBarContainerLayoutProperty, DividerEndMargin, endMargin, frameNode); frameNode->MarkModifyDone(); frameNode->MarkDirtyNode(); }; auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); - pattern->AddResObj( - "sideBarContainer.dividerStyle.endMargin", endMarginResObj, std::move(updateDividerEndMarginFunc)); + pattern->AddResObj(key, endMarginResObj, std::move(updateDividerEndMarginFunc)); } void SideBarContainerModelNG::SetDividerStrokeWidth(FrameNode* frameNode, const Dimension& strokeWidth) diff --git a/frameworks/core/components_ng/pattern/side_bar/side_bar_container_model_ng.h b/frameworks/core/components_ng/pattern/side_bar/side_bar_container_model_ng.h index aa9232329df..50e5b25a1ef 100644 --- a/frameworks/core/components_ng/pattern/side_bar/side_bar_container_model_ng.h +++ b/frameworks/core/components_ng/pattern/side_bar/side_bar_container_model_ng.h @@ -29,6 +29,7 @@ public: void ParseAndSetWidth(WidthType widthType, Dimension& width, bool isDoubleBind = false) override; void ParseAndSetWidth(WidthType widthType, const RefPtr& resObj) override; void SetSideBarWidth(const Dimension& sideBarWidth, bool isDoubleBind = false) override; + void ResetResObj(const std::string& key) override; void SetMinSideBarWidth(const Dimension& minSideBarWidth) override; void SetMaxSideBarWidth(const Dimension& maxSideBarWidth) override; void SetAutoHide(bool autoHide) override; @@ -99,13 +100,14 @@ public: static void SetControlButtonSwitchingIconInfo(FrameNode* frameNode, const RefPtr& switchingIconResObj, bool isPixelMap, RefPtr pixMap); static void SetDividerStrokeWidth(FrameNode* frameNode, const RefPtr& strokeWidthResObj); - static void SetDividerEndMargin(FrameNode* frameNode, const RefPtr& startMarginResObj); + static void SetDividerEndMargin(FrameNode* frameNode, const RefPtr& endMarginResObj); static void SetDividerStartMargin(FrameNode* frameNode, const RefPtr& startMarginResObj); static void SetDividerColor(FrameNode* frameNode, const RefPtr& colorResObj); static void ResetControlButtonLeft(FrameNode* frameNode); static void ResetControlButtonIconInfo(FrameNode* frameNode); static bool IsDoubleBindBlock(const RefPtr& sideBarContainerPattern); static void SetOnChange(FrameNode* frameNode, std::function&& onChange); + static void ResetResObj(FrameNode* frameNode, const std::string& key); private: void MarkNeedInitRealSideBarWidth() override; void SetSideBarWidth(const RefPtr& sideBarWidth); diff --git a/frameworks/core/interfaces/native/node/nav_destination_modifier.cpp b/frameworks/core/interfaces/native/node/nav_destination_modifier.cpp index 5c946f9807e..99e39ba4735 100644 --- a/frameworks/core/interfaces/native/node/nav_destination_modifier.cpp +++ b/frameworks/core/interfaces/native/node/nav_destination_modifier.cpp @@ -184,6 +184,12 @@ void SetTitle(ArkUINodeHandle node, ArkUINavigationTitleInfo titleInfo, ArkUINav { auto* frameNode = reinterpret_cast(node); CHECK_NULL_VOID(frameNode); + NavDestinationModelNG::ResetResObj( + frameNode, NavDestinationPatternType::TITLE_BAR, "navDestination.title.commonMainTitle"); + NavDestinationModelNG::ResetResObj( + frameNode, NavDestinationPatternType::TITLE_BAR, "navDestination.title.commonSubTitle"); + NavDestinationModelNG::ResetResObj( + frameNode, NavDestinationPatternType::NAV_DESTINATION, "navDestination.titlebarOptions"); std::string mainTitleString = std::string(titleInfo.mainTitle); std::string subTitleString = std::string(titleInfo.subTitle); NG::NavigationTitleInfo ngTitleInfo = { titleInfo.hasSubTitle, titleInfo.hasMainTitle, @@ -193,7 +199,7 @@ void SetTitle(ArkUINodeHandle node, ArkUINavigationTitleInfo titleInfo, ArkUINav auto titleResObj = AceType::Claim(title); auto* subtitle = reinterpret_cast(subtitleRawPtr); auto subtitleResObj = AceType::Claim(subtitle); - NavDestinationModelNG::ParseCommonTitle(frameNode, ngTitleInfo, titleResObj, subtitleResObj); + NavDestinationModelNG::ParseCommonTitle(frameNode, titleResObj, subtitleResObj); } else { NavDestinationModelNG::ParseCommonTitle(frameNode, ngTitleInfo); } @@ -221,16 +227,21 @@ void SetTitle(ArkUINodeHandle node, ArkUINavigationTitleInfo titleInfo, ArkUINav finalOptions.enableHoverMode = options.enableHoverMode.value; } NavDestinationModelNG::SetTitlebarOptions(frameNode, std::move(finalOptions)); - if (!SystemProperties::ConfigChangePerform()) { - return; + if (SystemProperties::ConfigChangePerform()) { + UpdateNavDestinationTitlebarOptions(frameNode, options); } - UpdateNavDestinationTitlebarOptions(frameNode, options); } void ResetTitle(ArkUINodeHandle node) { auto* frameNode = reinterpret_cast(node); CHECK_NULL_VOID(frameNode); + NavDestinationModelNG::ResetResObj( + frameNode, NavDestinationPatternType::TITLE_BAR, "navDestination.title.commonMainTitle"); + NavDestinationModelNG::ResetResObj( + frameNode, NavDestinationPatternType::TITLE_BAR, "navDestination.title.commonSubTitle"); + NavDestinationModelNG::ResetResObj( + frameNode, NavDestinationPatternType::NAV_DESTINATION, "navDestination.titlebarOptions"); NG::NavigationTitleInfo ngTitleInfo = { false, false, "", "" }; NavDestinationModelNG::ParseCommonTitle(frameNode, ngTitleInfo); NavigationTitlebarOptions options; @@ -286,6 +297,8 @@ void SetMenus(ArkUINodeHandle node, ArkUIBarItem* items, ArkUI_Uint32 length) auto* frameNode = reinterpret_cast(node); CHECK_NULL_VOID(frameNode); CHECK_NULL_VOID(items); + NavDestinationModelNG::ResetResObj( + frameNode, NavDestinationPatternType::NAV_DESTINATION, "navDestination.menuItems"); std::vector menuItems; for (uint32_t i = 0; i < length; i++) { NG::BarItem menuItem; @@ -330,6 +343,8 @@ void ResetMenus(ArkUINodeHandle node) { auto* frameNode = reinterpret_cast(node); CHECK_NULL_VOID(frameNode); + NavDestinationModelNG::ResetResObj( + frameNode, NavDestinationPatternType::NAV_DESTINATION, "navDestination.menuItems"); std::vector menuItems; NavDestinationModelNG::SetMenuItems(frameNode, std::move(menuItems)); } diff --git a/frameworks/core/interfaces/native/node/navigation_modifier.cpp b/frameworks/core/interfaces/native/node/navigation_modifier.cpp index 87e414a3984..ea39a3b8e12 100644 --- a/frameworks/core/interfaces/native/node/navigation_modifier.cpp +++ b/frameworks/core/interfaces/native/node/navigation_modifier.cpp @@ -71,6 +71,7 @@ void SetMinContentWidth(ArkUINodeHandle node, ArkUI_Float32 value, int unit, voi { auto* frameNode = reinterpret_cast(node); CHECK_NULL_VOID(frameNode); + NavigationModelNG::ResetResObj(frameNode, NavigationPatternType::NAVIGATION, "navigation.minContentWidth"); CalcDimension width = Dimension(value, static_cast(unit)); if (!SystemProperties::ConfigChangePerform() || !minContentWidthRawPtr) { NavigationModelNG::SetMinContentWidth(frameNode, width); @@ -85,6 +86,7 @@ void ResetMinContentWidth(ArkUINodeHandle node) { auto* frameNode = reinterpret_cast(node); CHECK_NULL_VOID(frameNode); + NavigationModelNG::ResetResObj(frameNode, NavigationPatternType::NAVIGATION, "navigation.minContentWidth"); NavigationModelNG::SetMinContentWidth(frameNode, DEFAULT_MIN_CONTENT_WIDTH); } @@ -92,6 +94,8 @@ void SetMinNavBarWidth(ArkUINodeHandle node, ArkUI_Float32 minValue, int minUnit { auto* frameNode = reinterpret_cast(node); CHECK_NULL_VOID(frameNode); + NavigationModelNG::ResetResObj( + frameNode, NavigationPatternType::NAVIGATION, "navigation.navBarWidthRange.minNavBarWidth"); CalcDimension minNavBarWidth = Dimension(minValue, static_cast(minUnit)); if (LessNotEqual(minNavBarWidth.Value(), 0.0)) { minNavBarWidth = DEFAULT_MIN_NAV_BAR_WIDTH; @@ -110,6 +114,8 @@ void ResetMinNavBarWidth(ArkUINodeHandle node) { auto* frameNode = reinterpret_cast(node); CHECK_NULL_VOID(frameNode); + NavigationModelNG::ResetResObj( + frameNode, NavigationPatternType::NAVIGATION, "navigation.navBarWidthRange.minNavBarWidth"); CalcDimension minNavBarWidth = DEFAULT_MIN_NAV_BAR_WIDTH; NavigationModelNG::SetMinNavBarWidth(frameNode, minNavBarWidth); } @@ -118,6 +124,8 @@ void SetMaxNavBarWidth(ArkUINodeHandle node, ArkUI_Float32 maxValue, int maxUnit { auto* frameNode = reinterpret_cast(node); CHECK_NULL_VOID(frameNode); + NavigationModelNG::ResetResObj( + frameNode, NavigationPatternType::NAVIGATION, "navigation.navBarWidthRange.maxNavBarWidth"); CalcDimension maxNavBarWidth = Dimension(maxValue, static_cast(maxUnit)); if (LessNotEqual(maxNavBarWidth.Value(), 0.0)) { maxNavBarWidth = DEFAULT_MAX_NAV_BAR_WIDTH; @@ -136,6 +144,8 @@ void ResetMaxNavBarWidth(ArkUINodeHandle node) { auto* frameNode = reinterpret_cast(node); CHECK_NULL_VOID(frameNode); + NavigationModelNG::ResetResObj( + frameNode, NavigationPatternType::NAVIGATION, "navigation.navBarWidthRange.maxNavBarWidth"); CalcDimension maxNavBarWidth = DEFAULT_MAX_NAV_BAR_WIDTH; NavigationModelNG::SetMaxNavBarWidth(frameNode, maxNavBarWidth); } @@ -144,6 +154,7 @@ void SetNavBarWidth(ArkUINodeHandle node, ArkUI_Float32 value, int unit, void* w { auto* frameNode = reinterpret_cast(node); CHECK_NULL_VOID(frameNode); + NavigationModelNG::ResetResObj(frameNode, NavigationPatternType::NAVIGATION, "navigation.navBarWidth"); CalcDimension width = Dimension(value, static_cast(unit)); if (!SystemProperties::ConfigChangePerform() || !widthRawPtr) { NavigationModelNG::SetNavBarWidth(frameNode, width); @@ -158,6 +169,7 @@ void ResetNavBarWidth(ArkUINodeHandle node) { auto* frameNode = reinterpret_cast(node); CHECK_NULL_VOID(frameNode); + NavigationModelNG::ResetResObj(frameNode, NavigationPatternType::NAVIGATION, "navigation.navBarWidth"); CalcDimension navBarWidth; navBarWidth.SetValue(DEFAULT_NAV_BAR_WIDTH_FOR_MODIFIER); NavigationModelNG::SetNavBarWidth(frameNode, navBarWidth); @@ -364,6 +376,9 @@ void SetNavTitle(ArkUINodeHandle node, ArkUINavigationTitleInfo titleInfo, ArkUI { auto* frameNode = reinterpret_cast(node); CHECK_NULL_VOID(frameNode); + NavigationModelNG::ResetResObj(frameNode, NavigationPatternType::TITLE_BAR, "navigation.title.commonMainTitle"); + NavigationModelNG::ResetResObj(frameNode, NavigationPatternType::TITLE_BAR, "navigation.title.commonSubTitle"); + NavigationModelNG::ResetResObj(frameNode, NavigationPatternType::NAVIGATION, "navigationModifier.titlebarOptions"); std::string mainTitleString = std::string(titleInfo.mainTitle); std::string subTitleString = std::string(titleInfo.subTitle); NG::NavigationTitleInfo ngTitleInfo = { titleInfo.hasSubTitle, titleInfo.hasMainTitle, @@ -373,7 +388,7 @@ void SetNavTitle(ArkUINodeHandle node, ArkUINavigationTitleInfo titleInfo, ArkUI auto titleResObj = AceType::Claim(title); auto* subtitle = reinterpret_cast(subtitleRawPtr); auto subtitleResObj = AceType::Claim(subtitle); - NavigationModelNG::ParseCommonTitle(frameNode, ngTitleInfo, titleResObj, subtitleResObj); + NavigationModelNG::ParseCommonTitle(frameNode, titleResObj, subtitleResObj); } else { NavigationModelNG::ParseCommonTitle(frameNode, ngTitleInfo); } @@ -401,16 +416,18 @@ void SetNavTitle(ArkUINodeHandle node, ArkUINavigationTitleInfo titleInfo, ArkUI finalOptions.enableHoverMode = options.enableHoverMode.value; } NavigationModelNG::SetTitlebarOptions(frameNode, std::move(finalOptions)); - if (!SystemProperties::ConfigChangePerform()) { - return; + if (SystemProperties::ConfigChangePerform()) { + UpdateNavigationTitlebarOptions(frameNode, options); } - UpdateNavigationTitlebarOptions(frameNode, options); } void ResetNavTitle(ArkUINodeHandle node) { auto* frameNode = reinterpret_cast(node); CHECK_NULL_VOID(frameNode); + NavigationModelNG::ResetResObj(frameNode, NavigationPatternType::TITLE_BAR, "navigation.title.commonMainTitle"); + NavigationModelNG::ResetResObj(frameNode, NavigationPatternType::TITLE_BAR, "navigation.title.commonSubTitle"); + NavigationModelNG::ResetResObj(frameNode, NavigationPatternType::NAVIGATION, "navigationModifier.titlebarOptions"); NG::NavigationTitleInfo ngTitleInfo = { false, false, "", "" }; NavigationModelNG::ParseCommonTitle(frameNode, ngTitleInfo); NavigationTitlebarOptions options; @@ -465,6 +482,7 @@ void SetNavMenus(ArkUINodeHandle node, ArkUIBarItem* items, ArkUI_Uint32 length) { auto* frameNode = reinterpret_cast(node); CHECK_NULL_VOID(frameNode); + NavigationModelNG::ResetResObj(frameNode, NavigationPatternType::NAVIGATION, "navigationModifier.menuItems"); CHECK_NULL_VOID(items); std::vector menuItems; for (uint32_t i = 0; i < length; i++) { @@ -510,6 +528,7 @@ void ResetNavMenus(ArkUINodeHandle node) { auto* frameNode = reinterpret_cast(node); CHECK_NULL_VOID(frameNode); + NavigationModelNG::ResetResObj(frameNode, NavigationPatternType::NAVIGATION, "navigationModifier.menuItems"); std::vector menuItems; NavigationModelNG::SetMenuItems(frameNode, std::move(menuItems)); } diff --git a/frameworks/core/interfaces/native/node/side_bar_container_modifier.cpp b/frameworks/core/interfaces/native/node/side_bar_container_modifier.cpp index 4fa9993ec49..66a1f70f385 100644 --- a/frameworks/core/interfaces/native/node/side_bar_container_modifier.cpp +++ b/frameworks/core/interfaces/native/node/side_bar_container_modifier.cpp @@ -42,6 +42,7 @@ void SetSideBarWidth(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit { auto* frameNode = reinterpret_cast(node); CHECK_NULL_VOID(frameNode); + SideBarContainerModelNG::ResetResObj(frameNode, "sideBarContainer.sideBarWidth"); Dimension sideBarWidthDimension(value, static_cast(unit)); if (!SystemProperties::ConfigChangePerform() || !sideBarWidthPtr) { SideBarContainerModelNG::SetSideBarWidth(frameNode, sideBarWidthDimension); @@ -56,6 +57,7 @@ void ResetSideBarWidth(ArkUINodeHandle node) { auto* frameNode = reinterpret_cast(node); CHECK_NULL_VOID(frameNode); + SideBarContainerModelNG::ResetResObj(frameNode, "sideBarContainer.sideBarWidth"); if (Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_TEN)) { SideBarContainerModelNG::SetSideBarWidth(frameNode, DEFAULT_SIDE_BAR_WIDTH_V10); return; @@ -67,6 +69,7 @@ void SetMinSideBarWidth(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 u { auto* frameNode = reinterpret_cast(node); CHECK_NULL_VOID(frameNode); + SideBarContainerModelNG::ResetResObj(frameNode, "sideBarContainer.minSideBarWidth"); Dimension minSideBarWidthDimension(value, static_cast(unit)); if (!SystemProperties::ConfigChangePerform() || !minSideBarWidthPtr) { SideBarContainerModelNG::SetMinSideBarWidth(frameNode, minSideBarWidthDimension); @@ -81,6 +84,7 @@ void ResetMinSideBarWidth(ArkUINodeHandle node) { auto* frameNode = reinterpret_cast(node); CHECK_NULL_VOID(frameNode); + SideBarContainerModelNG::ResetResObj(frameNode, "sideBarContainer.minSideBarWidth"); if (Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_TEN)) { SideBarContainerModelNG::SetMinSideBarWidth(frameNode, DEFAULT_MIN_SIDE_BAR_WIDTH_V10); return; @@ -93,6 +97,9 @@ void SetControlButton(ArkUINodeHandle node, const ArkUI_Float32* values, int32_t { auto* frameNode = reinterpret_cast(node); CHECK_NULL_VOID(frameNode); + SideBarContainerModelNG::ResetResObj(frameNode, "sideBarContainer.buttonIconOptions.shown"); + SideBarContainerModelNG::ResetResObj(frameNode, "sideBarContainer.buttonIconOptions.hidden"); + SideBarContainerModelNG::ResetResObj(frameNode, "sideBarContainer.buttonIconOptions.switching"); Dimension left = Dimension(values[0], DimensionUnit::VP); Dimension top = Dimension(values[1], DimensionUnit::VP); Dimension width = Dimension(values[2], DimensionUnit::VP); @@ -134,6 +141,9 @@ void ResetControlButton(ArkUINodeHandle node) auto* frameNode = reinterpret_cast(node); CHECK_NULL_VOID(frameNode); if (Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_TEN)) { + SideBarContainerModelNG::ResetResObj(frameNode, "sideBarContainer.buttonIconOptions.shown"); + SideBarContainerModelNG::ResetResObj(frameNode, "sideBarContainer.buttonIconOptions.hidden"); + SideBarContainerModelNG::ResetResObj(frameNode, "sideBarContainer.buttonIconOptions.switching"); SideBarContainerModelNG::SetControlButtonWidth(frameNode, DEFAULT_CONTROL_BUTTON_WIDTH); SideBarContainerModelNG::SetControlButtonHeight(frameNode, DEFAULT_CONTROL_BUTTON_HEIGHT); SideBarContainerModelNG::ResetControlButtonLeft(frameNode); @@ -178,6 +188,7 @@ void SetSideBarContainerMaxSideBarWidth( { auto* frameNode = reinterpret_cast(node); CHECK_NULL_VOID(frameNode); + SideBarContainerModelNG::ResetResObj(frameNode, "sideBarContainer.maxSideBarWidth"); Dimension maxSideBarWidthDimension(value, static_cast(unit)); if (!SystemProperties::ConfigChangePerform() || !maxSideBarWidthPtr) { SideBarContainerModelNG::SetMaxSideBarWidth(frameNode, maxSideBarWidthDimension); @@ -192,6 +203,7 @@ void ResetSideBarContainerMaxSideBarWidth(ArkUINodeHandle node) { auto* frameNode = reinterpret_cast(node); CHECK_NULL_VOID(frameNode); + SideBarContainerModelNG::ResetResObj(frameNode, "sideBarContainer.maxSideBarWidth"); SideBarContainerModelNG::SetMaxSideBarWidth(frameNode, DEFAULT_SIDE_BAR_CONTAINER_MAX_SIDE_BAR_WIDTH); } @@ -200,6 +212,7 @@ void SetSideBarContainerMinContentWidth( { auto* frameNode = reinterpret_cast(node); CHECK_NULL_VOID(frameNode); + SideBarContainerModelNG::ResetResObj(frameNode, "sideBarContainer.minContentWidth"); Dimension maxSideBarWidthDimension(value, static_cast(unit)); if (!SystemProperties::ConfigChangePerform() || !minContentWidthPtr) { SideBarContainerModelNG::SetMinContentWidth(frameNode, maxSideBarWidthDimension); @@ -214,6 +227,7 @@ void ResetSideBarContainerMinContentWidth(ArkUINodeHandle node) { auto* frameNode = reinterpret_cast(node); CHECK_NULL_VOID(frameNode); + SideBarContainerModelNG::ResetResObj(frameNode, "sideBarContainer.minContentWidth"); SideBarContainerModelNG::SetMinContentWidth(frameNode, -1.0_vp); } @@ -251,6 +265,10 @@ void SetSideBarContainerDivider(ArkUINodeHandle node, const ArkUI_Float32* value { auto* frameNode = reinterpret_cast(node); CHECK_NULL_VOID(frameNode); + SideBarContainerModelNG::ResetResObj(frameNode, "sideBarContainer.dividerStyle.strokeWidth"); + SideBarContainerModelNG::ResetResObj(frameNode, "sideBarContainer.dividerStyle.startMargin"); + SideBarContainerModelNG::ResetResObj(frameNode, "sideBarContainer.dividerStyle.endMargin"); + SideBarContainerModelNG::ResetResObj(frameNode, "sideBarContainer.dividerStyle.color"); CHECK_NULL_VOID(values); CHECK_NULL_VOID(units); if (length != NUM_3) { @@ -297,6 +315,10 @@ void ResetSideBarContainerDivider(ArkUINodeHandle node) { auto* frameNode = reinterpret_cast(node); CHECK_NULL_VOID(frameNode); + SideBarContainerModelNG::ResetResObj(frameNode, "sideBarContainer.dividerStyle.strokeWidth"); + SideBarContainerModelNG::ResetResObj(frameNode, "sideBarContainer.dividerStyle.startMargin"); + SideBarContainerModelNG::ResetResObj(frameNode, "sideBarContainer.dividerStyle.endMargin"); + SideBarContainerModelNG::ResetResObj(frameNode, "sideBarContainer.dividerStyle.color"); SideBarContainerModelNG::SetDividerStrokeWidth(frameNode, DEFAULT_DIVIDER_STROKE_WIDTH); SideBarContainerModelNG::SetDividerColor(frameNode, Color(DEFAULT_SIDE_BAR_DIVIDER_COLOR)); SideBarContainerModelNG::SetDividerStartMargin(frameNode, DEFAULT_START_MARGIN); diff --git a/test/unittest/core/pattern/navigation/navigation_model_test_ng.cpp b/test/unittest/core/pattern/navigation/navigation_model_test_ng.cpp index d3cff7fc755..cb397e903e8 100644 --- a/test/unittest/core/pattern/navigation/navigation_model_test_ng.cpp +++ b/test/unittest/core/pattern/navigation/navigation_model_test_ng.cpp @@ -1943,6 +1943,62 @@ HWTEST_F(NavigationModelTestNg, SetMinContentWidth001, TestSize.Level1) EXPECT_EQ(navigationPattern->GetMinContentWidthValue(), navigationPattern->minContentWidthValue_); } +/** + * @tc.name: SetMinContentWidth002 + * @tc.desc: Test SetMinContentWidth. + * @tc.type: FUNC + */ +HWTEST_F(NavigationModelTestNg, SetMinContentWidth002, TestSize.Level1) +{ + MockPipelineContextGetTheme(); + NavigationModelNG navigationModel; + navigationModel.Create(); + navigationModel.SetNavigationStack(); + navigationModel.SetTitle("navigationModel", false); + auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); + auto navigationGroupNode = AceType::DynamicCast(frameNode); + ASSERT_NE(navigationGroupNode, nullptr); + auto navigationPattern = navigationGroupNode->GetPattern(); + ASSERT_NE(navigationPattern, nullptr); + std::string bundleName = "com.example.test"; + std::string moduleName = "entry"; + RefPtr resObj = AceType::MakeRefPtr(bundleName, moduleName, 0); + navigationModel.SetMinContentWidth(resObj); + std::string key = "navigation.minContentWidth"; + EXPECT_EQ(navigationPattern->GetResCacheMapByKey(key), ""); + navigationPattern->OnColorModeChange(1); + CalcDimension minContentWidth; + ResourceParseUtils::ParseResDimensionVpNG(resObj, minContentWidth); + EXPECT_EQ(navigationPattern->GetResCacheMapByKey(key), minContentWidth.ToString()); +} + +/** + * @tc.name: SetMinContentWidth003 + * @tc.desc: Test SetMinContentWidth with Specific frameNode. + * @tc.type: FUNC + */ +HWTEST_F(NavigationModelTestNg, SetMinContentWidth003, TestSize.Level1) +{ + MockPipelineContextGetTheme(); + NavigationModelNG navigationModel; + navigationModel.Create(); + navigationModel.SetNavigationStack(); + navigationModel.SetTitle("navigationModel", false); + auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); + auto navigationGroupNode = AceType::DynamicCast(frameNode); + ASSERT_NE(navigationGroupNode, nullptr); + auto navigationPattern = navigationGroupNode->GetPattern(); + ASSERT_NE(navigationPattern, nullptr); + RefPtr resObj = AceType::MakeRefPtr("", "", 0); + navigationModel.SetMinContentWidth(resObj); + std::string key = "navigation.minContentWidth"; + EXPECT_EQ(navigationPattern->GetResCacheMapByKey(key), ""); + navigationPattern->OnColorModeChange(1); + CalcDimension minContentWidth; + ResourceParseUtils::ParseResDimensionVpNG(resObj, minContentWidth); + EXPECT_EQ(navigationPattern->GetResCacheMapByKey(key), minContentWidth.ToString()); +} + /** * @tc.name: SetNavigationPathInfo001 * @tc.desc: Test SetNavigationPathInfo and cover all conditions. -- Gitee