paste on cursor position

This commit is contained in:
Faustino Kialungila 2020-01-08 00:23:42 +01:00
parent 0fee1579e2
commit d2c01b1708
2 changed files with 22 additions and 9 deletions

View file

@ -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;

View file

@ -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;
}; };