You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
3.7 KiB
132 lines
3.7 KiB
define(["dojo/_base/kernel", "dojo/_base/declare", "dijit/_Widget", "dojo/dom-construct", "dojo/dom-style", "dojo/dom-geometry", "dojo/_base/window", "dojo/_base/lang"], function(kernel, declare, _Widget, construct, style, geometry, window, lang){ |
|
|
|
kernel.experimental("dojox.image.MagnifierLite"); |
|
|
|
return declare("dojox.image.MagnifierLite", _Widget, { |
|
// summary: |
|
// Adds magnification on a portion of an image element |
|
// description: |
|
// An unobtrusive way to add an unstyled overlay |
|
// above the srcNode image element. The overlay/glass is a |
|
// scaled version of the src image (so larger images sized down |
|
// are clearer). |
|
// |
|
// The logic behind requiring the src image to be large is |
|
// "it's going to be downloaded, anyway" so this method avoids |
|
// having to make thumbnails and 2 http requests among other things. |
|
|
|
// glassSize: Int |
|
// the width and height of the bounding box |
|
glassSize: 125, |
|
|
|
// scale: Decimal |
|
// the multiplier of the Mangification. |
|
scale: 6, |
|
|
|
postCreate: function(){ |
|
this.inherited(arguments); |
|
|
|
// images are hard to make into workable templates, so just add outer overlay |
|
// and skip using dijit._Templated |
|
this._adjustScale(); |
|
this._createGlass(); |
|
|
|
this.connect(this.domNode,"onmouseenter","_showGlass"); |
|
this.connect(this.glassNode,"onmousemove","_placeGlass"); |
|
this.connect(this.img,"onmouseout","_hideGlass"); |
|
|
|
// when position of domNode changes, _adjustScale needs to run. |
|
// window.resize isn't it always, FIXME: |
|
this.connect(window,"onresize","_adjustScale"); |
|
}, |
|
|
|
_createGlass: function(){ |
|
// summary: |
|
// make img and glassNode elements as children of the body |
|
|
|
var node = this.glassNode = construct.create('div', { |
|
style: { |
|
height: this.glassSize + "px", |
|
width: this.glassSize + "px" |
|
}, |
|
className: "glassNode" |
|
}, window.body()); |
|
|
|
this.surfaceNode = node.appendChild(construct.create('div')); |
|
|
|
this.img = construct.place(lang.clone(this.domNode), node); |
|
// float the image around inside the .glassNode |
|
style.set(this.img, { |
|
position: "relative", |
|
top: 0, left: 0, |
|
width: this._zoomSize.w + "px", |
|
height: this._zoomSize.h + "px" |
|
}); |
|
}, |
|
|
|
_adjustScale: function(){ |
|
// summary: |
|
// update the calculations should this.scale change |
|
|
|
this.offset = geometry.position(this.domNode, true); |
|
console.dir(this.offset); |
|
this._imageSize = { w: this.offset.w, h:this.offset.h }; |
|
this._zoomSize = { |
|
w: this._imageSize.w * this.scale, |
|
h: this._imageSize.h * this.scale |
|
}; |
|
}, |
|
|
|
_showGlass: function(e){ |
|
// summary: |
|
// show the overlay |
|
this._placeGlass(e); |
|
style.set(this.glassNode, { |
|
visibility: "visible", |
|
display:"" |
|
}); |
|
}, |
|
|
|
_hideGlass: function(e){ |
|
// summary: |
|
// hide the overlay |
|
style.set(this.glassNode, { |
|
visibility: "hidden", |
|
display:"none" |
|
}); |
|
}, |
|
|
|
_placeGlass: function(e){ |
|
// summary: |
|
// position the overlay centered under the cursor |
|
|
|
this._setImage(e); |
|
var sub = Math.floor(this.glassSize / 2); |
|
style.set(this.glassNode,{ |
|
top: Math.floor(e.pageY - sub) + "px", |
|
left:Math.floor(e.pageX - sub) + "px" |
|
}); |
|
}, |
|
|
|
_setImage: function(e){ |
|
// summary: |
|
// set the image's offset in the clipping window relative to the mouse position |
|
|
|
var xOff = (e.pageX - this.offset.x) / this.offset.w, |
|
yOff = (e.pageY - this.offset.y) / this.offset.h, |
|
x = (this._zoomSize.w * xOff * -1) + (this.glassSize * xOff), |
|
y = (this._zoomSize.h * yOff * -1) + (this.glassSize * yOff); |
|
|
|
style.set(this.img, { |
|
top: y + "px", |
|
left: x + "px" |
|
}); |
|
}, |
|
|
|
destroy: function(finalize){ |
|
construct.destroy(this.glassNode); |
|
this.inherited(arguments); |
|
} |
|
|
|
}); |
|
});
|
|
|