diff --git a/ui (gen4)/features/ui-chrome.js b/ui (gen4)/features/ui-chrome.js index 80d665a0..82bfc27a 100755 --- a/ui (gen4)/features/ui-chrome.js +++ b/ui (gen4)/features/ui-chrome.js @@ -309,7 +309,7 @@ module.CurrentImageIndicator = core.ImageGridFeatures.Feature({ // - before animation when scaling up // - after when scaling down // This is done to make the visuals consistent... - ['fitImage.pre fitRibbon.pre', + ['fitImage.pre fitRibbon.pre setScale.pre', function(w1){ var w0 = this.screenwidth w1 = w1 || 1 diff --git a/ui (gen4)/features/ui-single-image.js b/ui (gen4)/features/ui-single-image.js index 98fe488b..a762a8ed 100755 --- a/ui (gen4)/features/ui-single-image.js +++ b/ui (gen4)/features/ui-single-image.js @@ -169,7 +169,7 @@ module.SingleImageView = core.ImageGridFeatures.Feature({ actions: SingleImageActions, handlers:[ - ['fitImage.post', + ['fitImage.post setScale.post', function(){ // singe image mode -- set image proportions... diff --git a/ui (gen4)/features/ui.js b/ui (gen4)/features/ui.js index 78645ea6..8253bc58 100755 --- a/ui (gen4)/features/ui.js +++ b/ui (gen4)/features/ui.js @@ -128,6 +128,9 @@ module.ViewerActions = actions.Actions({ // The maximum screen width allowed when zooming... 'max-screen-images': 30, + // If true do not zoom past one image filling the screen... + 'max-zoom-to-screen': true, + // A step (multiplier) used by .zoomIn()/.zoomOut() actions. // NOTE: this is rounded to the nearest whole screen width in images // and current fit-overflow added. @@ -181,6 +184,13 @@ module.ViewerActions = actions.Actions({ } }, + get scale(){ + return this.ribbons != null ? this.ribbons.scale() : null + }, + set scale(s){ + this.setScale(s) + }, + get screenwidth(){ return this.ribbons != null ? this.ribbons.getScreenWidthImages() : null }, @@ -514,32 +524,48 @@ module.ViewerActions = actions.Actions({ // zooming... // + // XXX need to account for animations... + setScale: ['- Zoom/', + function(scale){ + this.ribbons && scale && this.ribbons.scale(scale) + + this.refresh() + }], + // Zooming is done by multiplying the current scale by config['zoom-step'] // and rounding to nearest discrete number of images to fit on screen. zoomIn: ['Zoom/Zoom in', function(){ this.ribbons.origin() - //var n = Math.round(this.ribbons.getScreenWidthImages())-1 - var d = this.config['zoom-step'] || 1.2 - var s = a.ribbons.scale() * d - var n = Math.floor(this.ribbons.getScreenWidthImages(s)) - - this.fitImage(n <= 0 ? 1 : n) + var s = this.scale * (this.config['zoom-step'] || 1.2) + + var W = this.ribbons.viewer.width() + var H = this.ribbons.viewer.height() + var w = this.ribbons.getVisibleImageSize('width', s) + var h = this.ribbons.getVisibleImageSize('height', s) + + // limit scaling to screen dimensions... + if(this.config['max-zoom-to-screen'] && (W < w || H < h)){ + this.fitImage(1) + + } else { + this.scale = s + } }], zoomOut: ['Zoom/Zoom out', function(){ this.ribbons.origin() - //var n = Math.round(this.ribbons.getScreenWidthImages())+1 - var d = this.config['zoom-step'] || 1.2 - var s = a.ribbons.scale() / d - var n = Math.ceil(this.ribbons.getScreenWidthImages(s)) - var max = this.config['max-screen-images'] - this.fitImage(n > max ? max : n) - }], + if(max && max < (this.screenwidth * (this.config['zoom-step'] || 1.2))){ + this.fitImage(max) + + } else { + this.scale /= (this.config['zoom-step'] || 1.2) + } + }], fitOrig: ['Zoom/Fit to original scale', function(){ this.ribbons.scale(1) @@ -550,6 +576,9 @@ module.ViewerActions = actions.Actions({ // NOTE: this will add .config['fit-overflow'] to odd counts if no // overflow if passed. // ...this is done to add ability to control scroll indication. + // + // XXX make these neutral to screen and image proportions... + // ...use .scale instead of .screenwidth??? fitImage: ['Zoom/Fit image', function(count, overflow){ if(count != null){ @@ -1007,6 +1036,7 @@ module.URLHash = core.ImageGridFeatures.Feature({ // NOTE: this is split out to an action so as to enable ui elements to // adapt to ribbon size changes... // +// XXX try using .ribbons.resizeRibbon(..) for basic tasks... // XXX try a strategy: load more in the direction of movement by an offset... // XXX updateRibbon(..) is not signature compatible with data.updateRibbon(..) var PartialRibbonsActions = actions.Actions({ @@ -1372,6 +1402,11 @@ module.PartialRibbons = core.ImageGridFeatures.Feature({ function(_, target){ this.preCacheJumpTargets(target) }], + ['setScale.pre', + function(s){ + this.updateRibbon('current', this.screenwidth / s || 1) + //this.preCacheJumpTargets() + }], ['fitImage.pre', function(n){ this.updateRibbon('current', n || 1)