Skip to content

Instantly share code, notes, and snippets.

@kungfooman
Last active June 6, 2021 09:38
Show Gist options
  • Save kungfooman/5eb4fcc0fff188a900ccec9cfaf5e48e to your computer and use it in GitHub Desktop.
Save kungfooman/5eb4fcc0fff188a900ccec9cfaf5e48e to your computer and use it in GitHub Desktop.
Ganja slider no range limits
editor.getSession().selection.on('changeSelection', function(e) {
if (lock) {
return;
}
// Get the selection plus two extra chars.
var range = editor.getSelectionRange();
range.end.column += 1; range.start.column -= 1;
var t = editor.getSession().getTextRange(range);
// Remove old slider.
if (_slider) {
_slider.remove();
_slider = null;
}
if (_sliderinfo) {
_sliderinfo.remove();
_sliderinfo = null;
}
if (_color) {
_color.remove();
_color = null;
}
if (range.start.column == range.end.column-2) {
return;
}
// If its a hex number, setup the color thingie
var color = t.match(/^[^\d]0x([0-9a-fA-F]+)[^0-9a-fA-F]$/);
if (color) {
_color = document.createElement('input');
Object.assign(_color,{type:'color', value:'#'+color[1]});
var pos = editor.renderer.textToScreenCoordinates(range.start)
Object.assign(_color.style, {position:'fixed', top:pos.pageY-30+'px', left:pos.pageX+5+'px'});
document.getElementById('source').appendChild(_color);
_color.oninput = function(e) {
lock = true;
var range = editor.selection.getRange();
range.end = editor.session.replace(editor.selection.getRange(), '0x'+this.value.slice(1));
editor.selection.setRange(range);
lock = false;
if (timeout) {
clearTimeout(timeout);
}
timeout = setTimeout(()=>els.run.click(),1000/60);
inspect(true);
}
}
// If its a number, setup the slider.
var number = t.match(/^[^\d\.\-x]([+-]{0,1}\d*\.{0,1}\d*)[^\d\.x]$/);
//if (number) {
// console.log("number[1]", number[1]);
//}
if (number && number[1] != '' && !isNaN(Number(number[1]))) {
var num = Number(number[1]);
_slider = document.createElement('input');
_slider.type = 'range';
_slider.min = num - sliderscale;
_slider.max = num + sliderscale;
_slider.value = num;
var pos = editor.renderer.textToScreenCoordinates(range.start);
_slider.style.position = 'fixed';
_slider.style.top = pos.pageY - 30 + 'px';
_slider.style.left = pos.pageX + 5 + 'px';
_sliderinfo = document.createElement('input');
_sliderinfo.style.width = '400px';
_sliderinfo.style.background = 'rgba(0,0,0,0.5)';
_sliderinfo.style.color = 'white';
function set_sliderscale() {
var val = Number(_slider.value);
_slider.min = val - sliderscale;
_slider.max = val + sliderscale;
_slider.step = sliderscale * 0.1;
_sliderinfo.value = `val=${_slider.value} sliderscale=${sliderscale} step=${_slider.step} min=${_slider.min} max=${_slider.max}`;
}
set_sliderscale();
Object.assign(_sliderinfo.style, {
position: 'fixed',
top: pos.pageY - 60 + 'px',
left: pos.pageX + 5 + 'px'
});
source.append(_slider);
source.append(_sliderinfo);
_slider.oninput = function(e) {
lock = true;
var range = editor.selection.getRange();
range.end = editor.session.replace(editor.selection.getRange(), this.value + '');
editor.selection.setRange(range);
lock = false;
if (timeout) {
clearTimeout(timeout);
}
timeout = setTimeout(()=>els.run.click(),1000/60);
inspect(true);
}
_slider.focus();
_slider.onkeydown = function(e) {
//console.log("_slider> onkeydown", e);
switch (e.key) {
case 'Escape':
_slider.remove();
_slider = null;
_sliderinfo.remove();
_sliderinfo = null;
editor.focus();
return; // don't update since slider is deleted now
case 'ArrowUp':
sliderscale *= 2;
e.preventDefault();
break;
case 'ArrowDown':
sliderscale /= 2;
e.preventDefault();
break;
}
// Always update to "recalibrate" number into the middle of the slider
set_sliderscale();
}
}
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment