// AppearancePrefsView.swift // Tusker // // Created by Shadowfacts on 6/13/19. // Copyright © 2019 Shadowfacts. All rights reserved. // import SwiftUI import Combine struct AppearancePrefsView : View { @ObservedObject var preferences = Preferences.shared private var appearanceChangePublisher: some Publisher { preferences.$theme .map { _ in () } .merge(with: preferences.$pureBlackDarkMode.map { _ in () }, preferences.$accentColor.map { _ in () } ) // the prefrence publishers are all willSet, but want to notify after the change, so wait one runloop iteration .receive(on: DispatchQueue.main) } private var useCircularAvatars: Binding = Binding(get: { Preferences.shared.avatarStyle == .circle }) { Preferences.shared.avatarStyle = $0 ? .circle : .roundRect } var body: some View { List { themeSection accountsSection postsSection } .listStyle(.insetGrouped) .appGroupedScrollBackgroundIfAvailable() .navigationBarTitle(Text("Appearance")) } private var themeSection: some View { Section { Picker(selection: $preferences.theme, label: Text("Theme")) { Text("Use System Theme").tag(UIUserInterfaceStyle.unspecified) Text("Light").tag(UIUserInterfaceStyle.light) Text("Dark").tag(UIUserInterfaceStyle.dark) } Toggle(isOn: $preferences.pureBlackDarkMode) { Text("Pure Black Dark Mode") } Picker(selection: $preferences.accentColor, label: Text("Accent Color")) { ForEach(Preferences.AccentColor.allCases, id: \.rawValue) { color in HStack { Text(color.name) if let color = color.color { Spacer() Image(uiImage: UIImage(systemName: "circle.fill")!.withTintColor(color, renderingMode: .alwaysTemplate).withRenderingMode(.alwaysOriginal)) } } .tag(color) } } } .onReceive(appearanceChangePublisher) { _ in NotificationCenter.default.post(name: .themePreferenceChanged, object: nil) } .listRowBackground(Color.appGroupedCellBackground) } private var accountsSection: some View { Section(header: Text("Accounts")) { Toggle(isOn: useCircularAvatars) { Text("Use Circular Avatars") } Toggle(isOn: $preferences.hideCustomEmojiInUsernames) { Text("Hide Custom Emoji in Usernames") } } .listRowBackground(Color.appGroupedCellBackground) } private var postsSection: some View { Section(header: Text("Posts")) { Toggle(isOn: $preferences.showIsStatusReplyIcon) { Text("Show Status Reply Icons") } Toggle(isOn: $preferences.alwaysShowStatusVisibilityIcon) { Text("Always Show Status Visibility Icons") } Toggle(isOn: $preferences.hideActionsInTimeline) { Text("Hide Actions on Timeline") } Toggle(isOn: $preferences.showLinkPreviews) { Text("Show Link Previews") } NavigationLink("Leading Swipe Actions") { SwipeActionsPrefsView(selection: $preferences.leadingStatusSwipeActions) .edgesIgnoringSafeArea(.all) .navigationTitle("Leading Swipe Actions") } NavigationLink("Trailing Swipe Actions") { SwipeActionsPrefsView(selection: $preferences.trailingStatusSwipeActions) .edgesIgnoringSafeArea(.all) .navigationTitle("Trailing Swipe Actions") } } .listRowBackground(Color.appGroupedCellBackground) } } #if DEBUG struct AppearancePrefsView_Previews : PreviewProvider { static var previews: some View { AppearancePrefsView() } } #endif