annotate src/main.ts @ 41:aa9bc7754c5d

Fix typos in debug log messages
author Ludovic Chabant <ludovic@chabant.com>
date Wed, 20 Sep 2023 17:19:11 -0700
parents 96e86650043b
children 7e981d54a055
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1 import {
21
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
2 App,
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
3 Editor,
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
4 MarkdownView,
27
3d0ac176118f Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents: 23
diff changeset
5 Modal,
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
6 OpenViewState,
21
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
7 Plugin,
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
8 TAbstractFile,
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
9 TFile,
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
10 View,
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
11 WorkspaceLeaf
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
12 } from 'obsidian';
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
13
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
14 import {
21
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
15 EditorView
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
16 } from '@codemirror/view';
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
17
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
18 import {
2
f3297d90329d Various fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
19 EditorState,
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
20 EditorSelection
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
21 } from '@codemirror/state';
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
22
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
23 import {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
24 around
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
25 } from 'monkey-around';
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
26
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
27 import {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
28 DEFAULT_SETTINGS,
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
29 RememberFileStatePluginSettings,
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
30 RememberFileStatePluginSettingTab
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
31 } from './settings';
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
32
21
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
33 declare var app: App;
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
34
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
35 // Interface for CM6 editor view
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
36 interface EditorWithCM6 extends Editor {
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
37 cm: EditorView
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
38 };
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
39
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
40 // View with unique ID
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
41 interface ViewWithID extends View {
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
42 __uniqueId: number
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
43 };
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
44
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
45 // Scroll info interface
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
46 interface ScrollInfo {
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
47 top: number, left: number
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
48 };
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
49
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
50 interface StateData {
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
51 selection: EditorSelection,
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
52 scrollInfo: ScrollInfo
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
53 };
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
54
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
55 // Interface for a file state.
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
56 interface RememberedFileState {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
57 path: string;
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
58 lastSavedTime: number;
21
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
59 stateData: StateData;
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
60 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
61
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
62 // Interface for all currently remembered file states.
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
63 interface RememberFileStatePluginData {
11
6f7f35af6335 Better type information for the plugin data
Ludovic Chabant <ludovic@chabant.com>
parents: 8
diff changeset
64 rememberedFiles: Record<string, RememberedFileState>;
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
65 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
66
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
67 // Default empty list of remembered file states.
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
68 const DEFAULT_DATA: RememberFileStatePluginData = {
8
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
69 rememberedFiles: {}
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
70 };
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
71
27
3d0ac176118f Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents: 23
diff changeset
72 // Simple warning message.
3d0ac176118f Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents: 23
diff changeset
73 class WarningModal extends Modal {
29
66cada11efb8 Fix typescript warnings
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
74 title: string = "";
66cada11efb8 Fix typescript warnings
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
75 message: string = "";
66cada11efb8 Fix typescript warnings
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
76
27
3d0ac176118f Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents: 23
diff changeset
77 constructor(app: App, title: string, message: string) {
3d0ac176118f Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents: 23
diff changeset
78 super(app)
3d0ac176118f Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents: 23
diff changeset
79 this.title = title;
3d0ac176118f Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents: 23
diff changeset
80 this.message = message;
3d0ac176118f Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents: 23
diff changeset
81 }
3d0ac176118f Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents: 23
diff changeset
82 onOpen() {
3d0ac176118f Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents: 23
diff changeset
83 this.contentEl.createEl('h2', {text: this.title});
3d0ac176118f Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents: 23
diff changeset
84 this.contentEl.createEl('p', {text: this.message});
3d0ac176118f Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents: 23
diff changeset
85 }
3d0ac176118f Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents: 23
diff changeset
86 };
3d0ac176118f Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents: 23
diff changeset
87
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
88 export default class RememberFileStatePlugin extends Plugin {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
89 settings: RememberFileStatePluginSettings;
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
90 data: RememberFileStatePluginData;
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
91
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
92 // Don't restore state on the next file being opened.
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
93 private _suppressNextFileOpen: boolean = false;
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
94 // Next unique ID to identify views without keeping references to them.
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
95 private _nextUniqueViewId: number = 0;
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
96
28
fbaf7c7126be Don't restore file state if we're just switching to another pane
Ludovic Chabant <ludovic@chabant.com>
parents: 27
diff changeset
97 // Remember last open file in each view.
fbaf7c7126be Don't restore file state if we're just switching to another pane
Ludovic Chabant <ludovic@chabant.com>
parents: 27
diff changeset
98 private _lastOpenFiles: Record<string, string> = {};
fbaf7c7126be Don't restore file state if we're just switching to another pane
Ludovic Chabant <ludovic@chabant.com>
parents: 27
diff changeset
99
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
100 // Functions to unregister any monkey-patched view hooks on plugin unload.
21
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
101 private _viewUninstallers: Record<string, Function> = {};
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
102 // Functions to unregister any global callbacks on plugin unload.
21
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
103 private _globalUninstallers: Function[] = [];
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
104
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
105 async onload() {
35
42ff65e35f4f More standardized logging.
Ludovic Chabant <ludovic@chabant.com>
parents: 29
diff changeset
106 console.log("RememberFileState: loading plugin");
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
107
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
108 await this.loadSettings();
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
109
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
110 this.data = Object.assign({}, DEFAULT_DATA);
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
111
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
112 this.registerEvent(this.app.workspace.on('file-open', this.onFileOpen));
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
113 this.registerEvent(this.app.vault.on('rename', this.onFileRename));
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
114 this.registerEvent(this.app.vault.on('delete', this.onFileDelete));
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
115
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
116 this.app.workspace.getLeavesOfType("markdown").forEach(
21
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
117 (leaf: WorkspaceLeaf) => { this.registerOnUnloadFile(leaf.view as MarkdownView); });
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
118
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
119 const _this = this;
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
120 var uninstall = around(this.app.workspace, {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
121 openLinkText: function(next) {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
122 return async function(
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
123 linktext: string, sourcePath: string,
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
124 newLeaf?: boolean, openViewState?: OpenViewState) {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
125 // When opening a link, we don't want to restore the
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
126 // scroll position/selection/etc because there's a
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
127 // good chance we want to show the file back at the
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
128 // top, or we're going straight to a specific block.
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
129 _this._suppressNextFileOpen = true;
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
130 return await next.call(
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
131 this, linktext, sourcePath, newLeaf, openViewState);
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
132 };
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
133 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
134 });
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
135 this._globalUninstallers.push(uninstall);
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
136
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
137 this.addSettingTab(new RememberFileStatePluginSettingTab(this.app, this));
27
3d0ac176118f Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents: 23
diff changeset
138
29
66cada11efb8 Fix typescript warnings
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
139 if ((this.app.vault as any).getConfig('legacyEditor') !== false) {
27
3d0ac176118f Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents: 23
diff changeset
140 new WarningModal(
3d0ac176118f Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents: 23
diff changeset
141 this.app,
3d0ac176118f Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents: 23
diff changeset
142 "Legacy Editor Not Supported",
3d0ac176118f Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents: 23
diff changeset
143 "The 'Remember File State' plugin works only with the new editor. Please turn off 'Legacy Editor' in the options."
3d0ac176118f Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents: 23
diff changeset
144 ).open();
3d0ac176118f Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents: 23
diff changeset
145 }
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
146 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
147
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
148 onunload() {
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
149 // Run view uninstallers on all current views.
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
150 var numViews: number = 0;
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
151 this.app.workspace.getLeavesOfType("markdown").forEach(
21
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
152 (leaf: WorkspaceLeaf) => {
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
153 const filePath = (leaf.view as MarkdownView).file.path;
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
154 const viewId = this.getUniqueViewId(leaf.view as ViewWithID);
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
155 if (viewId != undefined) {
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
156 var uninstaller = this._viewUninstallers[viewId];
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
157 if (uninstaller) {
41
aa9bc7754c5d Fix typos in debug log messages
Ludovic Chabant <ludovic@chabant.com>
parents: 40
diff changeset
158 console.debug(`RememberFileState: uninstalling hooks for view ${viewId}`, filePath);
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
159 uninstaller(leaf.view);
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
160 ++numViews;
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
161 } else {
41
aa9bc7754c5d Fix typos in debug log messages
Ludovic Chabant <ludovic@chabant.com>
parents: 40
diff changeset
162 console.debug("RememberFileState: found markdown view without an uninstaller!", filePath);
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
163 }
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
164 // Clear the ID so we don't get confused if the plugin
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
165 // is re-enabled later.
21
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
166 this.clearUniqueViewId(leaf.view as ViewWithID);
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
167 } else {
41
aa9bc7754c5d Fix typos in debug log messages
Ludovic Chabant <ludovic@chabant.com>
parents: 40
diff changeset
168 console.debug("RememberFileState: found markdown view without an ID!", filePath);
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
169 }
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
170 });
41
aa9bc7754c5d Fix typos in debug log messages
Ludovic Chabant <ludovic@chabant.com>
parents: 40
diff changeset
171 console.debug(`RememberFileState: unregistered ${numViews} view callbacks`);
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
172 this._viewUninstallers = {};
28
fbaf7c7126be Don't restore file state if we're just switching to another pane
Ludovic Chabant <ludovic@chabant.com>
parents: 27
diff changeset
173 this._lastOpenFiles = {};
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
174
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
175 // Run global unhooks.
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
176 this._globalUninstallers.forEach((cb) => cb());
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
177 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
178
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
179 async loadSettings() {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
180 this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData());
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
181 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
182
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
183 async saveSettings() {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
184 await this.saveData(this.settings);
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
185 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
186
21
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
187 private readonly registerOnUnloadFile = function(view: MarkdownView) {
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
188 var filePath = view.file.path;
21
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
189 var viewId = this.getUniqueViewId(view as unknown as ViewWithID, true);
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
190 if (viewId in this._viewUninstallers) {
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
191 return;
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
192 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
193
41
aa9bc7754c5d Fix typos in debug log messages
Ludovic Chabant <ludovic@chabant.com>
parents: 40
diff changeset
194 console.debug(`RememberFileState: registering callback on view ${viewId}`, filePath);
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
195 const _this = this;
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
196 var uninstall = around(view, {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
197 onUnloadFile: function(next) {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
198 return async function (unloaded: TFile) {
12
42396b88c64d Don't unnecessarily capture the view reference in injected callbacks
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
199 _this.rememberFileState(unloaded, this);
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
200 return await next.call(this, unloaded);
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
201 };
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
202 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
203 });
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
204 this._viewUninstallers[viewId] = uninstall;
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
205
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
206 view.register(() => {
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
207 // Don't hold a reference to this plugin here because this callback
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
208 // will outlive it if it gets deactivated. So let's find it, and
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
209 // do nothing if we don't find it.
21
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
210 // @ts-ignore
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
211 var plugin: RememberFileStatePlugin = app.plugins.getPlugin("obsidian-remember-file-state");
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
212 if (plugin) {
41
aa9bc7754c5d Fix typos in debug log messages
Ludovic Chabant <ludovic@chabant.com>
parents: 40
diff changeset
213 console.debug(`RememberFileState: unregistering view ${viewId} callback`, filePath);
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
214 delete plugin._viewUninstallers[viewId];
28
fbaf7c7126be Don't restore file state if we're just switching to another pane
Ludovic Chabant <ludovic@chabant.com>
parents: 27
diff changeset
215 delete plugin._lastOpenFiles[viewId];
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
216 uninstall();
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
217 } else {
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
218 console.debug(
41
aa9bc7754c5d Fix typos in debug log messages
Ludovic Chabant <ludovic@chabant.com>
parents: 40
diff changeset
219 "RememberFileState: plugin was unloaded, ignoring unregister");
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
220 }
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
221 });
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
222 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
223
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
224 private readonly onFileOpen = async (
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
225 openedFile: TFile
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
226 ): Promise<void> => {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
227 // If `openedFile` is null, it's because the last pane was closed
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
228 // and there is now an empty pane.
40
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
229 if (!openedFile) {
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
230 return;
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
231 }
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
232
40
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
233 var shouldSuppressThis: bool = this._suppressNextFileOpen;
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
234 this._suppressNextFileOpen = false;
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
235 if (shouldSuppressThis) {
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
236 console.debug("RememberFileState: not restoring file state because of explicit suppression");
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
237 return;
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
238 }
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
239
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
240 // Check that the file is handled by a markdown editor, which is the
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
241 // only editor we support for now.
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
242 var activeView: MarkdownView = this.app.workspace.getActiveViewOfType(MarkdownView);
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
243 if (!activeView) {
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
244 console.debug("RememberFileState: not restoring file state, it's not a markdown view");
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
245 return;
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
246 }
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
247
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
248 this.registerOnUnloadFile(activeView);
28
fbaf7c7126be Don't restore file state if we're just switching to another pane
Ludovic Chabant <ludovic@chabant.com>
parents: 27
diff changeset
249
40
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
250 // Check if this is a genuine file open, and not returning to pane that
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
251 // already had this file opened in it.
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
252 var isRealFileOpen = true;
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
253 const viewId = this.getUniqueViewId(activeView as unknown as ViewWithID);
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
254 if (viewId != undefined) {
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
255 const lastOpenFileInView = this._lastOpenFiles[viewId];
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
256 isRealFileOpen = (lastOpenFileInView != openedFile.path);
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
257 this._lastOpenFiles[viewId] = openedFile.path;
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
258 }
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
259 if (!isRealFileOpen) {
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
260 console.debug("RememberFileState: not restoring file state, that file was already open in this pane.");
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
261 return;
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
262 }
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
263
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
264 // Restore the state!
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
265 try {
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
266 const existingFile = this.data.rememberedFiles[openedFile.path];
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
267 if (existingFile) {
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
268 const savedStateData = existingFile.stateData;
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
269 console.debug("RememberFileState: restoring saved state for:", openedFile.path, savedStateData);
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
270 this.restoreState(savedStateData, activeView);
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
271 } else {
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
272 // If we don't have any saved state for this file, let's see if
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
273 // it's opened in another pane. If so, restore that.
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
274 const otherPaneState = this.findFileStateFromOtherPane(openedFile, activeView);
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
275 if (otherPaneState) {
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
276 console.debug("RememberFileState: restoring other pane state for:", openedFile.path, otherPaneState);
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
277 this.restoreState(otherPaneState, activeView);
7
b1cb0474bb18 Fix possible crash when an opened file isn't a markdown file
Ludovic Chabant <ludovic@chabant.com>
parents: 6
diff changeset
278 }
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
279 }
40
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
280 } catch (err) {
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
281 console.error("RememberFileState: couldn't restore file state: ", err);
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
282 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
283 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
284
21
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
285 private readonly rememberFileState = async (file: TFile, view: MarkdownView): Promise<void> => {
40
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
286 const stateData = this.getState(view);
8
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
287 var existingFile = this.data.rememberedFiles[file.path];
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
288 if (existingFile) {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
289 existingFile.lastSavedTime = Date.now();
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
290 existingFile.stateData = stateData;
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
291 } else {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
292 let newFileState = {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
293 path: file.path,
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
294 lastSavedTime: Date.now(),
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
295 stateData: stateData
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
296 };
8
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
297 this.data.rememberedFiles[file.path] = newFileState;
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
298
36
16d304d586b1 Fix comment typo.
Ludovic Chabant <ludovic@chabant.com>
parents: 35
diff changeset
299 // If we need to keep the number of remembered files under a maximum,
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
300 // do it now.
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
301 this.forgetExcessFiles();
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
302 }
41
aa9bc7754c5d Fix typos in debug log messages
Ludovic Chabant <ludovic@chabant.com>
parents: 40
diff changeset
303 console.debug("RememberFileState: remembered state for:", file.path, stateData);
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
304 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
305
40
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
306 private readonly getState = function(view: MarkdownView) {
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
307 // Save scrolling position (Obsidian API only gives vertical position).
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
308 const scrollInfo = {top: view.currentMode.getScroll(), left: 0};
37
8be02002ed66 Use Obsidian's view APIs for scrolling state
Ludovic Chabant <ludovic@chabant.com>
parents: 36
diff changeset
309
40
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
310 // Save current selection.
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
311 // If state selection is undefined, we have a legacy editor. Just ignore that part.
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
312 const cm6editor = view.editor as EditorWithCM6;
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
313 const stateSelection: EditorSelection = cm6editor.cm.state.selection;
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
314 const stateSelectionJSON = (stateSelection !== undefined) ? stateSelection.toJSON() : "";
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
315
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
316 const stateData = {'scrollInfo': scrollInfo, 'selection': stateSelectionJSON};
37
8be02002ed66 Use Obsidian's view APIs for scrolling state
Ludovic Chabant <ludovic@chabant.com>
parents: 36
diff changeset
317
40
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
318 return stateData;
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
319 }
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
320
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
321 private readonly restoreState = function(stateData: StateData, view: MarkdownView) {
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
322 // Restore scrolling position (Obsidian API only allows setting vertical position).
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
323 view.currentMode.applyScroll(stateData.scrollInfo.top);
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
324
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
325 // Restore last known selection, if any.
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
326 if (stateData.selection != "") {
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
327 const cm6editor = view.editor as EditorWithCM6;
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
328 var transaction = cm6editor.cm.state.update({
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
329 selection: EditorSelection.fromJSON(stateData.selection)})
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
330
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
331 cm6editor.cm.dispatch(transaction);
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
332 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
333 }
22
f7e0926c2500 Don't restore state on a file that's already open in another pane.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
334
40
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
335 private readonly findFileStateFromOtherPane = function(file: TFile, activeView: MarkdownView) {
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
336 var otherView = null;
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
337 this.app.workspace.getLeavesOfType("markdown").every(
22
f7e0926c2500 Don't restore state on a file that's already open in another pane.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
338 (leaf: WorkspaceLeaf) => {
40
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
339 var curView = leaf.view as MarkdownView;
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
340 if (curView != activeView &&
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
341 curView.file.path == file.path &&
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
342 this.getUniqueViewId(curView) >= 0 // Skip views that have never been activated.
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
343 ) {
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
344 console.debug(`FFFFOOOOOUNNNNDD!!!!! ${file.path}`, curView, activeView);
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
345 otherView = curView;
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
346 return false; // Stop iterating leaves.
22
f7e0926c2500 Don't restore state on a file that's already open in another pane.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
347 }
40
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
348 return true;
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
349 },
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
350 this // thisArg
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
351 );
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
352 return otherView ? this.getState(otherView) : null;
22
f7e0926c2500 Don't restore state on a file that's already open in another pane.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
353 }
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
354
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
355 private readonly forgetExcessFiles = function() {
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
356 const keepMax = this.settings.rememberMaxFiles;
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
357 if (keepMax <= 0) {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
358 return;
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
359 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
360
8
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
361 // Sort newer files first, older files last.
21
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
362 var filesData: RememberedFileState[] = Object.values(this.data.rememberedFiles);
8
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
363 filesData.sort((a, b) => {
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
364 if (a.lastSavedTime > b.lastSavedTime) return -1; // a before b
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
365 if (a.lastSavedTime < b.lastSavedTime) return 1; // b before a
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
366 return 0;
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
367 });
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
368
8
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
369 // Remove older files past the limit.
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
370 for (var i = keepMax; i < filesData.length; ++i) {
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
371 var fileData = filesData[i];
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
372 delete this.data.rememberedFiles[fileData.path];
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
373 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
374 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
375
21
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
376 private readonly getUniqueViewId = function(view: ViewWithID, autocreateId: boolean = false) {
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
377 if (view.__uniqueId == undefined) {
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
378 if (!autocreateId) {
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
379 return -1;
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
380 }
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
381 view.__uniqueId = (this._nextUniqueViewId++);
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
382 return view.__uniqueId;
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
383 }
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
384 return view.__uniqueId;
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
385 }
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
386
21
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
387 private readonly clearUniqueViewId = function(view: ViewWithID) {
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
388 delete view["__uniqueId"];
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
389 }
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
390
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
391 private readonly onFileRename = async (
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
392 file: TAbstractFile,
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
393 oldPath: string,
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
394 ): Promise<void> => {
21
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
395 const existingFile: RememberedFileState = this.data.rememberedFiles[oldPath];
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
396 if (existingFile) {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
397 existingFile.path = file.path;
8
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
398 delete this.data.rememberedFiles[oldPath];
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
399 this.data.rememberedFiles[file.path] = existingFile;
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
400 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
401 };
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
402
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
403 private readonly onFileDelete = async (
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
404 file: TAbstractFile,
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
405 ): Promise<void> => {
8
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
406 delete this.data.rememberedFiles[file.path];
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
407 };
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
408 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
409