understanding_rl_vision/rl_clarity/svelte/scrubber.svelte (57 lines of code) (raw):
<script>
export let state;
export let visible_duration;
export let max_duration;
const clip_position = function(position) {
return Math.max(0, Math.min(max_duration - 1, position));
};
let drag_div;
let drag_position = null;
const drag_start = function(event) {
if (event.buttons === undefined ? event.which === 1 : event.buttons === 1) {
state.velocity_direction = 0;
let delta = (event.pageX / drag_div.scrollWidth) * visible_duration;
drag_position = state.position + delta;
event.preventDefault();
}
};
const drag_update = function(event) {
if (drag_position !== null) {
let delta = (event.pageX / drag_div.scrollWidth) * visible_duration;
state.position = Math.round(clip_position(drag_position - delta));
}
};
const drag_end = function() {
drag_position = null;
};
</script>
<style>
.scrubber {
height: 100%;
width: 100%;
}
.indicator {
height: 100%;
width: 2px;
margin: 0 auto;
border-width: 0px 6px;
border-color: black;
border-style: solid;
opacity: 0.4;
}
</style>
<svelte:window on:mousemove={drag_update} on:mouseup={drag_end}/>
<div
bind:this={drag_div}
class="scrubber"
style="cursor: {drag_position === null ? 'grab' : 'grabbing'}"
on:mousedown={drag_start}
>
<div
style="z-index: -1;
position: absolute;
height: 100%;
width: 100%;"
></div>
<div class="indicator"></div>
</div>