Add possibility to move object from context menu to another folder

This commit is contained in:
AlexandreSi
2023-09-25 11:10:32 +02:00
parent 51676c7da5
commit bc672d050b
2 changed files with 66 additions and 4 deletions

View File

@@ -14,7 +14,6 @@ export const getObjectFolderOrObjectUnifiedName = (
? objectFolderOrObject.getFolderName()
: objectFolderOrObject.getObject().getName();
export const enumerateObjectFolderOrObjects = (
project: gdObjectsContainer,
objectsContainer: gdObjectsContainer,
@@ -92,3 +91,31 @@ export const enumerateObjectFolderOrObjects = (
selectedByNamesObjectFolderOrObjectsList,
};
};
const enumerateFoldersInFolder = (
folder: gdObjectFolderOrObject,
prefix: string,
result: {| path: string, folder: gdObjectFolderOrObject |}[]
) => {
mapFor(0, folder.getChildrenCount(), i => {
const child = folder.getChildAt(i);
if (child.isFolder()) {
result.push({
path: prefix
? prefix + '/' + child.getFolderName()
: child.getFolderName(),
folder: child,
});
enumerateFoldersInFolder(child, child.getFolderName(), result);
}
});
};
export const enumerateFoldersInContainer = (
container: gdObjectsContainer
): {| path: string, folder: gdObjectFolderOrObject |}[] => {
const rootFolder = container.getRootFolder();
const result = [];
enumerateFoldersInFolder(rootFolder, '', result);
return result;
};

View File

@@ -44,6 +44,7 @@ import ResponsiveRaisedButton from '../UI/ResponsiveRaisedButton';
import Add from '../UI/CustomSvgIcons/Add';
import InAppTutorialContext from '../InAppTutorial/InAppTutorialContext';
import {
enumerateFoldersInContainer,
enumerateObjectFolderOrObjects,
getObjectFolderOrObjectUnifiedName,
type ObjectFolderOrObjectWithContext,
@@ -880,7 +881,9 @@ const ObjectsList = React.forwardRef<Props, ObjectsListInterface>(
selectedObjectFolderOrObjectParent.moveObjectFolderOrObjectToAnotherFolder(
selectedObjectFolderOrObject,
destinationParent,
destinationParent.getChildPosition(destinationObjectFolderOrObject)
destinationParent.getChildPosition(
destinationObjectFolderOrObject
) + (where === 'after' ? 1 : 0)
);
} else {
return;
@@ -950,9 +953,9 @@ const ObjectsList = React.forwardRef<Props, ObjectsListInterface>(
const renderObjectMenuTemplate = React.useCallback(
(i18n: I18nType) => (item: TreeViewItem, index: number) => {
if (item.isRoot || item.isPlaceholder) return;
if (item.isRoot || item.isPlaceholder) return [];
const { objectFolderOrObject } = item;
if (objectFolderOrObject.isFolder()) return;
if (objectFolderOrObject.isFolder()) return [];
const object = objectFolderOrObject.getObject();
const instanceCountOnScene = initialInstances
@@ -961,6 +964,13 @@ const ObjectsList = React.forwardRef<Props, ObjectsListInterface>(
object.getName()
)
: undefined;
const container = item.global ? project : objectsContainer;
const folderAndPathsInContainer = enumerateFoldersInContainer(
container
).filter(
folderAndPath =>
folderAndPath.folder !== item.objectFolderOrObject.getParent()
);
const objectMetadata = gd.MetadataProvider.getObjectMetadata(
project.getCurrentPlatform(),
@@ -1032,6 +1042,29 @@ const ObjectsList = React.forwardRef<Props, ObjectsListInterface>(
},
visible: canSetAsGlobalObject !== false,
},
{
label: i18n._('Move to folder'),
submenu: folderAndPathsInContainer.map(({ folder, path }) => ({
label: path,
click: () => {
item.objectFolderOrObject
.getParent()
.moveObjectFolderOrObjectToAnotherFolder(
item.objectFolderOrObject,
folder,
0
);
onObjectModified(true);
if (treeViewRef.current)
treeViewRef.current.openItem(
getTreeViewItemId({
objectFolderOrObject: folder,
global: item.global,
})
);
},
})),
},
{
label: i18n._(t`Tags`),
submenu: buildTagsMenuTemplate({
@@ -1094,6 +1127,8 @@ const ObjectsList = React.forwardRef<Props, ObjectsListInterface>(
canSetAsGlobalObject,
initialInstances,
selectObject,
objectsContainer,
onObjectModified,
]
);