jsketcher/web/app/sketcher/tools/pan.js

164 lines
No EOL
3.8 KiB
JavaScript

import {Tool} from './tool'
import {GetShapeEditTool} from './edit-tools-map'
import {isConstraintAnnotation} from "sketcher/constr/constraintAnnotation";
import {editConstraint} from "sketcher/actions/constraintActions";
export class BasePanTool extends Tool {
constructor(viewer) {
super('pan', viewer);
}
mousedown(e) {
if (e.button === 0) {
const picked = this.viewer.pick(e);
let i;
if (picked.length > 0) {
let toSelect;
if (e.shiftKey) {
toSelect = picked[0];
const ids = this.viewer.selected.map(function (s) {
return s.id
});
for (i = 0; i < picked.length; i++) {
if (ids.indexOf(picked[i].id) !== -1) {
this.viewer.deselect(picked[i]);
} else {
toSelect = picked[i];
}
}
this.viewer.select([toSelect], false);
this.deselectOnUp = false;
} else {
toSelect = picked[0];
if (this.viewer.selected.length === 1) {
for (i = 0; i < picked.length - 1; i++) {
if (picked[i].id === this.viewer.selected[0].id) {
toSelect = picked[i + 1];
break;
}
}
}
this.viewer.select([toSelect], true);
if (!toSelect.readOnly) {
const tool = GetShapeEditTool(this.viewer, toSelect, e.altKey);
tool.mousedown(e);
this.viewer.toolManager.switchTool(tool);
}
}
this.viewer.refresh();
return;
}
}
this.startDragging(e);
}
dblclick() {
const [obj] = this.viewer.selected;
if (isConstraintAnnotation(obj)) {
editConstraint(this.viewer.applicationContext, obj.constraint, () => {
this.viewer.parametricManager.constraintUpdated(obj.constraint);
})
}
}
startDragging(e) {}
}
export class PanTool extends BasePanTool {
constructor(viewer) {
super(viewer);
this.dragging = false;
this.x = 0.0;
this.y = 0.0;
}
mousemove(e) {
if (!this.dragging) {
return;
}
const dx = e.pageX - this.x;
let dy = e.pageY - this.y;
dy *= -1;
this.viewer.translate.x += dx * this.viewer.retinaPxielRatio;
this.viewer.translate.y += dy * this.viewer.retinaPxielRatio;
this.x = e.pageX;
this.y = e.pageY;
this.deselectOnUp = false;
this.viewer.refresh();
}
startDragging(e) {
super.startDragging(e);
this.dragging = true;
this.deselectOnUp = true;
this.x = e.pageX;
this.y = e.pageY;
}
mouseup(e) {
this.dragging = false;
if (this.deselectOnUp) {
this.viewer.deselectAll();
this.viewer.refresh();
}
this.deselectOnUp = false;
}
mousewheel(e) {
let delta = 0;
if (e.wheelDelta) { // WebKit / Opera / Explorer 9
delta = e.wheelDelta;
} else if (e.deltaY) { // Firefox
delta = -e.deltaY;
}
const before = this.viewer.screenToModel(e);
const step = 0.05;
delta = delta < 0 ? 1 - step : 1 + step;
this.viewer.scale *= delta;
const after = this.viewer.screenToModel(e);
const dx = after.x - before.x;
const dy = after.y - before.y;
this.viewer.translate.x += dx * this.viewer.scale;
this.viewer.translate.y += dy * this.viewer.scale;
this.viewer.refresh();
}
}
export class DelegatingPanTool extends BasePanTool {
constructor(viewer, delegate) {
super(viewer);
this.delegate = delegate;
}
// mousemove(e) {
// this.delegate.dispatchEvent(cloneEvent(e));
// };
startDragging(e) {
this.delegate.dispatchEvent(cloneEvent(e));
}
mouseup(e) {
this.delegate.dispatchEvent(cloneEvent(e));
}
mousewheel(e) {
this.delegate.dispatchEvent(cloneEvent(e));
}
}
function cloneEvent(event) {
return new event.constructor(event.type, event)
}