68 lines
2.0 KiB
JavaScript
68 lines
2.0 KiB
JavaScript
/* global Y, d3 */
|
|
|
|
let y = new Y('jigsaw-example', {
|
|
connector: {
|
|
name: 'websockets-client',
|
|
url: 'http://127.0.0.1:1234'
|
|
}
|
|
})
|
|
|
|
let jigsaw = y.define('jigsaw', Y.Map)
|
|
window.yJigsaw = y
|
|
|
|
var origin // mouse start position - translation of piece
|
|
var drag = d3.behavior.drag()
|
|
.on('dragstart', function (params) {
|
|
// get the translation of the element
|
|
var translation = d3
|
|
.select(this)
|
|
.attr('transform')
|
|
.slice(10, -1)
|
|
.split(',')
|
|
.map(Number)
|
|
// mouse coordinates
|
|
var mouse = d3.mouse(this.parentNode)
|
|
origin = {
|
|
x: mouse[0] - translation[0],
|
|
y: mouse[1] - translation[1]
|
|
}
|
|
})
|
|
.on('drag', function () {
|
|
var mouse = d3.mouse(this.parentNode)
|
|
var x = mouse[0] - origin.x // =^= mouse - mouse at dragstart + translation at dragstart
|
|
var y = mouse[1] - origin.y
|
|
d3.select(this).attr('transform', 'translate(' + x + ',' + y + ')')
|
|
})
|
|
.on('dragend', function (piece, i) {
|
|
// save the current translation of the puzzle piece
|
|
var mouse = d3.mouse(this.parentNode)
|
|
var x = mouse[0] - origin.x
|
|
var y = mouse[1] - origin.y
|
|
jigsaw.set(piece, {x: x, y: y})
|
|
})
|
|
|
|
var data = ['piece1', 'piece2', 'piece3', 'piece4']
|
|
var pieces = d3.select(document.querySelector('#puzzle-example')).selectAll('path').data(data)
|
|
|
|
pieces
|
|
.classed('draggable', true)
|
|
.attr('transform', function (piece) {
|
|
var translation = piece.get('translation') || {x: 0, y: 0}
|
|
return 'translate(' + translation.x + ',' + translation.y + ')'
|
|
}).call(drag)
|
|
|
|
data.forEach(function (piece) {
|
|
jigsaw.observe(function () {
|
|
// whenever a property of a piece changes, update the translation of the pieces
|
|
pieces
|
|
.transition()
|
|
.attr('transform', function (piece) {
|
|
var translation = piece.get(piece)
|
|
if (translation == null || typeof translation.x !== 'number' || typeof translation.y !== 'number') {
|
|
translation = { x: 0, y: 0 }
|
|
}
|
|
return 'translate(' + translation.x + ',' + translation.y + ')'
|
|
})
|
|
})
|
|
})
|