mirror of
https://github.com/XcodesOrg/XcodesApp.git
synced 2026-03-25 08:55:46 +00:00
Merge pull request #153 from Binlogo/version-filter
Add new filter for Release or Beta versions
This commit is contained in:
commit
c52f742556
4 changed files with 58 additions and 12 deletions
|
|
@ -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
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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<XcodeListCategory>,
|
||||
isInstalledOnly: Binding<Bool>,
|
||||
isShowingInfoPane: Binding<Bool>,
|
||||
searchText: Binding<String>
|
||||
) -> some View {
|
||||
self.modifier(
|
||||
MainToolbarModifier(
|
||||
category: category,
|
||||
isInstalledOnly: isInstalledOnly,
|
||||
isShowingInfoPane: isShowingInfoPane,
|
||||
searchText: searchText
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<Xcode.ID?>, searchText: String, category: XcodeListCategory) {
|
||||
init(selectedXcodeID: Binding<Xcode.ID?>, 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 = xcodes.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 = [
|
||||
|
|
|
|||
Loading…
Reference in a new issue