From 8563a7e6c27470727dfb04819407218661b03888 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B0=B8=E5=87=AF?= Date: Mon, 8 Sep 2025 21:36:23 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=8D=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E6=8B=96=E6=8B=BD=E7=82=B9=EF=BC=8C=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E6=8B=96=E6=8B=BD=E7=82=B9=E4=BD=8D=E5=BC=82=E5=B8=B8=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 刘永凯 --- .../dragController/drag_controller_module.cpp | 3 +-- .../ani/drag_controller_ani_modifier.cpp | 23 ++++++++++++------- 2 files changed, 16 insertions(+), 10 deletions(-) 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 6103a0b09b7..959bd064fc5 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 @@ -697,8 +697,7 @@ bool CheckAndParseSecondParams(ani_env* env, ArkUIDragControllerAsync& asyncCtx, asyncCtx.touchPoint = SharedPointerWrapper(dimensionPtr); } } else { - dimensionPtr = std::make_shared(OHOS::Ace::NG::OffsetF(0.0f, 0.0f)); - asyncCtx.touchPoint = SharedPointerWrapper(dimensionPtr); + asyncCtx.touchPoint = SharedPointerWrapper(nullptr); } if (!ParsePreviewOptions(env, asyncCtx, static_cast(previewOptionsAni))) { 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 00c6f5e916b..ba077fc67d8 100644 --- a/frameworks/core/interfaces/native/ani/drag_controller_ani_modifier.cpp +++ b/frameworks/core/interfaces/native/ani/drag_controller_ani_modifier.cpp @@ -84,7 +84,7 @@ struct DragControllerAsyncCtx { int parseBuilderCount = 0; std::mutex dragStateMutex; DragState dragState = DragState::PENDING; - std::optional touchPoint = DimensionOffset(0.0_vp, 0.0_vp); + std::optional touchPoint; DragAction *dragAction = nullptr; NG::DragPreviewOption dragPreviewOption; std::function, const ArkUIDragNotifyMessage&, @@ -384,8 +384,9 @@ bool CreatePreviewNodeAndScale(std::shared_ptr asyncCtx, if (!GetShadowInfo(asyncCtx, shadowInfo, refPixelMap, scale)) { return false; } - asyncCtxData = {asyncCtx->instanceId, asyncCtx->touchPoint.has_value(), asyncCtx->dragPointerEvent, - asyncCtx->dragPreviewOption, asyncCtx->touchPoint.value(), asyncCtx->pixelMapList}; + asyncCtxData = { asyncCtx->instanceId, asyncCtx->touchPoint.has_value(), asyncCtx->dragPointerEvent, + asyncCtx->dragPreviewOption, asyncCtx->touchPoint.value_or(DimensionOffset(0.0_vp, 0.0_vp)), + asyncCtx->pixelMapList }; return true; } @@ -509,8 +510,9 @@ bool StartDragService(std::shared_ptr asyncCtx) NG::PreparedAsyncCtxForAnimate asyncCtxData; std::vector shadowInfos; Msdp::DeviceStatus::ShadowInfo shadowInfo; - asyncCtxData = {asyncCtx->instanceId, asyncCtx->touchPoint.has_value(), asyncCtx->dragPointerEvent, - asyncCtx->dragPreviewOption, asyncCtx->touchPoint.value(), asyncCtx->pixelMapList}; + asyncCtxData = { asyncCtx->instanceId, asyncCtx->touchPoint.has_value(), asyncCtx->dragPointerEvent, + asyncCtx->dragPreviewOption, asyncCtx->touchPoint.value_or(DimensionOffset(0.0_vp, 0.0_vp)), + asyncCtx->pixelMapList }; for (auto& pixelMap : asyncCtx->pixelMapList) { if (!pixelMap) { LOGE("AceDrag, skip null pixelMap"); @@ -712,8 +714,9 @@ bool TryToStartDrag(std::shared_ptr asyncCtx) NG::PreparedInfoForDrag data; NG::PreparedAsyncCtxForAnimate asyncCtxData; Msdp::DeviceStatus::ShadowInfo shadowInfo; - asyncCtxData = {asyncCtx->instanceId, asyncCtx->touchPoint.has_value(), asyncCtx->dragPointerEvent, - asyncCtx->dragPreviewOption, asyncCtx->touchPoint.value(), asyncCtx->pixelMapList}; + asyncCtxData = { asyncCtx->instanceId, asyncCtx->touchPoint.has_value(), asyncCtx->dragPointerEvent, + asyncCtx->dragPreviewOption, asyncCtx->touchPoint.value_or(DimensionOffset(0.0_vp, 0.0_vp)), + asyncCtx->pixelMapList }; if (!CreatePreviewNodeAndScale(asyncCtx, data, asyncCtxData, shadowInfo, asyncCtx->pixelMap)) { LOGE("AceDrag, create preview node failed."); return false; @@ -884,7 +887,11 @@ std::shared_ptr ConvertDragControllerAsync(const ArkUIDr } dragAsyncContext->hasHandle = asyncCtx.hasHandle; void* touchPointPtr = asyncCtx.touchPoint; - dragAsyncContext->touchPoint = *static_cast(touchPointPtr); + if (touchPointPtr) { + dragAsyncContext->touchPoint = *static_cast(touchPointPtr); + } else { + dragAsyncContext->touchPoint.reset(); + } dragAsyncContext->customBuilderNode = asyncCtx.customBuilderNode; dragAsyncContext->customBuilderNodeList = asyncCtx.customBuilderNodeList; dragAsyncContext->asyncCallback = asyncCtx.asyncCallback; -- Gitee From 2e7c95b1afe1541db606b8862d9949a74d791ec3 Mon Sep 17 00:00:00 2001 From: l00913061 Date: Fri, 12 Sep 2025 11:33:24 +0800 Subject: [PATCH 2/2] dynamicObject Signed-off-by: l00913061 --- .../dragController/drag_controller_module.cpp | 3 +- .../arkui-ohos/src/component/contentSlot.ets | 89 ++++++++++++ .../arkui-ohos/src/component/interop.ets | 127 +++++++++++++++--- .../src/lib/interop/interop_builder.ts | 8 ++ .../lib/partial_update/pu_builder_proxy.ts | 25 ++-- .../ani/drag_controller_ani_modifier.cpp | 23 ++-- 6 files changed, 225 insertions(+), 50 deletions(-) create mode 100644 frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/contentSlot.ets 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 959bd064fc5..6103a0b09b7 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 @@ -697,7 +697,8 @@ bool CheckAndParseSecondParams(ani_env* env, ArkUIDragControllerAsync& asyncCtx, asyncCtx.touchPoint = SharedPointerWrapper(dimensionPtr); } } else { - asyncCtx.touchPoint = SharedPointerWrapper(nullptr); + dimensionPtr = std::make_shared(OHOS::Ace::NG::OffsetF(0.0f, 0.0f)); + asyncCtx.touchPoint = SharedPointerWrapper(dimensionPtr); } if (!ParsePreviewOptions(env, asyncCtx, static_cast(previewOptionsAni))) { diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/contentSlot.ets b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/contentSlot.ets new file mode 100644 index 00000000000..16c76d2fc06 --- /dev/null +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/contentSlot.ets @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2024-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. + */ + +import { ArkCommonMethodPeer, CommonMethod, ArkCommonMethodComponent, ArkCommonMethodStyle, + TouchEvent } from './common'; +import { TypeChecker, ArkUIGeneratedNativeModule } from "#components" +import { Finalizable, runtimeType, RuntimeType, SerializerBase, registerCallback, wrapCallback, toPeerPtr, KPointer, MaterializedBase, NativeBuffer, nullptr, KInt, KBoolean, KStringPtr } from "@koalaui/interop" +import { int32, int64, float32 } from "@koalaui/common" +import { NodeAttach, remember } from "@koalaui/runtime" +import { PeerNode } from "../PeerNode" +import { ComponentBase } from "./../ComponentBase" +import { Content } from "../Content" +import { NodeContent } from "../NodeContent" +import { ArkUIAniModule } from "arkui.ani" + +export class ArkContentSlotPeer extends PeerNode { + protected constructor(peerPtr: KPointer, id: int32, name: string = "", flags: int32 = 0) { + super(peerPtr, id, name, flags) + } + public static create(component: ComponentBase | undefined, flags: int32 = 0): ArkContentSlotPeer { + const peerId = PeerNode.nextId() + const _peerPtr = ArkUIAniModule._ContentSlot_construct(peerId) + const _peer = new ArkContentSlotPeer(_peerPtr, peerId, "ContentSlot", flags) + component?.setPeer(_peer) + return _peer + } + setContentSlotOptionsAttribute(content?: Content): void { + let content_type: int32 = RuntimeType.UNDEFINED + content_type = runtimeType(content) + if ((RuntimeType.UNDEFINED) != (content_type)) { + const content_value = content as NodeContent + ArkUIAniModule._ContentSlotInterface_setContentSlotOptions(this.peer.ptr, toPeerPtr(content_value)) + } else { + ArkUIAniModule._ContentSlotInterface_setContentSlotOptions(this.peer.ptr, nullptr) + } + } +} + +export class ArkContentSlotStyle extends ArkCommonMethodStyle implements ContentSlotAttribute { + public setContentSlotOptions(content?: Content): this { + return this + } +} + +export class ArkContentSlotComponent extends ComponentBase implements ContentSlotAttribute { + getPeer(): ArkContentSlotPeer { + return (this.peer as ArkContentSlotPeer) + } + + public setContentSlotOptions(content?: Content): this { + if (this.checkPriority("setContentSlotOptions")) { + const content_type = runtimeType(content) + if ((RuntimeType.OBJECT == content_type) || (RuntimeType.UNDEFINED == content_type)) { + const content_casted = content as (Content | undefined) + this.getPeer()?.setContentSlotOptionsAttribute(content_casted) + return this + } + throw new Error("Can not select appropriate overload") + } + return this + } +} +/** @memo */ +export function ContentSlotImpl( + /** @memo */ + style: ((attributes: ContentSlotAttribute) => void) | undefined, + /** @memo */ + content_?: (() => void) | undefined, +): void { + const receiver = remember(() => { + return new ArkContentSlotComponent() + }) + NodeAttach((): ArkContentSlotPeer => ArkContentSlotPeer.create(receiver), (_: ArkContentSlotPeer) => { + style?.(receiver) + content_?.() + }) +} diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/interop.ets b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/interop.ets index dc8f745285f..5649301af8b 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/interop.ets +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/interop.ets @@ -13,11 +13,11 @@ * limitations under the License. */ -import { ArkUIAniModule } from "arkui.ani" +import { ArkUIAniModule } from 'arkui.ani' import { KPointer } from '@koalaui/interop'; import { PeerNode, findPeerNode } from '../PeerNode'; import { int32 } from '@koalaui/common'; -import { __context, __id, GlobalStateManager, IncrementalNode, memoEntry, NodeAttach, StateContext } from '@koalaui/runtime'; +import { __context, __id, GlobalStateManager, IncrementalNode, memoEntry, memoEntry1, mutableState, MutableState, NodeAttach, StateContext } from '@koalaui/runtime'; import { ExtendableComponent } from './extendableComponent'; import { StateDecoratedVariable, @@ -32,10 +32,12 @@ import { ObserveSingleton } from '../stateManagement'; import { IDecoratedV1Variable, WatchFuncType, WatchIdType } from '../stateManagement/decorator'; -import { UIContextUtil } from "arkui/base/UIContextUtil"; -import { DetachedRootEntryImpl, UIContextImpl } from "arkui/base/UIContextImpl"; -import { CustomComponent } from "./customComponent"; -import { setNeedCreate } from "../ArkComponentRoot"; +import { UIContextUtil } from 'arkui/base/UIContextUtil'; +import { DetachedRootEntryImpl, UIContextImpl } from 'arkui/base/UIContextImpl'; +import { CustomComponent } from './customComponent'; +import { setNeedCreate } from '../ArkComponentRoot'; +import { StateMgmtTool } from '#stateMgmtTool'; +import { ArkContentSlotPeer } from './contentSlot'; export class CompatiblePeerNode extends PeerNode { protected constructor(peerPtr: KPointer, id: int32, view: ESValue, name: string = '', flags: int32 = 0) { @@ -80,7 +82,7 @@ export function compatibleComponent( bindCompatibleProvideCallback(staticComponent!, dynamicComponent!); bindCompatibleLocalStorageCallback(staticComponent!, dynamicComponent!); } - let resetViewPUFindProvideInterop = global.getProperty("resetViewPUFindProvideInterop"); + let resetViewPUFindProvideInterop = global.getProperty('resetViewPUFindProvideInterop'); resetViewPUFindProvideInterop.invoke(); let resetViewPUInterop = global.getProperty('resetViewPUFindLocalStorageInterop'); resetViewPUInterop.invoke(); @@ -98,7 +100,7 @@ export function compatibleStaticComponent void ): number { - const instantiateImpl = /** @memo */ () => { + const instantiateImpl = /** @memo */ (): void => { T._instantiateImpl(undefined, factory, options, undefined, content); }; @@ -135,13 +137,14 @@ export function compatibleStaticComponent( if (manager === undefined) { manager = GlobalStateManager.instance; } - const node = manager.updatableNode(new IncrementalNode(), (context: StateContext) => { + const node = manager.updatableNode(ArkContentSlotPeer.create(undefined) as PeerNode, (context: StateContext) => { const frozen = manager.frozen; manager.frozen = true; ArkUIAniModule._Common_Sync_InstanceId(uiContext.getInstanceId()); @@ -465,16 +471,95 @@ export function transferCompatibleBuilder( manager.frozen = frozen; }); - const inc = node.value; - const peerNode = findPeerNode(inc); - if (peerNode === undefined) { - node.dispose(); - return 0; - } - uiContext.getDetachedRootEntryManager().detachedRoots_.set(peerNode.peer.ptr, new DetachedRootEntryImpl(node)); - return peerNode.getPeerPtr() as number; + const ptr = node.value.peer.ptr; + uiContext.getDetachedRootEntryManager().detachedRoots_.set(ptr, new DetachedRootEntryImpl(node)); + return ptr as number; } const createDynamicBuilder = ESValue.getGlobal().getProperty('createDynamicBuilder'); const dynamicBuilder = createDynamicBuilder.invoke(ESValue.wrap(staticBuilderFunc)); return dynamicBuilder; +} + + +export function transferCompatibleUpdatableBuilder( + /** @memo */ + builder: (args: T) => void +): ESValue { + const staticBuilderFunc = (args: T): [number, ()=>void] => { + let state: MutableState | undefined; + if (isDynamicObject(args)) { + state = updateDynamicObjectForInterop(args); + } else { + const objType = Type.of(args); + let handler = objType instanceof ClassType && (objType as ClassType).getName().endsWith('@Proxy') + ? (proxy.Proxy.tryGetHandler(args) as InteropBuilderLiteralProxyHandler) // a very slow call so need to judge proxy first + : undefined; + if (handler) { + state = handler!.state; + } + } + const uiContext = UIContextUtil.getOrCreateCurrentUIContext() as UIContextImpl; + let manager = uiContext.stateMgr; + if (manager === undefined) { + manager = GlobalStateManager.instance; + } + const node = manager.updatableNode(ArkContentSlotPeer.create(undefined) as PeerNode, (context: StateContext) => { + const frozen = manager.frozen; + manager.frozen = true; + ArkUIAniModule._Common_Sync_InstanceId(uiContext.getInstanceId()); + let r = OBSERVE.renderingComponent; + OBSERVE.renderingComponent = ObserveSingleton.RenderingComponentV1; + memoEntry1(context, 0, builder, args); + OBSERVE.renderingComponent = r; + ArkUIAniModule._Common_Restore_InstanceId(); + manager.frozen = frozen; + }); + const ptr = node.value.peer.ptr; + uiContext.getDetachedRootEntryManager().detachedRoots_.set(ptr, new DetachedRootEntryImpl(node)); + return [ptr as number, ()=>{ if (state) { state.value++; } }]; + } + const createDynamicUpdatableBuilder = ESValue.getGlobal().getProperty('createDynamicUpdatableBuilder'); + const dynamicBuilder = createDynamicUpdatableBuilder.invoke(ESValue.wrap(staticBuilderFunc)); + return dynamicBuilder; +} + +/** + * Creates a proxy for static object literal in the ArkTS 1.1 context + * to intercept property getter operations. + */ +function makeBuilderParameterStaticProxy(name: string, value: T, sourceGetter: Any): T { + const result = proxy.Proxy.create(value, new InteropBuilderLiteralProxyHandler(sourceGetter)); + return result; +} + +/** + * Empowers the proxy object of a dynamic object with ArkTS 1.2's dependency addition capability + * through hook functions, thereby enabling it to refresh the 1.2 UI. + */ +function updateDynamicObjectForInterop(args: Any): MutableState | undefined { + let state: MutableState = StateMgmtTool.getGlobalStateManager().mutableState(0, true); + const startHookFunc = ESValue.getGlobal().getProperty('startStaticHook'); + const result = startHookFunc.invoke(ESValue.wrap(args), ESValue.wrap(()=>{ state.value })).unwrap(); + if (result === undefined) { + return undefined; + } + return state; +} + +class InteropBuilderLiteralProxyHandler extends proxy.DefaultProxyHandler { + source: ESValue; + state: MutableState; + constructor(source: Any) { + this.source = ESValue.wrap(source) + this.state = StateMgmtTool.getGlobalStateManager().mutableState(0, true); + } + + override get(target: T, name: string): Any { + const propertyGetter: ESValue = this.source.getPropertySafe(name); + if (propertyGetter === ESValue.Undefined) { + return super.get(target, name); + } + this.state.value; + return propertyGetter.invoke().unwrap(); + } } \ No newline at end of file diff --git a/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/interop/interop_builder.ts b/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/interop/interop_builder.ts index 00d95406914..826b7500489 100644 --- a/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/interop/interop_builder.ts +++ b/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/interop/interop_builder.ts @@ -21,6 +21,14 @@ function __makeBuilderParameterStaticProxy_Interop_Internal(name: string, value: return InteropExtractorModule.makeBuilderParameterStaticProxy(name, value, sourceGetter); } +function startStaticHook(source: Object, addRef: () => void): Object | undefined { + if ('__static_interop_hook' in source) { + source['__static_interop_hook'] = addRef; + return source; + } + return undefined; +} + /** * * @param staticBuilder ArkTS1.2builder, return the pointer of PeerNode diff --git a/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/partial_update/pu_builder_proxy.ts b/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/partial_update/pu_builder_proxy.ts index 41b70ad55a7..6c64ca72c16 100644 --- a/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/partial_update/pu_builder_proxy.ts +++ b/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/partial_update/pu_builder_proxy.ts @@ -44,6 +44,11 @@ function makeBuilderParameterProxy(builderName: string, source: Object): Object let staticHook: StaticInteropHook | undefined = InteropConfigureStateMgmt.instance.needsInterop() ? new StaticInteropHook() : undefined; return new Proxy(source, { set(target, prop, val) { + //for interop + if (InteropConfigureStateMgmt.instance.needsInterop() && prop === '__static_interop_hook') { + staticHook!.addRef = val; + return true; + } throw Error(`@Builder '${builderName}': Invalid attempt to set(write to) parameter '${prop.toString()}' error!`); }, get(target, prop) { @@ -54,18 +59,6 @@ function makeBuilderParameterProxy(builderName: string, source: Object): Object if (!(typeof target === 'object') && (prop1 in target)) { throw Error(`@Builder '${builderName}': '${prop1}' used but not a function parameter error!`); } - // for interop - if (InteropConfigureStateMgmt.instance.needsInterop()) { - if (prop === '__static_interop_hook') { - return (state, addRef) => { - staticHook!.state = state; - staticHook!.addRef = addRef; - }; - } - if (prop === '__static_interop_state') { - return () => staticHook.state; - } - } const value = target[prop1]; if (typeof value !== 'function') { stateMgmtConsole.debug(` - no fun`); @@ -89,6 +82,12 @@ function makeBuilderParameterProxy(builderName: string, source: Object): Object stateMgmtConsole.debug(` - func - no ObservedPropertybstract - ret value ${funcRet}`); return funcRet; - } // get + }, // get + has(target, prop) { + if (InteropConfigureStateMgmt.instance.needsInterop() && prop === '__static_interop_hook') { + return true; + } + return prop in target; + } }); // new Proxy } 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 ba077fc67d8..00c6f5e916b 100644 --- a/frameworks/core/interfaces/native/ani/drag_controller_ani_modifier.cpp +++ b/frameworks/core/interfaces/native/ani/drag_controller_ani_modifier.cpp @@ -84,7 +84,7 @@ struct DragControllerAsyncCtx { int parseBuilderCount = 0; std::mutex dragStateMutex; DragState dragState = DragState::PENDING; - std::optional touchPoint; + std::optional touchPoint = DimensionOffset(0.0_vp, 0.0_vp); DragAction *dragAction = nullptr; NG::DragPreviewOption dragPreviewOption; std::function, const ArkUIDragNotifyMessage&, @@ -384,9 +384,8 @@ bool CreatePreviewNodeAndScale(std::shared_ptr asyncCtx, if (!GetShadowInfo(asyncCtx, shadowInfo, refPixelMap, scale)) { return false; } - asyncCtxData = { asyncCtx->instanceId, asyncCtx->touchPoint.has_value(), asyncCtx->dragPointerEvent, - asyncCtx->dragPreviewOption, asyncCtx->touchPoint.value_or(DimensionOffset(0.0_vp, 0.0_vp)), - asyncCtx->pixelMapList }; + asyncCtxData = {asyncCtx->instanceId, asyncCtx->touchPoint.has_value(), asyncCtx->dragPointerEvent, + asyncCtx->dragPreviewOption, asyncCtx->touchPoint.value(), asyncCtx->pixelMapList}; return true; } @@ -510,9 +509,8 @@ bool StartDragService(std::shared_ptr asyncCtx) NG::PreparedAsyncCtxForAnimate asyncCtxData; std::vector shadowInfos; Msdp::DeviceStatus::ShadowInfo shadowInfo; - asyncCtxData = { asyncCtx->instanceId, asyncCtx->touchPoint.has_value(), asyncCtx->dragPointerEvent, - asyncCtx->dragPreviewOption, asyncCtx->touchPoint.value_or(DimensionOffset(0.0_vp, 0.0_vp)), - asyncCtx->pixelMapList }; + asyncCtxData = {asyncCtx->instanceId, asyncCtx->touchPoint.has_value(), asyncCtx->dragPointerEvent, + asyncCtx->dragPreviewOption, asyncCtx->touchPoint.value(), asyncCtx->pixelMapList}; for (auto& pixelMap : asyncCtx->pixelMapList) { if (!pixelMap) { LOGE("AceDrag, skip null pixelMap"); @@ -714,9 +712,8 @@ bool TryToStartDrag(std::shared_ptr asyncCtx) NG::PreparedInfoForDrag data; NG::PreparedAsyncCtxForAnimate asyncCtxData; Msdp::DeviceStatus::ShadowInfo shadowInfo; - asyncCtxData = { asyncCtx->instanceId, asyncCtx->touchPoint.has_value(), asyncCtx->dragPointerEvent, - asyncCtx->dragPreviewOption, asyncCtx->touchPoint.value_or(DimensionOffset(0.0_vp, 0.0_vp)), - asyncCtx->pixelMapList }; + asyncCtxData = {asyncCtx->instanceId, asyncCtx->touchPoint.has_value(), asyncCtx->dragPointerEvent, + asyncCtx->dragPreviewOption, asyncCtx->touchPoint.value(), asyncCtx->pixelMapList}; if (!CreatePreviewNodeAndScale(asyncCtx, data, asyncCtxData, shadowInfo, asyncCtx->pixelMap)) { LOGE("AceDrag, create preview node failed."); return false; @@ -887,11 +884,7 @@ std::shared_ptr ConvertDragControllerAsync(const ArkUIDr } dragAsyncContext->hasHandle = asyncCtx.hasHandle; void* touchPointPtr = asyncCtx.touchPoint; - if (touchPointPtr) { - dragAsyncContext->touchPoint = *static_cast(touchPointPtr); - } else { - dragAsyncContext->touchPoint.reset(); - } + dragAsyncContext->touchPoint = *static_cast(touchPointPtr); dragAsyncContext->customBuilderNode = asyncCtx.customBuilderNode; dragAsyncContext->customBuilderNodeList = asyncCtx.customBuilderNodeList; dragAsyncContext->asyncCallback = asyncCtx.asyncCallback; -- Gitee