From 12cc6b11ba4ee15e3d1668c779b00b41971addcf Mon Sep 17 00:00:00 2001 From: Binlogo Date: Thu, 16 Sep 2021 01:06:35 +0800 Subject: [PATCH 1/2] Support release or beta version filter --- Xcodes/Frontend/MainWindow.swift | 4 +- Xcodes/Frontend/XcodeList/MainToolbar.swift | 44 ++++++++++++++++--- .../XcodeList/XcodeListCategory.swift | 6 ++- Xcodes/Frontend/XcodeList/XcodeListView.swift | 16 +++++-- 4 files changed, 58 insertions(+), 12 deletions(-) diff --git a/Xcodes/Frontend/MainWindow.swift b/Xcodes/Frontend/MainWindow.swift index fe87402..1235ea4 100644 --- a/Xcodes/Frontend/MainWindow.swift +++ b/Xcodes/Frontend/MainWindow.swift @@ -12,10 +12,11 @@ struct MainWindow: View { // FB8979533 SceneStorage doesn't restore value after app is quit by user @AppStorage("isShowingInfoPane") private var isShowingInfoPane = false @AppStorage("xcodeListCategory") private var category: XcodeListCategory = .all + @AppStorage("isInstalledOnly") private var isInstalledOnly = false var body: some View { HSplitView { - XcodeListView(selectedXcodeID: $selectedXcodeID, searchText: searchText, category: category) + XcodeListView(selectedXcodeID: $selectedXcodeID, searchText: searchText, category: category, isInstalledOnly: isInstalledOnly) .frame(minWidth: 300) .layoutPriority(1) .alert(item: $appState.xcodeBeingConfirmedForUninstallation) { xcode in @@ -32,6 +33,7 @@ struct MainWindow: View { } .mainToolbar( category: $category, + isInstalledOnly: $isInstalledOnly, isShowingInfoPane: $isShowingInfoPane, searchText: $searchText ) diff --git a/Xcodes/Frontend/XcodeList/MainToolbar.swift b/Xcodes/Frontend/XcodeList/MainToolbar.swift index bedf3be..a6355fd 100644 --- a/Xcodes/Frontend/XcodeList/MainToolbar.swift +++ b/Xcodes/Frontend/XcodeList/MainToolbar.swift @@ -3,6 +3,7 @@ import SwiftUI struct MainToolbarModifier: ViewModifier { @EnvironmentObject var appState: AppState @Binding var category: XcodeListCategory + @Binding var isInstalledOnly: Bool @Binding var isShowingInfoPane: Bool @Binding var searchText: String @@ -29,16 +30,47 @@ struct MainToolbarModifier: ViewModifier { Button(action: { switch category { - case .all: category = .installed - case .installed: category = .all + case .all: category = .release + case .release: category = .beta + case .beta: category = .all } }) { switch category { case .all: - Label("Filter", systemImage: "line.horizontal.3.decrease.circle") - case .installed: - Label("Filter", systemImage: "line.horizontal.3.decrease.circle.fill") + Label("All", systemImage: "line.horizontal.3.decrease.circle") + case .release: + if #available(macOS 11.3, *) { + Label("Release only", systemImage: "line.horizontal.3.decrease.circle.fill") + .labelStyle(TitleAndIconLabelStyle()) + .foregroundColor(.accentColor) + } else { + Label("Release only", systemImage: "line.horizontal.3.decrease.circle.fill") + .labelStyle(TitleOnlyLabelStyle()) + .foregroundColor(.accentColor) + } + case .beta: + if #available(macOS 11.3, *) { + Label("Beta only", systemImage: "line.horizontal.3.decrease.circle.fill") + .labelStyle(TitleAndIconLabelStyle()) + .foregroundColor(.accentColor) + } else { + Label("Beta only", systemImage: "line.horizontal.3.decrease.circle.fill") + .labelStyle(TitleOnlyLabelStyle()) + .foregroundColor(.accentColor) + } + } + } + .help("Filter available versions") + + Button(action: { + isInstalledOnly.toggle() + }) { + if isInstalledOnly { + Label("Filter", systemImage: "arrow.down.app.fill") .foregroundColor(.accentColor) + } else { + Label("Filter", systemImage: "arrow.down.app") + } } .help("Filter installed versions") @@ -65,12 +97,14 @@ struct MainToolbarModifier: ViewModifier { extension View { func mainToolbar( category: Binding, + isInstalledOnly: Binding, isShowingInfoPane: Binding, searchText: Binding ) -> some View { self.modifier( MainToolbarModifier( category: category, + isInstalledOnly: isInstalledOnly, isShowingInfoPane: isShowingInfoPane, searchText: searchText ) diff --git a/Xcodes/Frontend/XcodeList/XcodeListCategory.swift b/Xcodes/Frontend/XcodeList/XcodeListCategory.swift index 520414e..4c2e4db 100644 --- a/Xcodes/Frontend/XcodeList/XcodeListCategory.swift +++ b/Xcodes/Frontend/XcodeList/XcodeListCategory.swift @@ -2,14 +2,16 @@ import Foundation enum XcodeListCategory: String, CaseIterable, Identifiable, CustomStringConvertible { case all - case installed + case release + case beta var id: Self { self } var description: String { switch self { case .all: return "All" - case .installed: return "Installed" + case .release: return "Release" + case .beta: return "Beta" } } } diff --git a/Xcodes/Frontend/XcodeList/XcodeListView.swift b/Xcodes/Frontend/XcodeList/XcodeListView.swift index 4905e78..48f652f 100644 --- a/Xcodes/Frontend/XcodeList/XcodeListView.swift +++ b/Xcodes/Frontend/XcodeList/XcodeListView.swift @@ -7,11 +7,13 @@ struct XcodeListView: View { @Binding var selectedXcodeID: Xcode.ID? private let searchText: String private let category: XcodeListCategory + private let isInstalledOnly: Bool - init(selectedXcodeID: Binding, searchText: String, category: XcodeListCategory) { + init(selectedXcodeID: Binding, searchText: String, category: XcodeListCategory, isInstalledOnly: Bool) { self._selectedXcodeID = selectedXcodeID self.searchText = searchText self.category = category + self.isInstalledOnly = isInstalledOnly } var visibleXcodes: [Xcode] { @@ -19,14 +21,20 @@ struct XcodeListView: View { switch category { case .all: xcodes = appState.allXcodes - case .installed: - xcodes = appState.allXcodes.filter { $0.installState.installed } + case .release: + xcodes = appState.allXcodes.filter { $0.version.isNotPrerelease } + case .beta: + xcodes = appState.allXcodes.filter { $0.version.isPrerelease } } if !searchText.isEmpty { xcodes = xcodes.filter { $0.description.contains(searchText) } } + if isInstalledOnly { + xcodes = appState.allXcodes.filter { $0.installState.installed } + } + return xcodes } @@ -40,7 +48,7 @@ struct XcodeListView: View { struct XcodeListView_Previews: PreviewProvider { static var previews: some View { Group { - XcodeListView(selectedXcodeID: .constant(nil), searchText: "", category: .all) + XcodeListView(selectedXcodeID: .constant(nil), searchText: "", category: .all, isInstalledOnly: false) .environmentObject({ () -> AppState in let a = AppState() a.allXcodes = [ From 550cf3261cc59200f8fee559855110629de52e70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A3=92=E6=A3=92=E5=BD=AC=5FBinboy?= Date: Thu, 16 Sep 2021 08:26:46 +0800 Subject: [PATCH 2/2] Apply suggestions from code review if the isInstalledOnly is on, we filter with `AND` instead of `OR` Co-authored-by: Matt Kiazyk --- Xcodes/Frontend/XcodeList/XcodeListView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Xcodes/Frontend/XcodeList/XcodeListView.swift b/Xcodes/Frontend/XcodeList/XcodeListView.swift index 48f652f..101010f 100644 --- a/Xcodes/Frontend/XcodeList/XcodeListView.swift +++ b/Xcodes/Frontend/XcodeList/XcodeListView.swift @@ -32,7 +32,7 @@ struct XcodeListView: View { } if isInstalledOnly { - xcodes = appState.allXcodes.filter { $0.installState.installed } + xcodes = xcodes.filter { $0.installState.installed } } return xcodes