Skip to content

Commit 3265fe5

Browse files
authored
feat: add port events (#3185)
1 parent 5599286 commit 3265fe5

File tree

2 files changed

+66
-13
lines changed

2 files changed

+66
-13
lines changed

packages/x6/src/view/node.ts

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -457,6 +457,28 @@ export class NodeView<
457457
return { e, x, y, view, node, cell } as NodeView.PositionEventArgs<E>
458458
}
459459

460+
protected getPortEventArgs<E>(
461+
e: E,
462+
port: string,
463+
pos?: { x: number; y: number },
464+
) {
465+
const view = this // eslint-disable-line
466+
const node = view.cell
467+
const cell = node
468+
if (pos) {
469+
return {
470+
e,
471+
x: pos.x,
472+
y: pos.y,
473+
view,
474+
node,
475+
cell,
476+
port,
477+
} as NodeView.PositionEventArgs<E>
478+
}
479+
return { e, view, node, cell, port } as NodeView.MouseEventArgs<E>
480+
}
481+
460482
notifyMouseDown(e: Dom.MouseDownEvent, x: number, y: number) {
461483
super.onMouseDown(e, x, y)
462484
this.notify('node:mousedown', this.getEventArgs(e, x, y))
@@ -472,26 +494,41 @@ export class NodeView<
472494
this.notify('node:mouseup', this.getEventArgs(e, x, y))
473495
}
474496

497+
notifyPortEvent(
498+
name: string,
499+
e: Dom.EventObject,
500+
pos?: { x: number; y: number },
501+
) {
502+
const port = this.findAttr('port', e.target)
503+
if (port) {
504+
this.notify(name, this.getPortEventArgs(e, port, pos))
505+
}
506+
}
507+
475508
onClick(e: Dom.ClickEvent, x: number, y: number) {
476509
super.onClick(e, x, y)
477510
this.notify('node:click', this.getEventArgs(e, x, y))
511+
this.notifyPortEvent('node:port:click', e, { x, y })
478512
}
479513

480514
onDblClick(e: Dom.DoubleClickEvent, x: number, y: number) {
481515
super.onDblClick(e, x, y)
482516
this.notify('node:dblclick', this.getEventArgs(e, x, y))
517+
this.notifyPortEvent('node:port:dblclick', e, { x, y })
483518
}
484519

485520
onContextMenu(e: Dom.ContextMenuEvent, x: number, y: number) {
486521
super.onContextMenu(e, x, y)
487522
this.notify('node:contextmenu', this.getEventArgs(e, x, y))
523+
this.notifyPortEvent('node:port:contextmenu', e, { x, y })
488524
}
489525

490526
onMouseDown(e: Dom.MouseDownEvent, x: number, y: number) {
491527
if (this.isPropagationStopped(e)) {
492528
return
493529
}
494530
this.notifyMouseDown(e, x, y)
531+
this.notifyPortEvent('node:port:mousedown', e, { x, y })
495532
this.startNodeDragging(e, x, y)
496533
}
497534

@@ -515,6 +552,7 @@ export class NodeView<
515552
})
516553
}
517554
this.notifyMouseMove(e, x, y)
555+
this.notifyPortEvent('node:port:mousemove', e, { x, y })
518556
}
519557

520558
this.setEventData<EventData.Mousemove>(e, data)
@@ -527,6 +565,7 @@ export class NodeView<
527565
this.stopMagnetDragging(e, x, y)
528566
} else {
529567
this.notifyMouseUp(e, x, y)
568+
this.notifyPortEvent('node:port:mouseup', e, { x, y })
530569
if (action === 'move') {
531570
const meta = data as EventData.Moving
532571
const view = meta.targetView || this
@@ -545,22 +584,26 @@ export class NodeView<
545584
onMouseOver(e: Dom.MouseOverEvent) {
546585
super.onMouseOver(e)
547586
this.notify('node:mouseover', this.getEventArgs(e))
587+
this.notifyPortEvent('node:port:mouseover', e)
548588
}
549589

550590
onMouseOut(e: Dom.MouseOutEvent) {
551591
super.onMouseOut(e)
552592
this.notify('node:mouseout', this.getEventArgs(e))
593+
this.notifyPortEvent('node:port:mouseout', e)
553594
}
554595

555596
onMouseEnter(e: Dom.MouseEnterEvent) {
556597
this.updateClassName(e)
557598
super.onMouseEnter(e)
558599
this.notify('node:mouseenter', this.getEventArgs(e))
600+
this.notifyPortEvent('node:port:mouseenter', e)
559601
}
560602

561603
onMouseLeave(e: Dom.MouseLeaveEvent) {
562604
super.onMouseLeave(e)
563605
this.notify('node:mouseleave', this.getEventArgs(e))
606+
this.notifyPortEvent('node:port:mouseleave', e)
564607
}
565608

566609
onMouseWheel(e: Dom.EventObject, x: number, y: number, delta: number) {
@@ -1092,14 +1135,13 @@ export namespace NodeView {
10921135
interface MagnetEventArgs {
10931136
magnet: Element
10941137
}
1095-
10961138
export interface MouseEventArgs<E> {
10971139
e: E
10981140
node: Node
10991141
cell: Node
11001142
view: NodeView
1143+
port?: string
11011144
}
1102-
11031145
export interface PositionEventArgs<E>
11041146
extends MouseEventArgs<E>,
11051147
CellView.PositionEventArgs {}
@@ -1124,6 +1166,17 @@ export namespace NodeView {
11241166
'node:mousewheel': PositionEventArgs<Dom.EventObject> &
11251167
CellView.MouseDeltaEventArgs
11261168

1169+
'node:port:click': PositionEventArgs<Dom.ClickEvent>
1170+
'node:port:dblclick': PositionEventArgs<Dom.DoubleClickEvent>
1171+
'node:port:contextmenu': PositionEventArgs<Dom.ContextMenuEvent>
1172+
'node:port:mousedown': PositionEventArgs<Dom.MouseDownEvent>
1173+
'node:port:mousemove': PositionEventArgs<Dom.MouseMoveEvent>
1174+
'node:port:mouseup': PositionEventArgs<Dom.MouseUpEvent>
1175+
'node:port:mouseover': MouseEventArgs<Dom.MouseOverEvent>
1176+
'node:port:mouseout': MouseEventArgs<Dom.MouseOutEvent>
1177+
'node:port:mouseenter': MouseEventArgs<Dom.MouseEnterEvent>
1178+
'node:port:mouseleave': MouseEventArgs<Dom.MouseLeaveEvent>
1179+
11271180
'node:customevent': PositionEventArgs<Dom.MouseDownEvent> & {
11281181
name: string
11291182
}

sites/x6-sites/docs/tutorial/basic/events.zh.md

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,17 @@ redirect_from:
1919

2020
### 鼠标事件
2121

22-
| 事件 | cell 节点/边 | node 节点 | edge 边 | blank 画布空白区域 |
23-
| -------- | ------------------ | ------------------ | ------------------ | ------------------- |
24-
| 单击 | `cell:click` | `node:click` | `edge:click` | `blank:click` |
25-
| 双击 | `cell:dblclick` | `node:dblclick` | `edge:dblclick` | `blank:dblclick` |
26-
| 右键 | `cell:contextmenu` | `node:contextmenu` | `edge:contextmenu` | `blank:contextmenu` |
27-
| 鼠标按下 | `cell:mousedown` | `node:mousedown` | `edge:mousedown` | `blank:mousedown` |
28-
| 移动鼠标 | `cell:mousemove` | `node:mousemove` | `edge:mousemove` | `blank:mousemove` |
29-
| 鼠标抬起 | `cell:mouseup` | `node:mouseup` | `edge:mouseup` | `blank:mouseup` |
30-
| 鼠标滚轮 | `cell:mousewheel` | `node:mousewheel` | `edge:mousewheel` | `blank:mousewheel` |
31-
| 鼠标进入 | `cell:mouseenter` | `node:mouseenter` | `edge:mouseenter` | `graph:mouseenter` |
32-
| 鼠标离开 | `cell:mouseleave` | `node:mouseleave` | `edge:mouseleave` | `graph:mouseleave` |
22+
| 事件 | cell 节点/边 | node 节点 | port 连接桩 | edge 边 | blank 画布空白区域 |
23+
|-------|---------------------|---------------------|--------------------------|---------------------|----------------------|
24+
| 单击 | `cell:click` | `node:click` | `node:port:click` | `edge:click` | `blank:click` |
25+
| 双击 | `cell:dblclick` | `node:dblclick` | `node:port:dblclick` | `edge:dblclick` | `blank:dblclick` |
26+
| 右键 | `cell:contextmenu` | `node:contextmenu` | `node:port:contextmenu` | `edge:contextmenu` | `blank:contextmenu` |
27+
| 鼠标按下 | `cell:mousedown` | `node:mousedown` | `node:port:mousedown` | `edge:mousedown` | `blank:mousedown` |
28+
| 移动鼠标 | `cell:mousemove` | `node:mousemove` | `node:port:mousemove` | `edge:mousemove` | `blank:mousemove` |
29+
| 鼠标抬起 | `cell:mouseup` | `node:mouseup` | `node:port:mouseup` | `edge:mouseup` | `blank:mouseup` |
30+
| 鼠标滚轮 | `cell:mousewheel` | `node:mousewheel` | - | `edge:mousewheel` | `blank:mousewheel` |
31+
| 鼠标进入 | `cell:mouseenter` | `node:mouseenter` | `node:port:mouseenter` | `edge:mouseenter` | `graph:mouseenter` |
32+
| 鼠标离开 | `cell:mouseleave` | `node:mouseleave` | `node:port:mouseleave` | `edge:mouseleave` | `graph:mouseleave` |
3333

3434
:::warning{title=注意:}
3535
需要注意的是,这里的 `mousemove` 事件和通常的鼠标移动事件有所区别,它需要在鼠标按下后移动鼠标才能触发。

0 commit comments

Comments
 (0)