Restore input value and fix history
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
This commit is contained in:
parent
5cc5c626df
commit
3d40221dc1
@ -117,6 +117,7 @@ const handleFinished: DragFinishedCallbackType<AngleProps["property"]> = ({
|
||||
scene,
|
||||
accumulatedChange,
|
||||
setAppState,
|
||||
setInputValue,
|
||||
}) => {
|
||||
const elementsMap = scene.getNonDeletedElementsMap();
|
||||
const origElement = originalElements[0];
|
||||
@ -125,19 +126,32 @@ const handleFinished: DragFinishedCallbackType<AngleProps["property"]> = ({
|
||||
const latestElement = elementsMap.get(origElement.id);
|
||||
|
||||
if (latestElement) {
|
||||
updateBindings(latestElement, elementsMap, originalAppState.zoom, () => {
|
||||
const change = degreesToRadians(accumulatedChange as Degrees);
|
||||
|
||||
mutateElement(latestElement, {
|
||||
angle: (latestElement.angle - change) as Radians,
|
||||
});
|
||||
});
|
||||
|
||||
setAppState({
|
||||
suggestedBindings: [],
|
||||
});
|
||||
|
||||
const success = updateBindings(
|
||||
latestElement,
|
||||
elementsMap,
|
||||
originalAppState.zoom,
|
||||
);
|
||||
|
||||
if (!success) {
|
||||
const change = degreesToRadians(accumulatedChange as Degrees);
|
||||
const angle = (latestElement.angle - change) as Radians;
|
||||
|
||||
mutateElement(latestElement, {
|
||||
angle,
|
||||
});
|
||||
|
||||
setInputValue(angle);
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
const Angle = ({ element, scene, appState, property }: AngleProps) => {
|
||||
|
@ -48,7 +48,8 @@ export type DragFinishedCallbackType<
|
||||
originalAppState: AppState;
|
||||
accumulatedChange: number;
|
||||
setAppState: React.Component<any, AppState>["setState"];
|
||||
}) => void;
|
||||
setInputValue: (value: number) => void;
|
||||
}) => boolean;
|
||||
|
||||
interface StatsDragInputProps<
|
||||
T extends StatsInputProperty,
|
||||
@ -155,7 +156,7 @@ const StatsDragInput = <
|
||||
setInputValue: (value) => setInputValue(String(value)),
|
||||
setAppState,
|
||||
});
|
||||
dragFinishedCallback?.({
|
||||
const commit = dragFinishedCallback?.({
|
||||
originalElements: elements,
|
||||
originalElementsMap,
|
||||
scene,
|
||||
@ -163,11 +164,14 @@ const StatsDragInput = <
|
||||
accumulatedChange: rounded,
|
||||
property,
|
||||
setAppState,
|
||||
setInputValue: (value) => setInputValue(String(value)),
|
||||
});
|
||||
if (commit) {
|
||||
app.syncActionResult({
|
||||
captureUpdate: CaptureUpdateAction.IMMEDIATELY,
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const callbacksRef = useRef<
|
||||
@ -311,7 +315,9 @@ const StatsDragInput = <
|
||||
false,
|
||||
);
|
||||
|
||||
let commit = true;
|
||||
if (originalElements !== null && originalElementsMap !== null) {
|
||||
commit =
|
||||
dragFinishedCallback?.({
|
||||
originalElements,
|
||||
originalElementsMap,
|
||||
@ -320,12 +326,15 @@ const StatsDragInput = <
|
||||
property,
|
||||
accumulatedChange,
|
||||
setAppState,
|
||||
});
|
||||
setInputValue: (value) => setInputValue(String(value)),
|
||||
}) ?? true;
|
||||
}
|
||||
|
||||
if (commit) {
|
||||
app.syncActionResult({
|
||||
captureUpdate: CaptureUpdateAction.IMMEDIATELY,
|
||||
});
|
||||
}
|
||||
|
||||
lastPointer = null;
|
||||
accumulatedChange = 0;
|
||||
|
@ -204,7 +204,8 @@ const handleFinished: DragFinishedCallbackType<"x" | "y"> = ({
|
||||
accumulatedChange,
|
||||
property,
|
||||
setAppState,
|
||||
}) => {
|
||||
setInputValue,
|
||||
}): boolean => {
|
||||
const elementsMap = scene.getNonDeletedElementsMap();
|
||||
const origElement = originalElements[0];
|
||||
|
||||
@ -212,17 +213,29 @@ const handleFinished: DragFinishedCallbackType<"x" | "y"> = ({
|
||||
const latestElement = elementsMap.get(origElement.id);
|
||||
|
||||
if (latestElement) {
|
||||
updateBindings(latestElement, elementsMap, originalAppState.zoom, () => {
|
||||
mutateElement(latestElement, {
|
||||
[property]: latestElement[property] - accumulatedChange,
|
||||
});
|
||||
});
|
||||
|
||||
setAppState({
|
||||
suggestedBindings: [],
|
||||
});
|
||||
|
||||
const success = updateBindings(
|
||||
latestElement,
|
||||
elementsMap,
|
||||
originalAppState.zoom,
|
||||
);
|
||||
|
||||
if (!success) {
|
||||
mutateElement(latestElement, {
|
||||
[property]: latestElement[property] - accumulatedChange,
|
||||
});
|
||||
|
||||
setInputValue(latestElement[property] - accumulatedChange);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
const Position = ({ property, element, scene, appState }: PositionProps) => {
|
||||
|
@ -204,8 +204,7 @@ export const updateBindings = (
|
||||
latestElement: ExcalidrawElement,
|
||||
elementsMap: NonDeletedSceneElementsMap,
|
||||
zoom?: AppState["zoom"],
|
||||
bindingElementKeptOriginalBinding?: () => void,
|
||||
) => {
|
||||
): boolean => {
|
||||
if (isBindingElement(latestElement)) {
|
||||
const [start, end] = getOriginalBindingsIfStillCloseToArrowEnds(
|
||||
latestElement,
|
||||
@ -217,8 +216,9 @@ export const updateBindings = (
|
||||
(latestElement.startBinding && start) ||
|
||||
(latestElement.endBinding && end)
|
||||
) {
|
||||
bindingElementKeptOriginalBinding?.();
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (latestElement.startBinding && !start) {
|
||||
unbindLinearElement(latestElement, "start");
|
||||
}
|
||||
@ -227,5 +227,6 @@ export const updateBindings = (
|
||||
unbindLinearElement(latestElement, "end");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user