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/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.33",
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
- function clamp (num, min, max) { return Math.min(Math.max(num, min), max) }
29
- function round(num, n) { return +num.toFixed(n); }
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
- element.querySelector(".lexoptions").style.top = (selectedOption.offsetTop + selectedOption.offsetHeight) + 'px';
4083
- element.querySelector(".lexoptions").style.width = (event.currentTarget.clientWidth) + 'px';
4084
- element.querySelector(".lexoptions").toggleAttribute('hidden');
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(curve_instance.element.value));
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 != curve_instance.element.value ? "block" : "none");
4244
- curve_instance.element.value = JSON.parse(JSON.stringify(newValue));
4245
- curve_instance.redraw();
4246
- if( !skipCallback ) that._trigger( new IEvent(name, curve_instance.element.value, null), callback );
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
- curve_instance.element.value = JSON.parse(JSON.stringify(defaultValues));
4258
- curve_instance.redraw();
4259
- that._trigger( new IEvent(name, curve_instance.element.value, e), callback );
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
- let curve_instance = new Curve(this, values, options);
4276
- container.appendChild(curve_instance.element);
4277
- element.appendChild(container);
4291
+
4292
+ let curveInstance = new Curve( this, values, options );
4293
+ container.appendChild( curveInstance.element );
4294
+ element.appendChild( container );
4278
4295
 
4279
4296
  // Resize
4280
- curve_instance.canvas.width = container.offsetWidth;
4281
- curve_instance.redraw();
4282
- widget.onresize = curve_instance.redraw.bind(curve_instance);
4283
- widget.curve_instance = curve_instance;
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 : skipCallback);
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
- var last = [ element.xrange[0], element.defaulty ];
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
- // if(rect && canvas.height != rect.height && rect.height && rect.height < 1000)
6520
- // canvas.height = rect.height;
6521
-
6522
- var ctx = canvas.getContext("2d");
6523
- ctx.setTransform(1, 0, 0, 1, 0, 0);
6524
- ctx.translate(0,canvas.height);
6525
- ctx.scale(1,-1);
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
- ctx.lineTo( pos[0], pos[1] );
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
- //draw points
6559
- for(var i = 0; i < element.value.length; i += 1) {
6560
- var value = element.value[i];
6561
- pos = convert(value);
6562
- if(selected == i)
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(evt) {
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 = evt.clientX - rect.left;
6593
- var mousey = evt.clientY - rect.top;
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
- evt.preventDefault();
6607
- evt.stopPropagation();
6623
+ e.preventDefault();
6624
+ e.stopPropagation();
6608
6625
  }
6609
-
6610
- function onmousemove(evt) {
6626
+
6627
+ function onmousemove( e ) {
6628
+
6611
6629
  var rect = canvas.getBoundingClientRect();
6612
- var mousex = evt.clientX - rect.left;
6613
- var mousey = evt.clientY - rect.top;
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
- //dragging to remove
6621
- if( selected != -1 && distance( [evt.clientX - rect.left, evt.clientY - rect.top], [mousex,mousey] ) > canvas.height * 0.5 )
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.value.splice(selected,1);
6624
- onmouseup(evt);
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
- if(selected != -1) {
6632
- var minx = element.xrange[0];
6633
- var maxx = element.xrange[1];
6634
-
6635
- if(element.no_trespassing)
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(evt);
6655
-
6656
- evt.preventDefault();
6657
- evt.stopPropagation();
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(evt) {
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(evt);
6666
- evt.preventDefault();
6667
- evt.stopPropagation();
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 min_dist = 100000;
6680
- var max_dist = 8; //pixels
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 < min_dist && dist < max_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
- min_dist = dist;
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
- v = element.value[selected];
6700
- element.value.sort(function(a,b) { return a[0] - b[0]; });
6701
- if(v)
6702
- selected = element.value.indexOf(v);
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