From 1d0c47a1bd6bd89c6ffb708919c12fc9db37bc50 Mon Sep 17 00:00:00 2001 From: Stuart Breckenridge Date: Wed, 5 Aug 2020 11:45:24 +0800 Subject: [PATCH 1/2] Changes Preferences to use TabBar This appears to crash when selecting a different pane. --- .../Preferences/MacPreferencesView.swift | 122 ++++++++---------- 1 file changed, 57 insertions(+), 65 deletions(-) diff --git a/Multiplatform/macOS/Preferences/MacPreferencesView.swift b/Multiplatform/macOS/Preferences/MacPreferencesView.swift index 3a35ab725..f4676f6d2 100644 --- a/Multiplatform/macOS/Preferences/MacPreferencesView.swift +++ b/Multiplatform/macOS/Preferences/MacPreferencesView.swift @@ -30,74 +30,66 @@ enum PreferencePane: Int, CaseIterable { struct MacPreferencesView: View { @EnvironmentObject var defaults: AppDefaults - @State private var preferencePane: PreferencePane = .general + @State private var selectedPane: PreferencePane = .general var body: some View { - VStack { - switch preferencePane { - case .general: - GeneralPreferencesView() - .environmentObject(defaults) - case .accounts: - AccountsPreferencesView() - .environmentObject(defaults) - case .viewing: - LayoutPreferencesView() - .environmentObject(defaults) - case .advanced: - AdvancedPreferencesView() - .environmentObject(defaults) - } - } - .toolbar { - ToolbarItem { - HStack { - Button(action: { - preferencePane = .general - }, label: { - VStack { - Image(systemName: "gearshape") - .font(.title2) - Text("General") - }.foregroundColor( - preferencePane == .general ? Color("AccentColor") : Color.gray - ) - }).frame(width: 70, height: 50) - Button(action: { - preferencePane = .accounts - }, label: { - VStack { - Image(systemName: "at") - .font(.title2) - Text("Accounts") - }.foregroundColor( - preferencePane == .accounts ? Color("AccentColor") : Color.gray - ) - }).frame(width: 70, height: 50) - Button(action: { - preferencePane = .viewing - }, label: { - VStack { - Image(systemName: "eyeglasses") - .font(.title2) - Text("Viewing") - }.foregroundColor( - preferencePane == .viewing ? Color("AccentColor") : Color.gray - ) - }).frame(width: 70, height: 50) - Button(action: { - preferencePane = .advanced - }, label: { - VStack { - Image(systemName: "scale.3d") - .font(.title2) - Text("Advanced") - }.foregroundColor( - preferencePane == .advanced ? Color("AccentColor") : Color.gray - ) - }).frame(width: 70, height: 50) + TabView(selection: $selectedPane) { + GeneralPreferencesView() + .environmentObject(defaults) + .tabItem { + VStack { + Image(systemName: "gearshape") + .font(.title2) + Text("General") + } } - } + .onTapGesture { + selectedPane = .general + } + .tag(PreferencePane.general) + + + AccountsPreferencesView() + .environmentObject(defaults) + .tabItem { + VStack { + Image(systemName: "at") + .font(.title2) + Text("Accounts") + } + } + .onTapGesture { + selectedPane = .accounts + } + .tag(PreferencePane.accounts) + + LayoutPreferencesView() + .environmentObject(defaults) + .tabItem { + VStack { + Image(systemName: "eyeglasses") + .font(.title2) + Text("Viewing") + } + } + .onTapGesture { + selectedPane = .viewing + } + .tag(PreferencePane.viewing) + + AdvancedPreferencesView() + .environmentObject(defaults) + .tabItem { + VStack { + Image(systemName: "scale.3d") + .font(.title2) + Text("Advanced") + } + } + .onTapGesture { + selectedPane = .advanced + } + .tag(PreferencePane.advanced) } } From cd8c32055bc452e16b23708a11f0a6aa82e6999e Mon Sep 17 00:00:00 2001 From: Stuart Breckenridge Date: Wed, 5 Aug 2020 20:06:44 +0800 Subject: [PATCH 2/2] Resolves crash when switching between panes --- Multiplatform/Shared/MainApp.swift | 42 ++++++- .../Preferences/MacPreferencePanes.swift | 28 +++++ .../Preferences/MacPreferencesView.swift | 105 ------------------ .../Advanced/AdvancedPreferencesView.swift | 2 +- .../General/GeneralPreferencesView.swift | 2 +- .../Viewing/LayoutPreferencesView.swift | 2 +- NetNewsWire.xcodeproj/project.pbxproj | 8 +- 7 files changed, 71 insertions(+), 118 deletions(-) create mode 100644 Multiplatform/macOS/Preferences/MacPreferencePanes.swift delete mode 100644 Multiplatform/macOS/Preferences/MacPreferencesView.swift diff --git a/Multiplatform/Shared/MainApp.swift b/Multiplatform/Shared/MainApp.swift index 58ec7f342..5b1f7a603 100644 --- a/Multiplatform/Shared/MainApp.swift +++ b/Multiplatform/Shared/MainApp.swift @@ -13,6 +13,7 @@ struct MainApp: App { #if os(macOS) @NSApplicationDelegateAdaptor(AppDelegate.self) private var delegate + @State private var selectedPane: MacPreferencePane = .general #endif #if os(iOS) @UIApplicationDelegateAdaptor(AppDelegate.self) private var delegate @@ -20,7 +21,7 @@ struct MainApp: App { @StateObject private var refreshProgress = RefreshProgressModel() @StateObject private var defaults = AppDefaults.shared - + @SceneBuilder var body: some Scene { #if os(macOS) WindowGroup { @@ -76,12 +77,41 @@ struct MainApp: App { // Mac Preferences Settings { - MacPreferencesView() - .padding() + TabView(selection: $selectedPane) { + GeneralPreferencesView() + .tabItem { + Image(systemName: "gearshape") + .font(.title2) + Text("General") + } + .tag(MacPreferencePane.general) + + AccountsPreferencesView() + .tabItem { + Image(systemName: "at") + .font(.title2) + Text("Accounts") + } + .tag(MacPreferencePane.accounts) + + LayoutPreferencesView() + .tabItem { + Image(systemName: "eyeglasses") + .font(.title2) + Text("Viewing") + } + .tag(MacPreferencePane.viewing) + + AdvancedPreferencesView() + .tabItem { + Image(systemName: "scale.3d") + .font(.title2) + Text("Advanced") + } + .tag(MacPreferencePane.advanced) + } .frame(width: 500) - .navigationTitle("Preferences") - .environmentObject(defaults) - .preferredColorScheme(AppDefaults.userInterfaceColorScheme) + .padding() } #endif diff --git a/Multiplatform/macOS/Preferences/MacPreferencePanes.swift b/Multiplatform/macOS/Preferences/MacPreferencePanes.swift new file mode 100644 index 000000000..6a5624365 --- /dev/null +++ b/Multiplatform/macOS/Preferences/MacPreferencePanes.swift @@ -0,0 +1,28 @@ +// +// MacPreferencesView.swift +// macOS +// +// Created by Stuart Breckenridge on 27/6/20. +// + +import SwiftUI + +enum MacPreferencePane: Int, CaseIterable { + case general = 1 + case accounts = 2 + case viewing = 3 + case advanced = 4 + + var description: String { + switch self { + case .general: + return "General" + case .accounts: + return "Accounts" + case .viewing: + return "Appearance" + case .advanced: + return "Advanced" + } + } +} diff --git a/Multiplatform/macOS/Preferences/MacPreferencesView.swift b/Multiplatform/macOS/Preferences/MacPreferencesView.swift deleted file mode 100644 index f4676f6d2..000000000 --- a/Multiplatform/macOS/Preferences/MacPreferencesView.swift +++ /dev/null @@ -1,105 +0,0 @@ -// -// MacPreferencesView.swift -// macOS -// -// Created by Stuart Breckenridge on 27/6/20. -// - -import SwiftUI - -enum PreferencePane: Int, CaseIterable { - case general = 0 - case accounts = 1 - case viewing = 2 - case advanced = 3 - - var description: String { - switch self { - case .general: - return "General" - case .accounts: - return "Accounts" - case .viewing: - return "Appearance" - case .advanced: - return "Advanced" - } - } -} - -struct MacPreferencesView: View { - - @EnvironmentObject var defaults: AppDefaults - @State private var selectedPane: PreferencePane = .general - - var body: some View { - TabView(selection: $selectedPane) { - GeneralPreferencesView() - .environmentObject(defaults) - .tabItem { - VStack { - Image(systemName: "gearshape") - .font(.title2) - Text("General") - } - } - .onTapGesture { - selectedPane = .general - } - .tag(PreferencePane.general) - - - AccountsPreferencesView() - .environmentObject(defaults) - .tabItem { - VStack { - Image(systemName: "at") - .font(.title2) - Text("Accounts") - } - } - .onTapGesture { - selectedPane = .accounts - } - .tag(PreferencePane.accounts) - - LayoutPreferencesView() - .environmentObject(defaults) - .tabItem { - VStack { - Image(systemName: "eyeglasses") - .font(.title2) - Text("Viewing") - } - } - .onTapGesture { - selectedPane = .viewing - } - .tag(PreferencePane.viewing) - - AdvancedPreferencesView() - .environmentObject(defaults) - .tabItem { - VStack { - Image(systemName: "scale.3d") - .font(.title2) - Text("Advanced") - } - } - .onTapGesture { - selectedPane = .advanced - } - .tag(PreferencePane.advanced) - } - - } -} - - - - -struct MacPreferencesView_Previews: PreviewProvider { - static var previews: some View { - MacPreferencesView() - } -} diff --git a/Multiplatform/macOS/Preferences/Preference Panes/Advanced/AdvancedPreferencesView.swift b/Multiplatform/macOS/Preferences/Preference Panes/Advanced/AdvancedPreferencesView.swift index 7159341b5..44e93770b 100644 --- a/Multiplatform/macOS/Preferences/Preference Panes/Advanced/AdvancedPreferencesView.swift +++ b/Multiplatform/macOS/Preferences/Preference Panes/Advanced/AdvancedPreferencesView.swift @@ -9,7 +9,7 @@ import SwiftUI struct AdvancedPreferencesView: View { - @EnvironmentObject private var preferences: AppDefaults + @StateObject private var preferences = AppDefaults.shared @StateObject private var viewModel = AdvancedPreferencesModel() var body: some View { diff --git a/Multiplatform/macOS/Preferences/Preference Panes/General/GeneralPreferencesView.swift b/Multiplatform/macOS/Preferences/Preference Panes/General/GeneralPreferencesView.swift index d32441432..3d88312c1 100644 --- a/Multiplatform/macOS/Preferences/Preference Panes/General/GeneralPreferencesView.swift +++ b/Multiplatform/macOS/Preferences/Preference Panes/General/GeneralPreferencesView.swift @@ -9,7 +9,7 @@ import SwiftUI struct GeneralPreferencesView: View { - @EnvironmentObject private var defaults: AppDefaults + @StateObject private var defaults = AppDefaults.shared @StateObject private var preferences = GeneralPreferencesModel() var body: some View { diff --git a/Multiplatform/macOS/Preferences/Preference Panes/Viewing/LayoutPreferencesView.swift b/Multiplatform/macOS/Preferences/Preference Panes/Viewing/LayoutPreferencesView.swift index 0d7e0cc95..b5c1f72e6 100644 --- a/Multiplatform/macOS/Preferences/Preference Panes/Viewing/LayoutPreferencesView.swift +++ b/Multiplatform/macOS/Preferences/Preference Panes/Viewing/LayoutPreferencesView.swift @@ -10,7 +10,7 @@ import SwiftUI struct LayoutPreferencesView: View { - @EnvironmentObject var defaults: AppDefaults + @StateObject private var defaults = AppDefaults.shared private let colorPalettes = UserInterfaceColorPalette.allCases private let sampleTitle = "Lorem dolor sed viverra ipsum. Gravida rutrum quisque non tellus. Rutrum tellus pellentesque eu tincidunt tortor. Sed blandit libero volutpat sed cras ornare. Et netus et malesuada fames ac. Ultrices eros in cursus turpis massa tincidunt dui ut ornare. Lacus sed viverra tellus in. Sollicitudin ac orci phasellus egestas. Purus in mollis nunc sed. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Interdum consectetur libero id faucibus nisl tincidunt eget." diff --git a/NetNewsWire.xcodeproj/project.pbxproj b/NetNewsWire.xcodeproj/project.pbxproj index d82338d49..58c625753 100644 --- a/NetNewsWire.xcodeproj/project.pbxproj +++ b/NetNewsWire.xcodeproj/project.pbxproj @@ -19,7 +19,7 @@ 1729529324AA1CAA00D65E66 /* AccountsPreferencesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1729529024AA1CAA00D65E66 /* AccountsPreferencesView.swift */; }; 1729529424AA1CAA00D65E66 /* AdvancedPreferencesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1729529124AA1CAA00D65E66 /* AdvancedPreferencesView.swift */; }; 1729529524AA1CAA00D65E66 /* GeneralPreferencesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1729529224AA1CAA00D65E66 /* GeneralPreferencesView.swift */; }; - 1729529724AA1CD000D65E66 /* MacPreferencesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1729529624AA1CD000D65E66 /* MacPreferencesView.swift */; }; + 1729529724AA1CD000D65E66 /* MacPreferencePanes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1729529624AA1CD000D65E66 /* MacPreferencePanes.swift */; }; 1729529B24AA1FD200D65E66 /* MacSearchField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1729529A24AA1FD200D65E66 /* MacSearchField.swift */; }; 175942AA24AD533200585066 /* RefreshInterval.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5183CCE4226F4DFA0010922C /* RefreshInterval.swift */; }; 175942AB24AD533200585066 /* RefreshInterval.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5183CCE4226F4DFA0010922C /* RefreshInterval.swift */; }; @@ -1395,7 +1395,7 @@ 1729529024AA1CAA00D65E66 /* AccountsPreferencesView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountsPreferencesView.swift; sourceTree = ""; }; 1729529124AA1CAA00D65E66 /* AdvancedPreferencesView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AdvancedPreferencesView.swift; sourceTree = ""; }; 1729529224AA1CAA00D65E66 /* GeneralPreferencesView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneralPreferencesView.swift; sourceTree = ""; }; - 1729529624AA1CD000D65E66 /* MacPreferencesView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MacPreferencesView.swift; sourceTree = ""; }; + 1729529624AA1CD000D65E66 /* MacPreferencePanes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MacPreferencePanes.swift; sourceTree = ""; }; 1729529A24AA1FD200D65E66 /* MacSearchField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MacSearchField.swift; sourceTree = ""; }; 1769E32124BC5925000E1E8E /* AccountsPreferencesModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountsPreferencesModel.swift; sourceTree = ""; }; 1769E32424BC5A65000E1E8E /* AddAccountView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddAccountView.swift; sourceTree = ""; }; @@ -2100,7 +2100,7 @@ 1729528F24AA1A4F00D65E66 /* Preferences */ = { isa = PBXGroup; children = ( - 1729529624AA1CD000D65E66 /* MacPreferencesView.swift */, + 1729529624AA1CD000D65E66 /* MacPreferencePanes.swift */, 1729529924AA1CE100D65E66 /* Preference Panes */, ); path = Preferences; @@ -4571,7 +4571,7 @@ 51E4995B24A875D500B667CB /* ArticlePasteboardWriter.swift in Sources */, 51E4993424A867E700B667CB /* UserInfoKey.swift in Sources */, 1776E88F24AC5F8A00E78166 /* AppDefaults.swift in Sources */, - 1729529724AA1CD000D65E66 /* MacPreferencesView.swift in Sources */, + 1729529724AA1CD000D65E66 /* MacPreferencePanes.swift in Sources */, 51E4994C24A8734C00B667CB /* RedditFeedProvider-Extensions.swift in Sources */, 1729529324AA1CAA00D65E66 /* AccountsPreferencesView.swift in Sources */, 171BCB8D24CB08A3006E22D9 /* FixAccountCredentialView.swift in Sources */,