From 9a6fef166ab2bfe58527969f76a6ec41a9ed480d Mon Sep 17 00:00:00 2001 From: Tianer Zhou Date: Mon, 20 Jan 2025 11:41:45 +0800 Subject: [PATCH 1/6] generate lazyForEachOps new interface Signed-off-by: Tianer Zhou --- build.sh | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100755 build.sh diff --git a/build.sh b/build.sh new file mode 100755 index 000000000..ab1d92395 --- /dev/null +++ b/build.sh @@ -0,0 +1,8 @@ + +#!/bin/bash +cd arkoala-arkts +npm run --prefix application clean +npm run arkoala:har-arm32 +npm run har-arm32 --prefix shopping +cd application +npm run launch \ No newline at end of file -- Gitee From b2210710c0ccce41f92a42ea1af7f399f3362a26 Mon Sep 17 00:00:00 2001 From: Tianer Zhou Date: Sun, 26 Jan 2025 14:57:51 +0800 Subject: [PATCH 2/6] setup range mode prototype Signed-off-by: Tianer Zhou --- arkoala-arkts/arkui/src/LazyForEach.ts | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/arkoala-arkts/arkui/src/LazyForEach.ts b/arkoala-arkts/arkui/src/LazyForEach.ts index 3acd403c2..4cdf3cbd5 100644 --- a/arkoala-arkts/arkui/src/LazyForEach.ts +++ b/arkoala-arkts/arkui/src/LazyForEach.ts @@ -117,8 +117,10 @@ export function LazyForEach(dataSource: IDataSource, ) { let current = rememberMutableState(-1) let mark = rememberMutableState(nullptr) - let version = rememberMutableState(0) - console.log(`LazyForEach current=${current.value} version=${version.value} mark=${mark.value}`) + let end = rememberMutableState(-1) + let version = rememberMutableState(0) + const rangeMode = true + console.log(`LazyForEach current=${current.value} version=${version.value} mark=${mark.value}`) let parent = contextNode() const visibleRange = new VisibleRange(parent, current.value, current.value) @@ -127,13 +129,31 @@ export function LazyForEach(dataSource: IDataSource, console.log(`LazyForEach[${parent}]: current updated to ${currentIndex} ${currentMark} end=${end}`) current.value = currentIndex mark.value = currentMark - version.value++ }) }) // Subscribe to version changes. version.value let generator = (element: T, index: number): int32 => keyGenerator ? hashCodeFromString(keyGenerator!(element, index)) : index as int32 + + if (rangeMode) { + parent.setInsertMark(nullptr, false) + for (let i = current.value as int32; i <= end.value; i++) { + if (i < 0 || i >= dataSource.totalCount()) break + const element: T = dataSource.getData(i as int32) + memoEntry2( + __context(), + generator(element, i as int32), + (element: T, index: number): void => itemGenerator(element, index), + element, + i as int32 + ) + } + LazyForEachManager.Prepare(parent) // temp: use prepare to map node to index + parent.setInsertMark(nullptr, false) + return + } + let index: number = visibleRange.indexUp as number LazyForEachManager.Prepare(parent) -- Gitee From 474acb4ad5995d87ceffd888b78ae020a18ee1b7 Mon Sep 17 00:00:00 2001 From: Tianer Zhou Date: Mon, 27 Jan 2025 16:51:50 +0800 Subject: [PATCH 3/6] remove local script Signed-off-by: Tianer Zhou --- build.sh | 8 -------- 1 file changed, 8 deletions(-) delete mode 100755 build.sh diff --git a/build.sh b/build.sh deleted file mode 100755 index ab1d92395..000000000 --- a/build.sh +++ /dev/null @@ -1,8 +0,0 @@ - -#!/bin/bash -cd arkoala-arkts -npm run --prefix application clean -npm run arkoala:har-arm32 -npm run har-arm32 --prefix shopping -cd application -npm run launch \ No newline at end of file -- Gitee From ff5e1a2df131f5c70e2194574452728e10e530cf Mon Sep 17 00:00:00 2001 From: Tianer Zhou Date: Mon, 27 Jan 2025 17:16:23 +0800 Subject: [PATCH 4/6] remove redundant line Signed-off-by: Tianer Zhou --- arkoala-arkts/arkui/src/LazyForEach.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/arkoala-arkts/arkui/src/LazyForEach.ts b/arkoala-arkts/arkui/src/LazyForEach.ts index 4cdf3cbd5..c28c1c28a 100644 --- a/arkoala-arkts/arkui/src/LazyForEach.ts +++ b/arkoala-arkts/arkui/src/LazyForEach.ts @@ -150,7 +150,6 @@ export function LazyForEach(dataSource: IDataSource, ) } LazyForEachManager.Prepare(parent) // temp: use prepare to map node to index - parent.setInsertMark(nullptr, false) return } -- Gitee From 56d7d967534875f10e7651636ac34483c4b3a162 Mon Sep 17 00:00:00 2001 From: Tianer Zhou Date: Sat, 1 Feb 2025 10:29:35 +0800 Subject: [PATCH 5/6] merge changes Signed-off-by: Tianer Zhou --- arkoala-arkts/arkui/src/LazyForEach.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/arkoala-arkts/arkui/src/LazyForEach.ts b/arkoala-arkts/arkui/src/LazyForEach.ts index c28c1c28a..c25a0ea52 100644 --- a/arkoala-arkts/arkui/src/LazyForEach.ts +++ b/arkoala-arkts/arkui/src/LazyForEach.ts @@ -125,10 +125,11 @@ export function LazyForEach(dataSource: IDataSource, let parent = contextNode() const visibleRange = new VisibleRange(parent, current.value, current.value) remember(() => { - LazyForEachManager.OnRangeUpdate(visibleRange.parent, dataSource.totalCount() as int32, (currentIndex: int32, currentMark: pointer, end: int32) => { + LazyForEachManager.OnRangeUpdate(visibleRange.parent, dataSource.totalCount() as int32, (currentIndex: int32, currentMark: pointer, e: int32) => { console.log(`LazyForEach[${parent}]: current updated to ${currentIndex} ${currentMark} end=${end}`) current.value = currentIndex mark.value = currentMark + end.value = e }) }) // Subscribe to version changes. -- Gitee From d08339af159ed143d9e4e7eb7c43551ff60540c1 Mon Sep 17 00:00:00 2001 From: Tianer Zhou Date: Sat, 8 Feb 2025 16:49:32 +0800 Subject: [PATCH 6/6] range update temp solution Signed-off-by: Tianer Zhou --- arkoala-arkts/arkui/src/LazyForEach.ts | 11 ++++++++++- arkoala-arkts/arkui/src/generated/PeerNode.ts | 4 ++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/arkoala-arkts/arkui/src/LazyForEach.ts b/arkoala-arkts/arkui/src/LazyForEach.ts index c25a0ea52..9b3acfe29 100644 --- a/arkoala-arkts/arkui/src/LazyForEach.ts +++ b/arkoala-arkts/arkui/src/LazyForEach.ts @@ -116,6 +116,7 @@ export function LazyForEach(dataSource: IDataSource, keyGenerator?: (item: T, index: number) => string, ) { let current = rememberMutableState(-1) + let prevStart = rememberMutableState(-1) let mark = rememberMutableState(nullptr) let end = rememberMutableState(-1) let version = rememberMutableState(0) @@ -127,6 +128,7 @@ export function LazyForEach(dataSource: IDataSource, remember(() => { LazyForEachManager.OnRangeUpdate(visibleRange.parent, dataSource.totalCount() as int32, (currentIndex: int32, currentMark: pointer, e: int32) => { console.log(`LazyForEach[${parent}]: current updated to ${currentIndex} ${currentMark} end=${end}`) + prevStart.value = current.value current.value = currentIndex mark.value = currentMark end.value = e @@ -138,9 +140,16 @@ export function LazyForEach(dataSource: IDataSource, let generator = (element: T, index: number): int32 => keyGenerator ? hashCodeFromString(keyGenerator!(element, index)) : index as int32 if (rangeMode) { - parent.setInsertMark(nullptr, false) for (let i = current.value as int32; i <= end.value; i++) { + parent.setInsertMark(nullptr, false) if (i < 0 || i >= dataSource.totalCount()) break + if (i < prevStart.value) { + if (i == current.value) { + parent.setInsertMark(mark.value, true) // insert before the previous range + } else { + parent.changeInsertDirection(false) // insert after the first element + } + } const element: T = dataSource.getData(i as int32) memoEntry2( __context(), diff --git a/arkoala-arkts/arkui/src/generated/PeerNode.ts b/arkoala-arkts/arkui/src/generated/PeerNode.ts index d39f4d705..9fc6f72c9 100644 --- a/arkoala-arkts/arkui/src/generated/PeerNode.ts +++ b/arkoala-arkts/arkui/src/generated/PeerNode.ts @@ -30,6 +30,10 @@ export class PeerNode extends IncrementalNode { this.insertDirection = upDirection ? 0 : 1 } + changeInsertDirection(upDirection: boolean) { + this.insertDirection = upDirection ? 0 : 1 + } + constructor(peerPtr: pointer, id: int32, name: string, flags: int32) { super(PeerNodeType) this.id = id -- Gitee