From 96119ba9fb9c8cc82324f8e00b00b1f3335a7d4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B0=B8=E5=87=AF?= Date: Thu, 17 Jul 2025 21:55:15 +0800 Subject: [PATCH] =?UTF-8?q?uicontext=E7=9A=84=E5=8D=8A=E6=A8=A1=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 刘永凯 --- .../arkui-ohos/@ohos.arkui.UIContext.ts | 6 ++- .../arkts/ArkUIGeneratedNativeModule.ts | 2 +- .../src/handwritten/UIContextImpl.ts | 29 ++++++++++++- .../src/generated/arkoala_api_generated.h | 3 +- .../native/src/generated/bridge_generated.cc | 7 ++- .../interface/arkoala_api_generated.h | 3 +- .../implementation/ui_context_accessor.cpp | 43 +++++++++++++++++-- 7 files changed, 79 insertions(+), 14 deletions(-) diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/@ohos.arkui.UIContext.ts b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/@ohos.arkui.UIContext.ts index 19d8ee2a2f4..2bba91aee46 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/@ohos.arkui.UIContext.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/@ohos.arkui.UIContext.ts @@ -43,7 +43,7 @@ import { ComponentContent } from 'arkui/ComponentContent' import overlayManager from '@ohos/overlayManager' import promptAction, { LevelOrder } from '@ohos/promptAction' import { LocalStorage } from 'arkui/stateManagement/storage/localStorage'; -import { AsyncCallback, CustomBuilder, DragItemInfo, Callback } from 'arkui/component' +import { AsyncCallback, CustomBuilder, DragItemInfo, Callback, SheetOptions } from 'arkui/component' import { Router as RouterExt } from 'arkui/handwritten'; import { ComponentContent } from "arkui/ComponentContent" import { ComputableState, IncrementalNode } from '@koalaui/runtime' @@ -597,6 +597,10 @@ export class UIContext { public setUIStates(callback: () => void): void { throw Error("setUIStates not implemented in UIContext!") } + + public openBindSheet(content: ComponentContent, options?: SheetOptions, targetId?: number) : Promise { + throw Error("openBindSheet not implemented in UIContext!") + } } export abstract class FrameCallback { onFrame(frameTimeInNano: number): void {} diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/arkts/ArkUIGeneratedNativeModule.ts b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/arkts/ArkUIGeneratedNativeModule.ts index b784e677849..76741cda080 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/arkts/ArkUIGeneratedNativeModule.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/arkts/ArkUIGeneratedNativeModule.ts @@ -3991,7 +3991,7 @@ export class ArkUIGeneratedNativeModule { native static _UIContext_getWindowWidthBreakpoint(instanceId: number): number @ani.unsafe.Quick native static _UIContext_getWindowHeightBreakpoint(instanceId: number): number - native static _UIContext_openBindSheet(ptr: KPointer, bindSheetContent: KPointer, thisArray: KSerializerBuffer, thisLength: int32): void + native static _UIContext_openBindSheet(bindSheetContent: KPointer, thisArray: KSerializerBuffer, thisLength: int32): Promise native static _UIContext_updateBindSheet(ptr: KPointer, bindSheetContent: KPointer, thisArray: KSerializerBuffer, thisLength: int32): void native static _UIContext_closeBindSheet(ptr: KPointer, bindSheetContent: KPointer): void @ani.unsafe.Quick diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/handwritten/UIContextImpl.ts b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/handwritten/UIContextImpl.ts index 27b38b02704..2f47054cb6a 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/handwritten/UIContextImpl.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/handwritten/UIContextImpl.ts @@ -28,7 +28,7 @@ import { UIContext, MeasureUtils, Font, TextMenuController, FocusController, Con import { StateManager, ComputableState, GlobalStateManager, StateContext, memoEntry, IncrementalNode } from '@koalaui/runtime' import { Context, PointerStyle, PixelMap } from "#external" import { Nullable, WidthBreakpoint, HeightBreakpoint } from "arkui/component/enums" -import { KeyEvent, PopupCommonOptions, MenuOptions } from "arkui/component/common" +import { KeyEvent, PopupCommonOptions, MenuOptions, SheetOptions } from "arkui/component/common" import { GlobalScope_ohos_font } from "arkui/component/arkui-external" import router from '@ohos/router' import { AlertDialog, AlertDialogParamWithConfirm, AlertDialogParamWithButtons, @@ -1646,4 +1646,31 @@ export class UIContextImpl extends UIContext { public checkThread(id: int32) : boolean { return ArkUIAniModule._CheckIsUIThread(id) !== 0; } + + public openBindSheet(content: ComponentContent, options?: SheetOptions, targetId?: number) : Promise { + ArkUIAniModule._Common_Sync_InstanceId(this.instanceId_); + const content_component = content as ComponentContent + let frameNode = content_component.getFrameNode() + let contentPtr = toPeerPtr(frameNode as FrameNode) as KPointer + + const thisSerializer : Serializer = Serializer.hold() + 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.writeSheetOptions(options_value) + } + + let targetId_type : int32 = RuntimeType.UNDEFINED + targetId_type = runtimeType(targetId) + thisSerializer.writeInt8(targetId_type as int32) + if ((RuntimeType.UNDEFINED) != (targetId_type)) { + const targetId_value = targetId! + thisSerializer.writeNumber(targetId_value) + } + let result = ArkUIGeneratedNativeModule._UIContext_openBindSheet(contentPtr, thisSerializer.asBuffer(), thisSerializer.length()); + ArkUIAniModule._Common_Restore_InstanceId(); + return result; + } } diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala/framework/native/src/generated/arkoala_api_generated.h b/frameworks/bridge/arkts_frontend/koala_projects/arkoala/framework/native/src/generated/arkoala_api_generated.h index a9a0058fc63..9ca0a52cd53 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala/framework/native/src/generated/arkoala_api_generated.h +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala/framework/native/src/generated/arkoala_api_generated.h @@ -24469,8 +24469,7 @@ typedef struct GENERATED_ArkUIUIContextAccessor { const Ark_String* id, const Ark_Number* value); void (*openBindSheet)(Ark_VMContext vmContext, - Ark_UIContext peer, - Ark_ComponentContent bindSheetContent, + Ark_NativePointer bindSheetContent, const Opt_SheetOptions* sheetOptions, const Opt_Number* targetId); void (*updateBindSheet)(Ark_VMContext vmContext, diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala/framework/native/src/generated/bridge_generated.cc b/frameworks/bridge/arkts_frontend/koala_projects/arkoala/framework/native/src/generated/bridge_generated.cc index bf8650674ed..bec32d12f26 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala/framework/native/src/generated/bridge_generated.cc +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala/framework/native/src/generated/bridge_generated.cc @@ -32774,8 +32774,7 @@ void impl_UIContext_setDynamicDimming(Ark_NativePointer thisPtr, const KStringPt GetAccessors()->getUIContextAccessor()->setDynamicDimming(self, (const Ark_String*) (&id), (const Ark_Number*) (&value)); } KOALA_INTEROP_V3(UIContext_setDynamicDimming, Ark_NativePointer, KStringPtr, KInteropNumber) -void impl_UIContext_openBindSheet(KVMContext vmContext, Ark_NativePointer thisPtr, Ark_NativePointer bindSheetContent, KSerializerBuffer thisArray, int32_t thisLength) { - Ark_UIContext self = reinterpret_cast(thisPtr); +void impl_UIContext_openBindSheet(KVMContext vmContext, Ark_NativePointer bindSheetContent, KSerializerBuffer thisArray, int32_t thisLength) { Deserializer thisDeserializer(thisArray, thisLength); const auto sheetOptions_value_buf_runtimeType = static_cast(thisDeserializer.readInt8()); Opt_SheetOptions sheetOptions_value_buf = {}; @@ -32793,9 +32792,9 @@ void impl_UIContext_openBindSheet(KVMContext vmContext, Ark_NativePointer thisPt targetId_value_buf.value = static_cast(thisDeserializer.readNumber()); } Opt_Number targetId_value = targetId_value_buf;; - GetAccessors()->getUIContextAccessor()->openBindSheet(reinterpret_cast(vmContext), self, static_cast(bindSheetContent), (const Opt_SheetOptions*)&sheetOptions_value, (const Opt_Number*)&targetId_value); + GetAccessors()->getUIContextAccessor()->openBindSheet(reinterpret_cast(vmContext), bindSheetContent, (const Opt_SheetOptions*)&sheetOptions_value, (const Opt_Number*)&targetId_value); } -KOALA_INTEROP_CTX_V4(UIContext_openBindSheet, Ark_NativePointer, Ark_NativePointer, KSerializerBuffer, int32_t) +KOALA_INTEROP_CTX_V3(UIContext_openBindSheet, Ark_NativePointer, KSerializerBuffer, int32_t) void impl_UIContext_updateBindSheet(KVMContext vmContext, Ark_NativePointer thisPtr, Ark_NativePointer bindSheetContent, KSerializerBuffer thisArray, int32_t thisLength) { Ark_UIContext self = reinterpret_cast(thisPtr); Deserializer thisDeserializer(thisArray, thisLength); diff --git a/frameworks/core/interfaces/native/generated/interface/arkoala_api_generated.h b/frameworks/core/interfaces/native/generated/interface/arkoala_api_generated.h index 1a6a7db71c0..e05ba0e1725 100644 --- a/frameworks/core/interfaces/native/generated/interface/arkoala_api_generated.h +++ b/frameworks/core/interfaces/native/generated/interface/arkoala_api_generated.h @@ -24455,8 +24455,7 @@ typedef struct GENERATED_ArkUIUIContextAccessor { const Ark_String* id, const Ark_Number* value); void (*openBindSheet)(Ark_VMContext vmContext, - Ark_UIContext peer, - Ark_ComponentContent bindSheetContent, + Ark_NativePointer bindSheetContent, const Opt_SheetOptions* sheetOptions, const Opt_Number* targetId); void (*updateBindSheet)(Ark_VMContext vmContext, diff --git a/frameworks/core/interfaces/native/implementation/ui_context_accessor.cpp b/frameworks/core/interfaces/native/implementation/ui_context_accessor.cpp index c429c357163..e1de3395248 100644 --- a/frameworks/core/interfaces/native/implementation/ui_context_accessor.cpp +++ b/frameworks/core/interfaces/native/implementation/ui_context_accessor.cpp @@ -21,6 +21,9 @@ #include "core/interfaces/native/utility/reverse_converter.h" #include "core/pipeline/pipeline_base.h" #include "arkoala_api_generated.h" +#include "core/interfaces/native/implementation/bind_sheet_utils.h" +#include "core/interfaces/native/implementation/frame_node_peer_impl.h" +#include "bridge/declarative_frontend/jsview/js_view_context.h" namespace OHOS::Ace::NG::GeneratedModifier { namespace UIContextAccessor { @@ -126,11 +129,45 @@ void SetDynamicDimmingImpl(Ark_UIContext peer, { } void OpenBindSheetImpl(Ark_VMContext vmContext, - Ark_UIContext peer, - Ark_ComponentContent bindSheetContent, - const Opt_SheetOptions* sheetOptions, + Ark_NativePointer bindSheetContent, + const Opt_SheetOptions* options, const Opt_Number* targetId) { + FrameNodePeer* sheetContentNode = bindSheetContent ? reinterpret_cast(bindSheetContent) : nullptr; + RefPtr sheetContentRefptr = FrameNodePeer::GetFrameNodeByPeer(sheetContentNode); + SheetStyle sheetStyle; + sheetStyle.sheetHeight.sheetMode = NG::SheetMode::LARGE; + sheetStyle.showDragBar = true; + sheetStyle.showCloseIcon = true; + sheetStyle.showInPage = false; + BindSheetUtil::SheetCallbacks cbs; + auto sheetOptions = Converter::OptConvertPtr(options); + if (sheetOptions) { + BindSheetUtil::ParseLifecycleCallbacks(cbs, sheetOptions.value()); + BindSheetUtil::ParseFuntionalCallbacks(cbs, sheetOptions.value()); + Converter::VisitUnion(sheetOptions->title, + [&sheetStyle](const Ark_SheetTitleOptions& value) { + sheetStyle.isTitleBuilder = false; + sheetStyle.sheetTitle = Converter::OptConvert(value.title); + sheetStyle.sheetSubtitle = Converter::OptConvert(value.title); + }, + [&sheetStyle, bindSheetContent, &cbs](const CustomNodeBuilder& value) { + sheetStyle.isTitleBuilder = true; + cbs.titleBuilder = [callback = CallbackHelper(value), bindSheetContent]() { + auto uiNode = callback.BuildSync(bindSheetContent); + ViewStackProcessor::GetInstance()->Push(uiNode); + }; + }, []() {}); + BindSheetUtil::ParseSheetParams(sheetStyle, sheetOptions.value()); + } + auto id = targetId->value.i32; + + ViewContextModel::GetInstance()->OpenBindSheet(sheetContentRefptr, + std::move(cbs.titleBuilder), sheetStyle, std::move(cbs.onAppear), std::move(cbs.onDisappear), + std::move(cbs.shouldDismiss), std::move(cbs.onWillDismiss), std::move(cbs.onWillAppear), + std::move(cbs.onWillDisappear), std::move(cbs.onHeightDidChange), + std::move(cbs.onDetentsDidChange), std::move(cbs.onWidthDidChange), + std::move(cbs.onTypeDidChange), std::move(cbs.sheetSpringBack), Container::CurrentId(), id); } void UpdateBindSheetImpl(Ark_VMContext vmContext, Ark_UIContext peer, -- Gitee