Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Apr 28th, 2012  |  syntax: None  |  size: 1.57 KB  |  hits: 12  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. d3.behavior.drag = function() {
  2.  
  3.   var x = 0,
  4.       y = 0,
  5.       listeners = [],
  6.           dragit
  7.  
  8.   function drag() {
  9.     var container = this
  10.         .on("mousedown", mousedown)
  11. }
  12.  
  13.   function mousedown(d, i) {
  14.         // Pick up on where we left before
  15.         // NOTE: Are regexes necessary?
  16.         var prevtrans = d3.select(this).attr('transform');
  17.        
  18.         d3.select(window)
  19.         .on("mousemove", mousemove)
  20.         .on("mouseup", mouseup);
  21.  
  22.         if (prevtrans) {
  23.                 var reg = prevtrans.match(/translate\((\d+),(\d+)\)/i)
  24.                 x = reg[1];
  25.                 y = reg[2];
  26.         } else {
  27.                 x = 0; y = 0;
  28.         }
  29.        
  30.         // Replace x and y with new coordinates
  31.     dragit = {
  32.       x0: x - d3.event.clientX,
  33.       y0: y - d3.event.clientY,
  34.       target: this,
  35.       data: d,
  36.       index: i
  37.     };
  38.     d3.event.preventDefault();
  39.     window.focus(); // TODO focusableParent
  40.   }
  41.  
  42.   function mousemove() {
  43.       if (dragit) {
  44.                         x = d3.event.clientX + dragit.x0;
  45.                         y = d3.event.clientY + dragit.y0;
  46.                         dispatch.call(dragit.target, dragit.data, dragit.index);
  47.     }
  48.   }
  49.  
  50.   function mouseup() {
  51.         d3.select(window)
  52.         .on("mousemove", null)
  53.         .on("mouseup", null);
  54.     if (dragit) {
  55.       mousemove();
  56.       dragit = null;
  57.     }
  58.   }
  59.  
  60.  
  61.  
  62.   function dispatch(d, i) {
  63.     var o = d3.event // Events can be reentrant (e.g., focus).
  64.  
  65.     d3.event = {
  66.       translate: [x, y]
  67.     };
  68.  
  69.     try {
  70.       for (var j = 0, m = listeners.length; j < m; j++) {
  71.         listeners[j].call(this, d, i);
  72.       }
  73.     } finally {
  74.       d3.event = o;
  75.     }
  76.   }
  77.  
  78.   drag.on = function(type, listener) {
  79.     if (type == "drag") listeners.push(listener);
  80.     return drag;
  81.   };
  82.  
  83.   return drag;
  84. };