mirror of
https://github.com/yattee/yattee.git
synced 2026-10-30 08:27:17 +00:00
Add per-page element customization and panel settings polish
Phase 5 of the player panels redesign: - Per-page element toggles now rendered and editable for every page: comments (author avatars), related (thumbnails), chapters (thumbnails), queue (previously played section), tracks (video/audio/subtitles/speed sections) - Page bar labels toggle (icons-only bar shows the selected page's name) - Layout mode schematic diagram in the details panel settings - NEW badge machinery for future page types (versionAdded on PanelPageType) - Typed per-page settings accessors on PanelPageConfiguration and VM update helpers for each page kind - Unit tests for per-page settings round-trip and accessor fallbacks The standalone quality selector sheet is unaffected: section gating defaults to everything visible and only the embedded tracks page passes preset settings through.
This commit is contained in:
@@ -15,6 +15,7 @@ struct CommentView: View {
|
||||
let videoID: String?
|
||||
let source: ContentSource?
|
||||
let isReply: Bool
|
||||
let showAvatar: Bool
|
||||
|
||||
@State private var replies: [Comment] = []
|
||||
@State private var isLoadingReplies = false
|
||||
@@ -26,18 +27,21 @@ struct CommentView: View {
|
||||
private var navigationCoordinator: NavigationCoordinator? { appEnvironment?.navigationCoordinator }
|
||||
private var accentColor: Color { appEnvironment?.settingsManager.resolvedAccentColor ?? .accentColor }
|
||||
|
||||
init(comment: Comment, videoID: String? = nil, source: ContentSource? = nil, isReply: Bool = false) {
|
||||
init(comment: Comment, videoID: String? = nil, source: ContentSource? = nil, isReply: Bool = false, showAvatar: Bool = true) {
|
||||
self.comment = comment
|
||||
self.videoID = videoID
|
||||
self.source = source
|
||||
self.isReply = isReply
|
||||
self.showAvatar = showAvatar
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
VStack(alignment: .leading, spacing: 0) {
|
||||
HStack(alignment: .top, spacing: 12) {
|
||||
// Author avatar
|
||||
authorAvatar
|
||||
if showAvatar {
|
||||
authorAvatar
|
||||
}
|
||||
|
||||
VStack(alignment: .leading, spacing: 4) {
|
||||
// Author name and badges
|
||||
@@ -224,7 +228,7 @@ struct CommentView: View {
|
||||
if showReplies {
|
||||
VStack(alignment: .leading, spacing: 0) {
|
||||
ForEach(replies) { reply in
|
||||
CommentView(comment: reply, source: source, isReply: true)
|
||||
CommentView(comment: reply, source: source, isReply: true, showAvatar: showAvatar)
|
||||
.padding(.leading, 44)
|
||||
|
||||
if reply.id != replies.last?.id {
|
||||
|
||||
@@ -255,6 +255,7 @@ struct CommentsListContent: View {
|
||||
@Environment(\.appEnvironment) private var appEnvironment
|
||||
|
||||
let videoID: String
|
||||
var showAvatars: Bool = true
|
||||
|
||||
private var playerState: PlayerState? { appEnvironment?.playerService.state }
|
||||
private var contentService: ContentService? { appEnvironment?.contentService }
|
||||
@@ -318,7 +319,7 @@ struct CommentsListContent: View {
|
||||
} else {
|
||||
LazyVStack(alignment: .leading, spacing: 0) {
|
||||
ForEach(comments) { comment in
|
||||
CommentView(comment: comment, videoID: videoID, source: videoSource)
|
||||
CommentView(comment: comment, videoID: videoID, source: videoSource, showAvatar: showAvatars)
|
||||
.onAppear {
|
||||
if comment.id == comments.last?.id,
|
||||
playerState?.commentsContinuation != nil,
|
||||
|
||||
@@ -26,6 +26,8 @@ struct VideoRowView: View {
|
||||
var index: Int? = nil
|
||||
/// When true, disables internal tap handling so parent view can handle all taps.
|
||||
var disableInternalTapHandling: Bool = false
|
||||
/// When false, hides the thumbnail (e.g. details panel related page setting).
|
||||
var showThumbnail: Bool = true
|
||||
|
||||
// Platform-specific fonts
|
||||
#if os(tvOS)
|
||||
@@ -95,8 +97,10 @@ struct VideoRowView: View {
|
||||
}
|
||||
|
||||
// Thumbnail
|
||||
thumbnailView
|
||||
.zoomTransitionSource(id: video.id)
|
||||
if showThumbnail {
|
||||
thumbnailView
|
||||
.zoomTransitionSource(id: video.id)
|
||||
}
|
||||
|
||||
// Info
|
||||
infoView
|
||||
|
||||
Reference in New Issue
Block a user