diff --git a/Model/HistoryModel.swift b/Model/HistoryModel.swift index 801ddd92..14653419 100644 --- a/Model/HistoryModel.swift +++ b/Model/HistoryModel.swift @@ -102,8 +102,14 @@ extension PlayerModel { } func removeWatch(_ watch: Watch) { - context.delete(watch) - try? context.save() + context.perform { [weak self] in + guard let self else { return } + self.context.delete(watch) + + try? self.context.save() + + FeedModel.shared.calculateUnwatchedFeed() + } } func removeAllWatches() { diff --git a/Shared/Videos/VideoBanner.swift b/Shared/Videos/VideoBanner.swift index c6cd7bbb..28654657 100644 --- a/Shared/Videos/VideoBanner.swift +++ b/Shared/Videos/VideoBanner.swift @@ -161,7 +161,7 @@ struct VideoBanner: View { @ViewBuilder private var smallThumbnail: some View { ZStack(alignment: .bottomTrailing) { - ZStack(alignment: .bottomLeading) { + ZStack(alignment: .topLeading) { ZStack { Color("PlaceholderColor") @@ -178,17 +178,10 @@ struct VideoBanner: View { if saveHistory, watchedVideoStyle.isShowingBadge, - watch?.finished ?? false + let video { - Image(systemName: "checkmark.circle.fill") - .foregroundColor(Color( - watchedVideoBadgeColor == .colorSchemeBased ? "WatchProgressBarColor" : - watchedVideoBadgeColor == .red ? "AppRedColor" : "AppBlueColor" - )) - .background(Color.white) - .clipShape(Circle()) - .imageScale(.medium) - .offset(x: 5, y: -5) + WatchView(watch: watch, videoID: video.videoID, duration: video.length) + .offset(x: 2, y: 2) } } diff --git a/Shared/Videos/VideoCell.swift b/Shared/Videos/VideoCell.swift index d7976f41..03f9c746 100644 --- a/Shared/Videos/VideoCell.swift +++ b/Shared/Videos/VideoCell.swift @@ -363,28 +363,39 @@ struct VideoCell: View { (!timeOnThumbnail && !videoDuration.isNil) } + private var showProgressView: Bool { + saveHistory && showWatchingProgress && ((watch?.finished ?? false) || watch?.progress ?? 0 > 0) + } + private var thumbnail: some View { ZStack(alignment: .leading) { ZStack(alignment: .bottomLeading) { thumbnailImage - if saveHistory, showWatchingProgress, watch?.progress ?? 0 > 0 { - ProgressView(value: watch!.progress, total: 100) - .progressViewStyle(LinearProgressViewStyle(tint: Color("AppRedColor"))) - #if os(tvOS) - .padding(.horizontal, 16) - #else - .padding(.horizontal, 10) - #endif - #if os(macOS) - .offset(x: 0, y: 4) - #else - .offset(x: 0, y: -3) - #endif - } + + ProgressView(value: watch?.progress ?? 0, total: 100) + .progressViewStyle(LinearProgressViewStyle(tint: Color("AppRedColor"))) + #if os(tvOS) + .padding(.horizontal, 16) + #else + .padding(.horizontal, 10) + #endif + #if os(macOS) + .offset(x: 0, y: 4) + #else + .offset(x: 0, y: -3) + #endif + .opacity(showProgressView ? 1 : 0) } VStack { HStack(alignment: .top) { + if saveHistory, + watchedVideoStyle.isShowingBadge, + let video + { + WatchView(watch: watch, videoID: video.videoID, duration: video.length) + } + if video.live { DetailBadge(text: "Live", style: .outstanding) } else if video.upcoming { @@ -408,23 +419,6 @@ struct VideoCell: View { Spacer() HStack { - if saveHistory, - watchedVideoStyle.isShowingBadge, - watch?.finished ?? false - { - Image(systemName: "checkmark.circle.fill") - .foregroundColor(Color( - watchedVideoBadgeColor == .colorSchemeBased ? "WatchProgressBarColor" : - watchedVideoBadgeColor == .red ? "AppRedColor" : "AppBlueColor" - )) - .background(Color.white) - .clipShape(Circle()) - #if os(tvOS) - .font(.system(size: 40)) - #else - .font(.system(size: 30)) - #endif - } Spacer() if timeOnThumbnail, diff --git a/Shared/Views/VideoContextMenuView.swift b/Shared/Views/VideoContextMenuView.swift index eca42c1d..26c91f61 100644 --- a/Shared/Views/VideoContextMenuView.swift +++ b/Shared/Views/VideoContextMenuView.swift @@ -159,7 +159,6 @@ struct VideoContextMenuView: View { Button { guard let watch else { return } player.removeWatch(watch) - FeedModel.shared.calculateUnwatchedFeed() } label: { Label("Remove from history", systemImage: "delete.left.fill") } diff --git a/Yattee.xcodeproj/project.pbxproj b/Yattee.xcodeproj/project.pbxproj index 4e173943..1a48fb61 100644 --- a/Yattee.xcodeproj/project.pbxproj +++ b/Yattee.xcodeproj/project.pbxproj @@ -677,6 +677,9 @@ 37A5DBC8285E371400CA4DD1 /* ControlBackgroundModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37A5DBC7285E371400CA4DD1 /* ControlBackgroundModifier.swift */; }; 37A5DBC9285E371400CA4DD1 /* ControlBackgroundModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37A5DBC7285E371400CA4DD1 /* ControlBackgroundModifier.swift */; }; 37A5DBCA285E371400CA4DD1 /* ControlBackgroundModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37A5DBC7285E371400CA4DD1 /* ControlBackgroundModifier.swift */; }; + 37A81BF9294BD1440081D322 /* WatchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37A81BF8294BD1440081D322 /* WatchView.swift */; }; + 37A81BFA294BD1440081D322 /* WatchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37A81BF8294BD1440081D322 /* WatchView.swift */; }; + 37A81BFB294BD1440081D322 /* WatchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37A81BF8294BD1440081D322 /* WatchView.swift */; }; 37A9965A26D6F8CA006E3224 /* HorizontalCells.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37A9965926D6F8CA006E3224 /* HorizontalCells.swift */; }; 37A9965B26D6F8CA006E3224 /* HorizontalCells.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37A9965926D6F8CA006E3224 /* HorizontalCells.swift */; }; 37A9965C26D6F8CA006E3224 /* HorizontalCells.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37A9965926D6F8CA006E3224 /* HorizontalCells.swift */; }; @@ -1333,6 +1336,7 @@ 379F141E289ECE7F00DE48B5 /* QualitySettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QualitySettings.swift; sourceTree = ""; }; 37A2B345294723850050933E /* CacheModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CacheModel.swift; sourceTree = ""; }; 37A5DBC7285E371400CA4DD1 /* ControlBackgroundModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ControlBackgroundModifier.swift; sourceTree = ""; }; + 37A81BF8294BD1440081D322 /* WatchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchView.swift; sourceTree = ""; }; 37A9965926D6F8CA006E3224 /* HorizontalCells.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HorizontalCells.swift; sourceTree = ""; }; 37A9965D26D6F9B9006E3224 /* HomeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeView.swift; sourceTree = ""; }; 37AAF27D26737323007FC770 /* PopularView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PopularView.swift; sourceTree = ""; }; @@ -1806,6 +1810,7 @@ 37F4AE7126828F0900BD60EA /* VerticalCells.swift */, 37CC3F4F270D010D00608308 /* VideoBanner.swift */, 37D4B18B26717B3800C925CA /* VideoCell.swift */, + 37A81BF8294BD1440081D322 /* WatchView.swift */, ); path = Videos; sourceTree = ""; @@ -3101,6 +3106,7 @@ 376527BB285F60F700102284 /* PlayerTimeModel.swift in Sources */, 37270F1C28E06E3E00856150 /* String+Localizable.swift in Sources */, 3722AEBE274DA401005EA4D6 /* Backport.swift in Sources */, + 37A81BF9294BD1440081D322 /* WatchView.swift in Sources */, 37EFAC0828C138CD00ED9B89 /* ControlsOverlayModel.swift in Sources */, 37F4AD2628613B81004D0F66 /* Color+Debug.swift in Sources */, 3700155F271B12DD0049C794 /* SiestaConfiguration.swift in Sources */, @@ -3455,6 +3461,7 @@ 37CC3F46270CE30600608308 /* PlayerQueueItem.swift in Sources */, 37E6D7A12944CD3800550C3D /* CacheStatusHeader.swift in Sources */, 37B2631B2735EAAB00FE0D40 /* FavoriteResourceObserver.swift in Sources */, + 37A81BFA294BD1440081D322 /* WatchView.swift in Sources */, 3700155C271B0D4D0049C794 /* PipedAPI.swift in Sources */, 376BE50C27349108009AD608 /* BrowsingSettings.swift in Sources */, 3710A55629488C7D006F8025 /* PlaceholderListItem.swift in Sources */, @@ -3664,6 +3671,7 @@ 37C0698427260B2100F7F6CB /* ThumbnailsModel.swift in Sources */, 374924DC2921050B0017D862 /* LocationsSettings.swift in Sources */, 37D6025B28C17375009E8D98 /* PlaybackStatsView.swift in Sources */, + 37A81BFB294BD1440081D322 /* WatchView.swift in Sources */, 3765788B2685471400D4EA09 /* Playlist.swift in Sources */, 376A33E22720CAD6000C1D6B /* VideosApp.swift in Sources */, 373CFADD269663F1003CB2C6 /* Thumbnail.swift in Sources */,