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