I use widget decorations in my editor to hide some underlying text. The displayed content of the widget is fetched asynchronously and I then simply change the inner text of the DOM. When I change the content of the widget it can change length but if the cursor is on the same line it does not move accordingly. If I move the cursor manually it behaves correctly again.
I realize that this is because CodeMirror does not know that the widget has changed size. I did not find a proper way to mark the widget dirty. Right now my workaround is to use a ResizeObserver on the DOM and dispatch a selection event for the current cursor position (code below). This is clearly pretty hacky so I was wondering if there’s a better way to do it.
view.dispatch({
selection: view.state.selection,
});
I keep track of the decorations using a StateField<DecorationSet>
but I didn’t find a way to modify a widget in the update method, it seems to only support adding and filtering.
So is there a better way to either:
- Mark the widget as dirty and force a redraw of the cursor position
- Modify the widget in such a way that CodeMirror is aware of the change and to redraw automatically