0
0
mirror of https://github.com/naturalcrit/homebrewery.git synced 2026-05-09 22:48:39 +00:00

source move flash restored

This commit is contained in:
Víctor Losada Hernández
2026-04-13 12:12:10 +02:00
parent 2e990238d3
commit de77de84d9
2 changed files with 40 additions and 3 deletions
+39 -2
View File
@@ -15,6 +15,7 @@ import {
dropCursor, dropCursor,
} from '@codemirror/view'; } from '@codemirror/view';
import { EditorState, Compartment } from '@codemirror/state'; import { EditorState, Compartment } from '@codemirror/state';
import { StateEffect, StateField } from '@codemirror/state';
import { foldAll as foldAllCmd, unfoldAll as unfoldAllCmd, foldGutter, foldKeymap, syntaxHighlighting } from '@codemirror/language'; import { foldAll as foldAllCmd, unfoldAll as unfoldAllCmd, foldGutter, foldKeymap, syntaxHighlighting } from '@codemirror/language';
import { defaultKeymap, history, undo, redo, undoDepth, redoDepth } from '@codemirror/commands'; import { defaultKeymap, history, undo, redo, undoDepth, redoDepth } from '@codemirror/commands';
import { languages } from '@codemirror/language-data'; import { languages } from '@codemirror/language-data';
@@ -95,6 +96,33 @@ const createHighlightPlugin = (renderer, tab)=>{
{ decorations: (v)=>v.decorations } { decorations: (v)=>v.decorations }
); );
}; };
const setProgrammaticCursorLine = StateEffect.define();
const programmaticCursorLineField = StateField.define({
create() {
return Decoration.none;
},
update(decorations, transitionState) {
//deco is the decoratiions object
//tr is the transition state object, tr.effects is an array of stateEffects
//seems to be the easiest way of setting a class programatically only when called
for (const effects of transitionState.effects) {
if(effects.is(setProgrammaticCursorLine)) {
const pos = effects.value;
if (pos == null) return Decoration.none;
const line = transitionState.state.doc.lineAt(pos);
return Decoration.set([
Decoration.line({
class : 'sourceMoveFlash'
}).range(line.from)
]);
}
}
return decorations;
},
provide : (decorationSet)=>EditorView.decorations.from(decorationSet)
});
const CodeEditor = forwardRef( const CodeEditor = forwardRef(
( (
@@ -202,6 +230,7 @@ const CodeEditor = forwardRef(
drawSelection(), drawSelection(),
EditorState.allowMultipleSelections.of(true), EditorState.allowMultipleSelections.of(true),
dropCursor(), dropCursor(),
programmaticCursorLineField,
]; ];
}; };
@@ -369,14 +398,22 @@ const CodeEditor = forwardRef(
}, },
setCursorToPage : (pageNumber)=>{ setCursorToPage : (pageNumber)=>{
const view = viewRef.current; const view = viewRef.current;
if(!view) return 0; if(!view) return;
const pos = pageBreaksRef.current[pageNumber - 1] ?? 0; const pos = pageBreaksRef.current[pageNumber - 1] ?? 0;
view.dispatch({ view.dispatch({
selection : { anchor: pos } selection : { anchor: pos },
effects : setProgrammaticCursorLine.of(pos)
}); });
view.focus(); view.focus();
setTimeout(() => {
view.dispatch({
effects: setProgrammaticCursorLine.of(null)
});
}, 400);
}, },
undo : ()=>undo(viewRef.current), undo : ()=>undo(viewRef.current),
+1 -1
View File
@@ -43,7 +43,7 @@
} }
/* Flash animation for source moves */ /* Flash animation for source moves */
.sourceMoveFlash .cm-line { .cm-line.sourceMoveFlash {
animation-name: sourceMoveAnimation; animation-name: sourceMoveAnimation;
animation-duration: 0.4s; animation-duration: 0.4s;
} }