Files
yattee/Yattee/Views/Player/Gestures/GestureSeekPreviewView.swift
Arkadiusz Fal e50817c043 Add separate glass capsule for chapter title above seek preview
Extract chapter title from inside the storyboard preview into a
standalone ChapterCapsuleView with its own glass capsule background.
The capsule follows the seek position horizontally but independently
clamps to screen edges using alignmentGuide, allowing it to be wider
than the storyboard thumbnail without going offscreen.
2026-03-28 14:00:48 +01:00

85 lines
2.2 KiB
Swift

//
// GestureSeekPreviewView.swift
// Yattee
//
// Seek preview overlay shown during drag-to-seek gesture.
//
#if os(iOS)
import SwiftUI
/// Preview overlay shown during drag-to-seek gesture.
/// Shows only the storyboard thumbnail with timestamp overlay.
struct GestureSeekPreviewView: View {
let storyboard: Storyboard?
let currentTime: TimeInterval
let seekTime: TimeInterval
let duration: TimeInterval
let storyboardService: StoryboardService
let buttonBackground: ButtonBackgroundStyle
let theme: ControlsTheme
let chapters: [VideoChapter]
let isActive: Bool
var availableWidth: CGFloat = 320
@State private var opacity: Double = 0
private var currentChapter: VideoChapter? {
chapters.last { $0.startTime <= seekTime }
}
var body: some View {
VStack(spacing: 6) {
if let chapter = currentChapter {
ChapterCapsuleView(
title: chapter.title,
buttonBackground: buttonBackground
)
.frame(maxWidth: availableWidth - 16)
}
if let storyboard {
SeekPreviewView(
storyboard: storyboard,
seekTime: seekTime,
storyboardService: storyboardService,
buttonBackground: buttonBackground,
theme: theme
)
}
}
.opacity(opacity)
.onChange(of: isActive) { _, active in
withAnimation(.easeInOut(duration: 0.2)) {
opacity = active ? 1 : 0
}
}
.onAppear {
if isActive {
withAnimation(.easeOut(duration: 0.15)) {
opacity = 1
}
}
}
}
}
#Preview {
ZStack {
Color.black
GestureSeekPreviewView(
storyboard: nil,
currentTime: 120,
seekTime: 180,
duration: 600,
storyboardService: StoryboardService(),
buttonBackground: .regularGlass,
theme: .dark,
chapters: [],
isActive: true
)
}
}
#endif