Toggle audio/video playback with spacebar
This commit is contained in:
@@ -340,6 +340,9 @@ const keyboard_event = evt => {
|
|||||||
list_navigator.next()
|
list_navigator.next()
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
|
case " ": // Spacebar pauses / unpauses video and audio playback
|
||||||
|
file_preview.toggle_playback()
|
||||||
|
break
|
||||||
case "s":
|
case "s":
|
||||||
case "S":
|
case "S":
|
||||||
if (evt.shiftKey) {
|
if (evt.shiftKey) {
|
||||||
|
@@ -48,7 +48,9 @@ export const set_file = async f => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const toggle_play = () => playing ? player.pause() : player.play()
|
export const toggle_playback = () => {
|
||||||
|
playing ? player.pause() : player.play()
|
||||||
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@@ -63,7 +65,7 @@ const toggle_play = () => playing ? player.pause() : player.play()
|
|||||||
<button on:click={() => player.currentTime -= 10 }>
|
<button on:click={() => player.currentTime -= 10 }>
|
||||||
<i class="icon">replay_10</i>
|
<i class="icon">replay_10</i>
|
||||||
</button>
|
</button>
|
||||||
<button on:click={toggle_play}>
|
<button on:click={toggle_playback}>
|
||||||
{#if playing}
|
{#if playing}
|
||||||
<i class="icon">pause</i>
|
<i class="icon">pause</i>
|
||||||
{:else}
|
{:else}
|
||||||
|
@@ -46,6 +46,12 @@ export const set_file = async file => {
|
|||||||
viewer.set_file(file)
|
viewer.set_file(file)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const toggle_playback = () => {
|
||||||
|
if (viewer && viewer.toggle_playback) {
|
||||||
|
viewer.toggle_playback()
|
||||||
|
}
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{#if viewer_type === "loading"}
|
{#if viewer_type === "loading"}
|
||||||
|
@@ -65,10 +65,10 @@ const mouseup = (e) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let container_style = ""
|
let swipe_style = ""
|
||||||
const on_load = () => {
|
const on_load = () => {
|
||||||
dispatch("loading", false)
|
dispatch("loading", false)
|
||||||
container_style = ""
|
swipe_style = ""
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@@ -79,10 +79,9 @@ const on_load = () => {
|
|||||||
class="container"
|
class="container"
|
||||||
class:zoom
|
class:zoom
|
||||||
use:swipe_nav={!zoom && is_list}
|
use:swipe_nav={!zoom && is_list}
|
||||||
on:style={e => container_style = e.detail}
|
on:style={e => swipe_style = e.detail}
|
||||||
on:prev
|
on:prev
|
||||||
on:next
|
on:next
|
||||||
style={container_style}
|
|
||||||
>
|
>
|
||||||
<!-- svelte-ignore a11y-no-noninteractive-element-interactions -->
|
<!-- svelte-ignore a11y-no-noninteractive-element-interactions -->
|
||||||
<img
|
<img
|
||||||
@@ -93,6 +92,7 @@ const on_load = () => {
|
|||||||
on:mousedown={mousedown}
|
on:mousedown={mousedown}
|
||||||
class="image"
|
class="image"
|
||||||
class:zoom
|
class:zoom
|
||||||
|
style={swipe_style}
|
||||||
src={file.get_href}
|
src={file.get_href}
|
||||||
alt={file.name} />
|
alt={file.name} />
|
||||||
</div>
|
</div>
|
||||||
|
@@ -16,13 +16,15 @@ export const swipe_nav = (node, swipe_enabled) => {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
let offset_x = e.touches[0].clientX - start_x
|
const offset_x = e.touches[0].clientX - start_x
|
||||||
let abs_x = Math.abs(offset_x)
|
const abs_x = Math.abs(offset_x)
|
||||||
let abs_y = Math.abs(e.touches[0].clientY - start_y)
|
const abs_y = Math.abs(e.touches[0].clientY - start_y)
|
||||||
let neg = offset_x < 0 ? -1 : 1
|
const neg = offset_x < 0 ? -1 : 1
|
||||||
|
|
||||||
if (abs_x > 100 && abs_y < abs_x/3) {
|
// The cursor must have moved at least 50 pixels and three times as much
|
||||||
set_offset((abs_x-100)*neg, false)
|
// on the x axis than the y axis for it to count as a swipe
|
||||||
|
if (abs_x > 50 && abs_y < abs_x/3) {
|
||||||
|
set_offset((abs_x-50)*neg, false)
|
||||||
} else {
|
} else {
|
||||||
set_offset(0, true)
|
set_offset(0, true)
|
||||||
}
|
}
|
||||||
|
@@ -47,6 +47,10 @@ export const set_file = async f => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const toggle_playback = () => {
|
||||||
|
playing ? player.pause() : player.play()
|
||||||
|
}
|
||||||
|
|
||||||
onMount(() => {
|
onMount(() => {
|
||||||
if ('mediaSession' in navigator) {
|
if ('mediaSession' in navigator) {
|
||||||
media_session = true
|
media_session = true
|
||||||
@@ -60,8 +64,6 @@ onMount(() => {
|
|||||||
|
|
||||||
const download = () => { dispatch("download", {}) }
|
const download = () => { dispatch("download", {}) }
|
||||||
|
|
||||||
const toggle_play = () => playing ? player.pause() : player.play()
|
|
||||||
|
|
||||||
const seek_relative = delta => {
|
const seek_relative = delta => {
|
||||||
if (player.fastSeek) {
|
if (player.fastSeek) {
|
||||||
player.fastSeek(player.currentTime + delta)
|
player.fastSeek(player.currentTime + delta)
|
||||||
@@ -124,7 +126,7 @@ const fullscreen = () => {
|
|||||||
<button on:click={() => seek_relative(-10)}>
|
<button on:click={() => seek_relative(-10)}>
|
||||||
<i class="icon">replay_10</i>
|
<i class="icon">replay_10</i>
|
||||||
</button>
|
</button>
|
||||||
<button on:click={toggle_play} class="button_highlight">
|
<button on:click={toggle_playback} class="button_highlight">
|
||||||
{#if playing}
|
{#if playing}
|
||||||
<i class="icon">pause</i>
|
<i class="icon">pause</i>
|
||||||
{:else}
|
{:else}
|
||||||
|
@@ -43,7 +43,7 @@ export let fs_navigator
|
|||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
}
|
}
|
||||||
.node_name {
|
.node_name {
|
||||||
max-width: 25vw;
|
max-width: 20vw;
|
||||||
overflow-x: hidden;
|
overflow-x: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
|
@@ -15,6 +15,7 @@ import Menu from './Menu.svelte';
|
|||||||
|
|
||||||
let loading = true
|
let loading = true
|
||||||
let file_viewer
|
let file_viewer
|
||||||
|
let file_preview
|
||||||
let toolbar
|
let toolbar
|
||||||
let upload_widget
|
let upload_widget
|
||||||
let download_frame
|
let download_frame
|
||||||
@@ -78,6 +79,11 @@ const keydown = e => {
|
|||||||
case "ArrowRight":
|
case "ArrowRight":
|
||||||
fs_navigator.open_sibling(1)
|
fs_navigator.open_sibling(1)
|
||||||
break;
|
break;
|
||||||
|
case " ": // Spacebar pauses / unpauses video and audio playback
|
||||||
|
if (file_preview) {
|
||||||
|
file_preview.toggle_playback()
|
||||||
|
}
|
||||||
|
break
|
||||||
default:
|
default:
|
||||||
action_performed = false
|
action_performed = false
|
||||||
}
|
}
|
||||||
@@ -143,6 +149,7 @@ const update_css = path => document.documentElement.style = branding_from_path(p
|
|||||||
<div class="file_preview">
|
<div class="file_preview">
|
||||||
{#if view === "file"}
|
{#if view === "file"}
|
||||||
<FilePreview
|
<FilePreview
|
||||||
|
bind:this={file_preview}
|
||||||
fs_navigator={fs_navigator}
|
fs_navigator={fs_navigator}
|
||||||
state={state}
|
state={state}
|
||||||
edit_window={edit_window}
|
edit_window={edit_window}
|
||||||
@@ -225,7 +232,6 @@ const update_css = path => document.documentElement.style = branding_from_path(p
|
|||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
padding: 2px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* File preview area (row 2) */
|
/* File preview area (row 2) */
|
||||||
|
@@ -25,7 +25,7 @@ const click = e => {
|
|||||||
|
|
||||||
<div class="wrapper">
|
<div class="wrapper">
|
||||||
<button bind:this={button} on:click={open} href="/user" class="button round" title="Menu">
|
<button bind:this={button} on:click={open} href="/user" class="button round" title="Menu">
|
||||||
<PixeldrainLogo style="height: 1.8em; width: 1.8em; margin: 0;"></PixeldrainLogo>
|
<PixeldrainLogo style="height: 1.8em; width: 1.8em; margin: 2px;"></PixeldrainLogo>
|
||||||
<span class="button_username">
|
<span class="button_username">
|
||||||
{window.user.username === "" ? "Pixeldrain" : window.user.username}
|
{window.user.username === "" ? "Pixeldrain" : window.user.username}
|
||||||
</span>
|
</span>
|
||||||
|
@@ -11,7 +11,9 @@ let playing = false
|
|||||||
let media_session = false
|
let media_session = false
|
||||||
let siblings = []
|
let siblings = []
|
||||||
|
|
||||||
const toggle_play = () => playing ? player.pause() : player.play()
|
export const toggle_playback = () => {
|
||||||
|
playing ? player.pause() : player.play()
|
||||||
|
}
|
||||||
|
|
||||||
export const update = async () => {
|
export const update = async () => {
|
||||||
if (media_session) {
|
if (media_session) {
|
||||||
@@ -56,7 +58,7 @@ onMount(() => {
|
|||||||
<div style="text-align: center;">
|
<div style="text-align: center;">
|
||||||
<button on:click={() => fs_navigator.open_sibling(-1) }><i class="icon">skip_previous</i></button>
|
<button on:click={() => fs_navigator.open_sibling(-1) }><i class="icon">skip_previous</i></button>
|
||||||
<button on:click={() => player.currentTime -= 10 }><i class="icon">replay_10</i></button>
|
<button on:click={() => player.currentTime -= 10 }><i class="icon">replay_10</i></button>
|
||||||
<button on:click={toggle_play}>
|
<button on:click={toggle_playback}>
|
||||||
{#if playing}
|
{#if playing}
|
||||||
<i class="icon">pause</i>
|
<i class="icon">pause</i>
|
||||||
{:else}
|
{:else}
|
||||||
|
@@ -39,6 +39,12 @@ const state_update = async (base) => {
|
|||||||
viewer.update()
|
viewer.update()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const toggle_playback = () => {
|
||||||
|
if (viewer && viewer.toggle_playback) {
|
||||||
|
viewer.toggle_playback()
|
||||||
|
}
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{#if viewer_type === ""}
|
{#if viewer_type === ""}
|
||||||
|
@@ -10,10 +10,15 @@ let container
|
|||||||
let zoom = false
|
let zoom = false
|
||||||
let x, y = 0
|
let x, y = 0
|
||||||
let dragging = false
|
let dragging = false
|
||||||
let container_style = ""
|
|
||||||
|
|
||||||
export const update = () => {
|
export const update = () => {
|
||||||
container_style = ""
|
dispatch("loading", true)
|
||||||
|
}
|
||||||
|
|
||||||
|
let swipe_style = ""
|
||||||
|
const on_load = () => {
|
||||||
|
dispatch("loading", false)
|
||||||
|
swipe_style = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
const mousedown = (e) => {
|
const mousedown = (e) => {
|
||||||
@@ -58,17 +63,20 @@ const mouseup = (e) => {
|
|||||||
class="container"
|
class="container"
|
||||||
class:zoom
|
class:zoom
|
||||||
use:swipe_nav={!zoom}
|
use:swipe_nav={!zoom}
|
||||||
on:style={e => container_style = e.detail}
|
on:style={e => swipe_style = e.detail}
|
||||||
on:prev={() => dispatch("open_sibling", -1)}
|
on:prev={() => dispatch("open_sibling", -1)}
|
||||||
on:next={() => dispatch("open_sibling", 1)}
|
on:next={() => dispatch("open_sibling", 1)}
|
||||||
style={container_style}
|
|
||||||
>
|
>
|
||||||
<!-- svelte-ignore a11y-no-noninteractive-element-interactions -->
|
<!-- svelte-ignore a11y-no-noninteractive-element-interactions -->
|
||||||
<img
|
<img
|
||||||
on:dblclick={() => {zoom = !zoom}}
|
on:dblclick={() => {zoom = !zoom}}
|
||||||
on:doubletap={() => {zoom = !zoom}}
|
on:doubletap={() => {zoom = !zoom}}
|
||||||
on:mousedown={mousedown}
|
on:mousedown={mousedown}
|
||||||
class="image" class:zoom
|
on:load={on_load}
|
||||||
|
on:error={on_load}
|
||||||
|
class="image"
|
||||||
|
class:zoom
|
||||||
|
style={swipe_style}
|
||||||
src={fs_path_url(state.base.path)}
|
src={fs_path_url(state.base.path)}
|
||||||
alt="no description available" />
|
alt="no description available" />
|
||||||
</div>
|
</div>
|
||||||
|
@@ -37,6 +37,10 @@ export const update = async () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const toggle_playback = () => {
|
||||||
|
playing ? player.pause() : player.play()
|
||||||
|
}
|
||||||
|
|
||||||
onMount(() => {
|
onMount(() => {
|
||||||
if ('mediaSession' in navigator) {
|
if ('mediaSession' in navigator) {
|
||||||
media_session = true
|
media_session = true
|
||||||
@@ -48,8 +52,6 @@ onMount(() => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
const toggle_play = () => playing ? player.pause() : player.play()
|
|
||||||
|
|
||||||
const seek_relative = delta => {
|
const seek_relative = delta => {
|
||||||
if (player.fastSeek) {
|
if (player.fastSeek) {
|
||||||
player.fastSeek(player.currentTime + delta)
|
player.fastSeek(player.currentTime + delta)
|
||||||
@@ -111,7 +113,7 @@ const fullscreen = () => {
|
|||||||
<button on:click={() => seek_relative(-10)}>
|
<button on:click={() => seek_relative(-10)}>
|
||||||
<i class="icon">replay_10</i>
|
<i class="icon">replay_10</i>
|
||||||
</button>
|
</button>
|
||||||
<button on:click={toggle_play} class="button_highlight">
|
<button on:click={toggle_playback} class="button_highlight">
|
||||||
{#if playing}
|
{#if playing}
|
||||||
<i class="icon">pause</i>
|
<i class="icon">pause</i>
|
||||||
{:else}
|
{:else}
|
||||||
|
Reference in New Issue
Block a user