From 8b4d76f8eb58ac3c3774c2af517539c4100f3fe5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davy=20H=C3=A9lard?= Date: Thu, 25 Jun 2026 21:17:41 +0200 Subject: [PATCH 1/5] Allow to set behavior properties on several instances at once --- .../Editors/AnchorBehaviorEditor.js | 14 +- .../CompactInstancePropertiesEditor/index.js | 99 +++++---- .../CompactAnchorBehaviorEditor.js | 17 +- .../CompactAnchorInstanceBehaviorEditor.js | 95 +++++++++ .../CompactBehaviorPropertiesEditor.js | 95 +-------- ...mpactBehaviorPropertiesEditorProps.flow.js | 2 - ...CompactInstanceBehaviorPropertiesEditor.js | 197 ++++++++++++++++++ ...tanceBehaviorPropertiesEditorProps.flow.js | 19 ++ .../CompactInstanceBehaviorsEditorService.js | 27 +++ .../CompactObjectPropertiesEditor/index.js | 2 - .../CompactObjectGroupPropertiesEditor.js | 2 - .../CompactAnchorBehaviorEditor.stories.js | 2 - 12 files changed, 405 insertions(+), 166 deletions(-) create mode 100644 newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactAnchorInstanceBehaviorEditor.js create mode 100644 newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactInstanceBehaviorPropertiesEditor.js create mode 100644 newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactInstanceBehaviorPropertiesEditorProps.flow.js create mode 100644 newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactInstanceBehaviorsEditorService.js diff --git a/newIDE/app/src/BehaviorsEditor/Editors/AnchorBehaviorEditor.js b/newIDE/app/src/BehaviorsEditor/Editors/AnchorBehaviorEditor.js index e59b16b08156..57f25d152047 100644 --- a/newIDE/app/src/BehaviorsEditor/Editors/AnchorBehaviorEditor.js +++ b/newIDE/app/src/BehaviorsEditor/Editors/AnchorBehaviorEditor.js @@ -19,10 +19,6 @@ import useForceUpdate from '../../Utils/UseForceUpdate'; import { ColumnStackLayout } from '../../UI/Layout'; import { Line } from '../../UI/Grid'; import Text from '../../UI/Text'; -import { - getPropertyValue, - updateProperty, -} from '../../ObjectEditor/CompactObjectPropertiesEditor/CompactBehaviorPropertiesEditor'; import CompactToggleButtons, { type CompactToggleButton, } from '../../UI/CompactToggleButtons'; @@ -307,16 +303,20 @@ const AnchorBehaviorEditor = ({ const behavior = behaviors[0]; const forceUpdate = useForceUpdate(); const _getPropertyValue = React.useCallback( - (propertyName: string) => getPropertyValue(behavior, propertyName, null), + (propertyName: string) => + behavior + .getProperties() + .get(propertyName) + .getValue(), [behavior] ); const _updateProperty = React.useCallback( (propertyName: string, value: string) => { - updateProperty(project, behavior, propertyName, value, null); + behavior.updateProperty(propertyName, value); forceUpdate(); onBehaviorUpdated(); }, - [behavior, forceUpdate, onBehaviorUpdated, project] + [behavior, forceUpdate, onBehaviorUpdated] ); const _onBehaviorUpdated = React.useCallback( () => { diff --git a/newIDE/app/src/InstancesEditor/CompactInstancePropertiesEditor/index.js b/newIDE/app/src/InstancesEditor/CompactInstancePropertiesEditor/index.js index 5a46e66b05a9..464f15717b58 100644 --- a/newIDE/app/src/InstancesEditor/CompactInstancePropertiesEditor/index.js +++ b/newIDE/app/src/InstancesEditor/CompactInstancePropertiesEditor/index.js @@ -42,8 +42,9 @@ import Window from '../../Utils/Window'; import { type ResourceManagementProps } from '../../ResourcesList/ResourceSource'; import { usePersistedScrollPosition } from '../../Utils/UsePersistedScrollPosition'; import EmptyMessage from '../../UI/EmptyMessage'; -import CompactBehaviorsEditorService from '../../ObjectEditor/CompactObjectPropertiesEditor/CompactBehaviorsEditorService'; +import CompactInstanceBehaviorsEditorService from '../../ObjectEditor/CompactObjectPropertiesEditor/CompactInstanceBehaviorsEditorService'; import { exceptionallyGuardAgainstDeadObject } from '../../Utils/IsNullPtr'; +import { getAllVisibleBehaviorNames } from '../../Utils/Behavior'; const gd: libGDevelop = global.gd; @@ -157,7 +158,6 @@ export const CompactInstancePropertiesEditor = ({ * obviously plus instance-wise variables with same name). */ const shouldDisplayVariablesList = instances.length === 1; - const shouldDisplayBehaviorsList = instances.length === 1; const variablesContainer = shouldDisplayVariablesList ? exceptionallyGuardAgainstDeadObject(instance.getVariables()) : null; @@ -200,41 +200,44 @@ export const CompactInstancePropertiesEditor = ({ const { object, instanceSchema, allVisibleBehaviors } = React.useMemo<{| object?: gdObject, instanceSchema?: Schema, - allVisibleBehaviors: Array, + allVisibleBehaviors: Array | null, |}>( () => { if (!instance) return { object: undefined, instanceSchema: undefined, - allVisibleBehaviors: [], + allVisibleBehaviors: null, }; - const associatedObjectName = instance.getObjectName(); - const object = getObjectByName( - globalObjectsContainer, - objectsContainer, - associatedObjectName - ); - const properties = instance.getCustomProperties( - globalObjectsContainer || objectsContainer, - objectsContainer - ); - if (!object) + const objects = new Map(); + for (const instance of instances) { + const associatedObjectName = instance.getObjectName(); + if (objects.has(associatedObjectName)) { + continue; + } + const object = getObjectByName( + globalObjectsContainer, + objectsContainer, + associatedObjectName + ); + if (object) { + objects.set(associatedObjectName, object); + } + } + const [object] = [...objects.values()]; + if (!object) { return { object: undefined, instanceSchema: undefined, - allVisibleBehaviors: [], + allVisibleBehaviors: null, }; + } - const allVisibleBehaviors = object - .getAllBehaviorNames() - .toJSArray() - .map(behaviorName => object.getBehavior(behaviorName)) - .filter(behavior => !behavior.isDefaultBehavior()) - // We don't keep the behaviors directly because they may be destroyed - // if the object is rebuilt from a serialization. - .map(behavior => behavior.getName()); + const properties = instance.getCustomProperties( + globalObjectsContainer || objectsContainer, + objectsContainer + ); const objectMetadata = gd.MetadataProvider.getObjectMetadata( project.getCurrentPlatform(), @@ -291,7 +294,8 @@ export const CompactInstancePropertiesEditor = ({ return { object, instanceSchema, - allVisibleBehaviors, + allVisibleBehaviors: + objects.size === 1 ? getAllVisibleBehaviorNames([object]) : null, }; }, [ @@ -299,11 +303,12 @@ export const CompactInstancePropertiesEditor = ({ globalObjectsContainer, objectsContainer, project, - i18n, - forceUpdate, layersContainer, + i18n, onGetInstanceSize, editObjectInPropertiesPanel, + forceUpdate, + instances, ] ); @@ -384,7 +389,7 @@ export const CompactInstancePropertiesEditor = ({ )} - {object && shouldDisplayBehaviorsList ? ( + {allVisibleBehaviors ? ( Behaviors} isFolded={isBehaviorsFolded} @@ -423,7 +428,7 @@ export const CompactInstancePropertiesEditor = ({ ? instance.getBehaviorOverriding(behaviorName) : null; const iconUrl = behaviorMetadata.getIconFilename(); - const CompactBehaviorComponent = CompactBehaviorsEditorService.getEditor( + const CompactInstanceBehaviorComponent = CompactInstanceBehaviorsEditorService.getEditor( behaviorTypeName ); return ( @@ -443,29 +448,31 @@ export const CompactInstancePropertiesEditor = ({ ) : () => ( - { - if ( - instance.hasBehaviorOverridingNamed( - behaviorName - ) && - !instance.hasAnyOverriddenPropertyForBehavior( - behavior - ) - ) { - instance.removeBehaviorOverriding( - behaviorName - ); - // Update the view to stop using - // the removed behavior overriding. - forceUpdate(); + for (const instance of instances) { + if ( + instance.hasBehaviorOverridingNamed( + behaviorName + ) && + !instance.hasAnyOverriddenPropertyForBehavior( + behavior + ) + ) { + instance.removeBehaviorOverriding( + behaviorName + ); + // Update the view to stop using + // the removed behavior overriding. + forceUpdate(); + } } }} resourceManagementProps={ diff --git a/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactAnchorBehaviorEditor.js b/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactAnchorBehaviorEditor.js index 8256f0da7d81..02defd63d14f 100644 --- a/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactAnchorBehaviorEditor.js +++ b/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactAnchorBehaviorEditor.js @@ -1,11 +1,7 @@ // @flow import * as React from 'react'; import { type CompactBehaviorPropertiesEditorProps } from './CompactBehaviorPropertiesEditorProps.flow'; -import { - CompactBehaviorPropertiesEditor, - getPropertyValue, - updateProperty, -} from './CompactBehaviorPropertiesEditor'; +import { CompactBehaviorPropertiesEditor } from './CompactBehaviorPropertiesEditor'; import useForceUpdate from '../../Utils/UseForceUpdate'; import { ColumnStackLayout } from '../../UI/Layout'; import { @@ -21,8 +17,6 @@ const CompactAnchorBehaviorEditor = ({ object, layersContainer, behaviorMetadata, - behaviorOverriding, - initialInstance, onOpenFullEditor, onBehaviorUpdated, resourceManagementProps, @@ -31,7 +25,10 @@ const CompactAnchorBehaviorEditor = ({ const _getPropertyValue = (propertyName: string) => { let commonValue = null; for (const behavior of behaviors) { - const value = getPropertyValue(behavior, propertyName, initialInstance); + const value = behavior + .getProperties() + .get(propertyName) + .getValue(); if (commonValue === null) { commonValue = value; } @@ -43,7 +40,7 @@ const CompactAnchorBehaviorEditor = ({ }; const _updateProperty = (propertyName: string, value: string) => { for (const behavior of behaviors) { - updateProperty(project, behavior, propertyName, value, initialInstance); + behavior.updateProperty(propertyName, value); } forceUpdate(); onBehaviorUpdated(); @@ -77,8 +74,6 @@ const CompactAnchorBehaviorEditor = ({ layersContainer={layersContainer} behaviors={behaviors} behaviorMetadata={behaviorMetadata} - behaviorOverriding={behaviorOverriding} - initialInstance={initialInstance} onOpenFullEditor={onOpenFullEditor} onBehaviorUpdated={_onBehaviorUpdated} resourceManagementProps={resourceManagementProps} diff --git a/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactAnchorInstanceBehaviorEditor.js b/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactAnchorInstanceBehaviorEditor.js new file mode 100644 index 000000000000..3a1b39098def --- /dev/null +++ b/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactAnchorInstanceBehaviorEditor.js @@ -0,0 +1,95 @@ +// @flow +import * as React from 'react'; +import { type CompactInstanceBehaviorPropertiesEditorProps } from './CompactInstanceBehaviorPropertiesEditorProps.flow'; +import { + CompactInstanceBehaviorPropertiesEditor, + getPropertyValue, + updateProperty, +} from './CompactInstanceBehaviorPropertiesEditor'; +import useForceUpdate from '../../Utils/UseForceUpdate'; +import { ColumnStackLayout } from '../../UI/Layout'; +import { + HorizontalAnchorButtonGroup, + VerticalAnchorButtonGroup, + getBasicHorizontalAnchor, + getBasicVerticalAnchor, +} from '../../BehaviorsEditor/Editors/AnchorBehaviorEditor'; + +const CompactInstanceAnchorBehaviorEditor = ({ + project, + behavior, + object, + layersContainer, + behaviorMetadata, + behaviorOverriding, + initialInstances, + onOpenFullEditor, + onBehaviorUpdated, + resourceManagementProps, +}: CompactInstanceBehaviorPropertiesEditorProps): React.Node => { + const forceUpdate = useForceUpdate(); + const _getPropertyValue = (propertyName: string) => { + let commonValue = null; + for (const initialInstance of initialInstances) { + const value = getPropertyValue(behavior, propertyName, initialInstance); + if (commonValue === null) { + commonValue = value; + } + if (value !== commonValue) { + return null; + } + } + return commonValue; + }; + const _updateProperty = (propertyName: string, value: string) => { + for (const initialInstance of initialInstances) { + updateProperty(project, behavior, propertyName, value, initialInstance); + } + forceUpdate(); + onBehaviorUpdated(); + }; + const _onBehaviorUpdated = React.useCallback( + () => { + forceUpdate(); + onBehaviorUpdated(); + }, + [forceUpdate, onBehaviorUpdated] + ); + + const horizontalBasicAnchor = getBasicHorizontalAnchor(_getPropertyValue); + const verticalBasicAnchor = getBasicVerticalAnchor(_getPropertyValue); + + return ( + + + + + + ); +}; + +export default CompactInstanceAnchorBehaviorEditor; diff --git a/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactBehaviorPropertiesEditor.js b/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactBehaviorPropertiesEditor.js index 85edea6bcd0a..3a2294fdff0e 100644 --- a/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactBehaviorPropertiesEditor.js +++ b/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactBehaviorPropertiesEditor.js @@ -54,73 +54,12 @@ export const getSchemaWithOpenFullEditorButton = ({ return schema; }; -export const getPropertyValue = ( - behavior: gdBehavior, - propertyName: string, - initialInstance: gdInitialInstance | null -): string => { - const behaviorName = behavior.getName(); - if ( - initialInstance && - initialInstance.hasBehaviorOverridingNamed(behaviorName) && - initialInstance - .getBehaviorOverriding(behaviorName) - .hasPropertyValue(propertyName) - ) { - const behaviorOverriding = initialInstance.getBehaviorOverriding( - behaviorName - ); - return behaviorOverriding - .getProperties() - .get(propertyName) - .getValue(); - } - return behavior - .getProperties() - .get(propertyName) - .getValue(); -}; - -export const updateProperty = ( - project: gdProject, - behavior: gdBehavior, - propertyName: string, - value: string, - initialInstance: gdInitialInstance | null -): void => { - if (initialInstance) { - const behaviorName = behavior.getName(); - const behaviorOverriding = initialInstance.hasBehaviorOverridingNamed( - behaviorName - ) - ? initialInstance.getBehaviorOverriding(behaviorName) - : initialInstance.addNewBehaviorOverriding( - project, - behavior.getTypeName(), - behaviorName - ); - const behaviorProperties = behavior.getProperties(); - const inheritedValue = behaviorProperties.has(propertyName) - ? behaviorProperties.get(propertyName).getValue() - : null; - if (inheritedValue === value) { - behaviorOverriding.removeProperty(propertyName); - } else { - behaviorOverriding.updateProperty(propertyName, value); - } - } else { - behavior.updateProperty(propertyName, value); - } -}; - export const CompactBehaviorPropertiesEditor = ({ project, behaviorMetadata, behaviors, object, layersContainer, - behaviorOverriding, - initialInstance, onOpenFullEditor, onBehaviorUpdated, resourceManagementProps, @@ -132,30 +71,6 @@ export const CompactBehaviorPropertiesEditor = ({ if (schemaRecomputeTrigger) { // schemaRecomputeTrigger allows to invalidate the schema when required. } - if (initialInstance) { - const behavior = behaviors[0]; - const behaviorProperties = behavior.getProperties(); - return propertiesMapToSchema({ - properties: behaviorProperties, - defaultValueProperties: behaviorProperties, - getPropertyValue: (instance: gdBehavior, propertyName) => - getPropertyValue(instance, propertyName, initialInstance), - onUpdateProperty: (instance, propertyName, value) => - updateProperty( - project, - instance, - propertyName, - value, - initialInstance - ), - object, - layersContainer, - visibility: 'All', - showcaseNonDefaultValues: true, - hideResourceProperties: true, - shouldDisabledFieldsWithMixedValues: false, - }); - } const behaviorMetadataProperties = behaviorMetadata.getProperties(); return propertiesMapToSchema({ properties: behaviorMetadataProperties, @@ -174,15 +89,7 @@ export const CompactBehaviorPropertiesEditor = ({ shouldDisabledFieldsWithMixedValues: true, }); }, - [ - schemaRecomputeTrigger, - initialInstance, - behaviorMetadata, - object, - layersContainer, - behaviors, - project, - ] + [schemaRecomputeTrigger, behaviorMetadata, object, layersContainer] ); return ( diff --git a/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactBehaviorPropertiesEditorProps.flow.js b/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactBehaviorPropertiesEditorProps.flow.js index 0af2d759ba69..13c69e81f0b4 100644 --- a/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactBehaviorPropertiesEditorProps.flow.js +++ b/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactBehaviorPropertiesEditorProps.flow.js @@ -10,8 +10,6 @@ export type CompactBehaviorPropertiesEditorProps = {| behaviors: Array, object: gdObject | null, layersContainer: gdLayersContainer, - behaviorOverriding: gdBehavior | null, - initialInstance: gdInitialInstance | null, onOpenFullEditor?: () => void, onBehaviorUpdated: () => void, resourceManagementProps: ResourceManagementProps, diff --git a/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactInstanceBehaviorPropertiesEditor.js b/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactInstanceBehaviorPropertiesEditor.js new file mode 100644 index 000000000000..2882f33b76d8 --- /dev/null +++ b/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactInstanceBehaviorPropertiesEditor.js @@ -0,0 +1,197 @@ +// @flow +import * as React from 'react'; +import { ColumnStackLayout } from '../../UI/Layout'; +import { Trans } from '@lingui/macro'; +import { + type Schema, + type ActionButton, +} from '../../PropertiesEditor/PropertiesEditorSchema'; +import ShareExternal from '../../UI/CustomSvgIcons/ShareExternal'; +import { CompactPropertiesEditorByVisibility } from '../../CompactPropertiesEditor/CompactPropertiesEditorByVisibility'; +import propertiesMapToSchema from '../../PropertiesEditor/PropertiesMapToSchema'; +import { useForceRecompute } from '../../Utils/UseForceUpdate'; +import { type CompactInstanceBehaviorPropertiesEditorProps } from './CompactInstanceBehaviorPropertiesEditorProps.flow'; + +export const styles = { + icon: { + fontSize: 18, + }, +}; + +export const getSchemaWithOpenFullEditorButton = ({ + schema, + fullEditorLabel, + behavior, + onOpenFullEditor, +}: {| + schema: Schema, + fullEditorLabel: ?string, + behavior: gdBehavior, + onOpenFullEditor: () => void, +|}): Schema => { + if (!fullEditorLabel) return schema; + + const actionButton: ActionButton = { + label: fullEditorLabel, + disabled: 'onValuesDifferent', + nonFieldType: 'button', + showRightIcon: true, + getIcon: style => , + getValue: behavior => behavior.getName(), + onClick: behavior => onOpenFullEditor(), + }; + + let added = false; + schema.forEach(field => { + if (field.children && field.name === '') { + field.children.push(actionButton); + added = true; + } + }); + + if (!added) schema.push(actionButton); + + return schema; +}; + +export const getPropertyValue = ( + behavior: gdBehavior, + propertyName: string, + initialInstance: gdInitialInstance +): string => { + const behaviorName = behavior.getName(); + if ( + initialInstance.hasBehaviorOverridingNamed(behaviorName) && + initialInstance + .getBehaviorOverriding(behaviorName) + .hasPropertyValue(propertyName) + ) { + const behaviorOverriding = initialInstance.getBehaviorOverriding( + behaviorName + ); + return behaviorOverriding + .getProperties() + .get(propertyName) + .getValue(); + } + return behavior + .getProperties() + .get(propertyName) + .getValue(); +}; + +export const updateProperty = ( + project: gdProject, + behavior: gdBehavior, + propertyName: string, + value: string, + initialInstance: gdInitialInstance +): void => { + const behaviorName = behavior.getName(); + const behaviorOverriding = initialInstance.hasBehaviorOverridingNamed( + behaviorName + ) + ? initialInstance.getBehaviorOverriding(behaviorName) + : initialInstance.addNewBehaviorOverriding( + project, + behavior.getTypeName(), + behaviorName + ); + const behaviorProperties = behavior.getProperties(); + const inheritedValue = behaviorProperties.has(propertyName) + ? behaviorProperties.get(propertyName).getValue() + : null; + if (inheritedValue === value) { + behaviorOverriding.removeProperty(propertyName); + } else { + behaviorOverriding.updateProperty(propertyName, value); + } +}; + +export const CompactInstanceBehaviorPropertiesEditor = ({ + project, + behaviorMetadata, + behavior, + object, + layersContainer, + behaviorOverriding, + initialInstances, + onOpenFullEditor, + onBehaviorUpdated, + resourceManagementProps, +}: CompactInstanceBehaviorPropertiesEditorProps): React.Node => { + const [schemaRecomputeTrigger, forceRecomputeSchema] = useForceRecompute(); + + const instancesAndBehaviors = initialInstances.map(initialInstance => ({ + initialInstance, + behavior, + })); + + const propertiesSchema = React.useMemo( + () => { + if (schemaRecomputeTrigger) { + // schemaRecomputeTrigger allows to invalidate the schema when required. + } + const behaviorProperties = behavior.getProperties(); + return propertiesMapToSchema({ + properties: behaviorProperties, + defaultValueProperties: behaviorProperties, + getPropertyValue: ( + { + behavior, + initialInstance, + }: { behavior: gdBehavior, initialInstance: gdInitialInstance }, + propertyName + ) => getPropertyValue(behavior, propertyName, initialInstance), + onUpdateProperty: ( + { + behavior, + initialInstance, + }: { behavior: gdBehavior, initialInstance: gdInitialInstance }, + propertyName, + value + ) => + updateProperty( + project, + behavior, + propertyName, + value, + initialInstance + ), + object, + layersContainer, + visibility: 'All', + showcaseNonDefaultValues: true, + hideResourceProperties: true, + shouldDisabledFieldsWithMixedValues: false, + }); + }, + [schemaRecomputeTrigger, object, layersContainer, behavior, project] + ); + + return ( + + Nothing to configure for this behavior.} + customizeBasicSchema={ + onOpenFullEditor + ? schema => + getSchemaWithOpenFullEditorButton({ + schema, + fullEditorLabel: behaviorMetadata.getOpenFullEditorLabel(), + behavior: behavior, + onOpenFullEditor, + }) + : null + } + onRefreshAllFields={forceRecomputeSchema} + /> + + ); +}; diff --git a/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactInstanceBehaviorPropertiesEditorProps.flow.js b/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactInstanceBehaviorPropertiesEditorProps.flow.js new file mode 100644 index 000000000000..c3dc2e20282d --- /dev/null +++ b/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactInstanceBehaviorPropertiesEditorProps.flow.js @@ -0,0 +1,19 @@ +// @flow +import { type ResourceManagementProps } from '../../ResourcesList/ResourceSource'; + +/** + * The props given to any behavior editor + */ +export type CompactInstanceBehaviorPropertiesEditorProps = {| + project: gdProject, + behaviorMetadata: gdBehaviorMetadata, + behavior: gdBehavior, + object: gdObject | null, + layersContainer: gdLayersContainer, + behaviorOverriding: gdBehavior | null, + initialInstances: Array, + onOpenFullEditor?: () => void, + onBehaviorUpdated: () => void, + resourceManagementProps: ResourceManagementProps, + isAdvancedSectionInitiallyUncollapsed?: boolean, +|}; diff --git a/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactInstanceBehaviorsEditorService.js b/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactInstanceBehaviorsEditorService.js new file mode 100644 index 000000000000..26641d1091bc --- /dev/null +++ b/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactInstanceBehaviorsEditorService.js @@ -0,0 +1,27 @@ +// @flow +import { CompactInstanceBehaviorPropertiesEditor } from './CompactInstanceBehaviorPropertiesEditor'; +import { type CompactInstanceBehaviorPropertiesEditorProps } from './CompactInstanceBehaviorPropertiesEditorProps.flow'; +import CompactInstanceAnchorBehaviorEditor from './CompactAnchorInstanceBehaviorEditor'; + +/** + * A service returning editor components for each behavior type. + */ +const CompactBehaviorsEditorService = { + getEditor( + behaviorType: string + ): React.ComponentType { + // $FlowFixMe[object-this-reference] + if (!this.components[behaviorType]) { + return CompactInstanceBehaviorPropertiesEditor; // Default properties editor + } + // $FlowFixMe[object-this-reference] + return this.components[behaviorType].component; // Custom behavior editor + }, + components: { + 'AnchorBehavior::AnchorBehavior': { + component: CompactInstanceAnchorBehaviorEditor, + }, + }, +}; + +export default CompactBehaviorsEditorService; diff --git a/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/index.js b/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/index.js index 6da99c9a7a41..b3aa34ee8bb9 100644 --- a/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/index.js +++ b/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/index.js @@ -848,8 +848,6 @@ export const CompactObjectPropertiesEditor = ({ project={project} behaviorMetadata={behaviorMetadata} behaviors={[behavior]} - behaviorOverriding={null} - initialInstance={null} object={object} layersContainer={layersContainer} onBehaviorUpdated={() => {}} diff --git a/newIDE/app/src/ObjectGroupEditor/CompactObjectGroupPropertiesEditor.js b/newIDE/app/src/ObjectGroupEditor/CompactObjectGroupPropertiesEditor.js index dc7d8d89c861..4937440a18eb 100644 --- a/newIDE/app/src/ObjectGroupEditor/CompactObjectGroupPropertiesEditor.js +++ b/newIDE/app/src/ObjectGroupEditor/CompactObjectGroupPropertiesEditor.js @@ -370,8 +370,6 @@ export const CompactObjectGroupPropertiesEditor = ({ project={project} behaviorMetadata={behaviorMetadata} behaviors={behaviors} - behaviorOverriding={null} - initialInstance={null} object={null} layersContainer={layersContainer} onBehaviorUpdated={() => {}} diff --git a/newIDE/app/src/stories/componentStories/ObjectEditor/CompactAnchorBehaviorEditor.stories.js b/newIDE/app/src/stories/componentStories/ObjectEditor/CompactAnchorBehaviorEditor.stories.js index e25dbbaa9c9a..e49589fd90a7 100644 --- a/newIDE/app/src/stories/componentStories/ObjectEditor/CompactAnchorBehaviorEditor.stories.js +++ b/newIDE/app/src/stories/componentStories/ObjectEditor/CompactAnchorBehaviorEditor.stories.js @@ -34,8 +34,6 @@ export const Default = (): React.Node => { behaviors={[anchorBehavior]} object={spriteObjectWithBehaviors} behaviorMetadata={behaviorMetadata} - behaviorOverriding={null} - initialInstance={null} onOpenFullEditor={action('onOpenFullEditor')} onBehaviorUpdated={action('onBehaviorUpdated')} resourceManagementProps={fakeResourceManagementProps} From b492853b2cd782f8b79bdd12aa499b3177ab7153 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davy=20H=C3=A9lard?= Date: Fri, 26 Jun 2026 11:33:40 +0200 Subject: [PATCH 2/5] Fix collapsing --- .../CompactInstancePropertiesEditor/index.js | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/newIDE/app/src/InstancesEditor/CompactInstancePropertiesEditor/index.js b/newIDE/app/src/InstancesEditor/CompactInstancePropertiesEditor/index.js index 464f15717b58..19f9ccc82c47 100644 --- a/newIDE/app/src/InstancesEditor/CompactInstancePropertiesEditor/index.js +++ b/newIDE/app/src/InstancesEditor/CompactInstancePropertiesEditor/index.js @@ -313,7 +313,9 @@ export const CompactInstancePropertiesEditor = ({ ); const [isBehaviorsFolded, setIsBehaviorsFolded] = React.useState( - object ? !instance.hasAnyOverriddenProperty(object) : true + object + ? instances.every(instance => !instance.hasAnyOverriddenProperty(object)) + : true ); const shouldDisplayTileSetVisualizer = @@ -481,11 +483,12 @@ export const CompactInstancePropertiesEditor = ({ /> ) } - isInitiallyFolded={ - !instance.hasAnyOverriddenPropertyForBehavior( - behavior - ) - } + isInitiallyFolded={instances.every( + instance => + !instance.hasAnyOverriddenPropertyForBehavior( + behavior + ) + )} titleIcon={ iconUrl ? ( Date: Fri, 26 Jun 2026 11:43:07 +0200 Subject: [PATCH 3/5] Remove useless property --- .../CompactInstancePropertiesEditor/index.js | 6 ------ .../CompactAnchorInstanceBehaviorEditor.js | 2 -- .../CompactInstanceBehaviorPropertiesEditor.js | 1 - .../CompactInstanceBehaviorPropertiesEditorProps.flow.js | 1 - 4 files changed, 10 deletions(-) diff --git a/newIDE/app/src/InstancesEditor/CompactInstancePropertiesEditor/index.js b/newIDE/app/src/InstancesEditor/CompactInstancePropertiesEditor/index.js index 19f9ccc82c47..0f7eb0465c40 100644 --- a/newIDE/app/src/InstancesEditor/CompactInstancePropertiesEditor/index.js +++ b/newIDE/app/src/InstancesEditor/CompactInstancePropertiesEditor/index.js @@ -424,11 +424,6 @@ export const CompactInstancePropertiesEditor = ({ gd.JsPlatform.get(), behaviorTypeName ); - const behaviorOverriding = instance.hasBehaviorOverridingNamed( - behaviorName - ) - ? instance.getBehaviorOverriding(behaviorName) - : null; const iconUrl = behaviorMetadata.getIconFilename(); const CompactInstanceBehaviorComponent = CompactInstanceBehaviorsEditorService.getEditor( behaviorTypeName @@ -454,7 +449,6 @@ export const CompactInstancePropertiesEditor = ({ project={project} behaviorMetadata={behaviorMetadata} behavior={behavior} - behaviorOverriding={behaviorOverriding} object={object} layersContainer={layersContainer} initialInstances={instances} diff --git a/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactAnchorInstanceBehaviorEditor.js b/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactAnchorInstanceBehaviorEditor.js index 3a1b39098def..2ef3ccfc4609 100644 --- a/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactAnchorInstanceBehaviorEditor.js +++ b/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactAnchorInstanceBehaviorEditor.js @@ -21,7 +21,6 @@ const CompactInstanceAnchorBehaviorEditor = ({ object, layersContainer, behaviorMetadata, - behaviorOverriding, initialInstances, onOpenFullEditor, onBehaviorUpdated, @@ -77,7 +76,6 @@ const CompactInstanceAnchorBehaviorEditor = ({ layersContainer={layersContainer} behavior={behavior} behaviorMetadata={behaviorMetadata} - behaviorOverriding={behaviorOverriding} initialInstances={initialInstances} onOpenFullEditor={onOpenFullEditor} onBehaviorUpdated={_onBehaviorUpdated} diff --git a/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactInstanceBehaviorPropertiesEditor.js b/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactInstanceBehaviorPropertiesEditor.js index 2882f33b76d8..639c00448f62 100644 --- a/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactInstanceBehaviorPropertiesEditor.js +++ b/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactInstanceBehaviorPropertiesEditor.js @@ -114,7 +114,6 @@ export const CompactInstanceBehaviorPropertiesEditor = ({ behavior, object, layersContainer, - behaviorOverriding, initialInstances, onOpenFullEditor, onBehaviorUpdated, diff --git a/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactInstanceBehaviorPropertiesEditorProps.flow.js b/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactInstanceBehaviorPropertiesEditorProps.flow.js index c3dc2e20282d..4185383124d8 100644 --- a/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactInstanceBehaviorPropertiesEditorProps.flow.js +++ b/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactInstanceBehaviorPropertiesEditorProps.flow.js @@ -10,7 +10,6 @@ export type CompactInstanceBehaviorPropertiesEditorProps = {| behavior: gdBehavior, object: gdObject | null, layersContainer: gdLayersContainer, - behaviorOverriding: gdBehavior | null, initialInstances: Array, onOpenFullEditor?: () => void, onBehaviorUpdated: () => void, From bd3b71a653f801653dac00c780aee3bf9e7d25cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davy=20H=C3=A9lard?= Date: Fri, 26 Jun 2026 13:13:52 +0200 Subject: [PATCH 4/5] Handle instances from different objects --- .../CompactInstancePropertiesEditor/index.js | 64 ++++++++++++------- .../CompactAnchorInstanceBehaviorEditor.js | 12 ++-- ...CompactInstanceBehaviorPropertiesEditor.js | 36 ++++------- ...tanceBehaviorPropertiesEditorProps.flow.js | 7 +- 4 files changed, 64 insertions(+), 55 deletions(-) diff --git a/newIDE/app/src/InstancesEditor/CompactInstancePropertiesEditor/index.js b/newIDE/app/src/InstancesEditor/CompactInstancePropertiesEditor/index.js index 0f7eb0465c40..e5830a937ae1 100644 --- a/newIDE/app/src/InstancesEditor/CompactInstancePropertiesEditor/index.js +++ b/newIDE/app/src/InstancesEditor/CompactInstancePropertiesEditor/index.js @@ -210,10 +210,10 @@ export const CompactInstancePropertiesEditor = ({ allVisibleBehaviors: null, }; - const objects = new Map(); + const objectsMap = new Map(); for (const instance of instances) { const associatedObjectName = instance.getObjectName(); - if (objects.has(associatedObjectName)) { + if (objectsMap.has(associatedObjectName)) { continue; } const object = getObjectByName( @@ -222,10 +222,11 @@ export const CompactInstancePropertiesEditor = ({ associatedObjectName ); if (object) { - objects.set(associatedObjectName, object); + objectsMap.set(associatedObjectName, object); } } - const [object] = [...objects.values()]; + const objects = [...objectsMap.values()]; + const object = objects[0]; if (!object) { return { object: undefined, @@ -294,8 +295,7 @@ export const CompactInstancePropertiesEditor = ({ return { object, instanceSchema, - allVisibleBehaviors: - objects.size === 1 ? getAllVisibleBehaviorNames([object]) : null, + allVisibleBehaviors: getAllVisibleBehaviorNames(objects), }; }, [ @@ -418,8 +418,9 @@ export const CompactInstancePropertiesEditor = ({ if (!object.hasBehaviorNamed(behaviorName)) { return null; } - const behavior = object.getBehavior(behaviorName); - const behaviorTypeName = behavior.getTypeName(); + const behaviorTypeName = object + .getBehavior(behaviorName) + .getTypeName(); const behaviorMetadata = gd.MetadataProvider.getBehaviorMetadata( gd.JsPlatform.get(), behaviorTypeName @@ -428,13 +429,30 @@ export const CompactInstancePropertiesEditor = ({ const CompactInstanceBehaviorComponent = CompactInstanceBehaviorsEditorService.getEditor( behaviorTypeName ); + const instancesAndBehaviors = instances + .map(initialInstance => { + const object = getObjectByName( + globalObjectsContainer, + objectsContainer, + initialInstance.getObjectName() + ); + if (!object || !object.hasBehaviorNamed(behaviorName)) { + return null; + } + return { + initialInstance, + behavior: object.getBehavior(behaviorName), + }; + }) + .filter(Boolean); + if (instancesAndBehaviors.length === 0) { + return null; + } return ( ( @@ -448,21 +466,23 @@ export const CompactInstancePropertiesEditor = ({ { - for (const instance of instances) { + for (const { + initialInstance, + behavior, + } of instancesAndBehaviors) { if ( - instance.hasBehaviorOverridingNamed( + initialInstance.hasBehaviorOverridingNamed( behaviorName ) && - !instance.hasAnyOverriddenPropertyForBehavior( + !initialInstance.hasAnyOverriddenPropertyForBehavior( behavior ) ) { - instance.removeBehaviorOverriding( + initialInstance.removeBehaviorOverriding( behaviorName ); // Update the view to stop using @@ -477,9 +497,9 @@ export const CompactInstancePropertiesEditor = ({ /> ) } - isInitiallyFolded={instances.every( - instance => - !instance.hasAnyOverriddenPropertyForBehavior( + isInitiallyFolded={instancesAndBehaviors.every( + ({ initialInstance, behavior }) => + !initialInstance.hasAnyOverriddenPropertyForBehavior( behavior ) )} @@ -492,7 +512,7 @@ export const CompactInstancePropertiesEditor = ({ /> ) : null } - title={behavior.getName()} + title={behaviorName} /> ); })} diff --git a/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactAnchorInstanceBehaviorEditor.js b/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactAnchorInstanceBehaviorEditor.js index 2ef3ccfc4609..8a129bbfb2b8 100644 --- a/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactAnchorInstanceBehaviorEditor.js +++ b/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactAnchorInstanceBehaviorEditor.js @@ -17,19 +17,17 @@ import { const CompactInstanceAnchorBehaviorEditor = ({ project, - behavior, object, layersContainer, behaviorMetadata, - initialInstances, - onOpenFullEditor, + instancesAndBehaviors, onBehaviorUpdated, resourceManagementProps, }: CompactInstanceBehaviorPropertiesEditorProps): React.Node => { const forceUpdate = useForceUpdate(); const _getPropertyValue = (propertyName: string) => { let commonValue = null; - for (const initialInstance of initialInstances) { + for (const { initialInstance, behavior } of instancesAndBehaviors) { const value = getPropertyValue(behavior, propertyName, initialInstance); if (commonValue === null) { commonValue = value; @@ -41,7 +39,7 @@ const CompactInstanceAnchorBehaviorEditor = ({ return commonValue; }; const _updateProperty = (propertyName: string, value: string) => { - for (const initialInstance of initialInstances) { + for (const { initialInstance, behavior } of instancesAndBehaviors) { updateProperty(project, behavior, propertyName, value, initialInstance); } forceUpdate(); @@ -74,10 +72,8 @@ const CompactInstanceAnchorBehaviorEditor = ({ project={project} object={object} layersContainer={layersContainer} - behavior={behavior} behaviorMetadata={behaviorMetadata} - initialInstances={initialInstances} - onOpenFullEditor={onOpenFullEditor} + instancesAndBehaviors={instancesAndBehaviors} onBehaviorUpdated={_onBehaviorUpdated} resourceManagementProps={resourceManagementProps} isAdvancedSectionInitiallyUncollapsed={ diff --git a/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactInstanceBehaviorPropertiesEditor.js b/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactInstanceBehaviorPropertiesEditor.js index 639c00448f62..faf0dfa0bc85 100644 --- a/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactInstanceBehaviorPropertiesEditor.js +++ b/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactInstanceBehaviorPropertiesEditor.js @@ -111,27 +111,23 @@ export const updateProperty = ( export const CompactInstanceBehaviorPropertiesEditor = ({ project, behaviorMetadata, - behavior, object, layersContainer, - initialInstances, - onOpenFullEditor, + instancesAndBehaviors, onBehaviorUpdated, resourceManagementProps, }: CompactInstanceBehaviorPropertiesEditorProps): React.Node => { const [schemaRecomputeTrigger, forceRecomputeSchema] = useForceRecompute(); - const instancesAndBehaviors = initialInstances.map(initialInstance => ({ - initialInstance, - behavior, - })); - - const propertiesSchema = React.useMemo( + const propertiesSchema: Schema = React.useMemo( () => { if (schemaRecomputeTrigger) { // schemaRecomputeTrigger allows to invalidate the schema when required. } - const behaviorProperties = behavior.getProperties(); + if (instancesAndBehaviors.length === 0) { + return []; + } + const behaviorProperties = instancesAndBehaviors[0].behavior.getProperties(); return propertiesMapToSchema({ properties: behaviorProperties, defaultValueProperties: behaviorProperties, @@ -165,7 +161,13 @@ export const CompactInstanceBehaviorPropertiesEditor = ({ shouldDisabledFieldsWithMixedValues: false, }); }, - [schemaRecomputeTrigger, object, layersContainer, behavior, project] + [ + schemaRecomputeTrigger, + instancesAndBehaviors, + object, + layersContainer, + project, + ] ); return ( @@ -178,17 +180,7 @@ export const CompactInstanceBehaviorPropertiesEditor = ({ onInstancesModified={onBehaviorUpdated} resourceManagementProps={resourceManagementProps} placeholder={Nothing to configure for this behavior.} - customizeBasicSchema={ - onOpenFullEditor - ? schema => - getSchemaWithOpenFullEditorButton({ - schema, - fullEditorLabel: behaviorMetadata.getOpenFullEditorLabel(), - behavior: behavior, - onOpenFullEditor, - }) - : null - } + customizeBasicSchema={null} onRefreshAllFields={forceRecomputeSchema} /> diff --git a/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactInstanceBehaviorPropertiesEditorProps.flow.js b/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactInstanceBehaviorPropertiesEditorProps.flow.js index 4185383124d8..556a62de0434 100644 --- a/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactInstanceBehaviorPropertiesEditorProps.flow.js +++ b/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactInstanceBehaviorPropertiesEditorProps.flow.js @@ -7,11 +7,12 @@ import { type ResourceManagementProps } from '../../ResourcesList/ResourceSource export type CompactInstanceBehaviorPropertiesEditorProps = {| project: gdProject, behaviorMetadata: gdBehaviorMetadata, - behavior: gdBehavior, object: gdObject | null, layersContainer: gdLayersContainer, - initialInstances: Array, - onOpenFullEditor?: () => void, + instancesAndBehaviors: Array<{ + initialInstance: gdInitialInstance, + behavior: gdBehavior, + }>, onBehaviorUpdated: () => void, resourceManagementProps: ResourceManagementProps, isAdvancedSectionInitiallyUncollapsed?: boolean, From af01ef0ee987642ef75d2c344f66cf0d35edf5fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davy=20H=C3=A9lard?= Date: Fri, 26 Jun 2026 14:56:24 +0200 Subject: [PATCH 5/5] Move source code files --- .../CompactAnchorInstanceBehaviorEditor.js | 0 .../CompactInstanceBehaviorPropertiesEditor.js | 0 .../CompactInstanceBehaviorPropertiesEditorProps.flow.js | 0 .../CompactInstanceBehaviorsEditorService.js | 0 .../InstancesEditor/CompactInstancePropertiesEditor/index.js | 2 +- 5 files changed, 1 insertion(+), 1 deletion(-) rename newIDE/app/src/{ObjectEditor/CompactObjectPropertiesEditor => InstancesEditor/CompactInstancePropertiesEditor}/CompactAnchorInstanceBehaviorEditor.js (100%) rename newIDE/app/src/{ObjectEditor/CompactObjectPropertiesEditor => InstancesEditor/CompactInstancePropertiesEditor}/CompactInstanceBehaviorPropertiesEditor.js (100%) rename newIDE/app/src/{ObjectEditor/CompactObjectPropertiesEditor => InstancesEditor/CompactInstancePropertiesEditor}/CompactInstanceBehaviorPropertiesEditorProps.flow.js (100%) rename newIDE/app/src/{ObjectEditor/CompactObjectPropertiesEditor => InstancesEditor/CompactInstancePropertiesEditor}/CompactInstanceBehaviorsEditorService.js (100%) diff --git a/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactAnchorInstanceBehaviorEditor.js b/newIDE/app/src/InstancesEditor/CompactInstancePropertiesEditor/CompactAnchorInstanceBehaviorEditor.js similarity index 100% rename from newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactAnchorInstanceBehaviorEditor.js rename to newIDE/app/src/InstancesEditor/CompactInstancePropertiesEditor/CompactAnchorInstanceBehaviorEditor.js diff --git a/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactInstanceBehaviorPropertiesEditor.js b/newIDE/app/src/InstancesEditor/CompactInstancePropertiesEditor/CompactInstanceBehaviorPropertiesEditor.js similarity index 100% rename from newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactInstanceBehaviorPropertiesEditor.js rename to newIDE/app/src/InstancesEditor/CompactInstancePropertiesEditor/CompactInstanceBehaviorPropertiesEditor.js diff --git a/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactInstanceBehaviorPropertiesEditorProps.flow.js b/newIDE/app/src/InstancesEditor/CompactInstancePropertiesEditor/CompactInstanceBehaviorPropertiesEditorProps.flow.js similarity index 100% rename from newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactInstanceBehaviorPropertiesEditorProps.flow.js rename to newIDE/app/src/InstancesEditor/CompactInstancePropertiesEditor/CompactInstanceBehaviorPropertiesEditorProps.flow.js diff --git a/newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactInstanceBehaviorsEditorService.js b/newIDE/app/src/InstancesEditor/CompactInstancePropertiesEditor/CompactInstanceBehaviorsEditorService.js similarity index 100% rename from newIDE/app/src/ObjectEditor/CompactObjectPropertiesEditor/CompactInstanceBehaviorsEditorService.js rename to newIDE/app/src/InstancesEditor/CompactInstancePropertiesEditor/CompactInstanceBehaviorsEditorService.js diff --git a/newIDE/app/src/InstancesEditor/CompactInstancePropertiesEditor/index.js b/newIDE/app/src/InstancesEditor/CompactInstancePropertiesEditor/index.js index e5830a937ae1..c30d8139fbd8 100644 --- a/newIDE/app/src/InstancesEditor/CompactInstancePropertiesEditor/index.js +++ b/newIDE/app/src/InstancesEditor/CompactInstancePropertiesEditor/index.js @@ -42,7 +42,7 @@ import Window from '../../Utils/Window'; import { type ResourceManagementProps } from '../../ResourcesList/ResourceSource'; import { usePersistedScrollPosition } from '../../Utils/UsePersistedScrollPosition'; import EmptyMessage from '../../UI/EmptyMessage'; -import CompactInstanceBehaviorsEditorService from '../../ObjectEditor/CompactObjectPropertiesEditor/CompactInstanceBehaviorsEditorService'; +import CompactInstanceBehaviorsEditorService from './CompactInstanceBehaviorsEditorService'; import { exceptionallyGuardAgainstDeadObject } from '../../Utils/IsNullPtr'; import { getAllVisibleBehaviorNames } from '../../Utils/Behavior';