mirror of
https://github.com/4ian/GDevelop.git
synced 2025-10-15 10:19:04 +00:00
Allow to open the custom object editor from objects drop-down menu (#7039)
This commit is contained in:
@@ -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")) {}
|
||||
|
||||
|
@@ -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
|
||||
|
@@ -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 {
|
||||
|
@@ -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 \
|
||||
|
2
GDevelop.js/types.d.ts
vendored
2
GDevelop.js/types.d.ts
vendored
@@ -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 {
|
||||
|
@@ -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;
|
||||
};
|
@@ -131,6 +131,10 @@ export type RenderEditorContainerProps = {|
|
||||
extensionName: string,
|
||||
eventsBasedObjectName: string
|
||||
) => void,
|
||||
onOpenEventBasedObjectEditor: (
|
||||
extensionName: string,
|
||||
eventsBasedObjectName: string
|
||||
) => void,
|
||||
|};
|
||||
|
||||
export type RenderEditorContainerPropsWithRef = {|
|
||||
|
@@ -196,6 +196,7 @@ export class CustomObjectEditorContainer extends React.Component<RenderEditorCon
|
||||
this.props.onEventsBasedObjectChildrenEdited
|
||||
}
|
||||
onExtractAsEventBasedObject={this.props.onExtractAsEventBasedObject}
|
||||
onOpenEventBasedObjectEditor={this.props.onOpenEventBasedObjectEditor}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
|
@@ -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)
|
||||
}
|
||||
|
@@ -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)
|
||||
}
|
||||
|
@@ -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,
|
||||
})}
|
||||
|
@@ -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`),
|
||||
|
@@ -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,
|
||||
|
@@ -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)
|
||||
|
@@ -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)
|
||||
|
@@ -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
|
||||
}
|
||||
|
@@ -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={[]}
|
||||
|
@@ -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')}
|
||||
|
Reference in New Issue
Block a user