r2873 - removed old selectable labs branch, implemented nearest/closest selection on new selectables

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'