From 544df502d4ad55a30fdf586db516a4f94565ded5 Mon Sep 17 00:00:00 2001 From: Tatu Tomppo Date: Mon, 1 Sep 2025 16:28:06 +0300 Subject: [PATCH] Add MutableBuilder implementation for State Mgmt Signed-off-by: Tatu Tomppo Change-Id: I03f3a12a3251f81caad8ef88049dca59debb9497 --- .../engine/jsEnumStyle.js | 15 ++++++++++++ .../src/lib/partial_update/pu_view.ts | 21 +++++++++++++++++ .../src/lib/puv2_common/puv2_view_base.ts | 10 ++++++++ .../state_mgmt/src/lib/v2/v2_view.ts | 23 ++++++++++++++++++- 4 files changed, 68 insertions(+), 1 deletion(-) diff --git a/frameworks/bridge/declarative_frontend/engine/jsEnumStyle.js b/frameworks/bridge/declarative_frontend/engine/jsEnumStyle.js index 668f563c100..f575a0a0e1c 100644 --- a/frameworks/bridge/declarative_frontend/engine/jsEnumStyle.js +++ b/frameworks/bridge/declarative_frontend/engine/jsEnumStyle.js @@ -3775,12 +3775,27 @@ let DividerMode; function wrapBuilder(builder) { return new WrappedBuilder(builder); } + class WrappedBuilder { constructor(builder) { this.builder = builder; } } +function mutableBuilder(builder) { + return new MutableBuilder(builder); +} + +class MutableBuilder { + constructor(builder) { + this.builder = builder; + } + // Only for internal toolchain usage. + _dispatchBuilder(builder, ...args) { + this.mutableBuilderImpl.bind(this)(builder, ...args); + } +} + let TextSpanType; (function (TextSpanType) { TextSpanType[TextSpanType.TEXT = 0] = 'TEXT'; diff --git a/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/partial_update/pu_view.ts b/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/partial_update/pu_view.ts index 1fad89bfc75..d0a4749b484 100644 --- a/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/partial_update/pu_view.ts +++ b/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/partial_update/pu_view.ts @@ -1243,5 +1243,26 @@ abstract class ViewPU extends PUV2ViewBase stateMgmtConsole.applicationError(error); throw new Error(error); } + + protected mutableBuilderImpl( + builder: () => MutableBuilder, ...args: Args): void { + this.observeComponentCreation2((elmtId, isInitialRender) => { + If.create(); + const _wb = builder(); + // WeakMap that stores Builder and has builderID number for it. + let builderId = this.builderIdMap_.get(_wb); + + if (builderId === undefined) { + builderId = this.nextBuilderId_++; + this.builderIdMap_.set(_wb, builderId); + } + // Create branch for each Builder to ensure UI updating. + this.ifElseBranchUpdateFunction( + builderId, + () => _wb.builder.bind(this)(...args) + ); + If.pop(); + }, If); + } } // class ViewPU diff --git a/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/puv2_common/puv2_view_base.ts b/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/puv2_common/puv2_view_base.ts index b39ddf54fb6..93a8eab58b2 100644 --- a/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/puv2_common/puv2_view_base.ts +++ b/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/puv2_common/puv2_view_base.ts @@ -38,6 +38,11 @@ enum PrebuildPhase { //API Version 18 const API_VERSION_ISOLATION_FOR_5_1: number = 18; +// Declare MutableBuilder class to make it available for type-checking. See jsEnumStyle.js and +// build-tools\ets-loader\declarations\common.d.ts +declare class MutableBuilder { + builder(): (...args: Args) => void; +} // NativeView // implemented in C++ for release abstract class PUV2ViewBase extends ViewBuildNodeBase { @@ -56,6 +61,11 @@ abstract class PUV2ViewBase extends ViewBuildNodeBase { return (a < b) ? -1 : (a > b) ? 1 : 0; }; + // A map to associate builder objects with unique numeric IDs, used in ConditionalBuilder. + protected builderIdMap_: WeakMap = new WeakMap(); + // The next available builder ID to be assigned, starting from 1000000 to avoid conflict. + protected nextBuilderId_: number = 1000000; + // indicates the currently rendered or rendered UINode's elmtIds // or UINodeRegisterProxy.notRecordingDependencies if none is currently rendering // isRenderInProgress == true always when currentlyRenderedElmtIdStack_ length >= 0 diff --git a/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/v2/v2_view.ts b/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/v2/v2_view.ts index 4437048c2bf..98b91c5ab40 100644 --- a/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/v2/v2_view.ts +++ b/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/v2/v2_view.ts @@ -898,4 +898,25 @@ abstract class ViewV2 extends PUV2ViewBase implements IView { // transpiler will try to give a warning to hint that it will downgrade to normal V1 stateMgmtConsole.error(`${this.debugInfo__()}: Recycle not supported for ComponentV2 instance`); } -} + + protected mutableBuilderImpl( + builder: () => MutableBuilder, ...args: Args): void { + this.observeComponentCreation2((elmtId, isInitialRender) => { + If.create(); + const _wb = builder(); + // WeakMap that stores Builder and has builderID number for it. + let builderId = this.builderIdMap_.get(_wb); + + if (builderId === undefined) { + builderId = this.nextBuilderId_++; + this.builderIdMap_.set(_wb, builderId); + } + // Create branch for each Builder to ensure UI updating. + this.ifElseBranchUpdateFunction( + builderId, + () => _wb.builder.bind(this)(...args) + ); + If.pop(); + }, If); + } +} \ No newline at end of file -- Gitee