diff --git a/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_tabs_bridge.cpp b/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_tabs_bridge.cpp index 8330879305c8fab2034f155cfffa384f74899f54..3d1079a010939c0877febe61924a752be743385e 100644 --- a/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_tabs_bridge.cpp +++ b/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_tabs_bridge.cpp @@ -277,6 +277,7 @@ ArkUINativeModuleValue TabsBridge::SetDivider(ArkUIRuntimeCallInfo* runtimeCallI CalcDimension dividerStartMargin; CalcDimension dividerEndMargin; uint32_t color; + bool isColorTheme = false; auto* frameNode = reinterpret_cast(nativeNode); CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr)); auto context = frameNode->GetContext(); @@ -298,6 +299,8 @@ ArkUINativeModuleValue TabsBridge::SetDivider(ArkUIRuntimeCallInfo* runtimeCallI Color colorObj; if (isColorArgInvalid || !ArkTSUtils::ParseJsColorAlpha(vm, colorArg, colorObj, colorResObj)) { color = tabTheme->GetDividerColor().GetValue(); + isColorTheme = true; + colorResObj = nullptr; } else { color = colorObj.GetValue(); } @@ -324,6 +327,7 @@ ArkUINativeModuleValue TabsBridge::SetDivider(ArkUIRuntimeCallInfo* runtimeCallI GetArkUINodeModifiers()->getTabsModifier()->createDividerWithResourceObj(nativeNode, AceType::RawPtr(strokeWidthResObj), AceType::RawPtr(colorResObj), AceType::RawPtr(startMarginResObj), AceType::RawPtr(endMarginResObj)); + GetArkUINodeModifiers()->getTabsModifier()->createDividerColorWithResourceObj(nativeNode, isColorTheme); return panda::JSValueRef::Undefined(vm); } diff --git a/frameworks/bridge/declarative_frontend/jsview/js_tab_content.cpp b/frameworks/bridge/declarative_frontend/jsview/js_tab_content.cpp index 6dfb7f38aa706ddf3c8a6793fa965705cab14562..fdb909b5672feae0bb3a154c134eb5bf5cd4c353 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_tab_content.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/js_tab_content.cpp @@ -94,6 +94,8 @@ void JSTabContent::SetTabBar(const JSCallbackInfo& info) } auto tabBarInfo = info[0]; + TabContentModel::GetInstance()->CreateWithResourceObj(TabContentJsType::TEXT_CONTENT, nullptr); + TabContentModel::GetInstance()->CreateWithResourceObj(TabContentJsType::ICON, nullptr); RefPtr resTextObj; std::string infoStr; if (ParseJsString(tabBarInfo, infoStr, resTextObj)) { @@ -220,16 +222,23 @@ void JSTabContent::SetIndicator(const JSRef& info) RefPtr tabTheme = GetTheme(); if (tabTheme) { indicator.color = tabTheme->GetActiveIndicatorColor(); + indicator.isColorTheme = true; + indicatorColorResObj = nullptr; } + } else { + indicator.isColorTheme = false; } if (!info->IsObject() || !ParseJsDimensionVp(obj->GetProperty("height"), indicatorHeight, indicatorHightResObj) || indicatorHeight.Value() < 0.0f || indicatorHeight.Unit() == DimensionUnit::PERCENT) { RefPtr tabTheme = GetTheme(); if (tabTheme) { indicator.height = tabTheme->GetActiveIndicatorWidth(); + indicator.isHeightTheme = true; + indicatorHightResObj = nullptr; } } else { indicator.height = indicatorHeight; + indicator.isHeightTheme = false; } if (!info->IsObject() || !ParseJsDimensionVp(obj->GetProperty("width"), indicatorWidth, indicatorWidthResObj) || indicatorWidth.Value() < 0.0f || indicatorWidth.Unit() == DimensionUnit::PERCENT) { @@ -250,9 +259,12 @@ void JSTabContent::SetIndicator(const JSRef& info) RefPtr tabTheme = GetTheme(); if (tabTheme) { indicator.marginTop = tabTheme->GetSubTabIndicatorGap(); + indicator.isMarginTopTheme = true; + indicatorMarginTopResObj = nullptr; } } else { indicator.marginTop = indicatorMarginTop; + indicator.isMarginTopTheme = false; } TabContentModel::GetInstance()->SetIndicator(indicator); if (SystemProperties::ConfigChangePerform()) { @@ -404,6 +416,8 @@ void JSTabContent::SetLabelStyle(const JSRef& info, bool isSubTabStyle) void JSTabContent::SetIconStyle(const JSRef& info) { IconStyle iconStyle; + TabContentModel::GetInstance()->CreateWithResourceObj(TabContentJsType::ICON_SELECT_COLOR, nullptr); + TabContentModel::GetInstance()->CreateWithResourceObj(TabContentJsType::ICON_UNSELECT_COLOR, nullptr); if (info->IsObject()) { RefPtr unselectedColorResObj; RefPtr selectedColorResObj; @@ -497,7 +511,9 @@ void JSTabContent::SetPadding(const JSRef& info, bool isSubTabStyle) if (tabTheme) { if (isSubTabStyle) { padding.top = NG::CalcLength(tabTheme->GetSubTabTopPadding()); + padding.isTopTheme = true; padding.bottom = NG::CalcLength(tabTheme->GetSubTabBottomPadding()); + padding.isBottomTheme = true; padding.left = NG::CalcLength(tabTheme->GetSubTabHorizontalPadding()); padding.right = NG::CalcLength(tabTheme->GetSubTabHorizontalPadding()); } else { @@ -506,6 +522,8 @@ void JSTabContent::SetPadding(const JSRef& info, bool isSubTabStyle) padding.left = NG::CalcLength(tabTheme->GetBottomTabHorizontalPadding()); padding.right = NG::CalcLength(tabTheme->GetBottomTabHorizontalPadding()); } + padding.isRightTheme = true; + padding.isLeftTheme = true; } RefPtr resObjLeft; RefPtr resObjRight; @@ -517,21 +535,25 @@ void JSTabContent::SetPadding(const JSRef& info, bool isSubTabStyle) if (ParseJsDimensionVp(paddingObj->GetProperty("left"), left, resObjLeft) && NonNegative(left.Value()) && left.Unit() != DimensionUnit::PERCENT) { padding.left = NG::CalcLength(left); + padding.isLeftTheme = false; } CalcDimension right; if (ParseJsDimensionVp(paddingObj->GetProperty("right"), right, resObjRight) && NonNegative(right.Value()) && right.Unit() != DimensionUnit::PERCENT) { padding.right = NG::CalcLength(right); + padding.isRightTheme = false; } CalcDimension top; if (ParseJsDimensionVp(paddingObj->GetProperty("top"), top, resObjTop) && NonNegative(top.Value()) && top.Unit() != DimensionUnit::PERCENT) { padding.top = NG::CalcLength(top); + padding.isTopTheme = false; } CalcDimension bottom; if (ParseJsDimensionVp(paddingObj->GetProperty("bottom"), bottom, resObjBottom) && NonNegative(bottom.Value()) && bottom.Unit() != DimensionUnit::PERCENT) { padding.bottom = NG::CalcLength(bottom); + padding.isBottomTheme = false; } } if (info->IsObject()) { @@ -546,6 +568,7 @@ void JSTabContent::SetPadding(const JSRef& info, bool isSubTabStyle) padding.left = NG::CalcLength(start); useLocalizedPadding = true; resObjLeft = nullptr; + padding.isLeftTheme = false; } } if (paddingObj->GetProperty("end")->IsObject()) { @@ -554,6 +577,7 @@ void JSTabContent::SetPadding(const JSRef& info, bool isSubTabStyle) padding.right = NG::CalcLength(end); useLocalizedPadding = true; resObjRight = nullptr; + padding.isRightTheme = false; } } if (paddingObj->GetProperty("top")->IsObject()) { @@ -562,6 +586,7 @@ void JSTabContent::SetPadding(const JSRef& info, bool isSubTabStyle) padding.top = NG::CalcLength(top); useLocalizedPadding = true; resObjTop = nullptr; + padding.isTopTheme = false; } } if (paddingObj->GetProperty("bottom")->IsObject()) { @@ -570,12 +595,17 @@ void JSTabContent::SetPadding(const JSRef& info, bool isSubTabStyle) padding.bottom = NG::CalcLength(bottom); useLocalizedPadding = true; resObjBottom = nullptr; + padding.isBottomTheme = false; } } } TabContentModel::GetInstance()->SetPadding(padding); TabContentModel::GetInstance()->SetUseLocalizedPadding(useLocalizedPadding); - TabContentModel::GetInstance()->CreatePaddingWithResourceObj(resObjLeft, resObjRight, resObjTop, resObjBottom); + TabContentModel::GetInstance()->SetIsSubTabStyle(isSubTabStyle); + TabContentModel::GetInstance()->CreatePaddingHorWithResourceObj(resObjLeft, resObjRight, + isSubTabStyle, useLocalizedPadding); + TabContentModel::GetInstance()->CreatePaddingVerWithResourceObj(resObjTop, resObjBottom, + isSubTabStyle, useLocalizedPadding); } void JSTabContent::SetId(const JSRef& info) @@ -605,6 +635,7 @@ void JSTabContent::CompleteParameters(LabelStyle& labelStyle, bool isSubTabStyle if (!labelStyle.fontSize.has_value()) { if (isSubTabStyle) { labelStyle.fontSize = tabTheme->GetSubTabTextDefaultFontSize(); + labelStyle.isFontSizeTheme = true; } else if (Container::LessThanAPITargetVersion(PlatformVersion::VERSION_TWELVE)) { labelStyle.fontSize = tabTheme->GetBottomTabTextSize(); } diff --git a/frameworks/bridge/declarative_frontend/jsview/js_tabs.cpp b/frameworks/bridge/declarative_frontend/jsview/js_tabs.cpp index 058c423e3c7f96c6897b98c9f7d2753a684cfeec..374230bb557b462de4af53974901e38f2c2c47d9 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_tabs.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/js_tabs.cpp @@ -462,6 +462,10 @@ void JSTabs::SetDivider(const JSCallbackInfo& info) if (!dividerInfo->IsObject() || !ConvertFromJSValue(obj->GetProperty("color"), divider.color, colorResObj)) { divider.color = tabTheme->GetDividerColor(); + divider.isColorTheme = true; + colorResObj = nullptr; + } else { + divider.isColorTheme = false; } if (!dividerInfo->IsObject() || !ParseJsDimensionVp(obj->GetProperty("startMargin"), dividerStartMargin, startMarginResObj) || diff --git a/frameworks/core/components_ng/pattern/tabs/tab_content_model.h b/frameworks/core/components_ng/pattern/tabs/tab_content_model.h index 5b30d934c29141de088608df77e7734c39c982b0..915c2777d96e318466f80e374620394d5a4b8c35 100644 --- a/frameworks/core/components_ng/pattern/tabs/tab_content_model.h +++ b/frameworks/core/components_ng/pattern/tabs/tab_content_model.h @@ -54,6 +54,9 @@ struct IndicatorStyle final { Dimension width = 0.0_vp; Dimension borderRadius = 0.0_vp; Dimension marginTop = 0.0_vp; + bool isColorTheme = false; + bool isHeightTheme = false; + bool isMarginTopTheme = false; IndicatorStyle() { auto pipelineContext = PipelineContext::GetCurrentContextSafelyWithCheck(); @@ -67,6 +70,9 @@ struct IndicatorStyle final { color = tabTheme->GetActiveIndicatorColor(); height = tabTheme->GetSubTabIndicatorHeight(); marginTop = tabTheme->GetSubTabIndicatorGap(); + isColorTheme = true; + isHeightTheme = true; + isMarginTopTheme = true; } bool operator==(const IndicatorStyle& indicator) const { @@ -103,6 +109,7 @@ struct LabelStyle { std::optional maxFontSize; std::optional heightAdaptivePolicy; std::optional fontSize; + bool isFontSizeTheme = false; std::optional fontWeight; std::optional> fontFamily; std::optional fontStyle; @@ -149,9 +156,10 @@ public: virtual void Create(std::function&& deepRenderFunc) = 0; virtual void Pop() = 0; virtual void CreateWithResourceObj(TabContentJsType jsType, const RefPtr& resObj) {}; - virtual void CreatePaddingWithResourceObj(const RefPtr& resObjLeft, - const RefPtr& resObjRight, const RefPtr& resObjTop, - const RefPtr& resObjBottom) {}; + virtual void CreatePaddingHorWithResourceObj(const RefPtr& resObjLeft, + const RefPtr& resObjRight, bool isSubTabStyle, bool useLocalizedPadding) {}; + virtual void CreatePaddingVerWithResourceObj(const RefPtr& resObjTop, + const RefPtr& resObjBottom, bool isSubTabStyle, bool useLocalizedPadding) {}; virtual void SetTabBar(const std::optional& text, const std::optional& icon, const std::optional& tabBarSymbol, std::function&& builder, bool useContentOnly) = 0; virtual void SetTabBarWithContent(const RefPtr& content) = 0; @@ -171,6 +179,8 @@ public: virtual void SetOnWillHide(std::function&& onWillHide) {} virtual void SetCustomStyleNode(const RefPtr& customStyleNode) {} + virtual void SetIsSubTabStyle(bool isSubTabStyle) {}; + private: static std::unique_ptr instance_; static std::mutex mutex_; diff --git a/frameworks/core/components_ng/pattern/tabs/tab_content_model_ng.cpp b/frameworks/core/components_ng/pattern/tabs/tab_content_model_ng.cpp index a540168b35b96d46e84bdeb0f7bc97afeec7fff7..9ec48376e9ed161b67e0f6299bb725779d604fa0 100644 --- a/frameworks/core/components_ng/pattern/tabs/tab_content_model_ng.cpp +++ b/frameworks/core/components_ng/pattern/tabs/tab_content_model_ng.cpp @@ -542,44 +542,43 @@ void TabContentModelNG::RemoveTabBarItem(const RefPtr& tabConten } template -void ParseType(const RefPtr& resObj, const std::string& name, T& result) +bool ParseType(const RefPtr& resObj, const std::string& name, T& result) { if constexpr (std::is_same_v) { - ResourceParseUtils::ParseResColor(resObj, result); + return ResourceParseUtils::ParseResColor(resObj, result); } else if constexpr (std::is_same_v) { if (name == "height" || name == "borderRadius" || name == "width" || name == "marginTop") { - ResourceParseUtils::ParseResDimensionVp(resObj, result); + return ResourceParseUtils::ParseResDimensionVp(resObj, result); } else if (name == "fontSize" || name == "minFontSize" || name == "maxFontSize") { - ResourceParseUtils::ParseResDimensionFp(resObj, result); + return ResourceParseUtils::ParseResDimensionFp(resObj, result); } else { - ResourceParseUtils::ParseResDimensionNG(resObj, result, DimensionUnit::PX); + return ResourceParseUtils::ParseResDimensionNG(resObj, result, DimensionUnit::PX); } } else if constexpr (std::is_same_v) { - ResourceParseUtils::ParseResDimensionFpNG(resObj, result); + return ResourceParseUtils::ParseResDimensionFpNG(resObj, result); } else if constexpr (std::is_same_v>) { - ResourceParseUtils::ParseResFontFamilies(resObj, result); + return ResourceParseUtils::ParseResFontFamilies(resObj, result); } else if constexpr (std::is_same_v) { - ResourceParseUtils::ParseResString(resObj, result); + return ResourceParseUtils::ParseResString(resObj, result); } + return false; } #define REGISTER_RESOURCE_UPDATE_ATTR_FUNC(caseType, attrType, name, resObj, resultType) \ case caseType: \ do { \ - auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); \ - CHECK_NULL_VOID(frameNode); \ auto pattern = frameNode->GetPattern(); \ CHECK_NULL_VOID(pattern); \ const std::string key = "tabContent." #attrType #name; \ pattern->RemoveResObj(key); \ CHECK_NULL_VOID(resObj); \ - auto&& updateFunc = [weak = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { \ + auto&& updateFunc = [weak = AceType::WeakClaim(frameNode)](const RefPtr& theResObj) { \ auto frameNode = weak.Upgrade(); \ CHECK_NULL_VOID(frameNode); \ auto pattern = frameNode->GetPattern(); \ CHECK_NULL_VOID(pattern); \ resultType result; \ - ParseType(resObj, #name, result); \ + ParseType(theResObj, #name, result); \ auto attrs = pattern->Get##attrType(); \ attrs.name = result; \ pattern->Set##attrType(attrs); \ @@ -588,17 +587,44 @@ void ParseType(const RefPtr& resObj, const std::string& name, T& } while (false); \ break +#define REGISTER_RESOURCE_UPDATE_ATTR_FONT_SIZE_FUNC(caseType, attrType, name, resObj, resultType) \ + case caseType: \ + do { \ + auto pattern = frameNode->GetPattern(); \ + CHECK_NULL_VOID(pattern); \ + const std::string key = "tabContent." #attrType #name; \ + pattern->RemoveResObj(key); \ + CHECK_NULL_VOID(resObj); \ + auto&& updateFunc = [weak = AceType::WeakClaim(frameNode)](const RefPtr& theResObj) { \ + auto frameNode = weak.Upgrade(); \ + CHECK_NULL_VOID(frameNode); \ + auto pattern = frameNode->GetPattern(); \ + CHECK_NULL_VOID(pattern); \ + resultType result; \ + if (ParseType(theResObj, #name, result) && NonNegative(result.Value()) && \ + result.Unit() != DimensionUnit::PERCENT) { \ + auto attrs = pattern->Get##attrType(); \ + attrs.name = result; \ + pattern->Set##attrType(attrs); \ + } \ + }; \ + pattern->AddResObj(key, resObj, std::move(updateFunc)); \ + } while (false); \ + break + void TabContentModelNG::CreateWithResourceObj(TabContentJsType jsType, const RefPtr& resObj) { CHECK_NULL_VOID(SystemProperties::ConfigChangePerform()); + auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); + CHECK_NULL_VOID(frameNode); switch (jsType) { - REGISTER_RESOURCE_UPDATE_ATTR_FUNC(TabContentJsType::INDICATOR_COLOR, IndicatorStyle, color, resObj, Color); - REGISTER_RESOURCE_UPDATE_ATTR_FUNC(TabContentJsType::FONT_SIZE, LabelStyle, fontSize, resObj, CalcDimension); + REGISTER_RESOURCE_UPDATE_ATTR_FONT_SIZE_FUNC( + TabContentJsType::FONT_SIZE, LabelStyle, fontSize, resObj, CalcDimension); REGISTER_RESOURCE_UPDATE_ATTR_FUNC( TabContentJsType::FONT_FAMILY, LabelStyle, fontFamily, resObj, std::vector); - REGISTER_RESOURCE_UPDATE_ATTR_FUNC( + REGISTER_RESOURCE_UPDATE_ATTR_FONT_SIZE_FUNC( TabContentJsType::MIN_FONT_SIZE, LabelStyle, minFontSize, resObj, CalcDimension); - REGISTER_RESOURCE_UPDATE_ATTR_FUNC( + REGISTER_RESOURCE_UPDATE_ATTR_FONT_SIZE_FUNC( TabContentJsType::MAX_FONT_SIZE, LabelStyle, maxFontSize, resObj, CalcDimension); REGISTER_RESOURCE_UPDATE_ATTR_FUNC( TabContentJsType::LABEL_SELECT_COLOR, LabelStyle, selectedColor, resObj, Color); @@ -608,210 +634,466 @@ void TabContentModelNG::CreateWithResourceObj(TabContentJsType jsType, const Ref TabContentJsType::ICON_SELECT_COLOR, IconStyle, selectedColor, resObj, Color); REGISTER_RESOURCE_UPDATE_ATTR_FUNC( TabContentJsType::ICON_UNSELECT_COLOR, IconStyle, unselectedColor, resObj, Color); - REGISTER_RESOURCE_UPDATE_ATTR_FUNC( - TabContentJsType::BORDER_RADIUS, BoardStyle, borderRadius, resObj, CalcDimension); - REGISTER_RESOURCE_UPDATE_ATTR_FUNC( - TabContentJsType::INDICATOR_HEIGHT, IndicatorStyle, height, resObj, CalcDimension); - REGISTER_RESOURCE_UPDATE_ATTR_FUNC( - TabContentJsType::INDICATOR_WIDTH, IndicatorStyle, width, resObj, CalcDimension); - REGISTER_RESOURCE_UPDATE_ATTR_FUNC( - TabContentJsType::INDICATOR_RADIUS, IndicatorStyle, borderRadius, resObj, CalcDimension); - REGISTER_RESOURCE_UPDATE_ATTR_FUNC( - TabContentJsType::INDICATOR_MARGIN_TOP, IndicatorStyle, marginTop, resObj, CalcDimension); - case TabContentJsType::PADDING: { - auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); - CHECK_NULL_VOID(frameNode); - auto pattern = frameNode->GetPattern(); - CHECK_NULL_VOID(pattern); - const std::string key = "tabContent.tabBarPadding"; - pattern->RemoveResObj(key); - CreatePaddingLeftWithResourceObj(frameNode, nullptr); - CreatePaddingRightWithResourceObj(frameNode, nullptr); - CreatePaddingTopWithResourceObj(frameNode, nullptr); - CreatePaddingBottomWithResourceObj(frameNode, nullptr); - CHECK_NULL_VOID(resObj); - auto&& updateFunc = [weak = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { - auto frameNode = weak.Upgrade(); - CHECK_NULL_VOID(frameNode); - auto pattern = frameNode->GetPattern(); - CHECK_NULL_VOID(pattern); - CalcDimension result; - ResourceParseUtils::ParseResDimensionVp(resObj, result); - NG::PaddingProperty padding; - padding.left = NG::CalcLength(result); - padding.right = NG::CalcLength(result); - padding.top = NG::CalcLength(result); - padding.bottom = NG::CalcLength(result); - pattern->SetPadding(padding); - }; - pattern->AddResObj(key, resObj, std::move(updateFunc)); + default: + CreateMoreWithResourceObj(jsType, frameNode, resObj); break; - } - case TabContentJsType::TEXT_CONTENT: { - auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); - CHECK_NULL_VOID(frameNode); - auto pattern = frameNode->GetPattern(); - CHECK_NULL_VOID(pattern); - const std::string key = "tabContent.tabBarParamText"; - pattern->RemoveResObj(key); - CHECK_NULL_VOID(resObj); - auto&& updateFunc = [weak = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { - auto frameNode = weak.Upgrade(); - CHECK_NULL_VOID(frameNode); - auto pattern = frameNode->GetPattern(); - CHECK_NULL_VOID(pattern); - std::string result; - ResourceParseUtils::ParseResString(resObj, result); - ACE_UPDATE_NODE_LAYOUT_PROPERTY(TabContentLayoutProperty, Text, result, frameNode); - pattern->UpdateTabBarParamText(result); - }; - pattern->AddResObj(key, resObj, std::move(updateFunc)); + } +} + +void TabContentModelNG::CreateMoreWithResourceObj(TabContentJsType jsType, FrameNode* frameNode, + const RefPtr& resObj) +{ + CHECK_NULL_VOID(frameNode); + switch (jsType) { + case TabContentJsType::INDICATOR_COLOR: + CreateIndicatorColorWithResourceObj(frameNode, resObj); break; - } - case TabContentJsType::ICON: { - auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); - CHECK_NULL_VOID(frameNode); - auto pattern = frameNode->GetPattern(); - CHECK_NULL_VOID(pattern); - const std::string key = "tabContent.tabBarParamIcon"; - pattern->RemoveResObj(key); - CHECK_NULL_VOID(resObj); - auto&& updateFunc = [weak = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { - auto frameNode = weak.Upgrade(); - CHECK_NULL_VOID(frameNode); - auto pattern = frameNode->GetPattern(); - CHECK_NULL_VOID(pattern); - std::string result; - ResourceParseUtils::ParseResMedia(resObj, result); - ACE_UPDATE_NODE_LAYOUT_PROPERTY(TabContentLayoutProperty, Icon, result, frameNode); - pattern->UpdateTabBarParamIcon(result); - }; - pattern->AddResObj(key, resObj, std::move(updateFunc)); + case TabContentJsType::INDICATOR_HEIGHT: + CreateIndicatorHeightWithResourceObj(frameNode, resObj); + break; + case TabContentJsType::INDICATOR_WIDTH: + CreateIndicatorWidthWithResourceObj(frameNode, resObj); + break; + case TabContentJsType::INDICATOR_RADIUS: + CreateIndicatorBorderRadiusWithResourceObj(frameNode, resObj); + break; + case TabContentJsType::INDICATOR_MARGIN_TOP: + CreateIndicatorMarginTopWithResourceObj(frameNode, resObj); + break; + case TabContentJsType::BORDER_RADIUS: + CreateBoardStyleBorderRadiusWithResourceObj(frameNode, resObj); + break; + case TabContentJsType::PADDING: + CreatePaddingWithResourceObj(frameNode, resObj); + break; + case TabContentJsType::TEXT_CONTENT: + CreateTextContentWithResourceObj(frameNode, resObj); + break; + case TabContentJsType::ICON: + CreateIconWithResourceObj(frameNode, resObj); break; - } default: break; } } -void TabContentModelNG::CreatePaddingWithResourceObj(const RefPtr& resObjLeft, - const RefPtr& resObjRight, const RefPtr& resObjTop, - const RefPtr& resObjBottom) +void TabContentModelNG::CreatePaddingHorWithResourceObj(const RefPtr& resObjLeft, + const RefPtr& resObjRight, bool isSubTabStyle, bool useLocalizedPadding) { CHECK_NULL_VOID(SystemProperties::ConfigChangePerform()); auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); CHECK_NULL_VOID(frameNode); - CreatePaddingLeftWithResourceObj(frameNode, resObjLeft); - CreatePaddingRightWithResourceObj(frameNode, resObjRight); - CreatePaddingTopWithResourceObj(frameNode, resObjTop); - CreatePaddingBottomWithResourceObj(frameNode, resObjBottom); + CreatePaddingLeftWithResourceObj(frameNode, resObjLeft, isSubTabStyle, useLocalizedPadding); + CreatePaddingRightWithResourceObj(frameNode, resObjRight, isSubTabStyle, useLocalizedPadding); } -bool TabContentModelNG::CreatePaddingLeftWithResourceObj(FrameNode* frameNode, - const RefPtr& resObjLeft) +void TabContentModelNG::CreatePaddingVerWithResourceObj(const RefPtr& resObjTop, + const RefPtr& resObjBottom, bool isSubTabStyle, bool useLocalizedPadding) +{ + CHECK_NULL_VOID(SystemProperties::ConfigChangePerform()); + auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); + CHECK_NULL_VOID(frameNode); + CreatePaddingTopWithResourceObj(frameNode, resObjTop, isSubTabStyle, useLocalizedPadding); + CreatePaddingBottomWithResourceObj(frameNode, resObjBottom, isSubTabStyle, useLocalizedPadding); +} + +bool TabContentModelNG::CreatePaddingWithResourceObj(FrameNode* frameNode, const RefPtr& resObj) +{ + CHECK_NULL_RETURN(frameNode, false); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_RETURN(pattern, false); + const std::string key = "tabContent.tabBarPadding"; + pattern->RemoveResObj(key); + pattern->RemoveResObj(KEY_PADDING_LEFT); + pattern->RemoveResObj(KEY_PADDING_RIGHT); + pattern->RemoveResObj(KEY_PADDING_TOP); + pattern->RemoveResObj(KEY_PADDING_BOTTOM); + CHECK_NULL_RETURN(resObj, true); + + auto&& updateFunc = [weak = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { + auto frameNode = weak.Upgrade(); + CHECK_NULL_VOID(frameNode); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_VOID(pattern); + CalcDimension result; + if (ResourceParseUtils::ParseResDimensionVp(resObj, result) && NonNegative(result.Value()) && + result.Unit() != DimensionUnit::PERCENT) { + NG::PaddingProperty padding; + padding.left = NG::CalcLength(result); + padding.right = NG::CalcLength(result); + padding.top = NG::CalcLength(result); + padding.bottom = NG::CalcLength(result); + pattern->SetPadding(padding); + } + }; + pattern->AddResObj(key, resObj, std::move(updateFunc)); + return true; +} + +bool TabContentModelNG::CreateTextContentWithResourceObj(FrameNode* frameNode, const RefPtr& resObj) { CHECK_NULL_RETURN(frameNode, false); auto pattern = frameNode->GetPattern(); CHECK_NULL_RETURN(pattern, false); + const std::string key = "tabContent.tabBarParamText"; + pattern->RemoveResObj(key); + CHECK_NULL_RETURN(resObj, true); + + auto&& updateFunc = [weak = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { + auto frameNode = weak.Upgrade(); + CHECK_NULL_VOID(frameNode); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_VOID(pattern); + std::string result; + ResourceParseUtils::ParseResString(resObj, result); + ACE_UPDATE_NODE_LAYOUT_PROPERTY(TabContentLayoutProperty, Text, result, frameNode); + pattern->UpdateTabBarParamText(result); + }; + pattern->AddResObj(key, resObj, std::move(updateFunc)); + return true; +} - if (resObjLeft) { - auto&& updateFunc = [weakNode = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { - auto frameNode = weakNode.Upgrade(); - CHECK_NULL_VOID(frameNode); - auto pattern = frameNode->GetPattern(); - CHECK_NULL_VOID(pattern); - CalcDimension left; - CHECK_NULL_VOID(ResourceParseUtils::ParseResDimensionVp(resObj, left)); - auto padding = pattern->GetPadding(); +bool TabContentModelNG::CreateIconWithResourceObj(FrameNode* frameNode, const RefPtr& resObj) +{ + CHECK_NULL_RETURN(frameNode, false); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_RETURN(pattern, false); + const std::string key = "tabContent.tabBarParamIcon"; + pattern->RemoveResObj(key); + CHECK_NULL_RETURN(resObj, true); + + auto&& updateFunc = [weak = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { + auto frameNode = weak.Upgrade(); + CHECK_NULL_VOID(frameNode); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_VOID(pattern); + std::string result; + ResourceParseUtils::ParseResMedia(resObj, result); + ACE_UPDATE_NODE_LAYOUT_PROPERTY(TabContentLayoutProperty, Icon, result, frameNode); + pattern->UpdateTabBarParamIcon(result); + }; + pattern->AddResObj(key, resObj, std::move(updateFunc)); + return true; +} + +bool TabContentModelNG::CreatePaddingLeftWithResourceObj(FrameNode* frameNode, + const RefPtr& resObjLeft, bool isSubTabStyle, bool useLocalizedPadding) +{ + CHECK_NULL_RETURN(frameNode, false); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_RETURN(pattern, false); + pattern->RemoveResObj(KEY_PADDING); + pattern->RemoveResObj(KEY_PADDING_LEFT); + CHECK_NULL_RETURN(resObjLeft, true); + + auto&& updateFunc = [weakNode = AceType::WeakClaim(frameNode), isSubTabStyle]( + const RefPtr& resObj) { + auto frameNode = weakNode.Upgrade(); + CHECK_NULL_VOID(frameNode); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_VOID(pattern); + CalcDimension left; + auto padding = pattern->GetPadding(); + if (ResourceParseUtils::ParseResDimensionVp(resObj, left)) { padding.left = NG::CalcLength(left); - pattern->SetPadding(padding); - }; - pattern->AddResObj(KEY_PADDING_LEFT, resObjLeft, std::move(updateFunc)); - pattern->RemoveResObj(KEY_PADDING); - } else { - pattern->RemoveResObj(KEY_PADDING_LEFT); - } + } else { + auto pipelineContext = frameNode->GetContext(); + CHECK_NULL_VOID(pipelineContext); + auto tabTheme = pipelineContext->GetTheme(); + CHECK_NULL_VOID(tabTheme); + padding.left = (isSubTabStyle) ? NG::CalcLength(tabTheme->GetSubTabHorizontalPadding()) : + NG::CalcLength(tabTheme->GetBottomTabHorizontalPadding()); + } + pattern->SetPadding(padding); + }; + pattern->AddResObj(KEY_PADDING_LEFT, resObjLeft, std::move(updateFunc)); return true; } bool TabContentModelNG::CreatePaddingRightWithResourceObj(FrameNode* frameNode, - const RefPtr& resObjRight) + const RefPtr& resObjRight, bool isSubTabStyle, bool useLocalizedPadding) { CHECK_NULL_RETURN(frameNode, false); auto pattern = frameNode->GetPattern(); CHECK_NULL_RETURN(pattern, false); - - if (resObjRight) { - auto&& updateFunc = [weakNode = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { - auto frameNode = weakNode.Upgrade(); - CHECK_NULL_VOID(frameNode); - auto pattern = frameNode->GetPattern(); - CHECK_NULL_VOID(pattern); - CalcDimension right; - CHECK_NULL_VOID(ResourceParseUtils::ParseResDimensionVp(resObj, right)); - auto padding = pattern->GetPadding(); + pattern->RemoveResObj(KEY_PADDING); + pattern->RemoveResObj(KEY_PADDING_RIGHT); + CHECK_NULL_RETURN(resObjRight, true); + + auto&& updateFunc = [weakNode = AceType::WeakClaim(frameNode), isSubTabStyle]( + const RefPtr& resObj) { + auto frameNode = weakNode.Upgrade(); + CHECK_NULL_VOID(frameNode); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_VOID(pattern); + CalcDimension right; + auto padding = pattern->GetPadding(); + if (ResourceParseUtils::ParseResDimensionVp(resObj, right)) { padding.right = NG::CalcLength(right); - pattern->SetPadding(padding); - }; - pattern->AddResObj(KEY_PADDING_RIGHT, resObjRight, std::move(updateFunc)); - pattern->RemoveResObj(KEY_PADDING); - } else { - pattern->RemoveResObj(KEY_PADDING_RIGHT); - } + } else { + auto pipelineContext = frameNode->GetContext(); + CHECK_NULL_VOID(pipelineContext); + auto tabTheme = pipelineContext->GetTheme(); + CHECK_NULL_VOID(tabTheme); + padding.right = (isSubTabStyle) ? NG::CalcLength(tabTheme->GetSubTabHorizontalPadding()) : + NG::CalcLength(tabTheme->GetBottomTabHorizontalPadding()); + } + pattern->SetPadding(padding); + }; + pattern->AddResObj(KEY_PADDING_RIGHT, resObjRight, std::move(updateFunc)); return true; } bool TabContentModelNG::CreatePaddingTopWithResourceObj(FrameNode* frameNode, - const RefPtr& resObjTop) + const RefPtr& resObjTop, bool isSubTabStyle, bool useLocalizedPadding) { CHECK_NULL_RETURN(frameNode, false); auto pattern = frameNode->GetPattern(); CHECK_NULL_RETURN(pattern, false); - - if (resObjTop) { - auto&& updateFunc = [weakNode = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { - auto frameNode = weakNode.Upgrade(); - CHECK_NULL_VOID(frameNode); - auto pattern = frameNode->GetPattern(); - CHECK_NULL_VOID(pattern); - CalcDimension top; - CHECK_NULL_VOID(ResourceParseUtils::ParseResDimensionVp(resObj, top)); - auto padding = pattern->GetPadding(); + pattern->RemoveResObj(KEY_PADDING); + pattern->RemoveResObj(KEY_PADDING_TOP); + CHECK_NULL_RETURN(resObjTop, true); + + auto&& updateFunc = [weakNode = AceType::WeakClaim(frameNode), isSubTabStyle]( + const RefPtr& resObj) { + auto frameNode = weakNode.Upgrade(); + CHECK_NULL_VOID(frameNode); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_VOID(pattern); + CalcDimension top; + auto padding = pattern->GetPadding(); + if (ResourceParseUtils::ParseResDimensionVp(resObj, top)) { padding.top = NG::CalcLength(top); - pattern->SetPadding(padding); - }; - pattern->AddResObj(KEY_PADDING_TOP, resObjTop, std::move(updateFunc)); - pattern->RemoveResObj(KEY_PADDING); - } else { - pattern->RemoveResObj(KEY_PADDING_TOP); - } + } else { + auto pipelineContext = frameNode->GetContext(); + CHECK_NULL_VOID(pipelineContext); + auto tabTheme = pipelineContext->GetTheme(); + CHECK_NULL_VOID(tabTheme); + padding.top = (isSubTabStyle) ? NG::CalcLength(tabTheme->GetSubTabTopPadding()) : NG::CalcLength(0.0_vp); + } + pattern->SetPadding(padding); + }; + pattern->AddResObj(KEY_PADDING_TOP, resObjTop, std::move(updateFunc)); return true; } bool TabContentModelNG::CreatePaddingBottomWithResourceObj(FrameNode* frameNode, - const RefPtr& resObjBottom) + const RefPtr& resObjBottom, bool isSubTabStyle, bool useLocalizedPadding) { CHECK_NULL_RETURN(frameNode, false); auto pattern = frameNode->GetPattern(); CHECK_NULL_RETURN(pattern, false); - - if (resObjBottom) { - auto&& updateFunc = [weakNode = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { - auto frameNode = weakNode.Upgrade(); - CHECK_NULL_VOID(frameNode); - auto pattern = frameNode->GetPattern(); - CHECK_NULL_VOID(pattern); - CalcDimension bottom; - CHECK_NULL_VOID(ResourceParseUtils::ParseResDimensionVp(resObj, bottom)); - auto padding = pattern->GetPadding(); + pattern->RemoveResObj(KEY_PADDING); + pattern->RemoveResObj(KEY_PADDING_BOTTOM); + CHECK_NULL_RETURN(resObjBottom, true); + + auto&& updateFunc = [weakNode = AceType::WeakClaim(frameNode), isSubTabStyle]( + const RefPtr& resObj) { + auto frameNode = weakNode.Upgrade(); + CHECK_NULL_VOID(frameNode); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_VOID(pattern); + CalcDimension bottom; + auto padding = pattern->GetPadding(); + if (ResourceParseUtils::ParseResDimensionVp(resObj, bottom)) { padding.bottom = NG::CalcLength(bottom); - pattern->SetPadding(padding); - }; - pattern->AddResObj(KEY_PADDING_BOTTOM, resObjBottom, std::move(updateFunc)); - pattern->RemoveResObj(KEY_PADDING); - } else { - pattern->RemoveResObj(KEY_PADDING_BOTTOM); - } + } else { + auto pipelineContext = frameNode->GetContext(); + CHECK_NULL_VOID(pipelineContext); + auto tabTheme = pipelineContext->GetTheme(); + CHECK_NULL_VOID(tabTheme); + auto padding = pattern->GetPadding(); + padding.bottom = (isSubTabStyle) ? NG::CalcLength(tabTheme->GetSubTabBottomPadding()) : + NG::CalcLength(0.0_vp); + } + pattern->SetPadding(padding); + }; + pattern->AddResObj(KEY_PADDING_BOTTOM, resObjBottom, std::move(updateFunc)); + return true; +} + +bool TabContentModelNG::CreateBoardStyleBorderRadiusWithResourceObj(FrameNode* frameNode, + const RefPtr& resObj) +{ + CHECK_NULL_RETURN(frameNode, false); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_RETURN(pattern, false); + const std::string key = "tabContent.BoardStyle.borderRadius"; + pattern->RemoveResObj(key); + CHECK_NULL_RETURN(resObj, true); + + auto&& updateFunc = [weak = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { + auto frameNode = weak.Upgrade(); + CHECK_NULL_VOID(frameNode); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_VOID(pattern); + CalcDimension result; + auto attrs = pattern->GetIndicatorStyle(); + if (!ParseType(resObj, "borderRadius", result) || result.Value() < 0.0f || + result.Unit() == DimensionUnit::PERCENT) { + auto pipelineContext = frameNode->GetContext(); + CHECK_NULL_VOID(pipelineContext); + auto tabTheme = pipelineContext->GetTheme(); + CHECK_NULL_VOID(tabTheme); + attrs.borderRadius = tabTheme->GetFocusIndicatorRadius(); + } else { + attrs.borderRadius = result; + } + pattern->SetIndicatorStyle(attrs); + }; + pattern->AddResObj(key, resObj, std::move(updateFunc)); + return true; +} + +bool TabContentModelNG::CreateIndicatorColorWithResourceObj(FrameNode* frameNode, const RefPtr& resObj) +{ + CHECK_NULL_RETURN(frameNode, false); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_RETURN(pattern, false); + const std::string key = "tabContent.IndicatorStyle.color"; + pattern->RemoveResObj(key); + CHECK_NULL_RETURN(resObj, true); + + auto&& updateFunc = [weak = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { + auto frameNode = weak.Upgrade(); + CHECK_NULL_VOID(frameNode); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_VOID(pattern); + Color result; + auto attrs = pattern->GetIndicatorStyle(); + if (!ParseType(resObj, "color", result)) { + auto pipelineContext = frameNode->GetContext(); + CHECK_NULL_VOID(pipelineContext); + auto tabTheme = pipelineContext->GetTheme(); + CHECK_NULL_VOID(tabTheme); + attrs.color = tabTheme->GetActiveIndicatorColor(); + } else { + attrs.color = result; + } + pattern->SetIndicatorStyle(attrs); + }; + pattern->AddResObj(key, resObj, std::move(updateFunc)); + return true; +} + +bool TabContentModelNG::CreateIndicatorHeightWithResourceObj(FrameNode* frameNode, const RefPtr& resObj) +{ + CHECK_NULL_RETURN(frameNode, false); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_RETURN(pattern, false); + const std::string key = "tabContent.IndicatorStyle.height"; + pattern->RemoveResObj(key); + CHECK_NULL_RETURN(resObj, true); + + auto&& updateFunc = [weak = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { + auto frameNode = weak.Upgrade(); + CHECK_NULL_VOID(frameNode); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_VOID(pattern); + CalcDimension result; + auto attrs = pattern->GetIndicatorStyle(); + if (!ParseType(resObj, "height", result) || result.Value() < 0.0f || + result.Unit() == DimensionUnit::PERCENT) { + auto pipelineContext = frameNode->GetContext(); + CHECK_NULL_VOID(pipelineContext); + auto tabTheme = pipelineContext->GetTheme(); + CHECK_NULL_VOID(tabTheme); + attrs.height = tabTheme->GetActiveIndicatorWidth(); + } else { + attrs.height = result; + } + pattern->SetIndicatorStyle(attrs); + }; + pattern->AddResObj(key, resObj, std::move(updateFunc)); + return true; +} + +bool TabContentModelNG::CreateIndicatorWidthWithResourceObj(FrameNode* frameNode, const RefPtr& resObj) +{ + CHECK_NULL_RETURN(frameNode, false); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_RETURN(pattern, false); + const std::string key = "tabContent.IndicatorStyle.width"; + pattern->RemoveResObj(key); + CHECK_NULL_RETURN(resObj, true); + + auto&& updateFunc = [weak = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { + auto frameNode = weak.Upgrade(); + CHECK_NULL_VOID(frameNode); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_VOID(pattern); + CalcDimension result; + auto attrs = pattern->GetIndicatorStyle(); + if (!ParseType(resObj, "width", result) || result.Value() < 0.0f || result.Unit() == DimensionUnit::PERCENT) { + attrs.width = 0.0_vp; + } else { + attrs.width = result; + } + pattern->SetIndicatorStyle(attrs); + }; + pattern->AddResObj(key, resObj, std::move(updateFunc)); + return true; +} + +bool TabContentModelNG::CreateIndicatorBorderRadiusWithResourceObj(FrameNode* frameNode, + const RefPtr& resObj) +{ + CHECK_NULL_RETURN(frameNode, false); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_RETURN(pattern, false); + const std::string key = "tabContent.IndicatorStyle.borderRadius"; + pattern->RemoveResObj(key); + CHECK_NULL_RETURN(resObj, true); + + auto&& updateFunc = [weak = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { + auto frameNode = weak.Upgrade(); + CHECK_NULL_VOID(frameNode); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_VOID(pattern); + CalcDimension result; + auto attrs = pattern->GetIndicatorStyle(); + if (!ParseType(resObj, "borderRadius", result) || result.Value() < 0.0f || + result.Unit() == DimensionUnit::PERCENT) { + attrs.borderRadius = 0.0_vp; + } else { + attrs.borderRadius = result; + } + pattern->SetIndicatorStyle(attrs); + }; + pattern->AddResObj(key, resObj, std::move(updateFunc)); + return true; +} + +bool TabContentModelNG::CreateIndicatorMarginTopWithResourceObj(FrameNode* frameNode, + const RefPtr& resObj) +{ + CHECK_NULL_RETURN(frameNode, false); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_RETURN(pattern, false); + const std::string key = "tabContent.IndicatorStyle.marginTop"; + pattern->RemoveResObj(key); + CHECK_NULL_RETURN(resObj, true); + + auto&& updateFunc = [weak = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { + auto frameNode = weak.Upgrade(); + CHECK_NULL_VOID(frameNode); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_VOID(pattern); + CalcDimension result; + auto attrs = pattern->GetIndicatorStyle(); + if (!ParseType(resObj, "marginTop", result) || result.Value() < 0.0f || + result.Unit() == DimensionUnit::PERCENT) { + auto pipelineContext = frameNode->GetContext(); + CHECK_NULL_VOID(pipelineContext); + auto tabTheme = pipelineContext->GetTheme(); + CHECK_NULL_VOID(tabTheme); + attrs.marginTop = tabTheme->GetSubTabIndicatorGap(); + } else { + attrs.marginTop = result; + } + pattern->SetIndicatorStyle(attrs); + }; + pattern->AddResObj(key, resObj, std::move(updateFunc)); return true; } @@ -899,6 +1181,14 @@ void TabContentModelNG::SetUseLocalizedPadding(bool useLocalizedPadding) frameNodePattern->SetUseLocalizedPadding(useLocalizedPadding); } +void TabContentModelNG::SetIsSubTabStyle(bool isSubTabStyle) +{ + CHECK_NULL_VOID(SystemProperties::ConfigChangePerform()); + auto frameNodePattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern(); + CHECK_NULL_VOID(frameNodePattern); + frameNodePattern->SetIsSubTabStyle(isSubTabStyle); +} + void TabContentModelNG::SetLayoutMode(LayoutMode layoutMode) { auto frameNodePattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern(); diff --git a/frameworks/core/components_ng/pattern/tabs/tab_content_model_ng.h b/frameworks/core/components_ng/pattern/tabs/tab_content_model_ng.h index 70d8ac912f0404c4d6e41824f83ea571fdc3e0c8..edd29213b44c6567d241462e6875039436b3eeef 100644 --- a/frameworks/core/components_ng/pattern/tabs/tab_content_model_ng.h +++ b/frameworks/core/components_ng/pattern/tabs/tab_content_model_ng.h @@ -37,9 +37,10 @@ public: void Create() override; void Pop() override; void CreateWithResourceObj(TabContentJsType jsType, const RefPtr& resObj) override; - void CreatePaddingWithResourceObj(const RefPtr& resObjLeft, - const RefPtr& resObjRight, const RefPtr& resObjTop, - const RefPtr& resObjBottom) override; + void CreatePaddingHorWithResourceObj(const RefPtr& resObjLeft, + const RefPtr& resObjRight, bool isSubTabStyle, bool useLocalizedPadding) override; + void CreatePaddingVerWithResourceObj(const RefPtr& resObjTop, + const RefPtr& resObjBottom, bool isSubTabStyle, bool useLocalizedPadding) override; void SetTabBar(const std::optional &text, const std::optional &icon, const std::optional &tabBarSymbol, TabBarBuilderFunc &&builder, bool useContentOnly) override; void SetTabBarWithContent(const RefPtr& content) override; @@ -70,13 +71,31 @@ public: static void UpdateSymbolEffect(RefPtr symbolProperty, bool isActive); static void SetOnWillShow(FrameNode* node, std::function&& onWillShow); static void SetOnWillHide(FrameNode* node, std::function&& onWillHide); - static bool CreatePaddingLeftWithResourceObj(FrameNode* frameNode, const RefPtr& resObjLeft); - static bool CreatePaddingRightWithResourceObj(FrameNode* frameNode, const RefPtr& resObjRight); - static bool CreatePaddingTopWithResourceObj(FrameNode* frameNode, const RefPtr& resObjTop); - static bool CreatePaddingBottomWithResourceObj(FrameNode* frameNode, const RefPtr& resObjBottom); + static bool CreatePaddingWithResourceObj(FrameNode* frameNode, const RefPtr& resObj); + static bool CreateTextContentWithResourceObj(FrameNode* frameNode, const RefPtr& resObj); + static bool CreateIconWithResourceObj(FrameNode* frameNode, const RefPtr& resObj); + static bool CreatePaddingLeftWithResourceObj(FrameNode* frameNode, const RefPtr& resObjLeft, + bool isSubTabStyle = false, bool useLocalizedPadding = false); + static bool CreatePaddingRightWithResourceObj(FrameNode* frameNode, const RefPtr& resObjRight, + bool isSubTabStyle = false, bool useLocalizedPadding = false); + static bool CreatePaddingTopWithResourceObj(FrameNode* frameNode, const RefPtr& resObjTop, + bool isSubTabStyle = false, bool useLocalizedPadding = false); + static bool CreatePaddingBottomWithResourceObj(FrameNode* frameNode, const RefPtr& resObjBottom, + bool isSubTabStyle = false, bool useLocalizedPadding = false); + static bool CreateBoardStyleBorderRadiusWithResourceObj(FrameNode* frameNode, + const RefPtr& resObj); + static bool CreateIndicatorColorWithResourceObj(FrameNode* frameNode, const RefPtr& resObj); + static bool CreateIndicatorHeightWithResourceObj(FrameNode* frameNode, const RefPtr& resObj); + static bool CreateIndicatorWidthWithResourceObj(FrameNode* frameNode, const RefPtr& resObj); + static bool CreateIndicatorBorderRadiusWithResourceObj(FrameNode* frameNode, const RefPtr& resObj); + static bool CreateIndicatorMarginTopWithResourceObj(FrameNode* frameNode, const RefPtr& resObj); + + void SetIsSubTabStyle(bool isSubTabStyle) override; private: static void UpdateLabelStyle(const LabelStyle& labelStyle, RefPtr textLayoutProperty); + static void CreateMoreWithResourceObj(TabContentJsType jsType, FrameNode* frameNode, + const RefPtr& resObj); }; } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/tabs/tab_content_pattern.h b/frameworks/core/components_ng/pattern/tabs/tab_content_pattern.h index c4f8acc7119118a962cdcba2f6f1c0950b24241b..916f07ad4be48f1d5ff9d7ab0b244b69588b7473 100644 --- a/frameworks/core/components_ng/pattern/tabs/tab_content_pattern.h +++ b/frameworks/core/components_ng/pattern/tabs/tab_content_pattern.h @@ -407,6 +407,52 @@ public: tabContentNode->UpdataTabBarItem(); } + void SetIsSubTabStyle(bool isSubTabStyle) + { + isSubTabStyle_ = isSubTabStyle; + } + + void OnColorConfigurationUpdate() override + { + Pattern::OnColorConfigurationUpdate(); + CHECK_NULL_VOID(SystemProperties::ConfigChangePerform()); + auto tabContentNode = AceType::DynamicCast(GetHost()); + CHECK_NULL_VOID(tabContentNode); + auto pipelineContext = tabContentNode->GetContext(); + CHECK_NULL_VOID(pipelineContext); + auto tabTheme = pipelineContext->GetTheme(); + CHECK_NULL_VOID(tabTheme); + + if (indicatorStyle_.isColorTheme) { + indicatorStyle_.color = tabTheme->GetActiveIndicatorColor(); + } + if (indicatorStyle_.isHeightTheme) { + indicatorStyle_.color = tabTheme->GetActiveIndicatorColor(); + } + if (indicatorStyle_.isMarginTopTheme) { + indicatorStyle_.height = tabTheme->GetActiveIndicatorWidth(); + } + + if (labelStyle_.isFontSizeTheme) { + labelStyle_.fontSize = tabTheme->GetSubTabTextDefaultFontSize(); + } + + if (padding_.isLeftTheme) { + padding_.left = NG::CalcLength((isSubTabStyle_) ? tabTheme->GetSubTabHorizontalPadding() : + tabTheme->GetBottomTabHorizontalPadding()); + } + if (padding_.isRightTheme) { + padding_.right = NG::CalcLength((isSubTabStyle_) ? tabTheme->GetSubTabHorizontalPadding() : + tabTheme->GetBottomTabHorizontalPadding()); + } + if (padding_.isTopTheme) { + padding_.top = NG::CalcLength(tabTheme->GetSubTabTopPadding()); + } + if (padding_.isBottomTheme) { + padding_.bottom = NG::CalcLength(tabTheme->GetSubTabBottomPadding()); + } + } + private: RefPtr shallowBuilder_; TabBarParam tabBarParam_; @@ -424,6 +470,7 @@ private: bool firstTimeLayout_ = true; bool secondTimeLayout_ = false; bool useLocalizedPadding_ = false; + bool isSubTabStyle_ = false; ACE_DISALLOW_COPY_AND_MOVE(TabContentPattern); }; diff --git a/frameworks/core/components_ng/pattern/tabs/tabs_model.h b/frameworks/core/components_ng/pattern/tabs/tabs_model.h index 724260a66c8bc25172422c93ff1c5a64506cea86..e586b5bbab363649fc2e4dcfa681f32d21451aaa 100644 --- a/frameworks/core/components_ng/pattern/tabs/tabs_model.h +++ b/frameworks/core/components_ng/pattern/tabs/tabs_model.h @@ -66,6 +66,7 @@ struct TabsItemDivider final { Dimension endMargin = 0.0_vp; Color color = Color::BLACK; bool isNull = false; + bool isColorTheme = false; TabsItemDivider() { auto pipelineContext = PipelineContext::GetCurrentContextSafelyWithCheck(); @@ -77,6 +78,7 @@ struct TabsItemDivider final { return; } color = tabTheme->GetDividerColor(); + isColorTheme = true; } bool operator==(const TabsItemDivider& itemDivider) const { diff --git a/frameworks/core/components_ng/pattern/tabs/tabs_model_ng.cpp b/frameworks/core/components_ng/pattern/tabs/tabs_model_ng.cpp index 55dee696f5bf1e855d78e87d792d430478926cc5..2230f9a586cf924b3487e90869ffb8a118497618 100644 --- a/frameworks/core/components_ng/pattern/tabs/tabs_model_ng.cpp +++ b/frameworks/core/components_ng/pattern/tabs/tabs_model_ng.cpp @@ -781,6 +781,23 @@ void TabsModelNG::SetDivider(FrameNode* frameNode, const TabsItemDivider& divide } } +void TabsModelNG::HandleDividerColorTheme(FrameNode* frameNode, bool isTheme) +{ + CHECK_NULL_VOID(SystemProperties::ConfigChangePerform()); + CHECK_NULL_VOID(frameNode); + auto tabsNode = AceType::DynamicCast(frameNode); + CHECK_NULL_VOID(tabsNode); + auto dividerNode = AceType::DynamicCast(tabsNode->GetDivider()); + CHECK_NULL_VOID(dividerNode); + auto dividerRenderContext = dividerNode->GetRenderContext(); + CHECK_NULL_VOID(dividerRenderContext); + auto tabsLayoutProperty = frameNode->GetLayoutProperty(); + CHECK_NULL_VOID(tabsLayoutProperty); + auto divider = tabsLayoutProperty->GetDivider().value_or(TabsItemDivider()); + divider.isColorTheme = (divider.isNull) ? true : isTheme; + ACE_UPDATE_NODE_LAYOUT_PROPERTY(TabsLayoutProperty, Divider, divider, frameNode); +} + void TabsModelNG::SetEffectNodeOption(FrameNode* frameNode, const TabsEffectNodeOption& option) { CHECK_NULL_VOID(frameNode); diff --git a/frameworks/core/components_ng/pattern/tabs/tabs_model_ng.h b/frameworks/core/components_ng/pattern/tabs/tabs_model_ng.h index cb76c1dbe7fc3d906291926134e09ec074094bc5..7e482e8e1a2e1726758be1466149abdb788162b9 100644 --- a/frameworks/core/components_ng/pattern/tabs/tabs_model_ng.h +++ b/frameworks/core/components_ng/pattern/tabs/tabs_model_ng.h @@ -143,6 +143,7 @@ public: bool isModifier = false); static void HandleBackgroundBlurStyleInactiveColor(FrameNode* frameNode, const RefPtr& resObj, bool isModifier = false); + static void HandleDividerColorTheme(FrameNode* frameNode, bool isTheme); private: static void InitTabsNode(RefPtr tabsNode, const RefPtr& swiperController); diff --git a/frameworks/core/components_ng/pattern/tabs/tabs_pattern.cpp b/frameworks/core/components_ng/pattern/tabs/tabs_pattern.cpp index 3503d5aa5c969a11c8f8a557262a3b4a2e792688..6923840bb29aafd04541c9dd00d7e9afe69ad9b8 100644 --- a/frameworks/core/components_ng/pattern/tabs/tabs_pattern.cpp +++ b/frameworks/core/components_ng/pattern/tabs/tabs_pattern.cpp @@ -313,6 +313,27 @@ void TabsPattern::OnModifyDone() OnUpdateShowDivider(); } +void TabsPattern::OnColorConfigurationUpdate() +{ + Pattern::OnColorConfigurationUpdate(); + CHECK_NULL_VOID(SystemProperties::ConfigChangePerform()); + auto host = GetHost(); + CHECK_NULL_VOID(host); + auto pipeline = host->GetContextWithCheck(); + CHECK_NULL_VOID(pipeline); + auto theme = pipeline->GetTheme(); + CHECK_NULL_VOID(theme); + auto tabsNode = AceType::DynamicCast(host); + CHECK_NULL_VOID(tabsNode); + auto tabsLayoutProperty = tabsNode->GetLayoutProperty(); + CHECK_NULL_VOID(tabsLayoutProperty); + auto currentDivider = tabsLayoutProperty->GetDivider().value_or(TabsItemDivider()); + if (currentDivider.isColorTheme) { + currentDivider.color = theme->GetDividerColor(); + ACE_UPDATE_NODE_LAYOUT_PROPERTY(TabsLayoutProperty, Divider, currentDivider, tabsNode); + } +} + void TabsPattern::OnAfterModifyDone() { auto host = GetHost(); diff --git a/frameworks/core/components_ng/pattern/tabs/tabs_pattern.h b/frameworks/core/components_ng/pattern/tabs/tabs_pattern.h index 3dcddcf58e122c9a2dcece78fc56ca5d9af3a579..2a3cce44621b32b5cbae8771708886498f72238a 100644 --- a/frameworks/core/components_ng/pattern/tabs/tabs_pattern.h +++ b/frameworks/core/components_ng/pattern/tabs/tabs_pattern.h @@ -167,6 +167,7 @@ public: } void OnColorModeChange(uint32_t colorMode) override; + void OnColorConfigurationUpdate() override; private: void OnAttachToFrameNode() override; diff --git a/frameworks/core/interfaces/arkoala/arkoala_api.h b/frameworks/core/interfaces/arkoala/arkoala_api.h index 91f02bb9b11e76e6e33f32293914d1142fb17879..4b934622fcbed68326ff2a495dbe5f5a67e41f3b 100644 --- a/frameworks/core/interfaces/arkoala/arkoala_api.h +++ b/frameworks/core/interfaces/arkoala/arkoala_api.h @@ -3660,6 +3660,7 @@ struct ArkUITabsModifier { void* columnGutterRawPtr, void* columnMarginRawPtr); void (*createDividerWithResourceObj)(ArkUINodeHandle node, void* strokeWidthRawPtr, void* colorRawPtr, void* startMarginRawPtr, void* endMarginRawPtr); + void (*createDividerColorWithResourceObj)(ArkUINodeHandle node, bool isTheme); void (*createBarBackgroundColorWithResourceObj)(ArkUINodeHandle node, void* bgColorRawPtr); void (*createBarBackgroundBlurStyleWithResourceObj)(ArkUINodeHandle node, void* inactiveColorRawPtr); void (*createTabBarWidthWithResourceObj)(ArkUINodeHandle node, void* widthRawPtr); diff --git a/frameworks/core/interfaces/native/node/tab_content_modifier.cpp b/frameworks/core/interfaces/native/node/tab_content_modifier.cpp index 9402f3d924e4f1fb4402fbe5191d2365f46e949d..bf78c734e039f6076aba03116ab3683e966d4e02 100644 --- a/frameworks/core/interfaces/native/node/tab_content_modifier.cpp +++ b/frameworks/core/interfaces/native/node/tab_content_modifier.cpp @@ -43,6 +43,9 @@ void SetTabContentLabel(ArkUINodeHandle node, ArkUI_CharPtr label) auto* frameNode = reinterpret_cast(node); CHECK_NULL_VOID(frameNode); TabContentModelNG::SetTabBarLabel(frameNode, label); + + CHECK_NULL_VOID(SystemProperties::ConfigChangePerform()); + TabContentModelNG::CreateTextContentWithResourceObj(frameNode, nullptr); } void SetTabContentOnWillShow(ArkUINodeHandle node, void* callback) diff --git a/frameworks/core/interfaces/native/node/tabs_modifier.cpp b/frameworks/core/interfaces/native/node/tabs_modifier.cpp index 08da88137983df34658c3a2611f54d450312ccc3..631c854953af8514d0a02140af23099a9b44ad9d 100644 --- a/frameworks/core/interfaces/native/node/tabs_modifier.cpp +++ b/frameworks/core/interfaces/native/node/tabs_modifier.cpp @@ -138,6 +138,14 @@ void CreateDividerWithResourceObj(ArkUINodeHandle node, TabsModelNG::HandleDividerEndMargin(frameNode, endMarginResObj, true); } +void CreateDividerColorWithResourceObj(ArkUINodeHandle node, bool isTheme) +{ + CHECK_NULL_VOID(SystemProperties::ConfigChangePerform()); + auto* frameNode = reinterpret_cast(node); + CHECK_NULL_VOID(frameNode); + TabsModelNG::HandleDividerColorTheme(frameNode, isTheme); +} + void SetFadingEdge(ArkUINodeHandle node, ArkUI_Bool fadingEdge) { auto* frameNode = reinterpret_cast(node); @@ -876,6 +884,7 @@ const ArkUITabsModifier* GetTabsModifier() .createScrollableBarModeOptionsWithResourceObj = CreateScrollableBarModeOptionsWithResourceObj, .createBarGridAlignWithResourceObj = CreateBarGridAlignWithResourceObj, .createDividerWithResourceObj = CreateDividerWithResourceObj, + .createDividerColorWithResourceObj = CreateDividerColorWithResourceObj, .createBarBackgroundColorWithResourceObj = CreateBarBackgroundColorWithResourceObj, .createBarBackgroundBlurStyleWithResourceObj = CreateBarBackgroundBlurStyleWithResourceObj, .createTabBarWidthWithResourceObj = CreateTabBarWidthWithResourceObj, diff --git a/interfaces/inner_api/ace_kit/include/ui/properties/ng/measure_property.h b/interfaces/inner_api/ace_kit/include/ui/properties/ng/measure_property.h index 67d3a768746a264579b9c4cc03ceb8851590beaa..7bc3300f22913103c61375bfcf059c5d6db2ef1f 100644 --- a/interfaces/inner_api/ace_kit/include/ui/properties/ng/measure_property.h +++ b/interfaces/inner_api/ace_kit/include/ui/properties/ng/measure_property.h @@ -33,6 +33,11 @@ struct PaddingPropertyT { std::optional start; std::optional end; + bool isLeftTheme = false; + bool isRightTheme = false; + bool isTopTheme = false; + bool isBottomTheme = false; + void SetEdges(const T& padding) { left = padding; diff --git a/test/unittest/core/pattern/tabs/tabs_test_ng.cpp b/test/unittest/core/pattern/tabs/tabs_test_ng.cpp index b5347e98bc1799180755e0a4a9e9e794e2cf228a..29fb2804ac15c7a567c7f54487f03532649da87e 100644 --- a/test/unittest/core/pattern/tabs/tabs_test_ng.cpp +++ b/test/unittest/core/pattern/tabs/tabs_test_ng.cpp @@ -893,25 +893,34 @@ HWTEST_F(TabsTestNg, TabContentCreatePaddingWithResourceObj001, TestSize.Level1) EXPECT_TRUE(TabContentModelNG::CreatePaddingRightWithResourceObj(frameNode, nullptr)); EXPECT_TRUE(TabContentModelNG::CreatePaddingTopWithResourceObj(frameNode, nullptr)); EXPECT_TRUE(TabContentModelNG::CreatePaddingBottomWithResourceObj(frameNode, nullptr)); - - RefPtr resObjLeft; - RefPtr resObjRight; - RefPtr resObjTop; - RefPtr resObjBottom; - - EXPECT_TRUE(TabContentModelNG::CreatePaddingLeftWithResourceObj(frameNode, resObjLeft)); - EXPECT_TRUE(TabContentModelNG::CreatePaddingRightWithResourceObj(frameNode, resObjRight)); - EXPECT_TRUE(TabContentModelNG::CreatePaddingTopWithResourceObj(frameNode, resObjTop)); - EXPECT_TRUE(TabContentModelNG::CreatePaddingBottomWithResourceObj(frameNode, resObjBottom)); - - resObjLeft = AceType::MakeRefPtr("", "", Container::CurrentIdSafely()); - resObjRight = AceType::MakeRefPtr("", "", Container::CurrentIdSafely()); - resObjTop = AceType::MakeRefPtr("", "", Container::CurrentIdSafely()); - resObjBottom = AceType::MakeRefPtr("", "", Container::CurrentIdSafely()); + EXPECT_TRUE(TabContentModelNG::CreatePaddingWithResourceObj(frameNode, nullptr)); + EXPECT_TRUE(TabContentModelNG::CreateTextContentWithResourceObj(frameNode, nullptr)); + EXPECT_TRUE(TabContentModelNG::CreateIconWithResourceObj(frameNode, nullptr)); + EXPECT_TRUE(TabContentModelNG::CreateBoardStyleBorderRadiusWithResourceObj(frameNode, nullptr)); + EXPECT_TRUE(TabContentModelNG::CreateIndicatorColorWithResourceObj(frameNode, nullptr)); + EXPECT_TRUE(TabContentModelNG::CreateIndicatorHeightWithResourceObj(frameNode, nullptr)); + EXPECT_TRUE(TabContentModelNG::CreateIndicatorWidthWithResourceObj(frameNode, nullptr)); + EXPECT_TRUE(TabContentModelNG::CreateIndicatorBorderRadiusWithResourceObj(frameNode, nullptr)); + EXPECT_TRUE(TabContentModelNG::CreateIndicatorMarginTopWithResourceObj(frameNode, nullptr)); + + RefPtr resObj = AceType::MakeRefPtr("", "", Container::CurrentIdSafely()); + RefPtr resObjLeft = AceType::MakeRefPtr("", "", Container::CurrentIdSafely()); + RefPtr resObjRight = AceType::MakeRefPtr("", "", Container::CurrentIdSafely()); + RefPtr resObjTop = AceType::MakeRefPtr("", "", Container::CurrentIdSafely()); + RefPtr resObjBottom = AceType::MakeRefPtr("", "", Container::CurrentIdSafely()); EXPECT_TRUE(TabContentModelNG::CreatePaddingLeftWithResourceObj(frameNode, resObjLeft)); EXPECT_TRUE(TabContentModelNG::CreatePaddingRightWithResourceObj(frameNode, resObjRight)); EXPECT_TRUE(TabContentModelNG::CreatePaddingTopWithResourceObj(frameNode, resObjTop)); EXPECT_TRUE(TabContentModelNG::CreatePaddingBottomWithResourceObj(frameNode, resObjBottom)); + EXPECT_TRUE(TabContentModelNG::CreatePaddingWithResourceObj(frameNode, resObj)); + EXPECT_TRUE(TabContentModelNG::CreateTextContentWithResourceObj(frameNode, resObj)); + EXPECT_TRUE(TabContentModelNG::CreateIconWithResourceObj(frameNode, resObj)); + EXPECT_TRUE(TabContentModelNG::CreateBoardStyleBorderRadiusWithResourceObj(frameNode, resObj)); + EXPECT_TRUE(TabContentModelNG::CreateIndicatorColorWithResourceObj(frameNode, resObj)); + EXPECT_TRUE(TabContentModelNG::CreateIndicatorHeightWithResourceObj(frameNode, resObj)); + EXPECT_TRUE(TabContentModelNG::CreateIndicatorWidthWithResourceObj(frameNode, resObj)); + EXPECT_TRUE(TabContentModelNG::CreateIndicatorBorderRadiusWithResourceObj(frameNode, resObj)); + EXPECT_TRUE(TabContentModelNG::CreateIndicatorMarginTopWithResourceObj(frameNode, resObj)); } } // namespace OHOS::Ace::NG