mirror of
https://github.com/xibyte/jsketcher
synced 2025-12-08 01:13:27 +01:00
164 lines
No EOL
3.8 KiB
JavaScript
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)
|
|
} |