mirror of
https://github.com/xibyte/jsketcher
synced 2025-12-08 01:13:27 +01:00
96 lines
No EOL
2.6 KiB
JavaScript
96 lines
No EOL
2.6 KiB
JavaScript
export class ToolManager {
|
|
|
|
constructor(viewer, defaultTool) {
|
|
this.defaultTool = defaultTool;
|
|
this.tool = defaultTool;
|
|
this.viewer = viewer;
|
|
this.disposers = [];
|
|
const canvas = viewer.canvas
|
|
viewer.canvas.setAttribute('tabindex','0'); // makes it focusable
|
|
canvas.addEventListener('mousemove', (e) => {
|
|
e.preventDefault();
|
|
//e.stopPropagation(); // allow propagation for move in sake of dynamic layout
|
|
this.tool.mousemove(e);
|
|
}, false);
|
|
canvas.addEventListener('mousedown', (e) => {
|
|
canvas.focus();
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
this.tool.mousedown(e);
|
|
}, false);
|
|
canvas.addEventListener('mouseup', (e) => {
|
|
e.preventDefault();
|
|
// e.stopPropagation(); // allow propagation for move in sake of dynamic layout
|
|
this.tool.mouseup(e);
|
|
}, false);
|
|
canvas.addEventListener('contextmenu', (e) => {
|
|
e.preventDefault();
|
|
}, false);
|
|
window.addEventListener('touchstart', (e) => {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
}, false);
|
|
canvas.addEventListener('wheel', (e) => {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
let tool = this.tool;
|
|
if (tool.mousewheel === undefined) {
|
|
tool = this.defaultTool;
|
|
}
|
|
if (tool.mousewheel !== undefined) {
|
|
tool.mousewheel(e)
|
|
}
|
|
}, false);
|
|
canvas.addEventListener('dblclick', (e) => {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
this.tool.dblclick(e);
|
|
}, false);
|
|
|
|
this.addEventListener(canvas, "keydown", (e) => {
|
|
this.tool.keydown(e);
|
|
if (e.keyCode === 27) {
|
|
this.releaseControl();
|
|
} else if (e.keyCode === 46 || e.keyCode === 8) {
|
|
const selection = viewer.selected.slice();
|
|
viewer.removeAll(selection);
|
|
viewer.refresh();
|
|
}
|
|
}, false);
|
|
this.addEventListener(canvas, "keypress", (e) => {
|
|
this.tool.keydown(e);
|
|
}, false);
|
|
this.addEventListener(canvas, "keyup", (e) => {
|
|
this.tool.keydown(e);
|
|
}, false);
|
|
}
|
|
|
|
setDefaultTool(defaultTool) {
|
|
this.defaultTool = defaultTool;
|
|
this.tool = defaultTool;
|
|
}
|
|
|
|
addEventListener(subject, event, fn, useCapture) {
|
|
subject.addEventListener(event, fn, useCapture);
|
|
this.disposers.push(() => subject.removeEventListener(event, fn, useCapture));
|
|
}
|
|
|
|
takeControl(tool) {
|
|
this.tool.cleanup();
|
|
this.switchTool(tool);
|
|
this.tool.restart();
|
|
}
|
|
|
|
switchTool(tool) {
|
|
this.tool = tool;
|
|
this.viewer.streams.tool.$change.next(tool);
|
|
}
|
|
|
|
releaseControl() {
|
|
this.takeControl(this.defaultTool);
|
|
}
|
|
|
|
dispose() {
|
|
this.disposers.forEach(d => d());
|
|
}
|
|
} |