r2873 - removed old selectable labs branch, implemented nearest/closest selection on new selectables
Author: paul.bakaus
Date: Sun Jul 5 18:28:57 2009
New Revision: 2873
Removed:
branches/labs/selectable/
Modified:
branches/labs/selectable-labs/ui.selectable.js
Log:
removed old selectable labs branch, implemented nearest/closest selection
on new selectables
Modified: branches/labs/selectable-labs/ui.selectable.js
==============================================================================
--- branches/labs/selectable-labs/ui.selectable.js (original)
+++ branches/labs/selectable-labs/ui.selectable.js Sun Jul 5 18:28:57 2009
@@ -81,14 +81,24 @@
if(self._trigger('beforeselect', event) === false)
return true;
-
- if (event.keyCode == $.ui.keyCode.DOWN || event.keyCode ==
$.ui.keyCode.RIGHT) {
- self.selectNext(event);
+
+ if(event.keyCode == $.ui.keyCode.DOWN) {
+ self.options.smart ? self.selectClosest('down', event) :
self.selectNext(event);
event.preventDefault();
}
-
- if (event.keyCode == $.ui.keyCode.UP || event.keyCode ==
$.ui.keyCode.LEFT) {
- self.selectPrevious(event);
+
+ if(event.keyCode == $.ui.keyCode.RIGHT) {
+ self.options.smart ? self.selectClosest('right', event) :
self.selectNext(event);
+ event.preventDefault();
+ }
+
+ if(event.keyCode == $.ui.keyCode.UP) {
+ self.options.smart ? self.selectClosest('up', event) :
self.selectPrevious(event);
+ event.preventDefault();
+ }
+
+ if(event.keyCode == $.ui.keyCode.LEFT) {
+ self.options.smart ? self.selectClosest('left', event) :
self.selectPrevious(event);
event.preventDefault();
}
@@ -102,6 +112,59 @@
.addClass("ui-selectable-lasso");
},
+
+ selectClosest: function(direction, event) {
+
+ var current = [/(down|right)/.test(direction) ? 10000 : -10000, null],
+ overlap = 10000,
+ selfOffset = this.currentFocus.data('selectable-item');
+
+ $(this.options.filter,
this.element).not(this.currentFocus).filter(':visible').each(function() {
+
+ var $this = $(this),
+ offset = $this.data('selectable-item'),
+ distance = {
+ x: Math.abs(selfOffset.left - offset.left) +
Math.abs((offset.left+this.offsetWidth) -
(selfOffset.left+this.offsetWidth)),
+ y: Math.abs(selfOffset.top - offset.top) +
Math.abs((offset.top+this.offsetHeight) -
(selfOffset.top+this.offsetHeight))
+ };
+
+ switch(direction) {
+
+ case 'up':
+ if((selfOffset.top > offset.top && offset.top >= current[0]) &&
(offset.top != current[0] || distance.x < overlap)) {
+ current = [offset.top, $this];
+ overlap = distance.x;
+ }
+ break;
+
+ case 'down':
+ if((selfOffset.top < offset.top && offset.top <= current[0]) &&
(offset.top != current[0] || distance.x < overlap)) {
+ current = [offset.top, $this];
+ overlap = distance.x;
+ }
+ break;
+
+ case 'left':
+ if((selfOffset.left > offset.left && offset.left >= current[0]) &&
(offset.left != current[0] || distance.y < overlap)) {
+ current = [offset.left, $this];
+ overlap = distance.y;
+ }
+ break;
+
+ case 'right':
+ if((selfOffset.left < offset.left && offset.left <= current[0]) &&
(offset.left != current[0] || distance.y < overlap)) {
+ current = [offset.left, $this];
+ overlap = distance.y;
+ }
+ break;
+
+ }
+
+ });
+
+ return current[1] ? this._select(event, current[1]) : false;
+
+ },
destroy: function() {
this.element
@@ -174,9 +237,9 @@
return;
var hit = false;
- if (o.tolerance == 'touch') {
+ if (o.lasso && o.lasso.tolerance == 'touch') {
hit = ( !(item.left > x2 || item.right < x1 || item.top > y2 ||
item.bottom < y1) );
- } else if (o.tolerance == 'fit') {
+ } else if (o.lasso && o.lasso.tolerance == 'fit') {
hit = (item.left > x1 && item.right < x2 && item.top > y1 &&
item.bottom < y2);
}
@@ -417,17 +480,25 @@
$.extend($.ui.selectable, {
defaults: {
- appendTo: 'body',
+
+ //TODO: Figure out how to move these defaults out
cancel: ":input,option",
delay: 0,
distance: 1,
- tolerance: 'touch',
-
+ appendTo: 'body',
+
multiple: true,
+ smart: true,
filter: '> *',
keyboard: true,
- lasso: true,
+ lasso: {
+ cancel: ":input,option",
+ delay: 0,
+ distance: 1,
+ tolerance: 'touch',
+ appendTo: 'body'
+ },
//Should we really delete that?
selectedClass: 'ui-state-selected'