Allow to open the custom object editor from objects drop-down menu (#7039)

This commit is contained in:
D8H
2024-10-11 12:45:23 +02:00
committed by GitHub
parent 7a4aea6557
commit 83dba6c21e
18 changed files with 94 additions and 2 deletions

View File

@@ -808,6 +808,24 @@ gd::String PlatformExtension::GetObjectFullType(const gd::String &extensionName,
return extensionName + separator + objectName;
}
gd::String PlatformExtension::GetExtensionFromFullObjectType(const gd::String& type) {
const auto separatorIndex =
type.find(PlatformExtension::GetNamespaceSeparator());
if (separatorIndex == std::string::npos) {
return "";
}
return type.substr(0, separatorIndex);
}
gd::String PlatformExtension::GetObjectNameFromFullObjectType(const gd::String& type) {
const auto separatorIndex =
type.find(PlatformExtension::GetNamespaceSeparator());
if (separatorIndex == std::string::npos) {
return "";
}
return type.substr(separatorIndex + 2);
}
PlatformExtension::PlatformExtension()
: deprecated(false), category(_("General")) {}

View File

@@ -653,6 +653,11 @@ class GD_CORE_API PlatformExtension {
static gd::String GetObjectFullType(const gd::String &extensionName,
const gd::String &objectName);
static gd::String GetExtensionFromFullObjectType(const gd::String& type);
static gd::String GetObjectNameFromFullObjectType(const gd::String& type);
private:
/**
* Set the namespace (the string all actions/conditions/expressions start

View File

@@ -2211,6 +2211,8 @@ interface PlatformExtension {
[Const] DOMString extensionName, [Const] DOMString behaviorName);
[Const, Value] DOMString STATIC_GetObjectFullType(
[Const] DOMString extensionName, [Const] DOMString objectName);
[Const, Value] DOMString STATIC_GetExtensionFromFullObjectType([Const] DOMString type);
[Const, Value] DOMString STATIC_GetObjectNameFromFullObjectType([Const] DOMString type);
};
interface EventsList {

View File

@@ -707,6 +707,8 @@ typedef ExtensionAndMetadata<ExpressionMetadata> ExtensionAndExpressionMetadata;
#define STATIC_GetNamespaceSeparator GetNamespaceSeparator
#define STATIC_GetBehaviorFullType GetBehaviorFullType
#define STATIC_GetObjectFullType GetObjectFullType
#define STATIC_GetExtensionFromFullObjectType GetExtensionFromFullObjectType
#define STATIC_GetObjectNameFromFullObjectType GetObjectNameFromFullObjectType
#define STATIC_ApplyRefactoringForVariablesContainer \
ApplyRefactoringForVariablesContainer
#define STATIC_ApplyRefactoringForGroupVariablesContainer \

View File

@@ -1672,6 +1672,8 @@ export class PlatformExtension extends EmscriptenObject {
static getNamespaceSeparator(): string;
static getBehaviorFullType(extensionName: string, behaviorName: string): string;
static getObjectFullType(extensionName: string, objectName: string): string;
static getExtensionFromFullObjectType(type: string): string;
static getObjectNameFromFullObjectType(type: string): string;
}
export class EventsList extends EmscriptenObject {

View File

@@ -58,6 +58,8 @@ declare class gdPlatformExtension {
static getNamespaceSeparator(): string;
static getBehaviorFullType(extensionName: string, behaviorName: string): string;
static getObjectFullType(extensionName: string, objectName: string): string;
static getExtensionFromFullObjectType(type: string): string;
static getObjectNameFromFullObjectType(type: string): string;
delete(): void;
ptr: number;
};

View File

@@ -131,6 +131,10 @@ export type RenderEditorContainerProps = {|
extensionName: string,
eventsBasedObjectName: string
) => void,
onOpenEventBasedObjectEditor: (
extensionName: string,
eventsBasedObjectName: string
) => void,
|};
export type RenderEditorContainerPropsWithRef = {|

View File

@@ -196,6 +196,7 @@ export class CustomObjectEditorContainer extends React.Component<RenderEditorCon
this.props.onEventsBasedObjectChildrenEdited
}
onExtractAsEventBasedObject={this.props.onExtractAsEventBasedObject}
onOpenEventBasedObjectEditor={this.props.onOpenEventBasedObjectEditor}
/>
</div>
);

View File

@@ -256,6 +256,9 @@ export class ExternalLayoutEditorContainer extends React.Component<
openBehaviorEvents={this.props.openBehaviorEvents}
onExtractAsExternalLayout={this.props.onExtractAsExternalLayout}
onExtractAsEventBasedObject={this.props.onExtractAsEventBasedObject}
onOpenEventBasedObjectEditor={
this.props.onOpenEventBasedObjectEditor
}
onObjectEdited={objectWithContext =>
this.props.onSceneObjectEdited(layout, objectWithContext)
}

View File

@@ -148,6 +148,7 @@ export class SceneEditorContainer extends React.Component<RenderEditorContainerP
openBehaviorEvents={this.props.openBehaviorEvents}
onExtractAsExternalLayout={this.props.onExtractAsExternalLayout}
onExtractAsEventBasedObject={this.props.onExtractAsEventBasedObject}
onOpenEventBasedObjectEditor={this.props.onOpenEventBasedObjectEditor}
onObjectEdited={objectWithContext =>
this.props.onSceneObjectEdited(layout, objectWithContext)
}

View File

@@ -2033,7 +2033,7 @@ const MainFrame = (props: Props) => {
openExternalLayout(name);
};
const onExtractAsEventBasedObject = (
const onOpenEventBasedObjectEditor = (
extensionName: string,
eventsBasedObjectName: string
) => {
@@ -3631,7 +3631,8 @@ const MainFrame = (props: Props) => {
},
openBehaviorEvents: openBehaviorEvents,
onExtractAsExternalLayout: onExtractAsExternalLayout,
onExtractAsEventBasedObject: onExtractAsEventBasedObject,
onExtractAsEventBasedObject: onOpenEventBasedObjectEditor,
onOpenEventBasedObjectEditor: onOpenEventBasedObjectEditor,
onEventsBasedObjectChildrenEdited: onEventsBasedObjectChildrenEdited,
onSceneObjectEdited: onSceneObjectEdited,
})}

View File

@@ -215,6 +215,10 @@ type Props = {|
canSetAsGlobalObject?: boolean,
onEditObject: (object: gdObject, initialTab: ?ObjectEditorTab) => void,
onOpenEventBasedObjectEditor: (
extensionName: string,
eventsBasedObjectName: string
) => void,
onExportAssets: () => void,
onObjectCreated: gdObject => void,
onObjectEdited: ObjectWithContext => void,
@@ -252,6 +256,7 @@ const ObjectsList = React.forwardRef<Props, ObjectsListInterface>(
canSetAsGlobalObject,
onEditObject,
onOpenEventBasedObjectEditor,
onExportAssets,
onObjectCreated,
onObjectEdited,
@@ -1504,6 +1509,20 @@ const ObjectsList = React.forwardRef<Props, ObjectsListInterface>(
'EffectCapability::EffectBehavior'
),
},
project.hasEventsBasedObject(object.getType())
? {
label: i18n._(t`Edit children`),
click: () =>
onOpenEventBasedObjectEditor(
gd.PlatformExtension.getExtensionFromFullObjectType(
object.getType()
),
gd.PlatformExtension.getObjectNameFromFullObjectType(
object.getType()
)
),
}
: null,
{ type: 'separator' },
{
label: i18n._(t`Swap assets`),

View File

@@ -42,6 +42,10 @@ export type SceneEditorsDisplayProps = {|
editObjectByName: (objectName: string, initialTab?: ObjectEditorTab) => void,
editObjectInPropertiesPanel: (objectName: string) => void,
onEditObject: (object: gdObject, initialTab: ?ObjectEditorTab) => void,
onOpenEventBasedObjectEditor: (
extensionName: string,
eventsBasedObjectName: string
) => void,
selectedObjectFolderOrObjectsWithContext: ObjectFolderOrObjectWithContext[],
onSelectLayer: (layerName: string) => void,
editLayerEffects: (layer: ?gdLayer) => void,

View File

@@ -375,6 +375,7 @@ const MosaicEditorsDisplay = React.forwardRef<
props.selectedObjectFolderOrObjectsWithContext
}
onEditObject={props.onEditObject}
onOpenEventBasedObjectEditor={props.onOpenEventBasedObjectEditor}
onExportAssets={props.onExportAssets}
onDeleteObjects={(objectWithContext, cb) =>
props.onDeleteObjects(i18n, objectWithContext, cb)

View File

@@ -303,6 +303,9 @@ const SwipeableDrawerEditorsDisplay = React.forwardRef<
props.selectedObjectFolderOrObjectsWithContext
}
onEditObject={props.onEditObject}
onOpenEventBasedObjectEditor={
props.onOpenEventBasedObjectEditor
}
onExportAssets={props.onExportAssets}
onDeleteObjects={(objectWithContext, cb) =>
props.onDeleteObjects(i18n, objectWithContext, cb)

View File

@@ -131,6 +131,10 @@ type Props = {|
extensionName: string,
eventsBasedObjectName: string
) => void,
onOpenEventBasedObjectEditor: (
extensionName: string,
eventsBasedObjectName: string
) => void,
// Preview:
hotReloadPreviewButtonProps: HotReloadPreviewButtonProps,
@@ -1556,6 +1560,20 @@ export default class SceneEditor extends React.Component<Props, State> {
),
}
: null,
object && project.hasEventsBasedObject(object.getType())
? {
label: i18n._(t`Edit children`),
click: () =>
this.props.onOpenEventBasedObjectEditor(
gd.PlatformExtension.getExtensionFromFullObjectType(
object.getType()
),
gd.PlatformExtension.getObjectNameFromFullObjectType(
object.getType()
)
),
}
: null,
{ type: 'separator' },
...this.getContextMenuLayoutItems(i18n),
].filter(Boolean);
@@ -1978,6 +1996,9 @@ export default class SceneEditor extends React.Component<Props, State> {
canObjectOrGroupBeGlobal={this.canObjectOrGroupBeGlobal}
updateBehaviorsSharedData={this.updateBehaviorsSharedData}
onEditObject={this.editObject}
onOpenEventBasedObjectEditor={
this.props.onOpenEventBasedObjectEditor
}
onRenameObjectFolderOrObjectWithContextFinish={
this._onRenameObjectFolderOrObjectWithContextFinish
}

View File

@@ -268,6 +268,7 @@ export const WithObjectsList = () => (
objectsContainer={testProject.testLayout.getObjects()}
resourceManagementProps={fakeResourceManagementProps}
onEditObject={action('On edit object')}
onOpenEventBasedObjectEditor={action('On edit children')}
onExportAssets={action('On export assets')}
onAddObjectInstance={action('On add instance to the scene')}
selectedObjectFolderOrObjectsWithContext={[]}

View File

@@ -32,6 +32,7 @@ export const Default = () => (
objectsContainer={testProject.testLayout.getObjects()}
resourceManagementProps={fakeResourceManagementProps}
onEditObject={action('On edit object')}
onOpenEventBasedObjectEditor={action('On edit children')}
onExportAssets={action('On export assets')}
onAddObjectInstance={action('On add instance to the scene')}
onObjectCreated={action('On object created')}
@@ -64,6 +65,7 @@ export const WithSerializedObjectView = () => (
objectsContainer={testProject.testLayout.getObjects()}
resourceManagementProps={fakeResourceManagementProps}
onEditObject={action('On edit object')}
onOpenEventBasedObjectEditor={action('On edit children')}
onExportAssets={action('On export assets')}
onAddObjectInstance={action('On add instance to the scene')}
onObjectCreated={action('On object created')}