From e4e321f9ea10eecdd44f4612e097d34a11fe851a Mon Sep 17 00:00:00 2001 From: Zhang Jinyu Date: Thu, 6 Feb 2025 15:00:20 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E9=BD=90bindMenu=20modifier?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Zhang Jinyu --- .../ark_component/src/ArkClassDefine.ts | 14 ++++ .../ark_component/src/ArkComponent.ts | 20 ++++- .../engine/arkComponent.js | 29 +++++++- .../arkts_native_api_impl_bridge.cpp | 2 + .../arkts_native_common_bridge.cpp | 53 ++++++++++++++ .../nativeModule/arkts_native_common_bridge.h | 1 + .../declarative_frontend/jsview/js_popups.cpp | 73 ++++++++++--------- .../declarative_frontend/jsview/js_popups.h | 41 +++++++++++ 8 files changed, 196 insertions(+), 37 deletions(-) create mode 100644 frameworks/bridge/declarative_frontend/jsview/js_popups.h diff --git a/frameworks/bridge/declarative_frontend/ark_component/src/ArkClassDefine.ts b/frameworks/bridge/declarative_frontend/ark_component/src/ArkClassDefine.ts index 5c3628a30de..446dd1923ff 100644 --- a/frameworks/bridge/declarative_frontend/ark_component/src/ArkClassDefine.ts +++ b/frameworks/bridge/declarative_frontend/ark_component/src/ArkClassDefine.ts @@ -1331,6 +1331,20 @@ class ArkSymbolEffect { } } +class ArkBindMenu{ + content: Array | CustomBuilder | undefined; + options: MenuOptions | undefined; + + constructor() { + this.content = undefined; + this.options = undefined; + } + + isEqual(another: ArkBindMenu): boolean { + return (this.content === another.content && this.options === another.options); + } +} + class ArkTextBackGroundStyle { color: ResourceColor; radius: Dimension | BorderRadiuses; diff --git a/frameworks/bridge/declarative_frontend/ark_component/src/ArkComponent.ts b/frameworks/bridge/declarative_frontend/ark_component/src/ArkComponent.ts index a1960bcb50e..deb1a48768a 100644 --- a/frameworks/bridge/declarative_frontend/ark_component/src/ArkComponent.ts +++ b/frameworks/bridge/declarative_frontend/ark_component/src/ArkComponent.ts @@ -260,6 +260,20 @@ class BackgroundColorModifier extends ModifierWithKey { } } +class BindMenuModifier extends ModifierWithKey { + constructor(value: ArkBindMenu) { + super(value); + } + static identity: Symbol = Symbol('bindMenu'); + applyPeer(node: KNode, reset: boolean): void { + if (reset) { + getUINativeModule().common.resetBindMenu(node); + } else { + getUINativeModule().common.setBindMenu(node, this.value.content, this.value.options); + } + } +} + class WidthModifier extends ModifierWithKey { constructor(value: Length) { super(value); @@ -4706,7 +4720,11 @@ class ArkComponent implements CommonMethod { } bindMenu(content: Array | CustomBuilder, options?: MenuOptions): this { - throw new Error('Method not implemented.'); + let arkBindMenu = new ArkBindMenu(); + arkBindMenu.content = content; + arkBindMenu.options = options; + modifierWithKey(this._modifiersWithKeys, BindMenuModifier.identity, BindMenuModifier, arkBindMenu); + return this; } bindContextMenu(content: CustomBuilder, responseType: ResponseType, options?: ContextMenuOptions): this { diff --git a/frameworks/bridge/declarative_frontend/engine/arkComponent.js b/frameworks/bridge/declarative_frontend/engine/arkComponent.js index f88f138e212..c7bef7eef55 100755 --- a/frameworks/bridge/declarative_frontend/engine/arkComponent.js +++ b/frameworks/bridge/declarative_frontend/engine/arkComponent.js @@ -1430,6 +1430,20 @@ class GeometryTransitionModifier extends ModifierWithKey { } } GeometryTransitionModifier.identity = Symbol('geometryTransition'); +class BindMenuModifier extends ModifierWithKey { + constructor(value) { + super(value); + } + applyPeer(node, reset) { + if (reset) { + getUINativeModule().common.resetBindMenu(node); + } + else { + getUINativeModule().common.setBindMenu(node, this.value.content, this.value.options); + } + } +} +BindMenuModifier.identity = Symbol('bindMenu'); class BlendModeModifier extends ModifierWithKey { constructor(value) { super(value); @@ -4453,7 +4467,11 @@ class ArkComponent { throw new Error('Method not implemented.'); } bindMenu(content, options) { - throw new Error('Method not implemented.'); + let arkBindMenu = new ArkBindMenu(); + arkBindMenu.content = content; + arkBindMenu.options = options; + modifierWithKey(this._modifiersWithKeys, BindMenuModifier.identity, BindMenuModifier, arkBindMenu); + return this; } bindContextMenu(content, responseType, options) { throw new Error('Method not implemented.'); @@ -17831,6 +17849,15 @@ class ArkGeometryTransition { return (this.id === another.id && this.options === another.options); } } +class ArkBindMenu{ + constructor() { + this.content = undefined; + this.options = undefined; + } + isEqual(another) { + return (this.content === another.content && this.options === another.options); + } +} class ArkSymbolEffect { constructor() { this.symbolEffect = undefined; diff --git a/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_api_impl_bridge.cpp b/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_api_impl_bridge.cpp index 01dcd809068..b785698c631 100644 --- a/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_api_impl_bridge.cpp +++ b/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_api_impl_bridge.cpp @@ -618,6 +618,8 @@ ArkUINativeModuleValue ArkUINativeModule::GetArkUINativeModule(ArkUIRuntimeCallI panda::FunctionRef::New(const_cast(vm), CommonBridge::SetGeometryTransition)); common->Set(vm, panda::StringRef::NewFromUtf8(vm, "resetGeometryTransition"), panda::FunctionRef::New(const_cast(vm), CommonBridge::ResetGeometryTransition)); + common->Set(vm, panda::StringRef::NewFromUtf8(vm, "setBindMenu"), + panda::FunctionRef::New(const_cast(vm), CommonBridge::SetBindMenu)); common->Set(vm, panda::StringRef::NewFromUtf8(vm, "setClip"), panda::FunctionRef::New(const_cast(vm), CommonBridge::SetClip)); common->Set(vm, panda::StringRef::NewFromUtf8(vm, "resetClip"), diff --git a/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_common_bridge.cpp b/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_common_bridge.cpp index 61342099c65..ef125a7ef29 100644 --- a/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_common_bridge.cpp +++ b/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_common_bridge.cpp @@ -37,6 +37,7 @@ #include "bridge/declarative_frontend/jsview/js_view_abstract.h" #include "bridge/declarative_frontend/jsview/js_utils.h" #include "bridge/declarative_frontend/jsview/js_accessibility.h" +#include "bridge/declarative_frontend/jsview/js_popups.h" using namespace OHOS::Ace::Framework; namespace OHOS::Ace::NG { @@ -102,6 +103,8 @@ constexpr double HEIGHT_ASPECTRATIO_THRESHOLD2 = 1.2; enum class WidthBreakpoint {WIDTH_XS, WIDTH_SM, WIDTH_MD, WIDTH_LG, WIDTH_XL}; enum class HeightBreakpoint {HEIGHT_SM, HEIGHT_MD, HEIGHT_LG}; enum ParseResult { LENGTHMETRICS_SUCCESS, DIMENSION_SUCCESS, FAIL }; +constexpr int32_t PARAMETER_LENGTH_SECOND = 2; +constexpr int32_t PARAMETER_LENGTH_THIRD = 3; BorderStyle ConvertBorderStyle(int32_t value) { @@ -3438,6 +3441,56 @@ ArkUINativeModuleValue CommonBridge::ResetGeometryTransition(ArkUIRuntimeCallInf return panda::JSValueRef::Undefined(vm); } +ArkUINativeModuleValue CommonBridge::SetBindMenu(ArkUIRuntimeCallInfo* runtimeCallInfo) +{ + EcmaVM* vm = runtimeCallInfo->GetVM(); + CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr)); + Framework::JSCallbackInfo info = Framework::JSCallbackInfo(runtimeCallInfo); + NG::MenuParam menuParam; + if (Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_TEN)) { + menuParam.placement = Placement::BOTTOM_LEFT; + } + size_t builderIndex = NUM_1; + JSViewPopups::GetMenuShowInSubwindow(menuParam); + if (info.Length() > PARAMETER_LENGTH_SECOND) { + auto jsVal = info[builderIndex]; + if (jsVal->IsBoolean()) { + menuParam.isShow = jsVal->ToBoolean(); + menuParam.setShow = true; + builderIndex = NUM_2; + if (info.Length() > PARAMETER_LENGTH_THIRD) { + JSViewPopups::ParseBindOptionParam(info, menuParam, builderIndex + 1); + } + } else if (jsVal->IsUndefined()) { + menuParam.setShow = true; + menuParam.isShow = false; + builderIndex = NUM_2; + if (info.Length() > PARAMETER_LENGTH_THIRD) { + JSViewPopups::ParseBindOptionParam(info, menuParam, builderIndex + 1); + } + } else if (jsVal->IsObject()) { + JSRef callbackObj = JSRef::Cast(jsVal); + menuParam.onStateChange = JSViewPopups::ParseDoubleBindCallback(info, callbackObj, "$value"); + auto isShowObj = callbackObj->GetProperty(static_cast(ArkUIIndex::VALUE)); + if (isShowObj->IsBoolean()) { + menuParam.isShow = isShowObj->ToBoolean(); + menuParam.setShow = true; + builderIndex = NUM_2; + if (info.Length() > PARAMETER_LENGTH_THIRD) { + JSViewPopups::ParseBindOptionParam(info, menuParam, builderIndex + 1); + } + } else { + JSViewPopups::ParseBindOptionParam(info, menuParam, builderIndex + 1); + } + } + } + if (info[builderIndex]->IsArray()) { + std::vector optionsParam = JSViewPopups::ParseBindOptionParam(info, builderIndex); + ViewAbstractModel::GetInstance()->BindMenu(std::move(optionsParam), nullptr, menuParam); + } + return panda::JSValueRef::Undefined(vm); +} + ArkUINativeModuleValue CommonBridge::ResetClip(ArkUIRuntimeCallInfo *runtimeCallInfo) { EcmaVM *vm = runtimeCallInfo->GetVM(); diff --git a/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_common_bridge.h b/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_common_bridge.h index 2a1189bffd2..1581cc0e169 100644 --- a/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_common_bridge.h +++ b/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_common_bridge.h @@ -398,6 +398,7 @@ public: static ArkUINativeModuleValue ResetFocusBox(ArkUIRuntimeCallInfo* runtimeCallInfo); static ArkUINativeModuleValue SetNextFocus(ArkUIRuntimeCallInfo* runtimeCallInfo); static ArkUINativeModuleValue ResetNextFocus(ArkUIRuntimeCallInfo* runtimeCallInfo); + static ArkUINativeModuleValue SetBindMenu(ArkUIRuntimeCallInfo* runtimeCallInfo); static Local CreateFocusAxisEventInfo(EcmaVM* vm, NG::FocusAxisEventInfo& info); static ArkUINativeModuleValue SetOnFocusAxisEvent(ArkUIRuntimeCallInfo* runtimeCallInfo); static ArkUINativeModuleValue ResetOnFocusAxisEvent(ArkUIRuntimeCallInfo* runtimeCallInfo); diff --git a/frameworks/bridge/declarative_frontend/jsview/js_popups.cpp b/frameworks/bridge/declarative_frontend/jsview/js_popups.cpp index ff3008b3667..b377f1f6af1 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_popups.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/js_popups.cpp @@ -25,6 +25,8 @@ #include "core/components_ng/base/view_abstract_model_ng.h" #include "core/components_ng/base/view_stack_model.h" +#include "bridge/declarative_frontend/jsview/js_popups.h" + namespace OHOS::Ace::Framework { namespace { constexpr int32_t PARAMETER_LENGTH_ZERO = 0; @@ -52,7 +54,7 @@ const std::vector HOVER_MODE_AREA_TYPE = { HoverModeAreaType: using DoubleBindCallback = std::function; #ifndef WEARABLE_PRODUCT -DoubleBindCallback ParseDoubleBindCallback(const JSCallbackInfo& info, const JSRef& callbackObj, +DoubleBindCallback JSViewPopups::ParseDoubleBindCallback(const JSCallbackInfo& info, const JSRef& callbackObj, const char* arrowFuncName) { JSRef arrowFunc = callbackObj->GetProperty(arrowFuncName); @@ -541,7 +543,7 @@ uint32_t ParseBindContextMenuShow(const JSCallbackInfo& info, NG::MenuParam& men builderIndex = 1; } else if (info[0]->IsObject()) { JSRef callbackObj = JSRef::Cast(info[0]); - menuParam.onStateChange = ParseDoubleBindCallback(info, callbackObj, "$value"); + menuParam.onStateChange = JSViewPopups::ParseDoubleBindCallback(info, callbackObj, "$value"); auto isShowObj = callbackObj->GetProperty("value"); if (isShowObj->IsBoolean()) { menuParam.isShow = isShowObj->ToBoolean(); @@ -607,7 +609,7 @@ void JSViewAbstract::ParseOverlayCallback(const JSRef& paramObj, std:: } } -std::vector ParseBindOptionParam(const JSCallbackInfo& info, size_t optionIndex) +std::vector JSViewPopups::ParseBindOptionParam(const JSCallbackInfo& info, size_t optionIndex) { JSRef arg = info[optionIndex]; if (!arg->IsArray()) { @@ -657,7 +659,7 @@ std::vector ParseBindOptionParam(const JSCallbackInfo& info, si return params; } -void ParseMenuBorderRadius(const JSRef& menuOptions, NG::MenuParam& menuParam) +void JSViewPopups::ParseMenuBorderRadius(const JSRef& menuOptions, NG::MenuParam& menuParam) { auto borderRadiusValue = menuOptions->GetProperty(static_cast(ArkUIIndex::BORDER_RADIUS)); NG::BorderRadiusProperty menuBorderRadius; @@ -698,7 +700,7 @@ void ParseMenuBorderRadius(const JSRef& menuOptions, NG::MenuParam& me } } -void ParseMenuArrowParam(const JSRef& menuOptions, NG::MenuParam& menuParam) +void JSViewPopups::ParseMenuArrowParam(const JSRef& menuOptions, NG::MenuParam& menuParam) { auto enableArrowValue = menuOptions->GetProperty("enableArrow"); if (enableArrowValue->IsBoolean()) { @@ -717,7 +719,7 @@ void ParseMenuArrowParam(const JSRef& menuOptions, NG::MenuParam& menu } } -void ParseLayoutRegionMargin(const JSRef& jsValue, std::optional& calcDimension) +void JSViewPopups::ParseLayoutRegionMargin(const JSRef& jsValue, std::optional& calcDimension) { CalcDimension dimension; if (!JSViewAbstract::ParseJsDimensionVpNG(jsValue, dimension, true)) { @@ -729,7 +731,7 @@ void ParseLayoutRegionMargin(const JSRef& jsValue, std::optional& menuOptions, NG::MenuParam& menuParam) +void JSViewPopups::ParseMenuLayoutRegionMarginParam(const JSRef& menuOptions, NG::MenuParam& menuParam) { auto marginVal = menuOptions->GetProperty("layoutRegionMargin"); if (!marginVal->IsObject()) { @@ -738,10 +740,10 @@ void ParseMenuLayoutRegionMarginParam(const JSRef& menuOptions, NG::Me CommonCalcDimension commonCalcDimension; auto object = JSRef::Cast(marginVal); - ParseLayoutRegionMargin(object->GetProperty("top"), commonCalcDimension.top); - ParseLayoutRegionMargin(object->GetProperty("bottom"), commonCalcDimension.bottom); - ParseLayoutRegionMargin(object->GetProperty("left"), commonCalcDimension.left); - ParseLayoutRegionMargin(object->GetProperty("right"), commonCalcDimension.right); + JSViewPopups::ParseLayoutRegionMargin(object->GetProperty("top"), commonCalcDimension.top); + JSViewPopups::ParseLayoutRegionMargin(object->GetProperty("bottom"), commonCalcDimension.bottom); + JSViewPopups::ParseLayoutRegionMargin(object->GetProperty("left"), commonCalcDimension.left); + JSViewPopups::ParseLayoutRegionMargin(object->GetProperty("right"), commonCalcDimension.right); if (commonCalcDimension.left.has_value() || commonCalcDimension.right.has_value() || commonCalcDimension.top.has_value() || commonCalcDimension.bottom.has_value()) { @@ -750,7 +752,7 @@ void ParseMenuLayoutRegionMarginParam(const JSRef& menuOptions, NG::Me } } -void ParseMenuBlurStyleOption(const JSRef& menuOptions, NG::MenuParam& menuParam) +void JSViewPopups::ParseMenuBlurStyleOption(const JSRef& menuOptions, NG::MenuParam& menuParam) { auto blurStyle = menuOptions->GetProperty("backgroundBlurStyleOptions"); if (blurStyle->IsObject()) { @@ -761,7 +763,7 @@ void ParseMenuBlurStyleOption(const JSRef& menuOptions, NG::MenuParam& } } -void ParseMenuEffectOption(const JSRef& menuOptions, NG::MenuParam& menuParam) +void JSViewPopups::ParseMenuEffectOption(const JSRef& menuOptions, NG::MenuParam& menuParam) { auto effectOption = menuOptions->GetProperty("backgroundEffect"); if (effectOption->IsObject()) { @@ -772,7 +774,7 @@ void ParseMenuEffectOption(const JSRef& menuOptions, NG::MenuParam& me } } -void GetMenuShowInSubwindow(NG::MenuParam& menuParam) +void JSViewPopups::GetMenuShowInSubwindow(NG::MenuParam& menuParam) { menuParam.isShowInSubWindow = false; auto pipeline = PipelineBase::GetCurrentContext(); @@ -782,7 +784,8 @@ void GetMenuShowInSubwindow(NG::MenuParam& menuParam) menuParam.isShowInSubWindow = theme->GetExpandDisplay(); } -void ParseMenuParam(const JSCallbackInfo& info, const JSRef& menuOptions, NG::MenuParam& menuParam) +void JSViewPopups::ParseMenuParam( + const JSCallbackInfo& info, const JSRef& menuOptions, NG::MenuParam& menuParam) { auto offsetVal = menuOptions->GetProperty("offset"); if (offsetVal->IsObject()) { @@ -890,27 +893,27 @@ void ParseMenuParam(const JSCallbackInfo& info, const JSRef& menuOptio } JSRef showInSubWindowValue = menuOptions->GetProperty("showInSubWindow"); - GetMenuShowInSubwindow(menuParam); + JSViewPopups::GetMenuShowInSubwindow(menuParam); if (menuParam.isShowInSubWindow) { if (showInSubWindowValue->IsBoolean()) { menuParam.isShowInSubWindow = showInSubWindowValue->ToBoolean(); } } - ParseMenuArrowParam(menuOptions, menuParam); - ParseMenuBorderRadius(menuOptions, menuParam); - ParseMenuLayoutRegionMarginParam(menuOptions, menuParam); - ParseMenuBlurStyleOption(menuOptions, menuParam); - ParseMenuEffectOption(menuOptions, menuParam); + JSViewPopups::ParseMenuArrowParam(menuOptions, menuParam); + JSViewPopups::ParseMenuBorderRadius(menuOptions, menuParam); + JSViewPopups::ParseMenuLayoutRegionMarginParam(menuOptions, menuParam); + JSViewPopups::ParseMenuBlurStyleOption(menuOptions, menuParam); + JSViewPopups::ParseMenuEffectOption(menuOptions, menuParam); } -void ParseBindOptionParam(const JSCallbackInfo& info, NG::MenuParam& menuParam, size_t optionIndex) +void JSViewPopups::ParseBindOptionParam(const JSCallbackInfo& info, NG::MenuParam& menuParam, size_t optionIndex) { if (!info[optionIndex]->IsObject()) { return; } auto menuOptions = JSRef::Cast(info[optionIndex]); JSViewAbstract::ParseJsString(menuOptions->GetProperty("title"), menuParam.title); - ParseMenuParam(info, menuOptions, menuParam); + JSViewPopups::ParseMenuParam(info, menuOptions, menuParam); } void ParseAnimationScaleArray(const JSRef& scaleArray, MenuPreviewAnimationOptions& options) @@ -986,7 +989,7 @@ void ParseBindContentOptionParam(const JSCallbackInfo& info, const JSRef& return; } auto menuContentOptions = JSRef::Cast(args); - ParseMenuParam(info, menuContentOptions, menuParam); + JSViewPopups::ParseMenuParam(info, menuContentOptions, menuParam); RefPtr previewBuilderFunc; auto preview = menuContentOptions->GetProperty("preview"); if (!preview->IsFunction() && !preview->IsNumber()) { @@ -1031,7 +1034,7 @@ void JSViewAbstract::JsBindPopup(const JSCallbackInfo& info) popupParam->SetIsShow(info[NUM_ZERO]->ToBoolean()); } else { JSRef showObj = JSRef::Cast(info[NUM_ZERO]); - auto callback = ParseDoubleBindCallback(info, showObj, "$value"); + auto callback = JSViewPopups::ParseDoubleBindCallback(info, showObj, "$value"); popupParam->SetDoubleBindCallback(std::move(callback)); popupParam->SetIsShow(showObj->GetProperty("value")->ToBoolean()); } @@ -1312,10 +1315,10 @@ bool JSViewAbstract::ParseSheetIsShow(const JSCallbackInfo& info, const std::str JSRef callbackObj = JSRef::Cast(info[0]); auto isShowObj = callbackObj->GetProperty("value"); isShow = isShowObj->IsBoolean() ? isShowObj->ToBoolean() : false; - callback = ParseDoubleBindCallback(info, callbackObj, "changeEvent"); + callback = JSViewPopups::ParseDoubleBindCallback(info, callbackObj, "changeEvent"); if (!callback && Container::GreatOrEqualAPITargetVersion(PlatformVersion::VERSION_SIXTEEN)) { TAG_LOGD(AceLogTag::ACE_SHEET, "Try %{public}s another parsing", name.c_str()); - callback = ParseDoubleBindCallback(info, callbackObj, "$value"); + callback = JSViewPopups::ParseDoubleBindCallback(info, callbackObj, "$value"); } } TAG_LOGD(AceLogTag::ACE_SHEET, "%{public}s get isShow is: %{public}d", name.c_str(), isShow); @@ -1862,7 +1865,7 @@ void JSViewAbstract::JsBindMenu(const JSCallbackInfo& info) NG::MenuParam menuParam; MenuDefaultParam(menuParam); size_t builderIndex = 0; - GetMenuShowInSubwindow(menuParam); + JSViewPopups::GetMenuShowInSubwindow(menuParam); if (info.Length() > PARAMETER_LENGTH_FIRST) { auto jsVal = info[0]; if (jsVal->IsBoolean()) { @@ -1870,35 +1873,35 @@ void JSViewAbstract::JsBindMenu(const JSCallbackInfo& info) menuParam.setShow = true; builderIndex = 1; if (info.Length() > PARAMETER_LENGTH_SECOND) { - ParseBindOptionParam(info, menuParam, builderIndex + 1); + JSViewPopups::ParseBindOptionParam(info, menuParam, builderIndex + 1); } } else if (jsVal->IsUndefined()) { menuParam.setShow = true; menuParam.isShow = false; builderIndex = 1; if (info.Length() > PARAMETER_LENGTH_SECOND) { - ParseBindOptionParam(info, menuParam, builderIndex + 1); + JSViewPopups::ParseBindOptionParam(info, menuParam, builderIndex + 1); } } else if (jsVal->IsObject()) { JSRef callbackObj = JSRef::Cast(jsVal); - menuParam.onStateChange = ParseDoubleBindCallback(info, callbackObj, "$value"); + menuParam.onStateChange = JSViewPopups::ParseDoubleBindCallback(info, callbackObj, "$value"); auto isShowObj = callbackObj->GetProperty(static_cast(ArkUIIndex::VALUE)); if (isShowObj->IsBoolean()) { menuParam.isShow = isShowObj->ToBoolean(); menuParam.setShow = true; builderIndex = 1; if (info.Length() > PARAMETER_LENGTH_SECOND) { - ParseBindOptionParam(info, menuParam, builderIndex + 1); + JSViewPopups::ParseBindOptionParam(info, menuParam, builderIndex + 1); } } else { builderIndex = 0; - ParseBindOptionParam(info, menuParam, builderIndex + 1); + JSViewPopups::ParseBindOptionParam(info, menuParam, builderIndex + 1); } } } if (info[builderIndex]->IsArray()) { - std::vector optionsParam = ParseBindOptionParam(info, builderIndex); + std::vector optionsParam = JSViewPopups::ParseBindOptionParam(info, builderIndex); ViewAbstractModel::GetInstance()->BindMenu(std::move(optionsParam), nullptr, menuParam); } else if (info[builderIndex]->IsObject()) { // CustomBuilder @@ -1935,7 +1938,7 @@ void JSViewAbstract::ParseContentMenuCommonParam( MenuDefaultParam(menuParam); } CHECK_EQUAL_VOID(menuObj->IsEmpty(), true); - ParseMenuParam(info, menuObj, menuParam); + JSViewPopups::ParseMenuParam(info, menuObj, menuParam); auto preview = menuObj->GetProperty("preview"); if (preview->IsNumber()) { auto previewMode = preview->ToNumber(); diff --git a/frameworks/bridge/declarative_frontend/jsview/js_popups.h b/frameworks/bridge/declarative_frontend/jsview/js_popups.h new file mode 100644 index 00000000000..094c5865432 --- /dev/null +++ b/frameworks/bridge/declarative_frontend/jsview/js_popups.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_JS_VIEW_JS_POPUPS_H +#define FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_JS_VIEW_JS_POPUPS_H +#include "base/utils/utils.h" +#include "bridge/declarative_frontend/jsview/js_view_abstract.h" +namespace OHOS::Ace::Framework { +class JSViewPopups { +public: + using DoubleBindCallback = std::function; +#ifndef WEARABLE_PRODUCT + static DoubleBindCallback ParseDoubleBindCallback( + const JSCallbackInfo& info, const JSRef& callbackObj, const char* arrowFuncName); +#endif + static std::vector ParseBindOptionParam(const JSCallbackInfo& info, size_t optionIndex); + static void GetMenuShowInSubwindow(NG::MenuParam& menuParam); + static void ParseMenuArrowParam(const JSRef& menuOptions, NG::MenuParam& menuParam); + static void ParseLayoutRegionMargin(const JSRef& jsValue, std::optional& calcDimension); + static void ParseMenuLayoutRegionMarginParam(const JSRef& menuOptions, NG::MenuParam& menuParam); + static void ParseMenuBlurStyleOption(const JSRef& menuOptions, NG::MenuParam& menuParam); + static void ParseMenuBorderRadius(const JSRef& menuOptions, NG::MenuParam& menuParam); + static void ParseMenuEffectOption(const JSRef& menuOptions, NG::MenuParam& menuParam); + static void ParseMenuParam( + const JSCallbackInfo& info, const JSRef& menuOptions, NG::MenuParam& menuParam); + static void ParseBindOptionParam(const JSCallbackInfo& info, NG::MenuParam& menuParam, size_t optionIndex); +}; +} // namespace OHOS::Ace::Framework + +#endif // FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_JS_VIEW_JS_POPUPS_H \ No newline at end of file -- Gitee