Skip to content

Commit eccdb98

Browse files
committed
Close deleted variant tab.
1 parent 4695b9d commit eccdb98

File tree

11 files changed

+109
-4
lines changed

11 files changed

+109
-4
lines changed

newIDE/app/src/MainFrame/EditorContainers/BaseEditor.js

+5
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,11 @@ export type RenderEditorContainerProps = {|
153153
eventsBasedObjectName: string,
154154
variantName: string
155155
) => void,
156+
onDeleteEventsBasedObjectVariant: (
157+
eventsFunctionsExtension: gdEventsFunctionsExtension,
158+
eventBasedObject: gdEventsBasedObject,
159+
variant: gdEventsBasedObjectVariant
160+
) => void,
156161
|};
157162

158163
export type RenderEditorContainerPropsWithRef = {|

newIDE/app/src/MainFrame/EditorContainers/CustomObjectEditorContainer.js

+3
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,9 @@ export class CustomObjectEditorContainer extends React.Component<RenderEditorCon
240240
}
241241
onExtractAsEventBasedObject={this.props.onExtractAsEventBasedObject}
242242
onOpenEventBasedObjectEditor={this.props.onOpenEventBasedObjectEditor}
243+
onDeleteEventsBasedObjectVariant={
244+
this.props.onDeleteEventsBasedObjectVariant
245+
}
243246
/>
244247
</div>
245248
);

newIDE/app/src/MainFrame/EditorContainers/ExternalLayoutEditorContainer.js

+1
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,7 @@ export class ExternalLayoutEditorContainer extends React.Component<
265265
}
266266
// Nothing to do as events-based objects can't have external layout.
267267
onEventsBasedObjectChildrenEdited={() => {}}
268+
onDeleteEventsBasedObjectVariant={() => {}}
268269
/>
269270
)}
270271
{!layout && (

newIDE/app/src/MainFrame/EditorContainers/SceneEditorContainer.js

+3
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,9 @@ export class SceneEditorContainer extends React.Component<RenderEditorContainerP
150150
onExtractAsExternalLayout={this.props.onExtractAsExternalLayout}
151151
onExtractAsEventBasedObject={this.props.onExtractAsEventBasedObject}
152152
onOpenEventBasedObjectEditor={this.props.onOpenEventBasedObjectEditor}
153+
onDeleteEventsBasedObjectVariant={
154+
this.props.onDeleteEventsBasedObjectVariant
155+
}
153156
onObjectEdited={objectWithContext =>
154157
this.props.onSceneObjectEdited(layout, objectWithContext)
155158
}

newIDE/app/src/MainFrame/EditorTabs/EditorTabsHandler.js

+23
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,29 @@ export const closeCustomObjectTab = (
374374
});
375375
};
376376

377+
export const closeEventsBasedObjectVariantTab = (
378+
state: EditorTabsState,
379+
eventsFunctionsExtensionName: string,
380+
eventsBasedObjectName: string,
381+
eventsBasedObjectVariantName: string
382+
) => {
383+
return closeTabsExceptIf(state, editorTab => {
384+
const editor = editorTab.editorRef;
385+
if (editor instanceof CustomObjectEditorContainer) {
386+
return (
387+
(!editor.getEventsFunctionsExtensionName() ||
388+
editor.getEventsFunctionsExtensionName() !==
389+
eventsFunctionsExtensionName) &&
390+
(!editor.getEventsBasedObjectName() ||
391+
editor.getEventsBasedObjectName() !== eventsBasedObjectName) &&
392+
(!editor.getVariantName() ||
393+
editor.getVariantName() !== eventsBasedObjectVariantName)
394+
);
395+
}
396+
return true;
397+
});
398+
};
399+
377400
export const getEventsFunctionsExtensionEditor = (
378401
state: EditorTabsState,
379402
eventsFunctionsExtension: gdEventsFunctionsExtension

newIDE/app/src/MainFrame/index.js

+25
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import {
3838
closeExternalEventsTabs,
3939
closeEventsFunctionsExtensionTabs,
4040
closeCustomObjectTab,
41+
closeEventsBasedObjectVariantTab,
4142
saveUiSettings,
4243
type EditorTabsState,
4344
type EditorTab,
@@ -1548,6 +1549,29 @@ const MainFrame = (props: Props) => {
15481549
}));
15491550
};
15501551

1552+
const deleteEventsBasedObjectVariant = (
1553+
eventsFunctionsExtension: gdEventsFunctionsExtension,
1554+
eventBasedObject: gdEventsBasedObject,
1555+
variant: gdEventsBasedObjectVariant
1556+
): void => {
1557+
const variants = eventBasedObject.getVariants();
1558+
const variantName = variant.getName();
1559+
if (!variants.hasVariantNamed(variantName)) {
1560+
return;
1561+
}
1562+
variants.removeVariant(variantName);
1563+
1564+
setState(state => ({
1565+
...state,
1566+
editorTabs: closeEventsBasedObjectVariantTab(
1567+
state.editorTabs,
1568+
eventsFunctionsExtension.getName(),
1569+
eventBasedObject.getName(),
1570+
variantName
1571+
),
1572+
}));
1573+
};
1574+
15511575
const setPreviewedLayout = (
15521576
previewLayoutName: ?string,
15531577
previewExternalLayoutName?: ?string
@@ -3886,6 +3910,7 @@ const MainFrame = (props: Props) => {
38863910
''
38873911
),
38883912
onOpenEventBasedObjectEditor: onOpenEventBasedObjectEditor,
3913+
onDeleteEventsBasedObjectVariant: deleteEventsBasedObjectVariant,
38893914
onEventsBasedObjectChildrenEdited: onEventsBasedObjectChildrenEdited,
38903915
onSceneObjectEdited: onSceneObjectEdited,
38913916
gamesList,

newIDE/app/src/ObjectEditor/Editors/CustomObjectPropertiesEditor/index.js

+23-4
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ const CustomObjectPropertiesEditor = (props: Props) => {
108108
renderObjectNameField,
109109
isChildObject,
110110
onOpenEventBasedObjectEditor,
111+
onDeleteEventsBasedObjectVariant,
111112
} = props;
112113

113114
const { isMobile } = useResponsiveWindowSize();
@@ -254,19 +255,37 @@ const CustomObjectPropertiesEditor = (props: Props) => {
254255

255256
const deleteVariant = React.useCallback(
256257
() => {
257-
if (!eventBasedObject) {
258+
if (!eventBasedObject || !onDeleteEventsBasedObjectVariant) {
258259
return;
259260
}
260261
const variants = eventBasedObject.getVariants();
261262
const selectedVariantName = customObjectConfiguration.getVariantName();
262263
if (variants.hasVariantNamed(selectedVariantName)) {
263-
// TODO Close the variant tabs before deleting it.
264264
customObjectConfiguration.setVariantName('');
265-
variants.removeVariant(selectedVariantName);
265+
const extensionName = gd.PlatformExtension.getExtensionFromFullObjectType(
266+
customObjectConfiguration.getType()
267+
);
268+
if (!project.hasEventsFunctionsExtensionNamed(extensionName)) {
269+
return;
270+
}
271+
const eventBasedExtension = project.getEventsFunctionsExtension(
272+
extensionName
273+
);
274+
onDeleteEventsBasedObjectVariant(
275+
eventBasedExtension,
276+
eventBasedObject,
277+
variants.getVariant(selectedVariantName)
278+
);
266279
forceUpdate();
267280
}
268281
},
269-
[customObjectConfiguration, eventBasedObject, forceUpdate]
282+
[
283+
customObjectConfiguration,
284+
eventBasedObject,
285+
forceUpdate,
286+
onDeleteEventsBasedObjectVariant,
287+
project,
288+
]
270289
);
271290

272291
return (

newIDE/app/src/ObjectEditor/Editors/EditorProps.flow.js

+5
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,9 @@ export type EditorProps = {|
4242
eventsBasedObjectName: string,
4343
variantName: string
4444
) => void,
45+
onDeleteEventsBasedObjectVariant?: (
46+
eventsFunctionsExtension: gdEventsFunctionsExtension,
47+
eventBasedObject: gdEventsBasedObject,
48+
variant: gdEventsBasedObjectVariant
49+
) => void,
4550
|};

newIDE/app/src/ObjectEditor/ObjectEditorDialog.js

+7
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,11 @@ type Props = {|
6565
eventsBasedObjectName: string,
6666
variantName: string
6767
) => void,
68+
onDeleteEventsBasedObjectVariant: (
69+
eventsFunctionsExtension: gdEventsFunctionsExtension,
70+
eventBasedObject: gdEventsBasedObject,
71+
variant: gdEventsBasedObjectVariant
72+
) => void,
6873
|};
6974

7075
type InnerDialogProps = {|
@@ -94,6 +99,7 @@ const InnerDialog = (props: InnerDialogProps) => {
9499
onUpdateBehaviorsSharedData,
95100
onComputeAllVariableNames,
96101
onOpenEventBasedObjectEditor,
102+
onDeleteEventsBasedObjectVariant,
97103
} = props;
98104
const [currentTab, setCurrentTab] = React.useState<ObjectEditorTab>(
99105
initialTab || 'properties'
@@ -289,6 +295,7 @@ const InnerDialog = (props: InnerDialogProps) => {
289295
/>
290296
)}
291297
onOpenEventBasedObjectEditor={onOpenEventBasedObjectEditor}
298+
onDeleteEventsBasedObjectVariant={onDeleteEventsBasedObjectVariant}
292299
/>
293300
</Column>
294301
) : null}

newIDE/app/src/SceneEditor/index.js

+8
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,11 @@ type Props = {|
137137
eventsBasedObjectName: string,
138138
variantName: string
139139
) => void,
140+
onDeleteEventsBasedObjectVariant: (
141+
eventsFunctionsExtension: gdEventsFunctionsExtension,
142+
eventBasedObject: gdEventsBasedObject,
143+
variant: gdEventsBasedObjectVariant
144+
) => void,
140145

141146
// Preview:
142147
hotReloadPreviewButtonProps: HotReloadPreviewButtonProps,
@@ -2129,6 +2134,9 @@ export default class SceneEditor extends React.Component<Props, State> {
21292134
onOpenEventBasedObjectEditor={
21302135
this.props.onOpenEventBasedObjectEditor
21312136
}
2137+
onDeleteEventsBasedObjectVariant={
2138+
this.props.onDeleteEventsBasedObjectVariant
2139+
}
21322140
/>
21332141
)}
21342142
</React.Fragment>

newIDE/app/src/stories/componentStories/ObjectEditor/ObjectEditorDialog.stories.js

+6
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@ export const CustomObject = () => (
4545
onOpenEventBasedObjectEditor={() =>
4646
action('Open event-based object editor')
4747
}
48+
onDeleteEventsBasedObjectVariant={() =>
49+
action('Delete event-based object variant')
50+
}
4851
/>
4952
</DragAndDropContextProvider>
5053
);
@@ -79,6 +82,9 @@ export const StandardObject = () => (
7982
onOpenEventBasedObjectEditor={() =>
8083
action('Open event-based object editor')
8184
}
85+
onDeleteEventsBasedObjectVariant={() =>
86+
action('Delete event-based object variant')
87+
}
8288
/>
8389
</DragAndDropContextProvider>
8490
);

0 commit comments

Comments
 (0)