BUGFIX: Save position of cursor when switching tabs and unmounting editor (#1297)

This commit is contained in:
catloversg 2024-05-23 15:51:33 +07:00 committed by GitHub
parent 7f8757b536
commit 8703da4ab6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 21 additions and 33 deletions

@ -1,29 +0,0 @@
interface Position {
row: number;
column: number;
}
class PositionTracker {
positions: Map<string, Position>;
constructor() {
this.positions = new Map<string, Position>();
}
saveCursor(filename: string, pos: Position): void {
this.positions.set(filename, pos);
}
getCursor(filename: string): Position {
const position = this.positions.get(filename);
if (!position) {
return {
row: -1,
column: -1,
};
}
return position;
}
}
export const CursorPositions: PositionTracker = new PositionTracker();

@ -10,9 +10,11 @@ interface EditorProps {
onMount: (editor: monaco.editor.IStandaloneCodeEditor) => void; onMount: (editor: monaco.editor.IStandaloneCodeEditor) => void;
/** Function to be ran every time the code is updated */ /** Function to be ran every time the code is updated */
onChange: (newCode?: string) => void; onChange: (newCode?: string) => void;
/** This function is called before unmounting the editor */
onUnmount: () => void;
} }
export function Editor({ onMount, onChange }: EditorProps) { export function Editor({ onMount, onChange, onUnmount }: EditorProps) {
const containerDiv = useRef<HTMLDivElement | null>(null); const containerDiv = useRef<HTMLDivElement | null>(null);
const editorRef = useRef<monaco.editor.IStandaloneCodeEditor | null>(null); const editorRef = useRef<monaco.editor.IStandaloneCodeEditor | null>(null);
const subscription = useRef<monaco.IDisposable | null>(null); const subscription = useRef<monaco.IDisposable | null>(null);
@ -41,6 +43,7 @@ export function Editor({ onMount, onChange }: EditorProps) {
// Unmounting // Unmounting
return () => { return () => {
onUnmount();
subscription.current?.dispose(); subscription.current?.dispose();
monaco.editor.getModels().forEach((model) => model.dispose()); monaco.editor.getModels().forEach((model) => model.dispose());
editorRef.current?.dispose(); editorRef.current?.dispose();

@ -233,6 +233,11 @@ function Root(props: IProps): React.ReactElement {
function onTabClick(index: number): void { function onTabClick(index: number): void {
if (currentScript !== null) { if (currentScript !== null) {
// Save the current position of the cursor.
const currentPosition = editorRef.current?.getPosition();
if (currentPosition) {
currentScript.lastPosition = currentPosition;
}
// Save currentScript to openScripts // Save currentScript to openScripts
const curIndex = currentTabIndex(); const curIndex = currentTabIndex();
if (curIndex !== undefined) { if (curIndex !== undefined) {
@ -356,6 +361,17 @@ function Root(props: IProps): React.ReactElement {
} }
} }
function onUnmountEditor() {
if (!currentScript) {
return;
}
// Save the current position of the cursor.
const currentPosition = editorRef.current?.getPosition();
if (currentPosition) {
currentScript.lastPosition = currentPosition;
}
}
const { VimStatus } = useVimEditor({ const { VimStatus } = useVimEditor({
editor: editorRef.current, editor: editorRef.current,
vim: options.vim, vim: options.vim,
@ -392,7 +408,7 @@ function Root(props: IProps): React.ReactElement {
onTabUpdate={onTabUpdate} onTabUpdate={onTabUpdate}
/> />
<div style={{ flex: "0 0 5px" }} /> <div style={{ flex: "0 0 5px" }} />
<Editor onMount={onMount} onChange={updateCode} /> <Editor onMount={onMount} onChange={updateCode} onUnmount={onUnmountEditor} />
{VimStatus} {VimStatus}

@ -2,7 +2,6 @@ import { Terminal } from "../../../Terminal";
import { ScriptEditorRouteOptions, Page } from "../../../ui/Router"; import { ScriptEditorRouteOptions, Page } from "../../../ui/Router";
import { Router } from "../../../ui/GameRoot"; import { Router } from "../../../ui/GameRoot";
import { BaseServer } from "../../../Server/BaseServer"; import { BaseServer } from "../../../Server/BaseServer";
import { CursorPositions } from "../../../ScriptEditor/CursorPositions";
import { ScriptFilePath, hasScriptExtension } from "../../../Paths/ScriptFilePath"; import { ScriptFilePath, hasScriptExtension } from "../../../Paths/ScriptFilePath";
import { TextFilePath, hasTextExtension } from "../../../Paths/TextFilePath"; import { TextFilePath, hasTextExtension } from "../../../Paths/TextFilePath";
import { getGlobbedFileMap } from "../../../Paths/GlobbedFiles"; import { getGlobbedFileMap } from "../../../Paths/GlobbedFiles";
@ -54,7 +53,6 @@ export function commonEditor(
const file = server.getContentFile(path); const file = server.getContentFile(path);
const content = file ? file.content : isNs2(path) ? newNs2Template : ""; const content = file ? file.content : isNs2(path) ? newNs2Template : "";
files.set(path, content); files.set(path, content);
if (content === newNs2Template) CursorPositions.saveCursor(path, { row: 3, column: 5 });
} }
if (hasNs1) { if (hasNs1) {
sendDeprecationNotice(); sendDeprecationNotice();