diff --git a/Xcodes/Backend/Version+.swift b/Xcodes/Backend/Version+.swift index e86d4a52..a1d688cb 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 c64c1dd5..b27a9987 100644 --- a/Xcodes/Frontend/XcodeList/MainToolbar.swift +++ b/Xcodes/Frontend/XcodeList/MainToolbar.swift @@ -27,7 +27,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 { @@ -53,6 +54,16 @@ struct MainToolbarModifier: ViewModifier { .labelStyle(TitleOnlyLabelStyle()) .foregroundColor(.accentColor) } + case .releasePlusNewBetas: + if #available(macOS 11.3, *) { + Label("ReleasePlusNewBetas", systemImage: "line.horizontal.3.decrease.circle.fill") + .labelStyle(TitleAndIconLabelStyle()) + .foregroundColor(.accentColor) + } else { + Label("ReleasePlusNewBetas", systemImage: "line.horizontal.3.decrease.circle.fill") + .labelStyle(TitleOnlyLabelStyle()) + .foregroundColor(.accentColor) + } } } .help("FilterAvailableDescription") diff --git a/Xcodes/Frontend/XcodeList/XcodeListCategory.swift b/Xcodes/Frontend/XcodeList/XcodeListCategory.swift index 52ea7905..89772b4d 100644 --- a/Xcodes/Frontend/XcodeList/XcodeListCategory.swift +++ b/Xcodes/Frontend/XcodeList/XcodeListCategory.swift @@ -4,6 +4,7 @@ enum XcodeListCategory: String, CaseIterable, Identifiable, CustomStringConverti case all case release case beta + case releasePlusNewBetas var id: Self { self } @@ -12,6 +13,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 d68936df..68dec20f 100644 --- a/Xcodes/Frontend/XcodeList/XcodeListView.swift +++ b/Xcodes/Frontend/XcodeList/XcodeListView.swift @@ -25,6 +25,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 !searchText.isEmpty { diff --git a/Xcodes/Resources/Localizable.xcstrings b/Xcodes/Resources/Localizable.xcstrings index 74a637f2..e79ec8a5 100644 --- a/Xcodes/Resources/Localizable.xcstrings +++ b/Xcodes/Resources/Localizable.xcstrings @@ -15955,6 +15955,17 @@ } } }, + "ReleasePlusNewBetas" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Release & New Betas" + } + } + } + }, "Required" : { "localizations" : { "ca" : {