loleaflet/src/control/Control.PartsPreview.js |   83 ++++++++++++++++++++++++--
 loleaflet/src/control/Parts.js                |    2 
 2 files changed, 79 insertions(+), 6 deletions(-)

New commits:
commit 1580639831c064cb4de418f31c21cbe1efd2d848
Author: Marco Cecchetti <marco.cecche...@collabora.com>
Date:   Fri Jun 22 10:30:20 2018 +0200

    On-demand loading of the page previews in the Online Draw/Impress
    
    Change-Id: I56b1febd7f57324e878f06d417d2f58754e850fc
    Reviewed-on: https://gerrit.libreoffice.org/56275
    Reviewed-by: Marco Cecchetti <mrcek...@gmail.com>
    Tested-by: Marco Cecchetti <mrcek...@gmail.com>

diff --git a/loleaflet/src/control/Control.PartsPreview.js 
b/loleaflet/src/control/Control.PartsPreview.js
index 055f1053d..467bf6fc8 100644
--- a/loleaflet/src/control/Control.PartsPreview.js
+++ b/loleaflet/src/control/Control.PartsPreview.js
@@ -12,6 +12,7 @@ L.Control.PartsPreview = L.Control.extend({
                this._previewInitialized = false;
                this._previewTiles = [];
                this._partsPreviewCont = L.DomUtil.get('slide-sorter');
+               this._scrollY = 0;
 
                map.on('updateparts', this._updateDisabled, this);
                map.on('updatepart', this._updatePart, this);
@@ -38,8 +39,11 @@ L.Control.PartsPreview = L.Control.extend({
                                        this._map.invalidateSize();
                                        
$('.scroll-container').mCustomScrollbar('update');
                                }, this), 500);
+                               var previewContBB = 
this._partsPreviewCont.getBoundingClientRect();
+                               this._previewContTop = previewContBB.top;
+                               var bottomBound = previewContBB.bottom + 
previewContBB.height / 2;
                                for (var i = 0; i < parts; i++) {
-                                       
this._previewTiles.push(this._createPreview(i, e.partNames[i]));
+                                       
this._previewTiles.push(this._createPreview(i, e.partNames[i], bottomBound));
                                }
                                
L.DomUtil.addClass(this._previewTiles[selectedPart], 'preview-img-selected');
                                this._previewInitialized = true;
@@ -59,19 +63,54 @@ L.Control.PartsPreview = L.Control.extend({
                }
        },
 
-       _createPreview: function (i, hashCode) {
+       _createPreview: function (i, hashCode, bottomBound) {
                var frame = L.DomUtil.create('div', 'preview-frame', 
this._partsPreviewCont);
                L.DomUtil.create('span', 'preview-helper', frame);
+
                var imgClassName = 'preview-img';
                var img = L.DomUtil.create('img', imgClassName, frame);
                img.hash = hashCode;
                img.src = L.Icon.Default.imagePath + '/preview_placeholder.png';
+               img.fetched = false;
                L.DomEvent
                        .on(img, 'click', L.DomEvent.stopPropagation)
                        .on(img, 'click', L.DomEvent.stop)
                        .on(img, 'click', this._setPart, this)
                        .on(img, 'click', this._refocusOnMap, this);
-               this._map.getPreview(i, i, 180, 180, {autoUpdate: 
this.options.autoUpdate});
+
+               var topBound = this._previewContTop;
+               var previewFrameTop = 0;
+               var previewFrameBottom = 0;
+               if (i > 0) {
+                       if (!bottomBound) {
+                               var previewContBB = 
this._partsPreviewCont.getBoundingClientRect();
+                               bottomBound = this._previewContTop + 
previewContBB.height + previewContBB.height / 2;
+                       }
+                       previewFrameTop = this._previewContTop + 
this._previewFrameMargin + i * (this._previewFrameHeight + 
this._previewFrameMargin);
+                       previewFrameTop -= this._scrollY;
+                       previewFrameBottom = previewFrameTop + 
this._previewFrameHeight;
+                       L.DomUtil.setStyle(img, 'height', 
this._previewImgHeight + 'px');
+               }
+
+               var imgSize;
+               if (i === 0 || (previewFrameTop >= topBound && previewFrameTop 
<= bottomBound)
+                       || (previewFrameBottom >= topBound && 
previewFrameBottom <= bottomBound)) {
+                       imgSize = this._map.getPreview(i, i, 180, 180, 
{autoUpdate: this.options.autoUpdate});
+                       img.fetched = true;
+                       L.DomUtil.setStyle(img, 'height', '');
+               }
+
+               if (i === 0) {
+                       var previewImgBorder = 
Math.round(parseFloat(L.DomUtil.getStyle(img, 'border-top-width')));
+                       var previewImgMinWidth = 
Math.round(parseFloat(L.DomUtil.getStyle(img, 'min-width')));
+                       var imgHeight = imgSize.height;
+                       if (imgSize.width < previewImgMinWidth)
+                               imgHeight = Math.round(imgHeight * 
previewImgMinWidth / imgSize.width);
+                       var previewFrameBB = frame.getBoundingClientRect();
+                       this._previewFrameMargin = previewFrameBB.top - 
this._previewContTop;
+                       this._previewImgHeight = imgHeight;
+                       this._previewFrameHeight = imgHeight + 2 * 
previewImgBorder;
+               }
 
                return img;
        },
@@ -130,8 +169,9 @@ L.Control.PartsPreview = L.Control.extend({
                                for (it = 0; it < e.partNames.length; it++) {
                                        this._previewTiles[it].hash = 
e.partNames[it];
                                        this._previewTiles[it].src = 
L.Icon.Default.imagePath + '/preview_placeholder.png';
-                                       this._map.getPreview(it, it, 180, 180, 
{autoUpdate: this.options.autoUpdate});
+                                       this._previewTiles[it].fetched = false;
                                }
+                               this._onScrollEnd();
                        }
                }
                else {
@@ -148,14 +188,20 @@ L.Control.PartsPreview = L.Control.extend({
                if (this._map.getDocType() === 'presentation' || 
this._map.getDocType() === 'drawing') {
                        // the scrollbar has to be re-initialized here else it 
doesn't work
                        // probably a bug from the scrollbar
+                       var control = this;
                        this._previewTiles[e.id].onload = function () {
                                $('#slide-sorter').mCustomScrollbar({
                                        axis: 'y',
                                        theme: 'dark-thick',
                                        scrollInertia: 0,
-                                       alwaysShowScrollbar: 1});
+                                       alwaysShowScrollbar: 1,
+                                       callbacks:{
+                                               whileScrolling: function() {
+                                                       control._onScroll(this);
+                                               }
+                                       }
+                               });
                        };
-
                        this._previewTiles[e.id].src = e.tile;
                }
        },
@@ -189,6 +235,31 @@ L.Control.PartsPreview = L.Control.extend({
                        this._previewTiles.splice(e.selectedPart, 1);
                        this._updatePreviewIds();
                }
+       },
+
+       _onScroll: function (e) {
+               var scrollOffset = 0;
+               if (e) {
+                       var prevScrollY = this._scrollY;
+                       this._scrollY = -e.mcs.top;
+                       scrollOffset = this._scrollY - prevScrollY;
+               }
+
+               var previewContBB = 
this._partsPreviewCont.getBoundingClientRect();
+               var extra =  previewContBB.height;
+               var topBound = this._previewContTop - (scrollOffset < 0 ? extra 
: previewContBB.height / 2);
+               var bottomBound = this._previewContTop + previewContBB.height + 
(scrollOffset > 0 ? extra : previewContBB.height / 2);
+               for (var i = 0; i < this._previewTiles.length; ++i) {
+                       var img = this._previewTiles[i];
+                       if (img && img.parentNode && !img.fetched) {
+                               var previewFrameBB = 
img.parentNode.getBoundingClientRect();
+                               if ((previewFrameBB.top >= topBound && 
previewFrameBB.top <= bottomBound)
+                               || (previewFrameBB.bottom >= topBound && 
previewFrameBB.bottom <= bottomBound)) {
+                                       this._map.getPreview(i, i, 180, 180, 
{autoUpdate: this.options.autoUpdate});
+                                       img.fetched = true;
+                               }
+                       }
+               }
        }
 });
 
diff --git a/loleaflet/src/control/Parts.js b/loleaflet/src/control/Parts.js
index 07d1afc97..c4340979f 100644
--- a/loleaflet/src/control/Parts.js
+++ b/loleaflet/src/control/Parts.js
@@ -91,6 +91,8 @@ L.Map.include({
                                                        'tileheight=' + 
tileHeight + ' ' +
                                                        'id=' + id + ' ' +
                                                        'broadcast=' + 
(forAllClients ? 'yes' : 'no'));
+
+               return {width: maxWidth, height: maxHeight};
        },
 
        getCustomPreview: function (id, part, width, height, tilePosX, 
tilePosY, tileWidth, tileHeight, options) {
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to