diff --git a/frontend/src/App.svelte b/frontend/src/App.svelte index 6138472..fdd918d 100644 --- a/frontend/src/App.svelte +++ b/frontend/src/App.svelte @@ -7,7 +7,7 @@ import History from './components/History.svelte' import Setup from './components/Setup.svelte' import { EventsOn, EventsOff, WindowSetSize, ScreenGetAll } from '../wailsjs/runtime/runtime' - import { GetParticipants, StartMeeting, GetSettings, SkipSpeaker, RemoveFromQueue } from '../wailsjs/go/app/App' + import { GetParticipants, StartMeeting, GetSettings, SkipSpeaker, RemoveFromQueue, SwitchToSpeaker } from '../wailsjs/go/app/App' import { t, initLocale } from './lib/i18n' let currentView = 'main' @@ -192,16 +192,30 @@ currentView = 'main' } - function handleSettingsLoaded(s) { - settings = s + function handleSettingsLoaded(event) { + settings = event.detail } async function handleSkipFromList(event) { const { speakerId } = event.detail try { - await RemoveFromQueue(speakerId) + // If this is the current speaker, use SkipSpeaker, otherwise RemoveFromQueue + if (timerState?.currentSpeakerId === speakerId) { + await SkipSpeaker() + } else { + await RemoveFromQueue(speakerId) + } } catch (e) { - console.error('Failed to remove speaker from queue:', e) + console.error('Failed to skip speaker:', e) + } + } + + async function handleSwitchSpeaker(event) { + const { speakerId } = event.detail + try { + await SwitchToSpeaker(speakerId) + } catch (e) { + console.error('Failed to switch to speaker:', e) } } @@ -266,12 +280,12 @@ -
+
{#if currentView === 'main'} {#if meetingActive && timerState}
- + meetingActive = false} />
{:else if participants.length > 0} @@ -333,6 +347,11 @@ } .nav { + position: fixed; + top: 32px; + left: 0; + right: 0; + z-index: 100; display: flex; gap: 4px; padding: 8px 12px; @@ -373,10 +392,17 @@ } .content { - flex: 1; - overflow: auto; + position: fixed; + top: 84px; /* 32px titlebar + 52px nav height */ + bottom: 0; + left: 0; + right: 0; + overflow-y: auto; padding: 12px; - padding-bottom: 64px; + } + + .content.no-nav { + top: 32px; /* Only titlebar when nav is hidden */ } .timer-view { diff --git a/frontend/src/components/Controls.svelte b/frontend/src/components/Controls.svelte index 3fe0787..4df7850 100644 --- a/frontend/src/components/Controls.svelte +++ b/frontend/src/components/Controls.svelte @@ -30,8 +30,33 @@ await StopMeeting() dispatch('stop') } + + function handleKeydown(e) { + // ⌘N - Next speaker + if (e.metaKey && e.key.toLowerCase() === 'n') { + e.preventDefault() + handleNext() + } + // ⌘S - Skip speaker + if (e.metaKey && e.key.toLowerCase() === 's') { + e.preventDefault() + handleSkip() + } + // Space - Pause/Resume + if (e.code === 'Space' && !e.metaKey && !e.ctrlKey && !e.altKey) { + e.preventDefault() + handlePauseResume() + } + // ⌘Q - Stop meeting + if (e.metaKey && e.key.toLowerCase() === 'q') { + e.preventDefault() + handleStop() + } + } + +