diff --git a/frameworks/bridge/declarative_frontend/jsview/js_navigation.cpp b/frameworks/bridge/declarative_frontend/jsview/js_navigation.cpp index 0a332c4f1b6bfd255c4c22956da44208a0a56b27..6823926731823c1154043b312b0533dc57b6e3f5 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_navigation.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/js_navigation.cpp @@ -133,9 +133,16 @@ void JSNavigation::ParseBarItems( toolBarItem.text = itemValueObject->ToString(); } - auto itemIconObject = itemObject->GetProperty("icon"); - if (itemIconObject->IsString()) { - toolBarItem.icon = itemIconObject->ToString(); + auto itemSymbolIconObject = itemObject->GetProperty("symbolIcon"); + if (!itemSymbolIconObject->IsUndefined()) { + std::function)> iconSymbol; + SetSymbolOptionApply(info, iconSymbol, itemSymbolIconObject); + toolBarItem.iconSymbol = iconSymbol; + } else { + auto itemIconObject = itemObject->GetProperty("icon"); + if (itemIconObject->IsString()) { + toolBarItem.icon = itemIconObject->ToString(); + } } auto itemEnabledObject = itemObject->GetProperty("isEnabled"); @@ -161,6 +168,36 @@ void JSNavigation::ParseBarItems( } } +void JSNavigation::ParseSymbolAndIcon(const JSCallbackInfo& info, NG::BarItem& toolBarItem, + const JSRef& itemObject) +{ + std::string icon; + std::string activeIcon; + auto itemSymbolIconObject = itemObject->GetProperty("symbolIcon"); + if (!itemSymbolIconObject->IsUndefined()) { + std::function)> iconSymbol; + SetSymbolOptionApply(info, iconSymbol, itemSymbolIconObject); + toolBarItem.iconSymbol = iconSymbol; + } else { + auto itemIconObject = itemObject->GetProperty("icon"); + if (ParseJsMedia(itemIconObject, icon)) { + toolBarItem.icon = icon; + } + } + + auto itemActiveSymbolIconObject = itemObject->GetProperty("activeSymbolIcon"); + if (!itemActiveSymbolIconObject->IsUndefined()) { + std::function)> activeSymbol; + SetSymbolOptionApply(info, activeSymbol, itemActiveSymbolIconObject); + toolBarItem.activeIconSymbol = activeSymbol; + } else { + auto itemActiveIconObject = itemObject->GetProperty("activeIcon"); + if (ParseJsMedia(itemActiveIconObject, activeIcon)) { + toolBarItem.activeIcon = activeIcon; + } + } +} + void JSNavigation::ParseToolbarItemsConfiguration( const JSCallbackInfo& info, const JSRef& jsArray, std::vector& items) { @@ -172,8 +209,6 @@ void JSNavigation::ParseToolbarItemsConfiguration( } NG::BarItem toolBarItem; std::string text; - std::string icon; - std::string activeIcon; auto itemObject = JSRef::Cast(item); auto itemValueObject = itemObject->GetProperty("value"); @@ -181,11 +216,6 @@ void JSNavigation::ParseToolbarItemsConfiguration( toolBarItem.text = text; } - auto itemIconObject = itemObject->GetProperty("icon"); - if (ParseJsMedia(itemIconObject, icon)) { - toolBarItem.icon = icon; - } - auto itemActionValue = itemObject->GetProperty("action"); if (itemActionValue->IsFunction()) { RefPtr onClickFunc = AceType::MakeRefPtr(JSRef::Cast(itemActionValue)); @@ -205,12 +235,7 @@ void JSNavigation::ParseToolbarItemsConfiguration( if (itemStatusValue->IsNumber()) { toolBarItem.status = static_cast(itemStatusValue->ToNumber()); } - - auto itemActiveIconObject = itemObject->GetProperty("activeIcon"); - if (ParseJsMedia(itemActiveIconObject, activeIcon)) { - toolBarItem.activeIcon = activeIcon; - } - + ParseSymbolAndIcon(info, toolBarItem, itemObject); items.push_back(toolBarItem); } } @@ -405,10 +430,19 @@ void JSNavigation::SetBackButtonIcon(const JSCallbackInfo& info) pixMap = CreatePixelMapFromNapiValue(info[0]); } #endif + std::vector nameList; std::string bundleName; std::string moduleName; GetJsMediaBundleInfo(info[0], bundleName, moduleName); - NavigationModel::GetInstance()->SetBackButtonIcon(src, noPixMap, pixMap, bundleName, moduleName); + nameList.emplace_back(bundleName); + nameList.emplace_back(moduleName); + + std::function)> iconSymbol; + if (src.empty() && pixMap == nullptr) { + SetSymbolOptionApply(info, iconSymbol, info[0]); + } + + NavigationModel::GetInstance()->SetBackButtonIcon(iconSymbol, src, noPixMap, pixMap, nameList); } void JSNavigation::SetHideBackButton(bool hide) diff --git a/frameworks/bridge/declarative_frontend/jsview/js_navigation.h b/frameworks/bridge/declarative_frontend/jsview/js_navigation.h index 779c8f61f5324405e75cd5681bb37eb1fffc9df9..e7f7beeedaebb3d02eb628cf7b1a84435df395df 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_navigation.h +++ b/frameworks/bridge/declarative_frontend/jsview/js_navigation.h @@ -55,6 +55,8 @@ public: static bool ParseCommonTitle(const JSRef& jsObj); static void ParseToolbarItemsConfiguration( const JSCallbackInfo& info, const JSRef& jsArray, std::vector& items); + static void ParseSymbolAndIcon(const JSCallbackInfo& info, NG::BarItem& toolBarItem, + const JSRef& itemObject); static void SetCustomNavContentTransition(const JSCallbackInfo& info); }; 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 dbce30a2b3ca5a5cf5f791249cad281d934cc6b7..749b9bcb227faa21579d9ad52c8f2452abaa207e 100644 --- a/frameworks/bridge/declarative_frontend/jsview/models/navigation_model_impl.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/models/navigation_model_impl.cpp @@ -97,8 +97,9 @@ void NavigationModelImpl::SetHideNavBar(bool hideNavBar) return; } -void NavigationModelImpl::SetBackButtonIcon(const std::string& src, bool noPixMap, RefPtr& pixMap, - const std::string& bundleName, const std::string& moduleName) +void NavigationModelImpl::SetBackButtonIcon(const std::function)>& symbolApply, + const std::string& src, bool noPixMap, RefPtr& pixMap, + const std::vector& nameList) { 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 9b6507af7aab972e3f83e8538bc594b4f9397b9f..a5fd7e0c343c67ef44ef763e3bd4347328c70cb9 100644 --- a/frameworks/bridge/declarative_frontend/jsview/models/navigation_model_impl.h +++ b/frameworks/bridge/declarative_frontend/jsview/models/navigation_model_impl.h @@ -32,8 +32,9 @@ public: void SetSubtitle(const std::string& subtitle) override; void SetHideTitleBar(bool hideTitleBar) override; void SetHideNavBar(bool hideNavBar) override; - void SetBackButtonIcon(const std::string& src, bool noPixMap, RefPtr& pixMap, - const std::string& bundleName, const std::string& moduleName) override; + void SetBackButtonIcon(const std::function)>& symbolApply, + const std::string& src, bool noPixMap, RefPtr& pixMap, + const std::vector& nameList) override; void SetHideBackButton(bool hideBackButton) override; void SetHideToolBar(bool hideToolBar) override; void SetCustomToolBar(const RefPtr& customToolBar) override; diff --git a/frameworks/core/components/navigation_bar/navigation_bar_theme.h b/frameworks/core/components/navigation_bar/navigation_bar_theme.h index 47a81c859651b78bb2698b1a0b43356df12a8b44..23d35fae859c3a47d83f2f5fb2f475f31e61579f 100644 --- a/frameworks/core/components/navigation_bar/navigation_bar_theme.h +++ b/frameworks/core/components/navigation_bar/navigation_bar_theme.h @@ -44,6 +44,8 @@ public: theme->backBtnResourceId_ = InternalResource::ResourceId::TITLEBAR_BACK; theme->backResourceId_ = themeConstants->GetResourceId(THEME_NAVIGATION_BAR_RESOURCE_ID_BACK); theme->moreResourceId_ = themeConstants->GetResourceId(THEME_NAVIGATION_BAR_RESOURCE_ID_MORE); + theme->backSymbolId_ = themeConstants->GetSymbolByName("arrow_left"); + theme->moreSymbolId_ = themeConstants->GetSymbolByName("dot_grid_2x2"); RefPtr pattern = themeConstants->GetPatternByName(THEME_PATTERN_NAVIGATION_BAR); if (pattern) { @@ -200,6 +202,14 @@ public: { return backBtnResourceId_; } + uint32_t GetBackSymbolId() const + { + return backSymbolId_; + } + uint32_t GetMoreSymbolId() const + { + return moreSymbolId_; + } InternalResource::ResourceId GetBackResourceId() const { return backResourceId_; @@ -534,6 +544,8 @@ private: InternalResource::ResourceId backBtnResourceId_ = InternalResource::ResourceId::NO_ID; InternalResource::ResourceId backResourceId_ = InternalResource::ResourceId::NO_ID; InternalResource::ResourceId moreResourceId_ = InternalResource::ResourceId::NO_ID; + uint32_t backSymbolId_; + uint32_t moreSymbolId_; Dimension menuZoneSize_; Dimension menuIconSize_; Dimension logoIconSize_; diff --git a/frameworks/core/components_ng/base/view_abstract.h b/frameworks/core/components_ng/base/view_abstract.h index d64241401377fa90d5d494e28dfda2c0beebdb16..7523f146f6a72edfe458663d337051604bd10aee 100644 --- a/frameworks/core/components_ng/base/view_abstract.h +++ b/frameworks/core/components_ng/base/view_abstract.h @@ -65,6 +65,14 @@ struct OptionParam { OptionParam(const std::string &valueParam, const std::function &actionParam) : value(valueParam), icon(""), enabled(true), action(actionParam) {} + OptionParam(const std::string& valueParam, const std::string& iconParam, + const std::function& actionParam, const std::function)> symbol) + : value(valueParam), icon(iconParam), enabled(true), action(actionParam), symbol(symbol) + {} + OptionParam(const std::string& valueParam, const std::string& iconParam, bool enabledParam, + const std::function& actionParam, const std::function)> symbol) + : value(valueParam), icon(iconParam), enabled(enabledParam), action(actionParam), symbol(symbol) + {} ~OptionParam() = default; }; diff --git a/frameworks/core/components_ng/pattern/navigation/bar_item_pattern.cpp b/frameworks/core/components_ng/pattern/navigation/bar_item_pattern.cpp index d6ca0a67475a1602e4baec62d41fc60a21e1747b..277e2fbb54d4787f8dc1b741f3489948bcaa3098 100644 --- a/frameworks/core/components_ng/pattern/navigation/bar_item_pattern.cpp +++ b/frameworks/core/components_ng/pattern/navigation/bar_item_pattern.cpp @@ -14,6 +14,8 @@ */ #include "core/components_ng/pattern/navigation/bar_item_pattern.h" +#include "core/components_ng/pattern/image/image_pattern.h" +#include "core/components_ng/pattern/text/text_pattern.h" #include "core/components_ng/pattern/image/image_layout_property.h" namespace OHOS::Ace::NG { @@ -41,39 +43,139 @@ void BarItemPattern::OnModifyDone() gesture->AddClickEvent(clickListener_); } +void UpdateSymbolBarButton(const RefPtr& barItemNode, const RefPtr& iconNode, + const Color& iconColor, std::function)>& symbol, ImageSourceInfo& info) +{ + auto theme = NavigationGetTheme(); + CHECK_NULL_VOID(theme); + auto iconSize = theme->GetToolbarIconSize(); + if (symbol != nullptr) { + // symbol -> symbol + symbol(AccessibilityManager::WeakClaim(AccessibilityManager::RawPtr(iconNode))); + auto symbolProperty = iconNode->GetLayoutProperty(); + CHECK_NULL_VOID(symbolProperty); + symbolProperty->UpdateSymbolColorList({iconColor}); + iconNode->MarkModifyDone(); + iconNode->MarkDirtyNode(); + } else { + // symbol -> image + barItemNode->RemoveChild(iconNode); + auto iconNodeNew = FrameNode::CreateFrameNode(V2::IMAGE_ETS_TAG, + ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr()); + auto imageLayoutProperty = iconNodeNew->GetLayoutProperty(); + CHECK_NULL_VOID(imageLayoutProperty); + imageLayoutProperty->UpdateImageSourceInfo(info); + imageLayoutProperty->UpdateUserDefinedIdealSize(CalcSize(CalcLength(iconSize), CalcLength(iconSize))); + iconNodeNew->MarkModifyDone(); + iconNodeNew->MarkDirtyNode(); + barItemNode->SetIconNode(iconNodeNew); + barItemNode->AddChild(iconNodeNew); + } +} + +void UpdateImageBarButton(const RefPtr& barItemNode, const RefPtr& iconNode, + const Color& iconColor, std::function)>& symbol, ImageSourceInfo& info) +{ + auto theme = NavigationGetTheme(); + CHECK_NULL_VOID(theme); + auto iconSize = theme->GetToolbarIconSize(); + if (symbol != nullptr) { + // image -> symbol + barItemNode->RemoveChild(iconNode); + auto iconNodeNew = FrameNode::GetOrCreateFrameNode(V2::SYMBOL_ETS_TAG, + ElementRegister::GetInstance()->MakeUniqueId(), []() { return AceType::MakeRefPtr(); }); + CHECK_NULL_VOID(iconNodeNew); + auto symbolProperty = iconNodeNew->GetLayoutProperty(); + CHECK_NULL_VOID(symbolProperty); + auto symbolEffectOptions = symbolProperty->GetSymbolEffectOptionsValue(SymbolEffectOptions()); + symbolEffectOptions.SetEffectType(SymbolEffectType::BOUNCE); + symbolEffectOptions.SetIsTxtActive(true); + symbolEffectOptions.SetIsTxtActiveSource(0); + symbolProperty->UpdateSymbolEffectOptions(symbolEffectOptions); + symbolProperty->UpdateFontSize(iconSize); + symbolProperty->UpdateSymbolColorList({ iconColor }); + symbol(AccessibilityManager::WeakClaim(AccessibilityManager::RawPtr(iconNodeNew))); + iconNodeNew->MarkModifyDone(); + iconNodeNew->MarkDirtyNode(); + barItemNode->SetIconNode(iconNodeNew); + barItemNode->AddChild(iconNodeNew); + } else { + // image -> image + auto imageLayoutProperty = iconNode->GetLayoutProperty(); + CHECK_NULL_VOID(imageLayoutProperty); + imageLayoutProperty->UpdateImageSourceInfo(info); + iconNode->MarkModifyDone(); + iconNode->MarkDirtyNode(); + } +} + +void UpdateSymbolEffect(const RefPtr& iconNode) +{ + auto symbolProperty = iconNode->GetLayoutProperty(); + CHECK_NULL_VOID(symbolProperty); + auto symbolEffectOptions = symbolProperty->GetSymbolEffectOptionsValue(SymbolEffectOptions()); + symbolEffectOptions.SetEffectType(SymbolEffectType::BOUNCE); + symbolEffectOptions.SetIsTxtActive(true); + symbolEffectOptions.SetIsTxtActiveSource(0); + symbolProperty->UpdateSymbolEffectOptions(symbolEffectOptions); + iconNode->MarkModifyDone(); + iconNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF_AND_PARENT); +} + void BarItemPattern::UpdateBarItemActiveStatusResource() { auto theme = NavigationGetTheme(); CHECK_NULL_VOID(theme); auto barItemNode = AceType::DynamicCast(GetHost()); + CHECK_NULL_VOID(barItemNode); auto status = GetToolbarItemStatus(); auto iconStatus = GetCurrentIconStatus(); auto iconNode = DynamicCast(barItemNode->GetIconNode()); CHECK_NULL_VOID(iconNode); - auto imageLayoutProperty = iconNode->GetLayoutProperty(); - CHECK_NULL_VOID(imageLayoutProperty); + + if (iconNode->GetTag() == V2::SYMBOL_ETS_TAG) { + UpdateSymbolEffect(iconNode); + } + auto textNode = DynamicCast(barItemNode->GetTextNode()); CHECK_NULL_VOID(textNode); auto textLayoutProperty = textNode->GetLayoutProperty(); CHECK_NULL_VOID(textLayoutProperty); - if (status == NavToolbarItemStatus::ACTIVE && iconStatus == ToolbarIconStatus::INITIAL) { - imageLayoutProperty->UpdateImageSourceInfo(GetActiveIconImageSourceInfo()); - iconNode->MarkModifyDone(); - iconNode->MarkDirtyNode(); - textLayoutProperty->UpdateTextColor(theme->GetToolBarItemActiveFontColor()); - textNode->MarkModifyDone(); - textNode->MarkDirtyNode(); - SetCurrentIconStatus(ToolbarIconStatus::ACTIVE); - } else if (status == NavToolbarItemStatus::ACTIVE && iconStatus == ToolbarIconStatus::ACTIVE) { - imageLayoutProperty->UpdateImageSourceInfo(GetInitialIconImageSourceInfo()); - iconNode->MarkModifyDone(); - iconNode->MarkDirtyNode(); - textLayoutProperty->UpdateTextColor(theme->GetToolBarItemFontColor()); + + ImageSourceInfo info; + ToolbarIconStatus barIconStatus; + Color textColor; + Color iconColor; + std::function)> symbol; + if (iconStatus == ToolbarIconStatus::INITIAL) { + info = GetActiveIconImageSourceInfo(); + barIconStatus = ToolbarIconStatus::ACTIVE; + textColor = theme->GetToolBarItemActiveFontColor(); + symbol = GetActiveIconSymbol(); + iconColor = theme->GetToolbarActiveIconColor(); + } + if (iconStatus == ToolbarIconStatus::ACTIVE) { + info = GetInitialIconImageSourceInfo(); + barIconStatus = ToolbarIconStatus::INITIAL; + textColor = theme->GetToolBarItemFontColor(); + symbol = GetInitialIconSymbol(); + iconColor = theme->GetToolbarIconColor(); + } + + if (status == NavToolbarItemStatus::ACTIVE) { + if (iconNode->GetTag() == V2::SYMBOL_ETS_TAG) { + UpdateSymbolBarButton(barItemNode, iconNode, iconColor, symbol, info); + } else { + UpdateImageBarButton(barItemNode, iconNode, iconColor, symbol, info); + } + barItemNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE); + barItemNode->MarkDirtyNode(); + textLayoutProperty->UpdateTextColor(textColor); textNode->MarkModifyDone(); textNode->MarkDirtyNode(); - SetCurrentIconStatus(ToolbarIconStatus::INITIAL); + SetCurrentIconStatus(barIconStatus); } } } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/navigation/bar_item_pattern.h b/frameworks/core/components_ng/pattern/navigation/bar_item_pattern.h index 9f774c08859aa9c346ccdcf03d4726f10b328a65..3326f79c9774f1768ecb1cb0d29e2e48820150ea 100644 --- a/frameworks/core/components_ng/pattern/navigation/bar_item_pattern.h +++ b/frameworks/core/components_ng/pattern/navigation/bar_item_pattern.h @@ -84,6 +84,26 @@ public: return initalInfo_; } + void SetInitialIconSymbol(const std::function)>& symbol) + { + initalSymbol_ = symbol; + } + + const std::function)>& GetInitialIconSymbol() const + { + return initalSymbol_; + } + + void SetActiveIconSymbol(const std::function)>& symbol) + { + activeSymbol_ = symbol; + } + + const std::function)>& GetActiveIconSymbol() const + { + return activeSymbol_; + } + void SetToolbarItemStatus(NavToolbarItemStatus status) { status_ = status; @@ -110,6 +130,8 @@ private: RefPtr clickListener_; ImageSourceInfo info_; ImageSourceInfo initalInfo_; + std::function)> initalSymbol_; + std::function)> activeSymbol_; NavToolbarItemStatus status_ = NavToolbarItemStatus::NORMAL; ToolbarIconStatus iconStatus_ = ToolbarIconStatus::INITIAL; }; diff --git a/frameworks/core/components_ng/pattern/navigation/nav_bar_pattern.cpp b/frameworks/core/components_ng/pattern/navigation/nav_bar_pattern.cpp index a48c067c404a40e60cc6e69258ad2ce4c0fcb7d2..b122b908c282f3316af0a0b74eba3a5e97f99f76 100644 --- a/frameworks/core/components_ng/pattern/navigation/nav_bar_pattern.cpp +++ b/frameworks/core/components_ng/pattern/navigation/nav_bar_pattern.cpp @@ -61,32 +61,26 @@ void BuildMoreItemNodeAction(const RefPtr& buttonNode, const RefPtrGetChildAtIndex(0); - CHECK_NULL_VOID(imageNode); - - auto imageFrameNode = AceType::DynamicCast(imageNode); - CHECK_NULL_VOID(imageFrameNode); - auto imgOffset = imageFrameNode->GetOffsetRelativeToWindow(); - auto imageSize = imageFrameNode->GetGeometryNode()->GetFrameSize(); - auto menuNode = AceType::DynamicCast(menu->GetChildAtIndex(0)); CHECK_NULL_VOID(menuNode); - auto menuLayoutProperty = menuNode->GetLayoutProperty(); - CHECK_NULL_VOID(menuLayoutProperty); - menuLayoutProperty->UpdateTargetSize(imageSize); + auto menuPattern = menuNode->GetPattern(); CHECK_NULL_VOID(menuPattern); // navigation menu show like select. menuPattern->SetIsSelectMenu(true); - bool isRightToLeft = AceApplicationInfo::GetInstance().IsRightToLeft(); - if (isRightToLeft) { - imgOffset.SetX(imgOffset.GetX() + imageSize.Width()); - } else { - imgOffset.SetX(imgOffset.GetX()); - } - imgOffset.SetY(imgOffset.GetY() + imageSize.Height()); - overlayManager->ShowMenu(id, imgOffset, menu); + overlayManager->ShowMenu(id, OffsetF(0.0f, 0.0f), menu); + + auto symbol = AceType::DynamicCast(barItemNode->GetChildren().front()); + auto symbolProperty = symbol->GetLayoutProperty(); + CHECK_NULL_VOID(symbolProperty); + auto symbolEffectOptions = symbolProperty->GetSymbolEffectOptionsValue(SymbolEffectOptions()); + symbolEffectOptions.SetEffectType(SymbolEffectType::BOUNCE); + symbolEffectOptions.SetIsTxtActive(true); + symbolEffectOptions.SetIsTxtActiveSource(0); + symbolProperty->UpdateSymbolEffectOptions(symbolEffectOptions); + symbol->MarkModifyDone(); + symbol->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF_AND_PARENT); auto navBarNode = weakNavBarNode.Upgrade(); CHECK_NULL_VOID(navBarNode); @@ -147,11 +141,9 @@ RefPtr CreateMenuItems(const int32_t menuNodeId, const std::vector mostMenuItemCount - 1)) { params.push_back({ menuItem.text.value_or(""), menuItem.icon.value_or(""), - menuItem.isEnabled.value_or(true), menuItem.action }); + menuItem.isEnabled.value_or(true), menuItem.action, menuItem.iconSymbol.value_or(nullptr) }); } else { auto menuItemNode = NavigationTitleUtil::CreateMenuItemButton(theme); - NavigationTitleUtil::InitTitleBarButtonEvent( - menuItemNode, false, menuItem, menuItem.isEnabled.value_or(true)); int32_t barItemNodeId = ElementRegister::GetInstance()->MakeUniqueId(); auto barItemNode = AceType::MakeRefPtr(V2::BAR_ITEM_ETS_TAG, barItemNodeId); barItemNode->InitializePatternAndContext(); @@ -160,6 +152,9 @@ RefPtr CreateMenuItems(const int32_t menuNodeId, const std::vectorUpdateMeasureType(MeasureType::MATCH_PARENT); + auto iconNode = AceType::DynamicCast(barItemNode->GetChildren().front()); + NavigationTitleUtil::InitTitleBarButtonEvent( + menuItemNode, iconNode, false, menuItem, menuItem.isEnabled.value_or(true)); barItemNode->MountToParent(menuItemNode); barItemNode->MarkModifyDone(); menuItemNode->MarkModifyDone(); @@ -189,7 +184,8 @@ RefPtr CreateMenuItems(const int32_t menuNodeId, const std::vector(barItemNode->GetChildren().front()); + NavigationTitleUtil::InitTitleBarButtonEvent(menuItemNode, iconNode, true); barItemNode->MountToParent(menuItemNode); barItemNode->MarkModifyDone(); diff --git a/frameworks/core/components_ng/pattern/navigation/navigation_declaration.h b/frameworks/core/components_ng/pattern/navigation/navigation_declaration.h index 378b6131b25e174c539e8354843e62d545561e2d..a6649f3948abadab1e93ab500f34b188e33d7f6b 100644 --- a/frameworks/core/components_ng/pattern/navigation/navigation_declaration.h +++ b/frameworks/core/components_ng/pattern/navigation/navigation_declaration.h @@ -121,10 +121,12 @@ enum class NavToolbarItemStatus { struct BarItem { std::optional text; std::optional icon; + std::optional)>> iconSymbol; std::optional isEnabled; std::function action; NavToolbarItemStatus status; std::optional activeIcon; + std::optional)>> activeIconSymbol; std::string ToString() const { std::string result; diff --git a/frameworks/core/components_ng/pattern/navigation/navigation_model.h b/frameworks/core/components_ng/pattern/navigation/navigation_model.h index 5fec295b938fa01891922baa424abc1d11e193ca..fcf3e7ceece3de0a7255e36e62977e3b5296d79c 100644 --- a/frameworks/core/components_ng/pattern/navigation/navigation_model.h +++ b/frameworks/core/components_ng/pattern/navigation/navigation_model.h @@ -54,8 +54,9 @@ public: virtual void SetSubtitle(const std::string& subtitle) = 0; virtual void SetHideTitleBar(bool hideTitleBar) = 0; virtual void SetHideNavBar(bool hideNavBar) = 0; - virtual void SetBackButtonIcon(const std::string& src, bool noPixMap, RefPtr& pixMap, - const std::string& bundleName, const std::string& moduleName) = 0; + virtual void SetBackButtonIcon(const std::function)>& symbolApply, + const std::string& src, bool noPixMap, RefPtr& pixMap, + const std::vector& nameList); virtual void SetHideBackButton(bool hideBackButton) = 0; virtual void SetHideToolBar(bool hideToolBar) = 0; virtual void SetCustomToolBar(const RefPtr& customNode) = 0; 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 b7f23f08235fc3610b90c5846b5e936dffb6ed76..2bdd2a82513dac2ec71e3595501a0fdb4080f4ae 100644 --- a/frameworks/core/components_ng/pattern/navigation/navigation_model_ng.cpp +++ b/frameworks/core/components_ng/pattern/navigation/navigation_model_ng.cpp @@ -274,24 +274,38 @@ RefPtr CreateToolbarItemTextNode(const std::string& text) return textNode; } -RefPtr CreateToolbarItemIconNode(const std::string& src) +RefPtr CreateToolbarItemIconNode(const BarItem& barItem) { - int32_t nodeId = ElementRegister::GetInstance()->MakeUniqueId(); - ImageSourceInfo info(src); - auto iconNode = FrameNode::CreateFrameNode(V2::IMAGE_ETS_TAG, nodeId, AceType::MakeRefPtr()); - auto imageLayoutProperty = iconNode->GetLayoutProperty(); - CHECK_NULL_RETURN(imageLayoutProperty, nullptr); auto theme = NavigationGetTheme(); CHECK_NULL_RETURN(theme, nullptr); + if (barItem.icon.has_value() && !barItem.icon.value().empty()) { + int32_t nodeId = ElementRegister::GetInstance()->MakeUniqueId(); + ImageSourceInfo info(barItem.icon.value()); + auto iconNode = FrameNode::CreateFrameNode(V2::IMAGE_ETS_TAG, nodeId, AceType::MakeRefPtr()); + auto imageLayoutProperty = iconNode->GetLayoutProperty(); + CHECK_NULL_RETURN(imageLayoutProperty, nullptr); - info.SetFillColor(theme->GetToolbarIconColor()); - imageLayoutProperty->UpdateImageSourceInfo(info); + info.SetFillColor(theme->GetToolbarIconColor()); + imageLayoutProperty->UpdateImageSourceInfo(info); - auto iconSize = theme->GetToolbarIconSize(); - imageLayoutProperty->UpdateUserDefinedIdealSize(CalcSize(CalcLength(iconSize), CalcLength(iconSize))); + auto iconSize = theme->GetToolbarIconSize(); + imageLayoutProperty->UpdateUserDefinedIdealSize(CalcSize(CalcLength(iconSize), CalcLength(iconSize))); - iconNode->MarkModifyDone(); - return iconNode; + iconNode->MarkModifyDone(); + return iconNode; + } else { + auto iconNode = FrameNode::GetOrCreateFrameNode(V2::SYMBOL_ETS_TAG, + ElementRegister::GetInstance()->MakeUniqueId(), []() { return AceType::MakeRefPtr(); }); + CHECK_NULL_RETURN(iconNode, nullptr); + auto symbolProperty = iconNode->GetLayoutProperty(); + CHECK_NULL_RETURN(symbolProperty, nullptr); + symbolProperty->UpdateFontSize(theme->GetToolbarIconSize()); + symbolProperty->UpdateSymbolColorList({ theme->GetToolbarIconColor() }); + barItem.iconSymbol.value()(AccessibilityManager::WeakClaim(AccessibilityManager::RawPtr(iconNode))); + + iconNode->MarkModifyDone(); + return iconNode; + } } bool CheckNavigationGroupEnableStatus() @@ -323,6 +337,37 @@ void RegisterToolbarHotZoneEvent(const RefPtr& buttonNode, const RefP gestureEventHub->AddClickEvent(AceType::MakeRefPtr(clickCallback)); } +void UpdateBarItemPattern(const RefPtr& barItemNode, const BarItem& barItem) +{ + auto theme = NavigationGetTheme(); + CHECK_NULL_VOID(theme); + auto barItemPattern = barItemNode->GetPattern(); + if (barItem.status == NG::NavToolbarItemStatus::ACTIVE + && ((barItem.activeIcon.has_value() && !barItem.activeIcon.value().empty()) + || (barItem.activeIconSymbol.has_value() && barItem.activeIconSymbol.value() != nullptr)) + && ((barItem.icon.has_value() && !barItem.icon.value().empty()) + || (barItem.iconSymbol.has_value() && barItem.iconSymbol.value() != nullptr))) { + if (barItem.icon.has_value()) { + ImageSourceInfo initialIconInfo(barItem.icon.value()); + initialIconInfo.SetFillColor(theme->GetToolbarIconColor()); + barItemPattern->SetInitialIconImageSourceInfo(initialIconInfo); + } + if (barItem.activeIcon.has_value()) { + ImageSourceInfo activeIconInfo(barItem.activeIcon.value()); + activeIconInfo.SetFillColor(theme->GetToolbarActiveIconColor()); + barItemPattern->SetActiveIconImageSourceInfo(activeIconInfo); + } + if (barItem.iconSymbol.has_value()) { + barItemPattern->SetInitialIconSymbol(barItem.iconSymbol.value()); + } + if (barItem.activeIconSymbol.has_value()) { + barItemPattern->SetActiveIconSymbol(barItem.activeIconSymbol.value()); + } + barItemPattern->SetToolbarItemStatus(barItem.status); + barItemPattern->SetCurrentIconStatus(NG::ToolbarIconStatus::INITIAL); + } +} + void UpdateToolbarItemNodeWithConfiguration( const RefPtr& barItemNode, const BarItem& barItem, const RefPtr& buttonNode) { @@ -332,8 +377,9 @@ void UpdateToolbarItemNodeWithConfiguration( barItemNode->SetTextNode(textNode); barItemNode->AddChild(textNode); } - if (barItem.icon.has_value() && !barItem.icon.value().empty()) { - auto iconNode = CreateToolbarItemIconNode(barItem.icon.value()); + if ((barItem.icon.has_value() && !barItem.icon.value().empty()) + || (barItem.iconSymbol.has_value() && barItem.iconSymbol.value() != nullptr)) { + auto iconNode = CreateToolbarItemIconNode(barItem); barItemNode->SetIconNode(iconNode); barItemNode->AddChild(iconNode); } @@ -361,18 +407,7 @@ void UpdateToolbarItemNodeWithConfiguration( buttonEventHub->SetEnabled(false); } - auto barItemPattern = barItemNode->GetPattern(); - if (barItem.status == NG::NavToolbarItemStatus::ACTIVE && barItem.activeIcon.has_value() && - !barItem.activeIcon.value().empty() && barItem.icon.has_value() && !barItem.icon.value().empty()) { - ImageSourceInfo initialIconInfo(barItem.icon.value()); - initialIconInfo.SetFillColor(theme->GetToolbarIconColor()); - ImageSourceInfo activeIconInfo(barItem.activeIcon.value()); - activeIconInfo.SetFillColor(theme->GetToolbarActiveIconColor()); - barItemPattern->SetInitialIconImageSourceInfo(initialIconInfo); - barItemPattern->SetActiveIconImageSourceInfo(activeIconInfo); - barItemPattern->SetToolbarItemStatus(barItem.status); - barItemPattern->SetCurrentIconStatus(NG::ToolbarIconStatus::INITIAL); - } + UpdateBarItemPattern(barItemNode, barItem); barItemNode->MarkModifyDone(); } @@ -443,13 +478,8 @@ RefPtr CreateToolbarItemInContainer( void BuildToolbarMoreItemNode(const RefPtr& barItemNode) { - int32_t imageNodeId = ElementRegister::GetInstance()->MakeUniqueId(); - auto imageNode = FrameNode::CreateFrameNode(V2::IMAGE_ETS_TAG, imageNodeId, AceType::MakeRefPtr()); - auto imageLayoutProperty = imageNode->GetLayoutProperty(); - CHECK_NULL_VOID(imageLayoutProperty); auto theme = NavigationGetTheme(); CHECK_NULL_VOID(theme); - auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); auto navigationGroupNode = AceType::DynamicCast(frameNode); CHECK_NULL_VOID(navigationGroupNode); @@ -457,26 +487,30 @@ void BuildToolbarMoreItemNode(const RefPtr& barItemNode) CHECK_NULL_VOID(hub); auto renderContext = barItemNode->GetRenderContext(); CHECK_NULL_VOID(renderContext); - auto info = ImageSourceInfo(""); - info.SetResourceId(theme->GetMoreResourceId()); + if (!hub->IsEnabled()) { renderContext->UpdateOpacity(theme->GetToolbarItemDisabledAlpha()); - } else { - info.SetFillColor(theme->GetToolbarIconColor()); } - imageLayoutProperty->UpdateImageSourceInfo(info); - auto iconSize = theme->GetToolbarIconSize(); - imageLayoutProperty->UpdateUserDefinedIdealSize(CalcSize(CalcLength(iconSize), CalcLength(iconSize))); - imageNode->MarkModifyDone(); auto textNode = CreateToolbarItemTextNode(Localization::GetInstance()->GetEntryLetters("common.more")); CHECK_NULL_VOID(textNode); barItemNode->SetTextNode(textNode); barItemNode->SetBarItemUsedInToolbarConfiguration(true); barItemNode->AddChild(textNode); - barItemNode->SetIconNode(imageNode); - barItemNode->AddChild(imageNode); + + auto symbolNode = FrameNode::GetOrCreateFrameNode(V2::SYMBOL_ETS_TAG, + ElementRegister::GetInstance()->MakeUniqueId(), []() { return AceType::MakeRefPtr(); }); + CHECK_NULL_VOID(symbolNode); + auto symbolProperty = symbolNode->GetLayoutProperty(); + CHECK_NULL_VOID(symbolProperty); + symbolProperty->UpdateSymbolSourceInfo(SymbolSourceInfo(theme->GetMoreSymbolId())); + symbolProperty->UpdateFontSize(theme->GetToolbarIconSize()); + symbolProperty->UpdateSymbolColorList({ theme->GetToolbarIconColor() }); + symbolNode->MarkModifyDone(); + barItemNode->SetIconNode(symbolNode); + barItemNode->AddChild(symbolNode); barItemNode->MarkModifyDone(); + return; } RefPtr CreateToolbarMoreMenuNode(const RefPtr& barItemNode) @@ -927,77 +961,43 @@ void NavigationModelNG::SetTitleMode(NG::NavigationTitleMode mode) gestureEventHub->AddClickEvent(AceType::MakeRefPtr(clickCallback)); auto buttonPattern = backButtonNode->GetPattern(); CHECK_NULL_VOID(buttonPattern); - auto theme = NavigationGetTheme(); buttonPattern->SetSkipColorConfigurationUpdate(); - buttonPattern->setComponentButtonType(ComponentButtonType::NAVIGATION); - if (AceApplicationInfo::GetInstance().GreatOrEqualTargetAPIVersion(PlatformVersion::VERSION_TWELVE)) { - buttonPattern->SetBlendColor(theme->GetBackgroundPressedColor(), theme->GetBackgroundHoverColor()); - buttonPattern->SetFocusBorderColor(theme->GetBackgroundFocusOutlineColor()); - buttonPattern->SetFocusBorderWidth(theme->GetBackgroundFocusOutlineWeight()); - } auto backButtonLayoutProperty = backButtonNode->GetLayoutProperty(); CHECK_NULL_VOID(backButtonLayoutProperty); - auto renderContext = backButtonNode->GetRenderContext(); - CHECK_NULL_VOID(renderContext); - auto backButtonWidth = BACK_BUTTON_SIZE; - auto backButtonHeight = BACK_BUTTON_SIZE; - auto backButtonRadiusSize = BUTTON_RADIUS_SIZE; - auto backButtonPadding = BUTTON_PADDING; - auto backButtonColor = Color::TRANSPARENT; - if (AceApplicationInfo::GetInstance().GreatOrEqualTargetAPIVersion(PlatformVersion::VERSION_TWELVE)) { - backButtonWidth = theme->GetIconBackgroundWidth(); - backButtonHeight = theme->GetIconBackgroundHeight(); - backButtonRadiusSize = theme->GetCornerRadius(); - backButtonPadding = MENU_BUTTON_PADDING; - backButtonColor = theme->GetCompBackgroundColor(); - } backButtonLayoutProperty->UpdateUserDefinedIdealSize( - CalcSize(CalcLength(backButtonWidth), CalcLength(backButtonHeight))); - backButtonLayoutProperty->UpdateBorderRadius(BorderRadiusProperty(backButtonRadiusSize)); - renderContext->UpdateBackgroundColor(backButtonColor); - PaddingProperty padding; - padding.SetEdges(CalcLength(backButtonPadding)); - backButtonLayoutProperty->UpdatePadding(padding); + CalcSize(CalcLength(BACK_BUTTON_SIZE), CalcLength(BACK_BUTTON_SIZE))); backButtonLayoutProperty->UpdateType(ButtonType::NORMAL); + backButtonLayoutProperty->UpdateBorderRadius(BorderRadiusProperty(BUTTON_RADIUS_SIZE)); backButtonLayoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT); + auto renderContext = backButtonNode->GetRenderContext(); + CHECK_NULL_VOID(renderContext); + renderContext->UpdateBackgroundColor(Color::TRANSPARENT); auto eventHub = backButtonNode->GetOrCreateInputEventHub(); CHECK_NULL_VOID(eventHub); - auto backButtonImageNode = FrameNode::CreateFrameNode(V2::BACK_BUTTON_IMAGE_ETS_TAG, - ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr()); - CHECK_NULL_VOID(backButtonImageNode); - - auto backButtonImageLayoutProperty = backButtonImageNode->GetLayoutProperty(); - CHECK_NULL_VOID(backButtonImageLayoutProperty); - - ImageSourceInfo imageSourceInfo; - auto iconColor = theme->GetBackButtonIconColor(); - auto backReourceId = theme->GetBackResourceId(); - if (AceApplicationInfo::GetInstance().GreatOrEqualTargetAPIVersion(PlatformVersion::VERSION_TWELVE)) { - iconColor = theme->GetIconColor(); - backReourceId = theme->GetBackBtnResourceId(); - auto iconWidth = theme->GetIconWidth(); - auto iconHeight = theme->GetIconHeight(); - backButtonImageLayoutProperty->UpdateUserDefinedIdealSize(CalcSize(CalcLength(iconWidth), - CalcLength(iconHeight))); - } - imageSourceInfo.SetResourceId(backReourceId); - auto navigationEventHub = navigationGroupNode->GetEventHub(); - CHECK_NULL_VOID(navigationEventHub); - if (!navigationEventHub->IsEnabled()) { - imageSourceInfo.SetFillColor(iconColor.BlendOpacity(theme->GetAlphaDisabled())); - } else { - imageSourceInfo.SetFillColor(iconColor); - } - backButtonImageLayoutProperty->UpdateImageSourceInfo(imageSourceInfo); - backButtonImageLayoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT); + PaddingProperty padding; + padding.left = CalcLength(BUTTON_PADDING); + padding.right = CalcLength(BUTTON_PADDING); + padding.top = CalcLength(BUTTON_PADDING); + padding.bottom = CalcLength(BUTTON_PADDING); + backButtonLayoutProperty->UpdatePadding(padding); - backButtonImageNode->MountToParent(backButtonNode); - backButtonImageNode->MarkModifyDone(); + auto theme = NavigationGetTheme(); + CHECK_NULL_VOID(theme); + auto symbolNode = FrameNode::GetOrCreateFrameNode(V2::SYMBOL_ETS_TAG, + ElementRegister::GetInstance()->MakeUniqueId(), []() { return AceType::MakeRefPtr(); }); + CHECK_NULL_VOID(symbolNode); + auto symbolProperty = symbolNode->GetLayoutProperty(); + CHECK_NULL_VOID(symbolProperty); + symbolProperty->UpdateSymbolSourceInfo(SymbolSourceInfo(theme->GetBackSymbolId())); + symbolProperty->UpdateFontSize(BACK_BUTTON_ICON_SIZE); + symbolNode->MountToParent(backButtonNode); + symbolNode->MarkModifyDone(); backButtonNode->MarkModifyDone(); titleBarNode->SetBackButton(backButtonNode); titleBarNode->AddChild(backButtonNode, 0); + return; } void NavigationModelNG::SetSubtitle(const std::string& subtitle) @@ -1043,8 +1043,9 @@ void NavigationModelNG::SetHideNavBar(bool hideNavBar) ACE_UPDATE_LAYOUT_PROPERTY(NavigationLayoutProperty, HideNavBar, hideNavBar); } -void NavigationModelNG::SetBackButtonIcon(const std::string& src, bool noPixMap, RefPtr& pixMap, - const std::string& bundleName, const std::string& moduleName) +void NavigationModelNG::SetBackButtonIcon(const std::function)>& symbolApply, + const std::string& src, bool noPixMap, RefPtr& pixMap, + const std::vector& nameList) { auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); auto navigationGroupNode = AceType::DynamicCast(frameNode); @@ -1056,13 +1057,14 @@ void NavigationModelNG::SetBackButtonIcon(const std::string& src, bool noPixMap, CHECK_NULL_VOID(titleBarNode); auto titleBarLayoutProperty = titleBarNode->GetLayoutProperty(); CHECK_NULL_VOID(titleBarLayoutProperty); - ImageSourceInfo imageSourceInfo(src, bundleName, moduleName); + ImageSourceInfo imageSourceInfo(src, nameList[0], nameList[1]); ACE_UPDATE_LAYOUT_PROPERTY(NavigationLayoutProperty, NoPixMap, noPixMap); ACE_UPDATE_LAYOUT_PROPERTY(NavigationLayoutProperty, ImageSource, imageSourceInfo); ACE_UPDATE_LAYOUT_PROPERTY(NavigationLayoutProperty, PixelMap, pixMap); titleBarLayoutProperty->UpdateImageSource(imageSourceInfo); titleBarLayoutProperty->UpdateNoPixMap(noPixMap); titleBarLayoutProperty->UpdatePixelMap(pixMap); + titleBarLayoutProperty->SetBackIconSymbol(symbolApply); titleBarNode->MarkModifyDone(); } @@ -1204,7 +1206,8 @@ void NavigationModelNG::SetToolbarConfiguration(std::vector&& toolB for (const auto& toolBarItem : toolBarItems) { ++count; if (needMoreButton && (count > MAXIMUM_TOOLBAR_ITEMS_IN_BAR - 1)) { - params.push_back({ toolBarItem.text.value_or(""), toolBarItem.icon.value_or(""), toolBarItem.action }); + params.push_back({ toolBarItem.text.value_or(""), toolBarItem.icon.value_or(""), toolBarItem.action, + toolBarItem.iconSymbol.value_or(nullptr) }); } else { auto toolBarItemNode = CreateToolbarItemInContainer(toolBarItem, toolBarItems.size(), count, needMoreButton); 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 09c26c175972bb935867bba4a586a21f7dee1ffa..6ce0a512f213d28e7aa505d7061dfbad107da62b 100644 --- a/frameworks/core/components_ng/pattern/navigation/navigation_model_ng.h +++ b/frameworks/core/components_ng/pattern/navigation/navigation_model_ng.h @@ -39,8 +39,9 @@ public: void SetSubtitle(const std::string& subtitle) override; void SetHideTitleBar(bool hideTitleBar) override; void SetHideNavBar(bool hideNavBar) override; - void SetBackButtonIcon(const std::string& src, bool noPixMap, RefPtr& pixMap, - const std::string& bundleName, const std::string& moduleName) override; + void SetBackButtonIcon(const std::function)>& symbolApply, + const std::string& src, bool noPixMap, RefPtr& pixMap, + const std::vector& nameList) override; void SetHideBackButton(bool hideBackButton) override; void SetHideToolBar(bool hideToolBar) override; void SetCustomToolBar(const RefPtr& customNode) override; diff --git a/frameworks/core/components_ng/pattern/navigation/navigation_title_util.cpp b/frameworks/core/components_ng/pattern/navigation/navigation_title_util.cpp index a428784ae869843b4e04bcaa5b81c153ade965b9..fd0cce0beaaad866afd04ae2feff1c0c86906f55 100644 --- a/frameworks/core/components_ng/pattern/navigation/navigation_title_util.cpp +++ b/frameworks/core/components_ng/pattern/navigation/navigation_title_util.cpp @@ -59,7 +59,7 @@ RefPtr NavigationTitleUtil::CreateMenuItems(const int32_t menuNodeId, ++count; if (needMoreButton && (count > mostMenuItemCount - 1)) { params.push_back({ menuItem.text.value_or(""), menuItem.icon.value_or(""), - menuItem.isEnabled.value_or(true), menuItem.action }); + menuItem.isEnabled.value_or(true), menuItem.action, menuItem.iconSymbol.value_or(nullptr)}); } else { auto menuItemNode = CreateMenuItemNode(theme, menuItem, isButtonEnabled); CHECK_NULL_RETURN(menuItemNode, nullptr); @@ -80,7 +80,8 @@ RefPtr NavigationTitleUtil::CreateMenuItems(const int32_t menuNodeId, std::move(params), menuItemNode->GetId(), menuItemNode->GetTag(), MenuType::NAVIGATION_MENU, menuParam); BuildMoreItemNodeAction(menuItemNode, barItemNode, barMenuNode, titleBarNode); - InitTitleBarButtonEvent(menuItemNode, true); + auto iconNode = AceType::DynamicCast(barItemNode->GetChildren().front()); + InitTitleBarButtonEvent(menuItemNode, iconNode, true); barItemNode->MountToParent(menuItemNode); barItemNode->MarkModifyDone(); menuItemNode->MarkModifyDone(); @@ -159,12 +160,13 @@ RefPtr NavigationTitleUtil::CreateMenuItemNode( { auto menuItemNode = CreateMenuItemButton(theme); CHECK_NULL_RETURN(menuItemNode, nullptr); - InitTitleBarButtonEvent(menuItemNode, false, menuItem, menuItem.isEnabled.value_or(true)); int32_t barItemNodeId = ElementRegister::GetInstance()->MakeUniqueId(); auto barItemNode = AceType::MakeRefPtr(V2::BAR_ITEM_ETS_TAG, barItemNodeId); barItemNode->InitializePatternAndContext(); UpdateBarItemNodeWithItem(barItemNode, menuItem, isButtonEnabled); + auto iconNode = AceType::DynamicCast(barItemNode->GetChildren().front()); + InitTitleBarButtonEvent(menuItemNode, iconNode, false, menuItem, menuItem.isEnabled.value_or(true)); auto barItemLayoutProperty = barItemNode->GetLayoutProperty(); CHECK_NULL_RETURN(barItemLayoutProperty, nullptr); barItemLayoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT); @@ -234,13 +236,8 @@ RefPtr NavigationTitleUtil::CreateBarItemTextNode(const std::string& return textNode; } -RefPtr NavigationTitleUtil::CreateBarItemIconNode(const std::string& src, const bool isButtonEnabled) +RefPtr NavigationTitleUtil::CreateBarItemIconNode(const BarItem& barItem, const bool isButtonEnabled) { - int32_t nodeId = ElementRegister::GetInstance()->MakeUniqueId(); - ImageSourceInfo info(src); - auto iconNode = FrameNode::CreateFrameNode(V2::IMAGE_ETS_TAG, nodeId, AceType::MakeRefPtr()); - auto imageLayoutProperty = iconNode->GetLayoutProperty(); - CHECK_NULL_RETURN(imageLayoutProperty, nullptr); auto theme = NavigationGetTheme(); CHECK_NULL_RETURN(theme, nullptr); @@ -254,20 +251,40 @@ RefPtr NavigationTitleUtil::CreateBarItemIconNode(const std::string& iconWidth = theme->GetIconWidth(); iconHeight = theme->GetIconHeight(); } - if (isButtonEnabled) { - info.SetFillColor(iconColor); + if (barItem.icon.has_value() && !barItem.icon.value().empty()) { + int32_t nodeId = ElementRegister::GetInstance()->MakeUniqueId(); + ImageSourceInfo info(barItem.icon.value()); + auto iconNode = FrameNode::CreateFrameNode(V2::IMAGE_ETS_TAG, nodeId, AceType::MakeRefPtr()); + auto imageLayoutProperty = iconNode->GetLayoutProperty(); + CHECK_NULL_RETURN(imageLayoutProperty, nullptr); + if (isButtonEnabled) { + info.SetFillColor(iconColor); + } else { + info.SetFillColor(iconColor.BlendOpacity(iconOpacity)); + } + imageLayoutProperty->UpdateImageSourceInfo(info); + imageLayoutProperty->UpdateUserDefinedIdealSize(CalcSize(CalcLength(iconWidth), CalcLength(iconHeight))); + iconNode->MarkModifyDone(); + return iconNode; } else { - info.SetFillColor(iconColor.BlendOpacity(iconOpacity)); + auto iconNode = FrameNode::GetOrCreateFrameNode(V2::SYMBOL_ETS_TAG, + ElementRegister::GetInstance()->MakeUniqueId(), []() { return AceType::MakeRefPtr(); }); + CHECK_NULL_RETURN(iconNode, nullptr); + auto symbolProperty = iconNode->GetLayoutProperty(); + symbolProperty->UpdateFontSize(iconWidth); + if (isButtonEnabled) { + symbolProperty->UpdateSymbolColorList({ iconColor }); + } else { + symbolProperty->UpdateSymbolColorList({ iconColor.BlendOpacity(iconOpacity) }); + } + barItem.iconSymbol.value()(AccessibilityManager::WeakClaim(AccessibilityManager::RawPtr(iconNode))); + iconNode->MarkModifyDone(); + return iconNode; } - - imageLayoutProperty->UpdateImageSourceInfo(info); - imageLayoutProperty->UpdateUserDefinedIdealSize(CalcSize(CalcLength(iconWidth), CalcLength(iconHeight))); - iconNode->MarkModifyDone(); - return iconNode; } -void NavigationTitleUtil::InitTitleBarButtonEvent( - const RefPtr& buttonNode, bool isMoreButton, const BarItem menuItem, bool isButtonEnabled) +void NavigationTitleUtil::InitTitleBarButtonEvent(const RefPtr& buttonNode, + const RefPtr& iconNode, bool isMoreButton, const BarItem menuItem, bool isButtonEnabled) { auto eventHub = buttonNode->GetOrCreateInputEventHub(); CHECK_NULL_VOID(eventHub); @@ -286,14 +303,28 @@ void NavigationTitleUtil::InitTitleBarButtonEvent( return; } - if (menuItem.action) { + if (menuItem.action || iconNode->GetTag() == V2::SYMBOL_ETS_TAG) { auto gestureEventHub = buttonNode->GetOrCreateGestureEventHub(); CHECK_NULL_VOID(gestureEventHub); - auto clickCallback = [action = menuItem.action](GestureEvent& info) { + auto clickCallback = [action = menuItem.action, weakNode = WeakPtr(iconNode)](GestureEvent& info) { if (info.GetSourceDevice() == SourceType::KEYBOARD) { return; } - action(); + auto symbol = weakNode.Upgrade(); + if (symbol->GetTag() == V2::SYMBOL_ETS_TAG) { + auto symbolProperty = symbol->GetLayoutProperty(); + CHECK_NULL_VOID(symbolProperty); + auto symbolEffectOptions = symbolProperty->GetSymbolEffectOptionsValue(SymbolEffectOptions()); + symbolEffectOptions.SetEffectType(SymbolEffectType::BOUNCE); + symbolEffectOptions.SetIsTxtActive(true); + symbolEffectOptions.SetIsTxtActiveSource(0); + symbolProperty->UpdateSymbolEffectOptions(symbolEffectOptions); + symbol->MarkModifyDone(); + symbol->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF_AND_PARENT); + } + if (action) { + action(); + } }; gestureEventHub->AddClickEvent(AceType::MakeRefPtr(clickCallback)); } @@ -312,8 +343,9 @@ void NavigationTitleUtil::UpdateBarItemNodeWithItem( barItemNode->SetTextNode(textNode); barItemNode->AddChild(textNode); } - if (barItem.icon.has_value() && !barItem.icon.value().empty()) { - auto iconNode = CreateBarItemIconNode(barItem.icon.value(), isButtonEnabled); + if ((barItem.icon.has_value() && !barItem.icon.value().empty()) + || (barItem.iconSymbol.has_value() && barItem.iconSymbol.value() != nullptr)) { + auto iconNode = CreateBarItemIconNode(barItem, isButtonEnabled); barItemNode->SetIconNode(iconNode); barItemNode->AddChild(iconNode); } @@ -328,30 +360,28 @@ void NavigationTitleUtil::UpdateBarItemNodeWithItem( void NavigationTitleUtil::BuildMoreIemNode(const RefPtr& barItemNode, const bool isButtonEnabled) { - int32_t imageNodeId = ElementRegister::GetInstance()->MakeUniqueId(); - auto imageNode = FrameNode::CreateFrameNode(V2::IMAGE_ETS_TAG, imageNodeId, AceType::MakeRefPtr()); - auto imageLayoutProperty = imageNode->GetLayoutProperty(); - CHECK_NULL_VOID(imageLayoutProperty); auto theme = NavigationGetTheme(); CHECK_NULL_VOID(theme); - - auto info = ImageSourceInfo(""); - info.SetResourceId(theme->GetMoreResourceId()); - if (isButtonEnabled) { - info.SetFillColor(theme->GetMenuIconColor()); - } else { - info.SetFillColor(theme->GetMenuIconColor().BlendOpacity(theme->GetAlphaDisabled())); - } - - imageLayoutProperty->UpdateImageSourceInfo(info); auto iconSize = theme->GetMenuIconSize(); - imageLayoutProperty->UpdateUserDefinedIdealSize(CalcSize(CalcLength(iconSize), CalcLength(iconSize))); - imageNode->MarkModifyDone(); - - barItemNode->SetIsMoreItemNode(true); - barItemNode->SetIconNode(imageNode); - barItemNode->AddChild(imageNode); - barItemNode->MarkModifyDone(); + auto symbolNode = FrameNode::GetOrCreateFrameNode(V2::SYMBOL_ETS_TAG, + ElementRegister::GetInstance()->MakeUniqueId(), []() { return AceType::MakeRefPtr(); }); + CHECK_NULL_VOID(symbolNode); + auto symbolProperty = symbolNode->GetLayoutProperty(); + CHECK_NULL_VOID(symbolProperty); + symbolProperty->UpdateSymbolSourceInfo(SymbolSourceInfo(theme->GetMoreSymbolId())); + symbolProperty->UpdateFontSize(iconSize); + if (isButtonEnabled) { + symbolProperty->UpdateSymbolColorList({ theme->GetMenuIconColor() }); + } else { + symbolProperty->UpdateSymbolColorList({ theme->GetMenuIconColor() + .BlendOpacity(theme->GetAlphaDisabled()) }); + } + symbolNode->MarkModifyDone(); + barItemNode->SetIsMoreItemNode(true); + barItemNode->SetIconNode(symbolNode); + barItemNode->AddChild(symbolNode); + barItemNode->MarkModifyDone(); + return; } RefPtr NavigationTitleUtil::CreateBarItemNode(const bool isButtonEnabled) diff --git a/frameworks/core/components_ng/pattern/navigation/navigation_title_util.h b/frameworks/core/components_ng/pattern/navigation/navigation_title_util.h index 61ea26c6e40ceef4416edc354e7905363c1007e1..f989aa66194f868e1093fcde284201cb4dfcd99c 100644 --- a/frameworks/core/components_ng/pattern/navigation/navigation_title_util.h +++ b/frameworks/core/components_ng/pattern/navigation/navigation_title_util.h @@ -54,9 +54,9 @@ public: static RefPtr CreateMenuItemButton(RefPtr theme); static RefPtr CreateBarItemNode(const bool isButtonEnabled); static RefPtr CreateBarItemTextNode(const std::string& text); - static RefPtr CreateBarItemIconNode(const std::string& src, bool isButtonEnabled); - static void InitTitleBarButtonEvent(const RefPtr& buttonNode, bool isMoreButton, - BarItem menuItem = BarItem(), bool isButtonEnabled = true); + static RefPtr CreateBarItemIconNode(const BarItem& barItem, bool isButtonEnabled); + static void InitTitleBarButtonEvent(const RefPtr& buttonNode, const RefPtr& iconNode, + bool isMoreButton, BarItem menuItem = BarItem(), bool isButtonEnabled = true); static void UpdateBarItemNodeWithItem( const RefPtr& barItemNode, const BarItem& barItem, bool isButtonEnabled); static void BuildMoreIemNode(const RefPtr& barItemNode, bool isButtonEnabled); diff --git a/frameworks/core/components_ng/pattern/navigation/title_bar_layout_property.h b/frameworks/core/components_ng/pattern/navigation/title_bar_layout_property.h index ab0d75a4eeb099fa44e438db2db4bb761d3c5648..f84f5a56ca296ff4a2e72326330e0fe8f77e944c 100644 --- a/frameworks/core/components_ng/pattern/navigation/title_bar_layout_property.h +++ b/frameworks/core/components_ng/pattern/navigation/title_bar_layout_property.h @@ -60,6 +60,16 @@ public: ResetPixelMap(); } + const std::function)>& GetBackIconSymbol() const + { + return backIconSymbol_; + } + + void SetBackIconSymbol(const std::function)>& backIconSymbol) + { + backIconSymbol_ = backIconSymbol; + } + private: ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(TitleMode, NavigationTitleMode, PROPERTY_UPDATE_MEASURE); ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(HideBackButton, bool, PROPERTY_UPDATE_MEASURE); @@ -69,6 +79,7 @@ private: ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(NoPixMap, bool, PROPERTY_UPDATE_MEASURE); ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(ImageSource, ImageSourceInfo, PROPERTY_UPDATE_MEASURE); ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(PixelMap, RefPtr, PROPERTY_UPDATE_MEASURE); + std::function)> backIconSymbol_; }; } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/navigation/title_bar_pattern.cpp b/frameworks/core/components_ng/pattern/navigation/title_bar_pattern.cpp index 7713c7b24072c338d332ae27fa350fb2a0007c7e..52bcb8fb06572a1f2d405ffe976c5f48c860520a 100644 --- a/frameworks/core/components_ng/pattern/navigation/title_bar_pattern.cpp +++ b/frameworks/core/components_ng/pattern/navigation/title_bar_pattern.cpp @@ -24,9 +24,11 @@ #include "core/components_ng/pattern/navigation/nav_bar_node.h" #include "core/components_ng/pattern/navigation/navigation_declaration.h" #include "core/components_ng/pattern/navigation/navigation_title_util.h" +#include "core/components_ng/pattern/navigation/navigation_group_node.h" #include "core/components_ng/pattern/navigation/title_bar_layout_property.h" #include "core/components_ng/pattern/navigation/title_bar_node.h" #include "core/components_ng/pattern/text/text_layout_property.h" +#include "core/components_ng/pattern/text/text_pattern.h" #include "core/components_v2/inspector/inspector_constants.h" namespace OHOS::Ace::NG { @@ -92,31 +94,115 @@ void HandleDefaultIconForNavDestination( backButtonImageNode->MarkModifyDone(); } -void MountBackButton(const RefPtr& hostNode) +void UpdateSymbolBackButton(const RefPtr& backButtonNode, const RefPtr& backButtonIconNode, + const RefPtr& titleBarLayoutProperty) { - auto titleBarLayoutProperty = hostNode->GetLayoutProperty(); - CHECK_NULL_VOID(titleBarLayoutProperty); - auto backButtonNode = AceType::DynamicCast(hostNode->GetBackButton()); - CHECK_NULL_VOID(backButtonNode); - auto backButtonImageNode = AceType::DynamicCast(backButtonNode->GetChildren().front()); - CHECK_NULL_VOID(backButtonImageNode); - auto parentType = titleBarLayoutProperty->GetTitleBarParentTypeValue(TitleBarParentType::NAVBAR); - if (parentType == TitleBarParentType::NAVBAR) { + auto backIconSymbol = titleBarLayoutProperty->GetBackIconSymbol(); + if (backIconSymbol != nullptr) { + // symbol -> symbol + auto symbolProperty = backButtonIconNode->GetLayoutProperty(); + CHECK_NULL_VOID(symbolProperty); + backIconSymbol(AccessibilityManager::WeakClaim(AccessibilityManager::RawPtr(backButtonIconNode))); + symbolProperty->UpdateMeasureType(MeasureType::MATCH_PARENT); + backButtonIconNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF_AND_PARENT); + backButtonIconNode->MarkModifyDone(); + } else { + // symbol -> image + backButtonNode->RemoveChild(backButtonIconNode); + auto backButtonImageNode = FrameNode::CreateFrameNode(V2::BACK_BUTTON_IMAGE_ETS_TAG, + ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr()); + CHECK_NULL_VOID(backButtonImageNode); + + ImageSourceInfo imageSourceInfo = titleBarLayoutProperty->GetImageSourceValue(); auto backButtonImageLayoutProperty = backButtonImageNode->GetLayoutProperty(); CHECK_NULL_VOID(backButtonImageLayoutProperty); + auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); + auto navigationGroupNode = AceType::DynamicCast(frameNode); + CHECK_NULL_VOID(navigationGroupNode); + auto navigationEventHub = navigationGroupNode->GetEventHub(); + CHECK_NULL_VOID(navigationEventHub); + auto theme = NavigationGetTheme(); + CHECK_NULL_VOID(theme); + if (!navigationEventHub->IsEnabled()) { + imageSourceInfo.SetFillColor(theme->GetBackButtonIconColor().BlendOpacity(theme->GetAlphaDisabled())); + } else { + imageSourceInfo.SetFillColor(theme->GetBackButtonIconColor()); + } + backButtonImageLayoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT); + if (titleBarLayoutProperty->HasNoPixMap()) { + bool noPixelMap = titleBarLayoutProperty->GetNoPixMapValue(); + if (noPixelMap && titleBarLayoutProperty->HasImageSource()) { + backButtonImageLayoutProperty->UpdateImageSourceInfo(imageSourceInfo); + } + if (!noPixelMap && titleBarLayoutProperty->HasPixelMap()) { + auto pixelMap = titleBarLayoutProperty->GetPixelMapValue(); + backButtonImageLayoutProperty->UpdateImageSourceInfo(ImageSourceInfo(pixelMap)); + } + } + backButtonImageNode->MountToParent(backButtonNode); + backButtonImageNode->MarkModifyDone(); + } +} + +void UpdateImageBackButton(const RefPtr& backButtonNode, + const RefPtr& backButtonIconNode, const RefPtr& titleBarLayoutProperty) +{ + auto backIconSymbol = titleBarLayoutProperty->GetBackIconSymbol(); + if (backIconSymbol != nullptr) { + // image -> symbol + backButtonNode->RemoveChild(backButtonIconNode); + auto symbolNode = FrameNode::GetOrCreateFrameNode(V2::SYMBOL_ETS_TAG, + ElementRegister::GetInstance()->MakeUniqueId(), + []() { return AceType::MakeRefPtr(); }); + CHECK_NULL_VOID(symbolNode); + auto symbolProperty = symbolNode->GetLayoutProperty(); + CHECK_NULL_VOID(symbolProperty); + symbolProperty->UpdateMeasureType(MeasureType::MATCH_PARENT); + backIconSymbol(AccessibilityManager::WeakClaim(AccessibilityManager::RawPtr(symbolNode))); + symbolNode->MountToParent(backButtonNode); + symbolNode->MarkDirtyNode(); + symbolNode->MarkModifyDone(); + } else { + // image -> image + auto backButtonImageLayoutProperty = backButtonIconNode->GetLayoutProperty(); + CHECK_NULL_VOID(backButtonImageLayoutProperty); if (titleBarLayoutProperty->HasNoPixMap()) { bool noPixelMap = titleBarLayoutProperty->GetNoPixMapValue(); if (noPixelMap && titleBarLayoutProperty->HasImageSource()) { - backButtonImageLayoutProperty->UpdateImageSourceInfo(titleBarLayoutProperty->GetImageSourceValue()); + backButtonImageLayoutProperty->UpdateImageSourceInfo( + titleBarLayoutProperty->GetImageSourceValue()); } if (!noPixelMap && titleBarLayoutProperty->HasPixelMap()) { auto pixelMap = titleBarLayoutProperty->GetPixelMapValue(); backButtonImageLayoutProperty->UpdateImageSourceInfo(ImageSourceInfo(pixelMap)); - backButtonImageNode->MarkModifyDone(); } } + backButtonIconNode->MarkModifyDone(); + } +} +void MountBackButton(const RefPtr& hostNode) +{ + auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); + auto navigationGroupNode = AceType::DynamicCast(frameNode); + CHECK_NULL_VOID(navigationGroupNode); + auto theme = NavigationGetTheme(); + CHECK_NULL_VOID(theme); + auto titleBarLayoutProperty = hostNode->GetLayoutProperty(); + CHECK_NULL_VOID(titleBarLayoutProperty); + auto backButtonNode = AceType::DynamicCast(hostNode->GetBackButton()); + CHECK_NULL_VOID(backButtonNode); + auto backButtonIconNode = AceType::DynamicCast(backButtonNode->GetChildren().front()); + CHECK_NULL_VOID(backButtonIconNode); + + auto parentType = titleBarLayoutProperty->GetTitleBarParentTypeValue(TitleBarParentType::NAVBAR); + if (parentType == TitleBarParentType::NAVBAR) { + if (backButtonIconNode->GetTag() == V2::SYMBOL_ETS_TAG) { + UpdateSymbolBackButton(backButtonNode, backButtonIconNode, titleBarLayoutProperty); + } else { + UpdateImageBackButton(backButtonNode, backButtonIconNode, titleBarLayoutProperty); + } auto navBarNode = AceType::DynamicCast(hostNode->GetParent()); CHECK_NULL_VOID(navBarNode); auto navBarLayoutProperty = navBarNode->GetLayoutProperty(); @@ -126,13 +212,13 @@ void MountBackButton(const RefPtr& hostNode) CHECK_NULL_VOID(backButtonLayoutProperty); backButtonLayoutProperty->UpdateVisibility(hideBackButton ? VisibleType::GONE : VisibleType::VISIBLE); backButtonNode->SetJSViewActive(hideBackButton ? false : true); - backButtonImageNode->MarkModifyDone(); + backButtonNode->MarkModifyDone(); return; } if (!titleBarLayoutProperty->HasNoPixMap()) { if (parentType == TitleBarParentType::NAV_DESTINATION) { - HandleDefaultIconForNavDestination(hostNode, backButtonImageNode); + HandleDefaultIconForNavDestination(hostNode, backButtonIconNode); } backButtonNode->MarkModifyDone(); return; diff --git a/test/unittest/core/pattern/navigation/navigation_pattern_test_ng.cpp b/test/unittest/core/pattern/navigation/navigation_pattern_test_ng.cpp index 8a4539e722c61f451ec6b84f3497357c60746f2c..d741b867d60d968a70e86eceb26dbfdc799a706f 100644 --- a/test/unittest/core/pattern/navigation/navigation_pattern_test_ng.cpp +++ b/test/unittest/core/pattern/navigation/navigation_pattern_test_ng.cpp @@ -1049,7 +1049,7 @@ HWTEST_F(NavigationPatternTestNg, NavigationModelNGTest002, TestSize.Level1) navigationModel.SetTitleHeight(SPLIT_WIDTH); navigationModel.SetSubtitle("navigationModel"); navigationModel.SetHideNavBar(true); - navigationModel.SetBackButtonIcon("navigationModel", true, pixMap, "", ""); + navigationModel.SetBackButtonIcon(nullptr, "navigationModel", true, pixMap, "", ""); navigationModel.SetHideBackButton(true); navigationModel.NeedSetItems(); navigationModel.SetToolBarItems(std::move(toolBarItems));