Fix edge event and show edge label error

This commit is contained in:
yangdx
2025-03-14 03:33:40 +08:00
parent c9c9f3d911
commit 2777715403
2 changed files with 43 additions and 20 deletions

View File

@@ -34,6 +34,8 @@ const GraphControl = ({ disableHoverEffect }: { disableHoverEffect?: boolean })
const { theme } = useTheme() const { theme } = useTheme()
const hideUnselectedEdges = useSettingsStore.use.enableHideUnselectedEdges() const hideUnselectedEdges = useSettingsStore.use.enableHideUnselectedEdges()
const enableEdgeEvents = useSettingsStore.use.enableEdgeEvents()
const renderEdgeLabels = useSettingsStore.use.showEdgeLabel()
const selectedNode = useGraphStore.use.selectedNode() const selectedNode = useGraphStore.use.selectedNode()
const focusedNode = useGraphStore.use.focusedNode() const focusedNode = useGraphStore.use.focusedNode()
const selectedEdge = useGraphStore.use.selectedEdge() const selectedEdge = useGraphStore.use.selectedEdge()
@@ -59,39 +61,52 @@ const GraphControl = ({ disableHoverEffect }: { disableHoverEffect?: boolean })
const { setFocusedNode, setSelectedNode, setFocusedEdge, setSelectedEdge, clearSelection } = const { setFocusedNode, setSelectedNode, setFocusedEdge, setSelectedEdge, clearSelection } =
useGraphStore.getState() useGraphStore.getState()
// Register the events // Define event types
registerEvents({ type NodeEvent = { node: string; event: { original: MouseEvent | TouchEvent } }
enterNode: (event) => { type EdgeEvent = { edge: string; event: { original: MouseEvent | TouchEvent } }
// Register all events, but edge events will only be processed if enableEdgeEvents is true
const events: Record<string, any> = {
enterNode: (event: NodeEvent) => {
if (!isButtonPressed(event.event.original)) { if (!isButtonPressed(event.event.original)) {
setFocusedNode(event.node) setFocusedNode(event.node)
} }
}, },
leaveNode: (event) => { leaveNode: (event: NodeEvent) => {
if (!isButtonPressed(event.event.original)) { if (!isButtonPressed(event.event.original)) {
setFocusedNode(null) setFocusedNode(null)
} }
}, },
clickNode: (event) => { clickNode: (event: NodeEvent) => {
setSelectedNode(event.node) setSelectedNode(event.node)
setSelectedEdge(null) setSelectedEdge(null)
}, },
clickEdge: (event) => { clickStage: () => clearSelection()
}
// Only add edge event handlers if enableEdgeEvents is true
if (enableEdgeEvents) {
events.clickEdge = (event: EdgeEvent) => {
setSelectedEdge(event.edge) setSelectedEdge(event.edge)
setSelectedNode(null) setSelectedNode(null)
}, }
enterEdge: (event) => {
events.enterEdge = (event: EdgeEvent) => {
if (!isButtonPressed(event.event.original)) { if (!isButtonPressed(event.event.original)) {
setFocusedEdge(event.edge) setFocusedEdge(event.edge)
} }
}, }
leaveEdge: (event) => {
events.leaveEdge = (event: EdgeEvent) => {
if (!isButtonPressed(event.event.original)) { if (!isButtonPressed(event.event.original)) {
setFocusedEdge(null) setFocusedEdge(null)
} }
}, }
clickStage: () => clearSelection() }
})
}, [registerEvents]) // Register the events
registerEvents(events)
}, [registerEvents, enableEdgeEvents])
/** /**
* When component mount or hovered node change * When component mount or hovered node change
@@ -102,7 +117,13 @@ const GraphControl = ({ disableHoverEffect }: { disableHoverEffect?: boolean })
const labelColor = isDarkTheme ? Constants.labelColorDarkTheme : undefined const labelColor = isDarkTheme ? Constants.labelColorDarkTheme : undefined
const edgeColor = isDarkTheme ? Constants.edgeColorDarkTheme : undefined const edgeColor = isDarkTheme ? Constants.edgeColorDarkTheme : undefined
// Update edge-related settings directly without recreating the sigma container
setSettings({ setSettings({
// Update edge-specific settings
enableEdgeEvents,
renderEdgeLabels,
// Node reducer for node appearance
nodeReducer: (node, data) => { nodeReducer: (node, data) => {
const graph = sigma.getGraph() const graph = sigma.getGraph()
const newData: NodeType & { const newData: NodeType & {
@@ -141,6 +162,8 @@ const GraphControl = ({ disableHoverEffect }: { disableHoverEffect?: boolean })
} }
return newData return newData
}, },
// Edge reducer for edge appearance
edgeReducer: (edge, data) => { edgeReducer: (edge, data) => {
const graph = sigma.getGraph() const graph = sigma.getGraph()
const newData = { ...data, hidden: false, labelColor, color: edgeColor } const newData = { ...data, hidden: false, labelColor, color: edgeColor }
@@ -182,7 +205,9 @@ const GraphControl = ({ disableHoverEffect }: { disableHoverEffect?: boolean })
sigma, sigma,
disableHoverEffect, disableHoverEffect,
theme, theme,
hideUnselectedEdges hideUnselectedEdges,
enableEdgeEvents,
renderEdgeLabels
]) ])
return null return null

View File

@@ -124,9 +124,7 @@ const GraphViewer = () => {
const showNodeSearchBar = useSettingsStore.use.showNodeSearchBar() const showNodeSearchBar = useSettingsStore.use.showNodeSearchBar()
const renderLabels = useSettingsStore.use.showNodeLabel() const renderLabels = useSettingsStore.use.showNodeLabel()
const enableEdgeEvents = useSettingsStore.use.enableEdgeEvents()
const enableNodeDrag = useSettingsStore.use.enableNodeDrag() const enableNodeDrag = useSettingsStore.use.enableNodeDrag()
const renderEdgeLabels = useSettingsStore.use.showEdgeLabel()
// Handle component mount/unmount and tab visibility // Handle component mount/unmount and tab visibility
useEffect(() => { useEffect(() => {
@@ -146,14 +144,14 @@ const GraphViewer = () => {
} }
}, [isGraphTabVisible, shouldRender, isFetching]) }, [isGraphTabVisible, shouldRender, isFetching])
// Initialize sigma settings once on component mount
// Edge-related settings will be updated in GraphControl using useSetSettings
useEffect(() => { useEffect(() => {
setSigmaSettings({ setSigmaSettings({
...defaultSigmaSettings, ...defaultSigmaSettings,
enableEdgeEvents,
renderEdgeLabels,
renderLabels renderLabels
}) })
}, [renderLabels, enableEdgeEvents, renderEdgeLabels]) }, [renderLabels])
const onSearchFocus = useCallback((value: GraphSearchOption | null) => { const onSearchFocus = useCallback((value: GraphSearchOption | null) => {
if (value === null) useGraphStore.getState().setFocusedNode(null) if (value === null) useGraphStore.getState().setFocusedNode(null)