372b27540b
apple / swift (push) Successful in 1m11s
android / android (push) Successful in 4m19s
ci / web (push) Successful in 51s
ci / rust (push) Successful in 5m14s
ci / docs-site (push) Successful in 58s
release / apple (push) Successful in 7m54s
deb / build-publish (push) Successful in 4m0s
decky / build-publish (push) Successful in 12s
docker / build-push (--build-arg FEDORA_VERSION=44, ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora44-rpm) (push) Successful in 4s
docker / build-push (., web/Dockerfile, punktfunk-web) (push) Successful in 4s
ci / bench (push) Successful in 5m19s
docker / build-push (ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora-rpm) (push) Successful in 4s
docker / build-push (docs-site, docs-site/Dockerfile, punktfunk-docs) (push) Successful in 5s
docker / build-push (ci, ci/rust-ci.Dockerfile, punktfunk-rust-ci) (push) Successful in 5s
apple / screenshots (push) Successful in 5m37s
rpm / build-publish (bazzite, punktfunk-fedora-rpm) (push) Successful in 9m26s
rpm / build-publish (fedora-44, punktfunk-fedora44-rpm) (push) Successful in 9m35s
docker / deploy-docs (push) Successful in 18s
THIRD-PARTY-NOTICES.txt is ~885 KB / 16k lines; rendering it in a single SwiftUI Text overshot the text-rendering height limit — it laid out for ages and drew blank below the cutoff (only the small punktfunk licenses above it showed). Split the notices into ~80 line-chunks (<=200 lines / <=18 KB each, computed once as Licenses.thirdPartyNoticesChunks) and render them in a top-level LazyVStack so only on-screen chunks lay out and no chunk is tall enough to clip. Chunking is lossless — rejoining the chunks reproduces the original byte-for-byte, so no notice text is dropped. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
73 lines
2.9 KiB
Swift
73 lines
2.9 KiB
Swift
import PunktfunkKit
|
|
import SwiftUI
|
|
|
|
/// Open-source acknowledgements: punktfunk's own license (MIT OR Apache-2.0) followed by the
|
|
/// third-party software notices. Used as a pushed view on iOS/tvOS and a preferences tab on macOS.
|
|
struct AcknowledgementsView: View {
|
|
private var version: String? {
|
|
Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String
|
|
}
|
|
|
|
var body: some View {
|
|
ScrollView {
|
|
// Top-level LazyVStack so the third-party-notices chunks (Licenses.thirdPartyNoticesChunks,
|
|
// ~885 KB total) load lazily as they scroll into view — a single Text that large overshoots
|
|
// the text-rendering height limit (blank below the limit + very slow). spacing 0 keeps the
|
|
// notice chunks visually continuous; the header block carries its own spacing + bottom pad.
|
|
LazyVStack(alignment: .leading, spacing: 0) {
|
|
VStack(alignment: .leading, spacing: 18) {
|
|
Text("punktfunk")
|
|
.font(.title2).bold()
|
|
if let version {
|
|
Text("Version \(version)")
|
|
.font(.caption)
|
|
.foregroundStyle(.secondary)
|
|
}
|
|
Text(Licenses.appLicense)
|
|
.font(.caption.monospaced())
|
|
.modifier(SelectableText())
|
|
|
|
Divider()
|
|
|
|
Text("Third-party software")
|
|
.font(.headline)
|
|
Text(
|
|
"punktfunk uses the open-source components below, each under its own license. "
|
|
+ "On some platforms FFmpeg is additionally bundled under the LGPL v2.1+ "
|
|
+ "(dynamically linked, replaceable)."
|
|
)
|
|
.font(.caption)
|
|
.foregroundStyle(.secondary)
|
|
}
|
|
.frame(maxWidth: .infinity, alignment: .leading)
|
|
.padding(.bottom, 18)
|
|
|
|
ForEach(Licenses.thirdPartyNoticesChunks.indices, id: \.self) { i in
|
|
Text(Licenses.thirdPartyNoticesChunks[i])
|
|
.font(.caption2.monospaced())
|
|
.frame(maxWidth: .infinity, alignment: .leading)
|
|
.modifier(SelectableText())
|
|
}
|
|
}
|
|
.frame(maxWidth: 900, alignment: .leading)
|
|
.frame(maxWidth: .infinity, alignment: .leading)
|
|
.padding()
|
|
#if os(tvOS)
|
|
.padding(40)
|
|
#endif
|
|
}
|
|
.navigationTitle("Acknowledgements")
|
|
}
|
|
}
|
|
|
|
/// `textSelection(.enabled)` is unavailable on tvOS, so apply it only where it exists.
|
|
private struct SelectableText: ViewModifier {
|
|
func body(content: Content) -> some View {
|
|
#if os(tvOS)
|
|
content
|
|
#else
|
|
content.textSelection(.enabled)
|
|
#endif
|
|
}
|
|
}
|