@@ -10,14 +10,14 @@ import EventEmitter from '../event-emitter.js'
1010import createElement from '../dom.js'
1111
1212export type RegionsPluginOptions = undefined
13-
13+ export type UpdateSide = 'start' | 'end'
1414export 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