Skip to content

Commit aa86c9b

Browse files
authored
Fix(Regions): fix offset caused by swapping directions when dragging and extract the side type (#4196)
* fix(Regions): fix offset caused by swapping directions when dragging * chore(Regions): extract the side type
1 parent 4b73703 commit aa86c9b

File tree

1 file changed

+24
-8
lines changed

1 file changed

+24
-8
lines changed

src/plugins/regions.ts

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@ import EventEmitter from '../event-emitter.js'
1010
import createElement from '../dom.js'
1111

1212
export type RegionsPluginOptions = undefined
13-
13+
export type UpdateSide = 'start' | 'end'
1414
export type RegionsPluginEvents = BasePluginEvents & {
1515
/** When a new region is initialized but not rendered yet */
1616
'region-initialized': [region: Region]
1717
/** When a region is created */
1818
'region-created': [region: Region]
1919
/** When a region is being updated */
20-
'region-update': [region: Region, side?: 'start' | 'end']
20+
'region-update': [region: Region, side?: UpdateSide]
2121
/** When a region is done updating */
2222
'region-updated': [region: Region]
2323
/** When a region is removed */
@@ -38,7 +38,7 @@ export type RegionEvents = {
3838
/** Before the region is removed */
3939
remove: []
4040
/** When the region's parameters are being updated */
41-
update: [side?: 'start' | 'end']
41+
update: [side?: UpdateSide]
4242
/** When dragging or resizing is finished */
4343
'update-end': []
4444
/** On play */
@@ -100,6 +100,7 @@ class SingleRegion extends EventEmitter<RegionEvents> implements Region {
100100
public channelIdx: number
101101
public contentEditable = false
102102
public subscriptions: (() => void)[] = []
103+
public updatingSide?: UpdateSide = undefined
103104
private isRemoved = false
104105

105106
constructor(
@@ -288,14 +289,24 @@ class SingleRegion extends EventEmitter<RegionEvents> implements Region {
288289
}
289290
}
290291

291-
public _onUpdate(dx: number, side?: 'start' | 'end') {
292+
public _onUpdate(dx: number, side?: UpdateSide, startTime?: number) {
292293
if (!this.element?.parentElement) return
293294
const { width } = this.element.parentElement.getBoundingClientRect()
294295
const deltaSeconds = (dx / width) * this.totalDuration
295-
const newStart = !side || side === 'start' ? this.start + deltaSeconds : this.start
296-
const newEnd = !side || side === 'end' ? this.end + deltaSeconds : this.end
296+
let newStart = !side || side === 'start' ? this.start + deltaSeconds : this.start
297+
let newEnd = !side || side === 'end' ? this.end + deltaSeconds : this.end
297298
const length = newEnd - newStart
298299

300+
if (this.updatingSide && this.updatingSide !== side && startTime !== undefined) {
301+
if (this.updatingSide === 'start') {
302+
newStart = startTime
303+
} else {
304+
newEnd = startTime
305+
}
306+
}
307+
308+
this.updatingSide = side
309+
299310
if (
300311
newStart >= 0 &&
301312
newEnd <= this.totalDuration &&
@@ -316,7 +327,7 @@ class SingleRegion extends EventEmitter<RegionEvents> implements Region {
316327
this._onUpdate(dx)
317328
}
318329

319-
private onResize(dx: number, side: 'start' | 'end') {
330+
private onResize(dx: number, side: UpdateSide) {
320331
if (!this.resize) return
321332
if (!this.resizeStart && side === 'start') return
322333
if (!this.resizeEnd && side === 'end') return
@@ -326,6 +337,7 @@ class SingleRegion extends EventEmitter<RegionEvents> implements Region {
326337
private onEndResizing() {
327338
if (!this.resize) return
328339
this.emit('update-end')
340+
this.updatingSide = undefined
329341
}
330342

331343
private onContentClick(event: MouseEvent) {
@@ -691,6 +703,7 @@ class RegionsPlugin extends BasePlugin<RegionsPluginEvents, RegionsPluginOptions
691703
const initialSize = 5
692704
let region: Region | null = null
693705
let startX = 0
706+
let startTime = 0
694707

695708
return makeDraggable(
696709
wrapper,
@@ -700,7 +713,7 @@ class RegionsPlugin extends BasePlugin<RegionsPluginEvents, RegionsPluginOptions
700713
if (region) {
701714
// Update the end position of the region
702715
// If we're dragging to the left, we need to update the start instead
703-
region._onUpdate(dx, x > startX ? 'end' : 'start')
716+
region._onUpdate(dx, x > startX ? 'end' : 'start', startTime)
704717
}
705718
},
706719

@@ -711,6 +724,8 @@ class RegionsPlugin extends BasePlugin<RegionsPluginEvents, RegionsPluginOptions
711724
const duration = this.wavesurfer.getDuration()
712725
const numberOfChannels = this.wavesurfer?.getDecodedData()?.numberOfChannels
713726
const { width } = this.wavesurfer.getWrapper().getBoundingClientRect()
727+
startTime = (startX / width) * duration
728+
714729
// Calculate the start time of the region
715730
const start = (x / width) * duration
716731
// Give the region a small initial size
@@ -739,6 +754,7 @@ class RegionsPlugin extends BasePlugin<RegionsPluginEvents, RegionsPluginOptions
739754
() => {
740755
if (region) {
741756
this.saveRegion(region)
757+
region.updatingSide = undefined
742758
region = null
743759
}
744760
},

0 commit comments

Comments
 (0)