From 98d1d303289d33285597126cf5db8b21e15fc47d Mon Sep 17 00:00:00 2001 From: Jayson Rhynas Date: Fri, 7 Jul 2023 10:33:25 -0400 Subject: [PATCH 1/2] Add `releasePlusNewBetas` XcodeListCategory This adds a new filter option that shows only releases, plus any betas that do not have a release version. So as of today (July 7, 2023 the Xcode 15 betas will be shown but the Xcode 14 betas won't. Note that this will also show betas for older Xcode versions if necessary, for example if an Xcode 14.3.2 beta is released it will be shown until the mainline Xcode 14.3.2 is released. --- Xcodes/Backend/Version+.swift | 5 +++++ Xcodes/Frontend/XcodeList/MainToolbar.swift | 13 ++++++++++++- Xcodes/Frontend/XcodeList/XcodeListCategory.swift | 2 ++ Xcodes/Frontend/XcodeList/XcodeListView.swift | 9 +++++++++ Xcodes/Resources/en.lproj/Localizable.strings | 2 ++ 5 files changed, 30 insertions(+), 1 deletion(-) 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 69a48f24..cefffa1c 100644 --- a/Xcodes/Frontend/XcodeList/MainToolbar.swift +++ b/Xcodes/Frontend/XcodeList/MainToolbar.swift @@ -32,7 +32,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 { @@ -58,6 +59,16 @@ struct MainToolbarModifier: ViewModifier { .labelStyle(TitleOnlyLabelStyle()) .foregroundColor(.accentColor) } + case .releasePlusBeta: + if #available(macOS 11.3, *) { + Label("ReleasePlusBetaOnly", systemImage: "line.horizontal.3.decrease.circle.fill") + .labelStyle(TitleAndIconLabelStyle()) + .foregroundColor(.accentColor) + } else { + Label("ReleasePlusBetaOnly", 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 101010f3..58284117 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/en.lproj/Localizable.strings b/Xcodes/Resources/en.lproj/Localizable.strings index 59a8676c..fe67e95e 100644 --- a/Xcodes/Resources/en.lproj/Localizable.strings +++ b/Xcodes/Resources/en.lproj/Localizable.strings @@ -144,6 +144,8 @@ "ReleaseOnly" = "Release only"; "Beta" = "Beta"; "BetaOnly" = "Beta only"; +"ReleasePlusNewBetas" = "Release & New Betas"; +"ReleasePlusNewBetasOnly" = "Release & New Betas Only"; "Filter" = "Filter"; "FilterAvailableDescription" = "Filter available versions"; "FilterInstalledDescription" = "Filter installed versions"; From c650daca6fc20962b934d014ab4414894f44b83a Mon Sep 17 00:00:00 2001 From: Jayson Rhynas Date: Sat, 25 Nov 2023 09:18:33 -0500 Subject: [PATCH 2/2] Fixes for mis-named enum and localization keys --- Xcodes/Frontend/XcodeList/MainToolbar.swift | 6 +++--- Xcodes/Resources/en.lproj/Localizable.strings | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Xcodes/Frontend/XcodeList/MainToolbar.swift b/Xcodes/Frontend/XcodeList/MainToolbar.swift index cefffa1c..d4c7c285 100644 --- a/Xcodes/Frontend/XcodeList/MainToolbar.swift +++ b/Xcodes/Frontend/XcodeList/MainToolbar.swift @@ -59,13 +59,13 @@ struct MainToolbarModifier: ViewModifier { .labelStyle(TitleOnlyLabelStyle()) .foregroundColor(.accentColor) } - case .releasePlusBeta: + case .releasePlusNewBetas: if #available(macOS 11.3, *) { - Label("ReleasePlusBetaOnly", systemImage: "line.horizontal.3.decrease.circle.fill") + Label("ReleasePlusNewBetas", systemImage: "line.horizontal.3.decrease.circle.fill") .labelStyle(TitleAndIconLabelStyle()) .foregroundColor(.accentColor) } else { - Label("ReleasePlusBetaOnly", systemImage: "line.horizontal.3.decrease.circle.fill") + Label("ReleasePlusNewBetas", systemImage: "line.horizontal.3.decrease.circle.fill") .labelStyle(TitleOnlyLabelStyle()) .foregroundColor(.accentColor) } diff --git a/Xcodes/Resources/en.lproj/Localizable.strings b/Xcodes/Resources/en.lproj/Localizable.strings index fe67e95e..45572832 100644 --- a/Xcodes/Resources/en.lproj/Localizable.strings +++ b/Xcodes/Resources/en.lproj/Localizable.strings @@ -145,7 +145,6 @@ "Beta" = "Beta"; "BetaOnly" = "Beta only"; "ReleasePlusNewBetas" = "Release & New Betas"; -"ReleasePlusNewBetasOnly" = "Release & New Betas Only"; "Filter" = "Filter"; "FilterAvailableDescription" = "Filter available versions"; "FilterInstalledDescription" = "Filter installed versions";