lexgui 0.1.30 → 0.1.32

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.30",
15
+ version: "0.1.32",
16
16
  ready: false,
17
17
  components: [], // specific pre-build components
18
18
  signals: {} // events and triggers
@@ -2373,11 +2373,11 @@ console.warn( 'Script "build/lexgui.js" is depracated and will be removed soon.
2373
2373
  console.warn("Can't get value of " + this.typeName());
2374
2374
  }
2375
2375
 
2376
- set( value ) {
2376
+ set( value, skipCallback = false ) {
2377
2377
 
2378
2378
  if( this.onSetValue )
2379
- return this.onSetValue( value );
2380
-
2379
+ return this.onSetValue( value, skipCallback );
2380
+
2381
2381
  console.warn("Can't set value of " + this.typeName());
2382
2382
  }
2383
2383
 
@@ -2454,11 +2454,11 @@ console.warn( 'Script "build/lexgui.js" is depracated and will be removed soon.
2454
2454
  widget.onGetValue = () => {
2455
2455
  return instance;
2456
2456
  };
2457
- widget.onSetValue = (new_value) => {
2458
- instance = new_value;
2457
+ widget.onSetValue = ( newValue, skipCallback ) => {
2458
+ instance = newValue;
2459
2459
  refresh_widget();
2460
- element.querySelector(".lexcustomitems").toggleAttribute('hidden', false);
2461
- this._trigger( new IEvent(name, instance, null), callback );
2460
+ element.querySelector( ".lexcustomitems" ).toggleAttribute( 'hidden', false );
2461
+ if( !skipCallback ) this._trigger( new IEvent( name, instance, null ), callback );
2462
2462
  };
2463
2463
 
2464
2464
  let element = widget.domEl;
@@ -3410,11 +3410,12 @@ console.warn( 'Script "build/lexgui.js" is depracated and will be removed soon.
3410
3410
  }
3411
3411
 
3412
3412
  _trigger( event, callback ) {
3413
- if(callback)
3414
- callback.call(this, event.value, event.domEvent, event.name);
3415
3413
 
3416
- if(this.onevent)
3417
- this.onevent.call(this, event);
3414
+ if( callback )
3415
+ callback.call( this, event.value, event.domEvent, event.name );
3416
+
3417
+ if( this.onevent )
3418
+ this.onevent.call( this, event );
3418
3419
  }
3419
3420
 
3420
3421
  /**
@@ -3542,12 +3543,13 @@ console.warn( 'Script "build/lexgui.js" is depracated and will be removed soon.
3542
3543
  addText( name, value, callback, options = {} ) {
3543
3544
 
3544
3545
  let widget = this.create_widget( name, Widget.TEXT, options );
3546
+
3545
3547
  widget.onGetValue = () => {
3546
3548
  return wValue.value;
3547
3549
  };
3548
- widget.onSetValue = newValue => {
3550
+ widget.onSetValue = ( newValue, skipCallback ) => {
3549
3551
  this.disabled ? wValue.innerText = newValue : wValue.value = newValue;
3550
- Panel._dispatch_event( wValue, "focusout" );
3552
+ Panel._dispatch_event( wValue, "focusout", skipCallback );
3551
3553
  };
3552
3554
 
3553
3555
  let element = widget.domEl;
@@ -3583,9 +3585,10 @@ console.warn( 'Script "build/lexgui.js" is depracated and will be removed soon.
3583
3585
  wValue.setAttribute( "placeholder", options.placeholder );
3584
3586
 
3585
3587
  var resolve = ( function( val, event ) {
3588
+ const skipCallback = event.detail;
3586
3589
  let btn = element.querySelector( ".lexwidgetname .lexicon" );
3587
3590
  if( btn ) btn.style.display = ( val != wValue.iValue ? "block" : "none" );
3588
- this._trigger( new IEvent( name, val, event ), callback );
3591
+ if( !skipCallback ) this._trigger( new IEvent( name, val, event ), callback );
3589
3592
  }).bind( this );
3590
3593
 
3591
3594
  const trigger = options.trigger ?? 'default';
@@ -3662,45 +3665,48 @@ console.warn( 'Script "build/lexgui.js" is depracated and will be removed soon.
3662
3665
 
3663
3666
  addTextArea( name, value, callback, options = {} ) {
3664
3667
 
3665
- let widget = this.create_widget(name, Widget.TEXTAREA, options);
3668
+ let widget = this.create_widget( name, Widget.TEXTAREA, options );
3669
+
3666
3670
  widget.onGetValue = () => {
3667
3671
  return wValue.value;
3668
3672
  };
3669
- widget.onSetValue = (new_value) => {
3670
- wValue.value = new_value;
3671
- Panel._dispatch_event(wValue, "focusout");
3673
+ widget.onSetValue = ( newValue, skipCallback ) => {
3674
+ wValue.value = newValue;
3675
+ Panel._dispatch_event( wValue, "focusout", skipCallback );
3672
3676
  };
3677
+
3673
3678
  let element = widget.domEl;
3674
3679
 
3675
3680
  // Add reset functionality
3676
- if(widget.name && !(options.skipReset ?? false)) {
3677
- Panel._add_reset_property(element.domName, function() {
3681
+ if( widget.name && !( options.skipReset ?? false ) ) {
3682
+ Panel._add_reset_property( element.domName, function() {
3678
3683
  wValue.value = wValue.iValue;
3679
3684
  this.style.display = "none";
3680
- Panel._dispatch_event(wValue, "focusout");
3685
+ Panel._dispatch_event( wValue, "focusout" );
3681
3686
  });
3682
3687
  }
3683
3688
 
3684
3689
  // Add widget value
3685
3690
 
3686
- let container = document.createElement('div');
3691
+ let container = document.createElement( 'div' );
3687
3692
  container.className = "lextextarea";
3688
3693
  container.style.width = options.inputWidth || "calc( 100% - " + LX.DEFAULT_NAME_WIDTH + " )";
3689
3694
  container.style.height = options.height;
3690
3695
  container.style.display = "flex";
3691
3696
 
3692
- let wValue = document.createElement('textarea');
3697
+ let wValue = document.createElement( 'textarea' );
3693
3698
  wValue.value = wValue.iValue = value || "";
3694
3699
  wValue.style.width = "100%";
3695
- Object.assign(wValue.style, options.style ?? {});
3700
+ Object.assign( wValue.style, options.style ?? {} );
3696
3701
 
3697
- if(options.disabled ?? false) wValue.setAttribute("disabled", true);
3698
- if(options.placeholder) wValue.setAttribute("placeholder", options.placeholder);
3702
+ if( options.disabled ?? false ) wValue.setAttribute("disabled", true);
3703
+ if( options.placeholder ) wValue.setAttribute("placeholder", options.placeholder);
3699
3704
 
3700
- var resolve = (function(val, event) {
3701
- let btn = element.querySelector(".lexwidgetname .lexicon");
3702
- if(btn) btn.style.display = (val != wValue.iValue ? "block" : "none");
3703
- this._trigger( new IEvent(name, val, event), callback );
3705
+ var resolve = (function( val, event ) {
3706
+ const skipCallback = event.detail;
3707
+ let btn = element.querySelector( ".lexwidgetname .lexicon" );
3708
+ if( btn ) btn.style.display = ( val != wValue.iValue ? "block" : "none" );
3709
+ if( !skipCallback ) this._trigger( new IEvent( name, val, event ), callback );
3704
3710
  }).bind(this);
3705
3711
 
3706
3712
  const trigger = options.trigger ?? 'default';
@@ -3777,10 +3783,10 @@ console.warn( 'Script "build/lexgui.js" is depracated and will be removed soon.
3777
3783
  widget.onGetValue = () => {
3778
3784
  return wValue.innerText;
3779
3785
  };
3780
- widget.onSetValue = (new_value) => {
3786
+ widget.onSetValue = ( newValue, skipCallback ) => {
3781
3787
  wValue.innerHTML =
3782
3788
  (options.icon ? "<a class='" + options.icon + "'></a>" :
3783
- ( options.img ? "<img src='" + options.img + "'>" : "<span>" + (new_value || "") + "</span>" ));
3789
+ ( options.img ? "<img src='" + options.img + "'>" : "<span>" + (newValue || "") + "</span>" ));
3784
3790
  };
3785
3791
 
3786
3792
  let element = widget.domEl;
@@ -3798,10 +3804,10 @@ console.warn( 'Script "build/lexgui.js" is depracated and will be removed soon.
3798
3804
  ( options.img ? "<img src='" + options.img + "'>" : "<span>" + (value || "") + "</span>" ));
3799
3805
 
3800
3806
  wValue.style.width = "calc( 100% - " + (options.nameWidth ?? LX.DEFAULT_NAME_WIDTH) + ")";
3801
-
3807
+
3802
3808
  if(options.disabled)
3803
3809
  wValue.setAttribute("disabled", true);
3804
-
3810
+
3805
3811
  wValue.addEventListener("click", e => {
3806
3812
  if( options.selectable ) {
3807
3813
  if( options.parent )
@@ -3812,7 +3818,7 @@ console.warn( 'Script "build/lexgui.js" is depracated and will be removed soon.
3812
3818
  });
3813
3819
 
3814
3820
  element.appendChild(wValue);
3815
-
3821
+
3816
3822
  // Remove branch padding and margins
3817
3823
  if(!widget.name) {
3818
3824
  wValue.className += " noname";
@@ -4019,12 +4025,12 @@ console.warn( 'Script "build/lexgui.js" is depracated and will be removed soon.
4019
4025
  widget.onGetValue = () => {
4020
4026
  return element.querySelector("li.selected").getAttribute('value');
4021
4027
  };
4022
- widget.onSetValue = (new_value) => {
4028
+ widget.onSetValue = ( newValue, skipCallback ) => {
4023
4029
  let btn = element.querySelector(".lexwidgetname .lexicon");
4024
- if(btn) btn.style.display = (new_value != wValue.iValue ? "block" : "none");
4025
- value = new_value;
4030
+ if(btn) btn.style.display = (newValue != wValue.iValue ? "block" : "none");
4031
+ value = newValue;
4026
4032
  list.querySelectorAll('li').forEach( e => { if( e.getAttribute('value') == value ) e.click() } );
4027
- this._trigger( new IEvent(name, value, null), callback );
4033
+ if( !skipCallback ) this._trigger( new IEvent(name, value, null), callback );
4028
4034
  };
4029
4035
 
4030
4036
  let element = widget.domEl;
@@ -4220,12 +4226,12 @@ console.warn( 'Script "build/lexgui.js" is depracated and will be removed soon.
4220
4226
  widget.onGetValue = () => {
4221
4227
  return JSON.parse(JSON.stringify(curve_instance.element.value));
4222
4228
  };
4223
- widget.onSetValue = (new_value) => {
4229
+ widget.onSetValue = ( newValue, skipCallback ) => {
4224
4230
  let btn = element.querySelector(".lexwidgetname .lexicon");
4225
- if(btn) btn.style.display = (new_value != curve_instance.element.value ? "block" : "none");
4226
- curve_instance.element.value = JSON.parse(JSON.stringify(new_value));
4231
+ if(btn) btn.style.display = (newValue != curve_instance.element.value ? "block" : "none");
4232
+ curve_instance.element.value = JSON.parse(JSON.stringify(newValue));
4227
4233
  curve_instance.redraw();
4228
- that._trigger( new IEvent(name, curve_instance.element.value, null), callback );
4234
+ if( !skipCallback ) that._trigger( new IEvent(name, curve_instance.element.value, null), callback );
4229
4235
  };
4230
4236
 
4231
4237
  let element = widget.domEl;
@@ -4285,12 +4291,12 @@ console.warn( 'Script "build/lexgui.js" is depracated and will be removed soon.
4285
4291
  widget.onGetValue = () => {
4286
4292
  return element.value;
4287
4293
  };
4288
- widget.onSetValue = (new_value) => {
4294
+ widget.onSetValue = ( newValue, skipCallback ) => {
4289
4295
  let btn = element.querySelector(".lexwidgetname .lexicon");
4290
- if(btn) btn.style.display = (new_value != defaultValue ? "block" : "none");
4291
- value = element.value = new_value;
4296
+ if(btn) btn.style.display = (newValue != defaultValue ? "block" : "none");
4297
+ value = element.value = newValue;
4292
4298
  setLayers();
4293
- that._trigger( new IEvent(name, value), callback );
4299
+ if( !skipCallback ) that._trigger( new IEvent(name, value), callback );
4294
4300
  };
4295
4301
 
4296
4302
  let element = widget.domEl;
@@ -4382,11 +4388,12 @@ console.warn( 'Script "build/lexgui.js" is depracated and will be removed soon.
4382
4388
  values.push( v.value );
4383
4389
  return values;
4384
4390
  };
4385
- widget.onSetValue = (new_value) => {
4386
- values = new_value;
4391
+ widget.onSetValue = ( newValue, skipCallback ) => {
4392
+ values = newValue;
4387
4393
  updateItems();
4388
- this._trigger( new IEvent(name, values, null), callback );
4394
+ if( !skipCallback ) this._trigger( new IEvent(name, values, null), callback );
4389
4395
  };
4396
+
4390
4397
  let element = widget.domEl;
4391
4398
  element.style.flexWrap = "wrap";
4392
4399
 
@@ -4500,14 +4507,13 @@ console.warn( 'Script "build/lexgui.js" is depracated and will be removed soon.
4500
4507
  widget.onGetValue = () => {
4501
4508
  return value;
4502
4509
  };
4503
-
4504
- widget.onSetValue = ( newValue ) => {
4510
+ widget.onSetValue = ( newValue, skipCallback ) => {
4505
4511
  listContainer.querySelectorAll( '.lexlistitem' ).forEach( e => e.classList.remove( 'selected' ) );
4506
4512
  const idx = values.indexOf( newValue );
4507
4513
  if( idx == -1 ) return;
4508
4514
  listContainer.children[ idx ].classList.toggle( 'selected' );
4509
4515
  value = newValue;
4510
- this._trigger( new IEvent( name, newValue ), callback );
4516
+ if( !skipCallback ) this._trigger( new IEvent( name, newValue ), callback );
4511
4517
  };
4512
4518
 
4513
4519
  widget.updateValues = ( newValues ) => {
@@ -4572,18 +4578,19 @@ console.warn( 'Script "build/lexgui.js" is depracated and will be removed soon.
4572
4578
 
4573
4579
  addTags( name, value, callback, options = {} ) {
4574
4580
 
4575
- value = value.replace(/\s/g, '').split(',');
4576
- let defaultValue = [].concat(value);
4577
- let widget = this.create_widget(name, Widget.TAGS, options);
4581
+ value = value.replace( /\s/g, '' ).split( ',' );
4582
+ let defaultValue = [].concat( value );
4583
+ let widget = this.create_widget( name, Widget.TAGS, options );
4584
+
4578
4585
  widget.onGetValue = () => {
4579
- return [].concat(value);
4586
+ return [].concat( value );
4580
4587
  };
4581
- widget.onSetValue = (new_value) => {
4582
- value = [].concat(new_value);
4588
+ widget.onSetValue = ( newValue, skipCallback ) => {
4589
+ value = [].concat( newValue );
4583
4590
  create_tags();
4584
- let btn = element.querySelector(".lexwidgetname .lexicon");
4585
- if(btn) btn.style.display = (new_value != defaultValue ? "block" : "none");1
4586
- that._trigger( new IEvent(name, value), callback );
4591
+ let btn = element.querySelector( ".lexwidgetname .lexicon" );
4592
+ if( btn ) btn.style.display = ( newValue != defaultValue ? "block" : "none" );
4593
+ if( !skipCallback ) that._trigger( new IEvent( name, value ), callback );
4587
4594
  };
4588
4595
 
4589
4596
  let element = widget.domEl;
@@ -4609,7 +4616,7 @@ console.warn( 'Script "build/lexgui.js" is depracated and will be removed soon.
4609
4616
  const create_tags = () => {
4610
4617
 
4611
4618
  tags_container.innerHTML = "";
4612
-
4619
+
4613
4620
  for( let i = 0; i < value.length; ++i )
4614
4621
  {
4615
4622
  let tag_name = value[i];
@@ -4617,36 +4624,36 @@ console.warn( 'Script "build/lexgui.js" is depracated and will be removed soon.
4617
4624
  tag.className = "lextag";
4618
4625
  tag.innerHTML = tag_name;
4619
4626
 
4620
- tag.addEventListener('click', function(e) {
4627
+ tag.addEventListener('click', function( e ) {
4621
4628
  this.remove();
4622
4629
  value.splice( value.indexOf( tag_name ), 1 );
4623
- let btn = element.querySelector(".lexwidgetname .lexicon");
4624
- if(btn) btn.style.display = (value != defaultValue ? "block" : "none");
4625
- that._trigger( new IEvent(name, value, e), callback );
4630
+ let btn = element.querySelector( ".lexwidgetname .lexicon" );
4631
+ if( btn ) btn.style.display = ( value != defaultValue ? "block" : "none" );
4632
+ that._trigger( new IEvent( name, value, e ), callback );
4626
4633
  });
4627
4634
 
4628
- tags_container.appendChild(tag);
4635
+ tags_container.appendChild( tag );
4629
4636
  }
4630
-
4631
- let tag_input = document.createElement('input');
4637
+
4638
+ let tag_input = document.createElement( 'input' );
4632
4639
  tag_input.value = "";
4633
4640
  tag_input.placeholder = "Tag...";
4634
- tags_container.insertChildAtIndex(tag_input, 0);
4635
-
4636
- tag_input.onkeydown = function(e) {
4641
+ tags_container.insertChildAtIndex( tag_input, 0 );
4642
+
4643
+ tag_input.onkeydown = function( e ) {
4637
4644
  const val = this.value.replace(/\s/g, '');
4638
4645
  if( e.key == ' ') {
4639
4646
  e.preventDefault();
4640
4647
  if( !val.length || value.indexOf( val ) > -1 )
4641
4648
  return;
4642
- value.push(val);
4649
+ value.push( val );
4643
4650
  create_tags();
4644
- let btn = element.querySelector(".lexwidgetname .lexicon");
4651
+ let btn = element.querySelector( ".lexwidgetname .lexicon" );
4645
4652
  if(btn) btn.style.display = "block";
4646
- that._trigger( new IEvent(name, value, e), callback );
4653
+ that._trigger( new IEvent( name, value, e ), callback );
4647
4654
  }
4648
4655
  };
4649
-
4656
+
4650
4657
  tag_input.focus();
4651
4658
  }
4652
4659
 
@@ -4675,24 +4682,25 @@ console.warn( 'Script "build/lexgui.js" is depracated and will be removed soon.
4675
4682
 
4676
4683
  addCheckbox( name, value, callback, options = {} ) {
4677
4684
 
4678
- if(!name) {
4679
- throw("Set Widget Name!");
4685
+ if( !name ) {
4686
+ throw( "Set Widget Name!" );
4680
4687
  }
4681
-
4682
- let widget = this.create_widget(name, Widget.CHECKBOX, options);
4688
+
4689
+ let widget = this.create_widget( name, Widget.CHECKBOX, options );
4690
+
4683
4691
  widget.onGetValue = () => {
4684
4692
  return flag.value;
4685
4693
  };
4686
- widget.onSetValue = (value) => {
4687
- if(flag.value !== value)
4688
- Panel._dispatch_event(toggle, "click");
4694
+ widget.onSetValue = ( newValue, skipCallback ) => {
4695
+ if( flag.value !== newValue )
4696
+ Panel._dispatch_event( toggle, "click", skipCallback );
4689
4697
  };
4690
-
4698
+
4691
4699
  let element = widget.domEl;
4692
-
4700
+
4693
4701
  // Add reset functionality
4694
- Panel._add_reset_property(element.domName, function() {
4695
- Panel._dispatch_event(toggle, "click");
4702
+ Panel._add_reset_property( element.domName, function() {
4703
+ Panel._dispatch_event( toggle, "click" );
4696
4704
  });
4697
4705
 
4698
4706
  // Add widget value
@@ -4723,30 +4731,35 @@ console.warn( 'Script "build/lexgui.js" is depracated and will be removed soon.
4723
4731
  container.appendChild(toggle);
4724
4732
  container.appendChild(value_name);
4725
4733
 
4726
- toggle.addEventListener("click", (e) => {
4727
-
4728
- let flag = toggle.querySelector(".checkbox");
4729
- if(flag.disabled)
4730
- return;
4734
+ toggle.addEventListener( "click" , e => {
4731
4735
 
4732
- let check = toggle.querySelector(".checkbox a");
4736
+ let flag = toggle.querySelector( ".checkbox" );
4737
+ if( flag.disabled )
4738
+ return;
4739
+
4740
+ const skipCallback = e.detail;
4733
4741
 
4742
+ let check = toggle.querySelector( ".checkbox a" );
4743
+
4734
4744
  flag.value = !flag.value;
4735
- flag.className = "checkbox " + (flag.value ? "on" : "");
4745
+ flag.className = "checkbox " + ( flag.value ? "on" : "" );
4736
4746
  check.style.display = flag.value ? "block" : "none";
4737
-
4747
+
4738
4748
  // Reset button (default value)
4739
- let btn = element.querySelector(".lexwidgetname .lexicon");
4740
- if(btn) btn.style.display = flag.value != flag.iValue ? "block": "none";
4741
-
4749
+ if( !skipCallback )
4750
+ {
4751
+ let btn = element.querySelector( ".lexwidgetname .lexicon" );
4752
+ if( btn ) btn.style.display = flag.value != flag.iValue ? "block": "none";
4753
+ }
4754
+
4742
4755
  // Open suboptions
4743
- let submenu = element.querySelector(".lexcheckboxsubmenu");
4744
- if(submenu) submenu.toggleAttribute('hidden', !flag.value);
4745
-
4746
- this._trigger( new IEvent(name, flag.value, e), callback );
4756
+ let submenu = element.querySelector( ".lexcheckboxsubmenu" );
4757
+ if( submenu ) submenu.toggleAttribute( 'hidden', !flag.value );
4758
+
4759
+ if( !skipCallback ) this._trigger( new IEvent( name, flag.value, e ), callback );
4747
4760
  });
4748
-
4749
- element.appendChild(container);
4761
+
4762
+ element.appendChild( container );
4750
4763
 
4751
4764
  if( options.suboptions )
4752
4765
  {
@@ -4777,92 +4790,86 @@ console.warn( 'Script "build/lexgui.js" is depracated and will be removed soon.
4777
4790
 
4778
4791
  addColor( name, value, callback, options = {} ) {
4779
4792
 
4780
- if(!name) {
4781
- throw("Set Widget Name!");
4793
+ if( !name ) {
4794
+ throw( "Set Widget Name!" );
4782
4795
  }
4783
-
4784
- let widget = this.create_widget(name, Widget.COLOR, options);
4796
+
4797
+ let widget = this.create_widget( name, Widget.COLOR, options );
4798
+
4785
4799
  widget.onGetValue = () => {
4786
4800
  return color.value;
4787
4801
  };
4788
- widget.onSetValue = (new_value) => {
4789
- color.value = new_value;
4790
- Panel._dispatch_event(color, "input");
4802
+ widget.onSetValue = ( newValue, skipCallback ) => {
4803
+ color.value = newValue;
4804
+ Panel._dispatch_event( color, "input", skipCallback );
4791
4805
  };
4806
+
4792
4807
  let element = widget.domEl;
4793
4808
  let change_from_input = false;
4794
-
4809
+
4795
4810
  // Add reset functionality
4796
- Panel._add_reset_property(element.domName, function() {
4811
+ Panel._add_reset_property( element.domName, function() {
4797
4812
  this.style.display = "none";
4798
4813
  color.value = color.iValue;
4799
- Panel._dispatch_event(color, "input");
4814
+ Panel._dispatch_event( color, "input" );
4800
4815
  });
4801
-
4816
+
4802
4817
  // Add widget value
4803
-
4804
- var container = document.createElement('span');
4818
+
4819
+ var container = document.createElement( 'span' );
4805
4820
  container.className = "lexcolor";
4806
4821
  container.style.width = "calc( 100% - " + LX.DEFAULT_NAME_WIDTH + ")";
4807
-
4808
- let color = document.createElement('input');
4822
+
4823
+ let color = document.createElement( 'input' );
4809
4824
  color.style.width = "calc(30% - 6px)";
4810
4825
  color.type = 'color';
4811
4826
  color.className = "colorinput";
4812
4827
  color.id = "color" + simple_guidGenerator();
4813
4828
  color.useRGB = options.useRGB ?? false;
4814
- color.value = color.iValue = value.constructor === Array ? rgbToHex(value) : value;
4829
+ color.value = color.iValue = value.constructor === Array ? rgbToHex( value ) : value;
4815
4830
 
4816
- if(options.disabled) {
4831
+ if( options.disabled ) {
4817
4832
  color.disabled = true;
4818
4833
  }
4819
-
4820
- color.addEventListener("input", e => {
4834
+
4835
+ color.addEventListener( "input", e => {
4821
4836
  let val = e.target.value;
4822
-
4837
+
4838
+ const skipCallback = e.detail;
4839
+
4823
4840
  // Change value (always hex)
4824
4841
  if( !change_from_input )
4825
- text_widget.set(val);
4826
-
4842
+ text_widget.set( val );
4843
+
4827
4844
  // Reset button (default value)
4828
- if(val != color.iValue) {
4829
- let btn = element.querySelector(".lexwidgetname .lexicon");
4830
- btn.style.display = "block";
4845
+ if( !skipCallback )
4846
+ {
4847
+ let btn = element.querySelector( ".lexwidgetname .lexicon" );
4848
+ if( btn ) btn.style.display = val != color.iValue ? "block": "none";
4831
4849
  }
4832
-
4833
- if(color.useRGB)
4834
- val = hexToRgb(val);
4835
-
4836
- this._trigger( new IEvent(name, val, e), callback );
4837
- }, false);
4838
-
4839
- container.appendChild(color);
4840
-
4850
+
4851
+ if( color.useRGB )
4852
+ val = hexToRgb( val );
4853
+
4854
+ if( !skipCallback ) this._trigger( new IEvent( name, val, e ), callback );
4855
+ }, false );
4856
+
4857
+ container.appendChild( color );
4858
+
4841
4859
  this.queue( container );
4842
-
4843
- const text_widget = this.addText(null, color.value, (v) => {
4860
+
4861
+ const text_widget = this.addText( null, color.value, v => {
4844
4862
  change_from_input = true;
4845
4863
  widget.set( v );
4846
4864
  change_from_input = false;
4847
4865
  }, { width: "calc(70% - 4px)" });
4848
4866
 
4849
4867
  text_widget.domEl.style.marginLeft = "4px";
4850
-
4868
+
4851
4869
  this.clearQueue();
4852
-
4853
- // let valueName = document.createElement('span');
4854
- // valueName.className = "colorinfo";
4855
- // valueName.innerText = color.value;
4856
-
4857
- // valueName.addEventListener("click", e => {
4858
- // color.focus();
4859
- // color.click();
4860
- // });
4861
-
4862
- // container.appendChild(valueName);
4863
-
4864
- element.appendChild(container);
4865
-
4870
+
4871
+ element.appendChild( container );
4872
+
4866
4873
  return widget;
4867
4874
  }
4868
4875
 
@@ -4881,102 +4888,120 @@ console.warn( 'Script "build/lexgui.js" is depracated and will be removed soon.
4881
4888
 
4882
4889
  addNumber( name, value, callback, options = {} ) {
4883
4890
 
4884
- let widget = this.create_widget(name, Widget.NUMBER, options);
4891
+ let widget = this.create_widget( name, Widget.NUMBER, options );
4892
+
4885
4893
  widget.onGetValue = () => {
4886
4894
  return +vecinput.value;
4887
4895
  };
4888
- widget.onSetValue = (new_value) => {
4889
- vecinput.value = new_value;
4890
- Panel._dispatch_event(vecinput, "change");
4896
+ widget.onSetValue = ( newValue, skipCallback ) => {
4897
+ vecinput.value = newValue;
4898
+ Panel._dispatch_event( vecinput, "change", skipCallback );
4891
4899
  };
4900
+
4892
4901
  let element = widget.domEl;
4893
4902
 
4894
4903
  // add reset functionality
4895
- if(widget.name) {
4896
- Panel._add_reset_property(element.domName, function() {
4904
+ if( widget.name ) {
4905
+ Panel._add_reset_property( element.domName, function() {
4897
4906
  this.style.display = "none";
4898
4907
  vecinput.value = vecinput.iValue;
4899
- Panel._dispatch_event(vecinput, "change");
4908
+ Panel._dispatch_event( vecinput, "change" );
4900
4909
  });
4901
4910
  }
4902
4911
 
4903
4912
  // add widget value
4904
4913
 
4905
- var container = document.createElement('div');
4914
+ var container = document.createElement( 'div' );
4906
4915
  container.className = "lexnumber";
4907
4916
  container.style.width = options.inputWidth || "calc( 100% - " + LX.DEFAULT_NAME_WIDTH + ")";
4908
4917
 
4909
- let box = document.createElement('div');
4918
+ let box = document.createElement( 'div' );
4910
4919
  box.className = "numberbox";
4911
4920
 
4912
- let vecinput = document.createElement('input');
4921
+ let vecinput = document.createElement( 'input' );
4913
4922
  vecinput.className = "vecinput";
4914
4923
  vecinput.min = options.min ?? -1e24;
4915
4924
  vecinput.max = options.max ?? 1e24;
4916
4925
  vecinput.step = options.step ?? "any";
4917
4926
  vecinput.type = "number";
4918
- vecinput.id = "number_"+simple_guidGenerator();
4927
+ vecinput.id = "number_" + simple_guidGenerator();
4928
+
4929
+ if( value.constructor == Number )
4930
+ {
4931
+ value = clamp( value, +vecinput.min, +vecinput.max );
4932
+ value = options.precision ? round( value, options.precision ) : value;
4933
+ }
4934
+
4919
4935
  vecinput.value = vecinput.iValue = value;
4920
- box.appendChild(vecinput);
4936
+ box.appendChild( vecinput );
4921
4937
 
4922
- let drag_icon = document.createElement('a');
4938
+ let drag_icon = document.createElement( 'a' );
4923
4939
  drag_icon.className = "fa-solid fa-arrows-up-down drag-icon hidden";
4924
- box.appendChild(drag_icon);
4940
+ box.appendChild( drag_icon );
4925
4941
 
4926
- if(options.disabled) {
4942
+ if( options.disabled ) {
4927
4943
  vecinput.disabled = true;
4928
4944
  }
4929
4945
 
4930
4946
  // add slider below
4931
- if(!options.skipSlider && options.min !== undefined && options.max !== undefined) {
4932
- let slider = document.createElement('input');
4947
+ if( !options.skipSlider && options.min !== undefined && options.max !== undefined ) {
4948
+ let slider = document.createElement( 'input' );
4933
4949
  slider.className = "lexinputslider";
4934
4950
  slider.step = options.step ?? 1;
4935
4951
  slider.min = options.min;
4936
4952
  slider.max = options.max;
4937
4953
  slider.type = "range";
4938
4954
  slider.value = value;
4939
- slider.addEventListener("input", function(e) {
4955
+ slider.addEventListener( "input", function( e ) {
4940
4956
  let new_value = +this.valueAsNumber;
4941
- vecinput.value = (+new_value).toFixed(4).replace(/([0-9]+(\.[0-9]+[1-9])?)(\.?0+$)/,'$1');
4942
- Panel._dispatch_event(vecinput, "change");
4943
- }, false);
4944
- box.appendChild(slider);
4957
+ vecinput.value = ( +new_value ).toFixed( 4 ).replace( /([0-9]+(\.[0-9]+[1-9])?)(\.?0+$)/, '$1' );
4958
+ Panel._dispatch_event( vecinput, "change" );
4959
+ }, false );
4960
+ box.appendChild( slider );
4945
4961
  }
4946
4962
 
4947
4963
  // Add wheel input
4948
4964
 
4949
- vecinput.addEventListener("wheel", function(e) {
4965
+ vecinput.addEventListener( "wheel", function( e ) {
4950
4966
  e.preventDefault();
4951
- if(this !== document.activeElement)
4967
+ if( this !== document.activeElement )
4952
4968
  return;
4953
4969
  let mult = options.step ?? 1;
4954
- if(e.shiftKey) mult *= 10;
4955
- else if(e.altKey) mult *= 0.1;
4956
- let new_value = (+this.valueAsNumber - mult * (e.deltaY > 0 ? 1 : -1));
4957
- this.value = (+new_value).toFixed(4).replace(/([0-9]+(\.[0-9]+[1-9])?)(\.?0+$)/,'$1');
4970
+ if( e.shiftKey ) mult *= 10;
4971
+ else if( e.altKey ) mult *= 0.1;
4972
+ let new_value = ( +this.valueAsNumber - mult * ( e.deltaY > 0 ? 1 : -1 ) );
4973
+ this.value = ( +new_value ).toFixed( 4 ).replace( /([0-9]+(\.[0-9]+[1-9])?)(\.?0+$)/, '$1' );
4958
4974
  Panel._dispatch_event(vecinput, "change");
4959
- }, {passive:false});
4975
+ }, { passive: false });
4960
4976
 
4961
- vecinput.addEventListener("change", e => {
4962
- if(isNaN(e.target.valueAsNumber))
4977
+ vecinput.addEventListener( "change", e => {
4978
+
4979
+ if( isNaN( e.target.valueAsNumber ) )
4963
4980
  return;
4964
- let val = e.target.value = clamp(+e.target.valueAsNumber, +vecinput.min, +vecinput.max);
4965
- val = options.precision ? round(val, options.precision) : val;
4981
+
4982
+ const skipCallback = e.detail;
4983
+
4984
+ let val = e.target.value = clamp( +e.target.valueAsNumber, +vecinput.min, +vecinput.max );
4985
+ val = options.precision ? round( val, options.precision ) : val;
4966
4986
  // update slider!
4967
- if( box.querySelector(".lexinputslider"))
4968
- box.querySelector(".lexinputslider").value = val;
4987
+ if( box.querySelector( ".lexinputslider" ) )
4988
+ box.querySelector( ".lexinputslider" ).value = val;
4969
4989
 
4970
4990
  vecinput.value = val;
4991
+
4971
4992
  // Reset button (default value)
4972
- let btn = element.querySelector(".lexwidgetname .lexicon");
4973
- if(btn) btn.style.display = val != vecinput.iValue ? "block": "none";
4974
- this._trigger( new IEvent(name, val, e), callback );
4975
- }, {passive:false});
4993
+ if( !skipCallback )
4994
+ {
4995
+ let btn = element.querySelector( ".lexwidgetname .lexicon" );
4996
+ if( btn ) btn.style.display = val != vecinput.iValue ? "block": "none";
4997
+ }
4998
+
4999
+ if( !skipCallback ) this._trigger( new IEvent( name, val, e ), callback );
5000
+ }, { passive: false });
4976
5001
 
4977
5002
  // Add drag input
4978
5003
 
4979
- vecinput.addEventListener("mousedown", inner_mousedown);
5004
+ vecinput.addEventListener( "mousedown", inner_mousedown );
4980
5005
 
4981
5006
  var that = this;
4982
5007
  var lastY = 0;
@@ -5034,43 +5059,39 @@ console.warn( 'Script "build/lexgui.js" is depracated and will be removed soon.
5034
5059
 
5035
5060
  _add_vector( num_components, name, value, callback, options = {} ) {
5036
5061
 
5037
- num_components = clamp(num_components, 2, 4);
5038
- value = value ?? new Array(num_components).fill(0);
5062
+ num_components = clamp( num_components, 2, 4 );
5063
+ value = value ?? new Array( num_components ).fill( 0 );
5039
5064
 
5040
- if(!name) {
5041
- throw("Set Widget Name!");
5065
+ if( !name ) {
5066
+ throw( "Set Widget Name!" );
5042
5067
  }
5043
5068
 
5044
- let widget = this.create_widget(name, Widget.VECTOR, options);
5069
+ let widget = this.create_widget( name, Widget.VECTOR, options );
5070
+
5045
5071
  widget.onGetValue = () => {
5046
- let inputs = element.querySelectorAll("input");
5072
+ let inputs = element.querySelectorAll( "input" );
5047
5073
  let value = [];
5048
5074
  for( var v of inputs )
5049
5075
  value.push( +v.value );
5050
5076
  return value;
5051
5077
  };
5052
- widget.onSetValue = (new_value) => {
5053
- const inputs = element.querySelectorAll(".vecinput");
5078
+ widget.onSetValue = ( newValue, skipCallback ) => {
5079
+ const inputs = element.querySelectorAll( ".vecinput" );
5054
5080
  for( var i = 0; i < inputs.length; ++i ) {
5055
- inputs[i].value = new_value[i] ?? 0;
5056
- Panel._dispatch_event(inputs[i], "change");
5081
+ let value = newValue[ i ];
5082
+ inputs[ i ].value = value ?? 0;
5083
+ Panel._dispatch_event( inputs[ i ], "change", skipCallback );
5057
5084
  }
5058
5085
  };
5059
- widget.setValue = (new_value) => {
5060
- const inputs = element.querySelectorAll(".vecinput");
5061
- for( var i = 0; i < inputs.length; ++i ) {
5062
- inputs[i].value = new_value[i] ?? 0;
5063
- }
5064
- }
5065
5086
 
5066
5087
  let element = widget.domEl;
5067
5088
 
5068
5089
  // Add reset functionality
5069
- Panel._add_reset_property(element.domName, function() {
5090
+ Panel._add_reset_property( element.domName, function() {
5070
5091
  this.style.display = "none";
5071
- for( let v of element.querySelectorAll(".vecinput") ) {
5092
+ for( let v of element.querySelectorAll( ".vecinput" ) ) {
5072
5093
  v.value = v.iValue;
5073
- Panel._dispatch_event(v, "change");
5094
+ Panel._dispatch_event( v, "change" );
5074
5095
  }
5075
5096
  });
5076
5097
 
@@ -5082,75 +5103,91 @@ console.warn( 'Script "build/lexgui.js" is depracated and will be removed soon.
5082
5103
 
5083
5104
  for( let i = 0; i < num_components; ++i ) {
5084
5105
 
5085
- let box = document.createElement('div');
5106
+ let box = document.createElement( 'div' );
5086
5107
  box.className = "vecbox";
5087
- box.innerHTML = "<span class='" + Panel.VECTOR_COMPONENTS[i] + "'></span>";
5108
+ box.innerHTML = "<span class='" + Panel.VECTOR_COMPONENTS[ i ] + "'></span>";
5088
5109
 
5089
- let vecinput = document.createElement('input');
5110
+ let vecinput = document.createElement( 'input' );
5090
5111
  vecinput.className = "vecinput v" + num_components;
5091
5112
  vecinput.min = options.min ?? -1e24;
5092
5113
  vecinput.max = options.max ?? 1e24;
5093
5114
  vecinput.step = options.step ?? "any";
5094
5115
  vecinput.type = "number";
5095
- vecinput.id = "vec"+num_components+"_"+simple_guidGenerator();
5116
+ vecinput.id = "vec" + num_components + "_" + simple_guidGenerator();
5096
5117
  vecinput.idx = i;
5097
- vecinput.value = vecinput.iValue = value[i];
5098
5118
 
5099
- let drag_icon = document.createElement('a');
5119
+ if( value[ i ].constructor == Number )
5120
+ {
5121
+ value[ i ] = clamp(value[ i ], +vecinput.min, +vecinput.max);
5122
+ value[ i ] = options.precision ? round(value[ i ], options.precision) : value[ i ];
5123
+ }
5124
+
5125
+ vecinput.value = vecinput.iValue = value[ i ];
5126
+
5127
+ let drag_icon = document.createElement( 'a' );
5100
5128
  drag_icon.className = "fa-solid fa-arrows-up-down drag-icon hidden";
5101
- box.appendChild(drag_icon);
5129
+ box.appendChild( drag_icon );
5102
5130
 
5103
- if(options.disabled) {
5131
+ if( options.disabled ) {
5104
5132
  vecinput.disabled = true;
5105
5133
  }
5106
5134
 
5107
5135
  // Add wheel input
5108
5136
 
5109
- vecinput.addEventListener("wheel", function(e) {
5137
+ vecinput.addEventListener( "wheel", function( e ) {
5110
5138
  e.preventDefault();
5111
- if(this !== document.activeElement)
5139
+ if( this !== document.activeElement )
5112
5140
  return;
5113
5141
  let mult = options.step ?? 1;
5114
- if(e.shiftKey) mult = 10;
5115
- else if(e.altKey) mult = 0.1;
5142
+ if( e.shiftKey ) mult = 10;
5143
+ else if( e.altKey ) mult = 0.1;
5116
5144
 
5117
5145
  if( lock_icon.locked )
5118
5146
  {
5119
5147
  for( let v of element.querySelectorAll(".vecinput") ) {
5120
- v.value = (+v.valueAsNumber - mult * (e.deltaY > 0 ? 1 : -1)).toPrecision(5);
5148
+ v.value = ( +v.valueAsNumber - mult * ( e.deltaY > 0 ? 1 : -1 ) ).toPrecision( 5 );
5121
5149
  Panel._dispatch_event(v, "change");
5122
5150
  }
5123
5151
  } else {
5124
- this.value = (+this.valueAsNumber - mult * (e.deltaY > 0 ? 1 : -1)).toPrecision(5);
5125
- Panel._dispatch_event(vecinput, "change");
5152
+ this.value = ( +this.valueAsNumber - mult * ( e.deltaY > 0 ? 1 : -1 ) ).toPrecision( 5 );
5153
+ Panel._dispatch_event( vecinput, "change" );
5126
5154
  }
5127
- }, {passive:false});
5155
+ }, { passive: false } );
5156
+
5157
+ vecinput.addEventListener( "change", e => {
5128
5158
 
5129
- vecinput.addEventListener("change", e => {
5130
- if(isNaN(e.target.value))
5159
+ if( isNaN( e.target.value ) )
5131
5160
  return;
5132
- let val = e.target.value = clamp(e.target.value, vecinput.min, vecinput.max);
5133
-
5161
+
5162
+ const skipCallback = e.detail;
5163
+
5164
+ let val = e.target.value = clamp( e.target.value, +vecinput.min, +vecinput.max );
5165
+ val = options.precision ? round( val, options.precision ) : val;
5166
+
5134
5167
  // Reset button (default value)
5135
- let btn = element.querySelector(".lexwidgetname .lexicon");
5136
- if(btn) btn.style.display = val != vecinput.iValue ? "block": "none";
5168
+ if( !skipCallback )
5169
+ {
5170
+ let btn = element.querySelector( ".lexwidgetname .lexicon" );
5171
+ if( btn ) btn.style.display = val != vecinput.iValue ? "block": "none";
5172
+ }
5137
5173
 
5138
5174
  if( lock_icon.locked )
5139
5175
  {
5140
- for( let v of element.querySelectorAll(".vecinput") ) {
5176
+ for( let v of element.querySelectorAll( ".vecinput" ) ) {
5141
5177
  v.value = val;
5142
- value[v.idx] = val;
5178
+ value[ v.idx ] = val;
5143
5179
  }
5144
5180
  } else {
5145
- value[e.target.idx] = val;
5181
+ vecinput.value = val;
5182
+ value[ e.target.idx ] = val;
5146
5183
  }
5147
5184
 
5148
- this._trigger( new IEvent(name, value, e), callback );
5149
- }, false);
5185
+ if( !skipCallback ) this._trigger( new IEvent( name, value, e ), callback );
5186
+ }, false );
5150
5187
 
5151
5188
  // Add drag input
5152
5189
 
5153
- vecinput.addEventListener("mousedown", inner_mousedown);
5190
+ vecinput.addEventListener( "mousedown", inner_mousedown );
5154
5191
 
5155
5192
  var that = this;
5156
5193
  var lastY = 0;
@@ -5267,15 +5304,17 @@ console.warn( 'Script "build/lexgui.js" is depracated and will be removed soon.
5267
5304
  throw("Set Widget Name!");
5268
5305
  }
5269
5306
 
5270
- let widget = this.create_widget(name, Widget.PROGRESS, options);
5307
+ let widget = this.create_widget( name, Widget.PROGRESS, options );
5308
+
5271
5309
  widget.onGetValue = () => {
5272
5310
  return progress.value;
5273
5311
  };
5274
- widget.onSetValue = (new_value) => {
5275
- element.querySelector("meter").value = new_value;
5312
+ widget.onSetValue = ( newValue, skipCallback ) => {
5313
+ element.querySelector("meter").value = newValue;
5276
5314
  if( element.querySelector("span") )
5277
- element.querySelector("span").innerText = new_value;
5315
+ element.querySelector("span").innerText = newValue;
5278
5316
  };
5317
+
5279
5318
  let element = widget.domEl;
5280
5319
 
5281
5320
  var container = document.createElement('div');