lexgui 0.1.33 → 0.1.34
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/build/components/codeeditor.js +1 -1
- package/build/lexgui.css +13 -12
- package/build/lexgui.js +263 -228
- package/build/lexgui.module.js +307 -199
- package/changelog.md +11 -4
- package/demo.js +4 -13
- package/package.json +1 -1
package/build/lexgui.js
CHANGED
|
@@ -12,7 +12,7 @@ console.warn( 'Script "build/lexgui.js" is depracated and will be removed soon.
|
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
14
|
var LX = global.LX = {
|
|
15
|
-
version: "0.1.
|
|
15
|
+
version: "0.1.34",
|
|
16
16
|
ready: false,
|
|
17
17
|
components: [], // specific pre-build components
|
|
18
18
|
signals: {} // events and triggers
|
|
@@ -25,8 +25,11 @@ console.warn( 'Script "build/lexgui.js" is depracated and will be removed soon.
|
|
|
25
25
|
LX.MOUSE_DOUBLE_CLICK = 2;
|
|
26
26
|
LX.MOUSE_TRIPLE_CLICK = 3;
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
LX.CURVE_MOVEOUT_CLAMP = 0;
|
|
29
|
+
LX.CURVE_MOVEOUT_DELETE = 1;
|
|
30
|
+
|
|
31
|
+
function clamp( num, min, max ) { return Math.min( Math.max( num, min ), max ); }
|
|
32
|
+
function round( num, n ) { return +num.toFixed( n ); }
|
|
30
33
|
|
|
31
34
|
function getSupportedDOMName( string )
|
|
32
35
|
{
|
|
@@ -4033,37 +4036,39 @@ console.warn( 'Script "build/lexgui.js" is depracated and will be removed soon.
|
|
|
4033
4036
|
|
|
4034
4037
|
addDropdown( name, values, value, callback, options = {} ) {
|
|
4035
4038
|
|
|
4036
|
-
let widget = this.create_widget(name, Widget.DROPDOWN, options);
|
|
4039
|
+
let widget = this.create_widget( name, Widget.DROPDOWN, options );
|
|
4040
|
+
|
|
4037
4041
|
widget.onGetValue = () => {
|
|
4038
|
-
return element.querySelector("li.selected").getAttribute('value');
|
|
4042
|
+
return element.querySelector( "li.selected" ).getAttribute( 'value' );
|
|
4039
4043
|
};
|
|
4044
|
+
|
|
4040
4045
|
widget.onSetValue = ( newValue, skipCallback ) => {
|
|
4041
|
-
let btn = element.querySelector(".lexwidgetname .lexicon");
|
|
4042
|
-
if(btn) btn.style.display = (newValue != wValue.iValue ? "block" : "none");
|
|
4046
|
+
let btn = element.querySelector( ".lexwidgetname .lexicon" );
|
|
4047
|
+
if( btn ) btn.style.display = ( newValue != wValue.iValue ? "block" : "none" );
|
|
4043
4048
|
value = newValue;
|
|
4044
|
-
list.querySelectorAll('li').forEach( e => { if( e.getAttribute('value') == value ) e.click() } );
|
|
4045
|
-
if( !skipCallback ) this._trigger( new IEvent(name, value, null), callback );
|
|
4049
|
+
list.querySelectorAll( 'li' ).forEach( e => { if( e.getAttribute('value') == value ) e.click() } );
|
|
4050
|
+
if( !skipCallback ) this._trigger( new IEvent( name, value, null ), callback );
|
|
4046
4051
|
};
|
|
4047
4052
|
|
|
4048
4053
|
let element = widget.domEl;
|
|
4049
4054
|
let that = this;
|
|
4050
4055
|
|
|
4051
4056
|
// Add reset functionality
|
|
4052
|
-
if(widget.name && !(options.skipReset ?? false))
|
|
4057
|
+
if(widget.name && !( options.skipReset ?? false ))
|
|
4053
4058
|
{
|
|
4054
|
-
Panel._add_reset_property(element.domName, function() {
|
|
4059
|
+
Panel._add_reset_property( element.domName, function() {
|
|
4055
4060
|
value = wValue.iValue;
|
|
4056
|
-
list.querySelectorAll('li').forEach( e => { if( e.getAttribute('value') == value ) e.click() } );
|
|
4061
|
+
list.querySelectorAll( 'li' ).forEach( e => { if( e.getAttribute('value') == value ) e.click() } );
|
|
4057
4062
|
this.style.display = "none";
|
|
4058
4063
|
});
|
|
4059
4064
|
}
|
|
4060
4065
|
|
|
4061
|
-
let container = document.createElement('div');
|
|
4066
|
+
let container = document.createElement( 'div' );
|
|
4062
4067
|
container.className = "lexdropdown";
|
|
4063
4068
|
container.style.width = options.inputWidth || "calc( 100% - " + LX.DEFAULT_NAME_WIDTH + ")";
|
|
4064
|
-
|
|
4069
|
+
|
|
4065
4070
|
// Add widget value
|
|
4066
|
-
let wValue = document.createElement('div');
|
|
4071
|
+
let wValue = document.createElement( 'div' );
|
|
4067
4072
|
wValue.className = "lexdropdown lexoption";
|
|
4068
4073
|
wValue.name = name;
|
|
4069
4074
|
wValue.iValue = value;
|
|
@@ -4074,14 +4079,15 @@ console.warn( 'Script "build/lexgui.js" is depracated and will be removed soon.
|
|
|
4074
4079
|
|
|
4075
4080
|
this.queue(container);
|
|
4076
4081
|
|
|
4077
|
-
let selectedOption = this.addButton(null, buttonName, (value, event) => {
|
|
4082
|
+
let selectedOption = this.addButton( null, buttonName, (value, event) => {
|
|
4078
4083
|
if( list.unfocus_event ) {
|
|
4079
4084
|
delete list.unfocus_event;
|
|
4080
4085
|
return;
|
|
4081
4086
|
}
|
|
4082
|
-
|
|
4083
|
-
|
|
4084
|
-
|
|
4087
|
+
const topPosition = selectedOption.getBoundingClientRect().y;
|
|
4088
|
+
list.style.top = (topPosition + selectedOption.offsetHeight) + 'px';
|
|
4089
|
+
list.style.width = (event.currentTarget.clientWidth) + 'px';
|
|
4090
|
+
list.toggleAttribute('hidden');
|
|
4085
4091
|
list.focus();
|
|
4086
4092
|
}, { buttonClass: 'array', skipInlineCount: true });
|
|
4087
4093
|
|
|
@@ -4225,7 +4231,14 @@ console.warn( 'Script "build/lexgui.js" is depracated and will be removed soon.
|
|
|
4225
4231
|
* @param {Function} callback Callback function on change
|
|
4226
4232
|
* @param {*} options:
|
|
4227
4233
|
* skipReset: Don't add the reset value button when value changes
|
|
4228
|
-
|
|
4234
|
+
* bgColor: Widget background color
|
|
4235
|
+
* pointsColor: Curve points color
|
|
4236
|
+
* lineColor: Curve line color
|
|
4237
|
+
* noOverlap: Points do not overlap, replacing themselves if necessary
|
|
4238
|
+
* allowAddValues: Support adding values on click
|
|
4239
|
+
* smooth: Curve smoothness
|
|
4240
|
+
* moveOutAction: Clamp or delete points moved out of the curve (LX.CURVE_MOVEOUT_CLAMP, LX.CURVE_MOVEOUT_DELETE)
|
|
4241
|
+
*/
|
|
4229
4242
|
|
|
4230
4243
|
addCurve( name, values, callback, options = {} ) {
|
|
4231
4244
|
|
|
@@ -4235,34 +4248,36 @@ console.warn( 'Script "build/lexgui.js" is depracated and will be removed soon.
|
|
|
4235
4248
|
|
|
4236
4249
|
let that = this;
|
|
4237
4250
|
let widget = this.create_widget(name, Widget.CURVE, options);
|
|
4251
|
+
|
|
4238
4252
|
widget.onGetValue = () => {
|
|
4239
|
-
return JSON.parse(JSON.stringify(
|
|
4253
|
+
return JSON.parse(JSON.stringify(curveInstance.element.value));
|
|
4240
4254
|
};
|
|
4255
|
+
|
|
4241
4256
|
widget.onSetValue = ( newValue, skipCallback ) => {
|
|
4242
|
-
let btn = element.querySelector(".lexwidgetname .lexicon");
|
|
4243
|
-
if(btn) btn.style.display = (newValue !=
|
|
4244
|
-
|
|
4245
|
-
|
|
4246
|
-
if( !skipCallback ) that._trigger( new IEvent(name,
|
|
4257
|
+
let btn = element.querySelector( ".lexwidgetname .lexicon" );
|
|
4258
|
+
if( btn ) btn.style.display = ( newValue != curveInstance.element.value ? "block" : "none" );
|
|
4259
|
+
curveInstance.element.value = JSON.parse( JSON.stringify( newValue ) );
|
|
4260
|
+
curveInstance.redraw();
|
|
4261
|
+
if( !skipCallback ) that._trigger( new IEvent( name, curveInstance.element.value, null ), callback );
|
|
4247
4262
|
};
|
|
4248
4263
|
|
|
4249
4264
|
let element = widget.domEl;
|
|
4250
|
-
let defaultValues = JSON.parse(JSON.stringify(values));
|
|
4265
|
+
let defaultValues = JSON.parse( JSON.stringify( values ) );
|
|
4251
4266
|
|
|
4252
4267
|
// Add reset functionality
|
|
4253
4268
|
if( !(options.skipReset ?? false) )
|
|
4254
4269
|
{
|
|
4255
4270
|
Panel._add_reset_property(element.domName, function(e) {
|
|
4256
4271
|
this.style.display = "none";
|
|
4257
|
-
|
|
4258
|
-
|
|
4259
|
-
that._trigger( new IEvent(name,
|
|
4272
|
+
curveInstance.element.value = JSON.parse( JSON.stringify( defaultValues ) );
|
|
4273
|
+
curveInstance.redraw();
|
|
4274
|
+
that._trigger( new IEvent( name, curveInstance.element.value, e ), callback );
|
|
4260
4275
|
});
|
|
4261
4276
|
}
|
|
4262
4277
|
|
|
4263
4278
|
// Add widget value
|
|
4264
4279
|
|
|
4265
|
-
var container = document.createElement('div');
|
|
4280
|
+
var container = document.createElement( 'div' );
|
|
4266
4281
|
container.className = "lexcurve";
|
|
4267
4282
|
container.style.width = "calc( 100% - " + LX.DEFAULT_NAME_WIDTH + ")";
|
|
4268
4283
|
|
|
@@ -4271,16 +4286,18 @@ console.warn( 'Script "build/lexgui.js" is depracated and will be removed soon.
|
|
|
4271
4286
|
if(btn) btn.style.display = (v != defaultValues ? "block" : "none");
|
|
4272
4287
|
that._trigger( new IEvent(name, v, e), callback );
|
|
4273
4288
|
};
|
|
4289
|
+
|
|
4274
4290
|
options.name = name;
|
|
4275
|
-
|
|
4276
|
-
|
|
4277
|
-
|
|
4291
|
+
|
|
4292
|
+
let curveInstance = new Curve( this, values, options );
|
|
4293
|
+
container.appendChild( curveInstance.element );
|
|
4294
|
+
element.appendChild( container );
|
|
4278
4295
|
|
|
4279
4296
|
// Resize
|
|
4280
|
-
|
|
4281
|
-
|
|
4282
|
-
widget.onresize =
|
|
4283
|
-
widget.
|
|
4297
|
+
curveInstance.canvas.width = container.offsetWidth;
|
|
4298
|
+
curveInstance.redraw();
|
|
4299
|
+
widget.onresize = curveInstance.redraw.bind( curveInstance );
|
|
4300
|
+
widget.curveInstance = curveInstance;
|
|
4284
4301
|
return widget;
|
|
4285
4302
|
}
|
|
4286
4303
|
|
|
@@ -4729,19 +4746,19 @@ console.warn( 'Script "build/lexgui.js" is depracated and will be removed soon.
|
|
|
4729
4746
|
flag.id = "checkbox"+simple_guidGenerator();
|
|
4730
4747
|
flag.innerHTML = "<a class='fa-solid fa-check' style='display: " + (flag.value ? "block" : "none") + "'></a>";
|
|
4731
4748
|
|
|
4732
|
-
if(options.disabled) {
|
|
4749
|
+
if( options.disabled ) {
|
|
4733
4750
|
flag.disabled = true;
|
|
4734
4751
|
toggle.className += " disabled";
|
|
4735
4752
|
}
|
|
4736
4753
|
|
|
4737
|
-
toggle.appendChild(flag);
|
|
4754
|
+
toggle.appendChild( flag );
|
|
4738
4755
|
|
|
4739
|
-
let value_name = document.createElement('span');
|
|
4756
|
+
let value_name = document.createElement( 'span' );
|
|
4740
4757
|
value_name.id = "checkboxtext";
|
|
4741
4758
|
value_name.innerHTML = "On";
|
|
4742
4759
|
|
|
4743
|
-
container.appendChild(toggle);
|
|
4744
|
-
container.appendChild(value_name);
|
|
4760
|
+
container.appendChild( toggle );
|
|
4761
|
+
container.appendChild( value_name );
|
|
4745
4762
|
|
|
4746
4763
|
toggle.addEventListener( "click" , e => {
|
|
4747
4764
|
|
|
@@ -4749,7 +4766,7 @@ console.warn( 'Script "build/lexgui.js" is depracated and will be removed soon.
|
|
|
4749
4766
|
if( flag.disabled )
|
|
4750
4767
|
return;
|
|
4751
4768
|
|
|
4752
|
-
const skipCallback = (e.detail.constructor == Number ? null :
|
|
4769
|
+
const skipCallback = ( e.detail.constructor == Number ? null : e.detail );
|
|
4753
4770
|
|
|
4754
4771
|
let check = toggle.querySelector( ".checkbox a" );
|
|
4755
4772
|
|
|
@@ -6404,78 +6421,80 @@ console.warn( 'Script "build/lexgui.js" is depracated and will be removed soon.
|
|
|
6404
6421
|
|
|
6405
6422
|
class Curve {
|
|
6406
6423
|
|
|
6407
|
-
constructor(panel, value, options = {}) {
|
|
6408
|
-
|
|
6409
|
-
let element = document.createElement("div");
|
|
6410
|
-
element.className = "curve " + (options.className ? options.className : "");
|
|
6424
|
+
constructor( panel, value, options = {} ) {
|
|
6425
|
+
|
|
6426
|
+
let element = document.createElement( "div" );
|
|
6427
|
+
element.className = "curve " + ( options.className ? options.className : "" );
|
|
6411
6428
|
element.style.minHeight = "50px";
|
|
6412
6429
|
element.style.width = options.width || "100%";
|
|
6413
|
-
|
|
6414
|
-
element.bgcolor = options.bgcolor || LX.getThemeColor("global-dark-background");
|
|
6415
|
-
element.pointscolor = options.pointscolor || LX.getThemeColor("global-selected-light");
|
|
6416
|
-
element.linecolor = options.linecolor || "#555";
|
|
6417
|
-
|
|
6418
|
-
element.value = value || [];
|
|
6419
|
-
element.xrange = options.xrange || [0,1]; //min,max
|
|
6420
|
-
element.yrange = options.yrange || [0,1]; //min,max
|
|
6421
|
-
element.defaulty = options.defaulty != null ? options.defaulty : 0.0;
|
|
6422
|
-
element.no_trespassing = options.no_trespassing || false;
|
|
6423
|
-
element.show_samples = options.show_samples || 0;
|
|
6424
|
-
element.allow_add_values = options.allow_add_values ?? true;
|
|
6425
|
-
element.draggable_x = options.draggable_x ?? true;
|
|
6426
|
-
element.draggable_y = options.draggable_y ?? true;
|
|
6427
|
-
element.smooth = (options.smooth && typeof(options.smooth) == 'number' ? options.smooth : 0.3) || false;
|
|
6428
|
-
element.options = options;
|
|
6429
6430
|
element.style.minWidth = "50px";
|
|
6430
6431
|
element.style.minHeight = "20px";
|
|
6431
|
-
|
|
6432
|
+
|
|
6433
|
+
element.bgcolor = options.bgColor || LX.getThemeColor( "global-dark-background" );
|
|
6434
|
+
element.pointscolor = options.pointsColor || LX.getThemeColor( "global-selected-light" );
|
|
6435
|
+
element.linecolor = options.lineColor || "#555";
|
|
6436
|
+
element.value = value || [];
|
|
6437
|
+
element.xrange = options.xrange || [ 0, 1 ]; // min, max
|
|
6438
|
+
element.yrange = options.yrange || [ 0, 1 ]; // min, max
|
|
6439
|
+
element.defaulty = options.defaulty != null ? options.defaulty : 0.0;
|
|
6440
|
+
element.no_overlap = options.noOverlap || false;
|
|
6441
|
+
element.show_samples = options.showSamples || 0;
|
|
6442
|
+
element.allow_add_values = options.allowAddValues ?? true;
|
|
6443
|
+
element.draggable_x = options.draggableX ?? true;
|
|
6444
|
+
element.draggable_y = options.draggableY ?? true;
|
|
6445
|
+
element.smooth = (options.smooth && typeof( options.smooth ) == 'number' ? options.smooth : 0.3) || false;
|
|
6446
|
+
element.move_out = options.moveOutAction ?? LX.CURVE_MOVEOUT_DELETE;
|
|
6447
|
+
|
|
6432
6448
|
this.element = element;
|
|
6433
|
-
|
|
6434
|
-
let canvas = document.createElement("canvas");
|
|
6449
|
+
|
|
6450
|
+
let canvas = document.createElement( "canvas" );
|
|
6435
6451
|
canvas.width = options.width || 200;
|
|
6436
6452
|
canvas.height = options.height || 50;
|
|
6437
6453
|
element.appendChild( canvas );
|
|
6438
6454
|
this.canvas = canvas;
|
|
6439
|
-
|
|
6440
|
-
element.addEventListener("mousedown", onmousedown);
|
|
6441
|
-
|
|
6442
|
-
element.getValueAt = function(x) {
|
|
6443
|
-
|
|
6444
|
-
if(x < element.xrange[0] || x > element.xrange[1])
|
|
6455
|
+
|
|
6456
|
+
element.addEventListener( "mousedown", onmousedown );
|
|
6457
|
+
|
|
6458
|
+
element.getValueAt = function( x ) {
|
|
6459
|
+
|
|
6460
|
+
if( x < element.xrange[ 0 ] || x > element.xrange[ 1 ] )
|
|
6461
|
+
{
|
|
6445
6462
|
return element.defaulty;
|
|
6446
|
-
|
|
6447
|
-
|
|
6463
|
+
}
|
|
6464
|
+
|
|
6465
|
+
var last = [ element.xrange[ 0 ], element.defaulty ];
|
|
6448
6466
|
var f = 0;
|
|
6449
|
-
for(var i = 0; i < element.value.length; i += 1)
|
|
6467
|
+
for( var i = 0; i < element.value.length; i += 1 )
|
|
6450
6468
|
{
|
|
6451
|
-
var v = element.value[i];
|
|
6452
|
-
if(x == v[0]) return v[1];
|
|
6453
|
-
if(x < v[0])
|
|
6469
|
+
var v = element.value[ i ];
|
|
6470
|
+
if( x == v[ 0 ] ) return v[ 1 ];
|
|
6471
|
+
if( x < v[ 0 ] )
|
|
6454
6472
|
{
|
|
6455
|
-
f = (x - last[0]) / (v[0] - last[0]);
|
|
6456
|
-
return last[1] * (1-f) + v[1] * f;
|
|
6473
|
+
f = ( x - last[ 0 ] ) / (v[ 0 ] - last[ 0 ]);
|
|
6474
|
+
return last[ 1 ] * ( 1 - f ) + v[ 1 ] * f;
|
|
6457
6475
|
}
|
|
6476
|
+
|
|
6458
6477
|
last = v;
|
|
6459
6478
|
}
|
|
6460
|
-
|
|
6461
|
-
v = [ element.xrange[1], element.defaulty ];
|
|
6462
|
-
f = (x - last[0]) / (v[0] - last[0]);
|
|
6463
|
-
return last[1] * (1-f) + v[1] * f;
|
|
6479
|
+
|
|
6480
|
+
v = [ element.xrange[ 1 ], element.defaulty ];
|
|
6481
|
+
f = (x - last[ 0 ]) / (v[ 0 ] - last[ 0 ]);
|
|
6482
|
+
return last[ 1 ] * ( 1 - f ) + v[ 1 ] * f;
|
|
6464
6483
|
}
|
|
6465
|
-
|
|
6466
|
-
element.resample = function(samples) {
|
|
6467
|
-
|
|
6484
|
+
|
|
6485
|
+
element.resample = function( samples ) {
|
|
6486
|
+
|
|
6468
6487
|
var r = [];
|
|
6469
|
-
var dx = (element.xrange[1] - element.xrange[0]) / samples;
|
|
6488
|
+
var dx = (element.xrange[1] - element.xrange[ 0 ]) / samples;
|
|
6470
6489
|
for(var i = element.xrange[0]; i <= element.xrange[1]; i += dx)
|
|
6471
6490
|
{
|
|
6472
6491
|
r.push( element.getValueAt(i) );
|
|
6473
6492
|
}
|
|
6474
6493
|
return r;
|
|
6475
6494
|
}
|
|
6476
|
-
|
|
6495
|
+
|
|
6477
6496
|
element.addValue = function(v) {
|
|
6478
|
-
|
|
6497
|
+
|
|
6479
6498
|
for(var i = 0; i < element.value; i++) {
|
|
6480
6499
|
var value = element.value[i];
|
|
6481
6500
|
if(value[0] < v[0]) continue;
|
|
@@ -6483,231 +6502,247 @@ console.warn( 'Script "build/lexgui.js" is depracated and will be removed soon.
|
|
|
6483
6502
|
redraw();
|
|
6484
6503
|
return;
|
|
6485
6504
|
}
|
|
6486
|
-
|
|
6505
|
+
|
|
6487
6506
|
element.value.push(v);
|
|
6488
6507
|
redraw();
|
|
6489
6508
|
}
|
|
6490
|
-
|
|
6509
|
+
|
|
6491
6510
|
//value to canvas
|
|
6492
6511
|
function convert(v) {
|
|
6493
6512
|
return [ canvas.width * ( v[0] - element.xrange[0])/ (element.xrange[1]),
|
|
6494
6513
|
canvas.height * (v[1] - element.yrange[0])/ (element.yrange[1])];
|
|
6495
|
-
// return [ canvas.width * ( (element.xrange[1] - element.xrange[0]) * v[0] + element.xrange[0]),
|
|
6496
|
-
// canvas.height * ((element.yrange[1] - element.yrange[0]) * v[1] + element.yrange[0])];
|
|
6497
6514
|
}
|
|
6498
|
-
|
|
6515
|
+
|
|
6499
6516
|
//canvas to value
|
|
6500
6517
|
function unconvert(v) {
|
|
6501
6518
|
return [(v[0] * element.xrange[1] / canvas.width + element.xrange[0]),
|
|
6502
6519
|
(v[1] * element.yrange[1] / canvas.height + element.yrange[0])];
|
|
6503
|
-
// return [(v[0] / canvas.width - element.xrange[0]) / (element.xrange[1] - element.xrange[0]),
|
|
6504
|
-
// (v[1] / canvas.height - element.yrange[0]) / (element.yrange[1] - element.yrange[0])];
|
|
6505
6520
|
}
|
|
6506
|
-
|
|
6521
|
+
|
|
6507
6522
|
var selected = -1;
|
|
6508
|
-
|
|
6509
|
-
element.redraw = function(o = {} ) {
|
|
6523
|
+
|
|
6524
|
+
element.redraw = function( o = {} ) {
|
|
6510
6525
|
|
|
6511
|
-
if(o.value) element.value = o.value;
|
|
6512
|
-
if(o.xrange) element.xrange = o.xrange;
|
|
6513
|
-
if(o.yrange) element.yrange = o.yrange;
|
|
6514
|
-
if(o.smooth) element.smooth = o.smooth;
|
|
6526
|
+
if( o.value ) element.value = o.value;
|
|
6527
|
+
if( o.xrange ) element.xrange = o.xrange;
|
|
6528
|
+
if( o.yrange ) element.yrange = o.yrange;
|
|
6529
|
+
if( o.smooth ) element.smooth = o.smooth;
|
|
6515
6530
|
var rect = canvas.parentElement.getBoundingClientRect();
|
|
6516
|
-
if(canvas.parentElement.parentElement) rect = canvas.parentElement.parentElement.getBoundingClientRect();
|
|
6517
|
-
if(rect && canvas.width != rect.width && rect.width && rect.width < 1000)
|
|
6531
|
+
if( canvas.parentElement.parentElement ) rect = canvas.parentElement.parentElement.getBoundingClientRect();
|
|
6532
|
+
if( rect && canvas.width != rect.width && rect.width && rect.width < 1000 )
|
|
6533
|
+
{
|
|
6518
6534
|
canvas.width = rect.width;
|
|
6519
|
-
|
|
6520
|
-
|
|
6521
|
-
|
|
6522
|
-
|
|
6523
|
-
ctx.
|
|
6524
|
-
ctx.
|
|
6525
|
-
|
|
6526
|
-
|
|
6535
|
+
}
|
|
6536
|
+
|
|
6537
|
+
var ctx = canvas.getContext( "2d" );
|
|
6538
|
+
ctx.setTransform( 1, 0, 0, 1, 0, 0 );
|
|
6539
|
+
ctx.translate( 0, canvas.height );
|
|
6540
|
+
ctx.scale( 1, -1 );
|
|
6541
|
+
|
|
6527
6542
|
ctx.fillStyle = element.bgcolor;
|
|
6528
6543
|
ctx.fillRect(0,0,canvas.width,canvas.height);
|
|
6529
|
-
|
|
6544
|
+
|
|
6530
6545
|
ctx.strokeStyle = element.linecolor;
|
|
6531
6546
|
ctx.beginPath();
|
|
6532
|
-
|
|
6547
|
+
|
|
6533
6548
|
//draw line
|
|
6534
|
-
var pos = convert([element.xrange[0],element.defaulty]);
|
|
6535
|
-
ctx.moveTo( pos[0], pos[1] );
|
|
6536
|
-
let values = [pos[0], pos[1]];
|
|
6537
|
-
|
|
6549
|
+
var pos = convert([ element.xrange[ 0 ],element.defaulty ]);
|
|
6550
|
+
ctx.moveTo( pos[ 0 ], pos[ 1 ] );
|
|
6551
|
+
let values = [pos[ 0 ], pos[ 1 ]];
|
|
6552
|
+
|
|
6538
6553
|
for(var i in element.value) {
|
|
6539
6554
|
var value = element.value[i];
|
|
6540
6555
|
pos = convert(value);
|
|
6541
|
-
values.push(pos[0]);
|
|
6542
|
-
values.push(pos[1]);
|
|
6556
|
+
values.push(pos[ 0 ]);
|
|
6557
|
+
values.push(pos[ 1 ]);
|
|
6543
6558
|
if(!element.smooth)
|
|
6544
|
-
ctx.lineTo( pos[0], pos[1] );
|
|
6559
|
+
ctx.lineTo( pos[ 0 ], pos[ 1 ] );
|
|
6545
6560
|
}
|
|
6546
|
-
|
|
6547
|
-
pos = convert([element.xrange[1],element.defaulty]);
|
|
6548
|
-
values.push(pos[0]);
|
|
6549
|
-
values.push(pos[1]);
|
|
6550
|
-
if(!element.smooth)
|
|
6551
|
-
|
|
6561
|
+
|
|
6562
|
+
pos = convert([ element.xrange[ 1 ], element.defaulty ]);
|
|
6563
|
+
values.push(pos[ 0 ]);
|
|
6564
|
+
values.push(pos[ 1 ]);
|
|
6565
|
+
if( !element.smooth )
|
|
6566
|
+
{
|
|
6567
|
+
ctx.lineTo( pos[ 0 ], pos[ 1 ] );
|
|
6552
6568
|
ctx.stroke();
|
|
6553
|
-
} else {
|
|
6554
|
-
|
|
6555
|
-
LX.UTILS.drawSpline(ctx, values, element.smooth);
|
|
6556
6569
|
}
|
|
6557
|
-
|
|
6558
|
-
|
|
6559
|
-
|
|
6560
|
-
|
|
6561
|
-
|
|
6562
|
-
|
|
6570
|
+
else
|
|
6571
|
+
{
|
|
6572
|
+
LX.UTILS.drawSpline( ctx, values, element.smooth );
|
|
6573
|
+
}
|
|
6574
|
+
|
|
6575
|
+
// Draw points
|
|
6576
|
+
for( var i = 0; i < element.value.length; i += 1 ) {
|
|
6577
|
+
var value = element.value[ i ];
|
|
6578
|
+
pos = convert( value );
|
|
6579
|
+
if( selected == i )
|
|
6563
6580
|
ctx.fillStyle = "white";
|
|
6564
6581
|
else
|
|
6565
6582
|
ctx.fillStyle = element.pointscolor;
|
|
6566
6583
|
ctx.beginPath();
|
|
6567
|
-
ctx.arc( pos[0], pos[1], selected == i ? 4 : 3, 0, Math.PI * 2);
|
|
6584
|
+
ctx.arc( pos[ 0 ], pos[ 1 ], selected == i ? 4 : 3, 0, Math.PI * 2);
|
|
6568
6585
|
ctx.fill();
|
|
6569
6586
|
}
|
|
6570
|
-
|
|
6587
|
+
|
|
6571
6588
|
if(element.show_samples) {
|
|
6572
6589
|
var samples = element.resample(element.show_samples);
|
|
6573
6590
|
ctx.fillStyle = "#888";
|
|
6574
6591
|
for(var i = 0; i < samples.length; i += 1)
|
|
6575
6592
|
{
|
|
6576
|
-
var value = [ i * ((element.xrange[1] - element.xrange[0]) / element.show_samples) + element.xrange[0], samples[i] ];
|
|
6593
|
+
var value = [ i * ((element.xrange[ 1 ] - element.xrange[ 0 ]) / element.show_samples) + element.xrange[ 0 ], samples[ i ] ];
|
|
6577
6594
|
pos = convert(value);
|
|
6578
6595
|
ctx.beginPath();
|
|
6579
|
-
ctx.arc( pos[0], pos[1], 2, 0, Math.PI * 2);
|
|
6596
|
+
ctx.arc( pos[ 0 ], pos[ 1 ], 2, 0, Math.PI * 2);
|
|
6580
6597
|
ctx.fill();
|
|
6581
6598
|
}
|
|
6582
6599
|
}
|
|
6583
6600
|
}
|
|
6584
|
-
|
|
6585
|
-
var last_mouse = [0,0];
|
|
6586
|
-
|
|
6587
|
-
function onmousedown(
|
|
6588
|
-
document.addEventListener("mousemove",onmousemove);
|
|
6589
|
-
document.addEventListener("mouseup",onmouseup);
|
|
6590
|
-
|
|
6601
|
+
|
|
6602
|
+
var last_mouse = [ 0, 0 ];
|
|
6603
|
+
|
|
6604
|
+
function onmousedown( e ) {
|
|
6605
|
+
document.addEventListener( "mousemove", onmousemove );
|
|
6606
|
+
document.addEventListener( "mouseup", onmouseup );
|
|
6607
|
+
|
|
6591
6608
|
var rect = canvas.getBoundingClientRect();
|
|
6592
|
-
var mousex =
|
|
6593
|
-
var mousey =
|
|
6594
|
-
|
|
6595
|
-
selected = computeSelected(mousex,canvas.height-mousey);
|
|
6596
|
-
|
|
6609
|
+
var mousex = e.clientX - rect.left;
|
|
6610
|
+
var mousey = e.clientY - rect.top;
|
|
6611
|
+
|
|
6612
|
+
selected = computeSelected( mousex, canvas.height - mousey );
|
|
6613
|
+
|
|
6597
6614
|
if(selected == -1 && element.allow_add_values) {
|
|
6598
|
-
var v = unconvert([mousex,canvas.height-mousey]);
|
|
6615
|
+
var v = unconvert([ mousex, canvas.height-mousey ]);
|
|
6599
6616
|
element.value.push(v);
|
|
6600
6617
|
sortValues();
|
|
6601
6618
|
selected = element.value.indexOf(v);
|
|
6602
6619
|
}
|
|
6603
|
-
|
|
6604
|
-
last_mouse = [mousex,mousey];
|
|
6620
|
+
|
|
6621
|
+
last_mouse = [ mousex, mousey ];
|
|
6605
6622
|
element.redraw();
|
|
6606
|
-
|
|
6607
|
-
|
|
6623
|
+
e.preventDefault();
|
|
6624
|
+
e.stopPropagation();
|
|
6608
6625
|
}
|
|
6609
|
-
|
|
6610
|
-
function onmousemove(
|
|
6626
|
+
|
|
6627
|
+
function onmousemove( e ) {
|
|
6628
|
+
|
|
6611
6629
|
var rect = canvas.getBoundingClientRect();
|
|
6612
|
-
var mousex =
|
|
6613
|
-
var mousey =
|
|
6614
|
-
|
|
6615
|
-
if(mousex < 0) mousex = 0;
|
|
6616
|
-
else if(mousex > canvas.width) mousex = canvas.width;
|
|
6617
|
-
if(mousey < 0) mousey = 0;
|
|
6618
|
-
else if(mousey > canvas.height) mousey = canvas.height;
|
|
6619
|
-
|
|
6620
|
-
//
|
|
6621
|
-
|
|
6630
|
+
var mousex = e.clientX - rect.left;
|
|
6631
|
+
var mousey = e.clientY - rect.top;
|
|
6632
|
+
|
|
6633
|
+
if( mousex < 0 ) mousex = 0;
|
|
6634
|
+
else if( mousex > canvas.width ) mousex = canvas.width;
|
|
6635
|
+
if( mousey < 0 ) mousey = 0;
|
|
6636
|
+
else if( mousey > canvas.height ) mousey = canvas.height;
|
|
6637
|
+
|
|
6638
|
+
// Dragging to remove
|
|
6639
|
+
const currentMouseDiff = [ e.clientX - rect.left, e.clientY - rect.top ];
|
|
6640
|
+
if( selected != -1 && distance( currentMouseDiff, [ mousex, mousey ] ) > canvas.height * 0.5 )
|
|
6622
6641
|
{
|
|
6623
|
-
element.
|
|
6624
|
-
|
|
6642
|
+
if( element.move_out == LX.CURVE_MOVEOUT_DELETE)
|
|
6643
|
+
{
|
|
6644
|
+
element.value.splice( selected, 1 );
|
|
6645
|
+
}
|
|
6646
|
+
else
|
|
6647
|
+
{
|
|
6648
|
+
const d = [ currentMouseDiff[ 0 ] - mousex, currentMouseDiff[ 1 ] - mousey ];
|
|
6649
|
+
let value = element.value[ selected ];
|
|
6650
|
+
value[ 0 ] = ( d[ 0 ] == 0.0 ) ? value[ 0 ] : ( d[ 0 ] < 0.0 ? element.xrange[ 1 ] : element.xrange[ 0 ] );
|
|
6651
|
+
value[ 1 ] = ( d[ 1 ] == 0.0 ) ? value[ 1 ] : ( d[ 1 ] < 0.0 ? element.yrange[ 1 ] : element.yrange[ 0 ] );
|
|
6652
|
+
}
|
|
6653
|
+
|
|
6654
|
+
onmouseup( e );
|
|
6625
6655
|
return;
|
|
6626
6656
|
}
|
|
6627
|
-
|
|
6628
|
-
var dx = element.draggable_x ? last_mouse[0] - mousex : 0;
|
|
6629
|
-
var dy = element.draggable_y ? last_mouse[1] - mousey : 0;
|
|
6630
|
-
var delta = unconvert([-dx,dy]);
|
|
6631
|
-
|
|
6632
|
-
|
|
6633
|
-
var
|
|
6634
|
-
|
|
6635
|
-
|
|
6657
|
+
|
|
6658
|
+
var dx = element.draggable_x ? last_mouse[ 0 ] - mousex : 0;
|
|
6659
|
+
var dy = element.draggable_y ? last_mouse[ 1 ] - mousey : 0;
|
|
6660
|
+
var delta = unconvert([ -dx, dy ]);
|
|
6661
|
+
|
|
6662
|
+
if( selected != -1 ) {
|
|
6663
|
+
var minx = element.xrange[ 0 ];
|
|
6664
|
+
var maxx = element.xrange[ 1 ];
|
|
6665
|
+
|
|
6666
|
+
if( element.no_overlap )
|
|
6636
6667
|
{
|
|
6637
|
-
if(selected > 0) minx = element.value[selected-1][0];
|
|
6638
|
-
if(selected < (element.value.length-1) ) maxx = element.value[selected+1][0];
|
|
6668
|
+
if( selected > 0) minx = element.value[ selected - 1 ][ 0 ];
|
|
6669
|
+
if( selected < ( element.value.length - 1 ) ) maxx = element.value[ selected + 1 ][ 0 ];
|
|
6639
6670
|
}
|
|
6640
|
-
|
|
6671
|
+
|
|
6641
6672
|
var v = element.value[selected];
|
|
6642
|
-
v[0] += delta[0];
|
|
6643
|
-
v[1] += delta[1];
|
|
6644
|
-
if(v[0] < minx) v[0] = minx;
|
|
6645
|
-
else if(v[0] > maxx) v[0] = maxx;
|
|
6646
|
-
if(v[1] < element.yrange[0]) v[1] = element.yrange[0];
|
|
6647
|
-
else if(v[1] > element.yrange[1]) v[1] = element.yrange[1];
|
|
6673
|
+
v[ 0 ] += delta[ 0 ];
|
|
6674
|
+
v[ 1 ] += delta[ 1 ];
|
|
6675
|
+
if(v[ 0 ] < minx) v[ 0 ] = minx;
|
|
6676
|
+
else if(v[ 0 ] > maxx) v[ 0 ] = maxx;
|
|
6677
|
+
if(v[ 1 ] < element.yrange[ 0 ]) v[ 1 ] = element.yrange[ 0 ];
|
|
6678
|
+
else if(v[ 1 ] > element.yrange[ 1 ]) v[ 1 ] = element.yrange[ 1 ];
|
|
6648
6679
|
}
|
|
6649
|
-
|
|
6680
|
+
|
|
6650
6681
|
sortValues();
|
|
6651
6682
|
element.redraw();
|
|
6652
|
-
last_mouse[0] = mousex;
|
|
6653
|
-
last_mouse[1] = mousey;
|
|
6654
|
-
onchange(
|
|
6655
|
-
|
|
6656
|
-
|
|
6657
|
-
|
|
6683
|
+
last_mouse[ 0 ] = mousex;
|
|
6684
|
+
last_mouse[ 1 ] = mousey;
|
|
6685
|
+
onchange( e );
|
|
6686
|
+
|
|
6687
|
+
e.preventDefault();
|
|
6688
|
+
e.stopPropagation();
|
|
6658
6689
|
}
|
|
6659
|
-
|
|
6660
|
-
function onmouseup(
|
|
6690
|
+
|
|
6691
|
+
function onmouseup( e ) {
|
|
6661
6692
|
selected = -1;
|
|
6662
6693
|
element.redraw();
|
|
6663
6694
|
document.removeEventListener("mousemove", onmousemove);
|
|
6664
6695
|
document.removeEventListener("mouseup", onmouseup);
|
|
6665
|
-
onchange(
|
|
6666
|
-
|
|
6667
|
-
|
|
6696
|
+
onchange(e);
|
|
6697
|
+
e.preventDefault();
|
|
6698
|
+
e.stopPropagation();
|
|
6668
6699
|
}
|
|
6669
6700
|
|
|
6670
|
-
function onchange(e) {
|
|
6671
|
-
if(options.callback)
|
|
6672
|
-
options.callback.call(element, element.value, e);
|
|
6701
|
+
function onchange( e ) {
|
|
6702
|
+
if( options.callback )
|
|
6703
|
+
options.callback.call( element, element.value, e );
|
|
6673
6704
|
}
|
|
6674
|
-
|
|
6705
|
+
|
|
6675
6706
|
function distance(a,b) { return Math.sqrt( Math.pow(b[0]-a[0],2) + Math.pow(b[1]-a[1],2) ); };
|
|
6676
|
-
|
|
6677
|
-
function computeSelected(x,y) {
|
|
6678
|
-
|
|
6679
|
-
var
|
|
6680
|
-
var
|
|
6707
|
+
|
|
6708
|
+
function computeSelected( x, y ) {
|
|
6709
|
+
|
|
6710
|
+
var minDistance = 100000;
|
|
6711
|
+
var maxDistance = 8; //pixels
|
|
6681
6712
|
var selected = -1;
|
|
6682
|
-
for(var i=0; i < element.value.length; i++)
|
|
6713
|
+
for( var i = 0; i < element.value.length; i++ )
|
|
6683
6714
|
{
|
|
6684
|
-
var value = element.value[i];
|
|
6685
|
-
var pos = convert(value);
|
|
6686
|
-
var dist = distance([x,y],pos);
|
|
6687
|
-
if(dist <
|
|
6715
|
+
var value = element.value[ i ];
|
|
6716
|
+
var pos = convert( value );
|
|
6717
|
+
var dist = distance( [ x,y ], pos );
|
|
6718
|
+
if( dist < minDistance && dist < maxDistance )
|
|
6688
6719
|
{
|
|
6689
|
-
|
|
6720
|
+
minDistance = dist;
|
|
6690
6721
|
selected = i;
|
|
6691
6722
|
}
|
|
6692
6723
|
}
|
|
6693
6724
|
return selected;
|
|
6694
6725
|
}
|
|
6695
|
-
|
|
6726
|
+
|
|
6696
6727
|
function sortValues() {
|
|
6697
6728
|
var v = null;
|
|
6698
|
-
if(selected != -1)
|
|
6699
|
-
|
|
6700
|
-
|
|
6701
|
-
|
|
6702
|
-
|
|
6729
|
+
if( selected != -1 )
|
|
6730
|
+
{
|
|
6731
|
+
v = element.value[ selected ];
|
|
6732
|
+
}
|
|
6733
|
+
element.value.sort(function( a,b ) { return a[ 0 ] - b[ 0 ]; });
|
|
6734
|
+
if( v )
|
|
6735
|
+
{
|
|
6736
|
+
selected = element.value.indexOf( v );
|
|
6737
|
+
}
|
|
6703
6738
|
}
|
|
6704
6739
|
|
|
6705
6740
|
element.redraw();
|
|
6706
6741
|
return this;
|
|
6707
6742
|
}
|
|
6708
|
-
|
|
6709
|
-
redraw(options = {}) {
|
|
6710
|
-
this.element.redraw(options);
|
|
6743
|
+
|
|
6744
|
+
redraw( options = {} ) {
|
|
6745
|
+
this.element.redraw( options );
|
|
6711
6746
|
}
|
|
6712
6747
|
}
|
|
6713
6748
|
|