Merge pull request #153 from Binlogo/version-filter

Add new filter for Release or Beta versions
This commit is contained in:
Matt Kiazyk 2021-09-16 09:45:17 -05:00 committed by GitHub
commit c52f742556
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 58 additions and 12 deletions

View file

@ -12,10 +12,11 @@ struct MainWindow: View {
// FB8979533 SceneStorage doesn't restore value after app is quit by user // FB8979533 SceneStorage doesn't restore value after app is quit by user
@AppStorage("isShowingInfoPane") private var isShowingInfoPane = false @AppStorage("isShowingInfoPane") private var isShowingInfoPane = false
@AppStorage("xcodeListCategory") private var category: XcodeListCategory = .all @AppStorage("xcodeListCategory") private var category: XcodeListCategory = .all
@AppStorage("isInstalledOnly") private var isInstalledOnly = false
var body: some View { var body: some View {
HSplitView { HSplitView {
XcodeListView(selectedXcodeID: $selectedXcodeID, searchText: searchText, category: category) XcodeListView(selectedXcodeID: $selectedXcodeID, searchText: searchText, category: category, isInstalledOnly: isInstalledOnly)
.frame(minWidth: 300) .frame(minWidth: 300)
.layoutPriority(1) .layoutPriority(1)
.alert(item: $appState.xcodeBeingConfirmedForUninstallation) { xcode in .alert(item: $appState.xcodeBeingConfirmedForUninstallation) { xcode in
@ -32,6 +33,7 @@ struct MainWindow: View {
} }
.mainToolbar( .mainToolbar(
category: $category, category: $category,
isInstalledOnly: $isInstalledOnly,
isShowingInfoPane: $isShowingInfoPane, isShowingInfoPane: $isShowingInfoPane,
searchText: $searchText searchText: $searchText
) )

View file

@ -3,6 +3,7 @@ import SwiftUI
struct MainToolbarModifier: ViewModifier { struct MainToolbarModifier: ViewModifier {
@EnvironmentObject var appState: AppState @EnvironmentObject var appState: AppState
@Binding var category: XcodeListCategory @Binding var category: XcodeListCategory
@Binding var isInstalledOnly: Bool
@Binding var isShowingInfoPane: Bool @Binding var isShowingInfoPane: Bool
@Binding var searchText: String @Binding var searchText: String
@ -29,16 +30,47 @@ struct MainToolbarModifier: ViewModifier {
Button(action: { Button(action: {
switch category { switch category {
case .all: category = .installed case .all: category = .release
case .installed: category = .all case .release: category = .beta
case .beta: category = .all
} }
}) { }) {
switch category { switch category {
case .all: case .all:
Label("Filter", systemImage: "line.horizontal.3.decrease.circle") Label("All", systemImage: "line.horizontal.3.decrease.circle")
case .installed: case .release:
Label("Filter", systemImage: "line.horizontal.3.decrease.circle.fill") 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) .foregroundColor(.accentColor)
} else {
Label("Filter", systemImage: "arrow.down.app")
} }
} }
.help("Filter installed versions") .help("Filter installed versions")
@ -65,12 +97,14 @@ struct MainToolbarModifier: ViewModifier {
extension View { extension View {
func mainToolbar( func mainToolbar(
category: Binding<XcodeListCategory>, category: Binding<XcodeListCategory>,
isInstalledOnly: Binding<Bool>,
isShowingInfoPane: Binding<Bool>, isShowingInfoPane: Binding<Bool>,
searchText: Binding<String> searchText: Binding<String>
) -> some View { ) -> some View {
self.modifier( self.modifier(
MainToolbarModifier( MainToolbarModifier(
category: category, category: category,
isInstalledOnly: isInstalledOnly,
isShowingInfoPane: isShowingInfoPane, isShowingInfoPane: isShowingInfoPane,
searchText: searchText searchText: searchText
) )

View file

@ -2,14 +2,16 @@ import Foundation
enum XcodeListCategory: String, CaseIterable, Identifiable, CustomStringConvertible { enum XcodeListCategory: String, CaseIterable, Identifiable, CustomStringConvertible {
case all case all
case installed case release
case beta
var id: Self { self } var id: Self { self }
var description: String { var description: String {
switch self { switch self {
case .all: return "All" case .all: return "All"
case .installed: return "Installed" case .release: return "Release"
case .beta: return "Beta"
} }
} }
} }

View file

@ -7,11 +7,13 @@ struct XcodeListView: View {
@Binding var selectedXcodeID: Xcode.ID? @Binding var selectedXcodeID: Xcode.ID?
private let searchText: String private let searchText: String
private let category: XcodeListCategory private let category: XcodeListCategory
private let isInstalledOnly: Bool
init(selectedXcodeID: Binding<Xcode.ID?>, searchText: String, category: XcodeListCategory) { init(selectedXcodeID: Binding<Xcode.ID?>, searchText: String, category: XcodeListCategory, isInstalledOnly: Bool) {
self._selectedXcodeID = selectedXcodeID self._selectedXcodeID = selectedXcodeID
self.searchText = searchText self.searchText = searchText
self.category = category self.category = category
self.isInstalledOnly = isInstalledOnly
} }
var visibleXcodes: [Xcode] { var visibleXcodes: [Xcode] {
@ -19,14 +21,20 @@ struct XcodeListView: View {
switch category { switch category {
case .all: case .all:
xcodes = appState.allXcodes xcodes = appState.allXcodes
case .installed: case .release:
xcodes = appState.allXcodes.filter { $0.installState.installed } xcodes = appState.allXcodes.filter { $0.version.isNotPrerelease }
case .beta:
xcodes = appState.allXcodes.filter { $0.version.isPrerelease }
} }
if !searchText.isEmpty { if !searchText.isEmpty {
xcodes = xcodes.filter { $0.description.contains(searchText) } xcodes = xcodes.filter { $0.description.contains(searchText) }
} }
if isInstalledOnly {
xcodes = xcodes.filter { $0.installState.installed }
}
return xcodes return xcodes
} }
@ -40,7 +48,7 @@ struct XcodeListView: View {
struct XcodeListView_Previews: PreviewProvider { struct XcodeListView_Previews: PreviewProvider {
static var previews: some View { static var previews: some View {
Group { Group {
XcodeListView(selectedXcodeID: .constant(nil), searchText: "", category: .all) XcodeListView(selectedXcodeID: .constant(nil), searchText: "", category: .all, isInstalledOnly: false)
.environmentObject({ () -> AppState in .environmentObject({ () -> AppState in
let a = AppState() let a = AppState()
a.allXcodes = [ a.allXcodes = [