// Copyright (C) 2024 Rubén Beltrán del Río // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see https://map.tranquil.systems. import SwiftUI struct EditorPreferencesView: View { @AppStorage("useSmartEditor") private var useSmartEditor = UserPreferences.Defaults.useSmartEditor @AppStorage("useCustomEditorFont") private var useCustomEditorFont = UserPreferences.Defaults .useCustomEditorFont @AppStorage("customEditorFontName") private var customEditorFontName = UserPreferences.Defaults .customEditorFontName @AppStorage("editorFontSize") private var editorFontSize: Double = UserPreferences.Defaults .editorFontSize var monospacedFonts: [String] { let fontManager = NSFontManager.shared let monospaceTrait = NSFontTraitMask.fixedPitchFontMask return fontManager.availableFontFamilies.filter { familyName in let members = fontManager.availableMembers(ofFontFamily: familyName) ?? [] return members.contains { member in if let traits = member[3] as? NSNumber { return NSFontTraitMask(rawValue: traits.uintValue).contains(monospaceTrait) } return false } } } var body: some View { VStack(alignment: .center, spacing: Dimensions.Spacing.loose) { HStack(alignment: .center, spacing: Dimensions.Spacing.regular) { Button(action: { if editorFontSize > 7 { editorFontSize -= 1 } }) { Image(systemName: "textformat.size.smaller") } .buttonStyle(BorderlessButtonStyle()) .disabled(editorFontSize <= 7) .help("preferences.editor.font_size.decrease.help") Slider(value: $editorFontSize, in: 7...21, step: 1) .frame(width: 250) Button(action: { if editorFontSize < 21 { editorFontSize += 1 } }) { Image(systemName: "textformat.size.larger") } .buttonStyle(BorderlessButtonStyle()) .disabled(editorFontSize >= 21) .help("preferences.editor.font_size.increase.help") } Divider() HStack(alignment: .firstTextBaseline, spacing: Dimensions.Spacing.regular) { Text("preferences.editor.editor_style.title") .font(.Theme.Body.emphasized) .frame(maxWidth: 250, alignment: .trailing) VStack(alignment: .leading, spacing: Dimensions.Spacing.cozy) { Toggle( isOn: $useCustomEditorFont, label: { Text("preferences.editor.editor_style.use_custom_font") .font(.Theme.Body.regular) }) Picker("", selection: $customEditorFontName) { ForEach(monospacedFonts, id: \.self) { fontFamily in Text(fontFamily).tag(fontFamily) } } .pickerStyle(MenuPickerStyle()) .frame(maxWidth: 250) .padding(.leading, -Dimensions.Spacing.regular) .disabled(!useCustomEditorFont) } .frame(maxWidth: .infinity, alignment: .leading) } /* Disabled because we haven't written the smart editor yet. Call it aspirational preferences. Divider() HStack(alignment: .firstTextBaseline, spacing: Dimensions.Spacing.regular) { Text("preferences.editor.smart_editor.title") .font(.Theme.Body.emphasized) .frame(maxWidth: 250, alignment: .trailing) VStack(alignment: .leading, spacing: Dimensions.Spacing.cozy) { Toggle( String(localized: "preferences.editor.smart_editor.enabled"), isOn: $useSmartEditor) } .frame(maxWidth: .infinity, alignment: .leading) } */ Spacer() }.padding(.vertical, Dimensions.Spacing.loose) .padding(.horizontal, Dimensions.Spacing.indulgent) } } #Preview { EditorPreferencesView() }