diff --git a/manifest.json b/manifest.json index 1b28a16..70ae3ce 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "loom", "name": "Loom", - "version": "1.16.0", + "version": "1.16.1", "minAppVersion": "0.15.0", "description": "Loom in Obsidian", "author": "celeste", diff --git a/package.json b/package.json index 1e337bc..32de33d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsidian-loom", - "version": "1.16.0", + "version": "1.16.1", "description": "Loom in Obsidian", "main": "main.js", "scripts": { diff --git a/styles.css b/styles.css index 728cc89..bf1358f 100644 --- a/styles.css +++ b/styles.css @@ -188,7 +188,7 @@ body { display: inline-flex !important; margin-left: -0.025em; padding: 0.1em 0.075em; - border-radius: 0.2em; + border-radius: 0.25em; --icon-size: 1.1rem; } .loom__node-button:hover { diff --git a/views.ts b/views.ts index dd3baea..8ec6da9 100644 --- a/views.ts +++ b/views.ts @@ -1,4 +1,4 @@ -import { LoomSettings, NoteState } from "./common"; +import { LoomSettings, Node, NoteState } from "./common"; import { App, ItemView, Menu, Modal, Setting, WorkspaceLeaf, setIcon } from "obsidian"; import { Range } from "@codemirror/state"; import { @@ -11,6 +11,61 @@ import { } from "@codemirror/view"; const dialog = require("electron").remote.dialog; +interface MenuContext { + app: App; + event: MouseEvent; + state: NoteState; + id: string; + node: Node; + deletable: boolean; +} + +const showNodeMenu = ({ app, event, state, id, node, deletable }: MenuContext) => { + const menu = new Menu(); + + const menuItem = (name: string, icon: string, callback: () => void) => + menu.addItem((item) => { + item.setTitle(name); + item.setIcon(icon); + item.onClick(callback); + }); + + const zeroArgMenuItem = (name: string, icon: string, event: string) => + menuItem(name, icon, () => app.workspace.trigger(event)); + const selfArgMenuItem = (name: string, icon: string, event: string) => + menuItem(name, icon, () => app.workspace.trigger(event, id)); + + if (state.hoisted[state.hoisted.length - 1] === id) + zeroArgMenuItem("Unhoist", "arrow-down", "loom:unhoist"); + else + selfArgMenuItem("Hoist", "arrow-up", "loom:hoist"); + + if (node.bookmarked) + selfArgMenuItem("Remove bookmark", "bookmark-minus", "loom:toggle-bookmark"); + else + selfArgMenuItem("Bookmark", "bookmark", "loom:toggle-bookmark"); + + menu.addSeparator(); + selfArgMenuItem("Create child", "plus", "loom:create-child"); + selfArgMenuItem("Create sibling", "list-plus", "loom:create-sibling"); + + menu.addSeparator(); + selfArgMenuItem("Delete all children", "x", "loom:clear-children"); + selfArgMenuItem("Delete all siblings", "list-x", "loom:clear-siblings"); + + if (node.parentId !== null) { + menu.addSeparator(); + selfArgMenuItem("Merge with parent", "arrow-up-left", "loom:merge-with-parent"); + } + + if (deletable) { + menu.addSeparator(); + selfArgMenuItem("Delete", "trash", "loom:delete"); + } + + menu.showAtMouseEvent(event); +} + export class LoomView extends ItemView { getNoteState: () => NoteState | null; getSettings: () => LoomSettings; @@ -345,62 +400,13 @@ export class LoomView extends ItemView { this.app.workspace.trigger("loom:switch-to", id) ); - // define `showMenu`, - // which is triggered by pressing the menu button or right-clicking the node - const rootNodes = Object.entries(state.nodes) .filter(([, node]) => node.parentId === null) const deletable = rootNodes.length !== 1 || rootNodes[0][0] !== id; - const showMenu = (event: MouseEvent) => { - const menu = new Menu(); - - const menuItem = (name: string, icon: string, callback: () => void) => - menu.addItem((item) => { - item.setTitle(name); - item.setIcon(icon); - item.onClick(callback); - }); - - const zeroArgMenuItem = (name: string, icon: string, event: string) => - menuItem(name, icon, () => this.app.workspace.trigger(event)); - const selfArgMenuItem = (name: string, icon: string, event: string) => - menuItem(name, icon, () => this.app.workspace.trigger(event, id)); - - if (state.hoisted[state.hoisted.length - 1] === id) - zeroArgMenuItem("Unhoist", "arrow-down", "loom:unhoist"); - else - selfArgMenuItem("Hoist", "arrow-up", "loom:hoist"); - - if (node.bookmarked) - selfArgMenuItem("Remove bookmark", "bookmark-minus", "loom:toggle-bookmark"); - else - selfArgMenuItem("Bookmark", "bookmark", "loom:toggle-bookmark"); - - menu.addSeparator(); - selfArgMenuItem("Create child", "plus", "loom:create-child"); - selfArgMenuItem("Create sibling", "list-plus", "loom:create-sibling"); - - menu.addSeparator(); - selfArgMenuItem("Delete all children", "x", "loom:clear-children"); - selfArgMenuItem("Delete all siblings", "list-x", "loom:clear-siblings"); - - if (node.parentId !== null) { - menu.addSeparator(); - selfArgMenuItem("Merge with parent", "arrow-up-left", "loom:merge-with-parent"); - } - - if (deletable) { - menu.addSeparator(); - selfArgMenuItem("Delete", "trash", "loom:delete"); - } - - menu.showAtMouseEvent(event); - } - nodeContainer.addEventListener("contextmenu", (event) => { event.preventDefault(); - showMenu(event); + showNodeMenu({ app: this.app, event, state, id, node, deletable }); }); // add buttons on hover @@ -418,7 +424,7 @@ export class LoomView extends ItemView { button_.addEventListener("click", callback); }; - button("Show menu", "menu", showMenu); + button("Show menu", "menu", (event) => showNodeMenu({ app: this.app, event, state, id, node, deletable })); if (state.hoisted[state.hoisted.length - 1] === id) button("Unhoist", "arrow-down", () => this.app.workspace.trigger("loom:unhoist")); @@ -545,6 +551,14 @@ export class LoomSiblingsView extends ItemView { this.app.workspace.trigger("loom:switch-to", id) ); + const rootNodes = Object.entries(state.nodes) + .filter(([, node]) => node.parentId === null) + const deletable = rootNodes.length !== 1 || rootNodes[0][0] !== id; + nodeContainer.addEventListener("contextmenu", (event) => { + event.preventDefault(); + showNodeMenu({ app: this.app, event, state, id, node, deletable }); + }); + if (parseInt(i) !== siblings.length - 1) container.createEl("hr", { cls: "loom__sibling-separator" });