From b7a23f78ece870b2ac5d76571dd91fb38ef81cee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Setni=C4=8Dka?= <setnicka@seznam.cz> Date: Sat, 29 Oct 2022 21:08:54 +0200 Subject: [PATCH] =?UTF-8?q?Skeny:=20Omezen=C3=BD=20preload=20sken=C5=AF=20?= =?UTF-8?q?p=C5=99i=20jejich=20zpracov=C3=A1n=C3=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Preloadovat všechno může být u větších zpracování docela brutální operace, ale preload nejvýše 3 předchozích a následujících skenů zní rozumně. Issue #279 --- .../templates/org_contest_scans_process.html | 32 ++++++++++++++++--- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/mo/web/templates/org_contest_scans_process.html b/mo/web/templates/org_contest_scans_process.html index 82259ce0..aa7b92d8 100644 --- a/mo/web/templates/org_contest_scans_process.html +++ b/mo/web/templates/org_contest_scans_process.html @@ -224,6 +224,7 @@ var pages = [ }, img_full: "{{ png_full(page) }}", img_small: "{{ png_small(page) }}", + img_preloaded: false, }, {% endfor %} ]; @@ -253,6 +254,8 @@ PAGE_PROBABLY_EMPTY = 'probably_empty'; PAGE_UNKNOWN = 'unknown'; PAGE_UFO = 'ufo'; +PRELOAD_COUNT = 3; + function isChanged(p) { for (k of keys) { if (p[k] != p.orig[k]) { return true; } @@ -375,6 +378,16 @@ function refreshCurrentData(page) { } } +function preloadImg(i) { + page = pages[i]; + if (page.img_preloaded) { + return; + } + var preloadImg = new Image(); + preloadImg.src = page.img_full; + page.img_preloaded = true; +} + var activeRow = 0; function selectRow(i) { page = pages[i]; @@ -386,12 +399,23 @@ function selectRow(i) { rows[i].classList.add('active'); activeRow = i; - loader.style.opacity = 0.7; - img.onload = function() { - loader.style.opacity = 0; - refreshCurrentData(page); + // Correct closure to avoid changing page param + onLoadFactory = function(page) { + return function() { + loader.style.opacity = 0; + refreshCurrentData(page); + } } + loader.style.opacity = 0.7; + img.onload = onLoadFactory(page); img.src = page.img_full; + page.img_preloaded = true; + + // Preload previous and next images (if not preloaded yet) + for (let j = 1; j <= PRELOAD_COUNT; j++) { + if (i-j >= 0) { preloadImg(i-j); } + if (i+j < pages.length) { preloadImg(i+j); } + } } function refreshActiveRow() { -- GitLab