feat(graph): enable radial mode (#1738)
This commit is contained in:
		
							parent
							
								
									7be47742a6
								
							
						
					
					
						commit
						fbc45548f7
					
				| @ -36,6 +36,7 @@ Component.Graph({ | ||||
|     opacityScale: 1, // how quickly do we fade out the labels when zooming out? | ||||
|     removeTags: [], // what tags to remove from the graph | ||||
|     showTags: true, // whether to show tags in the graph | ||||
|     enableRadial: false, // whether to constrain the graph, similar to Obsidian | ||||
|   }, | ||||
|   globalGraph: { | ||||
|     drag: true, | ||||
| @ -49,6 +50,7 @@ Component.Graph({ | ||||
|     opacityScale: 1, | ||||
|     removeTags: [], // what tags to remove from the graph | ||||
|     showTags: true, // whether to show tags in the graph | ||||
|     enableRadial: true, // whether to constrain the graph, similar to Obsidian | ||||
|   }, | ||||
| }) | ||||
| ``` | ||||
|  | ||||
| @ -18,6 +18,7 @@ export interface D3Config { | ||||
|   removeTags: string[] | ||||
|   showTags: boolean | ||||
|   focusOnHover?: boolean | ||||
|   enableRadial?: boolean | ||||
| } | ||||
| 
 | ||||
| interface GraphOptions { | ||||
| @ -39,6 +40,7 @@ const defaultOptions: GraphOptions = { | ||||
|     showTags: true, | ||||
|     removeTags: [], | ||||
|     focusOnHover: false, | ||||
|     enableRadial: false, | ||||
|   }, | ||||
|   globalGraph: { | ||||
|     drag: true, | ||||
| @ -53,10 +55,11 @@ const defaultOptions: GraphOptions = { | ||||
|     showTags: true, | ||||
|     removeTags: [], | ||||
|     focusOnHover: true, | ||||
|     enableRadial: true, | ||||
|   }, | ||||
| } | ||||
| 
 | ||||
| export default ((opts?: GraphOptions) => { | ||||
| export default ((opts?: Partial<GraphOptions>) => { | ||||
|   const Graph: QuartzComponent = ({ displayClass, cfg }: QuartzComponentProps) => { | ||||
|     const localGraph = { ...defaultOptions.localGraph, ...opts?.localGraph } | ||||
|     const globalGraph = { ...defaultOptions.globalGraph, ...opts?.globalGraph } | ||||
|  | ||||
| @ -8,6 +8,7 @@ import { | ||||
|   forceCenter, | ||||
|   forceLink, | ||||
|   forceCollide, | ||||
|   forceRadial, | ||||
|   zoomIdentity, | ||||
|   select, | ||||
|   drag, | ||||
| @ -87,6 +88,7 @@ async function renderGraph(container: string, fullSlug: FullSlug) { | ||||
|     removeTags, | ||||
|     showTags, | ||||
|     focusOnHover, | ||||
|     enableRadial, | ||||
|   } = JSON.parse(graph.dataset["cfg"]!) as D3Config | ||||
| 
 | ||||
|   const data: Map<SimpleSlug, ContentDetails> = new Map( | ||||
| @ -161,15 +163,20 @@ async function renderGraph(container: string, fullSlug: FullSlug) { | ||||
|       })), | ||||
|   } | ||||
| 
 | ||||
|   const width = graph.offsetWidth | ||||
|   const height = Math.max(graph.offsetHeight, 250) | ||||
| 
 | ||||
|   // we virtualize the simulation and use pixi to actually render it
 | ||||
|   // Calculate the radius of the container circle
 | ||||
|   const radius = Math.min(width, height) / 2 - 40 // 40px padding
 | ||||
|   const simulation: Simulation<NodeData, LinkData> = forceSimulation<NodeData>(graphData.nodes) | ||||
|     .force("charge", forceManyBody().strength(-100 * repelForce)) | ||||
|     .force("center", forceCenter().strength(centerForce)) | ||||
|     .force("link", forceLink(graphData.links).distance(linkDistance)) | ||||
|     .force("collide", forceCollide<NodeData>((n) => nodeRadius(n)).iterations(3)) | ||||
| 
 | ||||
|   const width = graph.offsetWidth | ||||
|   const height = Math.max(graph.offsetHeight, 250) | ||||
|   if (enableRadial) | ||||
|     simulation.force("radial", forceRadial(radius * 0.8, width / 2, height / 2).strength(0.3)) | ||||
| 
 | ||||
|   // precompute style prop strings as pixi doesn't support css variables
 | ||||
|   const cssVars = [ | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user