diff --git a/main.js b/main.js index 20c45f7..2b65a9f 100644 --- a/main.js +++ b/main.js @@ -787,6 +787,20 @@ var WorkspaceContext = class { this.lastMarkdownView = null; this.app = app; } + trackViewSelection(view) { + var _a, _b, _c; + if (view) { + this.lastMarkdownView = view; + } + const sourcePath = (_a = view == null ? void 0 : view.file) == null ? void 0 : _a.path; + const selection = (_c = (_b = view == null ? void 0 : view.editor) == null ? void 0 : _b.getSelection()) != null ? _c : ""; + if (sourcePath && selection.trim()) { + this.lastSelection = { + text: selection, + sourcePath + }; + } + } gatherContext(maxNotes, maxSelectionLength) { var _a, _b, _c, _d, _e; const leaves = this.app.workspace.getLeavesOfType("markdown"); @@ -800,9 +814,7 @@ var WorkspaceContext = class { } const openNotePaths = Array.from(paths).slice(0, Math.max(0, maxNotes)); const view = (_b = this.app.workspace.getActiveViewOfType(import_obsidian4.MarkdownView)) != null ? _b : this.lastMarkdownView; - if (view) { - this.lastMarkdownView = view; - } + this.trackViewSelection(view); const sourcePath = (_c = view == null ? void 0 : view.file) == null ? void 0 : _c.path; const selection = (_e = (_d = view == null ? void 0 : view.editor) == null ? void 0 : _d.getSelection()) != null ? _e : ""; let selectionContext = null; @@ -812,10 +824,8 @@ var WorkspaceContext = class { sourcePath }; this.lastSelection = selectionContext; - } else if (!sourcePath) { + } else if (this.lastSelection) { selectionContext = this.lastSelection; - } else { - this.lastSelection = null; } if (selectionContext && selectionContext.text.length > maxSelectionLength) { selectionContext = { @@ -1076,7 +1086,10 @@ var OpenCodePlugin = class extends import_obsidian5.Plugin { if (this.contextEventRefs.length > 0) { return; } - const activeLeafRef = this.app.workspace.on("active-leaf-change", () => { + const activeLeafRef = this.app.workspace.on("active-leaf-change", (leaf) => { + if ((leaf == null ? void 0 : leaf.view) instanceof import_obsidian5.MarkdownView) { + this.workspaceContext.trackViewSelection(leaf.view); + } this.scheduleContextRefresh(0); }); const fileOpenRef = this.app.workspace.on("file-open", () => { @@ -1085,10 +1098,32 @@ var OpenCodePlugin = class extends import_obsidian5.Plugin { const fileCloseRef = this.app.workspace.on("file-close", () => { this.scheduleContextRefresh(); }); - const editorChangeRef = this.app.workspace.on("editor-change", () => { + const layoutChangeRef = this.app.workspace.on("layout-change", () => { + this.scheduleContextRefresh(); + }); + const editorChangeRef = this.app.workspace.on("editor-change", (_editor, view) => { + if (view instanceof import_obsidian5.MarkdownView) { + this.workspaceContext.trackViewSelection(view); + } this.scheduleContextRefresh(500); }); - this.contextEventRefs = [activeLeafRef, fileOpenRef, fileCloseRef, editorChangeRef]; + const selectionChangeRef = this.app.workspace.on( + "editor-selection-change", + (_editor, view) => { + if (view instanceof import_obsidian5.MarkdownView) { + this.workspaceContext.trackViewSelection(view); + } + this.scheduleContextRefresh(200); + } + ); + this.contextEventRefs = [ + activeLeafRef, + fileOpenRef, + fileCloseRef, + layoutChangeRef, + editorChangeRef, + selectionChangeRef + ]; this.contextEventRefs.forEach((ref) => this.registerEvent(ref)); } clearContextListeners() { diff --git a/src/WorkspaceContext.ts b/src/WorkspaceContext.ts index 32b7e9f..3ff5aba 100644 --- a/src/WorkspaceContext.ts +++ b/src/WorkspaceContext.ts @@ -20,6 +20,22 @@ export class WorkspaceContext { this.app = app; } + trackViewSelection(view: MarkdownView | null): void { + if (view) { + this.lastMarkdownView = view; + } + + const sourcePath = view?.file?.path; + const selection = view?.editor?.getSelection() ?? ""; + + if (sourcePath && selection.trim()) { + this.lastSelection = { + text: selection, + sourcePath, + }; + } + } + gatherContext(maxNotes: number, maxSelectionLength: number): WorkspaceContextSnapshot { const leaves = this.app.workspace.getLeavesOfType("markdown"); const paths = new Set(); @@ -35,9 +51,7 @@ export class WorkspaceContext { const openNotePaths = Array.from(paths).slice(0, Math.max(0, maxNotes)); const view = this.app.workspace.getActiveViewOfType(MarkdownView) ?? this.lastMarkdownView; - if (view) { - this.lastMarkdownView = view; - } + this.trackViewSelection(view); const sourcePath = view?.file?.path; const selection = view?.editor?.getSelection() ?? ""; @@ -49,10 +63,8 @@ export class WorkspaceContext { sourcePath, }; this.lastSelection = selectionContext; - } else if (!sourcePath) { + } else if (this.lastSelection) { selectionContext = this.lastSelection; - } else { - this.lastSelection = null; } if (selectionContext && selectionContext.text.length > maxSelectionLength) { diff --git a/src/main.ts b/src/main.ts index 25c0049..a4c076e 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,4 +1,4 @@ -import { Plugin, WorkspaceLeaf, Notice, EventRef } from "obsidian"; +import { Plugin, WorkspaceLeaf, Notice, EventRef, MarkdownView } from "obsidian"; import { OpenCodeSettings, DEFAULT_SETTINGS, OPENCODE_VIEW_TYPE } from "./types"; import { OpenCodeView } from "./OpenCodeView"; import { OpenCodeSettingTab } from "./SettingsTab"; @@ -285,7 +285,10 @@ export default class OpenCodePlugin extends Plugin { return; } - const activeLeafRef = this.app.workspace.on("active-leaf-change", () => { + const activeLeafRef = this.app.workspace.on("active-leaf-change", (leaf) => { + if (leaf?.view instanceof MarkdownView) { + this.workspaceContext.trackViewSelection(leaf.view); + } this.scheduleContextRefresh(0); }); const fileOpenRef = this.app.workspace.on("file-open", () => { @@ -294,11 +297,33 @@ export default class OpenCodePlugin extends Plugin { const fileCloseRef = (this.app.workspace as any).on("file-close", () => { this.scheduleContextRefresh(); }); - const editorChangeRef = this.app.workspace.on("editor-change", () => { + const layoutChangeRef = this.app.workspace.on("layout-change", () => { + this.scheduleContextRefresh(); + }); + const editorChangeRef = this.app.workspace.on("editor-change", (_editor, view) => { + if (view instanceof MarkdownView) { + this.workspaceContext.trackViewSelection(view); + } this.scheduleContextRefresh(500); }); + const selectionChangeRef = (this.app.workspace as any).on( + "editor-selection-change", + (_editor: unknown, view: unknown) => { + if (view instanceof MarkdownView) { + this.workspaceContext.trackViewSelection(view); + } + this.scheduleContextRefresh(200); + } + ); - this.contextEventRefs = [activeLeafRef, fileOpenRef, fileCloseRef, editorChangeRef]; + this.contextEventRefs = [ + activeLeafRef, + fileOpenRef, + fileCloseRef, + layoutChangeRef, + editorChangeRef, + selectionChangeRef, + ]; this.contextEventRefs.forEach((ref) => this.registerEvent(ref)); }