@@ -19,7 +19,7 @@ const ranges = RangeTouch.setup('input[type="range"]', {});
1919var retry = false ;
2020var palettesData ;
2121var fxdata = [ ] ;
22- var pJson = { } , eJson = { } , lJson = { } ;
22+ var pJson = { } ; // array of presets
2323var plJson = { } ; // array of playlists
2424var pN = "" , pI = 0 , pNum = 0 ;
2525var pmt = 1 , pmtLS = 0 , pmtLast = 0 ;
@@ -527,8 +527,7 @@ function loadPalettes(callback = null)
527527 return res . json ( ) ;
528528 } )
529529 . then ( ( json ) => {
530- lJson = Object . entries ( json ) ;
531- populatePalettes ( ) ;
530+ populatePalettes ( Object . entries ( json ) ) ;
532531 retry = false ;
533532 } )
534533 . catch ( ( e ) => {
@@ -554,8 +553,7 @@ function loadFX(callback = null)
554553 return res . json ( ) ;
555554 } )
556555 . then ( ( json ) => {
557- eJson = Object . entries ( json ) ;
558- populateEffects ( ) ;
556+ populateEffects ( Object . entries ( json ) ) ;
559557 retry = false ;
560558 } )
561559 . catch ( ( e ) => {
@@ -636,10 +634,10 @@ function populatePresets(fromls)
636634
637635 cn += `<div class="pres lstI" id="p${ i } o">` ;
638636 if ( cfg . comp . pid ) cn += `<div class="pid">${ i } </div>` ;
639- cn += `<div class="pname lstIname " onclick="setPreset(${ i } )">${ i == lastinfo . leds . bootps ?"<i class='icons btn-icon'></i>" :"" } ${ isPlaylist ( i ) ?"<i class='icons btn-icon'></i>" :"" } ${ pName ( i ) }
637+ cn += `<div class="pname name " onclick="setPreset(${ i } )">${ i == lastinfo . leds . bootps ?"<i class='icons btn-icon'></i>" :"" } ${ isPlaylist ( i ) ?"<i class='icons btn-icon'></i>" :"" } ${ pName ( i ) }
640638 <i class="icons edit-icon flr" id="p${ i } nedit" onclick="tglSegn(${ i + 100 } )"></i></div>
641639 <i class="icons e-icon flr" id="sege${ i + 100 } " onclick="expand(${ i + 100 } )"></i>
642- <div class="presin lstIcontent " id="seg${ i + 100 } "></div>
640+ <div class="presin content " id="seg${ i + 100 } "></div>
643641</div>` ;
644642 pNum ++ ;
645643 }
@@ -938,9 +936,8 @@ function populateSegments(s)
938936 tooltip ( "#Segments" ) ;
939937}
940938
941- function populateEffects ( )
939+ function populateEffects ( effects )
942940{
943- var effects = eJson ;
944941 var html = "" ;
945942
946943 effects . shift ( ) ; // temporary remove solid
@@ -959,33 +956,33 @@ function populateEffects()
959956 for ( let ef of effects ) {
960957 // add slider and color control to setFX (used by requestjson)
961958 let id = ef . id ;
962- let nm = ef . name + " " ;
963- let fd = "" ;
959+ let nm = ef . name ;
960+ let fd = "" , fl = " " ;
964961 if ( ef . name . indexOf ( "RSVD" ) < 0 ) {
965962 if ( Array . isArray ( fxdata ) && fxdata . length > id ) {
966963 if ( fxdata [ id ] . length == 0 ) fd = ";;!;1"
967964 else fd = fxdata [ id ] ;
968965 let eP = ( fd == '' ) ?[ ] :fd . split ( ";" ) ; // effect parameters
969966 let p = ( eP . length < 3 || eP [ 2 ] === '' ) ?[ ] :eP [ 2 ] . split ( "," ) ; // palette data
970- if ( p . length > 0 && ( p [ 0 ] !== "" && ! isNumeric ( p [ 0 ] ) ) ) nm += "🎨" ; // effects using palette
967+ if ( p . length > 0 && ( p [ 0 ] !== "" && ! isNumeric ( p [ 0 ] ) ) ) fl += "🎨" ; // effects using palette
971968 let m = ( eP . length < 4 || eP [ 3 ] === '' ) ?'1' :eP [ 3 ] ; // flags
972969 if ( id == 0 ) m = '' ; // solid has no flags
973970 if ( m . length > 0 ) {
974- if ( m . includes ( '0' ) ) nm += "•" ; // 0D effects (PWM & On/Off)
975- if ( m . includes ( '1' ) ) nm += "⋮" ; // 1D effects
976- if ( m . includes ( '2' ) ) nm += "▦" ; // 2D effects
977- if ( m . includes ( 'v' ) ) nm += "♪" ; // volume effects
978- if ( m . includes ( 'f' ) ) nm += "♫" ; // frequency effects
971+ if ( m . includes ( '0' ) ) fl += "•" ; // 0D effects (PWM & On/Off)
972+ if ( m . includes ( '1' ) ) fl += "⋮" ; // 1D effects
973+ if ( m . includes ( '2' ) ) fl += "▦" ; // 2D effects
974+ if ( m . includes ( 'v' ) ) fl += "♪" ; // volume effects
975+ if ( m . includes ( 'f' ) ) fl += "♫" ; // frequency effects
979976 }
980977 }
981- html += generateListItemHtml ( 'fx' , id , nm , 'setFX' , '' , fd ) ;
978+ html += generateListItemHtml ( 'fx' , id , ` ${ nm } </span><span class="fltr"> ${ fl } ` , 'setFX' , '' , fd ) ;
982979 }
983980 }
984981
985982 gId ( 'fxlist' ) . innerHTML = html ;
986983}
987984
988- function populatePalettes ( )
985+ function populatePalettes ( lJson )
989986{
990987 lJson . shift ( ) ; // temporary remove default
991988 lJson . sort ( ( a , b ) => ( a [ 1 ] ) . localeCompare ( b [ 1 ] ) ) ;
@@ -998,7 +995,7 @@ function populatePalettes()
998995 pa [ 0 ] ,
999996 pa [ 1 ] ,
1000997 'setPalette' ,
1001- `<div class="lstIprev " style="${ genPalPrevCss ( pa [ 0 ] ) } "></div>`
998+ `<div class="prev " style="${ genPalPrevCss ( pa [ 0 ] ) } "></div>`
1002999 ) ;
10031000 }
10041001 gId ( 'pallist' ) . innerHTML = html ;
@@ -1013,7 +1010,7 @@ function populatePalettes()
10131010 255 - j ,
10141011 '~ Custom ' + j + ' ~' ,
10151012 'setPalette' ,
1016- `<div class="lstIprev " style="${ genPalPrevCss ( 255 - j ) } "></div>`
1013+ `<div class="prev " style="${ genPalPrevCss ( 255 - j ) } "></div>`
10171014 ) ;
10181015 }
10191016 }
@@ -1024,7 +1021,7 @@ function populatePalettes()
10241021function redrawPalPrev ( )
10251022{
10261023 d . querySelectorAll ( '#pallist .lstI' ) . forEach ( ( pal , i ) => {
1027- let lP = pal . querySelector ( '.lstIprev ' ) ;
1024+ let lP = pal . querySelector ( '.prev ' ) ;
10281025 if ( lP ) {
10291026 lP . style = genPalPrevCss ( pal . dataset . id ) ;
10301027 }
@@ -1082,8 +1079,8 @@ function generateListItemHtml(listName, id, name, clickAction, extraHtml = '', e
10821079 `<label title="(${ id } )" class="radio schkl" onclick="event.preventDefault()">` + // (#1984)
10831080 `<input type="radio" value="${ id } " name="${ listName } ">` +
10841081 `<span class="radiomark"></span>` +
1085- `<div class="lstIcontent ">` +
1086- `<span class="lstIname ">${ name } </span>` +
1082+ `<div class="content ">` +
1083+ `<span class="name ">${ name } </span>` +
10871084 `</div>` +
10881085 `</label>` +
10891086 extraHtml +
@@ -1215,9 +1212,9 @@ function updateLen(s)
12151212 if ( stop - start > 1 && stopY - startY > 1 ) {
12161213 // 2D segment
12171214 if ( tPL ) tPL . classList . remove ( 'hide' ) ; // unhide transpose checkbox
1218- let sE = d . querySelector ( `#fxlist .lstI [data-id="${ selectedFx } "]` ) ;
1215+ let sE = d . querySelector ( `#fxlist div [data-id="${ selectedFx } "]` ) ;
12191216 if ( sE ) {
1220- let sN = sE . querySelector ( ".lstIname " ) . innerText ;
1217+ let sN = sE . querySelector ( ".name " ) . innerText ;
12211218 let seg = gId ( `seg${ s } map2D` ) ;
12221219 if ( seg ) {
12231220 if ( sN . indexOf ( "\u25A6" ) < 0 ) seg . classList . remove ( 'hide' ) ; // unhide mapping for 1D effects (| in name)
@@ -1328,11 +1325,11 @@ function updateSelectedPalette(s)
13281325 var selElement = parent . querySelector ( '.selected' ) ;
13291326 if ( selElement ) selElement . classList . remove ( 'selected' ) ;
13301327
1331- var selectedPalette = parent . querySelector ( `.lstI [data-id="${ s } "]` ) ;
1332- if ( selectedPalette ) parent . querySelector ( `.lstI [data-id="${ s } "]` ) . classList . add ( 'selected' ) ;
1328+ var selectedPalette = parent . querySelector ( `div [data-id="${ s } "]` ) ;
1329+ if ( selectedPalette ) parent . querySelector ( `div [data-id="${ s } "]` ) . classList . add ( 'selected' ) ;
13331330
13341331 // Display selected palette name on button in simplified UI
1335- let selectedName = selectedPalette . querySelector ( ".lstIname " ) . innerText ;
1332+ let selectedName = selectedPalette . querySelector ( ".name " ) . innerText ;
13361333 if ( simplifiedUI ) {
13371334 gId ( "palwbtn" ) . innerText = "Palette: " + selectedName ;
13381335 }
@@ -1360,7 +1357,7 @@ function updateSelectedFx()
13601357 selElement . style . bottom = null ; // remove element style added in slider handling
13611358 }
13621359
1363- var selectedEffect = parent . querySelector ( `.lstI [data-id="${ selectedFx } "]` ) ;
1360+ var selectedEffect = parent . querySelector ( `div [data-id="${ selectedFx } "]` ) ;
13641361 if ( selectedEffect ) {
13651362 selectedEffect . classList . add ( 'selected' ) ;
13661363 setEffectParameters ( selectedFx ) ;
@@ -1378,7 +1375,7 @@ function updateSelectedFx()
13781375 }
13791376 }
13801377 } ) ;
1381- var selectedName = selectedEffect . querySelector ( ".lstIname " ) . innerText ;
1378+ var selectedName = selectedEffect . querySelector ( ".name " ) . innerText ;
13821379
13831380 // Display selected effect name on button in simplified UI
13841381 let selectedNameOnlyAscii = selectedName . replace ( / [ ^ \x00 - \x7F ] / g, "" ) ;
@@ -1388,7 +1385,7 @@ function updateSelectedFx()
13881385
13891386 // hide 2D mapping and/or sound simulation options
13901387 d . querySelectorAll ( `#segcont div[data-map="map2D"]` ) . forEach ( ( seg ) => {
1391- let not2Dfx = d . querySelector ( `#fxlist div[data-id="${ seg . dataset . fx } "] .lstIname ` ) . innerText . indexOf ( "\u25A6" ) < 0 ;
1388+ let not2Dfx = d . querySelector ( `#fxlist div[data-id="${ seg . dataset . fx } "] .name ` ) . innerText . indexOf ( "\u25A6" ) < 0 ;
13921389 if ( not2Dfx ) seg . classList . remove ( 'hide' ) ;
13931390 else seg . classList . add ( 'hide' ) ;
13941391 } ) ;
@@ -1752,7 +1749,7 @@ function requestJson(command=null)
17521749 if ( json . info ) {
17531750 let i = json . info ;
17541751 parseInfo ( i ) ;
1755- populatePalettes ( i ) ;
1752+ // populatePalettes();
17561753 if ( isInfo ) populateInfo ( i ) ;
17571754 if ( simplifiedUI ) simplifyUI ( ) ;
17581755 }
@@ -2062,17 +2059,17 @@ ${makePlSel(i, plJson[i].end?plJson[i].end:0)}
20622059 } else {
20632060 content =
20642061`<label class="check revchkl">
2065- <span class="lstIname ">Include brightness</span>
2062+ <span class="name ">Include brightness</span>
20662063 <input type="checkbox" id="p${ i } ibtgl" checked>
20672064 <span class="checkmark"></span>
20682065</label>
20692066<label class="check revchkl">
2070- <span class="lstIname ">Save segment bounds</span>
2067+ <span class="name ">Save segment bounds</span>
20712068 <input type="checkbox" id="p${ i } sbtgl" checked>
20722069 <span class="checkmark"></span>
20732070</label>
20742071<label class="check revchkl">
2075- <span class="lstIname ">Checked segments only</span>
2072+ <span class="name ">Checked segments only</span>
20762073 <input type="checkbox" id="p${ i } sbchk">
20772074 <span class="checkmark"></span>
20782075</label>` ;
@@ -2088,15 +2085,15 @@ ${makePlSel(i, plJson[i].end?plJson[i].end:0)}
20882085<div class="h">(leave empty for no Quick load button)</div>
20892086<div ${ pl && i == 0 ?"style='display:none'" :"" } >
20902087<label class="check revchkl">
2091- <span class="lstIname ">${ pl ?"Show playlist editor" :( i > 0 ) ?"Overwrite with state" :"Use current state" } </span>
2088+ <span class="name ">${ pl ?"Show playlist editor" :( i > 0 ) ?"Overwrite with state" :"Use current state" } </span>
20922089 <input type="checkbox" id="p${ i } cstgl" onchange="tglCs(${ i } )" ${ ( i == 0 || pl ) ?"checked" :"" } >
20932090 <span class="checkmark"></span>
20942091</label>
20952092</div>
20962093<div class="po2" id="p${ i } o2">API command<br><textarea class="apitxt" id="p${ i } api"></textarea></div>
20972094<div class="po1" id="p${ i } o1">${ content } </div>
20982095<label class="check revchkl">
2099- <span class="lstIname ">Apply at boot</span>
2096+ <span class="name ">Apply at boot</span>
21002097 <input type="checkbox" id="p${ i } bps" ${ i == bps ?"checked" :"" } >
21012098 <span class="checkmark"></span>
21022099</label>
@@ -2117,7 +2114,7 @@ function makePUtil()
21172114 p . innerHTML = `<div class="presin expanded">${ makeP ( 0 ) } </div>` ;
21182115 let pTx = gId ( 'p0txt' ) ;
21192116 pTx . focus ( ) ;
2120- pTx . value = eJson . find ( ( o ) => { return o . id == selectedFx } ) . name ;
2117+ pTx . value = d . querySelector ( `#fxlist div[data- id=" ${ selectedFx } "] .name` ) . innerText ;
21212118 pTx . select ( ) ;
21222119 p . scrollIntoView ( {
21232120 behavior : 'smooth' ,
@@ -2869,7 +2866,7 @@ function getPalettesData(page, callback)
28692866function hideModes(txt)
28702867{
28712868 for (let e of (d.querySelectorAll('#fxlist .lstI')||[])) {
2872- let iT = e.querySelector('.lstIname ').innerText;
2869+ let iT = e.querySelector('.name ').innerText;
28732870 let f = false;
28742871 if (txt==="2D") f = iT.indexOf("\u25A6") >= 0 && iT.indexOf("\u22EE") < 0; // 2D && !1D
28752872 else f = iT.indexOf(txt) >= 0;
@@ -2883,17 +2880,6 @@ function search(field, listId = null) {
28832880
28842881 const search = field . value !== '' ;
28852882
2886- // restore default preset sorting if no search term is entered
2887- if ( ! search ) {
2888- if ( listId === 'pcont' ) { populatePresets ( ) ; return ; }
2889- if ( listId === 'pallist' ) {
2890- let id = parseInt ( d . querySelector ( '#pallist input[name="palette"]:checked' ) . value ) ; // preserve selected palette
2891- populatePalettes ( ) ;
2892- updateSelectedPalette ( id ) ;
2893- return ;
2894- }
2895- }
2896-
28972883 // clear filter if searching in fxlist
28982884 if ( listId === 'fxlist' && search ) {
28992885 d . querySelectorAll ( "#filters input[type=checkbox]" ) . forEach ( ( e ) => { e . checked = false ; } ) ;
@@ -2906,14 +2892,18 @@ function search(field, listId = null) {
29062892 const listItems = gId ( listId ) . querySelectorAll ( '.lstI' ) ;
29072893 listItems . forEach ( ( listItem , i ) => {
29082894 if ( listId !== 'pcont' && i === 0 ) return ;
2909- const listItemName = listItem . querySelector ( '.lstIname ' ) . innerText . toUpperCase ( ) ;
2895+ const listItemName = listItem . querySelector ( '.name ' ) . innerText . toUpperCase ( ) ;
29102896 const searchIndex = listItemName . indexOf ( field . value . toUpperCase ( ) ) ;
29112897 if ( searchIndex < 0 ) {
29122898 listItem . dataset . searchIndex = Number . MAX_SAFE_INTEGER ;
29132899 } else {
29142900 listItem . dataset . searchIndex = searchIndex ;
29152901 }
2916- listItem . style . display = ( searchIndex < 0 ) && ! listItem . classList . contains ( "selected" ) ? 'none' : '' ;
2902+ if ( ( searchIndex < 0 ) && ! listItem . classList . contains ( "selected" ) ) {
2903+ listItem . classList . add ( 'hide' ) ;
2904+ } else {
2905+ listItem . classList . remove ( 'hide' ) ;
2906+ }
29172907 } ) ;
29182908
29192909 // sort list items by search index and name
@@ -2925,8 +2915,8 @@ function search(field, listId = null) {
29252915 return aSearchIndex - bSearchIndex ;
29262916 }
29272917
2928- const aName = a . querySelector ( '.lstIname ' ) . innerText . toUpperCase ( ) ;
2929- const bName = b . querySelector ( '.lstIname ' ) . innerText . toUpperCase ( ) ;
2918+ const aName = a . querySelector ( '.name ' ) . innerText . toUpperCase ( ) ;
2919+ const bName = b . querySelector ( '.name ' ) . innerText . toUpperCase ( ) ;
29302920
29312921 return aName . localeCompare ( bName ) ;
29322922 } ) ;
@@ -2961,6 +2951,7 @@ function filterFocus(e) {
29612951 // compute sticky top (with delay for transition)
29622952 if ( ! h ) setTimeout ( ( ) => {
29632953 sCol ( '--sti' , ( sti + f . offsetHeight ) + "px" ) ; // has an unpleasant consequence on palette offset
2954+ //console.log(sti + " -> " + (sti+f.offsetHeight));
29642955 } , 255 ) ;
29652956 f . classList . remove ( 'fade' ) ; // immediately show (still has transition)
29662957 }
@@ -2971,6 +2962,7 @@ function filterFocus(e) {
29712962 if ( ! c ) {
29722963 // compute sticky top
29732964 sCol ( '--sti' , ( sti - h ) + "px" ) ; // has an unpleasant consequence on palette offset
2965+ //console.log(sti + " -> " + (sti-h));
29742966 f . classList . add ( 'fade' ) ;
29752967 }
29762968 } , 255 ) ; // wait with hiding
@@ -2983,7 +2975,7 @@ function filterFx() {
29832975 inputField . focus ( ) ;
29842976 clean ( inputField . nextElementSibling ) ;
29852977 d . querySelectorAll ( '#fxlist .lstI' ) . forEach ( ( listItem , i ) => {
2986- const listItemName = listItem . querySelector ( '.lstIname ' ) . innerText ;
2978+ const listItemName = listItem . querySelector ( '.fltr ' ) . innerText ;
29872979 let hide = false ;
29882980 d . querySelectorAll ( "#filters input[type=checkbox]" ) . forEach ( ( e ) => { if ( e . checked && ! listItemName . includes ( e . dataset . flt ) ) hide = i > 0 /*true*/ ; } ) ;
29892981 listItem . style . display = hide && ! listItem . classList . contains ( "selected" ) ? 'none' : '' ;
0 commit comments