From: Benoît Pin <benoit.pin@gmail.com>
Date: Sat, 2 Aug 2014 08:36:28 +0000 (+0200)
Subject: Optimisation du chargement des vignettes juxtaposées à celle affichée.
X-Git-Url: https://scm.cri.ensmp.fr/git/Portfolio.git/commitdiff_plain/cd282ee58b2893790d06ce40a8b02c65481abbeb?ds=inline

Optimisation du chargement des vignettes juxtaposées à celle affichée.
---

diff --git a/skins/getPhotoContextInfos.py b/skins/getPhotoContextInfos.py
index 71b4aea..b070a83 100755
--- a/skins/getPhotoContextInfos.py
+++ b/skins/getPhotoContextInfos.py
@@ -37,6 +37,7 @@ for i, p in enumerate(portfolio.listNearestFolderContents(contentFilter={'portal
 		,'href': purl
 		,'thumbSize':size
 		,'title' : p.Title()
+		,'displayed' : p == context
 		,'className': (selected and 'selected' or '') + ((p == context) and ' displayed' or '')
 		, 'index': i
 		}
diff --git a/skins/photo_film_viewer.js b/skins/photo_film_viewer.js
index 0a1cab9..3140763 100644
--- a/skins/photo_film_viewer.js
+++ b/skins/photo_film_viewer.js
@@ -5,6 +5,7 @@ Licence Creative Commons http://creativecommons.org/licenses/by-nc/2.0/
 */
 
 var FilmSlider;
+var s;
 
 (function(){
 
@@ -16,6 +17,7 @@ var DEFAULT_IMAGE_SIZES = [500, 600, 800];
 
 FilmSlider = function(filmBar, slider, ctxInfos, image, toolbar, breadcrumbs) {
 	var thisSlider = this;
+	s = this;
 	this.filmBar = filmBar;
 	this.filmBarWidth = getObjectWidth(this.filmBar);
 	var film = filmBar.firstChild;
@@ -289,6 +291,7 @@ FilmSlider.prototype.addEventListeners = function() {
 	addListener(this.toolbar, 'click', function(evt){thisSlider.toolbarClickHandler(evt);});
 	addListener(window, 'load', function(evt){thisSlider.fitToScreen(evt);});
 	addListener(window, 'load', function(evt){thisSlider._checkSizeAfterLoad(evt);});
+	addListener(window, 'load', function(evt){thisSlider.startThumbnailsLoadQueue(evt);});
 	
 	// dd listeners
 	addListener(this.slider, 'mousedown', this.ddHandlers.down);
@@ -727,6 +730,42 @@ FilmSlider.prototype.updateBreadcrumbs = function(url, title) {
 	}
 };
 
+FilmSlider.prototype.startThumbnailsLoadQueue = function(evt) {
+	var thumbnails = this.film.getElementsByTagName('img');
+	this.thumbnailsLoadingOrder = [];
+	var leftSize = this.center;
+	var rightSize = thumbnails.length - this.center - 1;
+	var i;
+	for (i=1 ; i<=Math.min(leftSize, rightSize) ; i++) {
+		this.thumbnailsLoadingOrder.push(thumbnails[this.center + i]);
+		this.thumbnailsLoadingOrder.push(thumbnails[this.center - i]);
+	}
+	if (leftSize > rightSize) {
+		for (i = this.center - rightSize - 1 ; i >= 0 ; i--) {
+			console.log(i);
+			this.thumbnailsLoadingOrder.push(thumbnails[i]);
+		}
+	}
+	else if (leftSize < rightSize) {
+		for (i = this.center + leftSize ; i < thumbnails.length ; i++) {
+			this.thumbnailsLoadingOrder.push(thumbnails[i]);
+		}
+	}
+	var next = this.thumbnailsLoadingOrder.shift();
+	var self = this;
+	addListener(next, 'load', function(evt){self._loadNextThumb(evt);});
+	next.src = next.parentNode.href + '/getThumbnail';
+};
+
+FilmSlider.prototype._loadNextThumb = function(evt) {
+	var next = this.thumbnailsLoadingOrder.shift();
+	if (!next) {return;}
+	var self = this;
+	addListener(next, 'load', function(evt){self._loadNextThumb(evt);});
+	next.src = next.parentNode.href + '/getThumbnail';
+};
+
+
 FilmSlider.prototype.startSlideShow = function() {
 	this.slideShowSlide = this.pendingSlideShowSlide = this.selectedSlide;
 	return this.slideShowSlide.href;
diff --git a/skins/photo_layout_macros.pt b/skins/photo_layout_macros.pt
index 0dccaa0..21616da 100644
--- a/skins/photo_layout_macros.pt
+++ b/skins/photo_layout_macros.pt
@@ -133,14 +133,15 @@
     <div metal:define-macro="film_bar" tal:omit-tag="">
       <div id="film_bar">
         <table cellspacing="0">
-          <tr tal:define="slide_size python:portal_object.thumb_size/2 + 10">
+          <tr tal:define="slide_size python:portal_object.thumb_size/2 + 10;
+                          blank_img string:$portal_url/transparent.gif">
             <td tal:repeat="info contextInfos/infos">
               <a tal:attributes="href info/href;
                                  class info/className;
                                  portfolio:position info/index">
                 <img tal:define="size info/thumbSize;
                                  margin_top python:(slide_size - size['height']) / 2"
-                     tal:attributes="src info/src;
+                     tal:attributes="src python:info['src'] if info['displayed'] else blank_img;
                                      alt info/title;
                                      height size/height;
                                      width size/width;