fix: scroll source correctly when no text editor is active (#395)

This commit is contained in:
Myriad-Dreamin 2024-07-10 10:13:16 +08:00 committed by GitHub
parent 1d1f4bf6e5
commit 1e424eca8a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 29 additions and 13 deletions

View file

@ -33,7 +33,7 @@ import {
previewPreload, previewPreload,
previewProcessOutline, previewProcessOutline,
} from "./preview"; } from "./preview";
import { DisposeList } from "./util"; import { DisposeList, getSensibleTextEditorColumn } from "./util";
import { client, setClient } from "./lsp"; import { client, setClient } from "./lsp";
let previewIsEnabled = false; let previewIsEnabled = false;
@ -146,19 +146,24 @@ async function startClient(context: ExtensionContext): Promise<void> {
end: [number, number] | null; end: [number, number] | null;
} }
client.onNotification("tinymist/preview/scrollSource", async (jump: JumpInfo) => { client.onNotification("tinymist/preview/scrollSource", async (jump: JumpInfo) => {
const activeEditor = window.activeTextEditor; console.log(
if (!activeEditor) { "recv editorScrollTo request",
return; jump,
} "active",
window.activeTextEditor !== undefined,
"documents",
vscode.workspace.textDocuments.map((doc) => doc.uri.fsPath)
);
console.log("recv editorScrollTo request", jump);
if (jump.start === null || jump.end === null) { if (jump.start === null || jump.end === null) {
return; return;
} }
// open this file and show in editor // open this file and show in editor
const doc = await vscode.workspace.openTextDocument(jump.filepath); const doc =
const editor = await vscode.window.showTextDocument(doc, activeEditor.viewColumn); vscode.workspace.textDocuments.find((doc) => doc.uri.fsPath === jump.filepath) ||
(await vscode.workspace.openTextDocument(jump.filepath));
const editor = await vscode.window.showTextDocument(doc, getSensibleTextEditorColumn());
const startPosition = new vscode.Position(jump.start[0], jump.start[1]); const startPosition = new vscode.Position(jump.start[0], jump.start[1]);
const endPosition = new vscode.Position(jump.end[0], jump.end[1]); const endPosition = new vscode.Position(jump.end[0], jump.end[1]);
const range = new vscode.Range(startPosition, endPosition); const range = new vscode.Range(startPosition, endPosition);

View file

@ -293,9 +293,9 @@ async function launchPreviewLsp(task: LaunchInBrowserTask | LaunchInWebViewTask)
const editor = e.textEditor; const editor = e.textEditor;
const kind = e.kind; const kind = e.kind;
console.log( // console.log(
`selection changed, kind: ${kind && vscode.TextEditorSelectionChangeKind[kind]}` // `selection changed, kind: ${kind && vscode.TextEditorSelectionChangeKind[kind]}`
); // );
const shouldScrollPanel = const shouldScrollPanel =
// scroll by mouse // scroll by mouse
kind === vscode.TextEditorSelectionChangeKind.Mouse || kind === vscode.TextEditorSelectionChangeKind.Mouse ||
@ -303,7 +303,7 @@ async function launchPreviewLsp(task: LaunchInBrowserTask | LaunchInWebViewTask)
(scrollSyncMode === ScrollSyncModeEnum.onSelectionChange && (scrollSyncMode === ScrollSyncModeEnum.onSelectionChange &&
kind === vscode.TextEditorSelectionChangeKind.Keyboard); kind === vscode.TextEditorSelectionChangeKind.Keyboard);
if (shouldScrollPanel) { if (shouldScrollPanel) {
console.log(`selection changed, sending src2doc jump request`); // console.log(`selection changed, sending src2doc jump request`);
reportPosition(editor, "panelScrollTo"); reportPosition(editor, "panelScrollTo");
} }
@ -571,7 +571,7 @@ class OutlineProvider implements vscode.TreeDataProvider<OutlineItem> {
outline: { items: OutlineItemData[] } | undefined = undefined; outline: { items: OutlineItemData[] } | undefined = undefined;
postOutlineItem(outline: any) { postOutlineItem(outline: any) {
console.log("postOutlineItemProvider", outline); // console.log("postOutlineItemProvider", outline);
this.outline = outline; this.outline = outline;
this.refresh(); this.refresh();
} }

View file

@ -13,6 +13,17 @@ export function getTargetViewColumn(viewColumn: ViewColumn | undefined): ViewCol
return ViewColumn.Beside; return ViewColumn.Beside;
} }
export function getSensibleTextEditorColumn(): ViewColumn {
let editor = vscode.window.activeTextEditor;
if (!editor) {
// first visible editor
if (vscode.window.visibleTextEditors.length > 0) {
editor = vscode.window.visibleTextEditors[0];
}
}
return editor?.viewColumn !== undefined ? editor.viewColumn : ViewColumn.Beside;
}
export async function loadHTMLFile(context: vscode.ExtensionContext, relativePath: string) { export async function loadHTMLFile(context: vscode.ExtensionContext, relativePath: string) {
const filePath = path.resolve(context.extensionPath, relativePath); const filePath = path.resolve(context.extensionPath, relativePath);
const fileContents = await readFile(filePath, "utf8"); const fileContents = await readFile(filePath, "utf8");