X-Git-Url: http://git.ithinksw.org/extjs.git/blobdiff_plain/d41dc04ad17d1d9125fb2cf72db2b4782dbe3a8c..refs/heads/master:/examples/ux/Spotlight.js diff --git a/examples/ux/Spotlight.js b/examples/ux/Spotlight.js new file mode 100644 index 00000000..e76ed17a --- /dev/null +++ b/examples/ux/Spotlight.js @@ -0,0 +1,223 @@ +/* + +This file is part of Ext JS 4 + +Copyright (c) 2011 Sencha Inc + +Contact: http://www.sencha.com/contact + +GNU General Public License Usage +This file may be used under the terms of the GNU General Public License version 3.0 as published by the Free Software Foundation and appearing in the file LICENSE included in the packaging of this file. Please review the following information to ensure the GNU General Public License version 3.0 requirements will be met: http://www.gnu.org/copyleft/gpl.html. + +If you are unsure which license is appropriate for your use, please contact the sales department at http://www.sencha.com/contact. + +*/ +/** + * @class Ext.ux.Spotlight + * UX used to provide a spotlight around a specified component/element. + */ +Ext.define('Ext.ux.Spotlight', { + extend: 'Object', + + /** + * @private + * The baseCls for the spotlight elements + */ + baseCls: 'x-spotlight', + + /** + * @cfg animate {Boolean} True to animate the spotlight change + * (defaults to true) + */ + animate: true, + + /** + * @cfg duration {Integer} The duration of the animation, in milliseconds + * (defaults to 250) + */ + duration: 250, + + /** + * @cfg easing {String} The type of easing for the spotlight animatation + * (defaults to null) + */ + easing: null, + + /** + * @private + * True if the spotlight is active on the element + */ + active: false, + + /** + * Create all the elements for the spotlight + */ + createElements: function() { + var body = Ext.getBody(); + + this.right = body.createChild({ + cls: this.baseCls + }); + this.left = body.createChild({ + cls: this.baseCls + }); + this.top = body.createChild({ + cls: this.baseCls + }); + this.bottom = body.createChild({ + cls: this.baseCls + }); + + this.all = Ext.create('Ext.CompositeElement', [this.right, this.left, this.top, this.bottom]); + }, + + /** + * Show the spotlight + */ + show: function(el, callback, scope) { + //get the target element + this.el = Ext.get(el); + + //create the elements if they don't already exist + if (!this.right) { + this.createElements(); + } + + if (!this.active) { + //if the spotlight is not active, show it + this.all.setDisplayed(''); + this.active = true; + Ext.EventManager.onWindowResize(this.syncSize, this); + this.applyBounds(this.animate, false); + } else { + //if the spotlight is currently active, just move it + this.applyBounds(false, false); + } + }, + + /** + * Hide the spotlight + */ + hide: function(callback, scope) { + Ext.EventManager.removeResizeListener(this.syncSize, this); + + this.applyBounds(this.animate, true); + }, + + /** + * Resizes the spotlight with the window size. + */ + syncSize: function() { + this.applyBounds(false, false); + }, + + /** + * Resizes the spotlight depending on the arguments + * @param {Boolean} animate True to animate the changing of the bounds + * @param {Boolean} animate True to reverse the animation + */ + applyBounds: function(animate, reverse) { + var me = this, + box = me.el.getBox(); + + //get the current view width and height + var viewWidth = Ext.Element.getViewWidth(true); + var viewHeight = Ext.Element.getViewHeight(true); + + var i = 0, + config = false, + from, to; + + //where the element should start (if animation) + from = { + right: { + x: box.right, + y: viewHeight, + width: (viewWidth - box.right), + height: 0 + }, + left: { + x: 0, + y: 0, + width: box.x, + height: 0 + }, + top: { + x: viewWidth, + y: 0, + width: 0, + height: box.y + }, + bottom: { + x: 0, + y: (box.y + box.height), + width: 0, + height: (viewHeight - (box.y + box.height)) + 'px' + } + }; + + //where the element needs to finish + to = { + right: { + x: box.right, + y: box.y, + width: (viewWidth - box.right) + 'px', + height: (viewHeight - box.y) + 'px' + }, + left: { + x: 0, + y: 0, + width: box.x + 'px', + height: (box.y + box.height) + 'px' + }, + top: { + x: box.x, + y: 0, + width: (viewWidth - box.x) + 'px', + height: box.y + 'px' + }, + bottom: { + x: 0, + y: (box.y + box.height), + width: (box.x + box.width) + 'px', + height: (viewHeight - (box.y + box.height)) + 'px' + } + }; + + //reverse the objects + if (reverse) { + var clone = Ext.clone(from); + from = to; + to = clone; + + delete clone; + } + + if (animate) { + Ext.each(['right', 'left', 'top', 'bottom'], function(side) { + me[side].setBox(from[side]); + me[side].animate({ + duration: me.duration, + easing: me.easing, + to: to[side] + }); + }, + this); + } else { + Ext.each(['right', 'left', 'top', 'bottom'], function(side) { + me[side].setBox(Ext.apply(from[side], to[side])); + }, + this); + } + }, + + /** + * Removes all the elements for the spotlight + */ + destroy: function() { + Ext.destroy(this.right, this.left, this.top, this.bottom); + delete this.el; + delete this.all; + } +}); +