mirror of
https://github.com/excalidraw/excalidraw.git
synced 2025-05-03 10:00:07 -04:00
paste on cursor position
This commit is contained in:
parent
0fee1579e2
commit
d2c01b1708
2 changed files with 22 additions and 9 deletions
|
@ -121,6 +121,7 @@ let lastMouseUp: ((e: any) => void) | null = null;
|
||||||
class App extends React.Component<{}, AppState> {
|
class App extends React.Component<{}, AppState> {
|
||||||
public componentDidMount() {
|
public componentDidMount() {
|
||||||
document.addEventListener("keydown", this.onKeyDown, false);
|
document.addEventListener("keydown", this.onKeyDown, false);
|
||||||
|
document.addEventListener("mousemove", this.getCurrentCursorPosition);
|
||||||
window.addEventListener("resize", this.onResize, false);
|
window.addEventListener("resize", this.onResize, false);
|
||||||
|
|
||||||
const savedState = restoreFromLocalStorage(elements);
|
const savedState = restoreFromLocalStorage(elements);
|
||||||
|
@ -131,6 +132,11 @@ class App extends React.Component<{}, AppState> {
|
||||||
|
|
||||||
public componentWillUnmount() {
|
public componentWillUnmount() {
|
||||||
document.removeEventListener("keydown", this.onKeyDown, false);
|
document.removeEventListener("keydown", this.onKeyDown, false);
|
||||||
|
document.removeEventListener(
|
||||||
|
"mousemove",
|
||||||
|
this.getCurrentCursorPosition,
|
||||||
|
false
|
||||||
|
);
|
||||||
window.removeEventListener("resize", this.onResize, false);
|
window.removeEventListener("resize", this.onResize, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -145,6 +151,8 @@ class App extends React.Component<{}, AppState> {
|
||||||
viewBackgroundColor: "#ffffff",
|
viewBackgroundColor: "#ffffff",
|
||||||
scrollX: 0,
|
scrollX: 0,
|
||||||
scrollY: 0,
|
scrollY: 0,
|
||||||
|
cursorX: 0,
|
||||||
|
cursorY: 0,
|
||||||
name: DEFAULT_PROJECT_NAME
|
name: DEFAULT_PROJECT_NAME
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -152,6 +160,10 @@ class App extends React.Component<{}, AppState> {
|
||||||
this.forceUpdate();
|
this.forceUpdate();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private getCurrentCursorPosition = (e: MouseEvent) => {
|
||||||
|
this.setState({ cursorX: e.x, cursorY: e.y });
|
||||||
|
};
|
||||||
|
|
||||||
private onKeyDown = (event: KeyboardEvent) => {
|
private onKeyDown = (event: KeyboardEvent) => {
|
||||||
if (isInputLike(event.target)) return;
|
if (isInputLike(event.target)) return;
|
||||||
|
|
||||||
|
@ -333,11 +345,11 @@ class App extends React.Component<{}, AppState> {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private pasteFromClipboard = (x?: number, y?: number) => {
|
private pasteFromClipboard = () => {
|
||||||
if (navigator.clipboard) {
|
if (navigator.clipboard) {
|
||||||
navigator.clipboard
|
navigator.clipboard
|
||||||
.readText()
|
.readText()
|
||||||
.then(text => this.addElementsFromPaste(text, x, y));
|
.then(text => this.addElementsFromPaste(text));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -555,7 +567,7 @@ class App extends React.Component<{}, AppState> {
|
||||||
options: [
|
options: [
|
||||||
navigator.clipboard && {
|
navigator.clipboard && {
|
||||||
label: "Paste",
|
label: "Paste",
|
||||||
action: () => this.pasteFromClipboard(x, y)
|
action: () => this.pasteFromClipboard()
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
top: e.clientY,
|
top: e.clientY,
|
||||||
|
@ -578,7 +590,7 @@ class App extends React.Component<{}, AppState> {
|
||||||
},
|
},
|
||||||
navigator.clipboard && {
|
navigator.clipboard && {
|
||||||
label: "Paste",
|
label: "Paste",
|
||||||
action: () => this.pasteFromClipboard(x, y)
|
action: () => this.pasteFromClipboard()
|
||||||
},
|
},
|
||||||
{ label: "Copy Styles", action: this.copyStyles },
|
{ label: "Copy Styles", action: this.copyStyles },
|
||||||
{ label: "Paste Styles", action: this.pasteStyles },
|
{ label: "Paste Styles", action: this.pasteStyles },
|
||||||
|
@ -998,7 +1010,7 @@ class App extends React.Component<{}, AppState> {
|
||||||
}));
|
}));
|
||||||
};
|
};
|
||||||
|
|
||||||
private addElementsFromPaste = (paste: string, x?: number, y?: number) => {
|
private addElementsFromPaste = (paste: string) => {
|
||||||
let parsedElements;
|
let parsedElements;
|
||||||
try {
|
try {
|
||||||
parsedElements = JSON.parse(paste);
|
parsedElements = JSON.parse(paste);
|
||||||
|
@ -1009,12 +1021,11 @@ class App extends React.Component<{}, AppState> {
|
||||||
parsedElements[0].type // need to implement a better check here...
|
parsedElements[0].type // need to implement a better check here...
|
||||||
) {
|
) {
|
||||||
clearSelection(elements);
|
clearSelection(elements);
|
||||||
if (x == null) x = window.innerWidth / 2 - this.state.scrollX - 10;
|
|
||||||
if (y == null) y = window.innerHeight / 2 - this.state.scrollY - 10;
|
|
||||||
const minX = Math.min(...parsedElements.map(element => element.x));
|
const minX = Math.min(...parsedElements.map(element => element.x));
|
||||||
const minY = Math.min(...parsedElements.map(element => element.y));
|
const minY = Math.min(...parsedElements.map(element => element.y));
|
||||||
const dx = x - minX;
|
const dx = this.state.cursorX - this.state.scrollX - minX;
|
||||||
const dy = y - minY;
|
const dy = this.state.cursorY - this.state.scrollY - minY;
|
||||||
|
|
||||||
parsedElements.forEach(parsedElement => {
|
parsedElements.forEach(parsedElement => {
|
||||||
parsedElement.x += dx;
|
parsedElement.x += dx;
|
||||||
|
|
|
@ -11,5 +11,7 @@ export type AppState = {
|
||||||
viewBackgroundColor: string;
|
viewBackgroundColor: string;
|
||||||
scrollX: number;
|
scrollX: number;
|
||||||
scrollY: number;
|
scrollY: number;
|
||||||
|
cursorX: number;
|
||||||
|
cursorY: number;
|
||||||
name: string;
|
name: string;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue