Skip to content

Commit

Permalink
Merge pull request #66 from d3/two
Browse files Browse the repository at this point in the history
Update d3-selection.
  • Loading branch information
Fil authored Aug 23, 2020
2 parents 2365889 + 28837ae commit 812cd19
Show file tree
Hide file tree
Showing 7 changed files with 140 additions and 106 deletions.
75 changes: 38 additions & 37 deletions README.md

Large diffs are not rendered by default.

9 changes: 6 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
{
"name": "d3-drag",
"version": "1.2.5",
"version": "2.0.0-rc.1",
"publishConfig": {
"tag": "next"
},
"description": "Drag and drop SVG, HTML or Canvas using mouse or touch input.",
"keywords": [
"d3",
Expand Down Expand Up @@ -34,8 +37,8 @@
"postpublish": "git push && git push --tags && cd ../d3.github.com && git pull && cp ../${npm_package_name}/dist/${npm_package_name}.js ${npm_package_name}.v${npm_package_version%%.*}.js && cp ../${npm_package_name}/dist/${npm_package_name}.min.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git add ${npm_package_name}.v${npm_package_version%%.*}.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git commit -m \"${npm_package_name} ${npm_package_version}\" && git push && cd - && zip -j dist/${npm_package_name}.zip -- LICENSE README.md dist/${npm_package_name}.js dist/${npm_package_name}.min.js"
},
"dependencies": {
"d3-dispatch": "1",
"d3-selection": "1"
"d3-dispatch": ">=2.0.0-rc.1",
"d3-selection": ">=2.0.0-rc.3"
},
"sideEffects": false,
"devDependencies": {
Expand Down
6 changes: 1 addition & 5 deletions src/constant.js
Original file line number Diff line number Diff line change
@@ -1,5 +1 @@
export default function(x) {
return function() {
return x;
};
}
export default x => () => x;
109 changes: 67 additions & 42 deletions src/drag.js
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
import {dispatch} from "d3-dispatch";
import {event, customEvent, select, mouse, touch} from "d3-selection";
import {select, pointer} from "d3-selection";
import nodrag, {yesdrag} from "./nodrag.js";
import noevent, {nopropagation} from "./noevent.js";
import constant from "./constant.js";
import DragEvent from "./event.js";

// Ignore right-click, since that should open the context menu.
function defaultFilter() {
function defaultFilter(event) {
return !event.ctrlKey && !event.button;
}

function defaultContainer() {
return this.parentNode;
}

function defaultSubject(d) {
function defaultSubject(event, d) {
return d == null ? {x: event.x, y: event.y} : d;
}

Expand Down Expand Up @@ -47,94 +47,119 @@ export default function() {
.style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
}

function mousedowned() {
if (touchending || !filter.apply(this, arguments)) return;
var gesture = beforestart("mouse", container.apply(this, arguments), mouse, this, arguments);
function mousedowned(event, d) {
if (touchending || !filter.call(this, event, d)) return;
var gesture = beforestart(this, container.call(this, event, d), event, d, "mouse");
if (!gesture) return;
select(event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true);
nodrag(event.view);
nopropagation();
nopropagation(event);
mousemoving = false;
mousedownx = event.clientX;
mousedowny = event.clientY;
gesture("start");
gesture("start", event);
}

function mousemoved() {
noevent();
function mousemoved(event) {
noevent(event);
if (!mousemoving) {
var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny;
mousemoving = dx * dx + dy * dy > clickDistance2;
}
gestures.mouse("drag");
gestures.mouse("drag", event);
}

function mouseupped() {
function mouseupped(event) {
select(event.view).on("mousemove.drag mouseup.drag", null);
yesdrag(event.view, mousemoving);
noevent();
gestures.mouse("end");
noevent(event);
gestures.mouse("end", event);
}

function touchstarted() {
if (!filter.apply(this, arguments)) return;
function touchstarted(event, d) {
if (!filter.call(this, event, d)) return;
var touches = event.changedTouches,
c = container.apply(this, arguments),
c = container.call(this, event, d),
n = touches.length, i, gesture;

for (i = 0; i < n; ++i) {
if (gesture = beforestart(touches[i].identifier, c, touch, this, arguments)) {
nopropagation();
gesture("start");
if (gesture = beforestart(this, c, event, d, touches[i].identifier, touches[i])) {
nopropagation(event);
gesture("start", event, touches[i]);
}
}
}

function touchmoved() {
function touchmoved(event) {
var touches = event.changedTouches,
n = touches.length, i, gesture;

for (i = 0; i < n; ++i) {
if (gesture = gestures[touches[i].identifier]) {
noevent();
gesture("drag");
noevent(event);
gesture("drag", event, touches[i]);
}
}
}

function touchended() {
function touchended(event) {
var touches = event.changedTouches,
n = touches.length, i, gesture;

if (touchending) clearTimeout(touchending);
touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!
for (i = 0; i < n; ++i) {
if (gesture = gestures[touches[i].identifier]) {
nopropagation();
gesture("end");
nopropagation(event);
gesture("end", event, touches[i]);
}
}
}

function beforestart(id, container, point, that, args) {
var p = point(container, id), s, dx, dy,
sublisteners = listeners.copy();

if (!customEvent(new DragEvent(drag, "beforestart", s, id, active, p[0], p[1], 0, 0, sublisteners), function() {
if ((event.subject = s = subject.apply(that, args)) == null) return false;
dx = s.x - p[0] || 0;
dy = s.y - p[1] || 0;
return true;
})) return;

return function gesture(type) {
function beforestart(that, container, event, d, identifier, touch) {
var dispatch = listeners.copy(),
p = pointer(touch || event, container), dx, dy,
s;

if ((s = subject.call(that, new DragEvent("beforestart", {
sourceEvent: event,
target: drag,
identifier,
active,
x: p[0],
y: p[1],
dx: 0,
dy: 0,
dispatch
}), d)) == null) return;

dx = s.x - p[0] || 0;
dy = s.y - p[1] || 0;

return function gesture(type, event, touch) {
var p0 = p, n;
switch (type) {
case "start": gestures[id] = gesture, n = active++; break;
case "end": delete gestures[id], --active; // nobreak
case "drag": p = point(container, id), n = active; break;
case "start": gestures[identifier] = gesture, n = active++; break;
case "end": delete gestures[identifier], --active; // nobreak
case "drag": p = pointer(touch || event, container), n = active; break;
}
customEvent(new DragEvent(drag, type, s, id, n, p[0] + dx, p[1] + dy, p[0] - p0[0], p[1] - p0[1], sublisteners), sublisteners.apply, sublisteners, [type, that, args]);
dispatch.call(
type,
that,
new DragEvent(type, {
sourceEvent: event,
subject: s,
target: drag,
identifier,
active: n,
x: p[0] + dx,
y: p[1] + dy,
dx: p[0] - p0[0],
dy: p[1] - p0[1],
dispatch
}),
d
);
};
}

Expand Down
33 changes: 22 additions & 11 deletions src/event.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,25 @@
export default function DragEvent(target, type, subject, id, active, x, y, dx, dy, dispatch) {
this.target = target;
this.type = type;
this.subject = subject;
this.identifier = id;
this.active = active;
this.x = x;
this.y = y;
this.dx = dx;
this.dy = dy;
this._ = dispatch;
export default function DragEvent(type, {
sourceEvent,
subject,
target,
identifier,
active,
x, y, dx, dy,
dispatch
}) {
Object.defineProperties(this, {
type: {value: type, enumerable: true, configurable: true},
sourceEvent: {value: sourceEvent, enumerable: true, configurable: true},
subject: {value: subject, enumerable: true, configurable: true},
target: {value: target, enumerable: true, configurable: true},
identifier: {value: identifier, enumerable: true, configurable: true},
active: {value: active, enumerable: true, configurable: true},
x: {value: x, enumerable: true, configurable: true},
y: {value: y, enumerable: true, configurable: true},
dx: {value: dx, enumerable: true, configurable: true},
dy: {value: dy, enumerable: true, configurable: true},
_: {value: dispatch}
});
}

DragEvent.prototype.on = function() {
Expand Down
6 changes: 2 additions & 4 deletions src/noevent.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
import {event} from "d3-selection";

export function nopropagation() {
export function nopropagation(event) {
event.stopImmediatePropagation();
}

export default function() {
export default function(event) {
event.preventDefault();
event.stopImmediatePropagation();
}
8 changes: 4 additions & 4 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -174,10 +174,10 @@ d3-dispatch@1:
resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.5.tgz#e25c10a186517cd6c82dd19ea018f07e01e39015"
integrity sha512-vwKx+lAqB1UuCeklr6Jh1bvC4SZgbSqbkGBLClItFBIYH4vqDJCA7qfoy14lXmJdnBOdxndAMxjCbImJYW7e6g==

d3-selection@1:
version "1.4.0"
resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-1.4.0.tgz#ab9ac1e664cf967ebf1b479cc07e28ce9908c474"
integrity sha512-EYVwBxQGEjLCKF2pJ4+yrErskDnz5v403qvAid96cNdCMr8rmCYfY5RGzWz24mdIbxmDf6/4EAH+K9xperD5jg==
d3-selection@2:
version "2.0.0-rc.2"
resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-2.0.0-rc.2.tgz#530fffde9fc6007d90c79d39bc4b2777e7288f6e"
integrity sha512-3sXAgCMsIi6zmZFGwgI2fFi9f99vzBRUKZoKOJq8yWDDAci00QgJQfe7xW0VqUW2hItUvGVl61M8WY4Cxg8soQ==

debug@^4.0.1:
version "4.1.1"
Expand Down

0 comments on commit 812cd19

Please sign in to comment.