lexgui 8.0.0 → 8.1.0
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/README.md +3 -3
- package/build/components/AlertDialog.d.ts +7 -0
- package/build/components/Counter.d.ts +9 -8
- package/build/components/Dialog.d.ts +20 -20
- package/build/components/Footer.d.ts +14 -14
- package/build/components/Menubar.d.ts +59 -59
- package/build/core/Area.d.ts +143 -143
- package/build/core/Namespace.js +34 -34
- package/build/core/Namespace.js.map +1 -1
- package/build/core/Panel.d.ts +538 -539
- package/build/extensions/AssetView.d.ts +136 -134
- package/build/extensions/AssetView.js +1367 -1320
- package/build/extensions/AssetView.js.map +1 -1
- package/build/extensions/Audio.js +163 -163
- package/build/extensions/Audio.js.map +1 -1
- package/build/extensions/CodeEditor.js +5022 -4802
- package/build/extensions/CodeEditor.js.map +1 -1
- package/build/extensions/DocMaker.d.ts +27 -27
- package/build/extensions/DocMaker.js +327 -315
- package/build/extensions/DocMaker.js.map +1 -1
- package/build/extensions/GraphEditor.js +2760 -2659
- package/build/extensions/GraphEditor.js.map +1 -1
- package/build/extensions/ImUi.js +227 -226
- package/build/extensions/ImUi.js.map +1 -1
- package/build/extensions/Timeline.d.ts +670 -677
- package/build/extensions/Timeline.js +3955 -3958
- package/build/extensions/Timeline.js.map +1 -1
- package/build/extensions/VideoEditor.js +898 -894
- package/build/extensions/VideoEditor.js.map +1 -1
- package/build/extensions/index.d.ts +8 -8
- package/build/extensions/index.js +10 -10
- package/build/index.all.d.ts +2 -2
- package/build/index.css.d.ts +4 -4
- package/build/index.d.ts +56 -55
- package/build/lexgui.all.js +28488 -27640
- package/build/lexgui.all.js.map +1 -1
- package/build/lexgui.all.min.js +1 -1
- package/build/lexgui.all.module.js +28412 -27565
- package/build/lexgui.all.module.js.map +1 -1
- package/build/lexgui.all.module.min.js +1 -1
- package/build/lexgui.css +178 -71
- package/build/lexgui.js +13796 -13330
- package/build/lexgui.js.map +1 -1
- package/build/lexgui.min.css +2 -2
- package/build/lexgui.min.js +1 -1
- package/build/lexgui.module.js +13733 -13268
- package/build/lexgui.module.js.map +1 -1
- package/build/lexgui.module.min.js +1 -1
- package/changelog.md +17 -1
- package/demo.js +6 -5
- package/examples/all-components.html +3 -0
- package/examples/asset-view.html +4 -4
- package/examples/dialogs.html +3 -3
- package/examples/editor.html +1 -1
- package/examples/index.html +1 -1
- package/package.json +4 -1
package/build/extensions/ImUi.js
CHANGED
|
@@ -1,226 +1,227 @@
|
|
|
1
|
-
// This is a generated file. Do not edit.
|
|
2
|
-
import { LX } from '../core/Namespace.js';
|
|
3
|
-
|
|
4
|
-
// ImUI.ts @jxarco
|
|
5
|
-
if (!LX) {
|
|
6
|
-
throw (
|
|
7
|
-
}
|
|
8
|
-
LX.extensions.push('ImUI');
|
|
9
|
-
const vec2 = LX.vec2;
|
|
10
|
-
/**
|
|
11
|
-
* @class ImUI
|
|
12
|
-
*/
|
|
13
|
-
class ImUI {
|
|
14
|
-
root;
|
|
15
|
-
canvas;
|
|
16
|
-
// Components
|
|
17
|
-
components = {};
|
|
18
|
-
// Mouse state
|
|
19
|
-
mouseDown = false;
|
|
20
|
-
mousePosition = new vec2();
|
|
21
|
-
usePointerCursor = false;
|
|
22
|
-
eventClick = undefined;
|
|
23
|
-
constructor(canvas, options = {}) {
|
|
24
|
-
console.assert(canvas !== undefined);
|
|
25
|
-
// To capture key events
|
|
26
|
-
canvas.tabIndex = -1;
|
|
27
|
-
canvas.addEventListener('keydown', this._processKey.bind(this), true);
|
|
28
|
-
canvas.addEventListener('mousedown', this._processMouse.bind(this));
|
|
29
|
-
canvas.addEventListener('mouseup', this._processMouse.bind(this));
|
|
30
|
-
canvas.addEventListener('mousemove', this._processMouse.bind(this));
|
|
31
|
-
canvas.addEventListener('click', this._processMouse.bind(this));
|
|
32
|
-
// this.font = new FontFace("Ubuntu", "url(../data/Ubuntu-Bold.ttf)");
|
|
33
|
-
// this.font.load().then(
|
|
34
|
-
// ( font ) => {
|
|
35
|
-
// document.fonts.add( font );
|
|
36
|
-
// if( options.onready ) options.onready();
|
|
37
|
-
// },
|
|
38
|
-
// (err) => {
|
|
39
|
-
// console.error(err);
|
|
40
|
-
// },
|
|
41
|
-
// );
|
|
42
|
-
this.root = this.canvas = canvas;
|
|
43
|
-
}
|
|
44
|
-
_processKey(e) {
|
|
45
|
-
const detail = e.detail;
|
|
46
|
-
const key = e.key ?? detail.key;
|
|
47
|
-
console.log(key);
|
|
48
|
-
}
|
|
49
|
-
_processMouse(e) {
|
|
50
|
-
if (e.type == 'mousedown') {
|
|
51
|
-
this.mouseDown = true;
|
|
52
|
-
}
|
|
53
|
-
else if (e.type == 'mouseup') {
|
|
54
|
-
this._processClick(e);
|
|
55
|
-
this.mouseDown = false;
|
|
56
|
-
}
|
|
57
|
-
else if (e.type == 'mousemove') {
|
|
58
|
-
this.mousePosition.set(e.clientX, e.clientY);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
_processClick(e) {
|
|
62
|
-
this.eventClick = e;
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* @method Button
|
|
66
|
-
* @param {String} text
|
|
67
|
-
* @param {Number} x
|
|
68
|
-
* @param {Number} y
|
|
69
|
-
*/
|
|
70
|
-
Button(text, x, y, callback) {
|
|
71
|
-
const ctx = this.canvas.getContext(
|
|
72
|
-
// Element properties
|
|
73
|
-
let fontSize = 16;
|
|
74
|
-
ctx.font = fontSize +
|
|
75
|
-
let padding = new LX.vec2(12, 8);
|
|
76
|
-
let position = new LX.vec2(x, y);
|
|
77
|
-
const metrics = ctx.measureText(text);
|
|
78
|
-
let size = new LX.vec2(metrics.width, metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent);
|
|
79
|
-
// Get mouse state
|
|
80
|
-
const hovered = this.mousePosition.x >= position.x
|
|
81
|
-
&& this.mousePosition.
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
ctx.
|
|
86
|
-
ctx.
|
|
87
|
-
ctx.
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
ctx.
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
* @
|
|
102
|
-
* @param {
|
|
103
|
-
* @param {Number}
|
|
104
|
-
* @param {Number}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
let
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
let
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
ctx.
|
|
130
|
-
ctx.
|
|
131
|
-
ctx.
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
const
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
this.
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
ctx.
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
ctx.roundRect(position.x, position.y, valueSize.x, valueSize.y + padding.y * 2.0, [8, 8, 8, 8]);
|
|
145
|
-
ctx.fill();
|
|
146
|
-
}
|
|
147
|
-
else {
|
|
148
|
-
ctx.fillRect(position.x, position.y, valueSize.x, valueSize.y + padding.y * 2.0);
|
|
149
|
-
}
|
|
150
|
-
// Draw text
|
|
151
|
-
ctx.fillStyle = hovered ?
|
|
152
|
-
ctx.fillText(text, position.x + padding.x, position.y + metrics.actualBoundingBoxAscent + padding.y);
|
|
153
|
-
this.usePointerCursor = this.usePointerCursor || hovered;
|
|
154
|
-
if (active) {
|
|
155
|
-
if (callback)
|
|
156
|
-
callback(value);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
/**
|
|
160
|
-
* @method Checkbox
|
|
161
|
-
* @param {String} text
|
|
162
|
-
* @param {Number} x
|
|
163
|
-
* @param {Number} y
|
|
164
|
-
* @param {Number} value
|
|
165
|
-
*/
|
|
166
|
-
Checkbox(text, x, y, value = false, callback) {
|
|
167
|
-
const ctx = this.canvas.getContext(
|
|
168
|
-
// Store slider value
|
|
169
|
-
if (!this.components[text]) {
|
|
170
|
-
this.components[text] = { value: value };
|
|
171
|
-
}
|
|
172
|
-
else {
|
|
173
|
-
value = this.components[text].value;
|
|
174
|
-
}
|
|
175
|
-
// Element properties
|
|
176
|
-
let fontSize = 16;
|
|
177
|
-
ctx.font = fontSize +
|
|
178
|
-
let padding = new LX.vec2(12, 8);
|
|
179
|
-
let position = new LX.vec2(x, y);
|
|
180
|
-
const metrics = ctx.measureText(text);
|
|
181
|
-
let size = new LX.vec2(metrics.width, metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent);
|
|
182
|
-
let boxMargin = 12;
|
|
183
|
-
let fullSize = new LX.vec2(boxMargin * 2.0, 0);
|
|
184
|
-
fullSize.add(size, fullSize);
|
|
185
|
-
// Get mouse state
|
|
186
|
-
const boxStartX = position.x + size.x + padding.x + boxMargin;
|
|
187
|
-
const boxStartY = position.y + padding.y;
|
|
188
|
-
const hovered = this.mousePosition.x >= boxStartX && this.mousePosition.x <= (boxStartX + size.y)
|
|
189
|
-
&& this.mousePosition.y >= boxStartY && this.mousePosition.y <= (boxStartY + size.y);
|
|
190
|
-
const active = hovered && this.mouseDown;
|
|
191
|
-
const pressed = hovered && this.eventClick;
|
|
192
|
-
// Draw button
|
|
193
|
-
ctx.fillStyle = active ?
|
|
194
|
-
ctx.fillRect(position.x, position.y, fullSize.x + padding.x * 2.0, fullSize.y + padding.y * 2.0);
|
|
195
|
-
// Draw checkbox
|
|
196
|
-
if (pressed) {
|
|
197
|
-
value = !value;
|
|
198
|
-
this.components[text].value = value;
|
|
199
|
-
if (callback) {
|
|
200
|
-
callback(value);
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
ctx.fillStyle = value
|
|
204
|
-
(active ?
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
ctx.
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
* @
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
1
|
+
// This is a generated file. Do not edit.
|
|
2
|
+
import { LX } from '../core/Namespace.js';
|
|
3
|
+
|
|
4
|
+
// ImUI.ts @jxarco
|
|
5
|
+
if (!LX) {
|
|
6
|
+
throw ('Missing LX namespace!');
|
|
7
|
+
}
|
|
8
|
+
LX.extensions.push('ImUI');
|
|
9
|
+
const vec2 = LX.vec2;
|
|
10
|
+
/**
|
|
11
|
+
* @class ImUI
|
|
12
|
+
*/
|
|
13
|
+
class ImUI {
|
|
14
|
+
root;
|
|
15
|
+
canvas;
|
|
16
|
+
// Components
|
|
17
|
+
components = {};
|
|
18
|
+
// Mouse state
|
|
19
|
+
mouseDown = false;
|
|
20
|
+
mousePosition = new vec2();
|
|
21
|
+
usePointerCursor = false;
|
|
22
|
+
eventClick = undefined;
|
|
23
|
+
constructor(canvas, options = {}) {
|
|
24
|
+
console.assert(canvas !== undefined);
|
|
25
|
+
// To capture key events
|
|
26
|
+
canvas.tabIndex = -1;
|
|
27
|
+
canvas.addEventListener('keydown', this._processKey.bind(this), true);
|
|
28
|
+
canvas.addEventListener('mousedown', this._processMouse.bind(this));
|
|
29
|
+
canvas.addEventListener('mouseup', this._processMouse.bind(this));
|
|
30
|
+
canvas.addEventListener('mousemove', this._processMouse.bind(this));
|
|
31
|
+
canvas.addEventListener('click', this._processMouse.bind(this));
|
|
32
|
+
// this.font = new FontFace("Ubuntu", "url(../data/Ubuntu-Bold.ttf)");
|
|
33
|
+
// this.font.load().then(
|
|
34
|
+
// ( font ) => {
|
|
35
|
+
// document.fonts.add( font );
|
|
36
|
+
// if( options.onready ) options.onready();
|
|
37
|
+
// },
|
|
38
|
+
// (err) => {
|
|
39
|
+
// console.error(err);
|
|
40
|
+
// },
|
|
41
|
+
// );
|
|
42
|
+
this.root = this.canvas = canvas;
|
|
43
|
+
}
|
|
44
|
+
_processKey(e) {
|
|
45
|
+
const detail = e.detail;
|
|
46
|
+
const key = e.key ?? detail.key;
|
|
47
|
+
console.log(key);
|
|
48
|
+
}
|
|
49
|
+
_processMouse(e) {
|
|
50
|
+
if (e.type == 'mousedown') {
|
|
51
|
+
this.mouseDown = true;
|
|
52
|
+
}
|
|
53
|
+
else if (e.type == 'mouseup') {
|
|
54
|
+
this._processClick(e);
|
|
55
|
+
this.mouseDown = false;
|
|
56
|
+
}
|
|
57
|
+
else if (e.type == 'mousemove') {
|
|
58
|
+
this.mousePosition.set(e.clientX, e.clientY);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
_processClick(e) {
|
|
62
|
+
this.eventClick = e;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* @method Button
|
|
66
|
+
* @param {String} text
|
|
67
|
+
* @param {Number} x
|
|
68
|
+
* @param {Number} y
|
|
69
|
+
*/
|
|
70
|
+
Button(text, x, y, callback) {
|
|
71
|
+
const ctx = this.canvas.getContext('2d');
|
|
72
|
+
// Element properties
|
|
73
|
+
let fontSize = 16;
|
|
74
|
+
ctx.font = fontSize + 'px Arial';
|
|
75
|
+
let padding = new LX.vec2(12, 8);
|
|
76
|
+
let position = new LX.vec2(x, y);
|
|
77
|
+
const metrics = ctx.measureText(text);
|
|
78
|
+
let size = new LX.vec2(metrics.width, metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent);
|
|
79
|
+
// Get mouse state
|
|
80
|
+
const hovered = this.mousePosition.x >= position.x
|
|
81
|
+
&& this.mousePosition.x <= (position.x + size.x + padding.x * 2.0)
|
|
82
|
+
&& this.mousePosition.y >= position.y && this.mousePosition.y <= (position.y + size.y + padding.y * 2.0);
|
|
83
|
+
const active = hovered && this.mouseDown;
|
|
84
|
+
// Draw button
|
|
85
|
+
ctx.beginPath();
|
|
86
|
+
ctx.fillStyle = active ? '#666' : (hovered ? '#444' : '#222');
|
|
87
|
+
ctx.roundRect(position.x, position.y, size.x + padding.x * 2.0, size.y + padding.y * 2.0, [8, 8, 8, 8]);
|
|
88
|
+
ctx.fill();
|
|
89
|
+
// Draw text
|
|
90
|
+
ctx.fillStyle = hovered ? '#fff' : '#ddd';
|
|
91
|
+
ctx.fillText(text, position.x + padding.x, position.y + metrics.actualBoundingBoxAscent + padding.y);
|
|
92
|
+
this.usePointerCursor = this.usePointerCursor || hovered;
|
|
93
|
+
if (this.eventClick) {
|
|
94
|
+
if (callback)
|
|
95
|
+
callback();
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* @method Slider
|
|
102
|
+
* @param {String} text
|
|
103
|
+
* @param {Number} x
|
|
104
|
+
* @param {Number} y
|
|
105
|
+
* @param {Number} value
|
|
106
|
+
*/
|
|
107
|
+
Slider(text, x, y, value = 0, callback) {
|
|
108
|
+
const ctx = this.canvas.getContext('2d');
|
|
109
|
+
// Store slider value
|
|
110
|
+
if (!this.components[text]) {
|
|
111
|
+
this.components[text] = { value: value };
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
value = this.components[text].value;
|
|
115
|
+
}
|
|
116
|
+
// Element properties
|
|
117
|
+
let fontSize = 16;
|
|
118
|
+
ctx.font = fontSize + 'px Arial';
|
|
119
|
+
let padding = new LX.vec2(12, 8);
|
|
120
|
+
let position = new LX.vec2(x, y);
|
|
121
|
+
const metrics = ctx.measureText(text);
|
|
122
|
+
let size = new LX.vec2(metrics.width, metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent);
|
|
123
|
+
let fullSize = size.add(padding.mul(2.0));
|
|
124
|
+
// Get mouse state
|
|
125
|
+
const hovered = this.mousePosition.x >= position.x && this.mousePosition.x <= (position.x + fullSize.x)
|
|
126
|
+
&& this.mousePosition.y >= position.y && this.mousePosition.y <= (position.y + fullSize.y);
|
|
127
|
+
const active = hovered && this.mouseDown;
|
|
128
|
+
// Draw box
|
|
129
|
+
ctx.beginPath();
|
|
130
|
+
ctx.fillStyle = hovered ? '#444' : '#222';
|
|
131
|
+
ctx.roundRect(position.x, position.y, fullSize.x, fullSize.y, [8, 8, 8, 8]);
|
|
132
|
+
ctx.fill();
|
|
133
|
+
// Draw value
|
|
134
|
+
const min = position.x;
|
|
135
|
+
const max = position.x + fullSize.x;
|
|
136
|
+
if (active) {
|
|
137
|
+
value = LX.clamp((this.mousePosition.x - min) / (max - min), 0.0, 1.0);
|
|
138
|
+
this.components[text].value = value;
|
|
139
|
+
}
|
|
140
|
+
let valueSize = new LX.vec2(fullSize.x * value, size.y);
|
|
141
|
+
ctx.beginPath();
|
|
142
|
+
ctx.fillStyle = hovered ? '#6074e7' : '#3e57e4';
|
|
143
|
+
if (valueSize.x > (fullSize.x - 8)) { // 8: radius
|
|
144
|
+
ctx.roundRect(position.x, position.y, valueSize.x, valueSize.y + padding.y * 2.0, [8, 8, 8, 8]);
|
|
145
|
+
ctx.fill();
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
ctx.fillRect(position.x, position.y, valueSize.x, valueSize.y + padding.y * 2.0);
|
|
149
|
+
}
|
|
150
|
+
// Draw text
|
|
151
|
+
ctx.fillStyle = hovered ? '#fff' : '#ddd';
|
|
152
|
+
ctx.fillText(text, position.x + padding.x, position.y + metrics.actualBoundingBoxAscent + padding.y);
|
|
153
|
+
this.usePointerCursor = this.usePointerCursor || hovered;
|
|
154
|
+
if (active) {
|
|
155
|
+
if (callback)
|
|
156
|
+
callback(value);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* @method Checkbox
|
|
161
|
+
* @param {String} text
|
|
162
|
+
* @param {Number} x
|
|
163
|
+
* @param {Number} y
|
|
164
|
+
* @param {Number} value
|
|
165
|
+
*/
|
|
166
|
+
Checkbox(text, x, y, value = false, callback) {
|
|
167
|
+
const ctx = this.canvas.getContext('2d');
|
|
168
|
+
// Store slider value
|
|
169
|
+
if (!this.components[text]) {
|
|
170
|
+
this.components[text] = { value: value };
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
value = this.components[text].value;
|
|
174
|
+
}
|
|
175
|
+
// Element properties
|
|
176
|
+
let fontSize = 16;
|
|
177
|
+
ctx.font = fontSize + 'px Arial';
|
|
178
|
+
let padding = new LX.vec2(12, 8);
|
|
179
|
+
let position = new LX.vec2(x, y);
|
|
180
|
+
const metrics = ctx.measureText(text);
|
|
181
|
+
let size = new LX.vec2(metrics.width, metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent);
|
|
182
|
+
let boxMargin = 12;
|
|
183
|
+
let fullSize = new LX.vec2(boxMargin * 2.0, 0);
|
|
184
|
+
fullSize.add(size, fullSize);
|
|
185
|
+
// Get mouse state
|
|
186
|
+
const boxStartX = position.x + size.x + padding.x + boxMargin;
|
|
187
|
+
const boxStartY = position.y + padding.y;
|
|
188
|
+
const hovered = this.mousePosition.x >= boxStartX && this.mousePosition.x <= (boxStartX + size.y)
|
|
189
|
+
&& this.mousePosition.y >= boxStartY && this.mousePosition.y <= (boxStartY + size.y);
|
|
190
|
+
const active = hovered && this.mouseDown;
|
|
191
|
+
const pressed = hovered && this.eventClick;
|
|
192
|
+
// Draw button
|
|
193
|
+
ctx.fillStyle = active ? '#666' : (hovered ? '#444' : '#222');
|
|
194
|
+
ctx.fillRect(position.x, position.y, fullSize.x + padding.x * 2.0, fullSize.y + padding.y * 2.0);
|
|
195
|
+
// Draw checkbox
|
|
196
|
+
if (pressed) {
|
|
197
|
+
value = !value;
|
|
198
|
+
this.components[text].value = value;
|
|
199
|
+
if (callback) {
|
|
200
|
+
callback(value);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
ctx.fillStyle = value
|
|
204
|
+
? (active ? '#ddd' : (hovered ? '#6074e7' : '#3e57e4'))
|
|
205
|
+
: (active ? '#bbb' : (hovered ? '#777' : '#888'));
|
|
206
|
+
ctx.fillRect(position.x + size.x + padding.x + boxMargin, position.y + padding.y, size.y, size.y);
|
|
207
|
+
// Draw text
|
|
208
|
+
ctx.fillStyle = hovered ? '#fff' : '#ddd';
|
|
209
|
+
ctx.fillText(text, position.x + padding.x, position.y + metrics.actualBoundingBoxAscent + padding.y);
|
|
210
|
+
this.usePointerCursor = this.usePointerCursor || hovered;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* @method endFrame
|
|
214
|
+
* @description Clears the information stored during the last frame
|
|
215
|
+
*/
|
|
216
|
+
endFrame() {
|
|
217
|
+
delete this.eventClick;
|
|
218
|
+
// Pointer cursor on hover
|
|
219
|
+
document.body.style.cursor = this.usePointerCursor ? 'pointer' : 'default';
|
|
220
|
+
// Clear info
|
|
221
|
+
this.usePointerCursor = false;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
LX.ImUI = ImUI;
|
|
225
|
+
|
|
226
|
+
export { ImUI };
|
|
227
|
+
//# sourceMappingURL=ImUi.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImUi.js","sources":["../../src/extensions/ImUi.ts"],"sourcesContent":["// ImUI.ts @jxarco\r\n\r\nimport { LX } from '../core/Namespace';\r\n\r\nif( !LX )\r\n{\r\n throw( \"Missing LX namespace!\" );\r\n}\r\n\r\nLX.extensions.push( 'ImUI' );\r\n\r\nconst vec2 = LX.vec2;\r\n\r\n/**\r\n * @class ImUI\r\n */\r\n\r\nexport class ImUI\r\n{\r\n root: any;\r\n canvas: any;\r\n\r\n // Components\r\n components: any = {};\r\n\r\n // Mouse state\r\n mouseDown: boolean = false;\r\n mousePosition: typeof vec2 = new vec2();\r\n usePointerCursor: boolean = false;\r\n eventClick: MouseEvent | undefined = undefined;\r\n\r\n\r\n constructor( canvas: HTMLCanvasElement, options: any = {} )\r\n {\r\n console.assert( canvas !== undefined );\r\n \r\n // To capture key events\r\n canvas.tabIndex = -1;\r\n \r\n canvas.addEventListener( 'keydown', this._processKey.bind(this), true);\r\n canvas.addEventListener( 'mousedown', this._processMouse.bind(this) );\r\n canvas.addEventListener( 'mouseup', this._processMouse.bind(this) );\r\n canvas.addEventListener( 'mousemove', this._processMouse.bind(this) );\r\n canvas.addEventListener( 'click', this._processMouse.bind(this) );\r\n \r\n // this.font = new FontFace(\"Ubuntu\", \"url(../data/Ubuntu-Bold.ttf)\");\r\n // this.font.load().then(\r\n // ( font ) => {\r\n // document.fonts.add( font );\r\n // if( options.onready ) options.onready();\r\n // },\r\n // (err) => {\r\n // console.error(err);\r\n // },\r\n // );\r\n\r\n this.root = this.canvas = canvas;\r\n }\r\n\r\n _processKey( e: KeyboardEvent )\r\n {\r\n const detail: any = e.detail;\r\n const key = e.key ?? detail.key;\r\n console.log( key );\r\n }\r\n\r\n _processMouse( e: MouseEvent )\r\n {\r\n if( e.type == 'mousedown' )\r\n {\r\n this.mouseDown = true;\r\n }\r\n \r\n else if( e.type == 'mouseup' )\r\n {\r\n this._processClick(e);\r\n this.mouseDown = false;\r\n }\r\n\r\n else if( e.type == 'mousemove' )\r\n {\r\n this.mousePosition.set( e.clientX, e.clientY );\r\n }\r\n }\r\n\r\n _processClick( e: MouseEvent )\r\n {\r\n this.eventClick = e;\r\n }\r\n\r\n /**\r\n * @method Button\r\n * @param {String} text\r\n * @param {Number} x\r\n * @param {Number} y\r\n */\r\n\r\n Button( text: string, x: number, y: number, callback: any )\r\n {\r\n const ctx = this.canvas.getContext(\"2d\");\r\n\r\n // Element properties\r\n\r\n let fontSize = 16;\r\n ctx.font = fontSize + \"px Arial\";\r\n\r\n let padding = new LX.vec2( 12, 8 );\r\n let position = new LX.vec2( x, y );\r\n\r\n const metrics = ctx.measureText( text );\r\n let size = new LX.vec2( metrics.width, metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent );\r\n\r\n // Get mouse state\r\n\r\n const hovered = this.mousePosition.x >= position.x && this.mousePosition.x <= (position.x + size.x + padding.x * 2.0)\r\n && this.mousePosition.y >= position.y && this.mousePosition.y <= (position.y + size.y + padding.y * 2.0);\r\n\r\n const active = hovered && this.mouseDown;\r\n\r\n // Draw button\r\n\r\n ctx.beginPath();\r\n ctx.fillStyle = active ? \"#666\" : (hovered ? \"#444\" : \"#222\");\r\n ctx.roundRect( position.x, position.y, size.x + padding.x * 2.0, size.y + padding.y * 2.0, [8, 8, 8, 8] );\r\n ctx.fill();\r\n\r\n // Draw text\r\n\r\n ctx.fillStyle = hovered ? \"#fff\" : \"#ddd\";\r\n ctx.fillText( text, position.x + padding.x, position.y + metrics.actualBoundingBoxAscent + padding.y );\r\n\r\n this.usePointerCursor = this.usePointerCursor || hovered;\r\n\r\n if( this.eventClick )\r\n {\r\n if(callback) callback();\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * @method Slider\r\n * @param {String} text\r\n * @param {Number} x\r\n * @param {Number} y\r\n * @param {Number} value\r\n */\r\n\r\n Slider( text: string, x: number, y: number, value: number = 0, callback: any )\r\n {\r\n const ctx = this.canvas.getContext(\"2d\");\r\n\r\n // Store slider value\r\n \r\n if( !this.components[ text ] )\r\n {\r\n this.components[ text ] = { value: value };\r\n }\r\n else\r\n {\r\n value = this.components[ text ].value;\r\n }\r\n\r\n // Element properties\r\n\r\n let fontSize = 16;\r\n ctx.font = fontSize + \"px Arial\";\r\n\r\n let padding = new LX.vec2( 12, 8 );\r\n let position = new LX.vec2( x, y );\r\n\r\n const metrics = ctx.measureText( text );\r\n let size = new LX.vec2( metrics.width, metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent );\r\n let fullSize = size.add( padding.mul( 2.0 ) );\r\n\r\n // Get mouse state\r\n\r\n const hovered = this.mousePosition.x >= position.x && this.mousePosition.x <= (position.x + fullSize.x)\r\n && this.mousePosition.y >= position.y && this.mousePosition.y <= (position.y + fullSize.y);\r\n\r\n const active = hovered && this.mouseDown;\r\n\r\n // Draw box\r\n\r\n ctx.beginPath();\r\n ctx.fillStyle = hovered ? \"#444\" : \"#222\";\r\n ctx.roundRect( position.x, position.y, fullSize.x, fullSize.y, [8, 8, 8, 8] );\r\n ctx.fill();\r\n\r\n // Draw value\r\n\r\n const min = position.x;\r\n const max = position.x + fullSize.x;\r\n\r\n if( active )\r\n {\r\n value = LX.clamp((this.mousePosition.x - min) / (max - min), 0.0, 1.0);\r\n this.components[ text ].value = value;\r\n }\r\n \r\n let valueSize = new LX.vec2( fullSize.x * value, size.y );\r\n\r\n ctx.beginPath();\r\n ctx.fillStyle = hovered ? \"#6074e7\" : \"#3e57e4\";\r\n if( valueSize.x > ( fullSize.x - 8 ) ) // 8: radius\r\n {\r\n ctx.roundRect( position.x, position.y, valueSize.x, valueSize.y + padding.y * 2.0, [8, 8, 8, 8] );\r\n ctx.fill(); \r\n }\r\n else\r\n {\r\n ctx.fillRect( position.x, position.y, valueSize.x, valueSize.y + padding.y * 2.0 );\r\n }\r\n\r\n // Draw text\r\n\r\n ctx.fillStyle = hovered ? \"#fff\" : \"#ddd\";\r\n ctx.fillText( text, position.x + padding.x, position.y + metrics.actualBoundingBoxAscent + padding.y );\r\n\r\n this.usePointerCursor = this.usePointerCursor || hovered;\r\n\r\n if( active )\r\n {\r\n if(callback) callback( value );\r\n }\r\n }\r\n\r\n /**\r\n * @method Checkbox\r\n * @param {String} text\r\n * @param {Number} x\r\n * @param {Number} y\r\n * @param {Number} value\r\n */\r\n\r\n Checkbox( text: string, x: number, y: number, value: boolean = false, callback: any )\r\n {\r\n const ctx = this.canvas.getContext(\"2d\");\r\n\r\n // Store slider value\r\n \r\n if( !this.components[ text ] )\r\n {\r\n this.components[ text ] = { value: value };\r\n }\r\n else\r\n {\r\n value = this.components[ text ].value;\r\n }\r\n\r\n // Element properties\r\n\r\n let fontSize = 16;\r\n ctx.font = fontSize + \"px Arial\";\r\n\r\n let padding = new LX.vec2( 12, 8 );\r\n let position = new LX.vec2( x, y );\r\n\r\n const metrics = ctx.measureText( text );\r\n let size = new LX.vec2( metrics.width, metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent );\r\n\r\n let boxMargin = 12;\r\n let fullSize = new LX.vec2(boxMargin * 2.0, 0);\r\n fullSize.add( size, fullSize );\r\n\r\n // Get mouse state\r\n\r\n const boxStartX = position.x + size.x + padding.x + boxMargin;\r\n const boxStartY = position.y + padding.y;\r\n const hovered = this.mousePosition.x >= boxStartX && this.mousePosition.x <= (boxStartX + size.y)\r\n && this.mousePosition.y >= boxStartY && this.mousePosition.y <= (boxStartY + size.y);\r\n\r\n const active = hovered && this.mouseDown;\r\n const pressed = hovered && this.eventClick;\r\n\r\n // Draw button\r\n\r\n ctx.fillStyle = active ? \"#666\" : (hovered ? \"#444\" : \"#222\");\r\n ctx.fillRect( position.x, position.y, fullSize.x + padding.x * 2.0, fullSize.y + padding.y * 2.0 );\r\n\r\n // Draw checkbox\r\n\r\n if( pressed )\r\n {\r\n value = !value;\r\n this.components[ text ].value = value;\r\n if( callback )\r\n {\r\n callback( value );\r\n }\r\n }\r\n\r\n ctx.fillStyle = value ? (active ? \"#ddd\" : (hovered ? \"#6074e7\" : \"#3e57e4\")) : \r\n (active ? \"#bbb\" : (hovered ? \"#777\" : \"#888\"));\r\n ctx.fillRect( position.x + size.x + padding.x + boxMargin, position.y + padding.y, size.y, size.y );\r\n\r\n // Draw text\r\n\r\n ctx.fillStyle = hovered ? \"#fff\" : \"#ddd\";\r\n ctx.fillText( text, position.x + padding.x, position.y + metrics.actualBoundingBoxAscent + padding.y );\r\n\r\n this.usePointerCursor = this.usePointerCursor || hovered;\r\n }\r\n\r\n /**\r\n * @method endFrame\r\n * @description Clears the information stored during the last frame\r\n */\r\n\r\n endFrame() {\r\n\r\n delete this.eventClick;\r\n\r\n // Pointer cursor on hover\r\n document.body.style.cursor = this.usePointerCursor ? \"pointer\" : \"default\";\r\n\r\n // Clear info\r\n this.usePointerCursor = false;\r\n }\r\n}\r\n\r\nLX.ImUI = ImUI;"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ImUi.js","sources":["../../src/extensions/ImUi.ts"],"sourcesContent":["// ImUI.ts @jxarco\r\n\r\nimport { LX } from '../core/Namespace';\r\n\r\nif ( !LX )\r\n{\r\n throw ( 'Missing LX namespace!' );\r\n}\r\n\r\nLX.extensions.push( 'ImUI' );\r\n\r\nconst vec2 = LX.vec2;\r\n\r\n/**\r\n * @class ImUI\r\n */\r\n\r\nexport class ImUI\r\n{\r\n root: any;\r\n canvas: any;\r\n\r\n // Components\r\n components: any = {};\r\n\r\n // Mouse state\r\n mouseDown: boolean = false;\r\n mousePosition: typeof vec2 = new vec2();\r\n usePointerCursor: boolean = false;\r\n eventClick: MouseEvent | undefined = undefined;\r\n\r\n constructor( canvas: HTMLCanvasElement, options: any = {} )\r\n {\r\n console.assert( canvas !== undefined );\r\n\r\n // To capture key events\r\n canvas.tabIndex = -1;\r\n\r\n canvas.addEventListener( 'keydown', this._processKey.bind( this ), true );\r\n canvas.addEventListener( 'mousedown', this._processMouse.bind( this ) );\r\n canvas.addEventListener( 'mouseup', this._processMouse.bind( this ) );\r\n canvas.addEventListener( 'mousemove', this._processMouse.bind( this ) );\r\n canvas.addEventListener( 'click', this._processMouse.bind( this ) );\r\n\r\n // this.font = new FontFace(\"Ubuntu\", \"url(../data/Ubuntu-Bold.ttf)\");\r\n // this.font.load().then(\r\n // ( font ) => {\r\n // document.fonts.add( font );\r\n // if( options.onready ) options.onready();\r\n // },\r\n // (err) => {\r\n // console.error(err);\r\n // },\r\n // );\r\n\r\n this.root = this.canvas = canvas;\r\n }\r\n\r\n _processKey( e: KeyboardEvent )\r\n {\r\n const detail: any = e.detail;\r\n const key = e.key ?? detail.key;\r\n console.log( key );\r\n }\r\n\r\n _processMouse( e: MouseEvent )\r\n {\r\n if ( e.type == 'mousedown' )\r\n {\r\n this.mouseDown = true;\r\n }\r\n else if ( e.type == 'mouseup' )\r\n {\r\n this._processClick( e );\r\n this.mouseDown = false;\r\n }\r\n else if ( e.type == 'mousemove' )\r\n {\r\n this.mousePosition.set( e.clientX, e.clientY );\r\n }\r\n }\r\n\r\n _processClick( e: MouseEvent )\r\n {\r\n this.eventClick = e;\r\n }\r\n\r\n /**\r\n * @method Button\r\n * @param {String} text\r\n * @param {Number} x\r\n * @param {Number} y\r\n */\r\n\r\n Button( text: string, x: number, y: number, callback: any )\r\n {\r\n const ctx = this.canvas.getContext( '2d' );\r\n\r\n // Element properties\r\n\r\n let fontSize = 16;\r\n ctx.font = fontSize + 'px Arial';\r\n\r\n let padding = new LX.vec2( 12, 8 );\r\n let position = new LX.vec2( x, y );\r\n\r\n const metrics = ctx.measureText( text );\r\n let size = new LX.vec2( metrics.width, metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent );\r\n\r\n // Get mouse state\r\n\r\n const hovered = this.mousePosition.x >= position.x\r\n && this.mousePosition.x <= ( position.x + size.x + padding.x * 2.0 )\r\n && this.mousePosition.y >= position.y && this.mousePosition.y <= ( position.y + size.y + padding.y * 2.0 );\r\n\r\n const active = hovered && this.mouseDown;\r\n\r\n // Draw button\r\n\r\n ctx.beginPath();\r\n ctx.fillStyle = active ? '#666' : ( hovered ? '#444' : '#222' );\r\n ctx.roundRect( position.x, position.y, size.x + padding.x * 2.0, size.y + padding.y * 2.0, [ 8, 8, 8, 8 ] );\r\n ctx.fill();\r\n\r\n // Draw text\r\n\r\n ctx.fillStyle = hovered ? '#fff' : '#ddd';\r\n ctx.fillText( text, position.x + padding.x, position.y + metrics.actualBoundingBoxAscent + padding.y );\r\n\r\n this.usePointerCursor = this.usePointerCursor || hovered;\r\n\r\n if ( this.eventClick )\r\n {\r\n if ( callback ) callback();\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * @method Slider\r\n * @param {String} text\r\n * @param {Number} x\r\n * @param {Number} y\r\n * @param {Number} value\r\n */\r\n\r\n Slider( text: string, x: number, y: number, value: number = 0, callback: any )\r\n {\r\n const ctx = this.canvas.getContext( '2d' );\r\n\r\n // Store slider value\r\n\r\n if ( !this.components[text] )\r\n {\r\n this.components[text] = { value: value };\r\n }\r\n else\r\n {\r\n value = this.components[text].value;\r\n }\r\n\r\n // Element properties\r\n\r\n let fontSize = 16;\r\n ctx.font = fontSize + 'px Arial';\r\n\r\n let padding = new LX.vec2( 12, 8 );\r\n let position = new LX.vec2( x, y );\r\n\r\n const metrics = ctx.measureText( text );\r\n let size = new LX.vec2( metrics.width, metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent );\r\n let fullSize = size.add( padding.mul( 2.0 ) );\r\n\r\n // Get mouse state\r\n\r\n const hovered = this.mousePosition.x >= position.x && this.mousePosition.x <= ( position.x + fullSize.x )\r\n && this.mousePosition.y >= position.y && this.mousePosition.y <= ( position.y + fullSize.y );\r\n\r\n const active = hovered && this.mouseDown;\r\n\r\n // Draw box\r\n\r\n ctx.beginPath();\r\n ctx.fillStyle = hovered ? '#444' : '#222';\r\n ctx.roundRect( position.x, position.y, fullSize.x, fullSize.y, [ 8, 8, 8, 8 ] );\r\n ctx.fill();\r\n\r\n // Draw value\r\n\r\n const min = position.x;\r\n const max = position.x + fullSize.x;\r\n\r\n if ( active )\r\n {\r\n value = LX.clamp( ( this.mousePosition.x - min ) / ( max - min ), 0.0, 1.0 );\r\n this.components[text].value = value;\r\n }\r\n\r\n let valueSize = new LX.vec2( fullSize.x * value, size.y );\r\n\r\n ctx.beginPath();\r\n ctx.fillStyle = hovered ? '#6074e7' : '#3e57e4';\r\n if ( valueSize.x > ( fullSize.x - 8 ) )\r\n { // 8: radius\r\n ctx.roundRect( position.x, position.y, valueSize.x, valueSize.y + padding.y * 2.0, [ 8, 8, 8, 8 ] );\r\n ctx.fill();\r\n }\r\n else\r\n {\r\n ctx.fillRect( position.x, position.y, valueSize.x, valueSize.y + padding.y * 2.0 );\r\n }\r\n\r\n // Draw text\r\n\r\n ctx.fillStyle = hovered ? '#fff' : '#ddd';\r\n ctx.fillText( text, position.x + padding.x, position.y + metrics.actualBoundingBoxAscent + padding.y );\r\n\r\n this.usePointerCursor = this.usePointerCursor || hovered;\r\n\r\n if ( active )\r\n {\r\n if ( callback ) callback( value );\r\n }\r\n }\r\n\r\n /**\r\n * @method Checkbox\r\n * @param {String} text\r\n * @param {Number} x\r\n * @param {Number} y\r\n * @param {Number} value\r\n */\r\n\r\n Checkbox( text: string, x: number, y: number, value: boolean = false, callback: any )\r\n {\r\n const ctx = this.canvas.getContext( '2d' );\r\n\r\n // Store slider value\r\n\r\n if ( !this.components[text] )\r\n {\r\n this.components[text] = { value: value };\r\n }\r\n else\r\n {\r\n value = this.components[text].value;\r\n }\r\n\r\n // Element properties\r\n\r\n let fontSize = 16;\r\n ctx.font = fontSize + 'px Arial';\r\n\r\n let padding = new LX.vec2( 12, 8 );\r\n let position = new LX.vec2( x, y );\r\n\r\n const metrics = ctx.measureText( text );\r\n let size = new LX.vec2( metrics.width, metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent );\r\n\r\n let boxMargin = 12;\r\n let fullSize = new LX.vec2( boxMargin * 2.0, 0 );\r\n fullSize.add( size, fullSize );\r\n\r\n // Get mouse state\r\n\r\n const boxStartX = position.x + size.x + padding.x + boxMargin;\r\n const boxStartY = position.y + padding.y;\r\n const hovered = this.mousePosition.x >= boxStartX && this.mousePosition.x <= ( boxStartX + size.y )\r\n && this.mousePosition.y >= boxStartY && this.mousePosition.y <= ( boxStartY + size.y );\r\n\r\n const active = hovered && this.mouseDown;\r\n const pressed = hovered && this.eventClick;\r\n\r\n // Draw button\r\n\r\n ctx.fillStyle = active ? '#666' : ( hovered ? '#444' : '#222' );\r\n ctx.fillRect( position.x, position.y, fullSize.x + padding.x * 2.0, fullSize.y + padding.y * 2.0 );\r\n\r\n // Draw checkbox\r\n\r\n if ( pressed )\r\n {\r\n value = !value;\r\n this.components[text].value = value;\r\n if ( callback )\r\n {\r\n callback( value );\r\n }\r\n }\r\n\r\n ctx.fillStyle = value\r\n ? ( active ? '#ddd' : ( hovered ? '#6074e7' : '#3e57e4' ) )\r\n : ( active ? '#bbb' : ( hovered ? '#777' : '#888' ) );\r\n ctx.fillRect( position.x + size.x + padding.x + boxMargin, position.y + padding.y, size.y, size.y );\r\n\r\n // Draw text\r\n\r\n ctx.fillStyle = hovered ? '#fff' : '#ddd';\r\n ctx.fillText( text, position.x + padding.x, position.y + metrics.actualBoundingBoxAscent + padding.y );\r\n\r\n this.usePointerCursor = this.usePointerCursor || hovered;\r\n }\r\n\r\n /**\r\n * @method endFrame\r\n * @description Clears the information stored during the last frame\r\n */\r\n\r\n endFrame()\r\n {\r\n delete this.eventClick;\r\n\r\n // Pointer cursor on hover\r\n document.body.style.cursor = this.usePointerCursor ? 'pointer' : 'default';\r\n\r\n // Clear info\r\n this.usePointerCursor = false;\r\n }\r\n}\r\n\r\nLX.ImUI = ImUI;\r\n"],"names":[],"mappings":"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"}
|