diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/CommonMethodModifier.ts b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/CommonMethodModifier.ts index 9fb76b830b47ebaef8bf16382e303b0d416903e2..3ab55d8baf2d831e25f67144b39e78ab821d964b 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/CommonMethodModifier.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/CommonMethodModifier.ts @@ -30,6 +30,7 @@ import { ResourceStr } from './component/units' import { PixelMap } from '#external' import { hookModifierBackgroundImageImpl } from './handwritten/ArkBackgroundImageImpl' import { hookCustomPropertyImpl } from "./handwritten/CommonHandWritten" +import { BorderRadiuses, LocalizedBorderRadiuses } from "./component/units" export enum AttributeUpdaterFlag { INITIAL = 0, @@ -195,6 +196,9 @@ export class CommonMethodModifier implements CommonMethod { _customProperty_flag: AttributeUpdaterFlag = AttributeUpdaterFlag.INITIAL _customPropertyMap?: Map + _borderRadius_flag: AttributeUpdaterFlag = AttributeUpdaterFlag.INITIAL + _borderRadius_value?: Length | BorderRadiuses | LocalizedBorderRadiuses | undefined + public width(value: Length | LayoutPolicy | undefined): this { if (this._width_flag === AttributeUpdaterFlag.INITIAL || this._width0_value !== value || !Type.of(value).isPrimitive()) { this._width0_value = value @@ -653,6 +657,15 @@ export class CommonMethodModifier implements CommonMethod { this._customPropertyMap!.set(name, value); this._customProperty_flag = AttributeUpdaterFlag.UPDATE; return this; + } + public borderRadius(value: Length | BorderRadiuses | LocalizedBorderRadiuses | undefined): this { + if (this._borderRadius_flag === AttributeUpdaterFlag.INITIAL || this._borderRadius_value !== value) { + this._borderRadius_value = value + this._borderRadius_flag = AttributeUpdaterFlag.UPDATE + } else { + this._borderRadius_flag = AttributeUpdaterFlag.SKIP + } + return this } applyModifierPatch(node: PeerNode): void { const peerNode: ArkCommonMethodPeer = node as ArkCommonMethodPeer @@ -1517,6 +1530,23 @@ export class CommonMethodModifier implements CommonMethod { } } } + if (this._borderRadius_flag !== AttributeUpdaterFlag.INITIAL) { + switch (this._borderRadius_flag) { + case AttributeUpdaterFlag.UPDATE: { + peerNode.borderRadiusAttribute(this._borderRadius_value) + this._borderRadius_flag = AttributeUpdaterFlag.RESET + break; + } + case AttributeUpdaterFlag.SKIP: { + this._borderRadius_flag = AttributeUpdaterFlag.RESET + break; + } + default: { + this._borderRadius_flag = AttributeUpdaterFlag.INITIAL + peerNode.borderRadiusAttribute(undefined) + } + } + } } mergeModifier(value: CommonMethodModifier): void { if (value._width_flag != AttributeUpdaterFlag.INITIAL) { @@ -2138,5 +2168,17 @@ if (value._backgroundImage_flag != AttributeUpdaterFlag.INITIAL) { } } } + if (value._borderRadius_flag !== AttributeUpdaterFlag.INITIAL) { + switch (value._borderRadius_flag) { + case AttributeUpdaterFlag.UPDATE: + case AttributeUpdaterFlag.SKIP: { + this.borderRadius(value._borderRadius_value) + break; + } + default: { + this.borderRadius(undefined) + } + } + } } } \ No newline at end of file diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ImageModifier.ts b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ImageModifier.ts index d2915b7907cdc151f7a58210e6b207e3f2f036d2..c94e5c8c8a0c9c4adf1f12f230d05814ccf49594 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ImageModifier.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ImageModifier.ts @@ -96,6 +96,9 @@ export class ImageModifier extends CommonMethodModifier implements ImageAttribut applyModifierPatch(peer: ArkImagePeer): void { super.applyModifierPatch(peer) } + mergeModifier(modifier: ImageModifier): void { + super.mergeModifier(modifier) + } alt(value: string | Resource | PixelMap | undefined): this { if (((this._alt_0_flag) == (AttributeUpdaterFlag.INITIAL)) || (true)) { this._alt_0_flag = AttributeUpdaterFlag.UPDATE diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/arkts/ArkUIAniModule.ts b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/arkts/ArkUIAniModule.ts index 297a248ec92ff44203b830ae61b9b351e3d2e575..4b206086029339e01097a607bd6269ad89c0cdfc 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/arkts/ArkUIAniModule.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/arkts/ArkUIAniModule.ts @@ -21,7 +21,7 @@ import common from "@ohos.app.ability.common" import unifiedDataChannel from "@ohos.data.unifiedDataChannel" import { LocalStorage } from '@ohos.arkui.stateManagement'; import { DrawContext } from "arkui/Graphics" -import { AnimatableArithmetic, DrawModifier, AsyncCallback, Callback, DragItemInfo, ResourceColor } from "arkui/component" +import { AnimatableArithmetic, DrawModifier, AsyncCallback, Callback, DragItemInfo, ResourceColor, DragPreviewOptions, DragInteractionOptions } from "arkui/component" import { ArkCustomComponent } from "arkui/ArkCustomComponent" import { WaterFlowOptions, WaterFlowSections, XComponentControllerCallbackInternal, OverlayOptions } from "arkui/component" import { ChildrenMainSize, PageTransitionOptions, PageTransitionCallback, SlideEffect, ScaleOptions, TranslateOptions } from "arkui/component" @@ -134,6 +134,7 @@ export class ArkUIAniModule { native static _Drag_Set_AllowDrop_Null(ptr: KLong) : void native static _Drag_Set_AllowDrop(ptr: KPointer, thisArray: Array, thisLength: KInt): void native static _Drag_Set_DragPreview(ptr: KPointer, dragInfo: HookDragInfo): void + native static _Drag_Set_DragPreviewOptions(ptr: KPointer, value: DragPreviewOptions | undefined, options?: DragInteractionOptions): void native static _createDragEventAccessorWithPointer(input: KPointer) : KPointer native static _getDragEventPointer(input: KPointer): KPointer diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/dragController/drag_controller_module.cpp b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/dragController/drag_controller_module.cpp index 5283d0cf3aa1e444db4391fb9342a7de1c56533e..28f76c2a039e6cf31e82a6b63edd083a0b051119 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/dragController/drag_controller_module.cpp +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/dragController/drag_controller_module.cpp @@ -13,6 +13,7 @@ * limitations under the License. */ #include "drag_controller_module.h" +#include "drag_and_drop/native_drag_drop_global.h" #include "load.h" #include "log/log.h" #include "pixel_map_taihe_ani.h" @@ -577,125 +578,6 @@ bool CheckAndParseFirstParams(ani_env* env, ArkUIDragControllerAsync& asyncCtx, return ParseDragItemInfoParam(env, asyncCtx, dragItemInfo); } -bool SetDragPreviewOptionMode( - ani_env* env, ArkUIDragControllerAsync& asyncCtx, ani_object dragPreviewMode, bool& isAuto) -{ - if (isAuto) { - return true; - } - ani_int dragPreviewModeAni; - ani_status status = ANI_OK; - if ((status = env->EnumItem_GetValue_Int(static_cast(dragPreviewMode), &dragPreviewModeAni)) != - ANI_OK) { - HILOGE("AceDrag, get dragPreviewMode enum failed. status = %{public}d", status); - return false; - } - auto mode = static_cast(dragPreviewModeAni); - switch (mode) { - case NG::DragPreviewMode::AUTO: - asyncCtx.dragPreviewOption.ResetDragPreviewMode(); - isAuto = true; - break; - case NG::DragPreviewMode::DISABLE_SCALE: - asyncCtx.dragPreviewOption.isScaleEnabled = false; - break; - case NG::DragPreviewMode::ENABLE_DEFAULT_SHADOW: - asyncCtx.dragPreviewOption.isDefaultShadowEnabled = true; - break; - case NG::DragPreviewMode::ENABLE_DEFAULT_RADIUS: - asyncCtx.dragPreviewOption.isDefaultRadiusEnabled = true; - break; - default: - HILOGW("AceDrag, invalid dragPreviewMode value: %{public}d", mode); - break; - } - return true; -} - -bool ParseNumberBadge(ani_env* env, ArkUIDragControllerAsync& asyncCtx, ani_object numberBadgeAni) -{ - ani_status status = ANI_OK; - if (AniUtils::IsClassObject(env, numberBadgeAni, "Lstd/core/Boolean;")) { - asyncCtx.dragPreviewOption.isNumber = false; - ani_boolean aniValue; - if (env->Object_CallMethodByName_Boolean(numberBadgeAni, "unboxed", nullptr, &aniValue) == ANI_OK) { - asyncCtx.dragPreviewOption.isShowBadge = static_cast(aniValue); - } - } else if (AniUtils::IsClassObject(env, numberBadgeAni, "Lstd/core/Numeric;")) { - ani_double numberValue; - if ((status = env->Object_CallMethodByName_Double( - static_cast(numberBadgeAni), "unboxed", ":D", &numberValue)) != ANI_OK) { - HILOGE("AceDrag, Object_CallMethodByName_Double failed. status = %{public}d", status); - } - auto number = static_cast(numberValue); - if (number < 0 || number > INT_MAX) { - asyncCtx.dragPreviewOption.isNumber = false; - asyncCtx.dragPreviewOption.isShowBadge = true; - } else { - asyncCtx.dragPreviewOption.isNumber = true; - asyncCtx.dragPreviewOption.badgeNumber = static_cast(number); - } - } else if (!AniUtils::IsUndefined(env, numberBadgeAni)) { - HILOGE("AceDrag, numberBadge type is wrong."); - return false; - } - return true; -} - -bool ParseModifier(ani_env* env, ArkUIDragControllerAsync& asyncCtx, ani_object modifierObj) -{ - if (AniUtils::IsUndefined(env, modifierObj)) { - return true; - } - - ani_ref modifierFunc; - if (ANI_OK != env->Object_GetPropertyByName_Ref(modifierObj, "applyImageModifierToNode", &modifierFunc)) { - return false; - } - // modifierFunc may have two args - if (!AniUtils::IsClassObject(env, modifierFunc, "Lstd/core/Function2;")) { - HILOGE("AceDrag, applyImageModifierToNode is not a function object."); - return false; - } - //to do imageModifier - return true; -} - -bool ParseDragPreviewMode(ani_env* env, ArkUIDragControllerAsync& asyncCtx, ani_object previewModeObj) -{ - if (AniUtils::IsUndefined(env, previewModeObj)) { - return true; - } - bool isAuto = false; - if (AniUtils::IsClassObject(env, previewModeObj, "Lescompat/Array;")) { - ani_double lengthAni; - if (ANI_OK != env->Object_GetPropertyByName_Double(previewModeObj, "length", &lengthAni)) { - HILOGE("AceDrag, Object_GetPropertyByName_Double failed."); - return false; - } - int32_t lengthInt = static_cast(lengthAni); - for (int32_t i = 0; i < lengthInt; i++) { - ani_ref modeRef; - if (ANI_OK != env->Object_CallMethodByName_Ref( - previewModeObj, "$_get", "I:Lstd/core/Object;", &modeRef, (ani_int)i)) { - HILOGE("AceDrag, Object_CallMethodByName_Ref failed."); - return false; - } - if (AniUtils::IsUndefined(env, static_cast(modeRef))) { - continue; - } - if (!SetDragPreviewOptionMode(env, asyncCtx, static_cast(modeRef), isAuto)) { - HILOGE("AceDrag, SetDragPreviewOptionMode failed."); - return false; - } - } - } else if (!SetDragPreviewOptionMode(env, asyncCtx, previewModeObj, isAuto)) { - HILOGE("AceDrag, SetDragPreviewOptionMode failed."); - return false; - } - return true; -} - bool ParsePreviewOptions(ani_env* env, ArkUIDragControllerAsync& asyncCtx, ani_object previewOptions) { CHECK_NULL_RETURN(env, false); @@ -705,32 +587,20 @@ bool ParsePreviewOptions(ani_env* env, ArkUIDragControllerAsync& asyncCtx, ani_o asyncCtx.dragPreviewOption.isNumber = false; asyncCtx.dragPreviewOption.isShowBadge = true; - ani_ref modeAni; - ani_ref numberBadgeAni; - ani_ref modifierAni; - if (ANI_OK != env->Object_GetPropertyByName_Ref(previewOptions, "mode", &modeAni)) { - HILOGE("AceDrag, get mode parameter failed."); - return false; - } - if (ANI_OK != env->Object_GetPropertyByName_Ref(previewOptions, "numberBadge", &numberBadgeAni)) { - HILOGE("AceDrag, get numberBadge parameter failed."); + if (!ParseDragPreviewMode(env, asyncCtx.dragPreviewOption, previewOptions)) { + HILOGE("AceDrag, Parse DragPreviewMode failed."); return false; } - if (ANI_OK != env->Object_GetPropertyByName_Ref(previewOptions, "modifier", &modifierAni)) { - HILOGE("AceDrag, get modifier parameter failed."); - return false; - } - - if (!ParseDragPreviewMode(env, asyncCtx, static_cast(modeAni))) { - HILOGE("AceDrag, parse mode parameter failed."); + if (!ParseDragPreviewModifier(env, asyncCtx.dragPreviewOption, previewOptions)) { + HILOGE("AceDrag, Parse DragPreviewModifier failed."); return false; } - if (!ParseNumberBadge(env, asyncCtx, static_cast(numberBadgeAni))) { - HILOGE("AceDrag, parse numberBadge parameter failed."); + if (!ParseNumberBadge(env, asyncCtx.dragPreviewOption, previewOptions)) { + HILOGE("AceDrag, Parse NumberBadge failed."); return false; } - if (!ParseModifier(env, asyncCtx, static_cast(modifierAni))) { - HILOGE("AceDrag, parse modifier parameter failed."); + if (!ParseSizeChangeEffect(env, asyncCtx.dragPreviewOption, previewOptions)) { + HILOGE("AceDrag, Parse SizeChangeEffect failed."); return false; } return true; diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/drag_and_drop/native_drag_drop_global.cpp b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/drag_and_drop/native_drag_drop_global.cpp index 57253ed28f1aec4b08e9e4fdbc0abb6853f1ba4b..d55ebe02ba5ac39592f2b84a3c71dc1e677f1638 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/drag_and_drop/native_drag_drop_global.cpp +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/drag_and_drop/native_drag_drop_global.cpp @@ -14,6 +14,8 @@ */ #include "native_drag_drop_global.h" +#include +#include #include "utils/ani_utils.h" #include "log/log.h" @@ -26,6 +28,15 @@ #include "udmf_async_client.h" namespace OHOS::Ace::Ani { +namespace { +constexpr int NUM_1 = 1; +constexpr int NUM_2 = 2; +constexpr int NUM_3 = 3; +constexpr int NUM_4 = 4; +constexpr int NUM_5 = 5; +constexpr int NUM_6 = 6; +constexpr int NUM_7 = 7; +} void DragEventSetData([[maybe_unused]] ani_env* env, [[maybe_unused]] ani_object object, [[maybe_unused]] ani_long pointer, [[maybe_unused]] ani_object data) { @@ -268,4 +279,301 @@ void DragSetDragPreview([[maybe_unused]] ani_env* env, [[maybe_unused]] ani_obje } modifier->getDragAniModifier()->setDragPreview(frameNode, info); } + +ani_object CreateImagePeer(ani_env* env, void* ptr) +{ + CHECK_NULL_RETURN(env, nullptr); + CHECK_NULL_RETURN(ptr, nullptr); + static const char* className = "Larkui/component/image/ArkImagePeer;"; + ani_status status; + ani_class cls; + status = env->FindClass(className, &cls); + if (ANI_OK != status) { + HILOGE("AceDrag: find class ArkImagePeer failed status = %{public}d", static_cast(status)); + return nullptr; + } + ani_ref imagePeer; + status = env->Class_CallStaticMethodByName_Ref(cls, "createImagePeerFromPtr", + "J:Larkui/component/image/ArkImagePeer;", &imagePeer, reinterpret_cast(ptr)); + if (ANI_OK != status) { + HILOGE("AceDrag: create ArkImagePeer failed status = %{public}d", static_cast(status)); + return nullptr; + } + return static_cast(imagePeer); +} + +ani_object CreateImageModifier(ani_env* env) +{ + CHECK_NULL_RETURN(env, nullptr); + static const char* className = "Larkui/ImageModifier/ImageModifier;"; + ani_class cls; + ani_status status = env->FindClass(className, &cls); + if (ANI_OK != status) { + HILOGE("AceDrag: FindClass ImageModifier failed status = %{public}d", static_cast(status)); + return nullptr; + } + ani_method method; + status = env->Class_FindMethod(cls, "", ":V", &method); + if (ANI_OK != status) { + HILOGE("AceDrag: Find ImageModifier constructor failed status = %{public}d", static_cast(status)); + return nullptr; + } + ani_object imageModifier; + status = env->Object_New(cls, method, &imageModifier); + if (ANI_OK != status) { + HILOGE("AceDrag: Create ImageModifier failed status = %{public}d", static_cast(status)); + return nullptr; + } + return imageModifier; +} + +bool ParsePreviewOptionMode( + ani_env* env, ArkUIDragPreviewOption& previewOptions, ani_object dragPreviewMode, bool& isAuto) +{ + CHECK_NULL_RETURN(env, false); + if (isAuto) { + return true; + } + ani_int dragPreviewModeAni; + if ((ANI_OK != env->EnumItem_GetValue_Int(static_cast(dragPreviewMode), &dragPreviewModeAni))) { + return false; + } + auto mode = static_cast(dragPreviewModeAni); + switch (mode) { + case NUM_1: + previewOptions.ResetDragPreviewMode(); + isAuto = true; + break; + case NUM_2: + previewOptions.isScaleEnabled = false; + break; + case NUM_3: + previewOptions.isDefaultShadowEnabled = true; + break; + case NUM_4: + previewOptions.isDefaultRadiusEnabled = true; + break; + case NUM_5: + previewOptions.isDefaultDragItemGrayEffectEnabled = true; + break; + case NUM_6: + previewOptions.isMultiTiled = true; + break; + case NUM_7: + previewOptions.isTouchPointCalculationBasedOnFinalPreviewEnable = true; + break; + default: + break; + } + return true; +} + +bool ParseDragPreviewMode(ani_env* env, ArkUIDragPreviewOption& previewOptions, ani_object value) +{ + CHECK_NULL_RETURN(env, false); + ani_ref modeAni; + if (ANI_OK != env->Object_GetPropertyByName_Ref(value, "mode", &modeAni)) { + return false; + } + ani_object modeObj = static_cast(modeAni); + if (AniUtils::IsUndefined(env, modeObj)) { + return true; + } + bool isAuto = false; + if (AniUtils::IsClassObject(env, modeObj, "Lescompat/Array;")) { + ani_size length; + ani_array arrayObj = static_cast(modeObj); + if (ANI_OK != env->Array_GetLength(arrayObj, &length)) { + return false; + } + int32_t lengthInt = static_cast(length); + for (int32_t i = 0; i < lengthInt; i++) { + ani_ref modeRef; + if (ANI_OK != env->Object_CallMethodByName_Ref( + modeObj, "$_get", "I:Lstd/core/Object;", &modeRef, (ani_int)i)) { + return false; + } + if (AniUtils::IsUndefined(env, static_cast(modeRef))) { + continue; + } + if (!ParsePreviewOptionMode(env, previewOptions, static_cast(modeRef), isAuto)) { + return false; + } + } + } else { + if (!ParsePreviewOptionMode(env, previewOptions, modeObj, isAuto)) { + return false; + } + } + return true; +} + +bool ParseDragPreviewModifier(ani_env* env, ArkUIDragPreviewOption& previewOptions, ani_object value) +{ + CHECK_NULL_RETURN(env, false); + ani_ref modifierAni; + if (ANI_OK != env->Object_GetPropertyByName_Ref(value, "modifier", &modifierAni)) { + return false; + } + ani_object modifier = static_cast(modifierAni); + if (AniUtils::IsUndefined(env, modifier)) { + return true; + } + ani_type type; + env->Object_GetType(modifier, &type); + ani_method modifierFunc; + if (ANI_OK != env->Class_FindMethod(static_cast(type), "applyModifierPatch", + "Larkui/component/image/ArkImagePeer;:V", &modifierFunc)) { + return false; + } + ani_method mergeFunc; + if (ANI_OK != env->Class_FindMethod(static_cast(type), "mergeModifier", + "Larkui/ImageModifier/ImageModifier;:V", &mergeFunc)) { + return false; + } + + ani_vm* vm = nullptr; + env->GetVM(&vm); + std::shared_ptr weakRef(new ani_wref, [vm](ani_wref* wref) { + ani_env* env = nullptr; + vm->GetEnv(ANI_VERSION_1, &env); + env->WeakReference_Delete(*wref); + }); + env->WeakReference_Create(modifier, weakRef.get()); + + previewOptions.modifier = [vm, weakRef, modifierFunc, mergeFunc](void* ptr) { + CHECK_NULL_VOID(vm); + ani_env* env = nullptr; + if (ANI_OK != vm->GetEnv(ANI_VERSION_1, &env)) { + return; + } + CHECK_NULL_VOID(env); + ani_object imagePeer = CreateImagePeer(env, ptr); + CHECK_NULL_VOID(imagePeer); + ani_boolean released; + ani_ref localRef; + env->WeakReference_GetReference(*weakRef, &released, &localRef); + if (!released) { + auto imageModifier = CreateImageModifier(env); + env->Object_CallMethod_Void(imageModifier, mergeFunc, static_cast(localRef)); + env->Object_CallMethod_Void(imageModifier, modifierFunc, imagePeer); + } + }; + return true; +} + +bool ParseNumberBadge(ani_env* env, ArkUIDragPreviewOption& previewOptions, ani_object value) +{ + CHECK_NULL_RETURN(env, false); + ani_ref numberBadgeAni; + if (ANI_OK != env->Object_GetPropertyByName_Ref(value, "numberBadge", &numberBadgeAni)) { + return false; + } + ani_object numberBadgeObj = static_cast(numberBadgeAni); + if (AniUtils::IsUndefined(env, numberBadgeObj)) { + return true; + } + if (AniUtils::IsClassObject(env, numberBadgeObj, "Lstd/core/Boolean;")) { + previewOptions.isNumber = false; + ani_boolean aniValue; + if (ANI_OK == env->Object_CallMethodByName_Boolean(numberBadgeObj, "unboxed", nullptr, &aniValue)) { + previewOptions.isShowBadge = static_cast(aniValue); + } + return true; + } + if (!AniUtils::IsClassObject(env, numberBadgeObj, "Lstd/core/Numeric;")) { + return false; + } + ani_double numberValue; + if ((ANI_OK != env->Object_CallMethodByName_Double(numberBadgeObj, "unboxed", ":D", &numberValue))) { + return false; + } + auto number = static_cast(numberValue); + if (number < 0 || number > INT_MAX) { + previewOptions.isNumber = false; + previewOptions.isShowBadge = true; + } else { + previewOptions.isNumber = true; + previewOptions.badgeNumber = static_cast(number); + } + return true; +} + +bool ParseSizeChangeEffect(ani_env* env, ArkUIDragPreviewOption& previewOptions, ani_object value) +{ + CHECK_NULL_RETURN(env, false); + ani_ref sizeChangeEffectAni; + if (ANI_OK != env->Object_GetPropertyByName_Ref(value, "sizeChangeEffect", &sizeChangeEffectAni)) { + return false; + } + ani_object sizeChangeEffect = static_cast(sizeChangeEffectAni); + if (AniUtils::IsUndefined(env, sizeChangeEffect)) { + return true; + } + ani_int sizeChangeEffectInt; + if ((ANI_OK != env->EnumItem_GetValue_Int(static_cast(sizeChangeEffect), &sizeChangeEffectInt))) { + return false; + } + previewOptions.sizeChangeEffect = static_cast(sizeChangeEffectInt); + return true; +} + +void ParseDragPreviewOptions(ani_env* env, ArkUIDragPreviewOption& previewOptions, ani_object value) +{ + CHECK_NULL_VOID(env); + if (AniUtils::IsUndefined(env, value)) { + return; + } + ParseDragPreviewMode(env, previewOptions, value); + ParseDragPreviewModifier(env, previewOptions, value); + ParseNumberBadge(env, previewOptions, value); + ParseSizeChangeEffect(env, previewOptions, value); +} + +void SetPropertyValueByName(ani_env* env, ani_object obj, std::string name, bool& target) +{ + CHECK_NULL_VOID(env); + ani_ref value; + if (ANI_OK != env->Object_GetPropertyByName_Ref(obj, name.c_str(), &value)) { + return; + } + ani_object valueObj = static_cast(value); + if (AniUtils::IsUndefined(env, valueObj)) { + return; + } + ani_boolean aniValue; + if (ANI_OK != env->Object_CallMethodByName_Boolean(valueObj, "unboxed", nullptr, &aniValue)) { + return; + } + target = static_cast(aniValue); +} + +void ParseDragInteractionOptions(ani_env* env, ArkUIDragPreviewOption& previewOptions, + ani_object dragInteractionOptions) +{ + SetPropertyValueByName(env, dragInteractionOptions, "isMultiSelectionEnabled", + previewOptions.isMultiSelectionEnabled); + SetPropertyValueByName(env, dragInteractionOptions, "defaultAnimationBeforeLifting", + previewOptions.defaultAnimationBeforeLifting); + SetPropertyValueByName(env, dragInteractionOptions, "enableHapticFeedback", previewOptions.enableHapticFeedback); + SetPropertyValueByName(env, dragInteractionOptions, "isDragPreviewEnabled", previewOptions.isDragPreviewEnabled); + SetPropertyValueByName(env, dragInteractionOptions, "enableEdgeAutoScroll", previewOptions.enableEdgeAutoScroll); + SetPropertyValueByName(env, dragInteractionOptions, "isLiftingDisabled", previewOptions.isLiftingDisabled); +} + +void DragSetDragPreviewOptions([[maybe_unused]] ani_env* env, [[maybe_unused]] ani_object object, + [[maybe_unused]] ani_long pointer, [[maybe_unused]] ani_object value, [[maybe_unused]] ani_object options) +{ + auto* frameNode = reinterpret_cast(pointer); + CHECK_NULL_VOID(frameNode); + const auto* modifier = GetNodeAniModifier(); + if (!modifier || !modifier->getDragAniModifier() || !env) { + return; + } + + ArkUIDragPreviewOption previewOptions; + ParseDragPreviewOptions(env, previewOptions, value); + ParseDragInteractionOptions(env, previewOptions, options); + modifier->getDragAniModifier()->setDragPreviewOptions(frameNode, previewOptions); +} } // namespace OHOS::Ace::Ani \ No newline at end of file diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/drag_and_drop/native_drag_drop_global.h b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/drag_and_drop/native_drag_drop_global.h index 1fe9149dcb939e2594a6d5363d1e0def8f55b407..df99ee31ece768393181612673aea6ee0879e4f5 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/drag_and_drop/native_drag_drop_global.h +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/drag_and_drop/native_drag_drop_global.h @@ -15,10 +15,10 @@ #ifndef KOALA_PROJECTS_ARKOALA_ARKTS_ARKUI_OHOS_ANI_DRAG_AND_DROP_NATIVE_DRAG_DROP_GLOBAL #define KOALA_PROJECTS_ARKOALA_ARKTS_ARKUI_OHOS_ANI_DRAG_AND_DROP_NATIVE_DRAG_DROP_GLOBAL +#include #include "ani.h" - -#include +#include "core/interfaces/ani/ani_api.h" namespace OHOS::Ace::Ani { void DragEventSetData([[maybe_unused]] ani_env* env, [[maybe_unused]] ani_object object, @@ -41,5 +41,21 @@ void DragSetAllowDrop([[maybe_unused]] ani_env* env, [[maybe_unused]] ani_object [[maybe_unused]] ani_long pointer, [[maybe_unused]] ani_array_ref array, [[maybe_unused]] ani_int length); void DragSetDragPreview([[maybe_unused]] ani_env* env, [[maybe_unused]] ani_object object, [[maybe_unused]] ani_long pointer, [[maybe_unused]] ani_object dragInfo); +void DragSetDragPreviewOptions([[maybe_unused]] ani_env* env, [[maybe_unused]] ani_object object, + [[maybe_unused]] ani_long pointer, [[maybe_unused]] ani_object value, [[maybe_unused]] ani_object options); + +//utils +ani_object CreateImagePeer(ani_env* env, void* ptr); +ani_object CreateImageModifier(ani_env* env); +void SetPropertyValueByName(ani_env* env, ani_object obj, std::string name, bool& target); +bool ParsePreviewOptionMode(ani_env* env, ArkUIDragPreviewOption& previewOptions, + ani_object dragPreviewMode, bool& isAuto); +bool ParseDragPreviewMode(ani_env* env, ArkUIDragPreviewOption& previewOptions, ani_object value); +bool ParseDragPreviewModifier(ani_env* env, ArkUIDragPreviewOption& previewOptions, ani_object value); +bool ParseNumberBadge(ani_env* env, ArkUIDragPreviewOption& previewOptions, ani_object value); +bool ParseSizeChangeEffect(ani_env* env, ArkUIDragPreviewOption& previewOptions, ani_object value); +void ParseDragPreviewOptions(ani_env* env, ArkUIDragPreviewOption& previewOptions, ani_object value); +void ParseDragInteractionOptions(ani_env* env, ArkUIDragPreviewOption& previewOptions, + ani_object options); } // namespace OHOS::Ace::Ani #endif // KOALA_PROJECTS_ARKOALA_ARKTS_ARKUI_OHOS_ANI_DRAG_AND_DROP_NATIVE_DRAG_DROP_GLOBAL \ No newline at end of file diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/module.cpp b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/module.cpp index d13d787c8b7416cd0d8ba1934197c84c560dc7a3..a04fba598b8821ca871db4ed37264f8d24e5f394 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/module.cpp +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/module.cpp @@ -468,6 +468,11 @@ ANI_EXPORT ani_status ANI_Constructor(ani_vm* vm, uint32_t* result) nullptr, reinterpret_cast(OHOS::Ace::Ani::DragSetDragPreview) }, + ani_native_function { + "_Drag_Set_DragPreviewOptions", + nullptr, + reinterpret_cast(OHOS::Ace::Ani::DragSetDragPreviewOptions) + }, ani_native_function { "_ComponentSnapshot_createFromBuilderWithCallback", nullptr, diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/common.ts b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/common.ts index 3489ab797530c2ddac95d6b72d7432efc4b05906..3909b508a7f63508aace2da210f458e544141fb7 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/common.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/common.ts @@ -29,7 +29,7 @@ import { Context, ContextInternal, StateStylesOps } from "./arkui-custom" import { ComponentContent } from 'arkui/ComponentContent' import { UIContext } from "@ohos/arkui/UIContext" import { IntentionCode } from '@ohos.multimodalInput.intentionCode' -import { ImageModifier } from "./arkui-external" +import { ImageModifier } from "../ImageModifier" import { SymbolGlyphModifier } from "../SymbolGlyphModifier" import { CircleShape, EllipseShape, PathShape, RectShape } from "@ohos/arkui/shape" import { KeyType, KeySource, Color, HitTestMode, ImageSize, Alignment, BorderStyle, ColoringStrategy, HoverEffect, Visibility, ItemAlign, Direction, ObscuredReasons, RenderFit, FocusDrawLevel, ImageRepeat, Axis, ResponseType, FunctionKey, ModifierKey, LineCapStyle, LineJoinStyle, BarState, CrownSensitivity, EdgeEffect, TextDecorationType, TextDecorationStyle, Curve, PlayMode, SharedTransitionEffectType, GradientDirection, HorizontalAlign, VerticalAlign, TransitionType, FontWeight, FontStyle, TouchType, InteractionHand, CrownAction, Placement, ArrowPointPosition, ClickEffectLevel, NestedScrollMode, PixelRoundCalcPolicy, IlluminatedType, MouseButton, MouseAction, AccessibilityHoverType, AxisAction, AxisModel, ScrollSource } from "./enums" @@ -61,7 +61,8 @@ import { ArkBaseNode } from "../handwritten/modifiers/ArkBaseNode" import { hookStateStyleImpl } from "../handwritten/ArkStateStyle" import { hookBackgroundImageImpl } from "../handwritten/ArkBackgroundImageImpl" import { rememberMutableState } from '@koalaui/runtime' -import { hookDragPreview, hookAllowDropAttribute, hookRegisterOnDragStartImpl, hookOnDrop, hookDragEventStartDataLoading } from "../handwritten/ArkDragDrop" +import { hookDragPreview, hookAllowDropAttribute, hookRegisterOnDragStartImpl, hookOnDrop, hookDragEventStartDataLoading, + hookDragPreviewOptions } from "../handwritten/ArkDragDrop" import { ArkUIAniModule } from "arkui.ani" import { PointerStyle, UnifiedData, Summary, PixelMap, UniformDataType, DataSyncOptions } from "#external" import { hookCommonMethodGestureImpl, hookCommonMethodGestureModifierImpl, hookCommonMethodParallelGestureImpl, @@ -5922,25 +5923,6 @@ export class ArkCommonMethodPeer extends PeerNode { ArkUIGeneratedNativeModule._CommonMethod_chainMode(this.peer.ptr, thisSerializer.asBuffer(), thisSerializer.length()) thisSerializer.release() } - dragPreviewOptionsAttribute(value: DragPreviewOptions | undefined, options?: DragInteractionOptions): void { - const thisSerializer : Serializer = Serializer.hold() - let value_type : int32 = RuntimeType.UNDEFINED - value_type = runtimeType(value) - thisSerializer.writeInt8(value_type as int32) - if ((RuntimeType.UNDEFINED) != (value_type)) { - const value_value = value! - thisSerializer.writeDragPreviewOptions(value_value) - } - let options_type : int32 = RuntimeType.UNDEFINED - options_type = runtimeType(options) - thisSerializer.writeInt8(options_type as int32) - if ((RuntimeType.UNDEFINED) != (options_type)) { - const options_value = options! - thisSerializer.writeDragInteractionOptions(options_value) - } - ArkUIGeneratedNativeModule._CommonMethod_dragPreviewOptions(this.peer.ptr, thisSerializer.asBuffer(), thisSerializer.length()) - thisSerializer.release() - } blendMode0Attribute(value: BlendMode | undefined, type?: BlendApplyType): void { const thisSerializer : Serializer = Serializer.hold() let value_type : int32 = RuntimeType.UNDEFINED @@ -11258,9 +11240,7 @@ export class ArkCommonMethodComponent extends ComponentBase implements CommonMet } public dragPreviewOptions(value: DragPreviewOptions | undefined, options?: DragInteractionOptions): this { if (this.checkPriority("dragPreviewOptions")) { - const value_casted = value as (DragPreviewOptions | undefined) - const options_casted = options as (DragInteractionOptions) - this.getPeer()?.dragPreviewOptionsAttribute(value_casted, options_casted) + hookDragPreviewOptions(this, value, options) return this } return this diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/image.ts b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/image.ts index 6a058870d5b46130f6ba6499137e0b0ecf3a5d4e..3994d6eebabc672f92e5fa0ad1e3abcbe6b8ff30 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/image.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/image.ts @@ -53,6 +53,11 @@ export class ArkImagePeer extends ArkCommonMethodPeer { component?.setPeer(_peer) return _peer } + public static createImagePeerFromPtr(peerPtr: KPointer) :ArkImagePeer { + const peerId = PeerNode.nextId() + const _peer = new ArkImagePeer(peerPtr, peerId, "Image", 0) + return _peer + } setImageOptions0Attribute(src: PixelMap | ResourceStr | DrawableDescriptor): void { const thisSerializer : Serializer = Serializer.hold() let src_type : int32 = RuntimeType.UNDEFINED diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/peers/Deserializer.ts b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/peers/Deserializer.ts index 05a99890999e73ec34998781f12df15d4add4c11..8af10e68ee412644a2a1f218cc53b296826465cf 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/peers/Deserializer.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/peers/Deserializer.ts @@ -64,8 +64,9 @@ import { PasteButtonCallback, PasteButtonOnClickResult, PasteDescription, PasteI import { PluginErrorCallback, PluginErrorData, PluginComponentTemplate, PluginComponentOptions } from "./../pluginComponent" import { IntentionCode } from '@ohos.multimodalInput.intentionCode' import { CircleShape, EllipseShape, PathShape, RectShape } from "@ohos/arkui/shape" -import { ReceiveCallback, BaseShape, BaseShapeInternal, ShapeSize, CommonShape, CommonShapeInternal, WebviewController, WebviewControllerInternal, Summary, ImageModifier, RectWidthStyle, RectHeightStyle, PathShapeOptions, PerfMonitorActionType, PerfMonitorSourceType, RectShapeOptions, RoundRectShapeOptions, ResolutionQuality, TextModifier, IndicatorStyle, WebHeader, WindowStatusType, AsyncCallback_image_PixelMap_Void, SnapshotOptions, LabelStyle } from "./../arkui-external" +import { ReceiveCallback, BaseShape, BaseShapeInternal, ShapeSize, CommonShape, CommonShapeInternal, WebviewController, WebviewControllerInternal, Summary, RectWidthStyle, RectHeightStyle, PathShapeOptions, PerfMonitorActionType, PerfMonitorSourceType, RectShapeOptions, RoundRectShapeOptions, ResolutionQuality, TextModifier, IndicatorStyle, WebHeader, WindowStatusType, AsyncCallback_image_PixelMap_Void, SnapshotOptions, LabelStyle } from "./../arkui-external" import { SymbolGlyphModifier } from "../../SymbolGlyphModifier" +import { ImageModifier } from "../../ImageModifier" import { SymbolEffect, SymbolEffectInternal, ReplaceSymbolEffect, ReplaceSymbolEffectInternal, ScaleSymbolEffect, ScaleSymbolEffectInternal } from "../symbolglyph" import { FontOptions, FontInfo, UIFontAdjustInfo, UIFontAliasInfo, UIFontFallbackInfo, UIFontConfig, UIFontGenericInfo, UIFontFallbackGroupInfo } from "@ohos/font" import { MeasureOptions } from "@ohos/measure" diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/handwritten/ArkDragDrop.ts b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/handwritten/ArkDragDrop.ts index d211495b28bd6e6fda211e83914c5839fd20df82..3e8f27f7f9db2748c1dfead16d8b52384df95f42 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/handwritten/ArkDragDrop.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/handwritten/ArkDragDrop.ts @@ -17,7 +17,7 @@ import { int32 } from "@koalaui/common" import { PeerNode } from "arkui/PeerNode" import { KPointer } from "@koalaui/interop" import { ArkCommonMethodComponent, DragDropOps, DragEvent, CustomBuilder, DragItemInfo, PreviewConfiguration, - OnDragEventCallback, DropOptions } from '../component' + OnDragEventCallback, DropOptions, DragPreviewOptions, DragInteractionOptions } from '../component' import { InteropNativeModule, runtimeType, RuntimeType, toPeerPtr} from "@koalaui/interop" import { ArkUIAniModule } from "arkui.ani" import { createUiDetachedRoot } from "arkui/ArkUIEntry" @@ -154,3 +154,7 @@ export function hookDragEventStartDataLoading(node: KPointer, options: DataSyncO const options_casted = options as (DataSyncOptions) return ArkUIAniModule._DragEvent_Start_Data_Loading(node, options_casted) } + +export function hookDragPreviewOptions(node: ArkCommonMethodComponent, value: DragPreviewOptions | undefined, options?: DragInteractionOptions) { + ArkUIAniModule._Drag_Set_DragPreviewOptions(node.getPeer().getPeerPtr(), value, options) +} \ No newline at end of file diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/handwritten/component/image.ts b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/handwritten/component/image.ts index 52672e28b7db5f4c05be478bc7ecf2c66adabf06..12c07d75275506325dff83785a63c3c8747bef05 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/handwritten/component/image.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/handwritten/component/image.ts @@ -178,4 +178,4 @@ function hookSetColorFilter(component: ArkImageComponent, value: ColorFilter | d } ArkUIGeneratedNativeModule._ImageAttribute_colorFilter(component.getPeer().getPeerPtr(), thisSerializer.asBuffer(), thisSerializer.length()) thisSerializer.release() -} +} \ No newline at end of file diff --git a/frameworks/core/interfaces/ani/ani_api.h b/frameworks/core/interfaces/ani/ani_api.h index 6a63f6a48b60a3b8474d9c03864d3b398b9972e4..6bf2db738a56d8838f73ab7f7458e9ea929e8a5e 100644 --- a/frameworks/core/interfaces/ani/ani_api.h +++ b/frameworks/core/interfaces/ani/ani_api.h @@ -135,18 +135,31 @@ struct ArkUIDragNotifyMessage { struct ArkUIDragPreviewOption { bool isScaleEnabled = true; + bool defaultAnimationBeforeLifting = false; + bool isMultiSelectionEnabled = false; bool isNumber = false; bool isDefaultShadowEnabled = false; bool isDefaultRadiusEnabled = false; + bool isDragPreviewEnabled = true; + bool isDefaultDragItemGrayEffectEnabled = false; + bool enableEdgeAutoScroll = true; + bool enableHapticFeedback = false; + bool isMultiTiled = false; + bool isLiftingDisabled = false; + bool isTouchPointCalculationBasedOnFinalPreviewEnable = false; + int32_t sizeChangeEffect = 0; union { ArkUI_Int32 badgeNumber; bool isShowBadge = true; }; + std::function modifier; void ResetDragPreviewMode() { isScaleEnabled = true; isDefaultShadowEnabled = false; isDefaultRadiusEnabled = false; + isDefaultDragItemGrayEffectEnabled = false; + isMultiTiled = false; } }; @@ -289,6 +302,7 @@ struct ArkUIAniDragModifier { void (*setDragAllowDropNull)(ArkUINodeHandle node); void (*setDragAllowDrop)(ArkUINodeHandle node, const char** allowDrops, ArkUI_Int32 length); void (*setDragPreview)(ArkUINodeHandle node, ArkUIDragInfo dragInfo); + void (*setDragPreviewOptions)(ArkUINodeHandle node, ArkUIDragPreviewOption options); const char* (*getUdKey)(ani_ref event); }; struct ArkUIAniCommonModifier { diff --git a/frameworks/core/interfaces/native/ani/drag_ani_modifier.cpp b/frameworks/core/interfaces/native/ani/drag_ani_modifier.cpp index 187677d6426a622f7bb494304b286062e71f0b8a..f4c304c9075e33fffc23dbb3c87811607c95f163 100644 --- a/frameworks/core/interfaces/native/ani/drag_ani_modifier.cpp +++ b/frameworks/core/interfaces/native/ani/drag_ani_modifier.cpp @@ -143,6 +143,43 @@ void SetDragPreview(ArkUINodeHandle node, ArkUIDragInfo dragInfo) frameNode->SetDragPreview(info); } +void SetDragPreviewOptions(ArkUINodeHandle node, ArkUIDragPreviewOption options) +{ + auto frameNode = reinterpret_cast(node); + CHECK_NULL_VOID(frameNode); + DragPreviewOption previewOptions; + previewOptions.isScaleEnabled = options.isScaleEnabled; + previewOptions.defaultAnimationBeforeLifting = options.defaultAnimationBeforeLifting; + previewOptions.isMultiSelectionEnabled = options.isMultiSelectionEnabled; + previewOptions.isNumber = options.isNumber; + previewOptions.isDefaultShadowEnabled = options.isDefaultShadowEnabled; + previewOptions.isDefaultRadiusEnabled = options.isDefaultRadiusEnabled; + previewOptions.isDragPreviewEnabled = options.isDragPreviewEnabled; + previewOptions.isDefaultDragItemGrayEffectEnabled = options.isDefaultDragItemGrayEffectEnabled; + previewOptions.enableEdgeAutoScroll = options.enableEdgeAutoScroll; + previewOptions.enableHapticFeedback = options.enableHapticFeedback; + previewOptions.isMultiTiled = options.isMultiTiled; + previewOptions.isLiftingDisabled = options.isLiftingDisabled; + previewOptions.isTouchPointCalculationBasedOnFinalPreviewEnable = + options.isTouchPointCalculationBasedOnFinalPreviewEnable; + previewOptions.sizeChangeEffect = static_cast(options.sizeChangeEffect); + if (options.modifier) { + previewOptions.onApply = [executeFunc = std::move(options.modifier)](WeakPtr frameNode) { + auto node = frameNode.Upgrade(); + CHECK_NULL_VOID(node); + auto ptr = AceType::RawPtr(node); + CHECK_NULL_VOID(executeFunc); + executeFunc(ptr); + }; + } + if (previewOptions.isNumber) { + previewOptions.badgeNumber = options.badgeNumber; + } else { + previewOptions.isShowBadge = options.isShowBadge; + } + frameNode->SetDragPreviewOptions(previewOptions); +} + const char* GetUdKey(ani_ref event) { auto peer = reinterpret_cast(event); @@ -165,6 +202,7 @@ const ArkUIAniDragModifier* GetDragAniModifier() .setDragAllowDropNull = OHOS::Ace::NG::SetDragAllowDropNull, .setDragAllowDrop = OHOS::Ace::NG::SetDragAllowDrop, .setDragPreview = OHOS::Ace::NG::SetDragPreview, + .setDragPreviewOptions = OHOS::Ace::NG::SetDragPreviewOptions, .getUdKey = OHOS::Ace::NG::GetUdKey, }; return &impl; diff --git a/frameworks/core/interfaces/native/ani/drag_controller_ani_modifier.cpp b/frameworks/core/interfaces/native/ani/drag_controller_ani_modifier.cpp index 1cb9e43fc52f722b02e4bdcba949c553f615d7e4..4352a2a9866a524b100e514c7aa5c10291e09b22 100644 --- a/frameworks/core/interfaces/native/ani/drag_controller_ani_modifier.cpp +++ b/frameworks/core/interfaces/native/ani/drag_controller_ani_modifier.cpp @@ -846,6 +846,24 @@ void UpdatePreviewOptionDefaultAttr( NG::DragDropFuncWrapper::UpdatePreviewOptionDefaultAttr(dragAsyncContext->dragPreviewOption); } +void UpdateDragPreviewOptionsFromModifier(std::shared_ptr dragAsyncContext, + const ArkUIDragControllerAsync& asyncCtx) +{ + CHECK_NULL_VOID(dragAsyncContext); + if (!asyncCtx.dragPreviewOption.modifier) { + return; + } + auto onApply = [executeFunc = + std::move(asyncCtx.dragPreviewOption.modifier)](WeakPtr frameNode) { + auto node = frameNode.Upgrade(); + CHECK_NULL_VOID(node); + auto ptr = AceType::RawPtr(node); + CHECK_NULL_VOID(executeFunc); + executeFunc(ptr); + }; + NG::DragDropFuncWrapper::UpdateDragPreviewOptionsFromModifier(onApply, dragAsyncContext->dragPreviewOption); +} + void* CreateDragEventPeer(const ArkUIDragNotifyMessage& dragNotifyMsg) { RefPtr dragEvent = AceType::MakeRefPtr(); @@ -875,6 +893,7 @@ std::shared_ptr ConvertDragControllerAsync(const ArkUIDr dragAsyncContext->dragAction = asyncCtx.dragAction; dragAsyncContext->callBackJsFunction = asyncCtx.callBackJsFunction; UpdatePreviewOptionDefaultAttr(dragAsyncContext, asyncCtx); + UpdateDragPreviewOptionsFromModifier(dragAsyncContext, asyncCtx); if (asyncCtx.unifiedData) { auto unifiedDataPtr = std::static_pointer_cast(asyncCtx.unifiedData.GetSharedPtr()); auto udData = AceType::MakeRefPtr();