wgge 1.0.2 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/game/resources/ResourcesModel.js +5 -8
- package/game/resources/assets/AssetCache.js +3 -25
- package/package.json +1 -1
- package/editor/EditorController.js +0 -134
- package/editor/EditorModel.js +0 -38
- package/editor/EditorRenderer.js +0 -116
- package/editor/form/NodeFormRenderer.js +0 -180
- package/editor/table/TableRenderer.js +0 -123
- package/editor/table/lookup/TableLookupRenderer.js +0 -120
- package/editor/table/row/TableRowRenderer.js +0 -98
|
@@ -1,25 +1,22 @@
|
|
|
1
|
-
import ModelNodeTable from "../../core/model/collection/table/ModelNodeTable";
|
|
2
|
-
import MaterialModel from "./material/MaterialModel";
|
|
3
1
|
import ObjectModel from "../../core/model/ObjectModel";
|
|
4
|
-
import Model3dModel from "./3d/3DModel";
|
|
5
2
|
|
|
6
3
|
export default class ResourcesModel extends ObjectModel {
|
|
7
4
|
|
|
8
5
|
/**
|
|
9
6
|
* @type ModelNodeTable
|
|
10
7
|
*/
|
|
11
|
-
|
|
8
|
+
images;
|
|
12
9
|
|
|
13
10
|
/**
|
|
14
|
-
* @type ModelNodeTable
|
|
11
|
+
* @type ModelNodeTable
|
|
15
12
|
*/
|
|
16
|
-
|
|
13
|
+
sounds;
|
|
17
14
|
|
|
18
15
|
constructor() {
|
|
19
16
|
super();
|
|
20
17
|
|
|
21
|
-
this.
|
|
22
|
-
this.
|
|
18
|
+
//this.images = this.addProperty('images', new ModelNodeTable((id) => new ImageModel(id)));
|
|
19
|
+
//this.sounds = this.addProperty('sounds', new ModelNodeTable((id) => new Model3dModel(id)));
|
|
23
20
|
|
|
24
21
|
}
|
|
25
22
|
|
|
@@ -1,23 +1,13 @@
|
|
|
1
1
|
import Dictionary from "../../../core/Dictionary";
|
|
2
2
|
import Collection from "../../../core/Collection";
|
|
3
3
|
import ImageLoader from "./loader/ImageLoader";
|
|
4
|
-
import GlbLoader from "./loader/GlbLoader";
|
|
5
4
|
import AudioLoader from "./loader/AudioLoader";
|
|
6
|
-
import MaterialLoader from "./loader/MaterialLoader";
|
|
7
|
-
import Model3dLoader from "./loader/Model3dLoader";
|
|
8
|
-
import SpriteLoader from "./loader/SpriteLoader";
|
|
9
5
|
import NodeWithEvents from "../../../core/model/event/NodeWithEvents";
|
|
10
6
|
import StringHelper from "../../../core/helper/StringHelper";
|
|
11
|
-
import Model3dAnimationLoader from "./loader/Model3dAnimationLoader";
|
|
12
7
|
|
|
13
8
|
const ASSET_TYPE_LOADERS = {
|
|
14
9
|
'aud': AudioLoader,
|
|
15
|
-
'img': ImageLoader
|
|
16
|
-
'glb': GlbLoader,
|
|
17
|
-
'mat': MaterialLoader,
|
|
18
|
-
'm3d': Model3dLoader,
|
|
19
|
-
'm3a': Model3dAnimationLoader,
|
|
20
|
-
'spr': SpriteLoader
|
|
10
|
+
'img': ImageLoader
|
|
21
11
|
}
|
|
22
12
|
|
|
23
13
|
/**
|
|
@@ -133,7 +123,7 @@ export default class AssetCache extends NodeWithEvents {
|
|
|
133
123
|
this.loaders.remove(loader);
|
|
134
124
|
}
|
|
135
125
|
|
|
136
|
-
|
|
126
|
+
loadAsset(uri, onLoaded = null, onError = null) {
|
|
137
127
|
if (typeof uri !== 'string') {
|
|
138
128
|
console.log('uri is not a string', uri);
|
|
139
129
|
return;
|
|
@@ -167,15 +157,11 @@ export default class AssetCache extends NodeWithEvents {
|
|
|
167
157
|
}
|
|
168
158
|
}
|
|
169
159
|
|
|
170
|
-
loadAsset(uri, onLoaded) {
|
|
171
|
-
this.getAsset(uri, onLoaded);
|
|
172
|
-
}
|
|
173
|
-
|
|
174
160
|
loadImage(url, onLoaded) {
|
|
175
161
|
this.getAsset(url, onLoaded);
|
|
176
162
|
}
|
|
177
163
|
|
|
178
|
-
|
|
164
|
+
loadAudio(materialId, onLoaded) {
|
|
179
165
|
this.getAsset(`mat/${materialId}`, onLoaded);
|
|
180
166
|
}
|
|
181
167
|
|
|
@@ -183,14 +169,6 @@ export default class AssetCache extends NodeWithEvents {
|
|
|
183
169
|
this.resetCache(`mat/${materialId}`);
|
|
184
170
|
}
|
|
185
171
|
|
|
186
|
-
loadModel3d(modelId, onLoaded) {
|
|
187
|
-
this.getAsset(`m3d/${modelId}`, onLoaded);
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
loadSprite(spriteId, onLoaded) {
|
|
191
|
-
this.getAsset(`spr/${spriteId}`, onLoaded);
|
|
192
|
-
}
|
|
193
|
-
|
|
194
172
|
preload(resources) {
|
|
195
173
|
console.log('Preloading:', resources);
|
|
196
174
|
resources.forEach((r) => this.getAsset(r));
|
package/package.json
CHANGED
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
import ControllerBase from "../core/controller/ControllerBase";
|
|
2
|
-
import HttpHelper from "../core/helper/HttpHelper";
|
|
3
|
-
|
|
4
|
-
export default class EditorController extends ControllerBase {
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* @type DemoEditorModel
|
|
8
|
-
*/
|
|
9
|
-
model;
|
|
10
|
-
|
|
11
|
-
constructor(game, model) {
|
|
12
|
-
super(game, model);
|
|
13
|
-
|
|
14
|
-
this.model = model;
|
|
15
|
-
|
|
16
|
-
this.addAutoEvent(
|
|
17
|
-
this.model,
|
|
18
|
-
'table-selected',
|
|
19
|
-
(table) => this.runOnUpdate(() => this.model.activeTable.set(table))
|
|
20
|
-
);
|
|
21
|
-
|
|
22
|
-
this.addAutoEvent(
|
|
23
|
-
this.model,
|
|
24
|
-
'table-closed',
|
|
25
|
-
() => this.runOnUpdate(() => this.model.activeTable.set(null))
|
|
26
|
-
);
|
|
27
|
-
|
|
28
|
-
this.addAutoEvent(
|
|
29
|
-
this.model,
|
|
30
|
-
'node-saved',
|
|
31
|
-
(param) => this.runOnUpdate(() => this.saveNode(param))
|
|
32
|
-
);
|
|
33
|
-
|
|
34
|
-
this.addAutoEvent(
|
|
35
|
-
this.model,
|
|
36
|
-
'form-closed',
|
|
37
|
-
() => this.runOnUpdate(() => this.model.activeForm.set(null))
|
|
38
|
-
);
|
|
39
|
-
|
|
40
|
-
this.addAutoEvent(
|
|
41
|
-
this.model,
|
|
42
|
-
'node-delete',
|
|
43
|
-
(param) => this.runOnUpdate(() => this.deleteNode(param))
|
|
44
|
-
);
|
|
45
|
-
|
|
46
|
-
this.addAutoEvent(
|
|
47
|
-
this.model,
|
|
48
|
-
'node-clone',
|
|
49
|
-
(param) => this.runOnUpdate(() => this.cloneNode(param))
|
|
50
|
-
);
|
|
51
|
-
|
|
52
|
-
this.addAutoEvent(
|
|
53
|
-
this.model,
|
|
54
|
-
'download-resources',
|
|
55
|
-
(param) => this.runOnUpdate(() => this.downloadResources(param))
|
|
56
|
-
);
|
|
57
|
-
|
|
58
|
-
this.addAutoEvent(
|
|
59
|
-
this.model,
|
|
60
|
-
'save-resources',
|
|
61
|
-
() => this.saveResources()
|
|
62
|
-
);
|
|
63
|
-
|
|
64
|
-
this.addAutoEvent(
|
|
65
|
-
this.model,
|
|
66
|
-
'switch-options',
|
|
67
|
-
() => this.runOnUpdate(() => this.model.isVisible.invert())
|
|
68
|
-
);
|
|
69
|
-
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
activateInternal() {
|
|
73
|
-
this.game.audio.paused.set(true);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
deactivateInternal() {
|
|
77
|
-
this.game.audio.paused.set(false);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
*
|
|
82
|
-
* * @param {Object} param
|
|
83
|
-
* * @param {ObjectModel} param.node
|
|
84
|
-
* * @param {FormData} param.data
|
|
85
|
-
*/
|
|
86
|
-
saveNode(param) {
|
|
87
|
-
const node = param.node;
|
|
88
|
-
const data = param.data;
|
|
89
|
-
|
|
90
|
-
node.properties.forEach((name, value) => {
|
|
91
|
-
if (data.has(name)) {
|
|
92
|
-
if (value && value.value !== undefined && typeof value.set === 'function') {
|
|
93
|
-
value.set(data.get(name));
|
|
94
|
-
} else {
|
|
95
|
-
console.log(data.get(name), name);
|
|
96
|
-
}
|
|
97
|
-
} else if (data.has(`${name}[]`)) {
|
|
98
|
-
if (typeof value === 'object' && typeof value.setFromArray === 'function') {
|
|
99
|
-
const arr = data.getAll(`${name}[]`);
|
|
100
|
-
value.setFromArray(arr);
|
|
101
|
-
}
|
|
102
|
-
} else if (value && typeof value.value === 'boolean' && typeof value.set === 'function') {
|
|
103
|
-
value.set(false);
|
|
104
|
-
}
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
deleteNode(param) {
|
|
109
|
-
const node = param.node;
|
|
110
|
-
const table = param.table;
|
|
111
|
-
const result = table.remove(node);
|
|
112
|
-
if (table.selectedNode.equalsTo(node)) {
|
|
113
|
-
table.selectedNode.set(null);
|
|
114
|
-
}
|
|
115
|
-
console.log('removed node', result);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
cloneNode(param) {
|
|
119
|
-
const node = param.node;
|
|
120
|
-
const table = param.table;
|
|
121
|
-
const result = table.addClone(node);
|
|
122
|
-
table.selectedNode.set(result);
|
|
123
|
-
console.log('cloned node', result);
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
downloadResources() {
|
|
127
|
-
const data = JSON.stringify(this.game.resources.getState());
|
|
128
|
-
HttpHelper.fakeDownload('resources.json', data);
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
async saveResources() {
|
|
132
|
-
await HttpHelper.post('http://localhost:88/save-resources', this.game.resources.getState());
|
|
133
|
-
}
|
|
134
|
-
}
|
package/editor/EditorModel.js
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import ObjectModel from "../core/model/ObjectModel";
|
|
2
|
-
import NullableNode from "../core/model/value/NullableNode";
|
|
3
|
-
import BoolValue from "../core/model/value/BoolValue";
|
|
4
|
-
|
|
5
|
-
export default class EditorModel extends ObjectModel {
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* @type BoolValue
|
|
9
|
-
*/
|
|
10
|
-
isVisible;
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* @type NullableNode
|
|
14
|
-
*/
|
|
15
|
-
activeTable;
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* @type NullableNode
|
|
19
|
-
*/
|
|
20
|
-
activeForm;
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* @type NullableNode<MaterialModel>
|
|
24
|
-
*/
|
|
25
|
-
activeMaterial;
|
|
26
|
-
|
|
27
|
-
constructor() {
|
|
28
|
-
super();
|
|
29
|
-
|
|
30
|
-
this.activeTable = this.addProperty('activeTable', new NullableNode());
|
|
31
|
-
this.activeForm = this.addProperty('activeForm', new NullableNode());
|
|
32
|
-
this.activeMaterial = this.addProperty('activeMaterial', new NullableNode());
|
|
33
|
-
|
|
34
|
-
this.isVisible = this.addProperty('isVisible', new BoolValue(true));
|
|
35
|
-
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
}
|
package/editor/EditorRenderer.js
DELETED
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
import DomRenderer from "../core/renderer/dom/DomRenderer";
|
|
2
|
-
import TableRenderer from "./table/TableRenderer";
|
|
3
|
-
import NullableNodeRenderer from "../core/renderer/generic/NullableNodeRenderer";
|
|
4
|
-
import NodeFormRenderer from "./form/NodeFormRenderer";
|
|
5
|
-
import DOMHelper from "../core/helper/DOMHelper";
|
|
6
|
-
|
|
7
|
-
export default class EditorRenderer extends DomRenderer {
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* @type EditorModel
|
|
11
|
-
*/
|
|
12
|
-
model;
|
|
13
|
-
|
|
14
|
-
constructor(game, model, dom) {
|
|
15
|
-
super(game, model, dom);
|
|
16
|
-
|
|
17
|
-
this.model = model;
|
|
18
|
-
|
|
19
|
-
this.container = null;
|
|
20
|
-
|
|
21
|
-
this.tableRenderer = new NullableNodeRenderer(this.game, this.model.activeTable, (model) => new TableRenderer(this.game, model, this.table));
|
|
22
|
-
this.addChild(this.tableRenderer);
|
|
23
|
-
|
|
24
|
-
this.formRenderer = new NullableNodeRenderer(this.game, this.model.activeForm, (model) => new NodeFormRenderer(this.game, model, this.form));
|
|
25
|
-
this.addChild(this.formRenderer);
|
|
26
|
-
|
|
27
|
-
this.addAutoEvent(
|
|
28
|
-
this.model.activeTable,
|
|
29
|
-
'change',
|
|
30
|
-
() => this.updateTables()
|
|
31
|
-
);
|
|
32
|
-
|
|
33
|
-
this.addAutoEvent(
|
|
34
|
-
this.model.isVisible,
|
|
35
|
-
'change',
|
|
36
|
-
() => {
|
|
37
|
-
if (this.model.isVisible.get()) {
|
|
38
|
-
DOMHelper.removeClass(this.dock, 'hidden');
|
|
39
|
-
DOMHelper.removeClass(this.buttonsLeft, 'hidden');
|
|
40
|
-
DOMHelper.removeClass(this.buttonsRight, 'hidden');
|
|
41
|
-
} else {
|
|
42
|
-
DOMHelper.addClass(this.dock, 'hidden');
|
|
43
|
-
DOMHelper.addClass(this.buttonsLeft, 'hidden');
|
|
44
|
-
DOMHelper.addClass(this.buttonsRight, 'hidden');
|
|
45
|
-
}
|
|
46
|
-
},
|
|
47
|
-
true
|
|
48
|
-
);
|
|
49
|
-
|
|
50
|
-
this.stopEventPropagationHandler = (e) => e.stopPropagation();
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
activateInternal() {
|
|
54
|
-
this.container = this.addElement('div', 'editor');
|
|
55
|
-
this.nav = DOMHelper.createElement(this.container, 'nav', 'bg row');
|
|
56
|
-
|
|
57
|
-
const buttons = DOMHelper.createElement(this.nav, 'div', 'buttons row');
|
|
58
|
-
this.switch = DOMHelper.createElement(buttons, 'input');
|
|
59
|
-
this.switch.setAttribute('type', 'checkbox');
|
|
60
|
-
this.switch.setAttribute('name', 'switch');
|
|
61
|
-
this.switch.setAttribute('checked', this.model.isVisible.get());
|
|
62
|
-
this.switch.addEventListener('change', () => this.model.triggerEvent('switch-options'));
|
|
63
|
-
|
|
64
|
-
this.buttonsLeft = DOMHelper.createElement(buttons, 'div');
|
|
65
|
-
|
|
66
|
-
DOMHelper.createElement(
|
|
67
|
-
this.buttonsLeft,
|
|
68
|
-
'button',
|
|
69
|
-
'special',
|
|
70
|
-
'Save Resources',
|
|
71
|
-
() => this.model.triggerEvent('save-resources')
|
|
72
|
-
);
|
|
73
|
-
|
|
74
|
-
this.buttonsRight = DOMHelper.createElement(this.nav, 'div');
|
|
75
|
-
|
|
76
|
-
this.dock = DOMHelper.createElement(this.container, 'div', 'dock bg');
|
|
77
|
-
this.tables = DOMHelper.createElement(this.dock, 'div', 'table-selection bg');
|
|
78
|
-
this.table = DOMHelper.createElement(this.dock, 'div', 'active-table');
|
|
79
|
-
this.form = DOMHelper.createElement(this.dock, 'div', 'active-form');
|
|
80
|
-
this.item = DOMHelper.createElement(this.dock, 'div', 'active-item');
|
|
81
|
-
|
|
82
|
-
const events = ['click', 'mousemove', 'mousedown', 'mouseup', 'wheel'];
|
|
83
|
-
const elements = [this.nav, this.tables, this.table, this.form, this.item];
|
|
84
|
-
for (const eli in elements) {
|
|
85
|
-
for (const evi in events) {
|
|
86
|
-
this.addAutoEvent(elements[eli], events[evi], this.stopEventPropagationHandler);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
this.updateTables();
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
deactivateInternal() {
|
|
94
|
-
this.removeElement(this.container);
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
updateTables() {
|
|
98
|
-
DOMHelper.emptyElement(this.tables);
|
|
99
|
-
const wrapper = DOMHelper.createElement(this.tables, 'div', 'inner');
|
|
100
|
-
this.addMenuSection(wrapper, this.game.resources, 'Resources');
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
addMenuSection(wrapper, node, name) {
|
|
104
|
-
DOMHelper.createElement(wrapper, 'h3', null, name);
|
|
105
|
-
const menu = DOMHelper.createElement(wrapper, 'ul', 'menu');
|
|
106
|
-
node.properties.forEach(
|
|
107
|
-
(name, property) => {
|
|
108
|
-
const isActive = this.model.activeTable.equalsTo(property);
|
|
109
|
-
const item = DOMHelper.createElement(menu, 'li', isActive ? 'active' : '');
|
|
110
|
-
const link = DOMHelper.createElement(item, 'a', null, name);
|
|
111
|
-
link.addEventListener('click', () => this.model.triggerEvent('table-selected', property));
|
|
112
|
-
}
|
|
113
|
-
);
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
}
|
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
import DomRenderer from "../../core/renderer/dom/DomRenderer";
|
|
2
|
-
import TableRenderer from "../table/TableRenderer";
|
|
3
|
-
import TableLookupRenderer from "../table/lookup/TableLookupRenderer";
|
|
4
|
-
import DOMHelper from "../../core/helper/DOMHelper";
|
|
5
|
-
|
|
6
|
-
export default class NodeFormRenderer extends DomRenderer {
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* @type ObjectModel
|
|
10
|
-
*/
|
|
11
|
-
model;
|
|
12
|
-
|
|
13
|
-
constructor(game, model, dom, collection = null) {
|
|
14
|
-
super(game, model, dom);
|
|
15
|
-
|
|
16
|
-
this.model = model;
|
|
17
|
-
this.collection = collection;
|
|
18
|
-
this.container = null;
|
|
19
|
-
this.fields = null;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
activateInternal() {
|
|
23
|
-
this.container = this.addElement('form', 'bg');
|
|
24
|
-
|
|
25
|
-
const buttons = DOMHelper.createElement(this.container, 'div', 'buttons');
|
|
26
|
-
const buttonsLeft = DOMHelper.createElement(buttons, 'div');
|
|
27
|
-
const buttonsRight = DOMHelper.createElement(buttons, 'div');
|
|
28
|
-
|
|
29
|
-
const submit = DOMHelper.createElement(buttonsLeft, 'button');
|
|
30
|
-
submit.innerText = 'Save';
|
|
31
|
-
submit.addEventListener('click', (e) => {
|
|
32
|
-
e.preventDefault();
|
|
33
|
-
this.save();
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
if (this.collection) {
|
|
37
|
-
DOMHelper.createElement(buttonsLeft, 'button', null, 'Clone',
|
|
38
|
-
(e) => {
|
|
39
|
-
e.preventDefault();
|
|
40
|
-
this.game.editor.triggerEvent('node-clone', {table: this.collection, node: this.model});
|
|
41
|
-
}
|
|
42
|
-
);
|
|
43
|
-
DOMHelper.createElement(buttonsLeft, 'button', 'red', 'Delete',
|
|
44
|
-
(e) => {
|
|
45
|
-
e.preventDefault();
|
|
46
|
-
this.game.editor.triggerEvent('node-delete', {table: this.collection, node: this.model});
|
|
47
|
-
}
|
|
48
|
-
);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
DOMHelper.createElement(
|
|
52
|
-
buttonsRight,
|
|
53
|
-
'button',
|
|
54
|
-
null,
|
|
55
|
-
'Close',
|
|
56
|
-
(e) => {
|
|
57
|
-
e.preventDefault();
|
|
58
|
-
if (this.game.editor.activeForm.equalsTo(this.model)) {
|
|
59
|
-
this.game.editor.triggerEvent('form-closed');
|
|
60
|
-
}
|
|
61
|
-
if (this.collection) {
|
|
62
|
-
this.collection.selectedNode.set(null);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
);
|
|
66
|
-
|
|
67
|
-
this.fields = DOMHelper.createElement(this.container, 'div', 'fields scroll');
|
|
68
|
-
this.renderFields();
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
deactivateInternal() {
|
|
72
|
-
this.removeElement(this.container);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
renderInternal() {
|
|
76
|
-
this.renderFields();
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
renderInput(container, name, value) {
|
|
80
|
-
if (value === undefined) {
|
|
81
|
-
DOMHelper.createElement(container, 'span', null, '--undefined--');
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
if (value === null) {
|
|
86
|
-
DOMHelper.createElement(container, 'span', null, '--null--');
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
if (name === 'color' && typeof value === 'string') {
|
|
91
|
-
const input = DOMHelper.createElement(container, 'input', 'color');
|
|
92
|
-
input.setAttribute('type', 'color');
|
|
93
|
-
input.setAttribute('name', name);
|
|
94
|
-
input.value = value;
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
if (typeof value === 'object' && value.x !== undefined && value.y !== undefined) {
|
|
99
|
-
DOMHelper.addClass(container, 'vector');
|
|
100
|
-
this.renderInput(container, `${name}[]`, value.x);
|
|
101
|
-
this.renderInput(container, `${name}[]`, value.y);
|
|
102
|
-
if (value.z !== undefined) {
|
|
103
|
-
this.renderInput(container, `${name}[]`, value.z);
|
|
104
|
-
if (value.w !== undefined) {
|
|
105
|
-
this.renderInput(container, `${name}[]`, value.w);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
return;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
if (typeof value === 'object' && (value.constructor.name === 'ModelNodeTable' || value.constructor.name === 'ModelNodeCollection')) {
|
|
112
|
-
const tableRenderer = new TableRenderer(this.game, value, container);
|
|
113
|
-
tableRenderer.activate();
|
|
114
|
-
return;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
if (typeof value === 'object' && value.value !== undefined) {
|
|
118
|
-
this.renderInput(container, name, value.value);
|
|
119
|
-
if (value.constructor.name === 'IntValue' && TableLookupRenderer.isTableLookupField(name)) {
|
|
120
|
-
DOMHelper.addClass(container, 'with-lookup');
|
|
121
|
-
const lookupRenderer = new TableLookupRenderer(this.game, value, container, name);
|
|
122
|
-
DOMHelper.createElement(container, 'div', 'pr-1', lookupRenderer.getPreview());
|
|
123
|
-
DOMHelper.createElement(
|
|
124
|
-
container,
|
|
125
|
-
'button',
|
|
126
|
-
'lookup-button',
|
|
127
|
-
'Select...',
|
|
128
|
-
(e) => {
|
|
129
|
-
e.preventDefault();
|
|
130
|
-
value.addEventListener('table-closed', () => {
|
|
131
|
-
lookupRenderer.deactivate();
|
|
132
|
-
});
|
|
133
|
-
lookupRenderer.activate();
|
|
134
|
-
}
|
|
135
|
-
);
|
|
136
|
-
}
|
|
137
|
-
return;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
if (typeof value === 'object') {
|
|
141
|
-
DOMHelper.createElement(container, 'span', null, '[Object]');
|
|
142
|
-
return;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
if (typeof value === 'boolean') {
|
|
146
|
-
const input = DOMHelper.createElement(container, 'input');
|
|
147
|
-
input.setAttribute('type', 'checkbox');
|
|
148
|
-
input.setAttribute('name', name);
|
|
149
|
-
input.checked = value;
|
|
150
|
-
return;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
const input = DOMHelper.createElement(container, 'input');
|
|
154
|
-
input.setAttribute('type', 'text');
|
|
155
|
-
input.setAttribute('name', name);
|
|
156
|
-
input.value = value.toString();
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
renderField(container, name, value) {
|
|
160
|
-
const row = DOMHelper.createElement(container, 'div', 'row');
|
|
161
|
-
const label = DOMHelper.createElement(row, 'label', null, name);
|
|
162
|
-
label.setAttribute('for', name);
|
|
163
|
-
const item = DOMHelper.createElement(row, 'div', 'field');
|
|
164
|
-
this.renderInput(item, name, value);
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
renderFields() {
|
|
168
|
-
DOMHelper.emptyElement(this.fields);
|
|
169
|
-
this.model.properties.forEach((name, value) => {
|
|
170
|
-
this.renderField(this.fields, name, value);
|
|
171
|
-
});
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
save() {
|
|
175
|
-
const data = new FormData(this.container);
|
|
176
|
-
this.game.editor.triggerEvent('node-saved', {node: this.model, data: data});
|
|
177
|
-
this.game.editor.triggerEvent('form-closed');
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
}
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
import CollectionRenderer from "../../core/renderer/generic/CollectionRenderer";
|
|
2
|
-
import TableRowRenderer from "./row/TableRowRenderer";
|
|
3
|
-
import NodeFormRenderer from "../form/NodeFormRenderer";
|
|
4
|
-
import NullableNodeRenderer from "../../core/renderer/generic/NullableNodeRenderer";
|
|
5
|
-
import DomRenderer from "../../core/renderer/dom/DomRenderer";
|
|
6
|
-
import DOMHelper from "../../core/helper/DOMHelper";
|
|
7
|
-
|
|
8
|
-
export default class TableRenderer extends DomRenderer {
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* @type ModelNodeTable|ModelNodeCollection
|
|
12
|
-
*/
|
|
13
|
-
model;
|
|
14
|
-
|
|
15
|
-
constructor(game, model, dom) {
|
|
16
|
-
super(game, model, dom);
|
|
17
|
-
|
|
18
|
-
this.model = model;
|
|
19
|
-
this.dom = dom;
|
|
20
|
-
this.container = null;
|
|
21
|
-
|
|
22
|
-
this.addChild(
|
|
23
|
-
new NullableNodeRenderer(
|
|
24
|
-
this.game,
|
|
25
|
-
this.model.selectedNode,
|
|
26
|
-
(m) => new NodeFormRenderer(this.game, m, this.dom, this.model)
|
|
27
|
-
)
|
|
28
|
-
);
|
|
29
|
-
|
|
30
|
-
this.addChild(
|
|
31
|
-
new CollectionRenderer(
|
|
32
|
-
this.game,
|
|
33
|
-
this.model,
|
|
34
|
-
(m) => new TableRowRenderer(game, m, this.tbody, this.model)
|
|
35
|
-
)
|
|
36
|
-
);
|
|
37
|
-
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
activateInternal() {
|
|
41
|
-
this.container = DOMHelper.createElement(this.dom, 'div', 'table bg');
|
|
42
|
-
|
|
43
|
-
this.buttons = DOMHelper.createElement(this.container, 'div', 'buttons');
|
|
44
|
-
const buttonsLeft = DOMHelper.createElement(this.buttons, 'div');
|
|
45
|
-
const buttonsRight = DOMHelper.createElement(this.buttons, 'div');
|
|
46
|
-
|
|
47
|
-
DOMHelper.createElement(
|
|
48
|
-
buttonsLeft,
|
|
49
|
-
'button',
|
|
50
|
-
null,
|
|
51
|
-
'Add',
|
|
52
|
-
(e) => {
|
|
53
|
-
e.preventDefault();
|
|
54
|
-
this.model.selectedNode.set(this.model.add());
|
|
55
|
-
}
|
|
56
|
-
);
|
|
57
|
-
|
|
58
|
-
this.input = DOMHelper.createElement(buttonsLeft, 'input', 'flex-1')
|
|
59
|
-
this.input.setAttribute('type', 'text');
|
|
60
|
-
this.input.addEventListener('input', () => this.updateItems());
|
|
61
|
-
DOMHelper.createElement(buttonsLeft, 'button', null, 'Reset', () => {
|
|
62
|
-
this.input.value = '';
|
|
63
|
-
this.updateItems();
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
DOMHelper.createElement(
|
|
67
|
-
buttonsRight,
|
|
68
|
-
'button',
|
|
69
|
-
null,
|
|
70
|
-
'Close',
|
|
71
|
-
(e) => {
|
|
72
|
-
e.preventDefault();
|
|
73
|
-
if (this.game.editor.activeTable.equalsTo(this.model)) {
|
|
74
|
-
this.game.editor.triggerEvent('table-closed');
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
);
|
|
78
|
-
|
|
79
|
-
this.scrollable = DOMHelper.createElement(this.container, 'div', 'scroll');
|
|
80
|
-
this.table = DOMHelper.createElement(this.scrollable, 'table');
|
|
81
|
-
|
|
82
|
-
let dummy = null;
|
|
83
|
-
|
|
84
|
-
if (typeof this.model.nodeFactory === 'function') {
|
|
85
|
-
dummy = this.model.nodeFactory();
|
|
86
|
-
} else if (this.model.count() > 0) {
|
|
87
|
-
dummy = this.model.first();
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
if (dummy) {
|
|
91
|
-
const thead = DOMHelper.createElement(this.table, 'thead');
|
|
92
|
-
const header = DOMHelper.createElement(thead, 'tr');
|
|
93
|
-
DOMHelper.createElement(header, 'th');
|
|
94
|
-
dummy.properties.forEach((name) => {
|
|
95
|
-
const cell = DOMHelper.createElement(header, 'th');
|
|
96
|
-
cell.innerText = name;
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
this.tbody = DOMHelper.createElement(this.table, 'tbody');
|
|
101
|
-
|
|
102
|
-
super.activateInternal();
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
deactivateInternal() {
|
|
106
|
-
super.deactivateInternal();
|
|
107
|
-
DOMHelper.destroyElement(this.container);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
updateItems() {
|
|
111
|
-
const rows = this.tbody.querySelectorAll('tr');
|
|
112
|
-
const search = this.input.value.toLowerCase();
|
|
113
|
-
rows.forEach((row) => {
|
|
114
|
-
const str = row.innerText.toLowerCase();
|
|
115
|
-
const visible = (search === '') || str.includes(search);
|
|
116
|
-
if (visible) {
|
|
117
|
-
DOMHelper.removeClass(row, 'hidden');
|
|
118
|
-
} else {
|
|
119
|
-
DOMHelper.addClass(row, 'hidden');
|
|
120
|
-
}
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
}
|
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
import DomRenderer from "../../../core/renderer/dom/DomRenderer";
|
|
2
|
-
import DOMHelper from "../../../core/helper/DOMHelper";
|
|
3
|
-
|
|
4
|
-
const FIELD_TABLE_MAPPINGS = {
|
|
5
|
-
modelId: 'models3d',
|
|
6
|
-
materialId: 'materials',
|
|
7
|
-
spriteId: 'sprites'
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
const RENDER_FIELDS = ['id', 'name'];
|
|
11
|
-
|
|
12
|
-
export default class TableLookupRenderer extends DomRenderer {
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* @type IntValue
|
|
16
|
-
*/
|
|
17
|
-
model;
|
|
18
|
-
|
|
19
|
-
constructor(game, model, dom, fieldName) {
|
|
20
|
-
super(game, model, dom);
|
|
21
|
-
|
|
22
|
-
this.model = model;
|
|
23
|
-
this.lookupTable = this.getTableByField(fieldName);
|
|
24
|
-
if (!this.lookupTable) {
|
|
25
|
-
console.error('Not found lookup table for field', fieldName);
|
|
26
|
-
}
|
|
27
|
-
this.container = null;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
activateInternal() {
|
|
31
|
-
this.container = this.addElement('div', 'table-lookup force-foreground p-2');
|
|
32
|
-
this.container.addEventListener('wheel', (e) => e.stopPropagation());
|
|
33
|
-
|
|
34
|
-
this.buttons = DOMHelper.createElement(this.container, 'div', 'buttons row stretch');
|
|
35
|
-
this.input = DOMHelper.createElement(this.buttons, 'input', 'flex-1')
|
|
36
|
-
this.input.setAttribute('type', 'text');
|
|
37
|
-
this.input.addEventListener('input', () => this.renderItems());
|
|
38
|
-
DOMHelper.createElement(this.buttons, 'button', null, 'Reset', (e) => {
|
|
39
|
-
e.preventDefault();
|
|
40
|
-
this.input.value = '';
|
|
41
|
-
this.renderItems();
|
|
42
|
-
});
|
|
43
|
-
DOMHelper.createElement(this.buttons, 'button', null, 'NaN', (e) => {
|
|
44
|
-
e.preventDefault();
|
|
45
|
-
this.model.set(Number.NaN);
|
|
46
|
-
this.model.triggerEvent('table-closed');
|
|
47
|
-
});
|
|
48
|
-
DOMHelper.createElement(this.buttons, 'button', 'ml-1', 'Close', () => this.model.triggerEvent('table-closed'));
|
|
49
|
-
|
|
50
|
-
this.scrollable = DOMHelper.createElement(this.container, 'div', 'scroll p-1');
|
|
51
|
-
this.table = DOMHelper.createElement(this.scrollable, 'table');
|
|
52
|
-
|
|
53
|
-
const thead = DOMHelper.createElement(this.table, 'thead');
|
|
54
|
-
const header = DOMHelper.createElement(thead, 'tr');
|
|
55
|
-
RENDER_FIELDS.forEach((name) => {
|
|
56
|
-
const cell = DOMHelper.createElement(header, 'th');
|
|
57
|
-
cell.innerText = name;
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
this.tbody = DOMHelper.createElement(this.table, 'tbody');
|
|
61
|
-
this.renderItems();
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
deactivateInternal() {
|
|
65
|
-
this.removeElement(this.container);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
getTableByField(name) {
|
|
69
|
-
return this.game.getTableByName(FIELD_TABLE_MAPPINGS[name]);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
static isTableLookupField(name) {
|
|
73
|
-
return Object.keys(FIELD_TABLE_MAPPINGS).includes(name);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
getPreview() {
|
|
77
|
-
const element = this.lookupTable.getById(this.model.get());
|
|
78
|
-
if (element) {
|
|
79
|
-
if (typeof element.name === 'object' && typeof element.name.get === 'function') {
|
|
80
|
-
return element.name.get();
|
|
81
|
-
}
|
|
82
|
-
return this.model.get();
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
renderItems() {
|
|
87
|
-
DOMHelper.emptyElement(this.tbody);
|
|
88
|
-
const search = this.input.value.toLowerCase();
|
|
89
|
-
const searchId = Number(search);
|
|
90
|
-
this.lookupTable
|
|
91
|
-
.filter((m) => {
|
|
92
|
-
if (search === '') {
|
|
93
|
-
return true;
|
|
94
|
-
}
|
|
95
|
-
if (!Number.isNaN(searchId)) {
|
|
96
|
-
return m.id.equalsTo(searchId);
|
|
97
|
-
}
|
|
98
|
-
const name = m.name.get();
|
|
99
|
-
return name.toLowerCase().includes(search);
|
|
100
|
-
})
|
|
101
|
-
.forEach(
|
|
102
|
-
(node) => {
|
|
103
|
-
const tr = DOMHelper.createElement(
|
|
104
|
-
this.tbody,
|
|
105
|
-
'tr',
|
|
106
|
-
node.id.equalsTo(this.model.get()) ? 'active' : null,
|
|
107
|
-
null,
|
|
108
|
-
() => {
|
|
109
|
-
this.model.set(node.id.get());
|
|
110
|
-
this.model.triggerEvent('table-closed');
|
|
111
|
-
}
|
|
112
|
-
);
|
|
113
|
-
RENDER_FIELDS.forEach((name) => {
|
|
114
|
-
const cell = DOMHelper.createElement(tr, 'td');
|
|
115
|
-
cell.innerText = node[name].get();
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
import DomRenderer from "../../../core/renderer/dom/DomRenderer";
|
|
2
|
-
import DOMHelper from "../../../core/helper/DOMHelper";
|
|
3
|
-
import NumberHelper from "../../../core/helper/NumberHelper";
|
|
4
|
-
import StringHelper from "../../../core/helper/StringHelper";
|
|
5
|
-
|
|
6
|
-
export default class TableRowRenderer extends DomRenderer {
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* @type ObjectModel
|
|
10
|
-
*/
|
|
11
|
-
model;
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* @type ModelNodeTable|ModelNodeCollection
|
|
15
|
-
*/
|
|
16
|
-
table;
|
|
17
|
-
|
|
18
|
-
constructor(game, model, dom, collection) {
|
|
19
|
-
super(game, model, dom);
|
|
20
|
-
|
|
21
|
-
this.model = model;
|
|
22
|
-
this.collection = collection;
|
|
23
|
-
|
|
24
|
-
this.container = null;
|
|
25
|
-
|
|
26
|
-
this.addAutoEvent(
|
|
27
|
-
this.collection.selectedNode,
|
|
28
|
-
'change',
|
|
29
|
-
() => {
|
|
30
|
-
if (this.collection.selectedNode.equalsTo(this.model)) {
|
|
31
|
-
DOMHelper.addClass(this.container, 'active');
|
|
32
|
-
} else {
|
|
33
|
-
DOMHelper.removeClass(this.container, 'active');
|
|
34
|
-
}
|
|
35
|
-
},
|
|
36
|
-
true
|
|
37
|
-
);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
activateInternal() {
|
|
41
|
-
this.container = this.addElement('tr');
|
|
42
|
-
this.container.addEventListener('click', () => this.collection.selectedNode.set(this.model));
|
|
43
|
-
|
|
44
|
-
this.updateRow();
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
deactivateInternal() {
|
|
48
|
-
this.removeElement(this.container);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
renderInternal() {
|
|
52
|
-
this.updateRow();
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
updateRow() {
|
|
56
|
-
DOMHelper.emptyElement(this.container);
|
|
57
|
-
|
|
58
|
-
const grab = DOMHelper.createElement(this.container, 'td');
|
|
59
|
-
const icon = DOMHelper.createElement(grab, 'div', 'grab-icon');
|
|
60
|
-
icon.setAttribute('draggable', "true");
|
|
61
|
-
icon.addEventListener('dragstart', (e) => {
|
|
62
|
-
this.collection.triggerEvent('drag-start', this.model);
|
|
63
|
-
});
|
|
64
|
-
this.container.addEventListener('dragover', (e) => e.preventDefault());
|
|
65
|
-
this.container.addEventListener('drop', (e) => {
|
|
66
|
-
e.preventDefault();
|
|
67
|
-
this.collection.triggerEvent('drag-drop', this.model);
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
this.model.properties.forEach((name, value) => {
|
|
71
|
-
const cell = DOMHelper.createElement(this.container, 'td');
|
|
72
|
-
let text = '';
|
|
73
|
-
if (value !== undefined && value !== null) {
|
|
74
|
-
if (typeof value === 'object') {
|
|
75
|
-
if (value.value !== undefined) {
|
|
76
|
-
text = StringHelper.shorten(value.value);
|
|
77
|
-
} else if (value.x !== undefined && value.y !== undefined) {
|
|
78
|
-
text = '[' + NumberHelper.round(value.x, 2) + ',' + NumberHelper.round(value.y, 2);
|
|
79
|
-
if (value.z !== undefined) {
|
|
80
|
-
text += ',' + NumberHelper.round(value.z, 2);
|
|
81
|
-
}
|
|
82
|
-
if (value.w !== undefined) {
|
|
83
|
-
text += ',' + NumberHelper.round(value.w, 2);
|
|
84
|
-
}
|
|
85
|
-
text += ']';
|
|
86
|
-
} else {
|
|
87
|
-
text = NumberHelper.shorten(value.toString());
|
|
88
|
-
}
|
|
89
|
-
} else {
|
|
90
|
-
text = NumberHelper.shorten(value);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
cell.innerText = text;
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
}
|