@@ -11,21 +11,36 @@ import {
1111 toViewBoxPoint ,
1212 Transforms
1313} from '@plait/core' ;
14- import { MindElement , PlaitMind } from '../interfaces' ;
14+ import { MindElement } from '../interfaces' ;
1515import { findNewChildNodePath , insertMindElement , isHitMindElement } from '../utils' ;
1616import { PlaitCommonElementRef } from '@plait/common' ;
17- import { canHandleNodeMore , getCollapseAndAddCenterPoint , NodeMoreGenerator } from '../generators/node-more.generator' ;
17+ import { canHandleNodeMore , getNodeMoreKeyPosition , NodeMoreGenerator } from '../generators/node-more.generator' ;
1818import { NODE_MORE_ICON_DIAMETER } from '../constants/default' ;
1919import { PlaitMindBoard } from './with-mind.board' ;
2020
2121export interface NodeMoreRef {
2222 target : MindElement ;
2323 isHovered : boolean ;
24+ isHoveredAwarenessRectangle : boolean ;
2425 isHoveredCollapseArea : boolean ;
2526 isHoveredExpandArea : boolean ;
2627 isHoveredAddArea : boolean ;
2728}
2829
30+ export const isSameNodeMoreRef = ( ref1 : NodeMoreRef | null , ref2 : NodeMoreRef | null ) => {
31+ if ( ! ref1 || ! ref2 ) {
32+ return false ;
33+ }
34+ const result =
35+ ref1 . target === ref2 . target &&
36+ ref1 . isHovered === ref2 . isHovered &&
37+ ref1 . isHoveredAwarenessRectangle === ref2 . isHoveredAwarenessRectangle &&
38+ ref1 . isHoveredCollapseArea === ref2 . isHoveredCollapseArea &&
39+ ref1 . isHoveredExpandArea === ref2 . isHoveredExpandArea &&
40+ ref1 . isHoveredAddArea === ref2 . isHoveredAddArea ;
41+ return result ;
42+ } ;
43+
2944export const withNodeMore = ( board : PlaitBoard ) => {
3045 const { pointerMove, pointerLeave, pointerUp } = board ;
3146 let nodeMoreRef : NodeMoreRef | null = null ;
@@ -38,32 +53,27 @@ export const withNodeMore = (board: PlaitBoard) => {
3853 nodeMoreRef = null ;
3954 }
4055 const newNodeMoreRef = getNodeMoreRef ( board , event . x , event . y ) ;
41-
42- if ( nodeMoreRef && newNodeMoreRef && nodeMoreRef . target === newNodeMoreRef . target ) {
56+ if ( nodeMoreRef && newNodeMoreRef && isSameNodeMoreRef ( nodeMoreRef , newNodeMoreRef ) ) {
4357 return ;
4458 }
45-
46- if ( nodeMoreRef ) {
59+ if ( nodeMoreRef && ( ! newNodeMoreRef || newNodeMoreRef . target !== nodeMoreRef . target ) ) {
4760 const element = getElementById < MindElement > ( board , nodeMoreRef . target . id ) ;
4861 // maybe element has been changed
4962 if ( element && element === nodeMoreRef . target ) {
5063 toggleHoveredNodeCallback ( {
5164 target : nodeMoreRef . target ,
5265 isHovered : false ,
66+ isHoveredAwarenessRectangle : false ,
5367 isHoveredCollapseArea : false ,
5468 isHoveredExpandArea : false ,
5569 isHoveredAddArea : false
5670 } ) ;
5771 }
5872 }
5973 if ( newNodeMoreRef ) {
60- toggleHoveredNodeCallback ( newNodeMoreRef ) ;
61- if ( nodeMoreRef ) {
62- nodeMoreRef . target = newNodeMoreRef . target ;
63- } else {
64- nodeMoreRef = newNodeMoreRef ;
65- }
66- } else {
74+ toggleHoveredNodeCallback ( newNodeMoreRef , nodeMoreRef ) ;
75+ nodeMoreRef = newNodeMoreRef ;
76+ } else if ( nodeMoreRef ) {
6777 nodeMoreRef = null ;
6878 }
6979 } ) ;
@@ -98,19 +108,22 @@ export const withNodeMore = (board: PlaitBoard) => {
98108 pointerUp ( event ) ;
99109 } ;
100110
101- const toggleHoveredNodeCallback = ( ref : NodeMoreRef ) => {
111+ const toggleHoveredNodeCallback = ( ref : NodeMoreRef , oldRef ?: NodeMoreRef | null ) => {
102112 const elementRef = PlaitElement . getElementRef < PlaitCommonElementRef > ( ref . target ) ;
103113 const nodeMoreGenerator = elementRef ?. getGenerator < NodeMoreGenerator > ( NodeMoreGenerator . key ) ;
104114 if ( nodeMoreGenerator ) {
115+ const isSameTarget = oldRef ?. target === ref . target ;
105116 const g = PlaitElement . getElementG ( ref . target ) ;
106117 nodeMoreGenerator . processDrawing ( ref . target , g , {
107118 isHovered : ref . isHovered ,
119+ isHoveredAwarenessRectangle : ref . isHoveredAwarenessRectangle ,
108120 isHoveredCollapseArea : ref . isHoveredCollapseArea ,
109121 isHoveredExpandArea : ref . isHoveredExpandArea ,
110- isSelected : isSelectedElement ( board , ref . target ) ,
111122 isHoveredAddArea : ref . isHoveredAddArea ,
112- isShowCollapseAnimation : ( ref . isHovered || ref . isHoveredCollapseArea ) && ! isSelectedElement ( board , ref . target ) ,
113- isShowAddAnimation : ( ref . isHovered || ref . isHoveredAddArea ) && ! isSelectedElement ( board , ref . target )
123+ isSelected : isSelectedElement ( board , ref . target ) ,
124+ isShowCollapseAnimation :
125+ ( ref . isHovered || ref . isHoveredCollapseArea ) && ! isSelectedElement ( board , ref . target ) && ! isSameTarget ,
126+ isShowAddAnimation : ( ref . isHovered || ref . isHoveredAddArea ) && ! isSelectedElement ( board , ref . target ) && ! isSameTarget
114127 } ) ;
115128 }
116129 } ;
@@ -120,6 +133,7 @@ export const withNodeMore = (board: PlaitBoard) => {
120133 toggleHoveredNodeCallback ( {
121134 target : nodeMoreRef . target ,
122135 isHovered : false ,
136+ isHoveredAwarenessRectangle : false ,
123137 isHoveredCollapseArea : false ,
124138 isHoveredExpandArea : false ,
125139 isHoveredAddArea : false
@@ -135,6 +149,7 @@ export const withNodeMore = (board: PlaitBoard) => {
135149const getNodeMoreRef = ( board : PlaitBoard , x : number , y : number ) => {
136150 let target : MindElement | null = null ;
137151 let isHovered = false ;
152+ let isHoveredAwarenessRectangle = false ;
138153 let isHoveredCollapseArea = false ;
139154 let isHoveredExpandArea = false ;
140155 let isHoveredAddArea = false ;
@@ -148,29 +163,43 @@ const getNodeMoreRef = (board: PlaitBoard, x: number, y: number) => {
148163 if ( ! MindElement . isMindElement ( board , element ) ) {
149164 return ;
150165 }
151- const isMind = PlaitMind . isMind ( element ) ;
152166 const isHitElement = isHitMindElement ( board , point , element ) ;
153- let isHitCollapseOrExpand = false ;
154- let isHitAdd = false ;
155- const { collapseCenter, addCenter } = getCollapseAndAddCenterPoint ( board , element ) ;
156- const collapseOrExpandIconRectangle =
157- ! isMind && RectangleClient . getRectangleByCenterPoint ( collapseCenter , NODE_MORE_ICON_DIAMETER , NODE_MORE_ICON_DIAMETER ) ;
158- isHitCollapseOrExpand =
159- collapseOrExpandIconRectangle &&
160- RectangleClient . isHit ( RectangleClient . getRectangleByPoints ( [ point , point ] ) , collapseOrExpandIconRectangle ) ;
161- const addIconRectangle = RectangleClient . getRectangleByCenterPoint ( addCenter , NODE_MORE_ICON_DIAMETER , NODE_MORE_ICON_DIAMETER ) ;
162- isHitAdd = RectangleClient . isHit ( RectangleClient . getRectangleByPoints ( [ point , point ] ) , addIconRectangle ) ;
163- if ( isHitElement || isHitCollapseOrExpand || isHitAdd ) {
167+ const {
168+ hasCollapsedIcon,
169+ hasExpandedIcon,
170+ hasAddIcon,
171+ collapsedIconCenter,
172+ expandedIconCenter,
173+ addCenter,
174+ awarenessRectangle
175+ } = getNodeMoreKeyPosition ( board , element ) ;
176+ const isHitAwarenessRectangle =
177+ awarenessRectangle && RectangleClient . isHit ( RectangleClient . getRectangleByPoints ( [ point , point ] ) , awarenessRectangle ) ;
178+ const isHitCollapsedIcon =
179+ hasCollapsedIcon &&
180+ RectangleClient . isHit (
181+ RectangleClient . getRectangleByPoints ( [ point , point ] ) ,
182+ RectangleClient . getRectangleByCenterPoint ( collapsedIconCenter ! , NODE_MORE_ICON_DIAMETER , NODE_MORE_ICON_DIAMETER )
183+ ) ;
184+ const isHitExpandedIcon =
185+ hasExpandedIcon &&
186+ RectangleClient . isHit (
187+ RectangleClient . getRectangleByPoints ( [ point , point ] ) ,
188+ RectangleClient . getRectangleByCenterPoint ( expandedIconCenter ! , NODE_MORE_ICON_DIAMETER , NODE_MORE_ICON_DIAMETER )
189+ ) ;
190+ const isHitAddIcon =
191+ hasAddIcon &&
192+ RectangleClient . isHit (
193+ RectangleClient . getRectangleByPoints ( [ point , point ] ) ,
194+ RectangleClient . getRectangleByCenterPoint ( addCenter ! , NODE_MORE_ICON_DIAMETER , NODE_MORE_ICON_DIAMETER )
195+ ) ;
196+ if ( isHitElement || isHitAwarenessRectangle ) {
164197 isHovered = isHitElement ;
165- if ( element . children . length > 0 ) {
166- if ( element . isCollapsed ) {
167- isHoveredExpandArea = isHitCollapseOrExpand ;
168- } else {
169- isHoveredCollapseArea = isHitCollapseOrExpand ;
170- }
171- }
172- isHoveredAddArea = isHitAdd ;
198+ isHoveredAwarenessRectangle = ! ! isHitAwarenessRectangle ;
173199 target = element ;
200+ isHoveredCollapseArea = isHitCollapsedIcon ;
201+ isHoveredExpandArea = ! ! isHitExpandedIcon ;
202+ isHoveredAddArea = isHitAddIcon ;
174203 }
175204 } ,
176205 getIsRecursionFunc ( board ) ,
@@ -182,6 +211,7 @@ const getNodeMoreRef = (board: PlaitBoard, x: number, y: number) => {
182211 return {
183212 target,
184213 isHovered,
214+ isHoveredAwarenessRectangle,
185215 isHoveredCollapseArea,
186216 isHoveredExpandArea,
187217 isHoveredAddArea
0 commit comments