Ticket #5518: adjust_scrolling_offsets.diff
| File adjust_scrolling_offsets.diff, 8.1 kB (added by tsukue@gmail.com, 2 years ago) |
|---|
-
dragdrop.js
old new 61 61 }, 62 62 63 63 isAffected: function(point, element, drop) { 64 Position.prepare(); 64 65 return ( 65 66 (drop.element!=element) && 66 67 ((!drop._containers) || … … 68 69 ((!drop.accept) || 69 70 (Element.classNames(element).detect( 70 71 function(v) { return drop.accept.include(v) } ) )) && 71 Position.within (drop.element, point[0], point[1]) );72 Position.withinIncludingScrolloffsets(drop.element, point[0], point[1]) ); 72 73 }, 73 74 74 75 deactivate: function(drop) { … … 83 84 this.last_active = drop; 84 85 }, 85 86 86 show: function(point, element) { 87 show: function(point, draggingObj) { 88 var element = draggingObj.element; 87 89 if(!this.drops.length) return; 88 90 var affected = []; 89 91 … … 94 96 }); 95 97 96 98 if(affected.length>0) { 99 Position.prepare(); 97 100 drop = Droppables.findDeepestChild(affected); 98 Position.within (drop.element, point[0], point[1]);101 Position.withinIncludingScrolloffsets(drop.element, point[0], point[1]); 99 102 if(drop.onHover) 100 drop.onHover( element, drop.element, Position.overlap(drop.overlap, drop.element));103 drop.onHover(draggingObj, drop.element, Position.overlap(drop.overlap, drop.element)); 101 104 102 105 Droppables.activate(drop); 103 106 } … … 282 285 var pointer = [Event.pointerX(event), Event.pointerY(event)]; 283 286 var pos = Position.cumulativeOffset(this.element); 284 287 this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) }); 285 288 this.scrollOffset = Position.realOffset(this.element); 289 286 290 Draggables.activate(this); 287 291 Event.stop(event); 288 292 } 289 293 }, 290 294 291 startDrag: function(event) {295 startDrag: function(event) { 292 296 this.dragging = true; 293 297 294 298 if(this.options.zindex) { 295 299 this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0); 296 300 this.element.style.zIndex = this.options.zindex; … … 298 302 299 303 if(this.options.ghosting) { 300 304 this._clone = this.element.cloneNode(true); 301 Position.absolutize(this.element); 305 Position.absolutize(this.element); 302 306 this.element.parentNode.insertBefore(this._clone, this.element); 303 307 } 304 308 … … 312 316 this.originalScrollTop = this.options.scroll.scrollTop; 313 317 } 314 318 } 315 319 316 320 Draggables.notify('onStart', this, event); 317 321 if(this.options.starteffect) this.options.starteffect(this.element); 318 322 }, … … 320 324 updateDrag: function(event, pointer) { 321 325 if(!this.dragging) this.startDrag(event); 322 326 Position.prepare(); 323 Droppables.show(pointer, this .element);327 Droppables.show(pointer, this); 324 328 Draggables.notify('onDrag', this, event); 325 329 this.draw(pointer); 326 330 if(this.options.change) this.options.change(this); … … 329 333 this.stopScrolling(); 330 334 331 335 var p; 336 var do_scroll = false; 332 337 if (this.options.scroll == window) { 333 338 with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; } 334 } else { 339 do_scroll = true; 340 } else if (this.element.parentNode && this.options.scroll == this.element.parentNode) { 335 341 p = Position.page(this.options.scroll); 336 342 p[0] += this.options.scroll.scrollLeft; 337 343 p[1] += this.options.scroll.scrollTop; 338 344 p.push(p[0]+this.options.scroll.offsetWidth); 339 345 p.push(p[1]+this.options.scroll.offsetHeight); 346 do_scroll = true; 340 347 } 341 var speed = [0,0]; 342 if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity); 343 if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity); 344 if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity); 345 if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity); 346 this.startScrolling(speed); 348 349 if (do_scroll) { 350 var speed = [0,0]; 351 if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity); 352 if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity); 353 if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity); 354 if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity); 355 this.startScrolling(speed); 356 } 347 357 } 348 358 349 359 // fix AppleWebKit rendering … … 402 412 var pos = Position.cumulativeOffset(this.element); 403 413 var d = this.currentDelta(); 404 414 pos[0] -= d[0]; pos[1] -= d[1]; 405 415 406 416 if(this.options.scroll && (this.options.scroll != window)) { 407 417 pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft; 408 418 pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop; … … 432 442 style.top = p[1] + "px"; 433 443 if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering 434 444 }, 435 445 446 adjustScrollOffset: function() { 447 var newScrollOffset = Position.realOffset(this.element); 448 [0,1].each(function(i) { 449 if (this.scrollOffset[i] != newScrollOffset[i]) { 450 this.offset[i] += this.scrollOffset[i] - newScrollOffset[i]; 451 this.scrollOffset[i] = newScrollOffset[i]; 452 } 453 }.bind(this)); 454 }, 455 436 456 stopScrolling: function() { 437 457 if(this.scrollInterval) { 438 458 clearInterval(this.scrollInterval); … … 463 483 this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000; 464 484 this.options.scroll.scrollTop += this.scrollSpeed[1] * delta / 1000; 465 485 } 466 486 487 this.scrollOffset = Position.realOffset(this.element); 488 467 489 Position.prepare(); 468 Droppables.show(Draggables._lastPointer, this .element);490 Droppables.show(Draggables._lastPointer, this); 469 491 Draggables.notify('onDrag', this); 470 492 Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer); 471 493 Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000; … … 673 695 element, options.only, options.tree ? true : false, options.treeTag); 674 696 }, 675 697 676 onHover: function(element, dropon, overlap) { 698 onHover: function(draggingObj, dropon, overlap) { 699 var element = draggingObj.element; 677 700 if(Element.isParent(dropon, element)) return; 678 701 679 702 if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) { 680 703 return; 681 } else if (overlap>0.5) {704 } else if (overlap>0.5) { 682 705 Sortable.mark(dropon, 'before'); 683 706 if(dropon.previousSibling != element) { 684 707 var oldParentNode = element.parentNode; 685 708 element.style.visibility = "hidden"; // fix gecko rendering 686 709 dropon.parentNode.insertBefore(element, dropon); 710 draggingObj.adjustScrollOffset(); 687 711 if(dropon.parentNode!=oldParentNode) 688 712 Sortable.options(oldParentNode).onChange(element); 689 713 Sortable.options(dropon.parentNode).onChange(element); … … 695 719 var oldParentNode = element.parentNode; 696 720 element.style.visibility = "hidden"; // fix gecko rendering 697 721 dropon.parentNode.insertBefore(element, nextElement); 722 draggingObj.adjustScrollOffset(); 698 723 if(dropon.parentNode!=oldParentNode) 699 724 Sortable.options(oldParentNode).onChange(element); 700 725 Sortable.options(dropon.parentNode).onChange(element); … … 702 727 } 703 728 }, 704 729 705 onEmptyHover: function(element, dropon, overlap) { 730 onEmptyHover: function(draggingObj, dropon, overlap) { 731 var element = draggingObj.element; 706 732 var oldParentNode = element.parentNode; 707 733 var droponOptions = Sortable.options(dropon); 708 734 … … 729 755 } 730 756 731 757 dropon.insertBefore(element, child); 732 758 draggingObj.adjustScrollOffset(); 733 759 Sortable.options(oldParentNode).onChange(element); 734 760 droponOptions.onChange(element); 735 761 }