vChewing-macOS/Source/Modules/UIModules/PrefUI/suiPrefPaneGeneral.swift

209 lines
8.9 KiB
Swift

// (c) 2021 and onwards The vChewing Project (MIT-NTL License).
// ====================
// This code is released under the MIT license (SPDX-License-Identifier: MIT)
// ... with NTL restriction stating that:
// No trademark license is granted to use the trade names, trademarks, service
// marks, or product names of Contributor, except as required to fulfill notice
// requirements defined in MIT License.
import Preferences
import Shared
import SwiftUI
@available(macOS 10.15, *)
struct suiPrefPaneGeneral: View {
@State private var selCandidateUIFontSize = UserDefaults.standard.integer(
forKey: UserDef.kCandidateListTextSize.rawValue)
@State private var selUILanguage: [String] =
Shared.arrSupportedLocales.contains(
((UserDefaults.standard.object(forKey: UserDef.kAppleLanguages.rawValue) == nil)
? ["auto"] : UserDefaults.standard.array(forKey: UserDef.kAppleLanguages.rawValue) as? [String] ?? ["auto"])[0])
? ((UserDefaults.standard.object(forKey: UserDef.kAppleLanguages.rawValue) == nil)
? ["auto"] : UserDefaults.standard.array(forKey: UserDef.kAppleLanguages.rawValue) as? [String] ?? ["auto"])
: ["auto"]
@State private var selEnableHorizontalCandidateLayout = UserDefaults.standard.bool(
forKey: UserDef.kUseHorizontalCandidateList.rawValue)
@State private var selShowPageButtonsInCandidateUI = UserDefaults.standard.bool(
forKey: UserDef.kShowPageButtonsInCandidateWindow.rawValue)
@State private var selEnableKanjiConvToKangXi = UserDefaults.standard.bool(
forKey: UserDef.kChineseConversionEnabled.rawValue)
@State private var selEnableKanjiConvToJIS = UserDefaults.standard.bool(
forKey: UserDef.kShiftJISShinjitaiOutputEnabled.rawValue)
@State private var selShowHanyuPinyinInCompositionBuffer = UserDefaults.standard.bool(
forKey: UserDef.kShowHanyuPinyinInCompositionBuffer.rawValue)
@State private var selInlineDumpPinyinInLieuOfZhuyin = UserDefaults.standard.bool(
forKey: UserDef.kInlineDumpPinyinInLieuOfZhuyin.rawValue)
@State private var selEnableFartSuppressor = UserDefaults.standard.bool(
forKey: UserDef.kShouldNotFartInLieuOfBeep.rawValue)
@State private var selEnableAutoUpdateCheck = UserDefaults.standard.bool(
forKey: UserDef.kCheckUpdateAutomatically.rawValue)
@State private var selEnableDebugMode = UserDefaults.standard.bool(forKey: UserDef.kIsDebugModeEnabled.rawValue)
private let contentMaxHeight: Double = 440
private let contentWidth: Double = {
switch PrefMgr.shared.appleLanguages[0] {
case "ja":
return 520
default:
if PrefMgr.shared.appleLanguages[0].contains("zh-Han") {
return 480
} else {
return 580
}
}
}()
var body: some View {
ScrollView {
Preferences.Container(contentWidth: contentWidth) {
Preferences.Section(label: { Text(LocalizedStringKey("Candidate Size:")) }) {
Picker(
"",
selection: $selCandidateUIFontSize.onChange {
PrefMgr.shared.candidateListTextSize = Double(selCandidateUIFontSize)
}
) {
Group {
Text("12").tag(12)
Text("14").tag(14)
Text("16").tag(16)
Text("17").tag(17)
Text("18").tag(18)
Text("20").tag(20)
Text("22").tag(22)
Text("24").tag(24)
}
Group {
Text("32").tag(32)
Text("64").tag(64)
Text("96").tag(96)
}
}
.labelsHidden()
.frame(width: 120.0)
Text(LocalizedStringKey("Choose candidate font size for better visual clarity."))
.preferenceDescription()
}
Preferences.Section(label: { Text(LocalizedStringKey("UI Language:")) }) {
Picker(
LocalizedStringKey("Follow OS settings"),
selection: $selUILanguage.onChange {
vCLog(selUILanguage[0])
if selUILanguage == PrefMgr.shared.appleLanguages
|| (selUILanguage[0] == "auto"
&& UserDefaults.standard.object(forKey: UserDef.kAppleLanguages.rawValue) == nil)
{
return
}
if selUILanguage[0] != "auto" {
PrefMgr.shared.appleLanguages = selUILanguage
} else {
UserDefaults.standard.removeObject(forKey: UserDef.kAppleLanguages.rawValue)
}
NSLog("vChewing App self-terminated due to UI language change.")
NSApplication.shared.terminate(nil)
}
) {
Text(LocalizedStringKey("Follow OS settings")).tag(["auto"])
Text(LocalizedStringKey("Simplified Chinese")).tag(["zh-Hans"])
Text(LocalizedStringKey("Traditional Chinese")).tag(["zh-Hant"])
Text(LocalizedStringKey("Japanese")).tag(["ja"])
Text(LocalizedStringKey("English")).tag(["en"])
}
.labelsHidden()
.frame(width: 180.0)
Text(LocalizedStringKey("Change user interface language (will reboot the IME)."))
.preferenceDescription()
}
Preferences.Section(label: { Text(LocalizedStringKey("Candidate Layout:")) }) {
Picker(
"",
selection: $selEnableHorizontalCandidateLayout.onChange {
PrefMgr.shared.useHorizontalCandidateList = selEnableHorizontalCandidateLayout
}
) {
Text(LocalizedStringKey("Vertical")).tag(false)
Text(LocalizedStringKey("Horizontal")).tag(true)
}
.labelsHidden()
.horizontalRadioGroupLayout()
.pickerStyle(RadioGroupPickerStyle())
.disabled(!PrefMgr.shared.useIMKCandidateWindow)
if PrefMgr.shared.useIMKCandidateWindow {
Text(LocalizedStringKey("Choose your preferred layout of the candidate window."))
.preferenceDescription()
} else {
Text(
LocalizedStringKey(
"Tadokoro candidate window only supports horizontal grid view. Enable IMK candidate window in DevZone page first if you want to choose vertical candidate window."
)
)
.preferenceDescription()
}
}
Preferences.Section(label: { Text(LocalizedStringKey("Output Settings:")) }) {
Toggle(
LocalizedStringKey("Auto-convert traditional Chinese glyphs to KangXi characters"),
isOn: $selEnableKanjiConvToKangXi.onChange {
PrefMgr.shared.chineseConversionEnabled = selEnableKanjiConvToKangXi
selEnableKanjiConvToJIS = PrefMgr.shared.shiftJISShinjitaiOutputEnabled
}
)
Toggle(
LocalizedStringKey("Auto-convert traditional Chinese glyphs to JIS Shinjitai characters"),
isOn: $selEnableKanjiConvToJIS.onChange {
PrefMgr.shared.shiftJISShinjitaiOutputEnabled = selEnableKanjiConvToJIS
selEnableKanjiConvToKangXi = PrefMgr.shared.chineseConversionEnabled
}
)
Toggle(
LocalizedStringKey("Show Hanyu-Pinyin in the inline composition buffer"),
isOn: $selShowHanyuPinyinInCompositionBuffer.onChange {
PrefMgr.shared.showHanyuPinyinInCompositionBuffer = selShowHanyuPinyinInCompositionBuffer
}
)
Toggle(
LocalizedStringKey("Commit Hanyu-Pinyin instead on Ctrl(+Option)+Command+Enter"),
isOn: $selInlineDumpPinyinInLieuOfZhuyin.onChange {
PrefMgr.shared.inlineDumpPinyinInLieuOfZhuyin = selInlineDumpPinyinInLieuOfZhuyin
}
)
Toggle(
LocalizedStringKey("Stop farting (when typed phonetic combination is invalid, etc.)"),
isOn: $selEnableFartSuppressor.onChange {
PrefMgr.shared.shouldNotFartInLieuOfBeep = selEnableFartSuppressor
IMEApp.buzz()
}
)
}
Preferences.Section(label: { Text(LocalizedStringKey("Misc Settings:")).controlSize(.small) }) {
Toggle(
LocalizedStringKey("Check for updates automatically"),
isOn: $selEnableAutoUpdateCheck.onChange {
PrefMgr.shared.checkUpdateAutomatically = selEnableAutoUpdateCheck
}
)
.controlSize(.small)
Toggle(
LocalizedStringKey("Debug Mode"),
isOn: $selEnableDebugMode.onChange {
PrefMgr.shared.isDebugModeEnabled = selEnableDebugMode
}
)
.controlSize(.small)
}
}
}
.frame(maxHeight: contentMaxHeight).fixedSize(horizontal: false, vertical: true)
.background(VisualEffectView(material: .sidebar, blendingMode: .behindWindow))
}
}
@available(macOS 11.0, *)
struct suiPrefPaneGeneral_Previews: PreviewProvider {
static var previews: some View {
suiPrefPaneGeneral()
}
}