diff --git a/arkoala-arkts/arkui/config/etsconfig-base.json b/arkoala-arkts/arkui/config/etsconfig-base.json index 0c9a6c9957de0251295dcb8d907be12fd82cc7e6..e50c1b3c07231f9930ee72849940d3e2fc1f747b 100644 --- a/arkoala-arkts/arkui/config/etsconfig-base.json +++ b/arkoala-arkts/arkui/config/etsconfig-base.json @@ -227,7 +227,8 @@ "RichEditor", "CachedImage", "MediaCachedImage", - "TestComponent" + "TestComponent", + "NodeContainer" ], "extend": { "decorator": [ @@ -809,6 +810,11 @@ "name": "TestComponent", "type": "TestComponentAttribute", "instance": "TestComponentInstance" + }, + { + "name": "NodeContainer", + "type": "NodeContainerAttribute", + "instance": "NodeContainerInstance" } ] }, diff --git a/arkoala-arkts/arkui/src/generated/ArkNodeContainer.ts b/arkoala-arkts/arkui/src/generated/ArkNodeContainer.ts index 86c79c028b261b90a6d3b45e1bfbefccdec83e96..6979926877f4b21b03bb9c87f63c1959618796c5 100644 --- a/arkoala-arkts/arkui/src/generated/ArkNodeContainer.ts +++ b/arkoala-arkts/arkui/src/generated/ArkNodeContainer.ts @@ -18,7 +18,7 @@ import { int32, float32 } from "@koalaui/common" import { KStringPtr, KBoolean, RuntimeType, runtimeType } from "@koalaui/interop" -import { NodeAttach, remember } from "@koalaui/runtime" +import { NodeAttach, remember, scheduleCallback } from "@koalaui/runtime" import { ComponentBase } from "./../ComponentBase" import { TypeChecker } from "#components" import { ArkCommonMethodComponent } from "./ArkCommon" @@ -44,25 +44,28 @@ import { EllipseShape } from "./ArkEllipseShapeMaterialized" import { PathShape } from "./ArkPathShapeMaterialized" import { RectShape } from "./ArkRectShapeMaterialized" import { ProgressMask } from "./ArkProgressMaskMaterialized" -import { AttributeModifier } from "./../handwritten" +import { AttributeModifier, BuilderNode } from "./../handwritten" import { GestureModifier } from "./ArkGestureModifierMaterialized" import { GestureInfo, GestureJudgeResult, GestureType, GestureMask } from "./ArkGestureInterfaces" import { BaseGestureEvent } from "./ArkBaseGestureEventMaterialized" import { PixelMap } from "./ArkPixelMapMaterialized" -import { NodeController } from "./ArkArkuiExternalInterfaces" +import { NodeControllerDemo } from "../handwritten/NodeController" import { NodeContainerAttribute } from "./ArkNodeContainerInterfaces" +import { FrameNode } from "./ArkFrameNodeMaterialized" /** @memo:stable */ export class ArkNodeContainerComponent extends ArkCommonMethodComponent { getPeer(): ArkNodeContainerPeer { return (this.peer as ArkNodeContainerPeer) } + controller?:NodeControllerDemo; /** @memo */ - public setNodeContainerOptions(controller: NodeController): this { - if (this.checkPriority("setNodeContainerOptions")) { - const controller_casted = controller as (NodeController) - this.getPeer()?.setNodeContainerOptionsAttribute(controller_casted) - return this - } + public setNodeContainerOptions(controller: NodeControllerDemo): this { + this.controller = controller; + // // if (this.checkPriority("setNodeContainerOptions")) { + // // const controller_casted = controller as (NodeController) + // // this.getPeer()?.setNodeContainerOptionsAttribute(controller_casted) + // return this + // } return this } public applyAttributesFinish(): void { @@ -77,15 +80,25 @@ export function ArkNodeContainer( style: ((attributes: ArkNodeContainerComponent) => void) | undefined, /** @memo */ content_: (() => void) | undefined, - controller: NodeController + nodeController: NodeControllerDemo ) { const receiver = remember(() => { return new ArkNodeContainerComponent() }) - NodeAttach((): ArkNodeContainerPeer => ArkNodeContainerPeer.create(receiver), (_: ArkNodeContainerPeer) => { - receiver.setNodeContainerOptions(controller) - style?.(receiver) - content_?.() + NodeAttach((): ArkNodeContainerPeer => ArkNodeContainerPeer.create(receiver), (self: ArkNodeContainerPeer) => { + receiver.setNodeContainerOptions(nodeController) + style?.(receiver); + remember( + () => { + scheduleCallback( + () => { + let ptr: FrameNode | null = nodeController.makeNode(); + if (ptr && ptr.peer?.ptr) { + self.peer.addChild(ptr!.peer!.ptr) + } + }) + }) + receiver.applyAttributesFinish() }) } diff --git a/arkoala-arkts/arkui/src/generated/peers/ArkNodeContainerPeer.ts b/arkoala-arkts/arkui/src/generated/peers/ArkNodeContainerPeer.ts index 7bd970ca5e0442a8d95aec3e5e48be0955d9666d..d3b6893a90a5510f07b28d710ee2e6b6020a3335 100644 --- a/arkoala-arkts/arkui/src/generated/peers/ArkNodeContainerPeer.ts +++ b/arkoala-arkts/arkui/src/generated/peers/ArkNodeContainerPeer.ts @@ -70,16 +70,13 @@ export class ArkNodeContainerPeer extends ArkCommonMethodPeer { } public static create(component?: ComponentBase, flags: int32 = 0): ArkNodeContainerPeer { const peerId = PeerNode.nextId() - const _peerPtr = ArkUIGeneratedNativeModule._NodeContainer_construct(peerId, flags) - const _peer = new ArkNodeContainerPeer(_peerPtr, peerId, "NodeContainer", flags) + const _peerPtr = ArkUIGeneratedNativeModule._Column_construct(peerId, flags) + const _peer = new ArkNodeContainerPeer(_peerPtr, peerId, "Column", flags) component?.setPeer(_peer) return _peer } setNodeContainerOptionsAttribute(controller: NodeController): void { - const thisSerializer : Serializer = Serializer.hold() - thisSerializer.writeNodeController(controller) - ArkUIGeneratedNativeModule._NodeContainerInterface_setNodeContainerOptions(this.peer.ptr, thisSerializer.asBuffer(), thisSerializer.length()) - thisSerializer.release() + } } export interface ArkNodeContainerAttributes extends ArkCommonMethodAttributes { diff --git a/arkoala-arkts/arkui/src/generated/ts/type_check.ts b/arkoala-arkts/arkui/src/generated/ts/type_check.ts index 4ffc1a3901287332d04a3703fc397260a905dcfb..82b55dbf6ad238c2389e8011cd8a76c6a4936a8c 100644 --- a/arkoala-arkts/arkui/src/generated/ts/type_check.ts +++ b/arkoala-arkts/arkui/src/generated/ts/type_check.ts @@ -10539,9 +10539,6 @@ export class TypeChecker { static isNodeContainerInterface(value: object|string|number|undefined|null|boolean): boolean { throw new Error("Can not discriminate value typeof NodeContainerInterface") } - static isNodeController(value: object|string|number|undefined|null|boolean): boolean { - throw new Error("Can not discriminate value typeof NodeController") - } static isNonCurrentDayStyle(value: object|string|number|undefined|null|boolean, duplicated_nonCurrentMonthDayColor: boolean, duplicated_nonCurrentMonthLunarColor: boolean, duplicated_nonCurrentMonthWorkDayMarkColor: boolean, duplicated_nonCurrentMonthOffDayMarkColor: boolean): boolean { if ((!duplicated_nonCurrentMonthDayColor) && (value?.hasOwnProperty("nonCurrentMonthDayColor"))) { return true diff --git a/arkoala-arkts/arkui/src/handwritten/BuilderNdoe.ts b/arkoala-arkts/arkui/src/handwritten/BuilderNdoe.ts new file mode 100644 index 0000000000000000000000000000000000000000..1715700d6ae7a5b5cfe78b717a2425a7b254f47d --- /dev/null +++ b/arkoala-arkts/arkui/src/handwritten/BuilderNdoe.ts @@ -0,0 +1,66 @@ +import { PeerNode } from "../PeerNode"; +import { ArkComponentRootPeer, ArkRootPeer } from "../generated/peers/ArkStaticComponentsPeer"; +import { FrameNode, FrameNodeInternal, Size } from "../generated"; +import { createUiDetachedRoot, destroyUiDetachedRoot } from "../Application"; +import { KPointer } from "@koalaui/interop"; +export enum NodeRenderType { + RENDER_TYPE_DISPLAY = 0, + RENDER_TYPE_TEXTURE = 1, +} +export interface RenderOptions { + selfIdealSize?: Size; + type?: NodeRenderType; + surfaceId?: string; +} +export class WrappedBuilder { + constructor( + /** @memo */ + builder: (args: Args) => void + ) { + this.builder = builder; + } + /** @memo */ + builder?: (args: Args) => void; +} +export class BuilderNode { + private __options?: RenderOptions; + private __builder?: WrappedBuilder; + private __root?: PeerNode; + + constructor(options?: RenderOptions) { + this.__options = options; + } + build(builder: WrappedBuilder, arg?: Args): void { + this.__builder = builder; + createUiDetachedRoot(() => { + if (this.__root == null) { + let root = ArkComponentRootPeer.create(); + this.__root = root; + } else { + this.__root?.firstChild?.dispose(); + } + return this.__root!; + }, () => { + if (arg) { + this.__builder?.builder?.(arg); + } + }) + } + update(arg: Args): void { + if (this.__builder) { + this.build(this.__builder!, arg); + } + } + getFrameNode(): FrameNode | null { + if (!this.__root){ + return null; + }else { + let ptr:KPointer=this.__root!.peer.ptr; + let node = FrameNodeInternal.fromPtr(ptr); + return node; + } + } + dispose(): void { + if (this.__root) destroyUiDetachedRoot(this.__root!) + } +} \ No newline at end of file diff --git a/arkoala-arkts/arkui/src/handwritten/NodeController.ts b/arkoala-arkts/arkui/src/handwritten/NodeController.ts new file mode 100644 index 0000000000000000000000000000000000000000..fe4b9064d31782025a971c22919aee32bd6ae45c --- /dev/null +++ b/arkoala-arkts/arkui/src/handwritten/NodeController.ts @@ -0,0 +1,7 @@ +import { FrameNode } from "../generated/ArkFrameNodeMaterialized"; + +export class NodeControllerDemo { + makeNode():FrameNode|null { + return null; + } +} \ No newline at end of file diff --git a/arkoala-arkts/arkui/src/handwritten/index.ts b/arkoala-arkts/arkui/src/handwritten/index.ts index d2bde379dd3be8325b6d3f42f85c1c5759c9acc6..d3874b6969b23058e2535f8492d0e5a7a704fc31 100644 --- a/arkoala-arkts/arkui/src/handwritten/index.ts +++ b/arkoala-arkts/arkui/src/handwritten/index.ts @@ -4,8 +4,8 @@ export * from "./ArkPageTransitionData" export * from "./Router" export * from "./ForeignFunctions" export * from "./resources" - - +export * from "./BuilderNdoe" +export * from "./NodeController" // TODO: implement this export interface AttributeModifier {} export interface SubscribaleAbstract {} diff --git a/arkoala-arkts/arkui/types/index-full.d.ts b/arkoala-arkts/arkui/types/index-full.d.ts index 4de299b586003113694f51a0117a53011987d4fe..d5ae92e2378e66d85df2cb0792fc1d00c502c4fe 100644 --- a/arkoala-arkts/arkui/types/index-full.d.ts +++ b/arkoala-arkts/arkui/types/index-full.d.ts @@ -292,8 +292,36 @@ declare class DrawingCanvas { constructor(pixelmap: PixelMap); drawRect(left: number, top: number, right: number, bottom: number): void; } -declare class NodeController { + +declare enum NodeRenderType { + RENDER_TYPE_DISPLAY = 0, + RENDER_TYPE_TEXTURE = 1, +} +declare class RenderOptions { + selfIdealSize?: Size; + type?: NodeRenderType; + surfaceId?: string; } +declare class WrappedBuilder { + constructor( + /** @memo */ + builder: (args: Args) => void + ); + /** @memo */ + builder: (args: Args) => void; +} +declare class BuilderNode { + constructor(options?: RenderOptions); + build(builder: WrappedBuilder, arg?: Args): void; + getFrameNode(): FrameNode | null; + update(arg: Args): void; + dispose(): void; +} + +declare class NodeControllerDemo { + + makeNode():FrameNode|null; + } declare class TextModifier { } declare enum RectWidthStyle { @@ -5174,7 +5202,7 @@ declare class NavigatorAttribute extends CommonMethod { params(value: Object): NavigatorAttribute; } declare interface NodeContainerInterface { - (controller: NodeController): NodeContainerAttribute; + (controller: NodeControllerDemo): NodeContainerAttribute; } declare class NodeContainerAttribute extends CommonMethod { } diff --git a/arkoala-arkts/shopping/user/src/Page.ts b/arkoala-arkts/shopping/user/src/Page.ts index e71474c5feffe3156c171dbfdbba0ae2c3c62a1b..cae7c0ba21661a276ae06d337acdc8aa8f51dd01 100644 --- a/arkoala-arkts/shopping/user/src/Page.ts +++ b/arkoala-arkts/shopping/user/src/Page.ts @@ -1,4 +1,4 @@ -import { Index } from "app/pages/index-entry" +import { Index } from "app/pages/test" import { UserView, UserViewBuilder } from "@koalaui/arkts-arkui" export class ComExampleShoppingApplication extends UserView { diff --git a/arkoala-arkts/shopping/user/src/ets/pages/test.ets b/arkoala-arkts/shopping/user/src/ets/pages/test.ets new file mode 100644 index 0000000000000000000000000000000000000000..6a4b4242bea4b875f3d1633f361aecc8acc51c8f --- /dev/null +++ b/arkoala-arkts/shopping/user/src/ets/pages/test.ets @@ -0,0 +1,71 @@ + +@Builder +function test(obj:Test2[]) { + Column(){ + + Text(obj[0].name) + Text("hello2") + Text("hello3") + } +} + +@Builder +function test2(obj:Test2[]) { + Column(){ + + Text(obj[0].name) + Button("button2") + Text("hello3") + } +} + +class Test2 { + name:string ='hello wood'; +} + + +class NodeControllerTest extends NodeControllerDemo { + + public change:boolean =false; + node: BuilderNode|null = null; + + makeNode(): FrameNode | null { + if(this.node ==undefined) { + this.node= new BuilderNode(); + let w1: WrappedBuilder = new WrappedBuilder(test); + let obj: Test2 = {name:"hello wood"}; + this.node?.build(w1, [obj]); + let frameNode = this.node?.getFrameNode(); + if(frameNode !=null) { + return frameNode; + } + } else { + let obj: Test2 = {name:"hello wood3"}; + let w2: WrappedBuilder = new WrappedBuilder(test2); + this.node?.build(w2, [obj]); + let frameNode = this.node?.getFrameNode(); + if(frameNode) { + return frameNode; + } + } + return null; + } +} + +@Entry +@Component +struct Index { + controller:NodeControllerTest = new NodeControllerTest() + build() { + Column() { + Button("onClick").onClick(()=>{ + this.controller.makeNode(); + }) + Button("updateArgs").onClick(()=>{ + this.controller.makeNode(); + }) + Text("hello") + NodeContainer(this.controller) + } + } +} \ No newline at end of file diff --git a/arkoala/arkui-common/config/tsconfig.base.json b/arkoala/arkui-common/config/tsconfig.base.json index 01621564f7f47f70ff76a6141ec9e4398177e527..27e5bbd13ccf281fcd7312e71b02dee9a19c6099 100644 --- a/arkoala/arkui-common/config/tsconfig.base.json +++ b/arkoala/arkui-common/config/tsconfig.base.json @@ -218,7 +218,8 @@ "UIExtensionComponent", "RichEditor", "CachedImage", - "TestComponent" + "TestComponent", + "NodeContainer", ], "extend": { "decorator": [ @@ -785,6 +786,11 @@ "name": "TestComponent", "type": "TestComponentAttribute", "instance": "TestComponentInstance" + }, + { + "name": "NodeContainer", + "type": "NodeContainerAttribute", + "instance": "NodeContainerInstance" } ] }, diff --git a/arkoala/arkui-types/index-full.d.ts b/arkoala/arkui-types/index-full.d.ts index 31f758598c3fdbbf4343a2e7946d69d3012a6d46..4940ce8600719ac569090cadba8ea1e1bbfe8acf 100644 --- a/arkoala/arkui-types/index-full.d.ts +++ b/arkoala/arkui-types/index-full.d.ts @@ -371,6 +371,7 @@ declare class DrawingCanvas { drawRect(left: number, top: number, right: number, bottom: number): void; } declare class NodeController { + makeNode():FrameNOde|null; } declare class TextModifier { } diff --git a/arkoala/arkui/src/generated/ArkArkuiExternalInterfaces.ts b/arkoala/arkui/src/generated/ArkArkuiExternalInterfaces.ts index 9f5a1f878f71db10e3eef24ce665ccf7e71e9734..1e7a1eb4ef2eb3fb724acdd16be93a2ea5eb43b4 100644 --- a/arkoala/arkui/src/generated/ArkArkuiExternalInterfaces.ts +++ b/arkoala/arkui/src/generated/ArkArkuiExternalInterfaces.ts @@ -23,8 +23,7 @@ import { BusinessError } from "./ArkBaseInterfaces" import { Resource } from "./ArkResourceInterfaces" import { FontStyle, FontWeight, TextAlign, TextOverflow, TextCase, WordBreak } from "./ArkEnumsInterfaces" import { Dimension } from "./ArkUnitsInterfaces" -export interface NodeController { -} + export interface TextModifier { } export enum RectWidthStyle { diff --git a/arkoala/arkui/src/generated/ArkNodeContainer.ts b/arkoala/arkui/src/generated/ArkNodeContainer.ts index 8b414cf76cd72576a6316250798eb358aa947db7..31f8419088ab23838e959bbbee30b41576a19424 100644 --- a/arkoala/arkui/src/generated/ArkNodeContainer.ts +++ b/arkoala/arkui/src/generated/ArkNodeContainer.ts @@ -48,7 +48,7 @@ import { PinchGestureInterface } from "./ArkPinchGestureInterfaceMaterialized" import { SwipeGestureInterface } from "./ArkSwipeGestureInterfaceMaterialized" import { RotationGestureInterface } from "./ArkRotationGestureInterfaceMaterialized" import { GestureGroupInterface } from "./ArkGestureGroupInterfaceMaterialized" -import { LengthUnit, ShapeSize, PathShapeOptions, RectShapeOptions, RoundRectShapeOptions, NodeController } from "./ArkArkuiExternalInterfaces" +import { LengthUnit, ShapeSize, PathShapeOptions, RectShapeOptions, RoundRectShapeOptions } from "./ArkArkuiExternalInterfaces" import { ClickEvent } from "./ArkClickEventMaterialized" import { HoverEvent } from "./ArkHoverEventMaterialized" import { MouseEvent } from "./ArkMouseEventMaterialized" @@ -98,7 +98,7 @@ export function ArkNodeContainer( NodeAttach((): ArkNodeContainerPeer => ArkNodeContainerPeer.create(receiver), (_: ArkNodeContainerPeer) => { receiver.setNodeContainerOptions(controller) style?.(receiver) - content_?.() + // controller.builder?.() receiver.applyAttributesFinish() }) } diff --git a/arkoala/arkui/src/generated/peers/Serializer.ts b/arkoala/arkui/src/generated/peers/Serializer.ts index f32f78a994111b4640678c3aefce1681c07fb011..07f0d7c8010851ad647ea0934a240c6eb90c57ce 100644 --- a/arkoala/arkui/src/generated/peers/Serializer.ts +++ b/arkoala/arkui/src/generated/peers/Serializer.ts @@ -28,7 +28,8 @@ import { Callback_RangeUpdate } from "./../ArkArkuiCustomInterfaces" import { ContentDidScrollCallback, OnSwiperAnimationEndCallback, OnSwiperAnimationStartCallback, OnSwiperGestureSwipeCallback, IndicatorStyle, SwiperAttribute, SwiperDisplayMode, SwiperNestedScrollMode, SwiperContentAnimatedTransition, ArrowStyle, SwiperAutoFill, SwiperAnimationEvent } from "./../ArkSwiperInterfaces" import { CustomNodeBuilder } from "./../ArkCustomBuilderInterfaces" import { EditableTextOnChangeCallback, OnDidChangeCallback, DecorationStyleResult, Affinity, TextRange, StyledStringChangeValue, TextMenuItem, MenuType, CaretStyle, InsertValue, DeleteValue, TextDeleteDirection, LineMetrics, PositionWithAffinity, PreviewText, TextBox, TextDataDetectorConfig, FontSettingOptions, TextDataDetectorType, StyledStringChangedListener } from "./../ArkTextCommonInterfaces" -import { ErrorCallback, LengthUnit, WebHeader, TextModifier, Want, ShapeSize, PathShapeOptions, RectShapeOptions, RoundRectShapeOptions, RectWidthStyle, RectHeightStyle, MeasureOptions, FontInfo, FontOptions, SnapshotOptions, EffectScope, EffectDirection, NodeController } from "./../ArkArkuiExternalInterfaces" +import { ErrorCallback, LengthUnit, WebHeader, TextModifier, Want, ShapeSize, PathShapeOptions, RectShapeOptions, RoundRectShapeOptions, RectWidthStyle, RectHeightStyle, MeasureOptions, FontInfo, FontOptions, SnapshotOptions, EffectScope, EffectDirection } from "./../ArkArkuiExternalInterfaces" +import { NodeController } from "src/ArkArkui-externalInterfaces" import { GetItemMainSizeByIndex, WaterFlowAttribute, SectionOptions, WaterFlowOptions, WaterFlowLayoutMode } from "./../ArkWaterFlowInterfaces" import { ImageCompleteCallback, ImageLoadResult } from "./../ArkImageSpanInterfaces" import { ImageErrorCallback, ResizableOptions, DrawingLattice, DrawingColorFilter, ResolutionQuality, ImageError, ImageSourceSize } from "./../ArkImageInterfaces" @@ -17020,8 +17021,7 @@ export class Serializer extends SerializerBase { valueSerializer.writeInt32(value_buttonType_value.valueOf()) } } - writeNodeController(value: NodeController): void { - } + writeNavigationTransitionProxy(value: NavigationTransitionProxy): void { let valueSerializer: Serializer = this valueSerializer.writePointer(toPeerPtr(value)) diff --git a/arkoala/arkui/src/handwritten/NodeController.ts b/arkoala/arkui/src/handwritten/NodeController.ts new file mode 100644 index 0000000000000000000000000000000000000000..1aece86060d9fd230a234df7d7a685a8aa85091f --- /dev/null +++ b/arkoala/arkui/src/handwritten/NodeController.ts @@ -0,0 +1,6 @@ +export class NodeController { + /** @memo */ + makeNode():FrameNode|null { + return null; + } +} \ No newline at end of file