diff --git a/Xcodes/Backend/Version+.swift b/Xcodes/Backend/Version+.swift index e86d4a5..a1d688c 100644 --- a/Xcodes/Backend/Version+.swift +++ b/Xcodes/Backend/Version+.swift @@ -31,4 +31,9 @@ public extension Version { var isPrerelease: Bool { prereleaseIdentifiers.isEmpty == false } var isNotPrerelease: Bool { prereleaseIdentifiers.isEmpty == true } + + /// Returns a new Version instance without any `prereleaseIdentifiers` or `buildMetadataIdentifiers` + func withoutIdentifiers() -> Version { + Version(major, minor, patch) + } } diff --git a/Xcodes/Frontend/XcodeList/MainToolbar.swift b/Xcodes/Frontend/XcodeList/MainToolbar.swift index c4511de..8e09afd 100644 --- a/Xcodes/Frontend/XcodeList/MainToolbar.swift +++ b/Xcodes/Frontend/XcodeList/MainToolbar.swift @@ -46,7 +46,8 @@ struct MainToolbarModifier: ViewModifier { switch category { case .all: category = .release case .release: category = .beta - case .beta: category = .all + case .beta: category = .releasePlusNewBetas + case .releasePlusNewBetas: category = .all } }) { switch category { @@ -60,6 +61,10 @@ struct MainToolbarModifier: ViewModifier { Label("BetaOnly", systemImage: "line.horizontal.3.decrease.circle.fill") .labelStyle(.trailingIcon) .foregroundColor(.accentColor) + case .releasePlusNewBetas: + Label("ReleasePlusNewBetas", systemImage: "line.horizontal.3.decrease.circle.fill") + .labelStyle(.trailingIcon) + .foregroundColor(.accentColor) } } .help("FilterAvailableDescription") diff --git a/Xcodes/Frontend/XcodeList/XcodeListCategory.swift b/Xcodes/Frontend/XcodeList/XcodeListCategory.swift index 1d85da9..f5d2ed7 100644 --- a/Xcodes/Frontend/XcodeList/XcodeListCategory.swift +++ b/Xcodes/Frontend/XcodeList/XcodeListCategory.swift @@ -5,6 +5,7 @@ enum XcodeListCategory: String, CaseIterable, Identifiable, CustomStringConverti case all case release case beta + case releasePlusNewBetas var id: Self { self } @@ -13,6 +14,7 @@ enum XcodeListCategory: String, CaseIterable, Identifiable, CustomStringConverti case .all: return localizeString("All") case .release: return localizeString("Release") case .beta: return localizeString("Beta") + case .releasePlusNewBetas: return localizeString("ReleasePlusNewBetas") } } diff --git a/Xcodes/Frontend/XcodeList/XcodeListView.swift b/Xcodes/Frontend/XcodeList/XcodeListView.swift index 9a8c9c4..eaa008c 100644 --- a/Xcodes/Frontend/XcodeList/XcodeListView.swift +++ b/Xcodes/Frontend/XcodeList/XcodeListView.swift @@ -28,6 +28,15 @@ struct XcodeListView: View { xcodes = appState.allXcodes.filter { $0.version.isNotPrerelease } case .beta: xcodes = appState.allXcodes.filter { $0.version.isPrerelease } + case .releasePlusNewBetas: + let releases = Set( + appState.allXcodes + .filter(\.version.isNotPrerelease) + .map { $0.version.withoutIdentifiers() } + ) + xcodes = appState.allXcodes.filter { + $0.version.isNotPrerelease || !releases.contains($0.version.withoutIdentifiers()) + } } if architecture == .appleSilicon { diff --git a/Xcodes/Resources/Localizable.xcstrings b/Xcodes/Resources/Localizable.xcstrings index 9d95df7..c091c79 100644 --- a/Xcodes/Resources/Localizable.xcstrings +++ b/Xcodes/Resources/Localizable.xcstrings @@ -20131,6 +20131,17 @@ } } }, + "ReleasePlusNewBetas" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Release & New Betas" + } + } + } + }, "Required" : { "localizations" : { "ar" : {