diff --git a/src/ExcalidrawAutomate.ts b/src/ExcalidrawAutomate.ts
index 0ab2bb9..51d78cf 100644
--- a/src/ExcalidrawAutomate.ts
+++ b/src/ExcalidrawAutomate.ts
@@ -175,7 +175,7 @@ export async function initExcalidrawAutomate(plugin: ExcalidrawPlugin) {
elements.push(this.elementsDict[this.elementIds[i]]);
}
plugin.createDrawing(
- params?.filename ? params.filename + '.excalidraw' : this.plugin.getNextDefaultFilename(),
+ params?.filename ? params.filename + '.excalidraw.md' : this.plugin.getNextDefaultFilename(),
params?.onNewPane ? params.onNewPane : false,
params?.foldername ? params.foldername : this.plugin.settings.folder,
FRONTMATTER + exportSceneToMD(
diff --git a/src/ExcalidrawView.ts b/src/ExcalidrawView.ts
index f7d0c83..38e9f17 100644
--- a/src/ExcalidrawView.ts
+++ b/src/ExcalidrawView.ts
@@ -60,7 +60,7 @@ export default class ExcalidrawView extends TextFileView {
private justLoaded: boolean = false;
private plugin: ExcalidrawPlugin;
private dirty: boolean = false;
- private autosaveTimer: any = null;
+ public autosaveTimer: any = null;
public isTextLocked:boolean = false;
private lockedElement:HTMLElement;
private unlockedElement:HTMLElement;
@@ -240,16 +240,19 @@ export default class ExcalidrawView extends TextFileView {
}
}
- private setupAutosaveTimer() {
+ public setupAutosaveTimer() {
const timer = async () => {
//console.log("ExcalidrawView.autosaveTimer(), dirty", this.dirty);
if(this.dirty) {
+ console.log("autosave",Date.now());
this.dirty = false;
if(this.excalidrawRef) await this.save();
this.plugin.triggerEmbedUpdates();
}
}
- this.autosaveTimer = setInterval(timer,30000);
+ if(this.plugin.settings.autosave) {
+ this.autosaveTimer = setInterval(timer,30000);
+ }
}
//save current drawing when user closes workspace leaf
diff --git a/src/lang/locale/en.ts b/src/lang/locale/en.ts
index 41be424..dd531b6 100644
--- a/src/lang/locale/en.ts
+++ b/src/lang/locale/en.ts
@@ -22,6 +22,11 @@ export default {
INSERT_LINK: "Insert link to file",
INSERT_LATEX: "Insert LaTeX-symbol (e.g. $\\theta$)",
ENTER_LATEX: "Enter a valid LaTeX expression",
+ MIGRATION_NOTICE: "Welcome to Excalidraw 1.2\n\nThis version comes with major changes / improvements!\n\n"+
+ "⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠\n\nDrawings you created with version 1.1.x need to be migrated, they will not work out of the box. Please open the command palette CTRL+P and select " +
+ "'Excalidraw: MIGRATE to version 1.2: convert *.excalidraw to *.md files'\n\n⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠\n\n" +
+ "This version comes with many new features and possibilities. Please read the description in Community Plugins to find out more.\n\n" +
+ "Thank you!",
//ExcalidrawView.ts
OPEN_AS_MD: "Open as Markdown",
@@ -48,7 +53,12 @@ export default {
TEMPLATE_DESC: "Full filepath to the Excalidraw template. " +
"E.g.: If your template is in the default Excalidraw folder and it's name is " +
"Template.excalidraw, the setting would be: Excalidraw/Template.excalidraw",
- FILENAME_HEAD: "Filenam for drawings",
+ AUTOSAVE_NAME: "Autosave",
+ AUTOSAVE_DESC: "Automatically save the active drawing every 30 seconds. Save normally happens when you close Excalidraw or Obsidian, or move "+
+ "focus to another pane. In rare cases autosave may slightly disrupt your drawing flow. I created this feature with mobile " +
+ "phones in mind (I only have experience with Android), where 'swiping out Obsidian to close it' led to some data loss, and because " +
+ "I wasn't able to force save on application termination on mobiles. If you use Excalidraw on a desktop this is likely not needed.",
+ FILENAME_HEAD: "Filename",
FILENAME_DESC: "
The auto-generated filename consists of a prefix and a date. " +
"e.g.'Drawing 2021-05-24 12.58.07'.
"+
"Click this link for the "+
@@ -58,7 +68,7 @@ export default {
FILENAME_PREFIX_DESC: "The first part of the filename",
FILENAME_DATE_NAME: "Filename date",
FILENAME_DATE_DESC: "The second part of the filename",
- LINKS_HEAD: "Links in drawings",
+ LINKS_HEAD: "Links",
LINKS_DESC: "CTRL/META + CLICK on Text Elements to open them as links. " +
"If the selected text has more than one [[valid Obsidian links]], only the first will be opened. " +
"If the text starts as a valid web link (i.e. https:// or http://), then " +
@@ -76,7 +86,7 @@ export default {
LINK_CTRL_CLICK_NAME: "CTRL + CLICK on text to open them as links",
LINK_CTRL_CLICK_DESC: "You can turn this feature off if it interferes with default Excalidraw features you want to use. If " +
"this is turned off, only the link button in the title bar of the drawing pane will open links.",
- EMBED_HEAD: "Embedded/Export image settings",
+ EMBED_HEAD: "Embed & Export",
EMBED_WIDTH_NAME: "Default width of embedded (transcluded) image",
EMBED_WIDTH_DESC: "The default width of an embedded drawing. You can specify a custom " +
"width when embedding an image using the ![[drawing.excalidraw|100]] or " +
diff --git a/src/main.ts b/src/main.ts
index 123b8d8..6b7f58c 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -15,6 +15,7 @@ import {
Tasks,
MarkdownRenderer,
ViewState,
+ Notice,
} from "obsidian";
import {
@@ -94,8 +95,20 @@ export default class ExcalidrawPlugin extends Plugin {
//inspiration taken from kanban:
//https://github.com/mgmeyers/obsidian-kanban/blob/44118e25661bff9ebfe54f71ae33805dc88ffa53/src/main.ts#L267
this.registerMonkeyPatches();
+
+ this.migrationNotice();
}
+ private migrationNotice(){
+ const self = this;
+ this.app.workspace.onLayoutReady(async () => {
+ const excalidrawFiles = (self.app.vault.getFiles() || []).filter((f:TFile) => f.extension=="excalidraw");
+ if(excalidrawFiles.length > 0) {
+ if(Date.now()<1627775999000) //display message until July 31 2021
+ new Notice(t("MIGRATION_NOTICE"),30000);
+ }
+ });
+ }
/**
* Displays a transcluded .excalidraw image in markdown preview mode
*/
@@ -265,15 +278,17 @@ export default class ExcalidrawPlugin extends Plugin {
});
const fileMenuHandler = (menu: Menu, file: TFile) => {
- if (file instanceof TFolder) {
- menu.addItem((item: MenuItem) => {
- item.setTitle(t("CREATE_NEW"))
- .setIcon(ICON_NAME)
- .onClick(evt => {
- this.createDrawing(this.getNextDefaultFilename(),false,file.path);
- })
- });
- }
+ menu.addItem((item: MenuItem) => {
+ item.setTitle(t("CREATE_NEW"))
+ .setIcon(ICON_NAME)
+ .onClick(evt => {
+ let folderpath = file.path;
+ if(file instanceof TFile) {
+ folderpath = normalizePath(file.path.substr(0,file.path.lastIndexOf(file.name)));
+ }
+ this.createDrawing(this.getNextDefaultFilename(),false,folderpath);
+ })
+ });
};
this.registerEvent(
@@ -695,14 +710,17 @@ export default class ExcalidrawPlugin extends Plugin {
//save Excalidraw leaf and update embeds when switching to another leaf
const activeLeafChangeEventHandler = async (leaf:WorkspaceLeaf) => {
- const activeview:ExcalidrawView = (leaf.view instanceof ExcalidrawView) ? leaf.view as ExcalidrawView : null;
- if(self.activeExcalidrawView && self.activeExcalidrawView != activeview) {
- await self.activeExcalidrawView.save();
- self.triggerEmbedUpdates(self.activeExcalidrawView.file?.path);
+ const activeExcalidrawView = self.activeExcalidrawView;
+ const newActiveview:ExcalidrawView = (leaf.view instanceof ExcalidrawView) ? leaf.view as ExcalidrawView : null;
+ if(activeExcalidrawView && activeExcalidrawView != newActiveview) {
+ await activeExcalidrawView.save();
+ if(activeExcalidrawView.file) {
+ self.triggerEmbedUpdates(activeExcalidrawView.file.path);
+ }
}
- self.activeExcalidrawView = activeview;
- if(self.activeExcalidrawView) {
- self.lastActiveExcalidrawFilePath = self.activeExcalidrawView.file?.path;
+ self.activeExcalidrawView = newActiveview;
+ if(newActiveview) {
+ self.lastActiveExcalidrawFilePath = newActiveview.file?.path;
}
};
self.registerEvent(
diff --git a/src/settings.ts b/src/settings.ts
index f719d80..1abb988 100644
--- a/src/settings.ts
+++ b/src/settings.ts
@@ -16,7 +16,7 @@ export interface ExcalidrawSettings {
width: string,
showLinkBrackets: boolean,
linkPrefix: string,
-// validLinksOnly: boolean, //valid link as in [[valid Obsidian link]] - how to treat text elements in drawings
+ autosave: boolean;
allowCtrlClick: boolean, //if disabled only the link button in the view header will open links
exportWithTheme: boolean,
exportWithBackground: boolean,
@@ -34,7 +34,7 @@ export const DEFAULT_SETTINGS: ExcalidrawSettings = {
width: '400',
linkPrefix: ">> ",
showLinkBrackets: true,
-// validLinksOnly: false,
+ autosave: false,
allowCtrlClick: true,
exportWithTheme: true,
exportWithBackground: true,
@@ -78,6 +78,28 @@ export class ExcalidrawSettingTab extends PluginSettingTab {
await this.plugin.saveSettings();
}));
+ new Setting(containerEl)
+ .setName(t("AUTOSAVE_NAME"))
+ .setDesc(t("AUTOSAVE_DESC"))
+ .addToggle(toggle => toggle
+ .setValue(this.plugin.settings.autosave)
+ .onChange(async (value) => {
+ this.plugin.settings.autosave = value;
+ await this.plugin.saveSettings();
+ const exs = this.plugin.app.workspace.getLeavesOfType(VIEW_TYPE_EXCALIDRAW);
+ for(const v of exs) {
+ if(v.view instanceof ExcalidrawView) {
+ if(v.view.autosaveTimer) {
+ clearInterval(v.view.autosaveTimer)
+ v.view.autosaveTimer = null;
+ }
+ if(value) {
+ v.view.setupAutosaveTimer();
+ }
+ }
+ }
+ }));
+
this.containerEl.createEl('h1', {text: t("FILENAME_HEAD")});
containerEl.createDiv('',(el) => {
el.innerHTML = t("FILENAME_DESC");