understanding_rl_vision/rl_clarity/svelte/navigator.svelte (98 lines of code) (raw):
<script>
export let state;
export let speed = 25;
export let width;
export let max_duration;
export let max_speed = 100;
export let last_direction = 1;
export let loop = false;
const clip_position = function(position) {
if (loop) {
position = (position + max_duration + 0.5) % max_duration - 0.5;
}
return Math.max(0, Math.min(max_duration - 1, position));
};
/* const clip_speed = function(speed) {
* return Math.max(0, Math.min(max_speed, speed));
* }; */
const update_position = function() {
let speed_safe = speed;
if (typeof(speed_safe) !== "number") {
speed_safe = 0;
}
let delta = state.velocity_direction * Math.sign(speed_safe);
state.position = Math.round(clip_position(state.position + delta));
let seconds = 1;
if (speed_safe !== 0) {
seconds = 1 / Math.abs(speed_safe);
}
window.setTimeout(update_position, 1000 * seconds);
};
update_position();
const handle_keydown = function(event) {
if (event.keyCode === 37 || event.keyCode === 39) {
let delta = event.keyCode === 37 ? -1 : 1;
if (state.velocity_direction === 0) {
state.position = clip_position(state.position + delta);
}
else {
state.velocity_direction = delta;
}
last_direction = delta;
event.preventDefault();
}
/* else if (event.keyCode === 38 || event.keyCode === 40) {
* speed = clip_speed(speed + (event.keyCode == 38 ? 1 : -1));
* event.preventDefault();
* } */
else if (event.keyCode === 32) {
if (state.velocity_direction === 0) {
state.velocity_direction = last_direction;
}
else {
state.velocity_direction = 0;
}
event.preventDefault();
}
};
</script>
<style>
.container {
display: inline-block;
position: absolute;
padding: 0em 0.25em;
}
button {
cursor: pointer;
}
</style>
<svelte:window on:keydown={handle_keydown}/>
<div style="position: relative;
width: {width};
margin: 0.5em auto;
padding: 0.25em 0em;
border: 1px solid gray;"
><!-- tabindex="0" -->
<div class="container" style="left: 0%; text-align: left; z-index: 1;">
<button
on:click={() => {state.velocity_direction = 0; state.position = clip_position(state.position - 1); last_direction = -1;}}
>←</button>
<button
on:click={() => {state.velocity_direction = 0; state.position = clip_position(state.position + 1); last_direction = 1;}}
>→</button>
</div>
<div class="container" style="left: 0%; right: 0%; text-align: center; z-index: 0;">
<button on:click={() => state.position = 0}>❚◀</button>
<button on:click={() => {state.velocity_direction = state.velocity_direction === -1 ? 0 : -1; last_direction = state.velocity_direction;}}>
{#if state.velocity_direction === -1}❚❚{:else}◀{/if}
</button>
<button on:click={() => {state.velocity_direction = state.velocity_direction === 1 ? 0 : 1; last_direction = state.velocity_direction;}}>
{#if state.velocity_direction === 1}❚❚{:else}►{/if}
</button>
<button on:click={() => state.position = max_duration - 1}>►❚</button>
</div>
<div class="container" style="right: 0%; text-align: right; z-index: 1;">
<input bind:value={speed} type="number" min="0" max="{max_speed}"> fps
</div>
<div style="visibility: hidden;"><button> </button></div>
</div>