move download settings to own PreferencePane

This commit is contained in:
Leon Wolf 2022-10-05 21:06:02 +02:00
parent 13e829ca88
commit 0e7deed1c6
3 changed files with 96 additions and 69 deletions

View file

@ -4,19 +4,16 @@ import Path
struct AdvancedPreferencePane: View { struct AdvancedPreferencePane: View {
@EnvironmentObject var appState: AppState @EnvironmentObject var appState: AppState
@AppStorage("dataSource") var dataSource: DataSource = .xcodeReleases
@AppStorage("downloader") var downloader: Downloader = .aria2
var body: some View { var body: some View {
VStack(alignment: .leading, spacing: 20) { VStack(alignment: .leading, spacing: 20) {
GroupBox(label: Text("InstallDirectory")) { GroupBox(label: Text("InstallDirectory")) {
VStack(alignment: .leading) { VStack(alignment: .leading) {
HStack(alignment: .top, spacing: 5) { HStack(alignment: .top, spacing: 5) {
Text(appState.installPath).font(.footnote) Text(appState.installPath).font(.footnote)
.fixedSize(horizontal: false, vertical: true) .fixedSize(horizontal: false, vertical: true)
.lineLimit(2) .lineLimit(2)
Button(action: { appState.reveal(path: appState.installPath) }) { Button(action: { appState.reveal(path: appState.installPath) }) {
Image(systemName: "arrow.right.circle.fill") Image(systemName: "arrow.right.circle.fill")
} }
@ -34,7 +31,7 @@ struct AdvancedPreferencePane: View {
panel.directoryURL = URL(fileURLWithPath: appState.installPath) panel.directoryURL = URL(fileURLWithPath: appState.installPath)
if panel.runModal() == .OK { if panel.runModal() == .OK {
guard let pathURL = panel.url, let path = Path(url: pathURL) else { return } guard let pathURL = panel.url, let path = Path(url: pathURL) else { return }
self.appState.installPath = path.string self.appState.installPath = path.string
} }
@ -50,8 +47,8 @@ struct AdvancedPreferencePane: View {
VStack(alignment: .leading) { VStack(alignment: .leading) {
HStack(alignment: .top, spacing: 5) { HStack(alignment: .top, spacing: 5) {
Text(appState.localPath).font(.footnote) Text(appState.localPath).font(.footnote)
.fixedSize(horizontal: false, vertical: true) .fixedSize(horizontal: false, vertical: true)
.lineLimit(2) .lineLimit(2)
Button(action: { appState.reveal(path: appState.localPath) }) { Button(action: { appState.reveal(path: appState.localPath) }) {
Image(systemName: "arrow.right.circle.fill") Image(systemName: "arrow.right.circle.fill")
} }
@ -69,7 +66,7 @@ struct AdvancedPreferencePane: View {
panel.directoryURL = URL(fileURLWithPath: appState.localPath) panel.directoryURL = URL(fileURLWithPath: appState.localPath)
if panel.runModal() == .OK { if panel.runModal() == .OK {
guard let pathURL = panel.url, let path = Path(url: pathURL) else { return } guard let pathURL = panel.url, let path = Path(url: pathURL) else { return }
self.appState.localPath = path.string self.appState.localPath = path.string
} }
@ -102,44 +99,13 @@ struct AdvancedPreferencePane: View {
Toggle("AutomaticallyCreateSymbolicLink", isOn: $appState.createSymLinkOnSelect) Toggle("AutomaticallyCreateSymbolicLink", isOn: $appState.createSymLinkOnSelect)
.disabled(appState.createSymLinkOnSelectDisabled) .disabled(appState.createSymLinkOnSelectDisabled)
Text("AutomaticallyCreateSymbolicLinkDescription") Text("AutomaticallyCreateSymbolicLinkDescription")
.font(.footnote) .font(.footnote)
.fixedSize(horizontal: false, vertical: true) .fixedSize(horizontal: false, vertical: true)
} }
.fixedSize(horizontal: false, vertical: true) .fixedSize(horizontal: false, vertical: true)
} }
.groupBoxStyle(PreferencesGroupBoxStyle()) .groupBoxStyle(PreferencesGroupBoxStyle())
GroupBox(label: Text("DataSource")) {
VStack(alignment: .leading) {
Picker("DataSource", selection: $dataSource) {
ForEach(DataSource.allCases) { dataSource in
Text(dataSource.description)
.tag(dataSource)
}
}
.labelsHidden()
AttributedText(dataSourceFootnote)
}
}
.groupBoxStyle(PreferencesGroupBoxStyle())
GroupBox(label: Text("Downloader")) {
VStack(alignment: .leading) {
Picker("Downloader", selection: $downloader) {
ForEach(Downloader.allCases) { downloader in
Text(downloader.description)
.tag(downloader)
}
}
.labelsHidden()
AttributedText(downloaderFootnote)
}
}
.groupBoxStyle(PreferencesGroupBoxStyle())
GroupBox(label: Text("PrivilegedHelper")) { GroupBox(label: Text("PrivilegedHelper")) {
VStack(alignment: .leading, spacing: 8) { VStack(alignment: .leading, spacing: 8) {
@ -168,32 +134,6 @@ struct AdvancedPreferencePane: View {
.groupBoxStyle(PreferencesGroupBoxStyle()) .groupBoxStyle(PreferencesGroupBoxStyle())
} }
} }
private var dataSourceFootnote: NSAttributedString {
let string = localizeString("DataSourceDescription")
let attributedString = NSMutableAttributedString(
string: string,
attributes: [
.font: NSFont.preferredFont(forTextStyle: .footnote, options: [:]),
.foregroundColor: NSColor.labelColor
]
)
attributedString.addAttribute(.link, value: URL(string: "https://xcodereleases.com")!, range: NSRange(string.range(of: "Xcode Releases")!, in: string))
return attributedString
}
private var downloaderFootnote: NSAttributedString {
let string = localizeString("DownloaderDescription")
let attributedString = NSMutableAttributedString(
string: string,
attributes: [
.font: NSFont.preferredFont(forTextStyle: .footnote, options: [:]),
.foregroundColor: NSColor.labelColor
]
)
attributedString.addAttribute(.link, value: URL(string: "https://github.com/aria2/aria2")!, range: NSRange(string.range(of: "aria2")!, in: string))
return attributedString
}
} }
struct AdvancedPreferencePane_Previews: PreviewProvider { struct AdvancedPreferencePane_Previews: PreviewProvider {

View file

@ -0,0 +1,82 @@
import AppleAPI
import SwiftUI
struct DownloadPreferencePane: View {
@EnvironmentObject var appState: AppState
@AppStorage("dataSource") var dataSource: DataSource = .xcodeReleases
@AppStorage("downloader") var downloader: Downloader = .aria2
var body: some View {
VStack(alignment: .leading) {
GroupBox(label: Text("DataSource")) {
VStack(alignment: .leading) {
Picker("DataSource", selection: $dataSource) {
ForEach(DataSource.allCases) { dataSource in
Text(dataSource.description)
.tag(dataSource)
}
}
.labelsHidden()
AttributedText(dataSourceFootnote)
}
}
.groupBoxStyle(PreferencesGroupBoxStyle())
GroupBox(label: Text("Downloader")) {
VStack(alignment: .leading) {
Picker("Downloader", selection: $downloader) {
ForEach(Downloader.allCases) { downloader in
Text(downloader.description)
.tag(downloader)
}
}
.labelsHidden()
AttributedText(downloaderFootnote)
}
}
.groupBoxStyle(PreferencesGroupBoxStyle())
}
}
private var dataSourceFootnote: NSAttributedString {
let string = localizeString("DataSourceDescription")
let attributedString = NSMutableAttributedString(
string: string,
attributes: [
.font: NSFont.preferredFont(forTextStyle: .footnote, options: [:]),
.foregroundColor: NSColor.labelColor
]
)
attributedString.addAttribute(.link, value: URL(string: "https://xcodereleases.com")!, range: NSRange(string.range(of: "Xcode Releases")!, in: string))
return attributedString
}
private var downloaderFootnote: NSAttributedString {
let string = localizeString("DownloaderDescription")
let attributedString = NSMutableAttributedString(
string: string,
attributes: [
.font: NSFont.preferredFont(forTextStyle: .footnote, options: [:]),
.foregroundColor: NSColor.labelColor
]
)
attributedString.addAttribute(.link, value: URL(string: "https://github.com/aria2/aria2")!, range: NSRange(string.range(of: "aria2")!, in: string))
return attributedString
}
}
struct DownloadPreferencePane_Previews: PreviewProvider {
static var previews: some View {
Group {
GeneralPreferencePane()
.environmentObject(AppState())
.frame(maxWidth: 500)
}
}
}

View file

@ -21,6 +21,11 @@ struct PreferencesView: View {
Label("Updates", systemImage: "arrow.triangle.2.circlepath.circle") Label("Updates", systemImage: "arrow.triangle.2.circlepath.circle")
} }
.tag(Tabs.updates) .tag(Tabs.updates)
DownloadPreferencePane()
.environmentObject(appState)
.tabItem {
Label("Downloads", systemImage: "icloud.and.arrow.down")
}
AdvancedPreferencePane() AdvancedPreferencePane()
.environmentObject(appState) .environmentObject(appState)
.tabItem { .tabItem {