-
Notifications
You must be signed in to change notification settings - Fork 938
/
Copy pathindex.js
145 lines (135 loc) · 4.23 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
// @flow
import * as React from 'react';
import { t, Trans } from '@lingui/macro';
import { List, ListItem } from '../UI/List';
import ObjectSelector from '../ObjectsList/ObjectSelector';
import { Column } from '../UI/Grid';
import ListIcon from '../UI/ListIcon';
import ObjectsRenderingService from '../ObjectsRendering/ObjectsRenderingService';
import getObjectByName from '../Utils/GetObjectByName';
import Paper from '../UI/Paper';
import { ColumnStackLayout } from '../UI/Layout';
import AlertMessage from '../UI/AlertMessage';
import { ProjectScopedContainersAccessor } from '../InstructionOrExpression/EventsScope';
const styles = {
objectSelector: { position: 'sticky', bottom: 0 },
};
type Props = {|
project: ?gdProject,
projectScopedContainersAccessor: ProjectScopedContainersAccessor,
globalObjectsContainer: gdObjectsContainer | null,
objectsContainer: gdObjectsContainer,
groupObjectNames: Array<string>,
onSizeUpdated?: () => void,
onObjectGroupUpdated?: () => void,
onObjectAdded: (objectName: string) => void,
onObjectRemoved: (objectName: string) => void,
|};
const ObjectGroupEditor = ({
project,
projectScopedContainersAccessor,
globalObjectsContainer,
objectsContainer,
groupObjectNames,
onObjectAdded,
onObjectRemoved,
}: Props) => {
const [objectName, setObjectName] = React.useState<string>('');
const addObject = React.useCallback(
(objectName: string) => {
onObjectAdded(objectName);
setObjectName('');
},
[onObjectAdded]
);
const renderExplanation = () => {
let type = undefined;
if (groupObjectNames.length === 0) {
return null;
}
groupObjectNames.forEach(objectName => {
const objectType = projectScopedContainersAccessor
.get()
.getObjectsContainersList()
.getTypeOfObject(objectName);
if (type === undefined || objectType === type) type = objectType;
else type = '';
});
const message =
type === '' ? (
<>
<Trans>
This group contains objects of different kinds. You'll only be able
to use actions and conditions common to all objects with this group.
</Trans>{' '}
<Trans>
Variables declared in all objects of the group will be visible in
event expressions.
</Trans>
</>
) : (
<>
<Trans>
This group contains objects of the same kind ({type}). You can use
actions and conditions related to this kind of objects in events
with this group.
</Trans>{' '}
<Trans>
Variables declared in all objects of the group will be visible in
event expressions.
</Trans>
</>
);
return <AlertMessage kind="info">{message}</AlertMessage>;
};
return (
<ColumnStackLayout noMargin>
{renderExplanation()}
<List>
{groupObjectNames.map(objectName => {
let object = getObjectByName(
globalObjectsContainer,
objectsContainer,
objectName
);
const icon =
project && object ? (
<ListIcon
iconSize={24}
src={ObjectsRenderingService.getThumbnail(
project,
object.getConfiguration()
)}
/>
) : null;
return (
<ListItem
key={objectName}
primaryText={objectName}
displayRemoveButton
onRemove={() => onObjectRemoved(objectName)}
leftIcon={icon}
/>
);
})}
</List>
<Paper style={styles.objectSelector} background="medium">
<Column noMargin>
<ObjectSelector
project={project}
projectScopedContainersAccessor={projectScopedContainersAccessor}
value={objectName}
excludedObjectOrGroupNames={groupObjectNames}
onChange={setObjectName}
onChoose={addObject}
openOnFocus
noGroups
hintText={t`Choose an object to add to the group`}
fullWidth
/>
</Column>
</Paper>
</ColumnStackLayout>
);
};
export default ObjectGroupEditor;