annotate src/main.ts @ 55:388eb78ef4b7

Typescript compliance.
author Ludovic Chabant <ludovic@chabant.com>
date Mon, 02 Oct 2023 18:12:11 -0700
parents 06504ceb3283
children 4f6cbc0b339c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
50
1fe2cd2c603f Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
1 import * as fs from 'fs';
1fe2cd2c603f Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
2 import * as os from 'os';
1fe2cd2c603f Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
3 import * as path from 'path';
1fe2cd2c603f Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
4
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
5 import {
21
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
6 App,
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
7 Editor,
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
8 MarkdownView,
27
3d0ac176118f Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents: 23
diff changeset
9 Modal,
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
10 OpenViewState,
21
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
11 Plugin,
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
12 TAbstractFile,
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
13 TFile,
43
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
14 Tasks,
21
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
15 View,
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
16 WorkspaceLeaf
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
17 } from 'obsidian';
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
18
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
19 import {
21
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
20 EditorView
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
21 } from '@codemirror/view';
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
22
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
23 import {
2
f3297d90329d Various fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
24 EditorState,
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
25 EditorSelection
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
26 } from '@codemirror/state';
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
27
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
28 import {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
29 around
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
30 } from 'monkey-around';
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
31
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
32 import {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
33 DEFAULT_SETTINGS,
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
34 RememberFileStatePluginSettings,
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
35 RememberFileStatePluginSettingTab
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
36 } from './settings';
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
37
21
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
38 declare var app: App;
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 // Interface for CM6 editor view
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
41 interface EditorWithCM6 extends Editor {
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
42 cm: EditorView
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 // View with unique ID
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
46 interface ViewWithID extends View {
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
47 __uniqueId: 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 // Scroll info interface
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
51 interface ScrollInfo {
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
52 top: number, left: number
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
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
55 interface StateData {
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
56 selection: EditorSelection,
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
57 scrollInfo: ScrollInfo
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
58 };
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
59
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
60 // Interface for a file state.
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
61 interface RememberedFileState {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
62 path: string;
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
63 lastSavedTime: number;
21
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
64 stateData: StateData;
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 // Interface for all currently remembered file states.
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
68 interface RememberFileStatePluginData {
11
6f7f35af6335 Better type information for the plugin data
Ludovic Chabant <ludovic@chabant.com>
parents: 8
diff changeset
69 rememberedFiles: Record<string, RememberedFileState>;
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
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
72 // Default empty list of remembered file states.
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
73 const DEFAULT_DATA: RememberFileStatePluginData = {
8
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
74 rememberedFiles: {}
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
75 };
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
76
43
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
77 // Where to save the states database.
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
78 const STATE_DB_PATH: string = '.obsidian/plugins/obsidian-remember-file-state/states.json';
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
79
27
3d0ac176118f Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents: 23
diff changeset
80 // Simple warning message.
3d0ac176118f Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents: 23
diff changeset
81 class WarningModal extends Modal {
29
66cada11efb8 Fix typescript warnings
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
82 title: string = "";
66cada11efb8 Fix typescript warnings
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
83 message: string = "";
66cada11efb8 Fix typescript warnings
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
84
27
3d0ac176118f Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents: 23
diff changeset
85 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
86 super(app)
3d0ac176118f Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents: 23
diff changeset
87 this.title = title;
3d0ac176118f Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents: 23
diff changeset
88 this.message = message;
3d0ac176118f Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents: 23
diff changeset
89 }
3d0ac176118f Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents: 23
diff changeset
90 onOpen() {
3d0ac176118f Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents: 23
diff changeset
91 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
92 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
93 }
3d0ac176118f Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents: 23
diff changeset
94 };
3d0ac176118f Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents: 23
diff changeset
95
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
96 export default class RememberFileStatePlugin extends Plugin {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
97 settings: RememberFileStatePluginSettings;
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
98 data: RememberFileStatePluginData;
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
99
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
100 // Don't restore state on the next file being opened.
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
101 private _suppressNextFileOpen: boolean = false;
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
102 // 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
103 private _nextUniqueViewId: number = 0;
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
104
28
fbaf7c7126be Don't restore file state if we're just switching to another pane
Ludovic Chabant <ludovic@chabant.com>
parents: 27
diff changeset
105 // 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
106 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
107
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
108 // 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
109 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
110 // Functions to unregister any global callbacks on plugin unload.
21
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
111 private _globalUninstallers: Function[] = [];
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
112
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
113 async onload() {
50
1fe2cd2c603f Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
114 // Enable this for troubleshooting.
1fe2cd2c603f Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
115 const enableLogfile: boolean = false;
1fe2cd2c603f Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
116 if (enableLogfile) {
1fe2cd2c603f Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
117 const outLogPath = path.join(os.tmpdir(), 'obsidian-remember-file-state.log');
1fe2cd2c603f Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
118 this.setupLogFile(outLogPath);
1fe2cd2c603f Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
119 }
1fe2cd2c603f Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
120
35
42ff65e35f4f More standardized logging.
Ludovic Chabant <ludovic@chabant.com>
parents: 29
diff changeset
121 console.log("RememberFileState: loading plugin");
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
122
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
123 await this.loadSettings();
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
124
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
125 this.data = Object.assign({}, DEFAULT_DATA);
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
126
43
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
127 await this.readStateDatabase(STATE_DB_PATH);
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
128
51
e932f1b73133 Pass `this` as the context for various callbacks.
Ludovic Chabant <ludovic@chabant.com>
parents: 50
diff changeset
129 this.registerEvent(this.app.workspace.on('file-open', this.onFileOpen, this));
e932f1b73133 Pass `this` as the context for various callbacks.
Ludovic Chabant <ludovic@chabant.com>
parents: 50
diff changeset
130 this.registerEvent(this.app.workspace.on('quit', this.onAppQuit, this));
e932f1b73133 Pass `this` as the context for various callbacks.
Ludovic Chabant <ludovic@chabant.com>
parents: 50
diff changeset
131 this.registerEvent(this.app.vault.on('rename', this.onFileRename, this));
e932f1b73133 Pass `this` as the context for various callbacks.
Ludovic Chabant <ludovic@chabant.com>
parents: 50
diff changeset
132 this.registerEvent(this.app.vault.on('delete', this.onFileDelete, this));
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
133
43
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
134 this.app.workspace.onLayoutReady(() => { this.onLayoutReady(); });
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
135
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
136 const _this = this;
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
137 var uninstall = around(this.app.workspace, {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
138 openLinkText: function(next) {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
139 return async function(
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
140 linktext: string, sourcePath: string,
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
141 newLeaf?: boolean, openViewState?: OpenViewState) {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
142 // When opening a link, we don't want to restore the
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
143 // scroll position/selection/etc because there's a
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
144 // good chance we want to show the file back at the
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
145 // top, or we're going straight to a specific block.
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
146 _this._suppressNextFileOpen = true;
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
147 return await next.call(
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
148 this, linktext, sourcePath, newLeaf, openViewState);
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
149 };
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
150 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
151 });
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
152 this._globalUninstallers.push(uninstall);
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
153
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
154 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
155
29
66cada11efb8 Fix typescript warnings
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
156 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
157 new WarningModal(
3d0ac176118f Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents: 23
diff changeset
158 this.app,
3d0ac176118f Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents: 23
diff changeset
159 "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
160 "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
161 ).open();
3d0ac176118f Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents: 23
diff changeset
162 }
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
163 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
164
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
165 onunload() {
52
586f857a98dd Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents: 51
diff changeset
166 console.log("RememberFileState: unloading plugin");
586f857a98dd Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents: 51
diff changeset
167
586f857a98dd Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents: 51
diff changeset
168 // Unregister unload callbacks on all views.
586f857a98dd Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents: 51
diff changeset
169 this.unregisterAllViews();
586f857a98dd Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents: 51
diff changeset
170
586f857a98dd Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents: 51
diff changeset
171 // Forget which files are opened in which views.
28
fbaf7c7126be Don't restore file state if we're just switching to another pane
Ludovic Chabant <ludovic@chabant.com>
parents: 27
diff changeset
172 this._lastOpenFiles = {};
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
173
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
174 // Run global unhooks.
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
175 this._globalUninstallers.forEach((cb) => cb());
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
176 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
177
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
178 async loadSettings() {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
179 this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData());
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
180 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
181
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
182 async saveSettings() {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
183 await this.saveData(this.settings);
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
184 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
185
43
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
186 private readonly onLayoutReady = function() {
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
187 this.app.workspace.getLeavesOfType("markdown").forEach(
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
188 (leaf: WorkspaceLeaf) => {
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
189 var view = leaf.view as MarkdownView;
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
190
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
191 // On startup, assign unique IDs to views and register the
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
192 // unload callback to remember their state.
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
193 this.registerOnUnloadFile(view);
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
194
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
195 // Also remember which file is opened in which view.
44
fae202d7b3de Fix Typescript warnings and errors
Ludovic Chabant <ludovic@chabant.com>
parents: 43
diff changeset
196 const viewId = this.getUniqueViewId(view as unknown as ViewWithID);
43
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
197 if (viewId != undefined) {
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
198 this._lastOpenFiles[viewId] = view.file.path;
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
199 }
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
200
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
201 // Restore state for each opened pane on startup.
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
202 const existingFile = this.data.rememberedFiles[view.file.path];
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
203 if (existingFile) {
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
204 const savedStateData = existingFile.stateData;
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
205 console.debug("RememberFileState: restoring saved state for:", view.file.path, savedStateData);
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
206 this.restoreState(savedStateData, view);
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
207 }
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
208 });
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
209 }
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
210
21
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
211 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
212 var filePath = view.file.path;
21
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
213 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
214 if (viewId in this._viewUninstallers) {
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
215 return;
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
216 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
217
41
aa9bc7754c5d Fix typos in debug log messages
Ludovic Chabant <ludovic@chabant.com>
parents: 40
diff changeset
218 console.debug(`RememberFileState: registering callback on view ${viewId}`, filePath);
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
219 const _this = this;
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
220 var uninstall = around(view, {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
221 onUnloadFile: function(next) {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
222 return async function (unloaded: TFile) {
43
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
223 _this.rememberFileState(this, unloaded);
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
224 return await next.call(this, unloaded);
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
225 };
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
226 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
227 });
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
228 this._viewUninstallers[viewId] = uninstall;
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
229
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
230 view.register(() => {
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
231 // 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
232 // 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
233 // do nothing if we don't find it.
21
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
234 // @ts-ignore
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
235 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
236 if (plugin) {
41
aa9bc7754c5d Fix typos in debug log messages
Ludovic Chabant <ludovic@chabant.com>
parents: 40
diff changeset
237 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
238 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
239 delete plugin._lastOpenFiles[viewId];
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
240 uninstall();
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
241 } else {
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
242 console.debug(
41
aa9bc7754c5d Fix typos in debug log messages
Ludovic Chabant <ludovic@chabant.com>
parents: 40
diff changeset
243 "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
244 }
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
245 });
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
246 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
247
52
586f857a98dd Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents: 51
diff changeset
248 private readonly unregisterAllViews = function() {
586f857a98dd Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents: 51
diff changeset
249 // Run view uninstallers on all current views.
586f857a98dd Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents: 51
diff changeset
250 var numViews: number = 0;
586f857a98dd Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents: 51
diff changeset
251 this.app.workspace.getLeavesOfType("markdown").forEach(
586f857a98dd Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents: 51
diff changeset
252 (leaf: WorkspaceLeaf) => {
586f857a98dd Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents: 51
diff changeset
253 const filePath = (leaf.view as MarkdownView).file.path;
586f857a98dd Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents: 51
diff changeset
254 const viewId = this.getUniqueViewId(leaf.view as ViewWithID);
586f857a98dd Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents: 51
diff changeset
255 if (viewId != undefined) {
586f857a98dd Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents: 51
diff changeset
256 var uninstaller = this._viewUninstallers[viewId];
586f857a98dd Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents: 51
diff changeset
257 if (uninstaller) {
586f857a98dd Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents: 51
diff changeset
258 console.debug(`RememberFileState: uninstalling hooks for view ${viewId}`, filePath);
586f857a98dd Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents: 51
diff changeset
259 uninstaller(leaf.view);
586f857a98dd Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents: 51
diff changeset
260 ++numViews;
586f857a98dd Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents: 51
diff changeset
261 } else {
586f857a98dd Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents: 51
diff changeset
262 console.debug("RememberFileState: found markdown view without an uninstaller!", filePath);
586f857a98dd Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents: 51
diff changeset
263 }
586f857a98dd Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents: 51
diff changeset
264 // Clear the ID so we don't get confused if the plugin
586f857a98dd Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents: 51
diff changeset
265 // is re-enabled later.
586f857a98dd Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents: 51
diff changeset
266 this.clearUniqueViewId(leaf.view as ViewWithID);
586f857a98dd Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents: 51
diff changeset
267 } else {
586f857a98dd Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents: 51
diff changeset
268 console.debug("RememberFileState: found markdown view without an ID!", filePath);
586f857a98dd Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents: 51
diff changeset
269 }
586f857a98dd Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents: 51
diff changeset
270 });
586f857a98dd Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents: 51
diff changeset
271 console.debug(`RememberFileState: unregistered ${numViews} view callbacks`);
586f857a98dd Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents: 51
diff changeset
272 this._viewUninstallers = {};
586f857a98dd Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents: 51
diff changeset
273 }
586f857a98dd Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents: 51
diff changeset
274
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
275 private readonly onFileOpen = async (
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
276 openedFile: TFile
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
277 ): Promise<void> => {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
278 // If `openedFile` is null, it's because the last pane was closed
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
279 // 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
280 if (!openedFile) {
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
281 return;
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
282 }
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
283
44
fae202d7b3de Fix Typescript warnings and errors
Ludovic Chabant <ludovic@chabant.com>
parents: 43
diff changeset
284 var shouldSuppressThis: boolean = this._suppressNextFileOpen;
40
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
285 this._suppressNextFileOpen = false;
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
286 if (shouldSuppressThis) {
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
287 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
288 return;
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
289 }
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
290
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
291 // 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
292 // only editor we support for now.
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
293 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
294 if (!activeView) {
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
295 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
296 return;
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
297 }
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
298
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
299 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
300
40
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
301 // 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
302 // 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
303 var isRealFileOpen = true;
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
304 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
305 if (viewId != undefined) {
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
306 const lastOpenFileInView = this._lastOpenFiles[viewId];
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
307 isRealFileOpen = (lastOpenFileInView != openedFile.path);
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
308 this._lastOpenFiles[viewId] = openedFile.path;
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
309 }
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
310 if (!isRealFileOpen) {
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
311 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
312 return;
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
313 }
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
314
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
315 // Restore the state!
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
316 try {
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
317 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
318 if (existingFile) {
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
319 const savedStateData = existingFile.stateData;
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
320 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
321 this.restoreState(savedStateData, activeView);
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
322 } else {
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
323 // 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
324 // 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
325 const otherPaneState = this.findFileStateFromOtherPane(openedFile, activeView);
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
326 if (otherPaneState) {
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
327 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
328 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
329 }
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
330 }
40
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
331 } catch (err) {
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
332 console.error("RememberFileState: couldn't restore file state: ", err);
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
333 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
334 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
335
43
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
336 private readonly rememberFileState = async (view: MarkdownView, file?: TFile): Promise<void> => {
40
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
337 const stateData = this.getState(view);
43
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
338
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
339 if (file === undefined) {
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
340 file = view.file;
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
341 }
8
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
342 var existingFile = this.data.rememberedFiles[file.path];
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
343 if (existingFile) {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
344 existingFile.lastSavedTime = Date.now();
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
345 existingFile.stateData = stateData;
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
346 } else {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
347 let newFileState = {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
348 path: file.path,
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
349 lastSavedTime: Date.now(),
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
350 stateData: stateData
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
351 };
8
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
352 this.data.rememberedFiles[file.path] = newFileState;
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
353
36
16d304d586b1 Fix comment typo.
Ludovic Chabant <ludovic@chabant.com>
parents: 35
diff changeset
354 // 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
355 // do it now.
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
356 this.forgetExcessFiles();
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
357 }
41
aa9bc7754c5d Fix typos in debug log messages
Ludovic Chabant <ludovic@chabant.com>
parents: 40
diff changeset
358 console.debug("RememberFileState: remembered state for:", file.path, stateData);
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
359 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
360
40
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
361 private readonly getState = function(view: MarkdownView) {
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
362 // 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
363 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
364
44
fae202d7b3de Fix Typescript warnings and errors
Ludovic Chabant <ludovic@chabant.com>
parents: 43
diff changeset
365 // Save current selection. CodeMirror returns a JSON object (not a
fae202d7b3de Fix Typescript warnings and errors
Ludovic Chabant <ludovic@chabant.com>
parents: 43
diff changeset
366 // JSON string!) when we call toJSON.
40
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
367 // 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
368 const cm6editor = view.editor as EditorWithCM6;
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
369 const stateSelection: EditorSelection = cm6editor.cm.state.selection;
44
fae202d7b3de Fix Typescript warnings and errors
Ludovic Chabant <ludovic@chabant.com>
parents: 43
diff changeset
370 const stateSelectionJSON = (stateSelection !== undefined) ? stateSelection.toJSON() : undefined;
40
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
371
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
372 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
373
40
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
374 return stateData;
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
375 }
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
376
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
377 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
378 // 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
379 view.currentMode.applyScroll(stateData.scrollInfo.top);
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
380
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
381 // Restore last known selection, if any.
44
fae202d7b3de Fix Typescript warnings and errors
Ludovic Chabant <ludovic@chabant.com>
parents: 43
diff changeset
382 if (stateData.selection !== undefined) {
40
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
383 const cm6editor = view.editor as EditorWithCM6;
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
384 var transaction = cm6editor.cm.state.update({
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
385 selection: EditorSelection.fromJSON(stateData.selection)})
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
386
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
387 cm6editor.cm.dispatch(transaction);
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
388 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
389 }
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
390
40
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
391 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
392 var otherView = null;
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
393 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
394 (leaf: WorkspaceLeaf) => {
40
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
395 var curView = leaf.view as MarkdownView;
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
396 if (curView != activeView &&
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
397 curView.file.path == file.path &&
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
398 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
399 ) {
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
400 otherView = curView;
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
401 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
402 }
40
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
403 return true;
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
404 },
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
405 this // thisArg
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
406 );
96e86650043b Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
407 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
408 }
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
409
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
410 private readonly forgetExcessFiles = function() {
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
411 const keepMax = this.settings.rememberMaxFiles;
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
412 if (keepMax <= 0) {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
413 return;
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
414 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
415
8
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
416 // Sort newer files first, older files last.
21
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
417 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
418 filesData.sort((a, b) => {
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
419 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
420 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
421 return 0;
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
422 });
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
423
8
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
424 // Remove older files past the limit.
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
425 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
426 var fileData = filesData[i];
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
427 delete this.data.rememberedFiles[fileData.path];
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
428 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
429 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
430
21
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
431 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
432 if (view.__uniqueId == undefined) {
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
433 if (!autocreateId) {
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
434 return -1;
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
435 }
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
436 view.__uniqueId = (this._nextUniqueViewId++);
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
437 return view.__uniqueId;
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
438 }
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
439 return view.__uniqueId;
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
440 }
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
441
21
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
442 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
443 delete view["__uniqueId"];
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
444 }
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
445
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
446 private readonly onFileRename = async (
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
447 file: TAbstractFile,
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
448 oldPath: string,
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
449 ): Promise<void> => {
21
815b93d13e0f Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
450 const existingFile: RememberedFileState = this.data.rememberedFiles[oldPath];
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
451 if (existingFile) {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
452 existingFile.path = file.path;
8
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
453 delete this.data.rememberedFiles[oldPath];
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
454 this.data.rememberedFiles[file.path] = existingFile;
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
455 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
456 };
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
457
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
458 private readonly onFileDelete = async (
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
459 file: TAbstractFile,
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
460 ): Promise<void> => {
8
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
461 delete this.data.rememberedFiles[file.path];
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
462 };
43
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
463
54
06504ceb3283 Make all shutdown logic synchronous.
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
464 private readonly onAppQuit = function(tasks: Tasks) {
06504ceb3283 Make all shutdown logic synchronous.
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
465 this.unregisterAllViews();
06504ceb3283 Make all shutdown logic synchronous.
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
466 this.rememberAllOpenedFileStates();
06504ceb3283 Make all shutdown logic synchronous.
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
467 this.writeStateDatabase(STATE_DB_PATH);
06504ceb3283 Make all shutdown logic synchronous.
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
468 console.log("RememberFileState: done with app-quit cleanup.");
43
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
469 }
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
470
54
06504ceb3283 Make all shutdown logic synchronous.
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
471 private readonly rememberAllOpenedFileStates = function() {
06504ceb3283 Make all shutdown logic synchronous.
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
472 console.log("RememberFileState: remembering all opened file states...");
43
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
473 this.app.workspace.getLeavesOfType("markdown").forEach(
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
474 (leaf: WorkspaceLeaf) => {
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
475 const view = leaf.view as MarkdownView;
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
476 this.rememberFileState(view);
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
477 }
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
478 );
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
479 }
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
480
54
06504ceb3283 Make all shutdown logic synchronous.
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
481 private readonly writeStateDatabase = function(path: string) {
43
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
482 const fs = this.app.vault.adapter;
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
483 const jsonDb = JSON.stringify(this.data);
54
06504ceb3283 Make all shutdown logic synchronous.
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
484 console.log("RememberFileState: writing state database...");
06504ceb3283 Make all shutdown logic synchronous.
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
485 fs.write(path, jsonDb)
06504ceb3283 Make all shutdown logic synchronous.
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
486 .then(() => { console.log("RememberFileState: wrote state database."); });
43
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
487 }
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
488
54
06504ceb3283 Make all shutdown logic synchronous.
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
489 private readonly readStateDatabase = async function(path: string): Promise<void> {
43
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
490 const fs = this.app.vault.adapter;
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
491 if (await fs.exists(path)) {
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
492 const jsonDb = await fs.read(path);
53
f2e066bbe343 Handle errors around reading the state database file.
Ludovic Chabant <ludovic@chabant.com>
parents: 52
diff changeset
493 try
f2e066bbe343 Handle errors around reading the state database file.
Ludovic Chabant <ludovic@chabant.com>
parents: 52
diff changeset
494 {
f2e066bbe343 Handle errors around reading the state database file.
Ludovic Chabant <ludovic@chabant.com>
parents: 52
diff changeset
495 this.data = JSON.parse(jsonDb);
f2e066bbe343 Handle errors around reading the state database file.
Ludovic Chabant <ludovic@chabant.com>
parents: 52
diff changeset
496 const numLoaded = Object.keys(this.data.rememberedFiles).length;
f2e066bbe343 Handle errors around reading the state database file.
Ludovic Chabant <ludovic@chabant.com>
parents: 52
diff changeset
497 console.debug(`RememberFileState: read ${numLoaded} record from state database.`);
f2e066bbe343 Handle errors around reading the state database file.
Ludovic Chabant <ludovic@chabant.com>
parents: 52
diff changeset
498 } catch (err) {
f2e066bbe343 Handle errors around reading the state database file.
Ludovic Chabant <ludovic@chabant.com>
parents: 52
diff changeset
499 console.error("RememberFileState: error loading state database:", err);
f2e066bbe343 Handle errors around reading the state database file.
Ludovic Chabant <ludovic@chabant.com>
parents: 52
diff changeset
500 console.error(jsonDb);
f2e066bbe343 Handle errors around reading the state database file.
Ludovic Chabant <ludovic@chabant.com>
parents: 52
diff changeset
501 }
43
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
502 }
7e981d54a055 Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
503 }
50
1fe2cd2c603f Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
504
1fe2cd2c603f Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
505 private readonly setupLogFile = function(outLogPath: string) {
1fe2cd2c603f Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
506 console.log("RememberFileState: setting up log file: ", outLogPath);
1fe2cd2c603f Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
507
55
388eb78ef4b7 Typescript compliance.
Ludovic Chabant <ludovic@chabant.com>
parents: 54
diff changeset
508 const makeWrapper = function(origFunc: () => void) {
388eb78ef4b7 Typescript compliance.
Ludovic Chabant <ludovic@chabant.com>
parents: 54
diff changeset
509 return function () {
50
1fe2cd2c603f Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
510 origFunc.apply(console, arguments);
1fe2cd2c603f Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
511
1fe2cd2c603f Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
512 var text: string = "";
1fe2cd2c603f Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
513 for (var i: number = 0; i < arguments.length; i++) {
1fe2cd2c603f Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
514 if (i > 0) text += " ";
1fe2cd2c603f Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
515 text += arguments[i].toString();
1fe2cd2c603f Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
516 }
1fe2cd2c603f Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
517 text += "\n";
1fe2cd2c603f Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
518 fs.appendFileSync(outLogPath, text);
1fe2cd2c603f Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
519 };
1fe2cd2c603f Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
520 };
1fe2cd2c603f Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
521 console.log = makeWrapper(console.log);
1fe2cd2c603f Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
522 console.debug = makeWrapper(console.debug);
1fe2cd2c603f Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
523 console.info = makeWrapper(console.info);
1fe2cd2c603f Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
524 console.warn = makeWrapper(console.warn);
1fe2cd2c603f Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
525 console.error = makeWrapper(console.error);
1fe2cd2c603f Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
526
1fe2cd2c603f Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
527 const banner: string = "\n\nDebug log start\n===============\n";
1fe2cd2c603f Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
528 fs.appendFileSync(outLogPath, banner);
1fe2cd2c603f Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
529 }
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
530 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
531