mirror of
https://github.com/yattee/yattee.git
synced 2026-04-09 17:16:57 +00:00
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.
85 lines
2.2 KiB
Swift
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
|