From 7f8bc22dad5f32a67ffbb491f466b6e80581b5cb Mon Sep 17 00:00:00 2001 From: chenshenhai Date: Sat, 28 Aug 2021 01:15:37 +0800 Subject: [PATCH] fix: resource loader logic --- packages/core/examples/test/resource.html | 240 +++++++++++++++++++++- packages/core/src/index.ts | 9 +- packages/core/src/lib/diff.ts | 36 ++++ packages/core/src/lib/loader.ts | 2 + packages/core/src/lib/renderer.ts | 1 + scripts/screen.config.js | 1 + 6 files changed, 283 insertions(+), 6 deletions(-) diff --git a/packages/core/examples/test/resource.html b/packages/core/examples/test/resource.html index 8cb55a9..008d378 100644 --- a/packages/core/examples/test/resource.html +++ b/packages/core/examples/test/resource.html @@ -52,6 +52,16 @@
HTML
+ +
+
Image: update
+
+
+
SVG: update
+
+
+
HTML: update
+
@@ -106,7 +116,7 @@ data.elements[0].desc.src = temp2; data.elements[1].desc.src = temp1; core.setData(data); - }, 800); + }, 100); })(); @@ -144,7 +154,7 @@ data.elements[0].desc.svg = temp2; data.elements[1].desc.svg = temp1; core.setData(data); - }, 800); + }, 100); })(); @@ -280,12 +290,234 @@ data.elements[0].desc.height = 50; data.elements[1].desc.height = 100; core.setData(data); - }, 800); - }, 800); + }, 100); + }, 100); })(); + + + + + diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 1c88ae2..0e70841 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -24,7 +24,7 @@ import { _transfromElement, _emitChangeScreen, _emitChangeData, _onlyRender, _cursorStatus, } from './names'; import { Mode, CursorStatus } from './constant/static'; -import { diffElementResourceChangeList } from './lib/diff'; +import { diffElementResourceChangeList, diffElementResourceChange } from './lib/diff'; const { time } = util; const { deepClone } = util.data; @@ -200,14 +200,19 @@ class Core { // if (this[_onlyRender] === true) return; const _elem = deepClone(elem) as TypeElement; const data = this[_data]; + const resourceChangeUUIDs: string[] = []; for (let i = 0; i < data.elements.length; i++) { if (_elem.uuid === data.elements[i]?.uuid) { + const result = diffElementResourceChange(data.elements[i], _elem); + if (typeof result === 'string') { + resourceChangeUUIDs.push(result); + } data.elements[i] = _elem; break; } } this[_emitChangeData](); - this[_draw](); + this[_draw]({ resourceChangeUUIDs }); } addElement(elem: TypeElementBase): string | null { diff --git a/packages/core/src/lib/diff.ts b/packages/core/src/lib/diff.ts index 119b897..259648f 100644 --- a/packages/core/src/lib/diff.ts +++ b/packages/core/src/lib/diff.ts @@ -31,6 +31,42 @@ export function isChangeHTMLElementResource( ); } +export function diffElementResourceChange( + before: TypeElement, + after: TypeElement, +): string | null { + let result = null; + let isChange = false; + switch (after.type) { + case 'image': { + isChange = isChangeImageElementResource( + before as TypeElement<'image'>, + after as TypeElement<'image'> + ); + break; + } + case 'svg': { + isChange = isChangeSVGElementResource( + before as TypeElement<'svg'>, + after as TypeElement<'svg'> + ); + break; + } + case 'html': { + isChange = isChangeHTMLElementResource( + before as TypeElement<'html'>, + after as TypeElement<'html'> + ); + break; + } + default: break; + } + if (isChange === true) { + result = after.uuid; + } + return result; +} + export function diffElementResourceChangeList( before: TypeData, after: TypeData, diff --git a/packages/core/src/lib/loader.ts b/packages/core/src/lib/loader.ts index d53bd2f..e1e20d8 100644 --- a/packages/core/src/lib/loader.ts +++ b/packages/core/src/lib/loader.ts @@ -189,6 +189,7 @@ export default class Loader { if (this._status === LoaderStatus.LOADING) { return; } + this._status = LoaderStatus.LOADING; if (this._currentUUIDQueue.length === 0) { if (this._waitingLoadQueue.length === 0) { @@ -255,6 +256,7 @@ export default class Loader { elemH: this._storageLoadData[uuid].elemH, }); }).catch((err) => { + console.warn(err); loadUUIDList.splice(loadUUIDList.indexOf(uuid), 1); const status = _loadAction(); diff --git a/packages/core/src/lib/renderer.ts b/packages/core/src/lib/renderer.ts index c6a83a2..4c3c2f9 100644 --- a/packages/core/src/lib/renderer.ts +++ b/packages/core/src/lib/renderer.ts @@ -28,6 +28,7 @@ export class Renderer { }); this._loader.on('load', (res) => { this._drawFrame(); + // console.log('Load: ', res); }); this._loader.on('error', (res) => { console.log('Loader Error: ', res); diff --git a/scripts/screen.config.js b/scripts/screen.config.js index 9cc84ad..bb06c8e 100644 --- a/scripts/screen.config.js +++ b/scripts/screen.config.js @@ -5,6 +5,7 @@ const pageList = [ { path: 'board/examples/test/event.html', w: 620, h: 270, delay: 500 }, { path: 'core/examples/test/elements.html', w: 930, h: 810, delay: 800 }, { path: 'core/examples/test/api.html', w: 930, h: 1570, delay: 800 }, + { path: 'core/examples/test/update.html', w: 930, h: 540, delay: 800 }, { path: 'idraw/examples/test/api.html', w: 930, h: 270, delay: 800 }, ]