mirror of
https://github.com/4ian/GDevelop.git
synced 2025-10-15 10:19:04 +00:00
Update instance properties panel after a layer was created or renamed (#4420)
This commit is contained in:
@@ -19,6 +19,7 @@ import { FullSizeMeasurer } from '../UI/FullSizeMeasurer';
|
|||||||
import Background from '../UI/Background';
|
import Background from '../UI/Background';
|
||||||
import { type HotReloadPreviewButtonProps } from '../HotReload/HotReloadPreviewButton';
|
import { type HotReloadPreviewButtonProps } from '../HotReload/HotReloadPreviewButton';
|
||||||
import RaisedButtonWithSplitMenu from '../UI/RaisedButtonWithSplitMenu';
|
import RaisedButtonWithSplitMenu from '../UI/RaisedButtonWithSplitMenu';
|
||||||
|
import useForceUpdate from '../Utils/UseForceUpdate';
|
||||||
|
|
||||||
const SortableLayerRow = SortableElement(LayerRow);
|
const SortableLayerRow = SortableElement(LayerRow);
|
||||||
|
|
||||||
@@ -124,15 +125,16 @@ type Props = {|
|
|||||||
newName: string,
|
newName: string,
|
||||||
cb: (done: boolean) => void
|
cb: (done: boolean) => void
|
||||||
) => void,
|
) => void,
|
||||||
|
onCreateLayer: () => void,
|
||||||
unsavedChanges?: ?UnsavedChanges,
|
unsavedChanges?: ?UnsavedChanges,
|
||||||
|
|
||||||
// Preview:
|
// Preview:
|
||||||
hotReloadPreviewButtonProps: HotReloadPreviewButtonProps,
|
hotReloadPreviewButtonProps: HotReloadPreviewButtonProps,
|
||||||
|};
|
|};
|
||||||
|
|
||||||
type State = {|
|
export type LayersListInterface = {
|
||||||
effectsEditedLayer: ?gdLayer,
|
forceUpdate: () => void,
|
||||||
|};
|
};
|
||||||
|
|
||||||
const hasLightingLayer = (layout: gdLayout) => {
|
const hasLightingLayer = (layout: gdLayout) => {
|
||||||
const layersCount = layout.getLayersCount();
|
const layersCount = layout.getLayersCount();
|
||||||
@@ -143,41 +145,48 @@ const hasLightingLayer = (layout: gdLayout) => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export default class LayersList extends Component<Props, State> {
|
const LayersList = React.forwardRef<Props, LayersListInterface>(
|
||||||
_addLayer = () => {
|
(props, ref) => {
|
||||||
const { layersContainer } = this.props;
|
const forceUpdate = useForceUpdate();
|
||||||
const name = newNameGenerator('Layer', name =>
|
|
||||||
layersContainer.hasLayerNamed(name)
|
|
||||||
);
|
|
||||||
layersContainer.insertNewLayer(name, layersContainer.getLayersCount());
|
|
||||||
this._onLayerModified();
|
|
||||||
};
|
|
||||||
|
|
||||||
_addLightingLayer = () => {
|
React.useImperativeHandle(ref, () => ({
|
||||||
const { layersContainer } = this.props;
|
forceUpdate,
|
||||||
const name = newNameGenerator('Lighting', name =>
|
}));
|
||||||
layersContainer.hasLayerNamed(name)
|
|
||||||
);
|
|
||||||
layersContainer.insertNewLayer(name, layersContainer.getLayersCount());
|
|
||||||
const layer = layersContainer.getLayer(name);
|
|
||||||
layer.setLightingLayer(true);
|
|
||||||
layer.setFollowBaseLayerCamera(true);
|
|
||||||
layer.setAmbientLightColor(200, 200, 200);
|
|
||||||
this._onLayerModified();
|
|
||||||
};
|
|
||||||
|
|
||||||
_onLayerModified = () => {
|
const addLayer = () => {
|
||||||
if (this.props.unsavedChanges)
|
const { layersContainer } = props;
|
||||||
this.props.unsavedChanges.triggerUnsavedChanges();
|
const name = newNameGenerator('Layer', name =>
|
||||||
this.forceUpdate();
|
layersContainer.hasLayerNamed(name)
|
||||||
};
|
);
|
||||||
|
layersContainer.insertNewLayer(name, layersContainer.getLayersCount());
|
||||||
|
onLayerModified();
|
||||||
|
props.onCreateLayer();
|
||||||
|
};
|
||||||
|
|
||||||
|
const addLightingLayer = () => {
|
||||||
|
const { layersContainer } = props;
|
||||||
|
const name = newNameGenerator('Lighting', name =>
|
||||||
|
layersContainer.hasLayerNamed(name)
|
||||||
|
);
|
||||||
|
layersContainer.insertNewLayer(name, layersContainer.getLayersCount());
|
||||||
|
const layer = layersContainer.getLayer(name);
|
||||||
|
layer.setLightingLayer(true);
|
||||||
|
layer.setFollowBaseLayerCamera(true);
|
||||||
|
layer.setAmbientLightColor(200, 200, 200);
|
||||||
|
onLayerModified();
|
||||||
|
props.onCreateLayer();
|
||||||
|
};
|
||||||
|
|
||||||
|
const onLayerModified = () => {
|
||||||
|
if (props.unsavedChanges) props.unsavedChanges.triggerUnsavedChanges();
|
||||||
|
forceUpdate();
|
||||||
|
};
|
||||||
|
|
||||||
render() {
|
|
||||||
// Force the list to be mounted again if layersContainer
|
// Force the list to be mounted again if layersContainer
|
||||||
// has been changed. Avoid accessing to invalid objects that could
|
// has been changed. Avoid accessing to invalid objects that could
|
||||||
// crash the app.
|
// crash the app.
|
||||||
const listKey = this.props.layersContainer.ptr;
|
const listKey = props.layersContainer.ptr;
|
||||||
const isLightingLayerPresent = hasLightingLayer(this.props.layersContainer);
|
const isLightingLayerPresent = hasLightingLayer(props.layersContainer);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Background>
|
<Background>
|
||||||
@@ -188,22 +197,22 @@ export default class LayersList extends Component<Props, State> {
|
|||||||
// using SortableVirtualizedItemList.
|
// using SortableVirtualizedItemList.
|
||||||
<SortableLayersListBody
|
<SortableLayersListBody
|
||||||
key={listKey}
|
key={listKey}
|
||||||
layersContainer={this.props.layersContainer}
|
layersContainer={props.layersContainer}
|
||||||
onEditEffects={this.props.onEditLayerEffects}
|
onEditEffects={props.onEditLayerEffects}
|
||||||
onEdit={this.props.onEditLayer}
|
onEdit={props.onEditLayer}
|
||||||
onRemoveLayer={this.props.onRemoveLayer}
|
onRemoveLayer={props.onRemoveLayer}
|
||||||
onRenameLayer={this.props.onRenameLayer}
|
onRenameLayer={props.onRenameLayer}
|
||||||
onSortEnd={({ oldIndex, newIndex }) => {
|
onSortEnd={({ oldIndex, newIndex }) => {
|
||||||
const layersCount = this.props.layersContainer.getLayersCount();
|
const layersCount = props.layersContainer.getLayersCount();
|
||||||
this.props.layersContainer.moveLayer(
|
props.layersContainer.moveLayer(
|
||||||
layersCount - 1 - oldIndex,
|
layersCount - 1 - oldIndex,
|
||||||
layersCount - 1 - newIndex
|
layersCount - 1 - newIndex
|
||||||
);
|
);
|
||||||
this._onLayerModified();
|
onLayerModified();
|
||||||
}}
|
}}
|
||||||
helperClass="sortable-helper"
|
helperClass="sortable-helper"
|
||||||
useDragHandle
|
useDragHandle
|
||||||
unsavedChanges={this.props.unsavedChanges}
|
unsavedChanges={props.unsavedChanges}
|
||||||
width={width}
|
width={width}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
@@ -213,13 +222,13 @@ export default class LayersList extends Component<Props, State> {
|
|||||||
<RaisedButtonWithSplitMenu
|
<RaisedButtonWithSplitMenu
|
||||||
label={<Trans>Add a layer</Trans>}
|
label={<Trans>Add a layer</Trans>}
|
||||||
primary
|
primary
|
||||||
onClick={this._addLayer}
|
onClick={addLayer}
|
||||||
icon={<Add />}
|
icon={<Add />}
|
||||||
buildMenuTemplate={i18n => [
|
buildMenuTemplate={i18n => [
|
||||||
{
|
{
|
||||||
label: i18n._(t`Add lighting layer`),
|
label: i18n._(t`Add lighting layer`),
|
||||||
enabled: !isLightingLayerPresent,
|
enabled: !isLightingLayerPresent,
|
||||||
click: this._addLightingLayer,
|
click: addLightingLayer,
|
||||||
},
|
},
|
||||||
]}
|
]}
|
||||||
/>
|
/>
|
||||||
@@ -229,4 +238,6 @@ export default class LayersList extends Component<Props, State> {
|
|||||||
</Background>
|
</Background>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
|
|
||||||
|
export default LayersList;
|
||||||
|
@@ -12,7 +12,7 @@ import ObjectsRenderingService from '../ObjectsRendering/ObjectsRenderingService
|
|||||||
import InstancesEditor from '../InstancesEditor';
|
import InstancesEditor from '../InstancesEditor';
|
||||||
import InstancePropertiesEditor from '../InstancesEditor/InstancePropertiesEditor';
|
import InstancePropertiesEditor from '../InstancesEditor/InstancePropertiesEditor';
|
||||||
import InstancesList from '../InstancesEditor/InstancesList';
|
import InstancesList from '../InstancesEditor/InstancesList';
|
||||||
import LayersList from '../LayersList';
|
import LayersList, { type LayersListInterface } from '../LayersList';
|
||||||
import LayerRemoveDialog from '../LayersList/LayerRemoveDialog';
|
import LayerRemoveDialog from '../LayersList/LayerRemoveDialog';
|
||||||
import LayerEditorDialog from '../LayersList/LayerEditorDialog';
|
import LayerEditorDialog from '../LayersList/LayerEditorDialog';
|
||||||
import VariablesEditorDialog from '../VariablesList/VariablesEditorDialog';
|
import VariablesEditorDialog from '../VariablesList/VariablesEditorDialog';
|
||||||
@@ -177,7 +177,7 @@ export default class SceneEditor extends React.Component<Props, State> {
|
|||||||
contextMenu: ?ContextMenuInterface;
|
contextMenu: ?ContextMenuInterface;
|
||||||
editorMosaic: ?EditorMosaic;
|
editorMosaic: ?EditorMosaic;
|
||||||
_objectsList: ?ObjectsListInterface;
|
_objectsList: ?ObjectsListInterface;
|
||||||
_layersList: ?LayersList;
|
_layersList: ?LayersListInterface;
|
||||||
_propertiesEditor: ?InstancePropertiesEditor;
|
_propertiesEditor: ?InstancePropertiesEditor;
|
||||||
_instancesList: ?InstancesList;
|
_instancesList: ?InstancesList;
|
||||||
|
|
||||||
@@ -688,6 +688,11 @@ export default class SceneEditor extends React.Component<Props, State> {
|
|||||||
) => {
|
) => {
|
||||||
this.props.initialInstances.moveInstancesToLayer(oldName, newName);
|
this.props.initialInstances.moveInstancesToLayer(oldName, newName);
|
||||||
done(true);
|
done(true);
|
||||||
|
this.forceUpdatePropertiesEditor();
|
||||||
|
};
|
||||||
|
|
||||||
|
_onCreateLayer = () => {
|
||||||
|
this.forceUpdatePropertiesEditor();
|
||||||
};
|
};
|
||||||
|
|
||||||
_onDeleteObject = (i18n: I18nType) => (
|
_onDeleteObject = (i18n: I18nType) => (
|
||||||
@@ -1309,6 +1314,7 @@ export default class SceneEditor extends React.Component<Props, State> {
|
|||||||
onEditLayer={this.editLayer}
|
onEditLayer={this.editLayer}
|
||||||
onRemoveLayer={this._onRemoveLayer}
|
onRemoveLayer={this._onRemoveLayer}
|
||||||
onRenameLayer={this._onRenameLayer}
|
onRenameLayer={this._onRenameLayer}
|
||||||
|
onCreateLayer={this._onCreateLayer}
|
||||||
layersContainer={layout}
|
layersContainer={layout}
|
||||||
unsavedChanges={this.props.unsavedChanges}
|
unsavedChanges={this.props.unsavedChanges}
|
||||||
ref={layersList => (this._layersList = layersList)}
|
ref={layersList => (this._layersList = layersList)}
|
||||||
|
@@ -35,6 +35,7 @@ export const Default = () => (
|
|||||||
onRenameLayer={(oldName, newName, cb) => {
|
onRenameLayer={(oldName, newName, cb) => {
|
||||||
cb(true);
|
cb(true);
|
||||||
}}
|
}}
|
||||||
|
onCreateLayer={action('onCreateLayer')}
|
||||||
layersContainer={testProject.testLayout}
|
layersContainer={testProject.testLayout}
|
||||||
hotReloadPreviewButtonProps={fakeHotReloadPreviewButtonProps}
|
hotReloadPreviewButtonProps={fakeHotReloadPreviewButtonProps}
|
||||||
/>
|
/>
|
||||||
@@ -58,6 +59,7 @@ export const SmallWidthAndHeight = () => (
|
|||||||
onRenameLayer={(oldName, newName, cb) => {
|
onRenameLayer={(oldName, newName, cb) => {
|
||||||
cb(true);
|
cb(true);
|
||||||
}}
|
}}
|
||||||
|
onCreateLayer={action('onCreateLayer')}
|
||||||
layersContainer={testProject.testLayout}
|
layersContainer={testProject.testLayout}
|
||||||
hotReloadPreviewButtonProps={fakeHotReloadPreviewButtonProps}
|
hotReloadPreviewButtonProps={fakeHotReloadPreviewButtonProps}
|
||||||
/>
|
/>
|
||||||
|
Reference in New Issue
Block a user