Transforms-based panning

This commit is contained in:
Tom MacWright
2012-11-14 16:43:04 -05:00
parent 25c80311c1
commit 5b4449572b
+38 -17
View File
@@ -36,7 +36,6 @@ iD.Map = function(elem) {
.scale(projection.scale())
.scaleExtent([256, 134217728])
.on('zoom', zoomPan),
// this is used with handles
dragbehavior = d3.behavior.drag()
.origin(function(entity) {
@@ -123,9 +122,16 @@ iD.Map = function(elem) {
}
}
drawHandles(waynodes);
drawFills(areas, changed);
drawStrokes(ways, changed);
drawMarkers(points, changed);
drawCasings(ways, changed);
}
function drawHandles(waynodes) {
var handles = hit_g.selectAll('rect.handle')
.data(waynodes, key);
handles.exit().remove();
handles.enter().append('rect')
.attr({width: 4, height: 4, 'class': 'handle'})
@@ -136,17 +142,10 @@ iD.Map = function(elem) {
p[1] -= 2;
return 'translate(' + p + ') rotate(45, 2, 2)';
});
drawFills(areas, changed);
drawStrokes(ways, changed);
drawMarkers(points, changed);
drawCasings(ways, changed);
}
function drawFills(areas, changed) {
var fills = fill_g.selectAll('path.area').data(areas, key);
// Fills
var fills = fill_g.selectAll('path').data(areas, key);
fills.exit().remove();
fills.enter().append('path')
.attr('class', class_area)
@@ -162,7 +161,6 @@ iD.Map = function(elem) {
function drawMarkers(points, changed) {
var markers = hit_g.selectAll('g.marker').data(points, key);
// Markers
markers.exit().remove();
var marker = markers.enter().append('g')
.attr('class', 'marker')
@@ -185,8 +183,7 @@ iD.Map = function(elem) {
}
function drawStrokes(ways, changed) {
var strokes = stroke_g.selectAll('path.stroke').data(ways, key);
// Strokes
var strokes = stroke_g.selectAll('path').data(ways, key);
strokes.exit().remove();
strokes.enter().append('path')
.on('click', selectClick)
@@ -202,8 +199,7 @@ iD.Map = function(elem) {
}
function drawCasings(ways, changed) {
var casings = casing_g.selectAll('path.casing').data(ways, key);
// Casings
var casings = casing_g.selectAll('path').data(ways, key);
casings.exit().remove();
casings.enter().append('path')
.on('click', selectClick)
@@ -271,14 +267,39 @@ iD.Map = function(elem) {
map.operate(iD.operations.remove(d));
});
var lastScale = null, translateStart;
function zoomPan() {
if (d3.event.scale === projection.scale()) {
if (!translateStart) translateStart = d3.event.translate.slice();
fastPan(d3.event.translate, translateStart);
} else {
redraw();
download();
translateStart = null;
}
projection
.translate(d3.event.translate)
.scale(d3.event.scale);
redraw();
download();
}
function fastPan(a, b) {
var t = 'translate(' +
(a[0] - b[0]) + ',' +
(a[1] - b[1]) + ')';
r.attr('transform', t);
tilegroup.attr('transform', t);
}
surface.on('mouseup', function() {
if (r.attr('transform')) {
translateStart = null;
r.attr('transform', '');
tilegroup.attr('transform', '');
redraw();
}
});
function redraw(changed) {
dispatch.move(map);
tileclient.redraw();