Add duplicate selection functionality
This commit is contained in:
@@ -12,6 +12,7 @@ import {
|
|||||||
import { createCreateBoxBrushCommand } from "../commands/create-box-brush-command";
|
import { createCreateBoxBrushCommand } from "../commands/create-box-brush-command";
|
||||||
import { createDeleteBoxBrushCommand } from "../commands/delete-box-brush-command";
|
import { createDeleteBoxBrushCommand } from "../commands/delete-box-brush-command";
|
||||||
import { createDeleteEntityCommand } from "../commands/delete-entity-command";
|
import { createDeleteEntityCommand } from "../commands/delete-entity-command";
|
||||||
|
import { createDuplicateSelectionCommand } from "../commands/duplicate-selection-command";
|
||||||
import { createImportAudioAssetCommand } from "../commands/import-audio-asset-command";
|
import { createImportAudioAssetCommand } from "../commands/import-audio-asset-command";
|
||||||
import { createImportBackgroundImageAssetCommand } from "../commands/import-background-image-asset-command";
|
import { createImportBackgroundImageAssetCommand } from "../commands/import-background-image-asset-command";
|
||||||
import { createImportModelAssetCommand } from "../commands/import-model-asset-command";
|
import { createImportModelAssetCommand } from "../commands/import-model-asset-command";
|
||||||
@@ -748,6 +749,21 @@ function isTextEntryTarget(target: EventTarget | null): boolean {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function selectionCanBeDuplicated(selection: EditorSelection): boolean {
|
||||||
|
switch (selection.kind) {
|
||||||
|
case "brushes":
|
||||||
|
case "entities":
|
||||||
|
case "modelInstances":
|
||||||
|
return selection.ids.length > 0;
|
||||||
|
case "brushFace":
|
||||||
|
case "brushEdge":
|
||||||
|
case "brushVertex":
|
||||||
|
return true;
|
||||||
|
case "none":
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function isCommitIncrementKey(key: string): boolean {
|
function isCommitIncrementKey(key: string): boolean {
|
||||||
return key === "ArrowUp" || key === "ArrowDown" || key === "PageUp" || key === "PageDown";
|
return key === "ArrowUp" || key === "ArrowDown" || key === "PageUp" || key === "PageDown";
|
||||||
}
|
}
|
||||||
@@ -1589,6 +1605,7 @@ export function App({ store, initialStatusMessage }: AppProps) {
|
|||||||
|
|
||||||
const isDeletionKey = event.key === "Delete" || event.key === "Backspace";
|
const isDeletionKey = event.key === "Delete" || event.key === "Backspace";
|
||||||
const isDeleteShortcut = !event.altKey && !event.ctrlKey && !event.metaKey && (event.code === "KeyX" || isDeletionKey);
|
const isDeleteShortcut = !event.altKey && !event.ctrlKey && !event.metaKey && (event.code === "KeyX" || isDeletionKey);
|
||||||
|
const isDuplicateShortcut = event.shiftKey && !event.altKey && !event.ctrlKey && !event.metaKey && event.code === "KeyD";
|
||||||
|
|
||||||
if (addMenuPosition !== null) {
|
if (addMenuPosition !== null) {
|
||||||
if (isDeletionKey) {
|
if (isDeletionKey) {
|
||||||
@@ -1597,6 +1614,16 @@ export function App({ store, initialStatusMessage }: AppProps) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isDuplicateShortcut) {
|
||||||
|
const duplicated = handleDuplicateSelection();
|
||||||
|
|
||||||
|
if (duplicated) {
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (isDeleteShortcut) {
|
if (isDeleteShortcut) {
|
||||||
if (editorState.toolMode !== "create") {
|
if (editorState.toolMode !== "create") {
|
||||||
const deleted = handleDeleteSelectedSceneItem();
|
const deleted = handleDeleteSelectedSceneItem();
|
||||||
@@ -2776,6 +2803,21 @@ export function App({ store, initialStatusMessage }: AppProps) {
|
|||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const handleDuplicateSelection = () => {
|
||||||
|
if (!selectionCanBeDuplicated(editorState.selection)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
store.executeCommand(createDuplicateSelectionCommand());
|
||||||
|
setStatusMessage("Duplicated selection.");
|
||||||
|
return true;
|
||||||
|
} catch (error) {
|
||||||
|
setStatusMessage(getErrorMessage(error));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const updateInteractionLinkTrigger = (link: InteractionLink, trigger: InteractionTriggerKind) => {
|
const updateInteractionLinkTrigger = (link: InteractionLink, trigger: InteractionTriggerKind) => {
|
||||||
const sourceEntity = getInteractionSourceEntityForLink(link);
|
const sourceEntity = getInteractionSourceEntityForLink(link);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user