From 83f029503807c98ac9e0d0b1c10d4dee10058aed Mon Sep 17 00:00:00 2001 From: Kirill Kirichenko Date: Wed, 30 Apr 2025 11:51:10 +0300 Subject: [PATCH] Wrap routed pages in PageComponent Signed-off-by: Kirill Kirichenko --- .../arkui/sdk/generated/context_menu.ets | 2 ++ arkoala-arkts/arkui/src/PeerNode.ts | 33 +++++++++++------- .../arkts/ArkUIGeneratedNativeModule.ts | 2 ++ .../arkui/src/generated/static_components.ts | 34 +++++++++++++++++++ arkoala-arkts/arkui/src/handwritten/Router.ts | 11 ++++-- arkoala-arkts/arkui/types/index-full.d.ts | 2 ++ .../src/generated/arkoala_api_generated.h | 7 ++++ .../native/src/generated/bridge_generated.cc | 4 +++ .../native/src/generated/dummy_impl.cc | 25 ++++++++++++++ .../native/src/generated/real_impl.cc | 16 +++++++++ 10 files changed, 122 insertions(+), 14 deletions(-) diff --git a/arkoala-arkts/arkui/sdk/generated/context_menu.ets b/arkoala-arkts/arkui/sdk/generated/context_menu.ets index 9e1ad44ab..7a660d682 100644 --- a/arkoala-arkts/arkui/sdk/generated/context_menu.ets +++ b/arkoala-arkts/arkui/sdk/generated/context_menu.ets @@ -23,3 +23,5 @@ import { BuilderLambda } from "@koalaui/builderLambda" export declare class ContextMenu { static close(): void } +export declare interface RoutedPage { +} diff --git a/arkoala-arkts/arkui/src/PeerNode.ts b/arkoala-arkts/arkui/src/PeerNode.ts index bda48c3d3..577578d3b 100644 --- a/arkoala-arkts/arkui/src/PeerNode.ts +++ b/arkoala-arkts/arkui/src/PeerNode.ts @@ -143,20 +143,25 @@ export class PeerNode extends IncrementalNode { this.insertMark = peerPtr return } - // Find the closest peer node backward. - let sibling: PeerNode | undefined = findSiblingPeerNode(child, false) - if (sibling === undefined) { - // Add child to the beginning. - this.peer.insertChildAt(peerPtr, 0) + + if (this.name == "Root") { + this.peer.insertChildAfter(peerPtr, nullptr) } else { - // Find the closest peer node forward. - sibling = findSiblingPeerNode(child, true) + // Find the closest peer node backward. + let sibling: PeerNode | undefined = findSiblingPeerNode(child, false) if (sibling === undefined) { - // Add to the end (common case!). - this.peer.addChild(peerPtr) + // Add child to the beginning. + this.peer.insertChildAt(peerPtr, 0) } else { - // Insert child in the middle. - this.peer.insertChildBefore(peerPtr, sibling?.peer?.ptr ?? nullptr) + // Find the closest peer node forward. + sibling = findSiblingPeerNode(child, true) + if (sibling === undefined) { + // Add to the end (common case!). + this.peer.addChild(peerPtr) + } else { + // Insert child in the middle. + this.peer.insertChildBefore(peerPtr, sibling?.peer?.ptr ?? nullptr) + } } } } @@ -164,7 +169,11 @@ export class PeerNode extends IncrementalNode { this.onChildRemoved = (child: IncrementalNode) => { if (child.isKind(PeerNodeType) && !child.disposed) { const peer = child as PeerNode - peer.onRecycle() + if (this.name == "Root") { + this.peer.removeChild(peerPtr) + } else { + peer.onRecycle() + } } } this.name = name diff --git a/arkoala-arkts/arkui/src/generated/arkts/ArkUIGeneratedNativeModule.ts b/arkoala-arkts/arkui/src/generated/arkts/ArkUIGeneratedNativeModule.ts index 7a83b3c56..125665397 100644 --- a/arkoala-arkts/arkui/src/generated/arkts/ArkUIGeneratedNativeModule.ts +++ b/arkoala-arkts/arkui/src/generated/arkts/ArkUIGeneratedNativeModule.ts @@ -28,6 +28,8 @@ export class ArkUIGeneratedNativeModule { @ani.unsafe.Direct native static _ComponentRoot_construct(id: KInt, flags: KInt): KPointer @ani.unsafe.Direct + native static _RoutedPage_construct(id: KInt, flags: KInt): KPointer + @ani.unsafe.Direct native static _AbilityComponent_construct(id: KInt, flags: KInt): KPointer @ani.unsafe.Direct native static _AbilityComponentInterface_setAbilityComponentOptions(ptr: KPointer, thisArray: KSerializerBuffer, thisLength: int32): void diff --git a/arkoala-arkts/arkui/src/generated/static_components.ts b/arkoala-arkts/arkui/src/generated/static_components.ts index 5ae023ab9..8ffc3b384 100644 --- a/arkoala-arkts/arkui/src/generated/static_components.ts +++ b/arkoala-arkts/arkui/src/generated/static_components.ts @@ -50,6 +50,18 @@ export class ArkComponentRootPeer extends PeerNode { return _peer } } +export class ArkRoutedPagePeer extends PeerNode { + protected constructor(peerPtr: KPointer, id: int32, name: string = "", flags: int32 = 0) { + super(peerPtr, id, name, flags) + } + public static create(component?: ComponentBase, flags: int32 = 0): ArkRoutedPagePeer { + const peerId = PeerNode.nextId() + const _peerPtr = ArkUIGeneratedNativeModule._RoutedPage_construct(peerId, flags) + const _peer = new ArkRoutedPagePeer(_peerPtr, peerId, "RoutedPage", flags) + component?.setPeer(_peer) + return _peer + } +} export interface Root { attributeModifier(value: AttributeModifier | undefined): this } @@ -69,6 +81,10 @@ export interface UIComponentRoot { /** @memo */ attributeModifier(value: AttributeModifier | undefined): this } +export interface RoutedPage { +} +export interface RootNonUI { +} export class ArkComponentRootStyle implements ComponentRoot { public attributeModifier(value: AttributeModifier | undefined): this { throw new Error("Not implemented") @@ -104,3 +120,21 @@ export class ArkComponentRootComponent extends ComponentBase implements UICompon super.applyAttributesFinish() } } +export interface RoutedPageNonUI { +} +export class ArkRoutedPageAttributes implements RoutedPageNonUI { +} +/** @memo:stable */ +export class ArkRoutedPageComponent extends ComponentBase implements RoutedPage { + getPeer(): ArkRoutedPagePeer { + return (this.peer as ArkRoutedPagePeer) + } + public applyAttributesFinish(): void { + // we call this function outside of class, so need to make it public + super.applyAttributesFinish() + } + /** @memo */ + public applyAttributes(attrs: ArkRoutedPageAttributes): void { + super.applyAttributes(attrs) + } +} diff --git a/arkoala-arkts/arkui/src/handwritten/Router.ts b/arkoala-arkts/arkui/src/handwritten/Router.ts index 8d960ff2c..0037fec3a 100644 --- a/arkoala-arkts/arkui/src/handwritten/Router.ts +++ b/arkoala-arkts/arkui/src/handwritten/Router.ts @@ -25,12 +25,14 @@ import { arrayState, RunEffect, scheduleCallback, + NodeAttach, } from "@koalaui/runtime" import OhosRouter from "../ohos.router" import { UserViewBuilder, UserView } from "../UserView" import { ArkUINativeModule } from "#components" -import { CommonMethod, CustomBuilder, Dimension, LayoutSafeAreaEdge, LayoutSafeAreaType, Length, NavBarPosition, NavContentInfo, NavigationAnimatedTransition, NavigationCommonTitle, NavigationCustomTitle, NavigationMenuItem, NavigationMode, NavigationOperation, NavigationTitleMode, NavigationTitleOptions, NavigationToolbarOptions, PixelMap, Resource, ResourceStr, SymbolGlyphModifier, SystemBarStyle, ToolbarItem } from "../generated" import { RouteType } from "../generated" +import { ArkRoutedPagePeer } from "../generated" +import { PeerNode } from "../PeerNode" /** * THEORY OF OPERATIONS @@ -421,7 +423,12 @@ export function Routed( (page: VisiblePage, index: int32): int32 => { return page.version }, (page: VisiblePage, index: int32): void => { WithRouterTransitionState(page.transition, () => { - page.page() + NodeAttach( + () => ArkRoutedPagePeer.create(), + (node: PeerNode) => { + page.page() + } + ) }) } ) diff --git a/arkoala-arkts/arkui/types/index-full.d.ts b/arkoala-arkts/arkui/types/index-full.d.ts index 34326cc57..c79fb9aad 100644 --- a/arkoala-arkts/arkui/types/index-full.d.ts +++ b/arkoala-arkts/arkui/types/index-full.d.ts @@ -1478,6 +1478,8 @@ declare interface Root { } declare interface ComponentRoot { } +declare interface RoutedPage { +} declare class EventEmulator { static emitClickEvent(node: number|bigint, event: ClickEvent): void; static emitTextInputEvent(node: number|bigint, text: string): void; diff --git a/arkoala-arkts/framework/native/src/generated/arkoala_api_generated.h b/arkoala-arkts/framework/native/src/generated/arkoala_api_generated.h index dcab78262..c123ebc25 100644 --- a/arkoala-arkts/framework/native/src/generated/arkoala_api_generated.h +++ b/arkoala-arkts/framework/native/src/generated/arkoala_api_generated.h @@ -17336,6 +17336,11 @@ typedef struct GENERATED_ArkUIComponentRootModifier { Ark_Int32 flags); } GENERATED_ArkUIComponentRootModifier; +typedef struct GENERATED_ArkUIRoutedPageModifier { + Ark_NativePointer (*construct)(Ark_Int32 id, + Ark_Int32 flags); +} GENERATED_ArkUIRoutedPageModifier; + typedef struct GENERATED_ArkUIAbilityComponentModifier { Ark_NativePointer (*construct)(Ark_Int32 id, Ark_Int32 flags); @@ -24064,6 +24069,7 @@ typedef struct GENERATED_ArkUIGlobalScopeAccessor { typedef struct GENERATED_ArkUINodeModifiers { const GENERATED_ArkUIRootModifier* (*getRootModifier)(); const GENERATED_ArkUIComponentRootModifier* (*getComponentRootModifier)(); + const GENERATED_ArkUIRoutedPageModifier* (*getRoutedPageModifier)(); const GENERATED_ArkUIAbilityComponentModifier* (*getAbilityComponentModifier)(); const GENERATED_ArkUIAlphabetIndexerModifier* (*getAlphabetIndexerModifier)(); const GENERATED_ArkUIAnimatorModifier* (*getAnimatorModifier)(); @@ -24457,6 +24463,7 @@ typedef enum GENERATED_Ark_NodeType { GENERATED_ARKUI_RICH_TEXT, GENERATED_ARKUI_ROOT, GENERATED_ARKUI_ROOT_SCENE, + GENERATED_ARKUI_ROUTED_PAGE, GENERATED_ARKUI_ROW, GENERATED_ARKUI_ROW_SPLIT, GENERATED_ARKUI_SAVE_BUTTON, diff --git a/arkoala-arkts/framework/native/src/generated/bridge_generated.cc b/arkoala-arkts/framework/native/src/generated/bridge_generated.cc index cc226d6e3..b984e6fb0 100644 --- a/arkoala-arkts/framework/native/src/generated/bridge_generated.cc +++ b/arkoala-arkts/framework/native/src/generated/bridge_generated.cc @@ -45,6 +45,10 @@ Ark_NativePointer impl_Root_construct(Ark_Int32 id, Ark_Int32 flags) { return GetNodeModifiers()->getRootModifier()->construct(id, flags); } KOALA_INTEROP_DIRECT_2(Root_construct, Ark_NativePointer, Ark_Int32, Ark_Int32) +Ark_NativePointer impl_RoutedPage_construct(Ark_Int32 id, Ark_Int32 flags) { + return GetNodeModifiers()->getRoutedPageModifier()->construct(id, flags); +} +KOALA_INTEROP_DIRECT_2(RoutedPage_construct, Ark_NativePointer, Ark_Int32, Ark_Int32) Ark_NativePointer impl_AbilityComponent_construct(Ark_Int32 id, Ark_Int32 flags) { return GetNodeModifiers()->getAbilityComponentModifier()->construct(id, flags); } diff --git a/arkoala-arkts/framework/native/src/generated/dummy_impl.cc b/arkoala-arkts/framework/native/src/generated/dummy_impl.cc index d17d18623..2ca8c7ff1 100644 --- a/arkoala-arkts/framework/native/src/generated/dummy_impl.cc +++ b/arkoala-arkts/framework/native/src/generated/dummy_impl.cc @@ -972,6 +972,22 @@ namespace OHOS::Ace::NG::GeneratedModifier { return new TreeNode("ComponentRoot", id, flags);; } } // ComponentRootModifier + namespace RoutedPageModifier { + Ark_NativePointer ConstructImpl(Ark_Int32 id, + Ark_Int32 flags) + { + if (!needGroupedLog(1)) + return new TreeNode("RoutedPage", id, flags);; + string out("construct("); + WriteToString(&out, id); + out.append(", "); + WriteToString(&out, flags); + out.append(") \n"); + out.append("[return nullptr] \n"); + appendGroupedLog(1, out); + return new TreeNode("RoutedPage", id, flags);; + } + } // RoutedPageModifier namespace AbilityComponentModifier { Ark_NativePointer ConstructImpl(Ark_Int32 id, Ark_Int32 flags) @@ -17988,6 +18004,14 @@ namespace OHOS::Ace::NG::GeneratedModifier { return &ArkUIComponentRootModifierImpl; } + const GENERATED_ArkUIRoutedPageModifier* GetRoutedPageModifier() + { + static const GENERATED_ArkUIRoutedPageModifier ArkUIRoutedPageModifierImpl { + RoutedPageModifier::ConstructImpl, + }; + return &ArkUIRoutedPageModifierImpl; + } + const GENERATED_ArkUIAbilityComponentModifier* GetAbilityComponentModifier() { static const GENERATED_ArkUIAbilityComponentModifier ArkUIAbilityComponentModifierImpl { @@ -20355,6 +20379,7 @@ namespace OHOS::Ace::NG::GeneratedModifier { static const GENERATED_ArkUINodeModifiers modifiersImpl = { GetRootModifier, GetComponentRootModifier, + GetRoutedPageModifier, GetAbilityComponentModifier, GetAlphabetIndexerModifier, GetAnimatorModifier, diff --git a/arkoala-arkts/framework/native/src/generated/real_impl.cc b/arkoala-arkts/framework/native/src/generated/real_impl.cc index 662cae7b7..5dad1a0a7 100644 --- a/arkoala-arkts/framework/native/src/generated/real_impl.cc +++ b/arkoala-arkts/framework/native/src/generated/real_impl.cc @@ -954,6 +954,13 @@ namespace OHOS::Ace::NG::GeneratedModifier { return {}; } } // ComponentRootModifier + namespace RoutedPageModifier { + Ark_NativePointer ConstructImpl(Ark_Int32 id, + Ark_Int32 flags) + { + return {}; + } + } // RoutedPageModifier namespace AbilityComponentModifier { Ark_NativePointer ConstructImpl(Ark_Int32 id, Ark_Int32 flags) @@ -8056,6 +8063,14 @@ namespace OHOS::Ace::NG::GeneratedModifier { return &ArkUIComponentRootModifierImpl; } + const GENERATED_ArkUIRoutedPageModifier* GetRoutedPageModifier() + { + static const GENERATED_ArkUIRoutedPageModifier ArkUIRoutedPageModifierImpl { + RoutedPageModifier::ConstructImpl, + }; + return &ArkUIRoutedPageModifierImpl; + } + const GENERATED_ArkUIAbilityComponentModifier* GetAbilityComponentModifier() { static const GENERATED_ArkUIAbilityComponentModifier ArkUIAbilityComponentModifierImpl { @@ -10423,6 +10438,7 @@ namespace OHOS::Ace::NG::GeneratedModifier { static const GENERATED_ArkUINodeModifiers modifiersImpl = { GetRootModifier, GetComponentRootModifier, + GetRoutedPageModifier, GetAbilityComponentModifier, GetAlphabetIndexerModifier, GetAnimatorModifier, -- Gitee