!37631 Search支持SymbolGlyphModifier

Merge pull request !37631 from tangye/temp_20240521_searchsymbol_feature
This commit is contained in:
openharmony_ci 2024-07-15 04:17:58 +00:00 committed by Gitee
commit c5098abdd7
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
12 changed files with 801 additions and 270 deletions

View File

@ -317,43 +317,125 @@ void JSSearch::SetSearchButton(const JSCallbackInfo& info)
void JSSearch::SetSearchIcon(const JSCallbackInfo& info)
{
if (info[0]->IsUndefined() || info[0]->IsNull()) {
SetSearchDefaultIcon();
return;
}
if (info[0]->IsObject()) {
auto param = JSRef<JSObject>::Cast(info[0]);
auto theme = GetTheme<SearchTheme>();
CHECK_NULL_VOID(theme);
// set icon size
CalcDimension size;
auto sizeProp = param->GetProperty("size");
if (!sizeProp->IsUndefined() && !sizeProp->IsNull() && ParseJsDimensionVpNG(sizeProp, size)) {
if (LessNotEqual(size.Value(), 0.0) || size.Unit() == DimensionUnit::PERCENT) {
size = theme->GetIconHeight();
}
bool isSymbolIcon = param->HasProperty("fontColor"); // only SymbolGlyph has fontColor property
if (isSymbolIcon) {
SetSearchSymbolIcon(info);
} else {
size = theme->GetIconHeight();
}
SearchModel::GetInstance()->SetSearchIconSize(size);
// set icon src
std::string src;
auto srcPathProp = param->GetProperty("src");
if (srcPathProp->IsUndefined() || srcPathProp->IsNull() || !ParseJsMedia(srcPathProp, src)) {
src = "";
}
std::string bundleName;
std::string moduleName;
GetJsMediaBundleInfo(srcPathProp, bundleName, moduleName);
SearchModel::GetInstance()->SetSearchSrcPath(src, bundleName, moduleName);
// set icon color
Color colorVal;
auto colorProp = param->GetProperty("color");
if (!colorProp->IsUndefined() && !colorProp->IsNull() && ParseJsColor(colorProp, colorVal)) {
SearchModel::GetInstance()->SetSearchIconColor(colorVal);
SetSearchImageIcon(info);
}
}
}
void JSSearch::SetCancelDefaultIcon()
{
SearchModel::GetInstance()->SetCancelDefaultIcon();
}
void JSSearch::SetCancelSymbolIcon(const JSCallbackInfo& info)
{
std::function<void(WeakPtr<NG::FrameNode>)> iconSymbol = nullptr;
auto param = JSRef<JSObject>::Cast(info[0]);
auto iconProp = param->GetProperty("icon");
SetSymbolOptionApply(info, iconSymbol, iconProp);
SearchModel::GetInstance()->SetCancelSymbolIcon(iconSymbol);
}
void JSSearch::SetCancelImageIcon(const JSCallbackInfo& info)
{
auto param = JSRef<JSObject>::Cast(info[0]);
auto theme = GetTheme<SearchTheme>();
CHECK_NULL_VOID(theme);
auto iconJsVal = param->GetProperty("icon");
if (!iconJsVal->IsObject()) {
return;
}
auto iconParam = JSRef<JSObject>::Cast(iconJsVal);
// set icon size
CalcDimension iconSize;
auto iconSizeProp = iconParam->GetProperty("size");
if (!iconSizeProp->IsUndefined() && !iconSizeProp->IsNull() && ParseJsDimensionVpNG(iconSizeProp, iconSize)) {
if (LessNotEqual(iconSize.Value(), 0.0) || iconSize.Unit() == DimensionUnit::PERCENT) {
iconSize = theme->GetIconHeight();
}
} else {
iconSize = theme->GetIconHeight();
}
// set icon src
std::string iconSrc;
auto iconSrcProp = iconParam->GetProperty("src");
if (iconSrcProp->IsUndefined() || iconSrcProp->IsNull() || !ParseJsMedia(iconSrcProp, iconSrc)) {
iconSrc = "";
}
// set icon color
Color iconColor = theme->GetSearchIconColor();
auto iconColorProp = iconParam->GetProperty("color");
if (!iconColorProp->IsUndefined() && !iconColorProp->IsNull() && ParseJsColor(iconColorProp, iconColor)) {
NG::IconOptions cancelIconOptions = NG::IconOptions(iconColor, iconSize, iconSrc, "", "");
SearchModel::GetInstance()->SetCancelImageIcon(cancelIconOptions);
} else {
NG::IconOptions cancelIconOptions = NG::IconOptions(iconSize, iconSrc, "", "");
SearchModel::GetInstance()->SetCancelImageIcon(cancelIconOptions);
}
}
void JSSearch::SetSearchDefaultIcon()
{
SearchModel::GetInstance()->SetSearchDefaultIcon();
}
void JSSearch::SetSearchSymbolIcon(const JSCallbackInfo& info)
{
std::function<void(WeakPtr<NG::FrameNode>)> iconSymbol = nullptr;
SetSymbolOptionApply(info, iconSymbol, info[0]);
SearchModel::GetInstance()->SetSearchSymbolIcon(iconSymbol);
}
void JSSearch::SetSearchImageIcon(const JSCallbackInfo& info)
{
auto param = JSRef<JSObject>::Cast(info[0]);
auto theme = GetTheme<SearchTheme>();
CHECK_NULL_VOID(theme);
// set icon size
CalcDimension size;
auto sizeProp = param->GetProperty("size");
if (!sizeProp->IsUndefined() && !sizeProp->IsNull() && ParseJsDimensionVpNG(sizeProp, size)) {
if (LessNotEqual(size.Value(), 0.0) || size.Unit() == DimensionUnit::PERCENT) {
size = theme->GetIconHeight();
}
} else {
size = theme->GetIconHeight();
}
// set icon src
std::string src;
auto srcPathProp = param->GetProperty("src");
if (srcPathProp->IsUndefined() || srcPathProp->IsNull() || !ParseJsMedia(srcPathProp, src)) {
src = "";
}
// set icon color
Color colorVal = theme->GetSearchIconColor();
auto colorProp = param->GetProperty("color");
if (!colorProp->IsUndefined() && !colorProp->IsNull() && ParseJsColor(colorProp, colorVal)) {
ParseJsColor(colorProp, colorVal);
}
std::string bundleName;
std::string moduleName;
GetJsMediaBundleInfo(srcPathProp, bundleName, moduleName);
NG::IconOptions searchIconOptions = NG::IconOptions(colorVal, size, src, bundleName, moduleName);
SearchModel::GetInstance()->SetSearchImageIcon(searchIconOptions);
}
static CancelButtonStyle ConvertStrToCancelButtonStyle(const std::string& value)
{
if (value == "CONSTANT") {
@ -386,13 +468,8 @@ void JSSearch::SetCancelButton(const JSCallbackInfo& info)
SearchModel::GetInstance()->SetCancelButtonStyle(cancelButtonStyle);
auto iconProp = param->GetProperty("icon");
Color iconColor = theme->GetSearchIconColor();
if (iconProp->IsUndefined() || iconProp->IsNull()) {
SearchModel::GetInstance()->SetCancelIconSize(theme->GetIconHeight());
if (!JSSeacrhTheme::ObtainCancelIconColor(iconColor)) {
SearchModel::GetInstance()->SetCancelIconColor(iconColor);
}
SearchModel::GetInstance()->SetRightIconSrcPath("");
SetCancelDefaultIcon();
} else {
SetIconStyle(info);
}
@ -403,39 +480,20 @@ void JSSearch::SetIconStyle(const JSCallbackInfo& info)
if (!info[0]->IsObject()) {
return;
}
auto param = JSRef<JSObject>::Cast(info[0]);
auto iconJsVal = param->GetProperty("icon");
if (!iconJsVal->IsObject()) {
return;
}
auto iconParam = JSRef<JSObject>::Cast(iconJsVal);
// set icon size
CalcDimension iconSize;
auto iconSizeProp = iconParam->GetProperty("size");
auto theme = GetTheme<SearchTheme>();
if (!iconSizeProp->IsUndefined() && !iconSizeProp->IsNull() && ParseJsDimensionVpNG(iconSizeProp, iconSize)) {
if (LessNotEqual(iconSize.Value(), 0.0) || iconSize.Unit() == DimensionUnit::PERCENT) {
iconSize = theme->GetIconHeight();
}
bool isSymbolIcon = iconParam->HasProperty("fontColor"); // only SymbolGlyph has fontColor property
if (isSymbolIcon) {
SetCancelSymbolIcon(info);
} else {
iconSize = theme->GetIconHeight();
SetCancelImageIcon(info);
}
SearchModel::GetInstance()->SetCancelIconSize(iconSize);
// set icon color
Color iconColor;
auto iconColorProp = iconParam->GetProperty("color");
if (!iconColorProp->IsUndefined() && !iconColorProp->IsNull() && ParseJsColor(iconColorProp, iconColor)) {
SearchModel::GetInstance()->SetCancelIconColor(iconColor);
}
// set icon src
std::string iconSrc;
auto iconSrcProp = iconParam->GetProperty("src");
if (iconSrcProp->IsUndefined() || iconSrcProp->IsNull() || !ParseJsMedia(iconSrcProp, iconSrc)) {
iconSrc = "";
}
SearchModel::GetInstance()->SetRightIconSrcPath(iconSrc);
}
void JSSearch::SetTextColor(const JSCallbackInfo& info)

View File

@ -82,6 +82,12 @@ public:
static void SetDragPreviewOptions(const JSCallbackInfo& info);
static void EditMenuOptions(const JSCallbackInfo& info);
static void SetEnablePreviewText(const JSCallbackInfo& info);
static void SetSearchDefaultIcon();
static void SetSearchSymbolIcon(const JSCallbackInfo& info);
static void SetSearchImageIcon(const JSCallbackInfo& info);
static void SetCancelDefaultIcon();
static void SetCancelSymbolIcon(const JSCallbackInfo& info);
static void SetCancelImageIcon(const JSCallbackInfo& info);
};
class JSSearchController final : public Referenced {

View File

@ -37,6 +37,12 @@ public:
void SetSearchSrcPath(
const std::string& src, const std::string& bundleName, const std::string& moduleName) override {}
void SetRightIconSrcPath(const std::string& src) override {}
void SetSearchSymbolIcon(std::function<void(WeakPtr<NG::FrameNode>)> iconSymbol) override{}
void SetSearchDefaultIcon() override{}
void SetSearchImageIcon(NG::IconOptions& iconOptions) override{}
void SetCancelSymbolIcon(std::function<void(WeakPtr<NG::FrameNode>)> iconSymbol) override{}
void SetCancelDefaultIcon() override{}
void SetCancelImageIcon(NG::IconOptions& iconOptions) override{}
void SetCancelButtonStyle(OHOS::Ace::CancelButtonStyle cancelButtonStyle) override {}
void SetCancelIconSize(const Dimension& value) override {}
void SetCancelIconColor(const Color& color) override {}

View File

@ -67,6 +67,26 @@ public:
json->PutExtAttr("searchButton", GetSearchButton().value_or("")->c_str(), filter);
}
const std::function<void(WeakPtr<NG::FrameNode>)>& GetSearchIconSymbol() const
{
return searchIconSymbol_;
}
void SetSearchIconSymbol(const std::function<void(WeakPtr<NG::FrameNode>)>& searchIconSymbol)
{
searchIconSymbol_ = searchIconSymbol;
}
const std::function<void(WeakPtr<NG::FrameNode>)>& GetCancelIconSymbol() const
{
return cancelIconSymbol_;
}
void SetCancelIconSymbol(const std::function<void(WeakPtr<NG::FrameNode>)>& cancelIconSymbol)
{
cancelIconSymbol_ = cancelIconSymbol;
}
ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(SearchButton, std::optional<std::string>, PROPERTY_UPDATE_MEASURE);
ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(CancelButtonStyle, CancelButtonStyle, PROPERTY_UPDATE_MEASURE);
ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(CancelButtonUDSize, Dimension, PROPERTY_UPDATE_MEASURE);
@ -74,6 +94,10 @@ public:
ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(CaretUDWidth, Dimension, PROPERTY_UPDATE_MEASURE);
ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(SearchButtonFontSize, Dimension, PROPERTY_UPDATE_MEASURE);
ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(FontFeature, FONT_FEATURES_LIST, PROPERTY_UPDATE_MEASURE);
private:
std::function<void(WeakPtr<NG::FrameNode>)> searchIconSymbol_;
std::function<void(WeakPtr<NG::FrameNode>)> cancelIconSymbol_;
};
} // namespace OHOS::Ace::NG

View File

@ -19,6 +19,7 @@
#include <mutex>
#include "core/components_ng/pattern/search/search_event_hub.h"
#include "core/components_ng/pattern/search/search_node.h"
#include "core/components_ng/pattern/text_field/text_field_controller.h"
namespace OHOS::Ace {
@ -37,6 +38,12 @@ public:
virtual void SetSearchIconSize(const Dimension& value);
virtual void SetSearchIconColor(const Color& color);
virtual void SetSearchSrcPath(const std::string& src, const std::string& bundleName, const std::string& moduleName);
virtual void SetSearchSymbolIcon(std::function<void(WeakPtr<NG::FrameNode>)> iconSymbol);
virtual void SetSearchDefaultIcon();
virtual void SetSearchImageIcon(NG::IconOptions& iconOptions);
virtual void SetCancelSymbolIcon(std::function<void(WeakPtr<NG::FrameNode>)> iconSymbol);
virtual void SetCancelDefaultIcon();
virtual void SetCancelImageIcon(NG::IconOptions &iconOptions);
virtual void SetRightIconSrcPath(const std::string& src);
virtual void SetCancelButtonStyle(CancelButtonStyle cancelButtonStyle);
virtual void SetCancelIconSize(const Dimension& value);

View File

@ -44,6 +44,7 @@ const std::string INSPECTOR_PREFIX = "__SearchField__";
const std::vector<std::string> SPECICALIZED_INSPECTOR_INDEXS = { "", "Image__", "CancelImage__", "CancelButton__",
"Button__" };
const std::string DROP_TYPE_STYLED_STRING = "ApplicationDefinedType";
constexpr Dimension ICON_HEIGHT = 16.0_vp;
void UpdateInnerInspector(FrameNode* frameNode, const std::string& key)
{
@ -195,6 +196,33 @@ void SearchModelNG::SetSearchSrcPath(
pattern->SetSearchSrcPath(src, bundleName, moduleName);
}
void SearchModelNG::SetSearchDefaultIcon()
{
auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SearchPattern>();
CHECK_NULL_VOID(pattern);
pattern->InitSearchIconColorSize();
pattern->CreateSearchIcon("");
}
void SearchModelNG::SetSearchImageIcon(IconOptions &iconOptions)
{
auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SearchPattern>();
CHECK_NULL_VOID(pattern);
pattern->SetSearchImageIcon(iconOptions);
ACE_UPDATE_LAYOUT_PROPERTY(SearchLayoutProperty, SearchIconUDSize, iconOptions.GetSize().value());
}
void SearchModelNG::SetSearchSymbolIcon(std::function<void(WeakPtr<NG::FrameNode>)> iconSymbol)
{
auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
auto layoutProperty = frameNode->GetLayoutProperty<SearchLayoutProperty>();
CHECK_NULL_VOID(layoutProperty);
layoutProperty->SetSearchIconSymbol(iconSymbol);
auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SearchPattern>();
CHECK_NULL_VOID(pattern);
pattern->SetSearchSymbolIcon();
}
void SearchModelNG::SetRightIconSrcPath(const std::string& src)
{
auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SearchPattern>();
@ -225,6 +253,33 @@ void SearchModelNG::SetCancelIconColor(const Color& color)
pattern->SetCancelIconColor(color);
}
void SearchModelNG::SetCancelDefaultIcon()
{
auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SearchPattern>();
CHECK_NULL_VOID(pattern);
pattern->InitCancelIconColorSize();
pattern->CreateCancelIcon();
}
void SearchModelNG::SetCancelImageIcon(IconOptions &iconOptions)
{
auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SearchPattern>();
CHECK_NULL_VOID(pattern);
pattern->SetCancelImageIcon(iconOptions);
ACE_UPDATE_LAYOUT_PROPERTY(SearchLayoutProperty, CancelButtonUDSize, iconOptions.GetSize().value());
}
void SearchModelNG::SetCancelSymbolIcon(std::function<void(WeakPtr<NG::FrameNode>)> iconSymbol)
{
auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
auto layoutProperty = frameNode->GetLayoutProperty<SearchLayoutProperty>();
CHECK_NULL_VOID(layoutProperty);
layoutProperty->SetCancelIconSymbol(iconSymbol);
auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SearchPattern>();
CHECK_NULL_VOID(pattern);
pattern->SetCancelSymbolIcon();
}
void SearchModelNG::SetSearchButtonFontSize(const Dimension& value)
{
auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
@ -1016,6 +1071,16 @@ void SearchModelNG::SetSearchIconColor(FrameNode* frameNode, const Color& color)
pattern->SetSearchIconColor(color);
}
void SearchModelNG::SetSearchImageIcon(FrameNode *frameNode, IconOptions &iconOptions)
{
CHECK_NULL_VOID(frameNode);
auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SearchPattern>(frameNode);
CHECK_NULL_VOID(pattern);
pattern->SetSearchImageIcon(iconOptions);
ACE_UPDATE_NODE_LAYOUT_PROPERTY(
SearchLayoutProperty, SearchIconUDSize, iconOptions.GetSize().value_or(ICON_HEIGHT), frameNode);
}
void SearchModelNG::SetSearchButton(FrameNode* frameNode, const std::string& text)
{
CHECK_NULL_VOID(frameNode);
@ -1207,6 +1272,17 @@ void SearchModelNG::SetRightIconSrcPath(FrameNode* frameNode, const std::string&
pattern->SetRightIconSrcPath(src);
}
void SearchModelNG::SetCancelImageIcon(FrameNode *frameNode, IconOptions &iconOptions)
{
CHECK_NULL_VOID(frameNode);
auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SearchPattern>(frameNode);
CHECK_NULL_VOID(pattern);
pattern->SetCancelImageIcon(iconOptions);
auto pipeline = PipelineContext::GetCurrentContext();
ACE_UPDATE_NODE_LAYOUT_PROPERTY(
SearchLayoutProperty, CancelButtonUDSize, iconOptions.GetSize().value_or(ICON_HEIGHT), frameNode);
}
void SearchModelNG::SetSearchEnterKeyType(FrameNode* frameNode, TextInputAction value)
{
CHECK_NULL_VOID(frameNode);

View File

@ -35,6 +35,12 @@ public:
void SetSearchIconColor(const Color& color) override;
void SetSearchSrcPath(
const std::string& src, const std::string& bundleName, const std::string& moduleName) override;
void SetSearchSymbolIcon(std::function<void(WeakPtr<NG::FrameNode>)> iconSymbol) override;
void SetSearchDefaultIcon() override;
void SetSearchImageIcon(NG::IconOptions& iconOptions) override;
void SetCancelSymbolIcon(std::function<void(WeakPtr<NG::FrameNode>)> iconSymbol) override;
void SetCancelDefaultIcon() override;
void SetCancelImageIcon(NG::IconOptions& iconOptions) override;
void SetRightIconSrcPath(const std::string& src) override;
void SetCancelButtonStyle(CancelButtonStyle cancelButtonStyle) override;
void SetCancelIconSize(const Dimension& value) override;
@ -99,6 +105,7 @@ public:
static void SetSearchIconSize(FrameNode* frameNode, const Dimension& value);
static void SetSearchSrcPath(FrameNode* frameNode, const std::string& src);
static void SetSearchIconColor(FrameNode* frameNode, const Color& color);
static void SetSearchImageIcon(FrameNode* frameNode, IconOptions& iconOptions);
static void SetSearchButton(FrameNode* frameNode, const std::string& text);
static void SetSearchButtonFontSize(FrameNode* frameNode, const Dimension& value);
static void SetSearchButtonFontColor(FrameNode* frameNode, const Color& color);
@ -114,6 +121,7 @@ public:
static void SetCancelIconColor(FrameNode* frameNode, const Color& color);
static void SetCancelIconSize(FrameNode* frameNode, const Dimension& value);
static void SetCancelButtonStyle(FrameNode* frameNode, CancelButtonStyle style);
static void SetCancelImageIcon(FrameNode* frameNode, IconOptions& iconOptions);
static void SetHeight(FrameNode* frameNode, const Dimension& height);
static void SetSearchEnterKeyType(FrameNode* frameNode, TextInputAction value);
static void SetId(FrameNode* frameNode, const std::string& key);

View File

@ -21,6 +21,110 @@
#include "core/components_ng/base/group_node.h"
namespace OHOS::Ace::NG {
class IconOptions {
public:
IconOptions(CalcDimension size) : size_(size)
{}
IconOptions(Color color, CalcDimension size) : color_(color), size_(size)
{}
IconOptions(std::string src, std::string bundleName = "", std::string moduleName = "")
: src_(src), bundleName_(bundleName), moduleName_(moduleName)
{}
IconOptions(CalcDimension size, std::string src, std::string bundleName, std::string moduleName)
: size_(size), src_(src), bundleName_(bundleName), moduleName_(moduleName)
{}
IconOptions(Color color, CalcDimension size, std::string src, std::string bundleName, std::string moduleName)
: color_(color), size_(size), src_(src), bundleName_(bundleName), moduleName_(moduleName)
{}
IconOptions() = default;
~IconOptions() = default;
std::optional<Color>& GetColor()
{
return color_;
}
std::optional<Dimension>& GetSize()
{
return size_;
}
std::optional<std::string>& GetSrc()
{
return src_;
}
std::optional<std::string>& GetBundleName()
{
return bundleName_;
}
std::optional<std::string>& GetModuleName()
{
return moduleName_;
}
void UpdateSrc(std::string src, std::string bundleName, std::string moduleName)
{
src_ = src;
moduleName_ = moduleName;
bundleName_ = bundleName;
}
void UpdateSize(Dimension size)
{
size_ = size;
}
void UpdateColor(Color color)
{
color_ = color;
}
bool operator==(const IconOptions& info) const
{
return color_ == info.color_ && size_ == info.size_ && src_ == info.src_ && bundleName_ == info.bundleName_ &&
moduleName_ == info.moduleName_;
}
bool operator!=(const IconOptions& info) const
{
return !(operator==(info));
}
std::string ToString() const
{
auto json = JsonUtil::Create(true);
if (src_.has_value()) {
json->Put("src", src_.value().c_str());
}
if (bundleName_.has_value()) {
json->Put("bundleName", bundleName_.value().c_str());
}
if (moduleName_.has_value()) {
json->Put("moduleName", moduleName_.value().c_str());
}
if (size_.has_value()) {
json->Put("size", size_.value().ToString().c_str());
}
if (color_.has_value()) {
json->Put("color", color_.value().ToString().c_str());
}
return json->ToString();
}
private:
std::optional<Color> color_;
std::optional<Dimension> size_;
std::optional<std::string> src_;
std::optional<std::string> bundleName_;
std::optional<std::string> moduleName_;
};
class ACE_EXPORT SearchNode : public GroupNode {
DECLARE_ACE_TYPE(SearchNode, GroupNode);
@ -81,44 +185,104 @@ public:
return cancelButtonId_.value();
}
const Dimension& GetSearchIconSize() const
Dimension& GetSearchImageIconSize()
{
return searchIconSize_;
return searchImageIconOptions_.GetSize().value();
}
const Dimension& GetCancelIconSize() const
Dimension& GetCancelImageIconSize()
{
return cancelIconSize_;
return cancelImageIconOptions_.GetSize().value();
}
const Color& GetSearchIconColor() const
const Dimension& GetSearchSymbolIconSize() const
{
return searchIconColor_;
return searchSymbolIconSize_;
}
const Color& GetCancelIconColor() const
const Dimension& GetCancelSymbolIconSize() const
{
return cancelIconColor_;
return cancelSymbolIconSize_;
}
void SetSearchIconSize(const Dimension searchIconSize)
const Color& GetSearchSymbolIconColor() const
{
searchIconSize_ = searchIconSize;
return searchSymbolIconColor_;
}
void SetCancelIconSize(const Dimension cancelIconSize)
const Color& GetCancelSymbolIconColor() const
{
cancelIconSize_ = cancelIconSize;
return cancelSymbolIconColor_;
}
void SetSearchIconColor(const Color searchIconColor)
Color& GetSearchImageIconColor()
{
searchIconColor_ = searchIconColor;
return searchImageIconOptions_.GetColor().value();
}
void SetCancelIconColor(const Color cancelIconColor)
Color& GetCancelImageIconColor()
{
cancelIconColor_ = cancelIconColor;
return cancelImageIconOptions_.GetColor().value();
}
IconOptions& GetSearchImageIconOptions()
{
return searchImageIconOptions_;
}
IconOptions& GetCancelImageIconOptions()
{
return cancelImageIconOptions_;
}
void SetSearchImageIconSize(Dimension searchIconSize)
{
searchImageIconOptions_.UpdateSize(searchIconSize);
}
void SetCancelImageIconSize(Dimension cancelIconSize)
{
cancelImageIconOptions_.UpdateSize(cancelIconSize);
}
void SetSearchSymbolIconSize(Dimension searchIconSize)
{
searchSymbolIconSize_ = searchIconSize;
}
void SetCancelSymbolIconSize(Dimension cancelIconSize)
{
cancelSymbolIconSize_ = cancelIconSize;
}
void SetSearchSymbolIconColor(Color searchIconColor)
{
searchSymbolIconColor_ = searchIconColor;
}
void SetCancelSymbolIconColor(Color cancelIconColor)
{
cancelSymbolIconColor_ = cancelIconColor;
}
void SetSearchImageIconColor(Color searchIconColor)
{
searchImageIconOptions_.UpdateColor(searchIconColor);
}
void SetCancelImageIconColor(Color cancelIconColor)
{
cancelImageIconOptions_.UpdateColor(cancelIconColor);
}
void SetSearchImageIconOptions(IconOptions options)
{
searchImageIconOptions_ = options;
}
void SetCancelImageIconOptions(IconOptions options)
{
cancelImageIconOptions_ = options;
}
void UpdateHasSearchIconNodeCreated(bool hasNodeCreated)
@ -138,12 +302,15 @@ private:
std::set<int32_t> searchChildren_;
Dimension searchIconSize_ = 16.0_vp;
Color searchIconColor_;
Dimension cancelIconSize_ = 16.0_vp;
Color cancelIconColor_;
Dimension searchSymbolIconSize_ = 16.0_fp;
Color searchSymbolIconColor_;
Dimension cancelSymbolIconSize_ = 16.0_fp;
Color cancelSymbolIconColor_;
bool searchIconNodeCreated_ = false;
bool cancelIconNodeCreated_ = false;
IconOptions searchImageIconOptions_ = IconOptions(16.0_vp);
IconOptions cancelImageIconOptions_ = IconOptions(16.0_vp);
};
} // namespace OHOS::Ace::NG

View File

@ -46,6 +46,7 @@ constexpr int32_t ERROR = -1;
// The focus state requires an 2vp inner stroke, which should be indented by 1vp when drawn.
constexpr Dimension FOCUS_OFFSET = 1.0_vp;
constexpr Dimension UP_AND_DOWN_PADDING = 8.0_vp;
constexpr Dimension SYMBOL_ICON_HEIGHT = 16.0_fp;
constexpr float HOVER_OPACITY = 0.05f;
constexpr float TOUCH_OPACITY = 0.1f;
constexpr int32_t HOVER_TO_TOUCH_DURATION = 100;
@ -1562,50 +1563,67 @@ std::string SearchPattern::SymbolColorToString(std::vector<Color>& colors) const
}
void SearchPattern::InitIconColorSize()
{
InitSearchIconColorSize();
InitCancelIconColorSize();
}
void SearchPattern::InitSearchIconColorSize()
{
auto pipeline = PipelineBase::GetCurrentContext();
CHECK_NULL_VOID(pipeline);
auto searchTheme = pipeline->GetTheme<SearchTheme>();
CHECK_NULL_VOID(searchTheme);
GetSearchNode()->SetSearchIconSize(searchTheme->GetIconHeight());
GetSearchNode()->SetCancelIconSize(searchTheme->GetIconHeight());
if (AceApplicationInfo::GetInstance().GreatOrEqualTargetAPIVersion(PlatformVersion::VERSION_TWELVE)) {
GetSearchNode()->SetCancelIconColor(searchTheme->GetSymbolIconColor());
GetSearchNode()->SetSearchIconColor(searchTheme->GetSymbolIconColor());
} else {
GetSearchNode()->SetCancelIconColor(searchTheme->GetSearchIconColor());
GetSearchNode()->SetSearchIconColor(searchTheme->GetSearchIconColor());
}
GetSearchNode()->SetSearchSymbolIconColor(Color(searchTheme->GetSymbolIconColor()));
GetSearchNode()->SetSearchSymbolIconSize(SYMBOL_ICON_HEIGHT);
GetSearchNode()->SetSearchImageIconColor(Color(searchTheme->GetSearchIconColor()));
GetSearchNode()->SetSearchImageIconSize(searchTheme->GetIconHeight());
}
void SearchPattern::InitCancelIconColorSize()
{
auto pipeline = PipelineBase::GetCurrentContext();
CHECK_NULL_VOID(pipeline);
auto searchTheme = pipeline->GetTheme<SearchTheme>();
CHECK_NULL_VOID(searchTheme);
GetSearchNode()->SetCancelSymbolIconColor(Color(searchTheme->GetSymbolIconColor()));
GetSearchNode()->SetCancelSymbolIconSize(SYMBOL_ICON_HEIGHT);
GetSearchNode()->SetCancelImageIconColor(Color(searchTheme->GetSearchIconColor()));
GetSearchNode()->SetCancelImageIconSize(searchTheme->GetIconHeight());
}
void SearchPattern::CreateSearchIcon(const std::string& src)
{
CHECK_NULL_VOID(GetSearchNode());
if (AceApplicationInfo::GetInstance().GreatOrEqualTargetAPIVersion(PlatformVersion::VERSION_TWELVE) &&
src.empty()) {
CreateOrUpdateSymbol(IMAGE_INDEX, !GetSearchNode()->HasSearchIconNodeCreated());
} else {
CreateOrUpdateImage(IMAGE_INDEX, src, !GetSearchNode()->HasSearchIconNodeCreated(), "", "");
}
GetSearchNode()->UpdateHasSearchIconNodeCreated(true);
if (src.empty()) {
if (GetSearchNode()->HasSearchIconNodeCreated()) {
return;
}
UpdateIconNode(IMAGE_INDEX, src, "", "");
if (AceApplicationInfo::GetInstance().GreatOrEqualTargetAPIVersion(PlatformVersion::VERSION_TWELVE) &&
src.empty()) {
CreateOrUpdateSymbol(IMAGE_INDEX, !GetSearchNode()->HasSearchIconNodeCreated(), false);
} else {
GetSearchNode()->SetSearchImageIconOptions(IconOptions(src));
CreateOrUpdateImage(IMAGE_INDEX, !GetSearchNode()->HasSearchIconNodeCreated());
}
GetSearchNode()->UpdateHasSearchIconNodeCreated(true);
}
void SearchPattern::CreateCancelIcon()
{
CHECK_NULL_VOID(GetSearchNode());
if (GetSearchNode()->HasCancelIconNodeCreated()) {
return;
}
if (AceApplicationInfo::GetInstance().GreatOrEqualTargetAPIVersion(PlatformVersion::VERSION_TWELVE)) {
CreateOrUpdateSymbol(CANCEL_IMAGE_INDEX, !GetSearchNode()->HasCancelIconNodeCreated());
CreateOrUpdateSymbol(CANCEL_IMAGE_INDEX, !GetSearchNode()->HasCancelIconNodeCreated(), false);
} else {
CreateOrUpdateImage(CANCEL_IMAGE_INDEX, "", !GetSearchNode()->HasCancelIconNodeCreated(), "", "");
GetSearchNode()->SetCancelImageIconOptions(IconOptions());
CreateOrUpdateImage(CANCEL_IMAGE_INDEX, !GetSearchNode()->HasCancelIconNodeCreated());
}
GetSearchNode()->UpdateHasCancelIconNodeCreated(true);
}
void SearchPattern::CreateOrUpdateSymbol(int32_t index, bool isCreateNode)
void SearchPattern::CreateOrUpdateSymbol(int32_t index, bool isCreateNode, bool isFromModifier)
{
CHECK_NULL_VOID(GetSearchNode());
imageClickListener_ = nullptr;
@ -1614,137 +1632,144 @@ void SearchPattern::CreateOrUpdateSymbol(int32_t index, bool isCreateNode)
auto nodeId = ElementRegister::GetInstance()->MakeUniqueId();
auto searchTheme = pipeline->GetTheme<SearchTheme>();
CHECK_NULL_VOID(searchTheme);
auto frameNode = FrameNode::GetOrCreateFrameNode(
auto iconFrameNode = FrameNode::GetOrCreateFrameNode(
V2::SYMBOL_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<TextPattern>(); });
auto layoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
auto layoutProperty = iconFrameNode->GetLayoutProperty<TextLayoutProperty>();
layoutProperty->UpdateSymbolSourceInfo(index == IMAGE_INDEX ? SymbolSourceInfo(searchTheme->GetSearchSymbolId())
: SymbolSourceInfo(searchTheme->GetCancelSymbolId()));
layoutProperty->UpdateFontSize(
index == IMAGE_INDEX ? GetSearchNode()->GetSearchIconSize() : GetSearchNode()->GetCancelIconSize());
layoutProperty->UpdateSymbolColorList(
{ index == IMAGE_INDEX ? GetSearchNode()->GetSearchIconColor() : GetSearchNode()->GetCancelIconColor() });
index == IMAGE_INDEX ? GetSearchNode()->GetSearchSymbolIconSize() : GetSearchNode()->GetCancelSymbolIconSize());
layoutProperty->UpdateSymbolColorList({index == IMAGE_INDEX ? GetSearchNode()->GetSearchSymbolIconColor()
: GetSearchNode()->GetCancelSymbolIconColor()});
auto parentInspector = GetSearchNode()->GetInspectorIdValue("");
frameNode->UpdateInspectorId(INSPECTOR_PREFIX + SPECICALIZED_INSPECTOR_INDEXS[index] + parentInspector);
iconFrameNode->UpdateInspectorId(INSPECTOR_PREFIX + SPECICALIZED_INSPECTOR_INDEXS[index] + parentInspector);
if (isFromModifier) {
UpdateSymbolIconProperties(iconFrameNode, index);
}
if (isCreateNode) {
frameNode->MountToParent(GetSearchNode());
iconFrameNode->MountToParent(GetSearchNode());
if (index == CANCEL_IMAGE_INDEX) {
auto cancelButtonEvent = frameNode->GetEventHub<ButtonEventHub>();
auto cancelButtonEvent = iconFrameNode->GetEventHub<ButtonEventHub>();
CHECK_NULL_VOID(cancelButtonEvent);
cancelButtonEvent->SetEnabled(false);
}
frameNode->MarkModifyDone();
iconFrameNode->MarkModifyDone();
} else {
auto oldFrameNode = AceType::DynamicCast<FrameNode>(GetSearchNode()->GetChildAtIndex(index));
CHECK_NULL_VOID(oldFrameNode);
GetSearchNode()->ReplaceChild(oldFrameNode, frameNode);
GetSearchNode()->ReplaceChild(oldFrameNode, iconFrameNode);
if (index == CANCEL_IMAGE_INDEX) {
UpdateIconChangeEvent();
}
frameNode->MarkModifyDone();
frameNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
iconFrameNode->MarkModifyDone();
iconFrameNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
}
}
void SearchPattern::CreateOrUpdateImage(int32_t index, const std::string& src, bool isCreateNode,
const std::string& bundleName, const std::string& moduleName)
void SearchPattern::CreateOrUpdateImage(int32_t index, bool isCreateNode)
{
CHECK_NULL_VOID(GetSearchNode());
imageClickListener_ = nullptr;
auto frameNode = FrameNode::GetOrCreateFrameNode(V2::IMAGE_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(),
auto pipeline = PipelineBase::GetCurrentContext();
CHECK_NULL_VOID(pipeline);
auto searchTheme = pipeline->GetTheme<SearchTheme>();
CHECK_NULL_VOID(searchTheme);
auto iconFrameNode = FrameNode::GetOrCreateFrameNode(V2::IMAGE_ETS_TAG,
ElementRegister::GetInstance()->MakeUniqueId(),
[]() { return AceType::MakeRefPtr<ImagePattern>(); });
HandleImageLayoutProperty(frameNode, index, src, bundleName, moduleName);
auto imageRenderContext = frameNode->GetRenderContext();
CHECK_NULL_VOID(imageRenderContext);
auto parentInspector = GetSearchNode()->GetInspectorIdValue("");
frameNode->UpdateInspectorId(INSPECTOR_PREFIX + SPECICALIZED_INSPECTOR_INDEXS[index] + parentInspector);
auto imageRenderProperty = frameNode->GetPaintProperty<ImageRenderProperty>();
CHECK_NULL_VOID(imageRenderProperty);
imageRenderProperty->UpdateSvgFillColor(
index == IMAGE_INDEX ? GetSearchNode()->GetSearchIconColor() : GetSearchNode()->GetCancelIconColor());
UpdateImageIconProperties(iconFrameNode, index);
if (isCreateNode) {
frameNode->MountToParent(GetSearchNode());
iconFrameNode->MountToParent(GetSearchNode());
if (index == CANCEL_IMAGE_INDEX) {
auto cancelButtonEvent = frameNode->GetEventHub<ButtonEventHub>();
auto cancelButtonEvent = iconFrameNode->GetEventHub<ButtonEventHub>();
CHECK_NULL_VOID(cancelButtonEvent);
cancelButtonEvent->SetEnabled(false);
}
frameNode->MarkModifyDone();
iconFrameNode->MarkModifyDone();
} else {
auto oldFrameNode = AceType::DynamicCast<FrameNode>(GetSearchNode()->GetChildAtIndex(index));
CHECK_NULL_VOID(oldFrameNode);
GetSearchNode()->ReplaceChild(oldFrameNode, frameNode);
GetSearchNode()->ReplaceChild(oldFrameNode, iconFrameNode);
if (index == CANCEL_IMAGE_INDEX) {
UpdateIconChangeEvent();
}
frameNode->MarkModifyDone();
frameNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
iconFrameNode->MarkModifyDone();
iconFrameNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
}
}
void SearchPattern::HandleImageLayoutProperty(RefPtr<FrameNode>& frameNode, int32_t index, const std::string& src,
const std::string& bundleName, const std::string& moduleName)
{
CHECK_NULL_VOID(GetSearchNode());
auto pipeline = PipelineBase::GetCurrentContext();
CHECK_NULL_VOID(pipeline);
ImageSourceInfo imageSourceInfo("");
auto iconTheme = pipeline->GetTheme<IconTheme>();
CHECK_NULL_VOID(iconTheme);
auto searchTheme = pipeline->GetTheme<SearchTheme>();
CHECK_NULL_VOID(searchTheme);
if (src.empty()) {
imageSourceInfo.SetResourceId(
index == IMAGE_INDEX ? InternalResource::ResourceId::SEARCH_SVG : InternalResource::ResourceId::CLOSE_SVG);
auto iconPath = iconTheme->GetIconPath(
index == IMAGE_INDEX ? InternalResource::ResourceId::SEARCH_SVG : InternalResource::ResourceId::CLOSE_SVG);
imageSourceInfo.SetSrc(iconPath,
index == IMAGE_INDEX ? GetSearchNode()->GetSearchIconColor() : GetSearchNode()->GetCancelIconColor());
} else {
imageSourceInfo.SetSrc(src);
}
if (index == IMAGE_INDEX) {
imageSourceInfo.SetBundleName(bundleName);
imageSourceInfo.SetModuleName(moduleName);
}
imageSourceInfo.SetFillColor(
index == IMAGE_INDEX ? GetSearchNode()->GetSearchIconColor() : GetSearchNode()->GetCancelIconColor());
auto imageLayoutProperty = frameNode->GetLayoutProperty<ImageLayoutProperty>();
imageLayoutProperty->UpdateImageSourceInfo(imageSourceInfo);
CalcSize imageCalcSize((CalcLength(searchTheme->GetIconHeight())), CalcLength(searchTheme->GetIconHeight()));
imageLayoutProperty->UpdateUserDefinedIdealSize(imageCalcSize);
}
void SearchPattern::SetSearchIconSize(const Dimension& value)
{
UpdateIconSize(IMAGE_INDEX, value);
}
void SearchPattern::SetSearchSrcPath(
const std::string& src, const std::string& bundleName, const std::string& moduleName)
{
UpdateIconNode(IMAGE_INDEX, src, bundleName, moduleName);
CHECK_NULL_VOID(GetSearchNode());
auto &imageIconOptions = GetSearchNode()->GetSearchImageIconOptions();
imageIconOptions.UpdateSrc(std::string(src), std::string(bundleName), std::string(moduleName));
UpdateImageIconNode(IMAGE_INDEX);
}
void SearchPattern::SetSearchIconSize(const Dimension& value)
{
CHECK_NULL_VOID(GetSearchNode());
auto& imageIconOptions = GetSearchNode()->GetSearchImageIconOptions();
imageIconOptions.UpdateSize(Dimension(value));
UpdateImageIconNode(IMAGE_INDEX);
}
void SearchPattern::SetSearchIconColor(const Color& color)
{
UpdateIconColor(IMAGE_INDEX, color);
CHECK_NULL_VOID(GetSearchNode());
auto& imageIconOptions = GetSearchNode()->GetSearchImageIconOptions();
imageIconOptions.UpdateColor(Color(color));
UpdateImageIconNode(IMAGE_INDEX);
}
void SearchPattern::SetSearchImageIcon(IconOptions& iconOptions)
{
CHECK_NULL_VOID(GetSearchNode());
auto& imageIconOptions = GetSearchNode()->GetSearchImageIconOptions();
if (iconOptions.GetColor().has_value()) {
imageIconOptions.UpdateColor(iconOptions.GetColor().value());
}
if (iconOptions.GetSize().has_value()) {
imageIconOptions.UpdateSize(iconOptions.GetSize().value());
}
if (iconOptions.GetSrc().has_value()) {
imageIconOptions.UpdateSrc(iconOptions.GetSrc().value_or(""),
iconOptions.GetBundleName().value_or(""),
iconOptions.GetModuleName().value_or(""));
}
UpdateImageIconNode(IMAGE_INDEX);
}
void SearchPattern::SetSearchSymbolIcon()
{
UpdateSymbolIconNode(IMAGE_INDEX);
}
void SearchPattern::SetCancelIconSize(const Dimension& value)
{
UpdateIconSize(CANCEL_IMAGE_INDEX, value);
CHECK_NULL_VOID(GetSearchNode());
auto& imageIconOptions = GetSearchNode()->GetCancelImageIconOptions();
imageIconOptions.UpdateSize(Dimension(value));
UpdateImageIconNode(CANCEL_IMAGE_INDEX);
}
void SearchPattern::SetCancelIconColor(const Color& color)
{
UpdateIconColor(CANCEL_IMAGE_INDEX, color);
CHECK_NULL_VOID(GetSearchNode());
auto &imageIconOptions = GetSearchNode()->GetCancelImageIconOptions();
imageIconOptions.UpdateColor(Color(color));
UpdateImageIconNode(CANCEL_IMAGE_INDEX);
}
void SearchPattern::SetRightIconSrcPath(const std::string& src)
{
UpdateIconNode(CANCEL_IMAGE_INDEX, src, "", "");
CHECK_NULL_VOID(GetSearchNode());
auto &imageIconOptions = GetSearchNode()->GetCancelImageIconOptions();
imageIconOptions.UpdateSrc(std::string(src), "", "");
UpdateImageIconNode(CANCEL_IMAGE_INDEX);
}
void SearchPattern::SetCancelButtonStyle(const CancelButtonStyle& style)
@ -1754,115 +1779,128 @@ void SearchPattern::SetCancelButtonStyle(const CancelButtonStyle& style)
UpdateChangeEvent(textFieldPattern->GetTextValue(), static_cast<int16_t>(style));
}
void SearchPattern::UpdateIconNode(
int32_t index, const std::string& src, const std::string& bundleName, const std::string& moduleName)
void SearchPattern::SetCancelImageIcon(IconOptions& iconOptions)
{
CHECK_NULL_VOID(GetSearchNode());
auto &imageIconOptions = GetSearchNode()->GetCancelImageIconOptions();
if (iconOptions.GetColor().has_value()) {
imageIconOptions.UpdateColor(iconOptions.GetColor().value());
}
if (iconOptions.GetSize().has_value()) {
imageIconOptions.UpdateSize(iconOptions.GetSize().value());
}
if (iconOptions.GetSrc().has_value()) {
imageIconOptions.UpdateSrc(iconOptions.GetSrc().value(),
iconOptions.GetBundleName().value_or(""),
iconOptions.GetModuleName().value_or(""));
}
UpdateImageIconNode(CANCEL_IMAGE_INDEX);
}
void SearchPattern::SetCancelSymbolIcon()
{
UpdateSymbolIconNode(CANCEL_IMAGE_INDEX);
}
void SearchPattern::UpdateImageIconNode(int32_t index)
{
bool isCurSymbolNode = IsSymbolIcon(index);
bool isNeedSymbolNode =
src.empty() && AceApplicationInfo::GetInstance().GreatOrEqualTargetAPIVersion(PlatformVersion::VERSION_TWELVE);
if (isCurSymbolNode != isNeedSymbolNode) {
if (isNeedSymbolNode) {
CreateOrUpdateSymbol(index, false);
} else {
CreateOrUpdateImage(index, src, false, bundleName, moduleName);
}
if (isCurSymbolNode) {
CreateOrUpdateImage(index, false);
} else {
UpdateIconSrc(index, src);
auto frameNode = GetHost();
CHECK_NULL_VOID(frameNode);
auto iconFrameNode = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(index));
UpdateImageIconProperties(iconFrameNode, index);
iconFrameNode->MarkModifyDone();
iconFrameNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
}
}
void SearchPattern::UpdateIconSrc(int32_t index, const std::string& src)
void SearchPattern::UpdateSymbolIconNode(int32_t index)
{
auto frameNode = GetHost();
CHECK_NULL_VOID(frameNode);
auto iconFrameNode = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(index));
CHECK_NULL_VOID(iconFrameNode);
if (iconFrameNode->GetTag() == V2::SYMBOL_ETS_TAG) {
auto symbolLayoutProperty = iconFrameNode->GetLayoutProperty<TextLayoutProperty>();
CHECK_NULL_VOID(symbolLayoutProperty);
if (src.empty()) {
auto pipeline = PipelineBase::GetCurrentContext();
CHECK_NULL_VOID(pipeline);
auto searchTheme = pipeline->GetTheme<SearchTheme>();
CHECK_NULL_VOID(searchTheme);
auto symbolLayoutProperty = iconFrameNode->GetLayoutProperty<TextLayoutProperty>();
symbolLayoutProperty->UpdateSymbolSourceInfo(index == IMAGE_INDEX
? SymbolSourceInfo(searchTheme->GetSearchSymbolId())
: SymbolSourceInfo(searchTheme->GetCancelSymbolId()));
}
bool isCurSymbolNode = IsSymbolIcon(index);
if (!isCurSymbolNode) {
CreateOrUpdateSymbol(index, false, true);
} else {
auto frameNode = GetHost();
CHECK_NULL_VOID(frameNode);
auto iconFrameNode = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(index));
UpdateSymbolIconProperties(iconFrameNode, index);
iconFrameNode->MarkModifyDone();
iconFrameNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
}
}
void SearchPattern::UpdateImageIconProperties(RefPtr<FrameNode>& iconFrameNode, int32_t index)
{
CHECK_NULL_VOID(iconFrameNode);
if (iconFrameNode->GetTag() == V2::IMAGE_ETS_TAG) {
auto iconOptions = index == IMAGE_INDEX ? GetSearchNode()->GetSearchImageIconOptions()
: GetSearchNode()->GetCancelImageIconOptions();
auto imageLayoutProperty = iconFrameNode->GetLayoutProperty<ImageLayoutProperty>();
CHECK_NULL_VOID(imageLayoutProperty);
auto imageSourceInfo = imageLayoutProperty->GetImageSourceInfo().value();
if (src.empty()) {
ImageSourceInfo imageSourceInfo("");
auto imageSourceInfoOp = imageLayoutProperty->GetImageSourceInfo();
if (imageSourceInfoOp.has_value()) {
imageSourceInfo = imageSourceInfoOp.value();
}
auto pipeline = PipelineBase::GetCurrentContext();
CHECK_NULL_VOID(pipeline);
auto searchTheme = pipeline->GetTheme<SearchTheme>();
CHECK_NULL_VOID(searchTheme);
auto iconTheme = pipeline->GetTheme<IconTheme>();
CHECK_NULL_VOID(iconTheme);
if (iconOptions.GetSrc().value_or("").empty()) {
imageSourceInfo.SetResourceId(index == IMAGE_INDEX ? InternalResource::ResourceId::SEARCH_SVG
: InternalResource::ResourceId::CLOSE_SVG);
auto pipeline = PipelineBase::GetCurrentContext();
CHECK_NULL_VOID(pipeline);
auto iconPath = pipeline->GetTheme<IconTheme>()->GetIconPath(index == IMAGE_INDEX
? InternalResource::ResourceId::SEARCH_SVG
: InternalResource::ResourceId::CLOSE_SVG);
auto color = pipeline->GetTheme<SearchTheme>()->GetSearchIconColor();
imageSourceInfo.SetSrc(iconPath, color);
auto iconPath = iconTheme->GetIconPath(index == IMAGE_INDEX ? InternalResource::ResourceId::SEARCH_SVG
: InternalResource::ResourceId::CLOSE_SVG);
imageSourceInfo.SetSrc(iconPath, iconOptions.GetColor().value_or(searchTheme->GetSearchIconColor()));
} else {
imageSourceInfo.SetSrc(src);
imageSourceInfo.SetSrc(iconOptions.GetSrc().value());
}
imageSourceInfo.SetBundleName(iconOptions.GetBundleName().value_or(""));
imageSourceInfo.SetModuleName(iconOptions.GetModuleName().value_or(""));
imageSourceInfo.SetFillColor(iconOptions.GetColor().value_or(searchTheme->GetSearchIconColor()));
imageLayoutProperty->UpdateImageSourceInfo(imageSourceInfo);
CalcSize imageCalcSize(CalcLength(iconOptions.GetSize().value_or(searchTheme->GetIconHeight())),
CalcLength(iconOptions.GetSize().value_or(searchTheme->GetIconHeight())));
imageLayoutProperty->UpdateUserDefinedIdealSize(imageCalcSize);
auto parentInspector = GetSearchNode()->GetInspectorIdValue("");
iconFrameNode->UpdateInspectorId(INSPECTOR_PREFIX + SPECICALIZED_INSPECTOR_INDEXS[index] + parentInspector);
auto imageRenderProperty = iconFrameNode->GetPaintProperty<ImageRenderProperty>();
CHECK_NULL_VOID(imageRenderProperty);
imageSourceInfo.SetFillColor(iconOptions.GetColor().value_or(searchTheme->GetSearchIconColor()));
imageLayoutProperty->UpdateImageSourceInfo(imageSourceInfo);
imageRenderProperty->UpdateSvgFillColor(iconOptions.GetColor().value_or(searchTheme->GetSearchIconColor()));
}
iconFrameNode->MarkModifyDone();
iconFrameNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
}
void SearchPattern::UpdateIconColor(int32_t index, const Color& color)
void SearchPattern::UpdateSymbolIconProperties(RefPtr<FrameNode>& iconFrameNode, int32_t index)
{
CHECK_NULL_VOID(GetSearchNode());
auto iconFrameNode = AceType::DynamicCast<FrameNode>(GetSearchNode()->GetChildAtIndex(index));
auto host = GetHost();
CHECK_NULL_VOID(host);
CHECK_NULL_VOID(iconFrameNode);
auto layoutProperty = host->GetLayoutProperty<SearchLayoutProperty>();
CHECK_NULL_VOID(layoutProperty);
if (index == IMAGE_INDEX) {
GetSearchNode()->SetSearchIconColor(color);
auto iconSymbol = layoutProperty->GetSearchIconSymbol();
if (iconSymbol != nullptr) {
iconSymbol(AccessibilityManager::WeakClaim(AccessibilityManager::RawPtr(iconFrameNode)));
}
} else {
GetSearchNode()->SetCancelIconColor(color);
}
if (iconFrameNode->GetTag() == V2::SYMBOL_ETS_TAG) {
auto symbolLayoutProperty = iconFrameNode->GetLayoutProperty<TextLayoutProperty>();
CHECK_NULL_VOID(symbolLayoutProperty);
symbolLayoutProperty->UpdateSymbolColorList({ color });
} else {
auto imageLayoutProperty = iconFrameNode->GetLayoutProperty<ImageLayoutProperty>();
CHECK_NULL_VOID(imageLayoutProperty);
auto imageSourceInfo = imageLayoutProperty->GetImageSourceInfo().value();
if (imageSourceInfo.IsSvg()) {
imageSourceInfo.SetFillColor(color);
imageLayoutProperty->UpdateImageSourceInfo(imageSourceInfo);
auto imageRenderProperty = iconFrameNode->GetPaintProperty<ImageRenderProperty>();
CHECK_NULL_VOID(imageRenderProperty);
imageRenderProperty->UpdateSvgFillColor(color);
auto iconSymbol = layoutProperty->GetCancelIconSymbol();
if (iconSymbol != nullptr) {
iconSymbol(AccessibilityManager::WeakClaim(AccessibilityManager::RawPtr(iconFrameNode)));
}
}
iconFrameNode->MarkModifyDone();
iconFrameNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
}
void SearchPattern::UpdateIconSize(int32_t index, const Dimension& value)
{
CHECK_NULL_VOID(GetSearchNode());
auto iconFrameNode = AceType::DynamicCast<FrameNode>(GetSearchNode()->GetChildAtIndex(index));
CHECK_NULL_VOID(iconFrameNode);
if (iconFrameNode->GetTag() == V2::SYMBOL_ETS_TAG) {
auto symbolLayoutProperty = iconFrameNode->GetLayoutProperty<TextLayoutProperty>();
CHECK_NULL_VOID(symbolLayoutProperty);
symbolLayoutProperty->UpdateFontSize(value);
}
iconFrameNode->MarkModifyDone();
iconFrameNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
if (index == IMAGE_INDEX) {
GetSearchNode()->SetSearchIconSize(value);
} else {
GetSearchNode()->SetCancelIconSize(value);
}
// reset symbol effect
auto symbolLayoutProperty = iconFrameNode->GetLayoutProperty<TextLayoutProperty>();
auto symbolEffectOptions = symbolLayoutProperty->GetSymbolEffectOptionsValue(SymbolEffectOptions());
symbolEffectOptions.SetIsTxtActive(false);
symbolLayoutProperty->UpdateSymbolEffectOptions(symbolEffectOptions);
}
bool SearchPattern::IsSymbolIcon(int32_t index)

View File

@ -181,11 +181,17 @@ public:
void SetSearchIconSize(const Dimension& value);
void SetSearchIconColor(const Color& color);
void SetSearchSrcPath(const std::string& src, const std::string& bundleName, const std::string& moduleName);
void SetSearchSymbolIcon();
void SetSearchImageIcon(IconOptions& iconOptions);
void SetCancelSymbolIcon();
void SetCancelImageIcon(IconOptions& iconOptions);
void SetRightIconSrcPath(const std::string& src);
void SetCancelButtonStyle(const CancelButtonStyle& cancelButtonStyle);
void SetCancelIconSize(const Dimension& value);
void SetCancelIconColor(const Color& color);
void InitIconColorSize();
void InitSearchIconColorSize();
void InitCancelIconColorSize();
void CreateSearchIcon(const std::string& src);
void CreateCancelIcon();
@ -249,6 +255,13 @@ private:
void UpdateIconChangeEvent();
bool IsEventEnabled(const std::string& textValue, int16_t style);
void CreateOrUpdateSymbol(int32_t index, bool isCreateNode, bool isFromModifier);
void CreateOrUpdateImage(int32_t index, bool isCreateNode);
void UpdateImageIconProperties(RefPtr<FrameNode>& frameNode, int32_t index);
void UpdateImageIconNode(int32_t index);
void UpdateSymbolIconNode(int32_t index);
void UpdateSymbolIconProperties(RefPtr<FrameNode>& frameNode, int32_t index);
void CreateOrUpdateSymbol(int32_t index, bool isCreateNode);
void CreateOrUpdateImage(int32_t index, const std::string& src, bool isCreateNode, const std::string& bundleName,
const std::string& moduleName);

View File

@ -23,6 +23,7 @@
#include "core/components/text_field/textfield_theme.h"
#include "core/components_ng/base/frame_node.h"
#include "core/components_ng/pattern/search/search_model_ng.h"
#include "core/components_ng/pattern/search/search_node.h"
#include "core/components/common/layout/constants.h"
#include "core/pipeline/base/element_register.h"
#include "core/components_ng/base/view_abstract.h"
@ -139,11 +140,9 @@ void SetSearchCancelButton(ArkUINodeHandle node,
auto* frameNode = reinterpret_cast<FrameNode*>(node);
CHECK_NULL_VOID(frameNode);
SearchModelNG::SetCancelButtonStyle(frameNode, static_cast<CancelButtonStyle>(style));
SearchModelNG::SetCancelIconSize(frameNode,
Dimension(size->value, static_cast<DimensionUnit>(size->unit)));
SearchModelNG::SetCancelIconColor(frameNode, Color(color));
std::string srcStr = std::string(src);
SearchModelNG::SetRightIconSrcPath(frameNode, srcStr);
NG::IconOptions cancelIconOptions = NG::IconOptions(
Color(color), Dimension(size->value, static_cast<DimensionUnit>(size->unit)), std::string(src), "", "");
SearchModelNG::SetCancelImageIcon(frameNode, cancelIconOptions);
}
void ResetSearchCancelButton(ArkUINodeHandle node)
@ -195,11 +194,14 @@ void SetSearchSearchIcon(ArkUINodeHandle node, const struct ArkUIIconOptionsStru
{
auto* frameNode = reinterpret_cast<FrameNode*>(node);
CHECK_NULL_VOID(frameNode);
SearchModelNG::SetSearchSrcPath(frameNode, value->src);
SearchModelNG::SetSearchIconSize(frameNode, Dimension(value->value, static_cast<DimensionUnit>(value->unit)));
Color iconColor;
if (value->color != INVALID_COLOR_VALUE) {
SearchModelNG::SetSearchIconColor(frameNode, Color(value->color));
iconColor = Color(value->color);
}
NG::IconOptions cancelInconOptions = NG::IconOptions(
iconColor, Dimension(value->value, static_cast<DimensionUnit>(value->unit)), std::string(value->src), "", "");
SearchModelNG::SetSearchImageIcon(frameNode, cancelInconOptions);
}
void ResetSearchSearchIcon(ArkUINodeHandle node)

View File

@ -14,6 +14,8 @@
*/
#include "search_base.h"
#include "core/components_ng/pattern/search/search_node.h"
namespace OHOS::Ace::NG {
namespace {} // namespace
@ -888,6 +890,68 @@ HWTEST_F(SearchTestNg, SetSearchSrcPath002, TestSize.Level1)
ASSERT_STREQ(imageLayoutProperty->GetImageSourceInfo()->GetSrc().c_str(), "/common/icon.png");
}
/**
* @tc.name: SetSearchImageIcon001
* @tc.desc: Set search image icon
* @tc.type: FUNC
*/
HWTEST_F(SearchTestNg, SetSearchImageIcon001, TestSize.Level1)
{
SearchModelNG searchModelInstance;
auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
ASSERT_NE(frameNode, nullptr);
auto searchLayoutProperty = frameNode->GetLayoutProperty<SearchLayoutProperty>();
ASSERT_NE(searchLayoutProperty, nullptr);
auto imageFrameNode = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(IMAGE_INDEX));
auto imageRenderProperty = imageFrameNode->GetPaintProperty<ImageRenderProperty>();
ASSERT_NE(imageRenderProperty, nullptr);
NG::IconOptions iconOptions = NG::IconOptions(Color::RED, 14.0_vp, "/common/icon.png", "", "");
searchModelInstance.SetSearchImageIcon(iconOptions);
auto imageLayoutProperty = imageFrameNode->GetLayoutProperty<ImageLayoutProperty>();
ASSERT_STREQ(imageLayoutProperty->GetImageSourceInfo()->GetSrc().c_str(), "/common/icon.png");
EXPECT_EQ(searchLayoutProperty->GetSearchIconUDSize(), 14.0_vp);
EXPECT_EQ(imageRenderProperty->GetSvgFillColor(), Color::RED);
}
/**
* @tc.name: SetSearchIconSymbolGlyphModofier001
* @tc.desc: Set search icon symbolGlyphModifier is not empty
* @tc.type: FUNC
*/
HWTEST_F(SearchTestNg, SetSearchIconSymbolGlyphModofier001, TestSize.Level1)
{
int32_t backupApiVersion = AceApplicationInfo::GetInstance().GetApiTargetVersion();
AceApplicationInfo::GetInstance().SetApiTargetVersion(static_cast<int32_t>(PlatformVersion::VERSION_TWELVE));
auto onApply = [](WeakPtr<NG::FrameNode> frameNode) {
auto node = frameNode.Upgrade();
EXPECT_NE(node, nullptr);
};
SearchModelNG searchModelInstance;
searchModelInstance.SetSearchSymbolIcon(onApply);
auto search = ViewStackProcessor::GetInstance()->GetMainFrameNode();
ASSERT_NE(search, nullptr);
auto pipeline = PipelineBase::GetCurrentContext();
ASSERT_NE(pipeline, nullptr);
auto searchTheme = pipeline->GetTheme<SearchTheme>();
ASSERT_NE(searchTheme, nullptr);
auto searchLayoutProperty = search->GetLayoutProperty<SearchLayoutProperty>();
ASSERT_NE(searchLayoutProperty, nullptr);
ASSERT_NE(searchLayoutProperty->GetSearchIconSymbol(), nullptr);
auto iconFrameNode = AceType::DynamicCast<FrameNode>(search->GetChildAtIndex(IMAGE_INDEX));
EXPECT_TRUE(iconFrameNode->GetTag() == V2::SYMBOL_ETS_TAG);
auto symbolLayoutProperty = iconFrameNode->GetLayoutProperty<TextLayoutProperty>();
ASSERT_NE(symbolLayoutProperty, nullptr);
const std::unique_ptr<FontStyle>& symbolStyle = symbolLayoutProperty->GetFontStyle();
ASSERT_NE(symbolStyle, nullptr);
EXPECT_EQ(symbolStyle->GetFontSize(), Dimension(16, DimensionUnit::FP));
std::vector<Color> color = { searchTheme->GetSymbolIconColor() };
EXPECT_EQ(symbolStyle->GetSymbolColorList(), color);
AceApplicationInfo::GetInstance().SetApiTargetVersion(static_cast<int32_t>(backupApiVersion));
}
/**
* @tc.name: SetRightIconSrcPath001
* @tc.desc: Set search icon src path and src is empty
@ -969,6 +1033,68 @@ HWTEST_F(SearchTestNg, SetCancelIconSize001, TestSize.Level1)
EXPECT_EQ(imageRenderProperty->GetSvgFillColor(), Color::RED);
}
/**
* @tc.name: SetCancelImageIcon001
* @tc.desc: Set cancel image icon
* @tc.type: FUNC
*/
HWTEST_F(SearchTestNg, SetCancelImageIcon001, TestSize.Level1)
{
SearchModelNG searchModelInstance;
auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
ASSERT_NE(frameNode, nullptr);
auto searchLayoutProperty = frameNode->GetLayoutProperty<SearchLayoutProperty>();
ASSERT_NE(searchLayoutProperty, nullptr);
auto imageFrameNode = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(CANCEL_IMAGE_INDEX));
auto imageRenderProperty = imageFrameNode->GetPaintProperty<ImageRenderProperty>();
ASSERT_NE(imageRenderProperty, nullptr);
NG::IconOptions iconOptions = NG::IconOptions(Color::RED, 14.0_vp, "/common/icon.png", "", "");
searchModelInstance.SetCancelImageIcon(iconOptions);
auto imageLayoutProperty = imageFrameNode->GetLayoutProperty<ImageLayoutProperty>();
ASSERT_STREQ(imageLayoutProperty->GetImageSourceInfo()->GetSrc().c_str(), "/common/icon.png");
EXPECT_EQ(searchLayoutProperty->GetCancelButtonUDSize(), 14.0_vp);
EXPECT_EQ(imageRenderProperty->GetSvgFillColor(), Color::RED);
}
/**
* @tc.name: SetCancelIconSymbolGlyphModofier001
* @tc.desc: Set cancel icon symbolGlyphModifier is not empty
* @tc.type: FUNC
*/
HWTEST_F(SearchTestNg, SetCancelIconSymbolGlyphModofier001, TestSize.Level1)
{
int32_t backupApiVersion = AceApplicationInfo::GetInstance().GetApiTargetVersion();
AceApplicationInfo::GetInstance().SetApiTargetVersion(static_cast<int32_t>(PlatformVersion::VERSION_TWELVE));
auto onApply = [](WeakPtr<NG::FrameNode> frameNode) {
auto node = frameNode.Upgrade();
EXPECT_NE(node, nullptr);
};
SearchModelNG searchModelInstance;
searchModelInstance.SetCancelSymbolIcon(onApply);
auto search = ViewStackProcessor::GetInstance()->GetMainFrameNode();
ASSERT_NE(search, nullptr);
auto pipeline = PipelineBase::GetCurrentContext();
ASSERT_NE(pipeline, nullptr);
auto searchTheme = pipeline->GetTheme<SearchTheme>();
ASSERT_NE(searchTheme, nullptr);
auto searchLayoutProperty = search->GetLayoutProperty<SearchLayoutProperty>();
ASSERT_NE(searchLayoutProperty, nullptr);
ASSERT_NE(searchLayoutProperty->GetCancelIconSymbol(), nullptr);
auto iconFrameNode = AceType::DynamicCast<FrameNode>(search->GetChildAtIndex(CANCEL_IMAGE_INDEX));
EXPECT_TRUE(iconFrameNode->GetTag() == V2::SYMBOL_ETS_TAG);
auto symbolLayoutProperty = iconFrameNode->GetLayoutProperty<TextLayoutProperty>();
ASSERT_NE(symbolLayoutProperty, nullptr);
const std::unique_ptr<FontStyle>& symbolStyle = symbolLayoutProperty->GetFontStyle();
ASSERT_NE(symbolStyle, nullptr);
EXPECT_EQ(symbolStyle->GetFontSize(), Dimension(16, DimensionUnit::FP));
std::vector<Color> color = { searchTheme->GetSymbolIconColor() };
EXPECT_EQ(symbolStyle->GetSymbolColorList(), color);
AceApplicationInfo::GetInstance().SetApiTargetVersion(static_cast<int32_t>(backupApiVersion));
}
/**
* @tc.name: SetSearchButtonFontSize001
* @tc.desc: Set search button font size and color
@ -1029,7 +1155,7 @@ HWTEST_F(SearchTestNg, Create001, TestSize.Level1)
ASSERT_NE(textFrameNode, nullptr);
auto searchIconFrameNode = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(IMAGE_INDEX));
ASSERT_NE(searchIconFrameNode, nullptr);
EXPECT_EQ(searchIconFrameNode->GetTag(), V2::IMAGE_ETS_TAG);
EXPECT_EQ(searchIconFrameNode->GetTag(), V2::SYMBOL_ETS_TAG);
auto cancelIconFrameNode = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(CANCEL_IMAGE_INDEX));
ASSERT_NE(cancelIconFrameNode, nullptr);
EXPECT_EQ(cancelIconFrameNode->GetTag(), V2::SYMBOL_ETS_TAG);