Skip to content

Commit 5e77901

Browse files
tayeinteractjs-ci
authored andcommitted
fix(modifiers): allow toggling aspectRatio modifier during interaction
Close taye#984 taye#879
1 parent 9c280e4 commit 5e77901

File tree

3 files changed

+52
-21
lines changed

3 files changed

+52
-21
lines changed

packages/@interactjs/modifiers/Modification.ts

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,20 +31,28 @@ export default class Modification {
3131
startDelta!: Point
3232
result!: ModificationResult
3333
endResult!: Point
34-
edges!: EdgeOptions
34+
startEdges!: EdgeOptions
35+
edges: EdgeOptions
3536
readonly interaction: Readonly<Interaction>
3637

3738
constructor (interaction: Interaction) {
3839
this.interaction = interaction
3940
this.result = createResult()
41+
this.edges = {
42+
left: false,
43+
right: false,
44+
top: false,
45+
bottom: false,
46+
}
4047
}
4148

4249
start ({ phase }: { phase: EventPhase }, pageCoords: Point) {
4350
const { interaction } = this
4451
const modifierList = getModifierList(interaction)
4552
this.prepareStates(modifierList)
4653

47-
this.edges = extend({}, interaction.edges)
54+
this.startEdges = extend({}, interaction.edges)
55+
this.edges = extend({}, this.startEdges)
4856
this.startOffset = getRectOffset(interaction.rect, pageCoords)
4957
this.startDelta = { x: 0, y: 0 }
5058

@@ -68,8 +76,8 @@ export default class Modification {
6876
arg.interaction = interaction
6977
arg.interactable = interaction.interactable
7078
arg.element = interaction.element
71-
arg.rect = arg.rect || interaction.rect
72-
arg.edges = this.edges
79+
arg.rect ||= interaction.rect
80+
arg.edges ||= this.startEdges
7381
arg.startOffset = this.startOffset
7482

7583
return arg as ModifierArg
@@ -85,10 +93,11 @@ export default class Modification {
8593
}
8694

8795
setAll (arg: MethodArg & Partial<ModifierArg>): ModificationResult {
88-
const { phase, preEnd, skipModifiers, rect: unmodifiedRect } = arg
96+
const { phase, preEnd, skipModifiers, rect: unmodifiedRect, edges: unmodifiedEdges } = arg
8997

9098
arg.coords = extend({}, arg.pageCoords)
9199
arg.rect = extend({}, unmodifiedRect)
100+
arg.edges = extend({}, unmodifiedEdges)
92101

93102
const states = skipModifiers ? this.states.slice(skipModifiers) : this.states
94103

@@ -103,7 +112,7 @@ export default class Modification {
103112
arg.state = state
104113
returnValue = state.methods.set(arg as ModifierArg<never>)
105114

106-
rectUtils.addEdges(this.interaction.edges, arg.rect, {
115+
rectUtils.addEdges(arg.edges, arg.rect, {
107116
x: arg.coords.x - lastModifierCoords.x,
108117
y: arg.coords.y - lastModifierCoords.y,
109118
})
@@ -112,6 +121,8 @@ export default class Modification {
112121
newResult.eventProps.push(returnValue)
113122
}
114123

124+
extend(this.edges, arg.edges)
125+
115126
newResult.delta.x = arg.coords.x - arg.pageCoords.x
116127
newResult.delta.y = arg.coords.y - arg.pageCoords.y
117128

@@ -341,6 +352,7 @@ export default class Modification {
341352
copyFrom (other: Modification) {
342353
this.startOffset = other.startOffset
343354
this.startDelta = other.startDelta
355+
this.startEdges = other.startEdges
344356
this.edges = other.edges
345357
this.states = other.states.map((s) => clone(s) as ModifierState)
346358
this.result = createResult(extend({}, other.result.coords), extend({}, other.result.rect))

packages/@interactjs/modifiers/aspectRatio.ts

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ AspectRatioOptions,
5050

5151
const aspectRatio: ModifierModule<AspectRatioOptions, AspectRatioState> = {
5252
start (arg) {
53-
const { state, rect, edges: originalEdges, pageCoords: coords } = arg
54-
let { ratio } = state.options
53+
const { state, rect, edges, pageCoords: coords } = arg
54+
let { ratio, enabled } = state.options
5555
const { equalDelta, modifiers } = state.options
5656

5757
if (ratio === 'preserve') {
@@ -64,13 +64,13 @@ const aspectRatio: ModifierModule<AspectRatioOptions, AspectRatioState> = {
6464
state.equalDelta = equalDelta
6565

6666
const linkedEdges = (state.linkedEdges = {
67-
top: originalEdges.top || (originalEdges.left && !originalEdges.bottom),
68-
left: originalEdges.left || (originalEdges.top && !originalEdges.right),
69-
bottom: originalEdges.bottom || (originalEdges.right && !originalEdges.top),
70-
right: originalEdges.right || (originalEdges.bottom && !originalEdges.left),
67+
top: edges.top || (edges.left && !edges.bottom),
68+
left: edges.left || (edges.top && !edges.right),
69+
bottom: edges.bottom || (edges.right && !edges.top),
70+
right: edges.right || (edges.bottom && !edges.left),
7171
})
7272

73-
state.xIsPrimaryAxis = !!(originalEdges.left || originalEdges.right)
73+
state.xIsPrimaryAxis = !!(edges.left || edges.right)
7474

7575
if (state.equalDelta) {
7676
const sign = (linkedEdges.left ? 1 : -1) * (linkedEdges.top ? 1 : -1)
@@ -85,9 +85,11 @@ const aspectRatio: ModifierModule<AspectRatioOptions, AspectRatioState> = {
8585
}
8686
}
8787

88-
extend(arg.edges, linkedEdges)
88+
if (enabled !== false) {
89+
extend(edges, linkedEdges)
90+
}
8991

90-
if (!modifiers || !modifiers.length) return
92+
if (!modifiers?.length) return
9193

9294
const subModification = new Modification(arg.interaction)
9395

@@ -100,9 +102,11 @@ const aspectRatio: ModifierModule<AspectRatioOptions, AspectRatioState> = {
100102

101103
set (arg) {
102104
const { state, rect, coords } = arg
105+
const { linkedEdges } = state
103106
const initialCoords = extend({}, coords)
104107
const aspectMethod = state.equalDelta ? setEqualDelta : setRatio
105108

109+
extend(arg.edges, linkedEdges)
106110
aspectMethod(state, state.xIsPrimaryAxis, coords, rect)
107111

108112
if (!state.subModification) {
@@ -111,15 +115,15 @@ const aspectRatio: ModifierModule<AspectRatioOptions, AspectRatioState> = {
111115

112116
const correctedRect = extend({}, rect)
113117

114-
addEdges(state.linkedEdges, correctedRect, {
118+
addEdges(linkedEdges, correctedRect, {
115119
x: coords.x - initialCoords.x,
116120
y: coords.y - initialCoords.y,
117121
})
118122

119123
const result = state.subModification.setAll({
120124
...arg,
121125
rect: correctedRect,
122-
edges: state.linkedEdges,
126+
edges: linkedEdges,
123127
pageCoords: coords,
124128
prevCoords: coords,
125129
prevRect: correctedRect,

packages/@interactjs/modifiers/base.ts

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,16 +104,31 @@ const modifiersBase: Plugin = {
104104
},
105105

106106
'interactions:before-action-start': (arg) => {
107+
const { interaction } = arg
107108
const modification = arg.interaction.modification!
108109

109-
modification.start(arg, arg.interaction.coords.start.page)
110-
arg.interaction.edges = modification.edges
110+
modification.start(arg, interaction.coords.start.page)
111+
interaction.edges = modification.edges
111112
modification.applyToInteraction(arg)
112113
},
113114

114-
'interactions:before-action-move': (arg) => arg.interaction.modification.setAndApply(arg),
115+
'interactions:before-action-move': (arg) => {
116+
const { interaction } = arg
117+
const { modification } = interaction
118+
const ret = modification.setAndApply(arg)
119+
interaction.edges = modification.edges
115120

116-
'interactions:before-action-end': (arg) => arg.interaction.modification.beforeEnd(arg),
121+
return ret
122+
},
123+
124+
'interactions:before-action-end': (arg) => {
125+
const { interaction } = arg
126+
const { modification } = interaction
127+
const ret = modification.beforeEnd(arg)
128+
interaction.edges = modification.startEdges
129+
130+
return ret
131+
},
117132

118133
'interactions:action-start': addEventModifiers,
119134
'interactions:action-move': addEventModifiers,

0 commit comments

Comments
 (0)