diff --git a/arkoala-arkts/arkui/src/Application.ts b/arkoala-arkts/arkui/src/Application.ts index b211551553345f905c4e5fb757d40e5402901283..ed28635739c0ed03a620873e9b33c677f5e98933 100644 --- a/arkoala-arkts/arkui/src/Application.ts +++ b/arkoala-arkts/arkui/src/Application.ts @@ -173,7 +173,7 @@ export class Application { start(): pointer { if (this.withLog) UserView.startNativeLog(1) - let root: PeerNode| undefined = undefined + let root: PeerNode | undefined = undefined try { this.manager = GlobalStateManager.instance this.timer = createAnimationTimer(this.manager!) @@ -211,9 +211,8 @@ export class Application { private updateState() { // NativeModule._NativeLog("ARKTS: updateState") - this.updateStates(this.manager!, this.rootState!) - // Here we request to draw a frame and call custom components JS callbacks. + // Here we request to draw a frame and call custom components callbacks. let root = this.rootState!.value ArkUINativeModule._MeasureLayoutAndDraw(root.peer.ptr) // Call callbacks and sync @@ -235,6 +234,7 @@ export class Application { // Update states. update.update() // Propagate changes. + manager.syncChanges() manager.updateSnapshot() // Notify subscriber. update.callback(true) @@ -307,6 +307,7 @@ export class Application { // TODO: make [emitEvent] suitable to get string argument emitEvent(type: int32, target: int32, arg0: int32, arg1: int32): string { + console.log("emitEvent for " + target) const node = PeerNode.findPeerByNativeId(target) if (node != undefined) { try { @@ -331,6 +332,8 @@ export class Application { } catch (error) { InteropNativeModule._NativeLog("emitEvent error: " + errorInfo(error as Object)) } + } else { + console.log(`Cannot find target node ${target}`) } return "0" } diff --git a/arkoala-arkts/arkui/src/NativePeerNode.ts b/arkoala-arkts/arkui/src/NativePeerNode.ts index 0097a5b0085f8015784b45ac8da621760ef6d491..2f8ef932c1f8b4147e5a572ba3fa2d9631e5b3c2 100644 --- a/arkoala-arkts/arkui/src/NativePeerNode.ts +++ b/arkoala-arkts/arkui/src/NativePeerNode.ts @@ -1,5 +1,5 @@ import { int32 } from "@koalaui/common" -import { pointer } from "@koalaui/interop" +import { nullptr, pointer } from "@koalaui/interop" import { Finalizable } from "@koalaui/interop" import { ArkUINativeModule } from "#components" import { PeerNode } from "./PeerNode" @@ -13,10 +13,6 @@ export class NativePeerNode extends Finalizable { return new NativePeerNode(peer, peerPtr) } - dispose() { - ArkUINativeModule._DisposeNode(this.ptr); - } - addChild(node: pointer) { ArkUINativeModule._AddChild(this.ptr, node) } diff --git a/arkoala-arkts/arkui/src/PeerNode.ts b/arkoala-arkts/arkui/src/PeerNode.ts index 69384bc7db0188fdc941a9aeaa53b6249a0b2a24..23cc9cfade4af0b013ffb010f5af18cff779430e 100644 --- a/arkoala-arkts/arkui/src/PeerNode.ts +++ b/arkoala-arkts/arkui/src/PeerNode.ts @@ -43,6 +43,7 @@ export class PeerNode extends IncrementalNode { constructor(peerPtr: pointer, id: int32, name: string, flags: int32) { super(PeerNodeType) + console.log(`create peer ${id} ${name}`) this.id = id this.peer = NativePeerNode.create(this, peerPtr, flags) PeerNode.peerNodeMap.set(this.id, this) @@ -71,16 +72,18 @@ export class PeerNode extends IncrementalNode { this.peer.insertChildAfter(peerPtr, sibling?.peer?.ptr ?? nullptr) } } - this.onChildRemoved = (child: IncrementalNode) => { - let peer = findPeerNode(child) - if (peer) { - this.peer.removeChild(peer.peer.ptr) - } - } - this.name = name } applyAttributes(attrs: Object) {} + dispose(): void { + let parent = this.parent + if (parent != undefined && parent.isKind(PeerNodeType)) { + (parent as PeerNode).peer.removeChild(this.peer.ptr) + } + this.peer.close() + PeerNode.peerNodeMap.delete(this.id) + super.dispose() + } } function findPeerNode(node: IncrementalNode): PeerNode | undefined { diff --git a/arkoala-arkts/arkui/src/generated/peers/CallbacksChecker.ts b/arkoala-arkts/arkui/src/generated/peers/CallbacksChecker.ts index 3baf92a0b31d30d7ab941da8a52aaf5ec6f29320..690797b391b04a66b147e72e5479e691b57ce983 100644 --- a/arkoala-arkts/arkui/src/generated/peers/CallbacksChecker.ts +++ b/arkoala-arkts/arkui/src/generated/peers/CallbacksChecker.ts @@ -38,12 +38,12 @@ export function checkArkoalaCallbacks() { case CallbackEventKind.Event_CallCallback: { deserializeAndCallCallback(deserializer) break; - } + } case CallbackEventKind.Event_HoldManagedResource: { const resourceId = deserializer.readInt32() ResourceHolder.instance().hold(resourceId) break; - } + } case CallbackEventKind.Event_ReleaseManagedResource: { const resourceId = deserializer.readInt32() ResourceHolder.instance().release(resourceId) diff --git a/arkoala-arkts/navigation/user/src/ets/navigation.ets b/arkoala-arkts/navigation/user/src/ets/navigation.ets index c5b31cf1d77312340236f91bdad466c9eff60c83..0561f7ef777fac17f3965147b952360cb666e168 100644 --- a/arkoala-arkts/navigation/user/src/ets/navigation.ets +++ b/arkoala-arkts/navigation/user/src/ets/navigation.ets @@ -21,12 +21,12 @@ struct NavigationPage { Button('Detail').width(200).height(100).backgroundColor(Color.Red) .onClick((e?: ClickEvent) => { console.log(" ### Button 1005: push.") // 1005 - this.pathInfos.pushPath({ name: 'detailPage' }) + this.pathInfos.pushPath(new NavPathInfo('detailPage', undefined)) }) Button('Search').width(200).height(100).backgroundColor(Color.Blue) .onClick((e?: ClickEvent) => { console.log(" ### Button 1006: push.") // 1006 - this.pathInfos.pushPath({ name: 'searchPage' }) + this.pathInfos.pushPath(new NavPathInfo('searchPage', undefined)) }) } .backgroundColor(Color.Green).width('100%').height('100%') diff --git a/arkoala-arkts/package.json b/arkoala-arkts/package.json index 7ce89e851701984f7e0b611e60fd82744ddf3b6d..0054ad391b51285490a03cf7e8fdaceccd2c83a1 100644 --- a/arkoala-arkts/package.json +++ b/arkoala-arkts/package.json @@ -68,7 +68,7 @@ "aot:host:arkoala": "npm run link:arkoala && npm run -C ../incremental/tools/fast-arktsc compile && npm run aot:host:stdlib && node ../incremental/tools/fast-arktsc --only-aot build/arkoala.abc", "aot:arm32:arkoala": "npm run link:arkoala && npm run -C ../incremental/tools/fast-arktsc compile && node ../incremental/tools/fast-arktsc --only-aot build/arkoala.abc --aot-target arm", "aot:arm64:arkoala": "npm run link:arkoala && npm run -C ../incremental/tools/fast-arktsc compile && node ../incremental/tools/fast-arktsc --only-aot build/arkoala.abc --aot-target arm64", - "build:user": "npm run build:user --prefix trivial/user && mkdir -p ./build && cp -r trivial/user/build/user.abc ./build/", + "build:user": "npm run build:user --prefix trivial/user && mkdir -p ./build && cp -r trivial/user/build/user.abc ./build/trivial.abc", "build:navigation": "npm run build:user --prefix navigation/user && mkdir -p ./build && cp -r navigation/user/build/user.abc ./build/navigation.abc", "build:shopping": "npm run build:user --prefix shopping/user && mkdir -p ./build && cp -r shopping/user/build/user.abc ./build/shopping.abc", "aot:host:stdlib": "node ../incremental/tools/fast-arktsc --only-aot ../incremental/tools/panda/node_modules/@panda/sdk/ets/etsstdlib.abc", diff --git a/arkoala-arkts/shopping/user/src/ets/pages/homePage/informance.ets b/arkoala-arkts/shopping/user/src/ets/pages/homePage/informance.ets index ff32a9df1a9e9273742b8960ecbe1afb6d9b85b4..76d4577b80672c97316109e6440ce9500830b9c2 100644 --- a/arkoala-arkts/shopping/user/src/ets/pages/homePage/informance.ets +++ b/arkoala-arkts/shopping/user/src/ets/pages/homePage/informance.ets @@ -39,15 +39,15 @@ export struct Information { Button("CallFetchWithCoroutine") .backgroundColor(this.color1) .width(200).height(100) - .onClick((e?: ClickEvent) => { + .onClick((e?: ClickEvent) => { this.swap(); callFetchWithCoroutine(); }) Button("CallFetchWithTaskPool") .backgroundColor(this.color2) .width(200).height(100) - .onClick((e?: ClickEvent) => { - this.swap() + .onClick((e?: ClickEvent) => { + this.swap() callFetchWithTaskPool(); }) Button("CallFetchWithEACoroutine") diff --git a/arkoala-arkts/trivial/user/src/Page.ts b/arkoala-arkts/trivial/user/src/Page.ts index f5f8e8428ca76e13d06d8df6180fa7085af05e76..1ee9695b6133863a056123504f1f030b5eb9c7b4 100644 --- a/arkoala-arkts/trivial/user/src/Page.ts +++ b/arkoala-arkts/trivial/user/src/Page.ts @@ -8,6 +8,7 @@ export class ComExampleTrivialApplication extends UserView { this.params = params } getBuilder(): UserViewBuilder { + console.log(`ComExampleTrivialApplication`) /** @memo */ let wrapper = () => { Page1() diff --git a/arkoala-arkts/trivial/user/src/ets/page1.ets b/arkoala-arkts/trivial/user/src/ets/page1.ets index 7495a440b13d11fe83e95fd762f985f54e363d89..d489d0e4882be0d4c3c4ba507933d85a0e91fcd4 100644 --- a/arkoala-arkts/trivial/user/src/ets/page1.ets +++ b/arkoala-arkts/trivial/user/src/ets/page1.ets @@ -91,12 +91,21 @@ struct Page1 { @State color1: string = '#ff0000' @State color2: string = '#00ff00' @State state: number = 1 + @State visible: boolean = false data: Array = makeArray(10) build() { console.log(`In Page1`) + Column() { + if (this.visible) { + console.log("With blinker") + Button("Blinker") + .width(200).height(100) + .backgroundColor('#ff0000') + } + ForEach(this.data, (item: string, index: number) => { Column() { Button("Hi") @@ -127,6 +136,7 @@ struct Page1 { .backgroundColor(Color.Gray) .justifyContent(FlexAlign.Center) }, (item:string, index: number) => item) + } } swap(): void { @@ -134,5 +144,6 @@ struct Page1 { let tmp = this.color1 this.color1 = this.color2 this.color2 = tmp + this.visible = !this.visible } } diff --git a/arkoala/framework/native/src/generated/dummy_impl.cc b/arkoala/framework/native/src/generated/dummy_impl.cc index be0db2ab3ffa99b344982792f4e0d5b817c59913..a9c45cceeff4bed3c8eb0f5a05a510898d033d4a 100644 --- a/arkoala/framework/native/src/generated/dummy_impl.cc +++ b/arkoala/framework/native/src/generated/dummy_impl.cc @@ -131,6 +131,24 @@ constexpr TreeNode *AsNode(From ptr) { return reinterpret_cast(ptr); } +void EmitOnClick(Ark_NativePointer node, Ark_ClickEvent event) { + LOGE("EmitOnclick %p", node); + auto frameNode = AsNode(node); + frameNode->callClickEvent(event); +} + +void RegisterOnClick(Ark_NativePointer node, const Callback_ClickEvent_Void* event) { + auto frameNode = AsNode(node); + auto callback = *event; + callback.resource.hold(callback.resource.resourceId); + auto onEvent = [frameNode, callback](Ark_ClickEvent event) { + if (callback.call) { + callback.call(callback.resource.resourceId, event); + } + }; + frameNode->setClickEvent(std::move(onEvent)); +} + void DumpTree(TreeNode *node, Ark_Int32 indent) { ARKOALA_LOG("%s[%s: %d]\n", string(indent * 2, ' ').c_str(), node->namePtr(), node->id()); for (auto child: *node->children()) { @@ -697,11 +715,6 @@ Ark_Float32 ConvertLengthMetricsUnit(Ark_Float32 value, Ark_Int32 originUnit, Ar return result; } -void EmitOnClick(Ark_NativePointer node, Ark_ClickEvent event) { - auto frameNode = AsNode(node); - frameNode->callClickEvent(event); -} - void SetCustomMethodFlag(Ark_NodeHandle node, Ark_Int32 flag) {} Ark_Int32 GetCustomMethodFlag(Ark_NodeHandle node) { return 0; @@ -918,6 +931,7 @@ namespace OHOS::Ace::NG::GeneratedModifier { void OnClick0Impl(Ark_NativePointer node, const Callback_ClickEvent_Void* value) { + RegisterOnClick(node, value); if (!needGroupedLog(1)) return; string out("onClick("); @@ -929,6 +943,7 @@ namespace OHOS::Ace::NG::GeneratedModifier { const Callback_ClickEvent_Void* event, const Ark_Number* distanceThreshold) { + RegisterOnClick(node, event); if (!needGroupedLog(1)) return; string out("onClick("); @@ -21684,6 +21699,7 @@ namespace OHOS::Ace::NG::GeneratedModifier { void EmitClickEventImpl(Ark_NativePointer node, Ark_ClickEvent event) { + EmitOnClick(node, event); if (!needGroupedLog(1)) return; string out("emitClickEvent("); diff --git a/arkoala/framework/native/src/tree.h b/arkoala/framework/native/src/tree.h index 42160f331d77eacd5aac09d6b49470cafe63feae..a47fb34ac64483d0ef2a9cd29c616fc979265f5a 100644 --- a/arkoala/framework/native/src/tree.h +++ b/arkoala/framework/native/src/tree.h @@ -109,6 +109,7 @@ struct TreeNode { const std::vector* children() { return &_children; } void dispose() { + fprintf(stderr, "Dispose node %p\n", this); delete this; } @@ -148,9 +149,10 @@ struct TreeNode { } int insertChildAfter(TreeNode* node, TreeNode* sibling) { - //fprintf(stderr, "insertChildAfter in %p what=%p where=%p\n", this, node, sibling); + // fprintf(stderr, "insertChildAfter in %p what=%p where=%p\n", this, node, sibling); - if (sibling == (TreeNode*)1) { + if (sibling == (TreeNode*)1 || sibling == nullptr) { + node->setParent(this); _children.push_back(node); return 0; } @@ -173,7 +175,7 @@ struct TreeNode { int insertChildBefore(TreeNode* node, TreeNode* sibling) { //fprintf(stderr, "insertChildBefore in %p what=%p where=%p\n", this, node, sibling); - if (sibling == (TreeNode*)1) { + if (sibling == (TreeNode*)1 || sibling == nullptr) { _children.insert(_children.begin(), node); return 0; } diff --git a/interop/src/interop/Finalizable.ts b/interop/src/interop/Finalizable.ts index 5f2bcbe20298436848653cf8f3a35e0f947eccc4..b130150ffe19e3a2cbce5bec549f480af945cfc7 100644 --- a/interop/src/interop/Finalizable.ts +++ b/interop/src/interop/Finalizable.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import { Wrapper, nullptr, isNullPtr } from "./Wrapper" +import { Wrapper, nullptr } from "./Wrapper" import { finalizerRegister, finalizerUnregister, Thunk } from "@koalaui/common" import { InteropNativeModule } from "./InteropNativeModule" import { pointer } from "./InteropTypes" @@ -30,7 +30,7 @@ export class NativeThunk implements Thunk { } clean() { - if (!isNullPtr(this.obj)) { + if (this.obj != nullptr) { this.destroyNative(this.obj, this.finalizer) } this.obj = nullptr @@ -75,7 +75,7 @@ export class Finalizable extends Wrapper { } close() { - if (isNullPtr(this.ptr)) { + if (this.ptr == nullptr) { throw new Error(`Closing a closed object: ` + this.toString()) } else if (this.cleaner == null) { throw new Error(`No thunk assigned to ` + this.toString())