mirror of
https://github.com/XcodesOrg/XcodesApp.git
synced 2026-04-26 14:57:37 +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
|
// 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
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 = [
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue