diff options
-rw-r--r-- | components/tweaks.tsx | 5 | ||||
-rw-r--r-- | org-roam-ui.el | 47 | ||||
-rw-r--r-- | pages/index.tsx | 43 |
3 files changed, 46 insertions, 49 deletions
diff --git a/components/tweaks.tsx b/components/tweaks.tsx index 3da32cc..bc1a0d3 100644 --- a/components/tweaks.tsx +++ b/components/tweaks.tsx @@ -163,6 +163,7 @@ export const Tweaks = (props: TweakProps) => { setFilter(initialFilter) setMouse(initialMouse) setPhysics(initialPhysics) + setBehavior(initialBehavior) }} variant="none" size="sm" @@ -1222,7 +1223,7 @@ export const Tweaks = (props: TweakProps) => { </Portal> </Menu> </Flex> - <Flex alignItems="center" justifyContent="space-between"> + {/* <Flex alignItems="center" justifyContent="space-between"> <Flex> <Text>Follow local graph</Text> <InfoTooltip infoText="When in local mode and opening a node that already exists in Emacs, should I add that local graph or open the new one?" /> @@ -1252,7 +1253,7 @@ export const Tweaks = (props: TweakProps) => { </MenuList> </Portal> </Menu> - </Flex> + </Flex> */} <SliderWithInfo label="Zoom speed" value={behavior.zoomSpeed} diff --git a/org-roam-ui.el b/org-roam-ui.el index 2b86914..b606e99 100644 --- a/org-roam-ui.el +++ b/org-roam-ui.el @@ -1,11 +1,11 @@ ;;; org-roam-ui.el --- User Interface for Org-roam -*- coding: utf-8; lexical-binding: t; -*- -;; Copyright © 2021 ... +;; Copyright © 2021 Kirill Rogovoy, Thomas F. K. Jorna -;; Author: ... +;; author: Kirill Rogovoy, Thomas Jorna ;; URL: https://github.com/org-roam/org-roam-ui ;; Keywords: org-mode, roam -;; Version: ... +;; Version: 0 ;; Package-Requires: ((emacs "26.1") (f "0.17.2") (org-roam "2.0.0")) ;; This file is NOT part of GNU Emacs. @@ -115,21 +115,15 @@ This serves the web-build and API over HTTP." (add-hook 'after-save-hook #'org-roam-ui--on-save) (message "Connection established with org-roam-ui") (when org-roam-ui-follow - (add-hook 'post-command-hook #'org-roam-ui--update-current-node)))) + (org-roam-ui-follow-mode 1)))) :on-close (lambda (_websocket) - (remove-hook 'post-command-hook #'org-roam-ui--update-current-node) (remove-hook 'after-save-hook #'org-roam-ui--on-save) - (message "Connection with org-roam-ui closed.")))) - (if - (boundp 'counsel-load-theme) - (advice-add 'counsel-load-theme :after #'org-roam-ui-sync-theme--advice) - (advice-add 'load-theme :after #'org-roam-ui-sync-theme--advice))) + (org-roam-ui-follow-mode -1) + (message "Connection with org-roam-ui closed."))))) (t (progn (websocket-server-close org-roam-ui-ws) - (if (boundp 'counsel-load-theme) -(advice-remove 'counsel-load-theme #'org-roam-ui-sync-theme--advice) - (advice-remove 'load-theme #'org-roam-ui-sync-theme--advice)) + (org-roam-ui-follow-mode -1) (httpd-stop))))) (defun org-roam-ui--on-save () @@ -255,7 +249,8 @@ The padding around the nodes in the viewport." (defun orui-node-local (&optional id speed padding) - "Open the local graph view of the current node, or optionally of a node of your choosing." + "Open the local graph view of the current node, or optionally of a node of your choosing. +Optionally with id (string), speed (number, ms) and padding (number, px)." (interactive) (if-let ((node (or id (org-roam-id-at-point)))) (websocket-send-text oru-ws (json-encode `((type . "command") (data . @@ -263,25 +258,21 @@ The padding around the nodes in the viewport." (message "No node found.")) (defvar org-roam-ui--following nil) -(defun orui-toggle-follow () + +(define-minor-mode org-roam-ui-follow-mode "Set whether ORUI should follow your every move in emacs. Default yes." - (interactive) - (if (member 'org-roam-ui--update-current-node (default-value 'post-command-hook)) + :lighter "org-roam-ui " + :global t + :group 'org-roam-ui + :init-value nil + (if org-roam-ui-follow-mode (progn - (remove-hook 'post-command-hook #'org-roam-ui--update-current-node) - (message "Org-Roam-UI will now leave you alone.") - (setq org-roam-ui--following nil)) (add-hook 'post-command-hook #'org-roam-ui--update-current-node) - (setq org-roam-ui--following nil) (message "Org-Roam-UI will now follow you around.")) - ) - + (remove-hook 'post-command-hook #'org-roam-ui--update-current-node) + (message "Org-Roam-UI will now leave you alone.") + )) -(defun orui-toggle-local-zoom () - "Toggles whether org-roam-ui should go to the local view of a given node or zoom to it. -Defaults to local." - (interactive) - (org-roam-ui--send-command "toggle" `(id . yes))) (defun orui-sync-theme () "Sync your current Emacs theme with org-roam-ui." diff --git a/pages/index.tsx b/pages/index.tsx index 6eb86b1..da308c7 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -132,9 +132,13 @@ export function GraphPage() { const [threeDim, setThreeDim] = useState(false) const [scope, setScope] = useState<Scope>({ nodeIds: [] }) - + const scopeRef = useRef<Scope>({ nodeIds: [] }) + const behaviorRef = useRef(initialBehavior) + behaviorRef.current = behavior const graphRef = useRef<any>(null) + const WebSocketRef = useRef<any>(null) + scopeRef.current = scope const followBehavior = ( command: string, emacsNode: string, @@ -142,6 +146,8 @@ export function GraphPage() { padding: number = 200, ) => { const fg = graphRef.current + const sr = scopeRef.current + const bh = behaviorRef.current const links = linksByNodeIdRef.current[emacsNode] ?? [] const nodes = Object.fromEntries( [emacsNode as string, ...links.flatMap((link) => [link.source, link.target])].map( @@ -149,20 +155,23 @@ export function GraphPage() { ), ) if (command === 'zoom') { - if (scope.nodeIds.length) { + console.log(sr) + if (sr.nodeIds.length) { + console.log('emptying') + console.log('scope ' + sr.nodeIds) setScope({ nodeIds: [] }) } setTimeout(() => fg.zoomToFit(speed, padding, (node: OrgRoamNode) => nodes[node.id!]), 50) return } - if (!scope.nodeIds.length) { + if (!sr.nodeIds.length) { setScope({ nodeIds: [emacsNode] }) setTimeout(() => { fg.zoomToFit(speed, padding, (node: OrgRoamNode) => nodes[node.id!]) }, 50) return } - if (behavior.localSame !== 'add') { + if (bh.localSame !== 'add') { setScope({ nodeIds: [emacsNode] }) setTimeout(() => { fg.zoomToFit(speed, padding, (node: OrgRoamNode) => nodes[node.id!]) @@ -172,8 +181,8 @@ export function GraphPage() { // if the node is in the scopednodes, add it to scope instead of replacing it if ( - !scope.nodeIds.includes(emacsNode) || - !scope.nodeIds.some((scopeId: string) => { + !sr.nodeIds.includes(emacsNode) || + !sr.nodeIds.some((scopeId: string) => { return nodes[scopeId] }) ) { @@ -191,12 +200,13 @@ export function GraphPage() { } useEffect(() => { - const socket = new ReconnectingWebSocket('ws://localhost:35903') - socket.addEventListener('open', (event) => { + WebSocketRef.current = new ReconnectingWebSocket('ws://localhost:35903') + WebSocketRef.current.addEventListener('open', (event: any) => { console.log('Connection with Emacs established') }) - socket.addEventListener('message', (event) => { + WebSocketRef.current.addEventListener('message', (event: any) => { const fg = graphRef.current + const bh = behaviorRef.current const message = JSON.parse(event.data) switch (message.type) { case 'graphdata': @@ -212,19 +222,14 @@ export function GraphPage() { setEmacsNodeId(message.data.id) break case 'zoom': { - const speed = message?.data?.speed || behavior.zoomSpeed - const padding = message?.data?.padding || behavior.zoomPadding + const speed = message?.data?.speed || bh.zoomSpeed + const padding = message?.data?.padding || bh.zoomPadding followBehavior('zoom', message.data.id, speed, padding) setEmacsNodeId(message.data.id) break } case 'follow': { - followBehavior( - behavior.follow, - message.data.id, - behavior.zoomSpeed, - behavior.zoomPadding, - ) + followBehavior(bh.follow, message.data.id, bh.zoomSpeed, bh.zoomPadding) setEmacsNodeId(message.data.id) break } @@ -355,7 +360,7 @@ export const Graph = forwardRef(function (props: GraphProps, graphRef: any) { if (!emacsNodeId) { return } - centralHighlightedNode.current = nodeById[emacsNodeId] as NodeObject + setHoverNode(nodeById[emacsNodeId] as NodeObject) }, [emacsNodeId]) centralHighlightedNode.current = hoverNode @@ -751,7 +756,7 @@ export const Graph = forwardRef(function (props: GraphProps, graphRef: any) { if (scope.nodeIds.length === 0) { return } - setScope((currentScope) => ({ + setScope((currentScope: Scope) => ({ ...currentScope, nodeIds: [], })) |