Skip to content

Commit 88c3006

Browse files
committed
Fix: Skip unnecessary listener notify on set style
1 parent 7cd077b commit 88c3006

File tree

3 files changed

+43
-27
lines changed

3 files changed

+43
-27
lines changed

src/models/edge.ts

+20-12
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ export interface IEdgePosition {
3030
target: any;
3131
}
3232

33+
export interface IEdgeSetStyleOptions {
34+
isNotifySkipped: boolean;
35+
}
36+
3337
export enum EdgeLineStyleType {
3438
SOLID = 'solid',
3539
DASHED = 'dashed',
@@ -115,10 +119,10 @@ export interface IEdge<N extends INodeBase, E extends IEdgeBase> extends ISubjec
115119
setData(callback: (edge: IEdge<N, E>) => E): void;
116120
patchData(data: Partial<E>): void;
117121
patchData(callback: (edge: IEdge<N, E>) => Partial<E>): void;
118-
setStyle(style: IEdgeStyle): void;
119-
setStyle(callback: (edge: IEdge<N, E>) => IEdgeStyle): void;
120-
patchStyle(style: IEdgeStyle): void;
121-
patchStyle(callback: (edge: IEdge<N, E>) => IEdgeStyle): void;
122+
setStyle(style: IEdgeStyle, options?: IEdgeSetStyleOptions): void;
123+
setStyle(callback: (edge: IEdge<N, E>) => IEdgeStyle, options?: IEdgeSetStyleOptions): void;
124+
patchStyle(style: IEdgeStyle, options?: IEdgeSetStyleOptions): void;
125+
patchStyle(callback: (edge: IEdge<N, E>) => IEdgeStyle, options?: IEdgeSetStyleOptions): void;
122126
setState(state: number): void;
123127
setState(state: IGraphObjectStateParameters): void;
124128
setState(callback: (edge: IEdge<N, E>) => number): void;
@@ -374,20 +378,22 @@ abstract class Edge<N extends INodeBase, E extends IEdgeBase> extends Subject im
374378
this.notifyListeners();
375379
}
376380

377-
setStyle(style: IEdgeStyle): void;
378-
setStyle(callback: (edge: IEdge<N, E>) => IEdgeStyle): void;
379-
setStyle(arg: IEdgeStyle | ((edge: IEdge<N, E>) => IEdgeStyle)): void {
381+
setStyle(style: IEdgeStyle, options?: IEdgeSetStyleOptions): void;
382+
setStyle(callback: (edge: IEdge<N, E>) => IEdgeStyle, options?: IEdgeSetStyleOptions): void;
383+
setStyle(arg: IEdgeStyle | ((edge: IEdge<N, E>) => IEdgeStyle), options?: IEdgeSetStyleOptions): void {
380384
if (isFunction(arg)) {
381385
this._style = (arg as (edge: IEdge<N, E>) => IEdgeStyle)(this);
382386
} else {
383387
this._style = arg as IEdgeStyle;
384388
}
385-
this.notifyListeners();
389+
if (!options?.isNotifySkipped) {
390+
this.notifyListeners();
391+
}
386392
}
387393

388-
patchStyle(style: IEdgeStyle): void;
389-
patchStyle(callback: (edge: IEdge<N, E>) => IEdgeStyle): void;
390-
patchStyle(arg: IEdgeStyle | ((edge: IEdge<N, E>) => IEdgeStyle)) {
394+
patchStyle(style: IEdgeStyle, options?: IEdgeSetStyleOptions): void;
395+
patchStyle(callback: (edge: IEdge<N, E>) => IEdgeStyle, options?: IEdgeSetStyleOptions): void;
396+
patchStyle(arg: IEdgeStyle | ((edge: IEdge<N, E>) => IEdgeStyle), options?: IEdgeSetStyleOptions) {
391397
let style: IEdgeStyle;
392398

393399
if (isFunction(arg)) {
@@ -398,7 +404,9 @@ abstract class Edge<N extends INodeBase, E extends IEdgeBase> extends Subject im
398404

399405
patchProperties(this._style, style);
400406

401-
this.notifyListeners();
407+
if (!options?.isNotifySkipped) {
408+
this.notifyListeners();
409+
}
402410
}
403411

404412
setState(state: number): void;

src/models/graph.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -551,7 +551,7 @@ export class Graph<N extends INodeBase, E extends IEdgeBase> extends Subject imp
551551
},
552552
);
553553
edge.setState(existingEdge.getState());
554-
edge.setStyle(existingEdge.getStyle());
554+
edge.setStyle(existingEdge.getStyle(), { isNotifySkipped: true });
555555
newEdges.push(edge);
556556
}
557557

@@ -628,7 +628,7 @@ export class Graph<N extends INodeBase, E extends IEdgeBase> extends Subject imp
628628

629629
const style = this._defaultStyle.getNodeStyle(newNodes[i]);
630630
if (style) {
631-
newNodes[i].setStyle(style);
631+
newNodes[i].setStyle(style, { isNotifySkipped: true });
632632
// TODO Add these checks to node property setup
633633
if (style.imageUrl) {
634634
styleImageUrls.add(style.imageUrl);
@@ -649,7 +649,7 @@ export class Graph<N extends INodeBase, E extends IEdgeBase> extends Subject imp
649649

650650
const style = this._defaultStyle.getEdgeStyle(newEdges[i]);
651651
if (style) {
652-
newEdges[i].setStyle(style);
652+
newEdges[i].setStyle(style, { isNotifySkipped: true });
653653
}
654654
}
655655
}

src/models/node.ts

+20-12
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ export interface INodeSetPositionOptions {
3333
isNotifySkipped: boolean;
3434
}
3535

36+
export interface INodeSetStyleOptions {
37+
isNotifySkipped: boolean;
38+
}
39+
3640
export enum NodeShapeType {
3741
CIRCLE = 'circle',
3842
DOT = 'dot',
@@ -117,10 +121,10 @@ export interface INode<N extends INodeBase, E extends IEdgeBase> extends ISubjec
117121
callback: (node: INode<N, E>) => INodeCoordinates | INodePosition,
118122
options?: INodeSetPositionOptions,
119123
): void;
120-
setStyle(style: INodeStyle): void;
121-
setStyle(callback: (node: INode<N, E>) => INodeStyle): void;
122-
patchStyle(style: INodeStyle): void;
123-
patchStyle(callback: (node: INode<N, E>) => INodeStyle): void;
124+
setStyle(style: INodeStyle, options?: INodeSetPositionOptions): void;
125+
setStyle(callback: (node: INode<N, E>) => INodeStyle, options?: INodeSetPositionOptions): void;
126+
patchStyle(style: INodeStyle, options?: INodeSetPositionOptions): void;
127+
patchStyle(callback: (node: INode<N, E>) => INodeStyle, options?: INodeSetPositionOptions): void;
124128
setState(state: number): void;
125129
setState(state: IGraphObjectStateParameters): void;
126130
setState(callback: (node: INode<N, E>) => number): void;
@@ -478,20 +482,22 @@ export class Node<N extends INodeBase, E extends IEdgeBase> extends Subject impl
478482
}
479483
}
480484

481-
setStyle(style: INodeStyle): void;
482-
setStyle(callback: (node: INode<N, E>) => INodeStyle): void;
483-
setStyle(arg: INodeStyle | ((node: INode<N, E>) => INodeStyle)): void {
485+
setStyle(style: INodeStyle, options?: INodeSetPositionOptions): void;
486+
setStyle(callback: (node: INode<N, E>) => INodeStyle, options?: INodeSetPositionOptions): void;
487+
setStyle(arg: INodeStyle | ((node: INode<N, E>) => INodeStyle), options?: INodeSetPositionOptions): void {
484488
if (isFunction(arg)) {
485489
this._style = (arg as (node: INode<N, E>) => INodeStyle)(this);
486490
} else {
487491
this._style = arg as INodeStyle;
488492
}
489-
this.notifyListeners();
493+
if (!options?.isNotifySkipped) {
494+
this.notifyListeners();
495+
}
490496
}
491497

492-
patchStyle(style: INodeStyle): void;
493-
patchStyle(callback: (node: INode<N, E>) => INodeStyle): void;
494-
patchStyle(arg: INodeStyle | ((node: INode<N, E>) => INodeStyle)) {
498+
patchStyle(style: INodeStyle, options?: INodeSetPositionOptions): void;
499+
patchStyle(callback: (node: INode<N, E>) => INodeStyle, options?: INodeSetPositionOptions): void;
500+
patchStyle(arg: INodeStyle | ((node: INode<N, E>) => INodeStyle), options?: INodeSetPositionOptions) {
495501
let style: INodeStyle;
496502

497503
if (isFunction(arg)) {
@@ -502,7 +508,9 @@ export class Node<N extends INodeBase, E extends IEdgeBase> extends Subject impl
502508

503509
patchProperties(this._style, style);
504510

505-
this.notifyListeners();
511+
if (!options?.isNotifySkipped) {
512+
this.notifyListeners();
513+
}
506514
}
507515

508516
setState(state: number): void;

0 commit comments

Comments
 (0)