lexgui 0.7.15 → 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/LICENSE +201 -21
- package/README.md +14 -5
- package/build/components/AlertDialog.d.ts +7 -0
- package/build/components/ArrayInput.d.ts +9 -0
- package/build/components/BaseComponent.d.ts +73 -0
- package/build/components/Button.d.ts +14 -0
- package/build/components/Calendar.d.ts +41 -0
- package/build/components/CalendarRange.d.ts +16 -0
- package/build/components/CanvasCurve.d.ts +10 -0
- package/build/components/CanvasDial.d.ts +11 -0
- package/build/components/CanvasMap2D.d.ts +61 -0
- package/build/components/Card.d.ts +8 -0
- package/build/components/Checkbox.d.ts +8 -0
- package/build/components/Color.d.ts +20 -0
- package/build/components/ColorInput.d.ts +13 -0
- package/build/components/ColorPicker.d.ts +29 -0
- package/build/components/ComboButtons.d.ts +8 -0
- package/build/components/ContextMenu.d.ts +16 -0
- package/build/components/Counter.d.ts +9 -0
- package/build/components/Curve.d.ts +10 -0
- package/build/components/DatePicker.d.ts +13 -0
- package/build/components/Dial.d.ts +10 -0
- package/build/components/Dialog.d.ts +20 -0
- package/build/components/DropdownMenu.d.ts +32 -0
- package/build/components/FileInput.d.ts +8 -0
- package/build/components/Footer.d.ts +14 -0
- package/build/components/Form.d.ts +8 -0
- package/build/components/Layers.d.ts +9 -0
- package/build/components/List.d.ts +9 -0
- package/build/components/Map2D.d.ts +12 -0
- package/build/components/Menubar.d.ts +59 -0
- package/build/components/NodeTree.d.ts +26 -0
- package/build/components/NumberInput.d.ts +9 -0
- package/build/components/OTPInput.d.ts +8 -0
- package/build/components/Pad.d.ts +8 -0
- package/build/components/Pagination.d.ts +26 -0
- package/build/components/PocketDialog.d.ts +11 -0
- package/build/components/Popover.d.ts +20 -0
- package/build/components/Progress.d.ts +8 -0
- package/build/components/RadioGroup.d.ts +8 -0
- package/build/components/RangeInput.d.ts +11 -0
- package/build/components/Rate.d.ts +8 -0
- package/build/components/Select.d.ts +10 -0
- package/build/components/Sheet.d.ts +10 -0
- package/build/components/Sidebar.d.ts +84 -0
- package/build/components/SizeInput.d.ts +8 -0
- package/build/components/Skeleton.d.ts +5 -0
- package/build/components/Spinner.d.ts +9 -0
- package/build/components/TabSections.d.ts +11 -0
- package/build/components/Table.d.ts +34 -0
- package/build/components/Tabs.d.ts +20 -0
- package/build/components/Tags.d.ts +9 -0
- package/build/components/TextArea.d.ts +8 -0
- package/build/components/TextInput.d.ts +11 -0
- package/build/components/Title.d.ts +8 -0
- package/build/components/Toggle.d.ts +8 -0
- package/build/components/Tour.d.ts +36 -0
- package/build/components/Vector.d.ts +9 -0
- package/build/core/Area.d.ts +143 -0
- package/build/core/Branch.d.ts +19 -0
- package/build/core/Core.d.ts +1 -0
- package/build/core/Event.d.ts +26 -0
- package/build/core/Icons.d.ts +4 -0
- package/build/core/Namespace.d.ts +2 -0
- package/build/core/Namespace.js +34 -0
- package/build/core/Namespace.js.map +1 -0
- package/build/core/Panel.d.ts +538 -0
- package/build/core/Utils.d.ts +1 -0
- package/build/core/Vec2.d.ts +21 -0
- package/build/extensions/AssetView.d.ts +136 -0
- package/build/extensions/AssetView.js +1367 -0
- package/build/extensions/AssetView.js.map +1 -0
- package/build/extensions/Audio.d.ts +9 -0
- package/build/extensions/Audio.js +163 -0
- package/build/extensions/Audio.js.map +1 -0
- package/build/extensions/CodeEditor.d.ts +350 -0
- package/build/extensions/CodeEditor.js +5022 -0
- package/build/extensions/CodeEditor.js.map +1 -0
- package/build/extensions/DocMaker.d.ts +27 -0
- package/build/extensions/DocMaker.js +327 -0
- package/build/extensions/DocMaker.js.map +1 -0
- package/build/extensions/GraphEditor.d.ts +276 -0
- package/build/extensions/GraphEditor.js +2770 -0
- package/build/extensions/GraphEditor.js.map +1 -0
- package/build/extensions/ImUi.d.ts +46 -0
- package/build/extensions/ImUi.js +227 -0
- package/build/extensions/ImUi.js.map +1 -0
- package/build/extensions/Timeline.d.ts +670 -0
- package/build/extensions/Timeline.js +3955 -0
- package/build/extensions/Timeline.js.map +1 -0
- package/build/extensions/VideoEditor.d.ts +128 -0
- package/build/extensions/VideoEditor.js +898 -0
- package/build/extensions/VideoEditor.js.map +1 -0
- package/build/extensions/index.d.ts +8 -0
- package/build/extensions/index.js +10 -0
- package/build/extensions/index.js.map +1 -0
- package/build/index.all.d.ts +2 -0
- package/build/index.css.d.ts +4 -0
- package/build/index.d.ts +56 -0
- package/build/lexgui.all.js +28498 -0
- package/build/lexgui.all.js.map +1 -0
- package/build/lexgui.all.min.js +1 -0
- package/build/lexgui.all.module.js +28422 -0
- package/build/lexgui.all.module.js.map +1 -0
- package/build/lexgui.all.module.min.js +1 -0
- package/build/lexgui.css +939 -346
- package/build/lexgui.js +13406 -17286
- package/build/lexgui.js.map +1 -0
- package/build/lexgui.min.css +3 -10
- package/build/lexgui.min.js +1 -1
- package/build/lexgui.module.js +12762 -16698
- package/build/lexgui.module.js.map +1 -0
- package/build/lexgui.module.min.js +1 -1
- package/changelog.md +170 -74
- package/demo.js +162 -48
- package/examples/all-components.html +45 -14
- package/examples/asset-view.html +110 -47
- package/examples/code-editor.html +5 -5
- package/examples/dialogs.html +3 -3
- package/examples/editor.html +27 -13
- package/examples/index.html +19 -14
- package/examples/node-graph.html +2 -2
- package/examples/previews/video-editor.png +0 -0
- package/examples/timeline.html +1 -1
- package/examples/video-editor.html +2 -2
- package/package.json +25 -9
- package/build/extensions/audio.js +0 -212
- package/build/extensions/codeeditor.js +0 -6319
- package/build/extensions/docmaker.js +0 -432
- package/build/extensions/imui.js +0 -325
- package/build/extensions/nodegraph.js +0 -3696
- package/build/extensions/timeline.js +0 -4636
- package/build/extensions/videoeditor.js +0 -953
- package/build/lexgui-docs.css +0 -352
|
@@ -0,0 +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 ('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
|
|
@@ -0,0 +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 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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"}
|