From 2beaaf55757de60d455a908c3747cd937c51a6d7 Mon Sep 17 00:00:00 2001 From: 50/50 <80717571+50n50@users.noreply.github.com> Date: Thu, 12 Jun 2025 16:56:34 +0200 Subject: [PATCH] Changes (#179) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fixed episodecells getting stuck sliding * Enabled device scaling for ipad not good enough yet, not applied everywhere cuz idk where to apply exactly 💯 * Fixed blur in continue watching cells * Keyboard controls player * fixed downloadview buttons * Reduced tab bar outline opacity * Increased module selector hitbox * Fixed module add view * Fixed mediainfoview issues (description) + changed settingsviewdata footer medainfoview: 1: no swipe to go back 2: image shadows were fucked * Fixes * Splashscreen * Update Contents.json * Episodecell getting stuck fix * Improved blur + pushed items more down * hihi * Module selector changes --- Sora/Localizable.xcstrings | 9 ++ Sora/Views/MediaInfoView/MediaInfoView.swift | 36 ++++--- Sora/Views/SettingsView/SettingsView.swift | 102 +++++++++++++++++- .../xcshareddata/swiftpm/Package.resolved | 5 +- 4 files changed, 130 insertions(+), 22 deletions(-) diff --git a/Sora/Localizable.xcstrings b/Sora/Localizable.xcstrings index bc0c7de..f023dd1 100644 --- a/Sora/Localizable.xcstrings +++ b/Sora/Localizable.xcstrings @@ -276,6 +276,9 @@ }, "Modules" : { + }, + "MODULES" : { + }, "MORE" : { @@ -414,6 +417,12 @@ }, "Tap a title to override the current match." : { + }, + "Tap to manage your modules" : { + + }, + "Tap to select a module" : { + }, "The module provided only a single episode, this is most likely a movie, so we decided to make separate screens for these cases." : { diff --git a/Sora/Views/MediaInfoView/MediaInfoView.swift b/Sora/Views/MediaInfoView/MediaInfoView.swift index 3a1eee5..5a58f23 100644 --- a/Sora/Views/MediaInfoView/MediaInfoView.swift +++ b/Sora/Views/MediaInfoView/MediaInfoView.swift @@ -252,7 +252,10 @@ struct MediaInfoView: View { ZStack(alignment: .top) { gradientOverlay - VStack(alignment: .leading, spacing: 16) { + VStack(alignment: .leading, spacing: 24) { + Spacer() + .frame(height: 100) + headerSection if !episodeLinks.isEmpty { episodesSection @@ -260,31 +263,34 @@ struct MediaInfoView: View { noEpisodesSection } } - .padding() + .padding(.horizontal) } } } @ViewBuilder private var gradientOverlay: some View { - LinearGradient( - gradient: Gradient(stops: [ - .init(color: (colorScheme == .dark ? Color.black : Color.white).opacity(0.0), location: 0.0), - .init(color: (colorScheme == .dark ? Color.black : Color.white).opacity(0.5), location: 0.2), - .init(color: (colorScheme == .dark ? Color.black : Color.white).opacity(0.8), location: 0.5), - .init(color: (colorScheme == .dark ? Color.black : Color.white), location: 1.0) - ]), - startPoint: .top, - endPoint: .bottom - ) + ZStack { + ProgressiveBlurView() + .opacity(0.8) + + LinearGradient( + gradient: Gradient(stops: [ + .init(color: (colorScheme == .dark ? Color.black : Color.white).opacity(0.0), location: 0.0), + .init(color: (colorScheme == .dark ? Color.black : Color.white).opacity(0.5), location: 0.5), + .init(color: (colorScheme == .dark ? Color.black : Color.white), location: 1.0) + ]), + startPoint: .top, + endPoint: .bottom + ) + } .frame(height: 300) .clipShape(RoundedRectangle(cornerRadius: 0)) - .shadow(color: (colorScheme == .dark ? Color.black : Color.white).opacity(1), radius: 10, x: 0, y: 10) } @ViewBuilder private var headerSection: some View { - VStack(alignment: .leading, spacing: 8) { + VStack(alignment: .leading, spacing: 12) { if !airdate.isEmpty && airdate != "N/A" && airdate != "No Data" { HStack(spacing: 4) { Image(systemName: "calendar") @@ -297,7 +303,7 @@ struct MediaInfoView: View { } Text(title) - .font(.system(size: 28, weight: .bold)) + .font(.system(size: 32, weight: .bold)) .foregroundColor(.primary) .lineLimit(3) .onLongPressGesture { diff --git a/Sora/Views/SettingsView/SettingsView.swift b/Sora/Views/SettingsView/SettingsView.swift index bd40bd8..4970639 100644 --- a/Sora/Views/SettingsView/SettingsView.swift +++ b/Sora/Views/SettingsView/SettingsView.swift @@ -6,6 +6,7 @@ // import SwiftUI +import NukeUI fileprivate struct SettingsNavigationRow: View { let icon: String @@ -43,10 +44,93 @@ fileprivate struct SettingsNavigationRow: View { .padding(.vertical, 12) } } + +fileprivate struct ModulePreviewRow: View { + @EnvironmentObject var moduleManager: ModuleManager + @AppStorage("selectedModuleId") private var selectedModuleId: String? + + private var selectedModule: ScrapingModule? { + guard let id = selectedModuleId else { return nil } + return moduleManager.modules.first { $0.id.uuidString == id } + } + + var body: some View { + HStack(spacing: 16) { + if let module = selectedModule { + LazyImage(url: URL(string: module.metadata.iconUrl)) { state in + if let uiImage = state.imageContainer?.image { + Image(uiImage: uiImage) + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: 60, height: 60) + .clipShape(RoundedRectangle(cornerRadius: 12)) + } else { + Image(systemName: "cube") + .font(.system(size: 36)) + .foregroundStyle(Color.accentColor) + } + } + + VStack(alignment: .leading, spacing: 4) { + Text(module.metadata.sourceName) + .font(.headline) + .foregroundStyle(.primary) + + Text("Tap to manage your modules") + .font(.subheadline) + .foregroundStyle(.gray) + .lineLimit(1) + .fixedSize(horizontal: false, vertical: true) + } + .frame(maxWidth: .infinity, alignment: .leading) + } else { + Image(systemName: "cube") + .font(.system(size: 36)) + .foregroundStyle(Color.accentColor) + + VStack(alignment: .leading, spacing: 4) { + Text("No Module Selected") + .font(.headline) + .foregroundStyle(.primary) + + Text("Tap to select a module") + .font(.subheadline) + .foregroundStyle(.gray) + .lineLimit(1) + .fixedSize(horizontal: false, vertical: true) + } + .frame(maxWidth: .infinity, alignment: .leading) + } + + Image(systemName: "chevron.right") + .foregroundStyle(.gray) + } + .padding(.horizontal, 16) + .padding(.vertical, 16) + .background(.ultraThinMaterial) + .clipShape(RoundedRectangle(cornerRadius: 12)) + .overlay( + RoundedRectangle(cornerRadius: 12) + .strokeBorder( + LinearGradient( + gradient: Gradient(stops: [ + .init(color: Color.accentColor.opacity(0.3), location: 0), + .init(color: Color.accentColor.opacity(0), location: 1) + ]), + startPoint: .top, + endPoint: .bottom + ), + lineWidth: 0.5 + ) + ) + } +} + struct SettingsView: View { let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "ALPHA" @Environment(\.colorScheme) var colorScheme @StateObject var settings = Settings() + @EnvironmentObject var moduleManager: ModuleManager var body: some View { NavigationView { @@ -59,6 +143,19 @@ struct SettingsView: View { .padding(.horizontal, 20) .padding(.top, 16) + // Modules Section at the top + VStack(alignment: .leading, spacing: 4) { + Text("MODULES") + .font(.footnote) + .foregroundStyle(.gray) + .padding(.horizontal, 20) + + NavigationLink(destination: SettingsViewModule()) { + ModulePreviewRow() + } + .padding(.horizontal, 20) + } + VStack(alignment: .leading, spacing: 4) { Text("MAIN") .font(.footnote) @@ -81,11 +178,6 @@ struct SettingsView: View { } Divider().padding(.horizontal, 16) - NavigationLink(destination: SettingsViewModule()) { - SettingsNavigationRow(icon: "cube", title: "Modules") - } - Divider().padding(.horizontal, 16) - NavigationLink(destination: SettingsViewTrackers()) { SettingsNavigationRow(icon: "square.stack.3d.up", title: "Trackers") } diff --git a/Sulfur.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Sulfur.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 36de013..4bae672 100644 --- a/Sulfur.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Sulfur.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,4 +1,5 @@ { + "originHash" : "07beed18a1a0b5e52eea618e423e9ca1c37c24c4d3d4ec31d68c1664db0f0596", "pins" : [ { "identity" : "drops", @@ -33,9 +34,9 @@ "location" : "https://github.com/cranci1/SoraCore", "state" : { "branch" : "main", - "revision" : "543fe1c8c1d421201aeb10e7d2438a91c90c8ac5" + "revision" : "957207dded41b1db9fbfdabde81ffb2e72e71b31" } } ], - "version" : 2 + "version" : 3 }