@dodona/papyros
Version:
Scratchpad for multiple programming languages in the browser.
64 lines • 2.26 kB
JavaScript
import { Decoration, EditorView, gutterLineClass, GutterMarker } from "@codemirror/view";
import { LineEffectExtension } from "./LineEffectExtension";
import { DebugLineGutter } from "./Gutters";
import { RangeSet, StateEffect, StateField } from "@codemirror/state";
import { BackendManager } from "../BackendManager";
import { BackendEventType } from "../BackendEvent";
const activeLineDecoration = Decoration.line({ class: "cm-activeLine" });
const activeLineGutterMarker = new class extends GutterMarker {
constructor() {
super(...arguments);
this.elementClass = "cm-activeLineGutter";
}
};
const markLine = StateEffect.define();
const markedLine = StateField.define({
create: () => undefined,
update(value, tr) {
for (const effect of tr.effects) {
if (effect.is(markLine)) {
return effect.value;
}
}
return value;
}
});
const markedLineGutterHighlighter = gutterLineClass.compute([markedLine], state => {
if (state.field(markedLine) === undefined) {
return RangeSet.empty;
}
const linePos = state.doc.line(state.field(markedLine)).from;
return RangeSet.of([activeLineGutterMarker.range(linePos)]);
});
export class DebugExtension {
constructor(view) {
this.view = view;
this.gutter = new DebugLineGutter();
this.lineEffect = new LineEffectExtension(view);
BackendManager.subscribe(BackendEventType.FrameChange, e => {
const line = e.data.line;
this.markLine(line);
});
}
reset() {
this.markLine(1);
}
markLine(lineNr) {
this.gutter.markLine(this.view, lineNr);
this.lineEffect.set([activeLineDecoration.range(this.view.state.doc.line(lineNr).from)]);
this.view.dispatch({ effects: [
markLine.of(lineNr),
EditorView.scrollIntoView(this.view.state.doc.line(lineNr).from)
] });
}
toExtension() {
return [
this.lineEffect.toExtension(),
this.gutter.toExtension(),
markedLine,
markedLineGutterHighlighter,
EditorView.editable.of(false)
];
}
}
//# sourceMappingURL=DebugExtension.js.map