////
////commented out the reference, because the path ended up in the typings, which
////makes it impossible import in other projects.
declare const d3;
import {Layout, EventType, Event} from './layout';
import {ID3StyleLayoutAdaptor} from './d3adaptor'
export class D3StyleLayoutAdaptor extends Layout implements ID3StyleLayoutAdaptor {
event = d3.dispatch(EventType[EventType.start], EventType[EventType.tick], EventType[EventType.end]);
trigger(e: Event) {
var d3event = { type: EventType[e.type], alpha: e.alpha, stress: e.stress };
this.event[d3event.type](d3event); // via d3 dispatcher, e.g. event.start(e);
}
// iterate layout using a d3.timer, which queues calls to tick repeatedly until tick returns true
kick() {
d3.timer(() => super.tick());
}
// a function to allow for dragging of nodes
drag: () => any;
constructor() {
super();
// bit of trickyness remapping 'this' so we can reference it in the function body.
var d3layout = this;
var drag;
this.drag = function () {
if (!drag) {
var drag = d3.behavior.drag()
.origin(Layout.dragOrigin)
.on("dragstart.d3adaptor", Layout.dragStart)
.on("drag.d3adaptor", d => {
Layout.drag(d, d3.event);
d3layout.resume(); // restart annealing
})
.on("dragend.d3adaptor", Layout.dragEnd);
}
if (!arguments.length) return drag;
// this is the context of the function, i.e. the d3 selection
this//.on("mouseover.adaptor", colaMouseover)
//.on("mouseout.adaptor", colaMouseout)
.call(drag);
}
}
// a function for binding to events on the adapter
on(eventType: EventType | string, listener: () => void): this {
if (typeof eventType === 'string') {
this.event.on(eventType, listener);
} else {
this.event.on(EventType[eventType], listener);
}
return this;
}
}
/**
* provides an interface for use with d3:
* - uses the d3 event system to dispatch layout events such as:
* o "start" (start layout process)
* o "tick" (after each layout iteration)
* o "end" (layout converged and complete).
* - uses the d3 timer to queue layout iterations.
* - sets up d3.behavior.drag to drag nodes
* o use `node.call(.drag)` to make nodes draggable
* returns an instance of the cola.Layout itself with which the user
* can interact directly.
*/
export function d3adaptor(): D3StyleLayoutAdaptor {
return new D3StyleLayoutAdaptor();
}