feat(extension):【dynamic-group】isRestrict分组缩放限制+transformWidthContainer控制子元素是否需要同时缩放 #1887
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
related
以及
前言
本次提交是
feature
,主要复用目前存在的isRestrict
和transformWithContainer
属性,实现分组缩放限制以及控制子元素是否需要同时缩放的功能提交内容概述
提交列表
提交具体说明
feat:仿造moveRules,增加resizeRules规则进行节点resize限制
在原来LogicFlow代码逻辑中,有
moveRules
可以进行移动相关的限制判断,如果不满足条件,则不允许进行移动而分组缩放限制本质也是一种
resize
限制相关的需求,因此仿造moveRules,增加resizeRules规则进行节点resize限制由于
resize
涉及到rotate
相关的变化,可能会导致x
、y
、width
、height
多种属性变化,因此resize
相关逻辑不能像下面isAllowMoveNode()
还可以允许x
不被允许,y
可以被允许移动的情况,它更多是一种整体的变化,比如某一个属性x
不被允许resize
,那么x
、y
、width
、height
就应该就不被允许resize
因此在仿造moveRules的基础上进行方法的精简,去除
typeof r === 'object'
的相关判断feat:完善transformWidthContainer参数控制子元素是否需要同时缩放的逻辑
在原来LogicFlow代码逻辑中,就有
transformWithContainer
变量以及对应的注释但是初始化的时候,没有进行
transformWithContainer
的处理,在我的理解中,transformWithContainer
应该是跟isRestrict
同样的控制属性,因此使用同样的逻辑,从data.properties
中获取,然后赋值给this.transfromWithContainer
的模式然后根据注释进行
node:rotate
和node:resize
的阻止feat:isRestrict模式下增加resize限制逻辑-根据内容占地位置来限制缩小范围
在原来的isRestrict模式中,会限制子节点移动不能超过当前Node,在这个基础上,为isRestrict模式下增加resize限制逻辑:根据内容占地位置来限制缩小范围,也就是说:
当一个group处于isRestrict模式下时,它的子节点移动不能脱离group的范围,而group的resize操作也不能小于子节点的占地面积,如下面视频所示
resize_1.mp4
而增加的逻辑也非常简单,基本是仿造moveRules进行逻辑构建,如下面代码所示,触发
checkGroupBoundsWithChildren()
进行resize
的判断在
resize()
中,如果我们返回了isAllowResize=false
,那么我们就阻止执行this.move()
、this.width
、this.height
的更新,直接返回旧的getData()
当然我们也要同时阻止下当前node的children的相关resize逻辑,也就是
而检测group:resize后的bounds是否会小于children的bounds的逻辑也非常简单
BaseNodeModel.ts
的resize()
中的this.move(deltaX / 2, deltaY / 2)
进行x
和y
的更新x
、y
、width
、height
进行当前model新的bounds的计算,我们就可以得到parent:resize后的boundstransformWithContainer和isRestrict冲突问题
目前
group:resize
->children:resize
的模式是通过emit事件的形式,也就是group:resize
已经成功了,然后通知children:resize
当我们处于isRestrict模式时,我们需要限制
group:resize
完成后的bounds
小于children:resize
完成后的bounds
,因此整个逻辑就会变成我们需要根据child:resize完成后的bounds
来递归判断parent能否resize,我们得先完成child:resize
->判断group:resize
能否执行这其实跟目前的【
group:resize
已经成功了,然后通知children:resize
】是冲突的,考虑实现的复杂性以及对应本质是基于1.x的Group提出的问题,1.x的Group就是没有联动效果的,也就是在 group 缩放时,组内的所有子节点不会进行对应的缩放计算
因此在此次pr中,当处于
isRestrict
模式时,直接阻止transformWithContainer
的生效,也就是docs:增加isRestrict新的限制说明+transformWithContainer的说明
增加
dynamic-group.en.md
和dynamic-group.zh.md
相关的文档说明,比如下面在properties
增加transformWithContainer
的声明