mirror of
https://github.com/excalidraw/excalidraw.git
synced 2025-08-27 04:07:05 +02:00
Compare commits
1 Commits
frame-resi
...
feat-actio
Author | SHA1 | Date | |
---|---|---|---|
![]() |
60bab6a428 |
@@ -2,11 +2,12 @@ import { isDarwin } from "../constants";
|
|||||||
import { t } from "../i18n";
|
import { t } from "../i18n";
|
||||||
import { SubtypeOf } from "../utility-types";
|
import { SubtypeOf } from "../utility-types";
|
||||||
import { getShortcutKey } from "../utils";
|
import { getShortcutKey } from "../utils";
|
||||||
import { ActionName } from "./types";
|
import { ActionName, CustomActionName } from "./types";
|
||||||
|
|
||||||
export type ShortcutName =
|
export type ShortcutName =
|
||||||
| SubtypeOf<
|
| SubtypeOf<
|
||||||
ActionName,
|
ActionName,
|
||||||
|
| CustomActionName
|
||||||
| "toggleTheme"
|
| "toggleTheme"
|
||||||
| "loadScene"
|
| "loadScene"
|
||||||
| "clearCanvas"
|
| "clearCanvas"
|
||||||
@@ -40,6 +41,15 @@ export type ShortcutName =
|
|||||||
| "saveScene"
|
| "saveScene"
|
||||||
| "imageExport";
|
| "imageExport";
|
||||||
|
|
||||||
|
export const registerCustomShortcuts = (
|
||||||
|
shortcuts: Record<CustomActionName, string[]>,
|
||||||
|
) => {
|
||||||
|
for (const key in shortcuts) {
|
||||||
|
const shortcut = key as CustomActionName;
|
||||||
|
shortcutMap[shortcut] = shortcuts[shortcut];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const shortcutMap: Record<ShortcutName, string[]> = {
|
const shortcutMap: Record<ShortcutName, string[]> = {
|
||||||
toggleTheme: [getShortcutKey("Shift+Alt+D")],
|
toggleTheme: [getShortcutKey("Shift+Alt+D")],
|
||||||
saveScene: [getShortcutKey("CtrlOrCmd+S")],
|
saveScene: [getShortcutKey("CtrlOrCmd+S")],
|
||||||
|
@@ -35,7 +35,11 @@ type ActionFn = (
|
|||||||
export type UpdaterFn = (res: ActionResult) => void;
|
export type UpdaterFn = (res: ActionResult) => void;
|
||||||
export type ActionFilterFn = (action: Action) => void;
|
export type ActionFilterFn = (action: Action) => void;
|
||||||
|
|
||||||
|
export const makeCustomActionName = (name: string) =>
|
||||||
|
`custom.${name}` as CustomActionName;
|
||||||
|
export type CustomActionName = `custom.${string}`;
|
||||||
export type ActionName =
|
export type ActionName =
|
||||||
|
| CustomActionName
|
||||||
| "copy"
|
| "copy"
|
||||||
| "cut"
|
| "cut"
|
||||||
| "paste"
|
| "paste"
|
||||||
|
@@ -8238,8 +8238,27 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
event[KEYS.CTRL_OR_CMD] ? null : this.state.gridSize,
|
event[KEYS.CTRL_OR_CMD] ? null : this.state.gridSize,
|
||||||
);
|
);
|
||||||
|
|
||||||
const resizingSingleFrameOnly =
|
const frameElementsOffsetsMap = new Map<
|
||||||
selectedElements.length === 1 && selectedFrames.length === 1;
|
string,
|
||||||
|
{
|
||||||
|
x: number;
|
||||||
|
y: number;
|
||||||
|
}
|
||||||
|
>();
|
||||||
|
|
||||||
|
selectedFrames.forEach((frame) => {
|
||||||
|
const elementsInFrame = getFrameChildren(
|
||||||
|
this.scene.getNonDeletedElements(),
|
||||||
|
frame.id,
|
||||||
|
);
|
||||||
|
|
||||||
|
elementsInFrame.forEach((element) => {
|
||||||
|
frameElementsOffsetsMap.set(frame.id + element.id, {
|
||||||
|
x: element.x - frame.x,
|
||||||
|
y: element.y - frame.y,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
// check needed for avoiding flickering when a key gets pressed
|
// check needed for avoiding flickering when a key gets pressed
|
||||||
// during dragging
|
// during dragging
|
||||||
@@ -8280,12 +8299,7 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
transformElements(
|
transformElements(
|
||||||
pointerDownState,
|
pointerDownState,
|
||||||
transformHandleType,
|
transformHandleType,
|
||||||
resizingSingleFrameOnly
|
selectedElements,
|
||||||
? selectedElements
|
|
||||||
: this.scene.getSelectedElements({
|
|
||||||
selectedElementIds: this.state.selectedElementIds,
|
|
||||||
includeElementsInFrames: true,
|
|
||||||
}),
|
|
||||||
pointerDownState.resize.arrowDirection,
|
pointerDownState.resize.arrowDirection,
|
||||||
shouldRotateWithDiscreteAngle(event),
|
shouldRotateWithDiscreteAngle(event),
|
||||||
shouldResizeFromCenter(event),
|
shouldResizeFromCenter(event),
|
||||||
@@ -8301,19 +8315,18 @@ class App extends React.Component<AppProps, AppState> {
|
|||||||
) {
|
) {
|
||||||
this.maybeSuggestBindingForAll(selectedElements);
|
this.maybeSuggestBindingForAll(selectedElements);
|
||||||
|
|
||||||
// highlight frame children ONLY when resizing a single frame
|
const elementsToHighlight = new Set<ExcalidrawElement>();
|
||||||
if (resizingSingleFrameOnly) {
|
selectedFrames.forEach((frame) => {
|
||||||
const selectedFrame = selectedFrames[0];
|
getElementsInResizingFrame(
|
||||||
if (selectedFrame) {
|
this.scene.getNonDeletedElements(),
|
||||||
this.setState({
|
frame,
|
||||||
elementsToHighlight: getElementsInResizingFrame(
|
this.state,
|
||||||
this.scene.getNonDeletedElements(),
|
).forEach((element) => elementsToHighlight.add(element));
|
||||||
selectedFrame,
|
});
|
||||||
this.state,
|
|
||||||
),
|
this.setState({
|
||||||
});
|
elementsToHighlight: [...elementsToHighlight],
|
||||||
}
|
});
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user