edit: throttle setOption for 'theme' and 'lineWrapping'
when the style has more than 4 sections, these options are propagated to CM instances in 100 ms chunks, and a progress overlay is shown over the corresponding option element after 100 ms
This commit is contained in:
		
							parent
							
								
									a8796b0bd2
								
							
						
					
					
						commit
						3d0b811b27
					
				| 
						 | 
					@ -134,6 +134,12 @@ h2 .svg-icon, label .svg-icon {
 | 
				
			||||||
#options .option > * {
 | 
					#options .option > * {
 | 
				
			||||||
  padding-right: 0.25rem;
 | 
					  padding-right: 0.25rem;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					.set-option-progress {
 | 
				
			||||||
 | 
					  position: absolute;
 | 
				
			||||||
 | 
					  background-color: currentColor;
 | 
				
			||||||
 | 
					  content: "";
 | 
				
			||||||
 | 
					  opacity: .15;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
/************ content ***********/
 | 
					/************ content ***********/
 | 
				
			||||||
#sections > div {
 | 
					#sections > div {
 | 
				
			||||||
  margin: 0.7rem;
 | 
					  margin: 0.7rem;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										81
									
								
								edit/edit.js
									
									
									
									
									
								
							
							
						
						
									
										81
									
								
								edit/edit.js
									
									
									
									
									
								
							| 
						 | 
					@ -269,6 +269,10 @@ function initCodeMirror() {
 | 
				
			||||||
  CM.getOption = o => CodeMirror.defaults[o];
 | 
					  CM.getOption = o => CodeMirror.defaults[o];
 | 
				
			||||||
  CM.setOption = (o, v) => {
 | 
					  CM.setOption = (o, v) => {
 | 
				
			||||||
    CodeMirror.defaults[o] = v;
 | 
					    CodeMirror.defaults[o] = v;
 | 
				
			||||||
 | 
					    if (editors.length > 4 && (o === 'theme' || o === 'lineWrapping')) {
 | 
				
			||||||
 | 
					      throttleSetOption({key: o, value: v, index: 0});
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    editors.forEach(editor => {
 | 
					    editors.forEach(editor => {
 | 
				
			||||||
      editor.setOption(o, v);
 | 
					      editor.setOption(o, v);
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
| 
						 | 
					@ -306,6 +310,83 @@ function initCodeMirror() {
 | 
				
			||||||
  setupLivePrefs();
 | 
					  setupLivePrefs();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  hotkeyRerouter.setState(true);
 | 
					  hotkeyRerouter.setState(true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const THROTTLE_AFTER_MS = 100;
 | 
				
			||||||
 | 
					  const THROTTLE_SHOW_PROGRESS_AFTER_MS = 100;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  function throttleSetOption({
 | 
				
			||||||
 | 
					    key,
 | 
				
			||||||
 | 
					    value,
 | 
				
			||||||
 | 
					    index,
 | 
				
			||||||
 | 
					    timeStart = performance.now(),
 | 
				
			||||||
 | 
					    cmStart = editors.lastActive || editors[0],
 | 
				
			||||||
 | 
					    editorsCopy = editors.slice(),
 | 
				
			||||||
 | 
					    progress,
 | 
				
			||||||
 | 
					  }) {
 | 
				
			||||||
 | 
					    if (index === 0) {
 | 
				
			||||||
 | 
					      if (!cmStart) {
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      cmStart.setOption(key, value);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    const t0 = performance.now();
 | 
				
			||||||
 | 
					    const total = editorsCopy.length;
 | 
				
			||||||
 | 
					    while (index < total) {
 | 
				
			||||||
 | 
					      const cm = editorsCopy[index++];
 | 
				
			||||||
 | 
					      if (cm === cmStart ||
 | 
				
			||||||
 | 
					          cm !== editors[index] && !editors.includes(cm)) {
 | 
				
			||||||
 | 
					        continue;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      cm.setOption(key, value);
 | 
				
			||||||
 | 
					      if (performance.now() - t0 > THROTTLE_AFTER_MS) {
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (index >= total) {
 | 
				
			||||||
 | 
					      if (progress) {
 | 
				
			||||||
 | 
					        progress.remove();
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (!progress &&
 | 
				
			||||||
 | 
					        index < total / 2 &&
 | 
				
			||||||
 | 
					        t0 - timeStart > THROTTLE_SHOW_PROGRESS_AFTER_MS) {
 | 
				
			||||||
 | 
					      let option = $('#editor.' + key);
 | 
				
			||||||
 | 
					      if (option) {
 | 
				
			||||||
 | 
					        if (option.type === 'checkbox') {
 | 
				
			||||||
 | 
					          option = (option.labels || [])[0] || option.nextElementSibling || option;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        progress = document.body.appendChild($element({
 | 
				
			||||||
 | 
					          className: 'set-option-progress',
 | 
				
			||||||
 | 
					          targetElement: option,
 | 
				
			||||||
 | 
					        }));
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (progress) {
 | 
				
			||||||
 | 
					      const optionBounds = progress.targetElement.getBoundingClientRect();
 | 
				
			||||||
 | 
					      const bounds = {
 | 
				
			||||||
 | 
					        top: optionBounds.top + window.scrollY + 1,
 | 
				
			||||||
 | 
					        left: optionBounds.left + window.scrollX + 1,
 | 
				
			||||||
 | 
					        width: (optionBounds.width - 2) * index / total | 0,
 | 
				
			||||||
 | 
					        height: optionBounds.height - 2,
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					      const style = progress.style;
 | 
				
			||||||
 | 
					      for (const prop in bounds) {
 | 
				
			||||||
 | 
					        if (bounds[prop] !== parseFloat(style[prop])) {
 | 
				
			||||||
 | 
					          style[prop] = bounds[prop] + 'px';
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    setTimeout(throttleSetOption, 0, {
 | 
				
			||||||
 | 
					      key,
 | 
				
			||||||
 | 
					      value,
 | 
				
			||||||
 | 
					      index,
 | 
				
			||||||
 | 
					      timeStart,
 | 
				
			||||||
 | 
					      cmStart,
 | 
				
			||||||
 | 
					      editorsCopy,
 | 
				
			||||||
 | 
					      progress,
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function acmeEventListener(event) {
 | 
					function acmeEventListener(event) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user