match slider as function

This commit is contained in:
Felix Roos 2023-09-30 20:39:03 +02:00
parent c93e4a951a
commit 276cf858fc
2 changed files with 26 additions and 28 deletions

View file

@ -13,7 +13,7 @@ export class SliderWidget extends WidgetType {
} }
eq(other) { eq(other) {
const isSame = other.value.toFixed(4) == this.value.toFixed(4); const isSame = other.value.toFixed(4) == this.value.toFixed(4) && other.min == this.min && other.max == this.max;
return isSame; return isSame;
} }
@ -29,7 +29,7 @@ export class SliderWidget extends WidgetType {
slider.value = this.value; slider.value = this.value;
slider.from = this.from; slider.from = this.from;
slider.to = this.to; slider.to = this.to;
slider.className = 'w-16'; slider.className = 'w-16 translate-y-1.5';
return wrap; return wrap;
} }
@ -52,26 +52,28 @@ let nodeValue = (node, view) => view.state.doc.sliceString(node.from, node.to);
}); });
} }
}; */ }; */
// matches something like 123.xxx and returns slider widget
let matchNumberSlider = (node, view) => { // matches something like slider(123) and returns slider widget
if ( let matchSliderFunction = (node, view) => {
node.name === 'MemberExpression' && if (node.name === 'CallExpression' /* && node.node.firstChild.name === 'ArgList' */) {
node.node.firstChild.name === 'Number' && let name = nodeValue(node.node.firstChild, view); // slider ?
node.node.lastChild.name === 'PropertyName' if (name === 'slider') {
) { const args = node.node.lastChild.getChildren('Number');
// node is sth like 123.xxx if (!args.length) {
let prop = nodeValue(node.node.lastChild, view); // get prop name (e.g. xxx) return;
if (prop === 'slider') { }
let value = nodeValue(node.node.firstChild, view); // get number (e.g. 123) const [value, min = 0, max = 1] = args.map((node) => nodeValue(node, view));
// console.log('slider value', value); //console.log('slider value', value, min, max);
let { from, to } = node.node.firstChild; let { from, to } = args[0];
let min = 0; let widget = Decoration.widget({
let max = 10;
return Decoration.widget({
widget: new SliderWidget(Number(value), min, max, from, to), widget: new SliderWidget(Number(value), min, max, from, to),
side: 0, side: 0,
}); });
//widget._range = widget.range(from);
widget._range = widget.range(node.from);
return widget;
} }
// node is sth like 123.xxx
} }
}; };
@ -83,14 +85,11 @@ export function sliders(view) {
from, from,
to, to,
enter: (node) => { enter: (node) => {
let numberSlider = matchNumberSlider(node, view); let widget = matchSliderFunction(node, view);
if (numberSlider) { // let widget = matchNumber(node, view);
widgets.push(numberSlider.range(node.from)); if (widget) {
widgets.push(widget._range || widget.range(node.from));
} }
/* let number = matchNumber(node, view);
if (number) {
widgets.push(number.range(node.from));
} */
}, },
}); });
} }
@ -150,11 +149,9 @@ function updateSliderValue(view, e) {
if (before === next) { if (before === next) {
return false; return false;
} }
//console.log('before', before, '->', insert);
let change = { from: draggedSlider.from, to: draggedSlider.to, insert }; let change = { from: draggedSlider.from, to: draggedSlider.to, insert };
draggedSlider.to = draggedSlider.from + insert.length; draggedSlider.to = draggedSlider.from + insert.length;
//console.log('change', change);
view.dispatch({ changes: change }); view.dispatch({ changes: change });
window.postMessage({ type: 'slider-change', value: next });
return true; return true;
} }

View file

@ -7,6 +7,7 @@ module.exports = {
content: [ content: [
'./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}', './src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}',
'../packages/react/src/**/*.{html,js,jsx,md,mdx,ts,tsx}', '../packages/react/src/**/*.{html,js,jsx,md,mdx,ts,tsx}',
'../packages/codemirror/slider.mjs',
], ],
theme: { theme: {
extend: { extend: {