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