|
@@ -640,13 +640,16 @@ export class App extends React.Component<any, AppState> {
|
640
|
640
|
);
|
641
|
641
|
event.preventDefault();
|
642
|
642
|
} else if (
|
643
|
|
- shapesShortcutKeys.includes(event.key.toLowerCase()) &&
|
644
|
643
|
!event.ctrlKey &&
|
645
|
644
|
!event.altKey &&
|
646
|
645
|
!event.metaKey &&
|
647
|
646
|
this.state.draggingElement === null
|
648
|
647
|
) {
|
649
|
|
- this.selectShapeTool(shape);
|
|
648
|
+ if (shapesShortcutKeys.includes(event.key.toLowerCase())) {
|
|
649
|
+ this.selectShapeTool(shape);
|
|
650
|
+ } else if (event.key === "q") {
|
|
651
|
+ this.toggleLock();
|
|
652
|
+ }
|
650
|
653
|
} else if (event.key === KEYS.SPACE && gesture.pointers.size === 0) {
|
651
|
654
|
isHoldingSpace = true;
|
652
|
655
|
document.documentElement.style.cursor = CURSOR_TYPE.GRABBING;
|
|
@@ -791,6 +794,15 @@ export class App extends React.Component<any, AppState> {
|
791
|
794
|
this.destroySocketClient();
|
792
|
795
|
};
|
793
|
796
|
|
|
797
|
+ toggleLock = () => {
|
|
798
|
+ this.setState(prevState => ({
|
|
799
|
+ elementLocked: !prevState.elementLocked,
|
|
800
|
+ elementType: prevState.elementLocked
|
|
801
|
+ ? "selection"
|
|
802
|
+ : prevState.elementType,
|
|
803
|
+ }));
|
|
804
|
+ };
|
|
805
|
+
|
794
|
806
|
private setElements = (elements: readonly ExcalidrawElement[]) => {
|
795
|
807
|
globalSceneState.replaceAllElements(elements);
|
796
|
808
|
};
|
|
@@ -816,6 +828,7 @@ export class App extends React.Component<any, AppState> {
|
816
|
828
|
language={getLanguage()}
|
817
|
829
|
onRoomCreate={this.createRoom}
|
818
|
830
|
onRoomDestroy={this.destroyRoom}
|
|
831
|
+ onToggleLock={this.toggleLock}
|
819
|
832
|
/>
|
820
|
833
|
<main>
|
821
|
834
|
<canvas
|