clear selection from copied/duplicatated group (#1973)

Co-authored-by: rene_mbp <harryloveslearning@googlemail.com>
Co-authored-by: dwelle <luzar.david@gmail.com>
This commit is contained in:
Rene 2020-08-08 22:35:34 +02:00 committed by GitHub
parent c06988a202
commit 403e8bd307
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 47 additions and 29 deletions

View File

@ -10,6 +10,7 @@ import { t } from "../i18n";
import { getShortcutKey } from "../utils"; import { getShortcutKey } from "../utils";
import { LinearElementEditor } from "../element/linearElementEditor"; import { LinearElementEditor } from "../element/linearElementEditor";
import { mutateElement } from "../element/mutateElement"; import { mutateElement } from "../element/mutateElement";
import { selectGroupsForSelectedElements } from "../groups";
export const actionDuplicateSelection = register({ export const actionDuplicateSelection = register({
name: "duplicateSelection", name: "duplicateSelection",
@ -50,9 +51,8 @@ export const actionDuplicateSelection = register({
} }
const groupIdMap = new Map(); const groupIdMap = new Map();
return { const newElements: ExcalidrawElement[] = [];
appState, const finalElements = elements.reduce(
elements: elements.reduce(
(acc: Array<ExcalidrawElement>, element: ExcalidrawElement) => { (acc: Array<ExcalidrawElement>, element: ExcalidrawElement) => {
if (appState.selectedElementIds[element.id]) { if (appState.selectedElementIds[element.id]) {
const newElement = duplicateElement( const newElement = duplicateElement(
@ -64,14 +64,26 @@ export const actionDuplicateSelection = register({
y: element.y + 10, y: element.y + 10,
}, },
); );
appState.selectedElementIds[newElement.id] = true; newElements.push(newElement);
delete appState.selectedElementIds[element.id];
return acc.concat([element, newElement]); return acc.concat([element, newElement]);
} }
return acc.concat(element); return acc.concat(element);
}, },
[], [],
);
return {
appState: selectGroupsForSelectedElements(
{
...appState,
selectedGroupIds: {},
selectedElementIds: newElements.reduce((acc, element) => {
acc[element.id] = true;
return acc;
}, {} as any),
},
getNonDeletedElements(finalElements),
), ),
elements: finalElements,
commitToHistory: true, commitToHistory: true,
}; };
}, },

View File

@ -15,7 +15,7 @@ export class ActionManager implements ActionsManagerInterface {
updater: UpdaterFn; updater: UpdaterFn;
getAppState: () => AppState; getAppState: () => Readonly<AppState>;
getElementsIncludingDeleted: () => readonly ExcalidrawElement[]; getElementsIncludingDeleted: () => readonly ExcalidrawElement[];

View File

@ -14,7 +14,7 @@ export type ActionResult =
type ActionFn = ( type ActionFn = (
elements: readonly ExcalidrawElement[], elements: readonly ExcalidrawElement[],
appState: AppState, appState: Readonly<AppState>,
formData: any, formData: any,
) => ActionResult; ) => ActionResult;

View File

@ -956,19 +956,25 @@ class App extends React.Component<ExcalidrawProps, AppState> {
y: element.y + dy - minY, y: element.y + dy - minY,
}); });
}); });
this.scene.replaceAllElements([ this.scene.replaceAllElements([
...this.scene.getElementsIncludingDeleted(), ...this.scene.getElementsIncludingDeleted(),
...newElements, ...newElements,
]); ]);
history.resumeRecording(); history.resumeRecording();
this.setState({ this.setState(
selectGroupsForSelectedElements(
{
...this.state,
isLibraryOpen: false, isLibraryOpen: false,
selectedElementIds: newElements.reduce((map, element) => { selectedElementIds: newElements.reduce((map, element) => {
map[element.id] = true; map[element.id] = true;
return map; return map;
}, {} as any), }, {} as any),
}); selectedGroupIds: {},
},
this.scene.getElements(),
),
);
}; };
private addTextFromPaste(text: any) { private addTextFromPaste(text: any) {