Migrate Appearance settings pane to SwiftUI

This commit is contained in:
1024jp 2024-02-23 23:27:52 +09:00
parent a56e5f0f68
commit e73a435009
28 changed files with 3795 additions and 4369 deletions

View File

@ -7,8 +7,7 @@
- Make the encoding priority view undoable.
- [trivial] Enable delete selected separators in the encoding priority view with the Delete key.
- [dev] Migrate General, Window, Edit, and Format settings panes to SwiftUI.
- [dev] Migrate syntax editor to SwiftUI.
- [dev] Migrate the settings window and syntax editor to SwiftUI.
### Fixes

View File

@ -48,8 +48,8 @@
2A10C5FA1FD25D04002AB5AE /* Selector+Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A10C5F91FD25D04002AB5AE /* Selector+Codable.swift */; };
2A10C5FB1FD25D04002AB5AE /* Selector+Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A10C5F91FD25D04002AB5AE /* Selector+Codable.swift */; };
2A10D10A1E708CDF0027192A /* KeyBindingTreeView.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2A10D1081E708CDF0027192A /* KeyBindingTreeView.storyboard */; };
2A10D1281E714D230027192A /* AppearancePane.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2A10D1261E714D230027192A /* AppearancePane.storyboard */; };
2A10D1381E715E5B0027192A /* SyntaxListView.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2A10D1361E715E5B0027192A /* SyntaxListView.storyboard */; };
2A10D1281E714D230027192A /* ThemeView.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2A10D1261E714D230027192A /* ThemeView.storyboard */; };
2A1125C123F180FF006A1DB2 /* LineRangeCacheableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A1125C023F180FF006A1DB2 /* LineRangeCacheableTests.swift */; };
2A1125C323F1A86B006A1DB2 /* LineRangeCacheable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A1125C223F1A86B006A1DB2 /* LineRangeCacheable.swift */; };
2A1125C423F1A86B006A1DB2 /* LineRangeCacheable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A1125C223F1A86B006A1DB2 /* LineRangeCacheable.swift */; };
@ -148,8 +148,8 @@
2A26158D2979052C008C2240 /* SyntaxObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A26158B2979052C008C2240 /* SyntaxObject.swift */; };
2A2747732111909400795954 /* String+Diff.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A2747722111909400795954 /* String+Diff.swift */; };
2A2747742111909400795954 /* String+Diff.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A2747722111909400795954 /* String+Diff.swift */; };
2A2792921D1DACC400F3FC5D /* AppearancePaneController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A2792911D1DACC400F3FC5D /* AppearancePaneController.swift */; };
2A2792931D1DACC400F3FC5D /* AppearancePaneController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A2792911D1DACC400F3FC5D /* AppearancePaneController.swift */; };
2A2792921D1DACC400F3FC5D /* ThemeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A2792911D1DACC400F3FC5D /* ThemeViewController.swift */; };
2A2792931D1DACC400F3FC5D /* ThemeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A2792911D1DACC400F3FC5D /* ThemeViewController.swift */; };
2A2792951D1DBDAC00F3FC5D /* String+Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A2792941D1DBDAC00F3FC5D /* String+Constants.swift */; };
2A2792961D1DBDAC00F3FC5D /* String+Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A2792941D1DBDAC00F3FC5D /* String+Constants.swift */; };
2A2792981D1E57DA00F3FC5D /* SyntaxListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A2792971D1E57DA00F3FC5D /* SyntaxListViewController.swift */; };
@ -175,8 +175,6 @@
2A36E36F2AF9ED0B00A73534 /* Sparkle.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 2A36E3702AF9ED0B00A73534 /* Sparkle.xcstrings */; };
2A38FAFD1D1C67050032231A /* DraggableArrayController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A38FAFC1D1C67050032231A /* DraggableArrayController.swift */; };
2A38FAFE1D1C67050032231A /* DraggableArrayController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A38FAFC1D1C67050032231A /* DraggableArrayController.swift */; };
2A39F15726F74C2500B52876 /* AccessibleStepper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A39F15626F74C2500B52876 /* AccessibleStepper.swift */; };
2A39F15826F74C2500B52876 /* AccessibleStepper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A39F15626F74C2500B52876 /* AccessibleStepper.swift */; };
2A3A19DF2068A76600516DE4 /* NSTextView+MultipleReplace.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A3A19DE2068A76600516DE4 /* NSTextView+MultipleReplace.swift */; };
2A3A19E02068A76600516DE4 /* NSTextView+MultipleReplace.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A3A19DE2068A76600516DE4 /* NSTextView+MultipleReplace.swift */; };
2A3A19E2206C9A0700516DE4 /* NSTextView+BracePair.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A3A19E1206C9A0700516DE4 /* NSTextView+BracePair.swift */; };
@ -216,8 +214,6 @@
2A476CB11D09D0500088E37A /* FontExtensionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A476CB01D09D0500088E37A /* FontExtensionTests.swift */; };
2A478F3F22BE743200AEA45E /* NSTextView+Ligature.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A478F3E22BE743200AEA45E /* NSTextView+Ligature.swift */; };
2A478F4022BE743200AEA45E /* NSTextView+Ligature.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A478F3E22BE743200AEA45E /* NSTextView+Ligature.swift */; };
2A479C821D8C15A600EEEFC2 /* CenteringTextFieldCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A479C811D8C15A600EEEFC2 /* CenteringTextFieldCell.swift */; };
2A479C831D8C15A600EEEFC2 /* CenteringTextFieldCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A479C811D8C15A600EEEFC2 /* CenteringTextFieldCell.swift */; };
2A47CD3821D340040094F62F /* NSValidatedUserInterfaceItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A47CD3721D340030094F62F /* NSValidatedUserInterfaceItem.swift */; };
2A47CD3921D340040094F62F /* NSValidatedUserInterfaceItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A47CD3721D340030094F62F /* NSValidatedUserInterfaceItem.swift */; };
2A484A39236579A7006FFD14 /* NSLayoutManager+ValidationIgnorable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A484A38236579A7006FFD14 /* NSLayoutManager+ValidationIgnorable.swift */; };
@ -323,10 +319,12 @@
2A6566E92B73BBB400008669 /* SyntaxEdit.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 2AA6E0B82B744FF300E536F8 /* SyntaxEdit.xcstrings */; };
2A657D1D2033ED6B00C2611C /* DefaultInitializable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A657D1C2033ED6B00C2611C /* DefaultInitializable.swift */; };
2A657D1E2033ED6B00C2611C /* DefaultInitializable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A657D1C2033ED6B00C2611C /* DefaultInitializable.swift */; };
2A65EC3B2B80C667008096C5 /* ThemeEditor.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 2A65EC3A2B80C667008096C5 /* ThemeEditor.xcstrings */; };
2A65EC3C2B80C667008096C5 /* ThemeEditor.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 2A65EC3A2B80C667008096C5 /* ThemeEditor.xcstrings */; };
2A65EC262B80C01B008096C5 /* FontPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A65EC252B80C01B008096C5 /* FontPicker.swift */; };
2A65EC272B80C01B008096C5 /* FontPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A65EC252B80C01B008096C5 /* FontPicker.swift */; };
2A65EC2A2B80C168008096C5 /* AppearanceSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A65EC292B80C168008096C5 /* AppearanceSettingsView.swift */; };
2A65EC2B2B80C168008096C5 /* AppearanceSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A65EC292B80C168008096C5 /* AppearanceSettingsView.swift */; };
2A65EC3B2B80C667008096C5 /* ThemeEditor.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 2A65EC3A2B80C667008096C5 /* ThemeEditor.xcstrings */; };
2A65EC3C2B80C667008096C5 /* ThemeEditor.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 2A65EC3A2B80C667008096C5 /* ThemeEditor.xcstrings */; };
2A6602D01D05BD72003E8D87 /* StatusBar.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2A6602CE1D05BD72003E8D87 /* StatusBar.storyboard */; };
2A685F6A2027729000A130A4 /* NSAppleEventManager+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A685F692027729000A130A4 /* NSAppleEventManager+Additions.swift */; };
2A685F6B2027729000A130A4 /* NSAppleEventManager+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A685F692027729000A130A4 /* NSAppleEventManager+Additions.swift */; };
@ -592,8 +590,6 @@
2AC186DE1E2F4264002F4D27 /* Debug.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AC186DC1E2F4264002F4D27 /* Debug.swift */; };
2AC2462E1D1BC70C00E46CFA /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AC2462D1D1BC70C00E46CFA /* AppDelegate.swift */; };
2AC2462F1D1BC70C00E46CFA /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AC2462D1D1BC70C00E46CFA /* AppDelegate.swift */; };
2AC3845320C929950003F213 /* OpacitySampleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AC3845220C929950003F213 /* OpacitySampleView.swift */; };
2AC3845420C929950003F213 /* OpacitySampleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AC3845220C929950003F213 /* OpacitySampleView.swift */; };
2AC39F731E8AC80E009F97D5 /* CollectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AC39F721E8AC80E009F97D5 /* CollectionTests.swift */; };
2AC434F31D494EA700980E66 /* SyntaxManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AB8C7BA1D49283400EFC3BC /* SyntaxManager.swift */; };
2AC434F41D494EA800980E66 /* SyntaxManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AB8C7BA1D49283400EFC3BC /* SyntaxManager.swift */; };
@ -640,17 +636,19 @@
2ACDA29B2B81E8BF00B2EBA8 /* SnippetsSettings.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 2ACDA29C2B81E8BF00B2EBA8 /* SnippetsSettings.xcstrings */; };
2ACDA29D2B81E8C300B2EBA8 /* IssueReport.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 2ACDA29F2B81E8C300B2EBA8 /* IssueReport.xcstrings */; };
2ACDA29E2B81E8C300B2EBA8 /* IssueReport.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 2ACDA29F2B81E8C300B2EBA8 /* IssueReport.xcstrings */; };
2ACDA2A52B81EE0E00B2EBA8 /* AppearanceSettings.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 2ACDA2A72B81EE0E00B2EBA8 /* AppearanceSettings.xcstrings */; };
2ACDA2A62B81EE0E00B2EBA8 /* AppearanceSettings.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 2ACDA2A72B81EE0E00B2EBA8 /* AppearanceSettings.xcstrings */; };
2ACDC0911D1726BD009B72D6 /* DotView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2ACDC0901D1726BD009B72D6 /* DotView.swift */; };
2ACDC0921D1726BD009B72D6 /* DotView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2ACDC0901D1726BD009B72D6 /* DotView.swift */; };
2ACDC0971D172B2A009B72D6 /* PaddingTextFieldCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2ACDC0961D172B2A009B72D6 /* PaddingTextFieldCell.swift */; };
2ACDC0981D172B2A009B72D6 /* PaddingTextFieldCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2ACDC0961D172B2A009B72D6 /* PaddingTextFieldCell.swift */; };
2ACDC09A1D172CDE009B72D6 /* AntialiasingTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2ACDC0991D172CDE009B72D6 /* AntialiasingTextField.swift */; };
2ACDC09B1D172CDE009B72D6 /* AntialiasingTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2ACDC0991D172CDE009B72D6 /* AntialiasingTextField.swift */; };
2ACDC09A1D172CDE009B72D6 /* AntialiasingText.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2ACDC0991D172CDE009B72D6 /* AntialiasingText.swift */; };
2ACDC09B1D172CDE009B72D6 /* AntialiasingText.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2ACDC0991D172CDE009B72D6 /* AntialiasingText.swift */; };
2ACDC0A31D173250009B72D6 /* InspectorTabSegmentedControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2ACDC0A21D173250009B72D6 /* InspectorTabSegmentedControl.swift */; };
2ACDC0A41D173250009B72D6 /* InspectorTabSegmentedControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2ACDC0A21D173250009B72D6 /* InspectorTabSegmentedControl.swift */; };
2ACDC0A61D17350A009B72D6 /* InspectorTabView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2ACDC0A51D17350A009B72D6 /* InspectorTabView.swift */; };
2ACDC0A71D17350A009B72D6 /* InspectorTabView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2ACDC0A51D17350A009B72D6 /* InspectorTabView.swift */; };
2ACDE28D2406B9C000FC31EC /* AppearancePane.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2A10D1261E714D230027192A /* AppearancePane.storyboard */; };
2ACDE28D2406B9C000FC31EC /* ThemeView.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2A10D1261E714D230027192A /* ThemeView.storyboard */; };
2ACDE2952406B9C000FC31EC /* StatusBar.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2A6602CE1D05BD72003E8D87 /* StatusBar.storyboard */; };
2ACDE2962406B9C000FC31EC /* NavigationBar.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2A5F7CA31D152589001D83BC /* NavigationBar.storyboard */; };
2ACDE2992406B9C000FC31EC /* SnippetsPane.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2ADF3BFF1E6D7345009125BB /* SnippetsPane.storyboard */; };
@ -849,8 +847,8 @@
2A10C5F61FD19237002AB5AE /* KeyBinding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyBinding.swift; sourceTree = "<group>"; };
2A10C5F91FD25D04002AB5AE /* Selector+Codable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Selector+Codable.swift"; sourceTree = "<group>"; };
2A10D1091E708CDF0027192A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/KeyBindingTreeView.storyboard; sourceTree = "<group>"; };
2A10D1271E714D230027192A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/AppearancePane.storyboard; sourceTree = "<group>"; };
2A10D1371E715E5B0027192A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/SyntaxListView.storyboard; sourceTree = "<group>"; };
2A10D1271E714D230027192A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/ThemeView.storyboard; sourceTree = "<group>"; };
2A1125C023F180FF006A1DB2 /* LineRangeCacheableTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LineRangeCacheableTests.swift; sourceTree = "<group>"; };
2A1125C223F1A86B006A1DB2 /* LineRangeCacheable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LineRangeCacheable.swift; sourceTree = "<group>"; };
2A1125C523F6EFB2006A1DB2 /* URLDetector.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLDetector.swift; sourceTree = "<group>"; };
@ -905,7 +903,7 @@
2A2615882977FCF6008C2240 /* SubmitButtonGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubmitButtonGroup.swift; sourceTree = "<group>"; };
2A26158B2979052C008C2240 /* SyntaxObject.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyntaxObject.swift; sourceTree = "<group>"; };
2A2747722111909400795954 /* String+Diff.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Diff.swift"; sourceTree = "<group>"; };
2A2792911D1DACC400F3FC5D /* AppearancePaneController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppearancePaneController.swift; sourceTree = "<group>"; };
2A2792911D1DACC400F3FC5D /* ThemeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemeViewController.swift; sourceTree = "<group>"; };
2A2792941D1DBDAC00F3FC5D /* String+Constants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String+Constants.swift"; sourceTree = "<group>"; };
2A2792971D1E57DA00F3FC5D /* SyntaxListViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SyntaxListViewController.swift; sourceTree = "<group>"; };
2A2B085F28046E3B0028D733 /* WarningInspectorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WarningInspectorView.swift; sourceTree = "<group>"; };
@ -919,7 +917,6 @@
2A36CE7B1FF654C000020702 /* NSTextView+Snippet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSTextView+Snippet.swift"; sourceTree = "<group>"; };
2A36E3702AF9ED0B00A73534 /* Sparkle.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; name = Sparkle.xcstrings; path = mul.lproj/Sparkle.xcstrings; sourceTree = "<group>"; };
2A38FAFC1D1C67050032231A /* DraggableArrayController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DraggableArrayController.swift; sourceTree = "<group>"; };
2A39F15626F74C2500B52876 /* AccessibleStepper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessibleStepper.swift; sourceTree = "<group>"; };
2A3A19DE2068A76600516DE4 /* NSTextView+MultipleReplace.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSTextView+MultipleReplace.swift"; sourceTree = "<group>"; };
2A3A19E1206C9A0700516DE4 /* NSTextView+BracePair.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSTextView+BracePair.swift"; sourceTree = "<group>"; };
2A3A758D19E77C84001DAB88 /* Syntaxes */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Syntaxes; sourceTree = "<group>"; };
@ -947,7 +944,6 @@
2A476CAD1D09C8C80088E37A /* URLExtensionsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = URLExtensionsTests.swift; sourceTree = "<group>"; };
2A476CB01D09D0500088E37A /* FontExtensionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FontExtensionTests.swift; sourceTree = "<group>"; };
2A478F3E22BE743200AEA45E /* NSTextView+Ligature.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSTextView+Ligature.swift"; sourceTree = "<group>"; };
2A479C811D8C15A600EEEFC2 /* CenteringTextFieldCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CenteringTextFieldCell.swift; sourceTree = "<group>"; };
2A47CD3721D340030094F62F /* NSValidatedUserInterfaceItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSValidatedUserInterfaceItem.swift; sourceTree = "<group>"; };
2A484A38236579A7006FFD14 /* NSLayoutManager+ValidationIgnorable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSLayoutManager+ValidationIgnorable.swift"; sourceTree = "<group>"; };
2A4A7D122856FF340085D2E7 /* HelpButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HelpButton.swift; sourceTree = "<group>"; };
@ -1008,8 +1004,9 @@
2A64F2471D26327C001B229F /* Shortcut+Error.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Shortcut+Error.swift"; sourceTree = "<group>"; };
2A64F24A1D26615A001B229F /* KeyBindingItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeyBindingItem.swift; sourceTree = "<group>"; };
2A657D1C2033ED6B00C2611C /* DefaultInitializable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultInitializable.swift; sourceTree = "<group>"; };
2A65EC3A2B80C667008096C5 /* ThemeEditor.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; name = ThemeEditor.xcstrings; path = mul.lproj/ThemeEditor.xcstrings; sourceTree = "<group>"; };
2A65EC252B80C01B008096C5 /* FontPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FontPicker.swift; sourceTree = "<group>"; };
2A65EC292B80C168008096C5 /* AppearanceSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppearanceSettingsView.swift; sourceTree = "<group>"; };
2A65EC3A2B80C667008096C5 /* ThemeEditor.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; name = ThemeEditor.xcstrings; path = mul.lproj/ThemeEditor.xcstrings; sourceTree = "<group>"; };
2A6602CF1D05BD72003E8D87 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/StatusBar.storyboard; sourceTree = "<group>"; };
2A685F692027729000A130A4 /* NSAppleEventManager+Additions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSAppleEventManager+Additions.swift"; sourceTree = "<group>"; };
2A68722E288A5C44006D6B41 /* DraggableHostingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DraggableHostingView.swift; sourceTree = "<group>"; };
@ -1162,7 +1159,6 @@
2AC186D91E2F414D002F4D27 /* NSDocument+ErrorHandling.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSDocument+ErrorHandling.swift"; sourceTree = "<group>"; };
2AC186DC1E2F4264002F4D27 /* Debug.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Debug.swift; sourceTree = "<group>"; };
2AC2462D1D1BC70C00E46CFA /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
2AC3845220C929950003F213 /* OpacitySampleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpacitySampleView.swift; sourceTree = "<group>"; };
2AC39F721E8AC80E009F97D5 /* CollectionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CollectionTests.swift; sourceTree = "<group>"; };
2AC4E5D127A6C0300052A4DD /* en-GB */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-GB"; path = "en-GB.lproj/UnicodeBlock.strings"; sourceTree = "<group>"; };
2AC52BDA1D48CC0E007D6371 /* DispatchQueue.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DispatchQueue.swift; sourceTree = "<group>"; };
@ -1191,9 +1187,10 @@
2ACDA2992B81E8BB00B2EBA8 /* WindowSettings.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; name = WindowSettings.xcstrings; path = mul.lproj/WindowSettings.xcstrings; sourceTree = "<group>"; };
2ACDA29C2B81E8BF00B2EBA8 /* SnippetsSettings.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; name = SnippetsSettings.xcstrings; path = mul.lproj/SnippetsSettings.xcstrings; sourceTree = "<group>"; };
2ACDA29F2B81E8C300B2EBA8 /* IssueReport.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; name = IssueReport.xcstrings; path = mul.lproj/IssueReport.xcstrings; sourceTree = "<group>"; };
2ACDA2A72B81EE0E00B2EBA8 /* AppearanceSettings.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; name = AppearanceSettings.xcstrings; path = mul.lproj/AppearanceSettings.xcstrings; sourceTree = "<group>"; };
2ACDC0901D1726BD009B72D6 /* DotView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DotView.swift; sourceTree = "<group>"; };
2ACDC0961D172B2A009B72D6 /* PaddingTextFieldCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PaddingTextFieldCell.swift; sourceTree = "<group>"; };
2ACDC0991D172CDE009B72D6 /* AntialiasingTextField.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AntialiasingTextField.swift; sourceTree = "<group>"; };
2ACDC0991D172CDE009B72D6 /* AntialiasingText.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AntialiasingText.swift; sourceTree = "<group>"; };
2ACDC0A21D173250009B72D6 /* InspectorTabSegmentedControl.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InspectorTabSegmentedControl.swift; sourceTree = "<group>"; };
2ACDC0A51D17350A009B72D6 /* InspectorTabView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InspectorTabView.swift; sourceTree = "<group>"; };
2ACF23AD26302A4C002B5E10 /* Theme+Syntax.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Theme+Syntax.swift"; sourceTree = "<group>"; };
@ -1246,8 +1243,8 @@
2AF0C1241D3DA44900B6FCB6 /* FourCharCode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FourCharCode.swift; sourceTree = "<group>"; };
2AF0C1271D3DA6F800B6FCB6 /* FourCharCodeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FourCharCodeTests.swift; sourceTree = "<group>"; };
2AF0C12C1D3DABD000B6FCB6 /* Document+ScriptingSupport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Document+ScriptingSupport.swift"; sourceTree = "<group>"; };
2AF1229E2B7A3D50004BA1FF /* mul */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; name = mul; path = mul.lproj/AppearancePane.xcstrings; sourceTree = "<group>"; };
2AF1229F2B7A3D50004BA1FF /* mul */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; name = mul; path = mul.lproj/KeyBindingTreeView.xcstrings; sourceTree = "<group>"; };
2AF1229E2B7A3D50004BA1FF /* mul */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; name = mul; path = mul.lproj/ThemeView.xcstrings; sourceTree = "<group>"; };
2AF122A22B7A3D50004BA1FF /* mul */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; name = mul; path = mul.lproj/SyntaxListView.xcstrings; sourceTree = "<group>"; };
2AF122A42B7A3D50004BA1FF /* mul */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; name = mul; path = mul.lproj/SnippetsPane.xcstrings; sourceTree = "<group>"; };
2AF1D85721B8D9250060BC04 /* NSRegularExpression+Additions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSRegularExpression+Additions.swift"; sourceTree = "<group>"; };
@ -1373,7 +1370,7 @@
2A149DAF19016AD800A9D6EF /* Settings */ = {
isa = PBXGroup;
children = (
2A10D1261E714D230027192A /* AppearancePane.storyboard */,
2A10D1261E714D230027192A /* ThemeView.storyboard */,
2A10D1361E715E5B0027192A /* SyntaxListView.storyboard */,
2ADF3BFF1E6D7345009125BB /* SnippetsPane.storyboard */,
2A10D1081E708CDF0027192A /* KeyBindingTreeView.storyboard */,
@ -1385,7 +1382,7 @@
isa = PBXGroup;
children = (
2A78BFA61D1B05FB00A583D2 /* GeneralSettingsView.swift */,
2A2792911D1DACC400F3FC5D /* AppearancePaneController.swift */,
2A65EC292B80C168008096C5 /* AppearanceSettingsView.swift */,
2A78BFA31D1B02ED00A583D2 /* WindowSettingsView.swift */,
2AFFA7C52B170097005652CD /* EditSettingsView.swift */,
2ACDA2522B813FA500B2EBA8 /* SnippetsSettingsView.swift */,
@ -1452,20 +1449,16 @@
2AE95A192A86270000E85CF5 /* HoleContentView.swift */,
2A68722E288A5C44006D6B41 /* DraggableHostingView.swift */,
2ACDC0901D1726BD009B72D6 /* DotView.swift */,
2AC3845220C929950003F213 /* OpacitySampleView.swift */,
2A0DD6321E655C4A001CAAA3 /* TokenTextView.swift */,
2ACDC0991D172CDE009B72D6 /* AntialiasingTextField.swift */,
2AD8D7492064AD83000BEFDB /* NumberTextField.swift */,
2AACB1CC1D195ABD0073775B /* ShortcutField.swift */,
2A5DCE4E1D185F1B00D5D74C /* CharacterField.swift */,
2A1814BD21CFC9CF00602214 /* RegularExpressionTextField.swift */,
2A63A9D724E8C8F70017ACBB /* OutlinePopUpButton.swift */,
2A19AF852AE0D15300EFFDCB /* FormPopUpButton.swift */,
2A479C811D8C15A600EEEFC2 /* CenteringTextFieldCell.swift */,
2ACDC0961D172B2A009B72D6 /* PaddingTextFieldCell.swift */,
2A158C1B2945A6B1000A4EC1 /* HeadingMenuItem.swift */,
2A3E61BE27C3795B00C6E5B6 /* OptionalMenu.swift */,
2A39F15626F74C2500B52876 /* AccessibleStepper.swift */,
);
name = Views;
sourceTree = "<group>";
@ -1980,6 +1973,7 @@
2A91C3231D1C5840007CF8BE /* Other Views */ = {
isa = PBXGroup;
children = (
2A2792911D1DACC400F3FC5D /* ThemeViewController.swift */,
2A63FBE21D1D90E70081C84E /* ThemeEditorView.swift */,
2A2792971D1E57DA00F3FC5D /* SyntaxListViewController.swift */,
2A5DCE881D18FFDB00D5D74C /* EncodingListView.swift */,
@ -2058,6 +2052,7 @@
isa = PBXGroup;
children = (
2ACDA2932B81E8B300B2EBA8 /* GeneralSettings.xcstrings */,
2ACDA2A72B81EE0E00B2EBA8 /* AppearanceSettings.xcstrings */,
2ACDA2962B81E8B700B2EBA8 /* EditSettings.xcstrings */,
2ACDA2992B81E8BB00B2EBA8 /* WindowSettings.xcstrings */,
2ACDA29C2B81E8BF00B2EBA8 /* SnippetsSettings.xcstrings */,
@ -2218,6 +2213,7 @@
2AF601CB296F925200F6F1E8 /* Views */ = {
isa = PBXGroup;
children = (
2ACDC0991D172CDE009B72D6 /* AntialiasingText.swift */,
2A0A602A27ABD74500725B70 /* FilterField.swift */,
2A73B9322A8F6620002F3A16 /* RegexTextField.swift */,
2A26156D2977B87F008C2240 /* StepperNumberField.swift */,
@ -2494,6 +2490,7 @@
2A6F0D801B5500E100C2D03C /* Localizable.strings in Resources */,
2A5E6FC42A723CEA00E33EA7 /* InfoPlist.xcstrings in Resources */,
2ACDA2912B81E8B300B2EBA8 /* GeneralSettings.xcstrings in Resources */,
2ACDA2A52B81EE0E00B2EBA8 /* AppearanceSettings.xcstrings in Resources */,
2ACDA2972B81E8BB00B2EBA8 /* WindowSettings.xcstrings in Resources */,
2ACDA2942B81E8B700B2EBA8 /* EditSettings.xcstrings in Resources */,
2AB9E4C02B830902004E5BDC /* FormatSettings.xcstrings in Resources */,
@ -2514,7 +2511,6 @@
2A73A87C2B76158600E64C44 /* AddRemoveButton.xcstrings in Resources */,
2AA2E0141BFE12620087BDD6 /* UnicodeBlock.strings in Resources */,
2A836F811D572A5D0044E8EC /* Main.storyboard in Resources */,
2ACDE28D2406B9C000FC31EC /* AppearancePane.storyboard in Resources */,
2ACDE29A2406B9C000FC31EC /* FindPanelFieldView.storyboard in Resources */,
2ACDE29C2406B9C000FC31EC /* SyntaxListView.storyboard in Resources */,
2ACDE2A22406B9C000FC31EC /* KeyBindingTreeView.storyboard in Resources */,
@ -2524,6 +2520,7 @@
2A7F4DFF2871F46D0029CE66 /* PrintPanelAccessory.storyboard in Resources */,
2ACDE2992406B9C000FC31EC /* SnippetsPane.storyboard in Resources */,
2ACDE2952406B9C000FC31EC /* StatusBar.storyboard in Resources */,
2ACDE28D2406B9C000FC31EC /* ThemeView.storyboard in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -2556,6 +2553,7 @@
259C2318077678DE00BA61C5 /* Localizable.strings in Resources */,
2A5E6FC52A723CEA00E33EA7 /* InfoPlist.xcstrings in Resources */,
2ACDA2922B81E8B300B2EBA8 /* GeneralSettings.xcstrings in Resources */,
2ACDA2A62B81EE0E00B2EBA8 /* AppearanceSettings.xcstrings in Resources */,
2ACDA2952B81E8B700B2EBA8 /* EditSettings.xcstrings in Resources */,
2ACDA2982B81E8BB00B2EBA8 /* WindowSettings.xcstrings in Resources */,
2AB9E4C12B830902004E5BDC /* FormatSettings.xcstrings in Resources */,
@ -2577,7 +2575,6 @@
2A36E36F2AF9ED0B00A73534 /* Sparkle.xcstrings in Resources */,
2AA2E0131BFE12620087BDD6 /* UnicodeBlock.strings in Resources */,
2A836F801D572A5D0044E8EC /* Main.storyboard in Resources */,
2A10D1281E714D230027192A /* AppearancePane.storyboard in Resources */,
2A5D13421D1FE34F00D38E6A /* FindPanelFieldView.storyboard in Resources */,
2A10D1381E715E5B0027192A /* SyntaxListView.storyboard in Resources */,
2A10D10A1E708CDF0027192A /* KeyBindingTreeView.storyboard in Resources */,
@ -2587,6 +2584,7 @@
2A7F4E002871F46D0029CE66 /* PrintPanelAccessory.storyboard in Resources */,
2ADF3C011E6D7345009125BB /* SnippetsPane.storyboard in Resources */,
2A6602D01D05BD72003E8D87 /* StatusBar.storyboard in Resources */,
2A10D1281E714D230027192A /* ThemeView.storyboard in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -2692,14 +2690,13 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
2A39F15726F74C2500B52876 /* AccessibleStepper.swift in Sources */,
2A5E410B2B0B559300D5EA20 /* ActionCommand.swift in Sources */,
2ADB04AC2A89F14D00C4F562 /* AddRemoveButton.swift in Sources */,
2AF29EC42882EE7700DF31D2 /* AdvancedCharacterCounter.swift in Sources */,
2A04E9C327FEFA86008C82D8 /* AdvancedCharacterCounterView.swift in Sources */,
2ACDC09B1D172CDE009B72D6 /* AntialiasingTextField.swift in Sources */,
2ACDC09B1D172CDE009B72D6 /* AntialiasingText.swift in Sources */,
2AC2462F1D1BC70C00E46CFA /* AppDelegate.swift in Sources */,
2A2792931D1DACC400F3FC5D /* AppearancePaneController.swift in Sources */,
2A65EC2A2B80C168008096C5 /* AppearanceSettingsView.swift in Sources */,
2AA14CFD1FA4983500EAF586 /* AppleScript.swift in Sources */,
2A8918E3294C33C900A23347 /* AppStorage+DefaultKey.swift in Sources */,
2AA056AD26FCA171000E0CB2 /* Arithmetics.swift in Sources */,
@ -2709,7 +2706,6 @@
2A1ABC9B27F056E60054795D /* BidiScrollView.swift in Sources */,
2A231A291E7BD82700C2A909 /* Binding.swift in Sources */,
2AFECF5B2171C0E60065A7DE /* Bundle+AppInfo.swift in Sources */,
2A479C831D8C15A600EEEFC2 /* CenteringTextFieldCell.swift in Sources */,
2AB1BD24287DA73D00C6FEAF /* CharacterCountOptionsSheetView.swift in Sources */,
2AB1BD1C287D60DF00C6FEAF /* CharacterCountOptionsView.swift in Sources */,
2A5DCE501D185F1B00D5D74C /* CharacterField.swift in Sources */,
@ -2885,7 +2881,6 @@
2A05081423D6B9E900602F5E /* NSViewController.swift in Sources */,
2A359DFF1DAE93EE00FEF7AA /* NSWindow+Responder.swift in Sources */,
2AD8D74B2064AD83000BEFDB /* NumberTextField.swift in Sources */,
2AC3845420C929950003F213 /* OpacitySampleView.swift in Sources */,
2ACDA2502B81201A00B2EBA8 /* OpacitySlider.swift in Sources */,
2A158C222945F54B000A4EC1 /* OpacityView.swift in Sources */,
2AC6069C20416ADE00F9C839 /* OpenPanelAccessory.swift in Sources */,
@ -2977,6 +2972,7 @@
2ACF23AE26302A4C002B5E10 /* Theme+Syntax.swift in Sources */,
2A63FBE41D1D90E70081C84E /* ThemeEditorView.swift in Sources */,
2A9082F31D32A9B500228F50 /* ThemeManager.swift in Sources */,
2A2792931D1DACC400F3FC5D /* ThemeViewController.swift in Sources */,
2A0DD6371E655FE6001CAAA3 /* Tokenizer.swift in Sources */,
2A0DD6341E655C4A001CAAA3 /* TokenTextView.swift in Sources */,
2AB2913E245AAD74004CC203 /* Unicode.GeneralCategory.swift in Sources */,
@ -3056,14 +3052,13 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
2A39F15826F74C2500B52876 /* AccessibleStepper.swift in Sources */,
2A5E410C2B0B559400D5EA20 /* ActionCommand.swift in Sources */,
2ADB04AD2A89F14D00C4F562 /* AddRemoveButton.swift in Sources */,
2AF29EC52882EE7700DF31D2 /* AdvancedCharacterCounter.swift in Sources */,
2A04E9C427FEFA87008C82D8 /* AdvancedCharacterCounterView.swift in Sources */,
2ACDC09A1D172CDE009B72D6 /* AntialiasingTextField.swift in Sources */,
2ACDC09A1D172CDE009B72D6 /* AntialiasingText.swift in Sources */,
2AC2462E1D1BC70C00E46CFA /* AppDelegate.swift in Sources */,
2A2792921D1DACC400F3FC5D /* AppearancePaneController.swift in Sources */,
2A65EC2B2B80C168008096C5 /* AppearanceSettingsView.swift in Sources */,
2AA14CFC1FA4983500EAF586 /* AppleScript.swift in Sources */,
2A8918E4294C33C900A23347 /* AppStorage+DefaultKey.swift in Sources */,
2AA056AE26FCA171000E0CB2 /* Arithmetics.swift in Sources */,
@ -3073,7 +3068,6 @@
2A1ABC9C27F056E60054795D /* BidiScrollView.swift in Sources */,
2A231A281E7BD82700C2A909 /* Binding.swift in Sources */,
2AFECF5A2171C0E60065A7DE /* Bundle+AppInfo.swift in Sources */,
2A479C821D8C15A600EEEFC2 /* CenteringTextFieldCell.swift in Sources */,
2AB1BD25287DA73D00C6FEAF /* CharacterCountOptionsSheetView.swift in Sources */,
2AB1BD1D287D60DF00C6FEAF /* CharacterCountOptionsView.swift in Sources */,
2A5DCE4F1D185F1B00D5D74C /* CharacterField.swift in Sources */,
@ -3249,7 +3243,6 @@
2A05081323D6B9E900602F5E /* NSViewController.swift in Sources */,
2A359DFE1DAE93EE00FEF7AA /* NSWindow+Responder.swift in Sources */,
2AD8D74A2064AD83000BEFDB /* NumberTextField.swift in Sources */,
2AC3845320C929950003F213 /* OpacitySampleView.swift in Sources */,
2A158C232945F54B000A4EC1 /* OpacityView.swift in Sources */,
2ACDA2512B81201A00B2EBA8 /* OpacitySlider.swift in Sources */,
2AC6069B20416ADE00F9C839 /* OpenPanelAccessory.swift in Sources */,
@ -3341,6 +3334,7 @@
2ACF23AF26302A4C002B5E10 /* Theme+Syntax.swift in Sources */,
2A63FBE31D1D90E70081C84E /* ThemeEditorView.swift in Sources */,
2A9082F21D32A9B500228F50 /* ThemeManager.swift in Sources */,
2A2792921D1DACC400F3FC5D /* ThemeViewController.swift in Sources */,
2A0DD6361E655FE6001CAAA3 /* Tokenizer.swift in Sources */,
2A0DD6331E655C4A001CAAA3 /* TokenTextView.swift in Sources */,
2AB2913F245AAD74004CC203 /* Unicode.GeneralCategory.swift in Sources */,
@ -3421,13 +3415,13 @@
name = KeyBindingTreeView.storyboard;
sourceTree = "<group>";
};
2A10D1261E714D230027192A /* AppearancePane.storyboard */ = {
2A10D1261E714D230027192A /* ThemeView.storyboard */ = {
isa = PBXVariantGroup;
children = (
2A10D1271E714D230027192A /* Base */,
2AF1229E2B7A3D50004BA1FF /* mul */,
);
name = AppearancePane.storyboard;
name = ThemeView.storyboard;
sourceTree = "<group>";
};
2A10D1361E715E5B0027192A /* SyntaxListView.storyboard */ = {

View File

@ -1,697 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="22505" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" initialViewController="WBM-EY-ENr">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="22505"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--Appearance Pane Controller-->
<scene sceneID="oau-eS-BHv">
<objects>
<viewController id="WBM-EY-ENr" customClass="AppearancePaneController" customModule="CotEditor" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" horizontalHuggingPriority="750" verticalCompressionResistancePriority="250" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="LgU-un-VaX">
<rect key="frame" x="0.0" y="0.0" width="600" height="567"/>
<subviews>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="ADB-Wp-iDy">
<rect key="frame" x="53" y="348" width="495" height="218"/>
<subviews>
<textField focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="751" translatesAutoresizingMaskIntoConstraints="NO" id="icl-ar-8yG">
<rect key="frame" x="18" y="153" width="114" height="16"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" alignment="right" title="Standard font:" usesSingleLineMode="YES" id="Z85-S9-uID">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField focusRingType="none" verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="wT1-jD-6aC" customClass="AntialiasingTextField" customModule="CotEditor" customModuleProvider="target">
<rect key="frame" x="138" y="150" width="260" height="21"/>
<constraints>
<constraint firstAttribute="width" priority="750" constant="260" id="Ssa-FC-qrT"/>
</constraints>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" alignment="center" title="FONT NAME 12" drawsBackground="YES" id="toV-fU-j7j" customClass="CenteringTextFieldCell" customModule="CotEditor" customModuleProvider="target">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<accessibilityConnection property="title" destination="icl-ar-8yG" id="JXg-bX-b1p"/>
</connections>
</textField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="uMj-Iu-oCy">
<rect key="frame" x="399" y="144" width="83" height="32"/>
<buttonCell key="cell" type="push" title="Select…" bezelStyle="rounded" alignment="center" borderStyle="border" inset="2" id="3289">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<constraints>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="64" id="T74-lW-Yta"/>
</constraints>
<connections>
<accessibilityConnection property="title" destination="icl-ar-8yG" id="Rpq-MG-HTP"/>
<action selector="showFonts:" target="WBM-EY-ENr" id="80p-Ig-zIc"/>
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="I9r-vj-2gy">
<rect key="frame" x="137" y="131" width="66" height="16"/>
<buttonCell key="cell" type="check" title="Antialias" bezelStyle="regularSquare" imagePosition="left" alignment="left" controlSize="small" state="on" inset="2" id="3290">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="smallSystem"/>
</buttonCell>
<connections>
<accessibilityConnection property="title" destination="icl-ar-8yG" id="akE-EA-zGb"/>
<binding destination="IE5-39-jAY" name="value" keyPath="values.shouldAntialias" id="WYd-vz-gCE"/>
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="4cD-mR-vJc">
<rect key="frame" x="210" y="131" width="70" height="16"/>
<buttonCell key="cell" type="check" title="Ligatures" bezelStyle="regularSquare" imagePosition="left" controlSize="small" state="on" inset="2" id="g3S-3v-6ZA">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="smallSystem"/>
</buttonCell>
<connections>
<accessibilityConnection property="title" destination="icl-ar-8yG" id="yEn-NR-Avf"/>
<binding destination="IE5-39-jAY" name="value" keyPath="values.ligature" id="BcZ-Pb-BN1"/>
</connections>
</button>
<textField focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="751" translatesAutoresizingMaskIntoConstraints="NO" id="hws-J2-FDl">
<rect key="frame" x="57" y="59" width="75" height="16"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" alignment="right" title="Line height:" usesSingleLineMode="YES" id="r1c-v3-qW1">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField focusRingType="none" verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="5XW-Ju-Ix5" customClass="NumberTextField" customModule="CotEditor" customModuleProvider="target">
<rect key="frame" x="138" y="56" width="40" height="21"/>
<constraints>
<constraint firstAttribute="width" constant="40" id="yke-nV-fMx"/>
</constraints>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" alignment="right" drawsBackground="YES" usesSingleLineMode="YES" id="IyJ-IR-fVa">
<numberFormatter key="formatter" formatterBehavior="custom10_4" numberStyle="decimal" usesGroupingSeparator="NO" minimumIntegerDigits="1" maximumIntegerDigits="2" minimumFractionDigits="1" maximumFractionDigits="2" id="d5U-8W-wLX">
<real key="minimum" value="0.10000000000000001"/>
<real key="maximum" value="10"/>
</numberFormatter>
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
<allowedInputSourceLocales>
<string>NSAllRomanInputSourcesLocaleIdentifier</string>
</allowedInputSourceLocales>
</textFieldCell>
<connections>
<accessibilityConnection property="title" destination="hws-J2-FDl" id="vTW-pg-qhb"/>
<binding destination="IE5-39-jAY" name="value" keyPath="values.lineHeight" id="XEu-TQ-rfy"/>
</connections>
</textField>
<stepper horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="XWT-pS-k8a" customClass="AccessibleStepper" customModule="CotEditor" customModuleProvider="target">
<rect key="frame" x="179" y="53" width="19" height="28"/>
<stepperCell key="cell" continuous="YES" alignment="left" increment="0.10000000000000001" minValue="0.10000000000000001" maxValue="10" doubleValue="1" id="Mkv-St-JNh"/>
<connections>
<accessibilityConnection property="title" destination="hws-J2-FDl" id="Ikk-4Y-EgE"/>
<binding destination="IE5-39-jAY" name="value" keyPath="values.lineHeight" id="cFx-Lt-8aa"/>
</connections>
</stepper>
<textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="xDf-ra-dem">
<rect key="frame" x="199" y="59" width="38" height="16"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" title="times" usesSingleLineMode="YES" id="VLD-jj-zzl">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="751" translatesAutoresizingMaskIntoConstraints="NO" id="rE0-DL-xRG">
<rect key="frame" x="51" y="31" width="81" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" alignment="right" title="Appearance:" usesSingleLineMode="YES" id="6KG-3a-ZuU">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Tqw-t1-w9R">
<rect key="frame" x="134" y="30" width="113" height="18"/>
<buttonCell key="cell" type="radio" title="Match System" bezelStyle="regularSquare" imagePosition="left" alignment="left" state="on" inset="2" id="apQ-au-gOC">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="updateAppearanceSetting:" target="WBM-EY-ENr" id="SBy-6F-JQC"/>
</connections>
</button>
<button tag="1" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="2y3-Ti-pue">
<rect key="frame" x="253" y="30" width="57" height="18"/>
<buttonCell key="cell" type="radio" title="Light" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="FwU-oj-kwc">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="updateAppearanceSetting:" target="WBM-EY-ENr" id="fZ0-3N-n5O"/>
</connections>
</button>
<button tag="2" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="sbW-46-DFB">
<rect key="frame" x="316" y="30" width="55" height="18"/>
<buttonCell key="cell" type="radio" title="Dark" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="1Cg-21-kjr">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="updateAppearanceSetting:" target="WBM-EY-ENr" id="zU1-hk-Efg"/>
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="C0e-PH-i1L">
<rect key="frame" x="137" y="84" width="66" height="16"/>
<buttonCell key="cell" type="check" title="Antialias" bezelStyle="regularSquare" imagePosition="left" controlSize="small" state="on" inset="2" id="3fg-x6-5T8">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="smallSystem"/>
</buttonCell>
<connections>
<binding destination="IE5-39-jAY" name="value" keyPath="values.monospacedShouldAntialias" id="lV5-l4-aj0"/>
</connections>
</button>
<textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Fcc-rL-m1T" customClass="AntialiasingTextField" customModule="CotEditor" customModuleProvider="target">
<rect key="frame" x="138" y="103" width="260" height="21"/>
<constraints>
<constraint firstAttribute="width" priority="750" constant="260" id="1NH-gY-fav"/>
</constraints>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" borderStyle="bezel" alignment="center" title="FONT NAME 12" drawsBackground="YES" id="Rqy-Su-cwW" customClass="CenteringTextFieldCell" customModule="CotEditor" customModuleProvider="target">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<accessibilityConnection property="title" destination="ZHd-UF-pkx" id="ArR-8M-iXr"/>
</connections>
</textField>
<button identifier="monospacedFontButton" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="6lq-jQ-EgE">
<rect key="frame" x="399" y="97" width="83" height="32"/>
<buttonCell key="cell" type="push" title="Select…" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="DSX-09-54K">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<constraints>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="64" id="yLU-1C-Ene"/>
</constraints>
<connections>
<accessibilityConnection property="title" destination="ZHd-UF-pkx" id="1O2-NW-Qqj"/>
<action selector="showFonts:" target="WBM-EY-ENr" id="uvg-i3-Tuc"/>
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Cfh-8I-pCg">
<rect key="frame" x="210" y="84" width="70" height="16"/>
<buttonCell key="cell" type="check" title="Ligatures" bezelStyle="regularSquare" imagePosition="left" controlSize="small" inset="2" id="AFh-3D-ZB2">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="smallSystem"/>
</buttonCell>
<connections>
<binding destination="IE5-39-jAY" name="value" keyPath="values.monospacedLigature" id="FvI-T1-cYd"/>
</connections>
</button>
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="k1t-Xk-gYs">
<rect key="frame" x="135" y="175" width="121" height="25"/>
<popUpButtonCell key="cell" type="push" title="Automatically" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="XcC-5y-bLG" id="xL0-Za-Olv">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="J7d-86-3ex">
<items>
<menuItem title="Automatically" state="on" id="XcC-5y-bLG"/>
<menuItem isSeparatorItem="YES" id="s03-Bx-g45"/>
<menuItem title="Standard" tag="2" id="Vla-IY-EYW"/>
<menuItem title="Monospaced" tag="1" id="htL-1g-SvR"/>
</items>
</menu>
</popUpButtonCell>
<connections>
<binding destination="IE5-39-jAY" name="selectedTag" keyPath="values.fontPreference" id="GUe-2d-2Xw"/>
</connections>
</popUpButton>
<textField focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="751" translatesAutoresizingMaskIntoConstraints="NO" id="PBB-XC-8pV">
<rect key="frame" x="23" y="182" width="109" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" alignment="right" title="Prefer font using:" usesSingleLineMode="YES" id="XQO-YW-cqZ">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="751" translatesAutoresizingMaskIntoConstraints="NO" id="HDH-L4-Ss3">
<rect key="frame" x="40" y="3" width="92" height="16"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" alignment="right" title="Editor opacity:" usesSingleLineMode="YES" id="gSx-LA-TPc">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<slider verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="xjz-30-0d3">
<rect key="frame" x="160" y="-6" width="216" height="28"/>
<sliderCell key="cell" continuous="YES" alignment="left" minValue="0.20000000000000001" maxValue="1" doubleValue="0.90000000000000002" tickMarkPosition="below" numberOfTickMarks="9" sliderType="linear" id="MUF-gG-fiB">
<font key="font" usesAppearanceFont="YES"/>
</sliderCell>
<connections>
<accessibilityConnection property="title" destination="HDH-L4-Ss3" id="3W9-PV-QDw"/>
<binding destination="IE5-39-jAY" name="value" keyPath="values.windowAlpha" id="dXK-uh-bFg"/>
</connections>
</slider>
<textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ey0-BL-08J" customClass="NumberTextField" customModule="CotEditor" customModuleProvider="target">
<rect key="frame" x="406" y="0.0" width="48" height="21"/>
<constraints>
<constraint firstAttribute="width" constant="48" id="2mO-EW-xD8"/>
</constraints>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" alignment="right" drawsBackground="YES" id="z0a-bE-CA0">
<numberFormatter key="formatter" formatterBehavior="default10_4" numberStyle="percent" lenient="YES" minimumIntegerDigits="1" maximumIntegerDigits="2000000000" id="51u-ho-vNA">
<integer key="multiplier" value="100"/>
<real key="minimum" value="0.20000000000000001"/>
<real key="maximum" value="1"/>
</numberFormatter>
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<accessibilityConnection property="title" destination="HDH-L4-Ss3" id="tvd-7G-Wc6"/>
<binding destination="IE5-39-jAY" name="value" keyPath="values.windowAlpha" id="Kg9-QS-YCY"/>
</connections>
</textField>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="3IH-by-XSu" customClass="OpacitySampleView" customModule="CotEditor" customModuleProvider="target">
<rect key="frame" x="138" y="2" width="16" height="16"/>
<constraints>
<constraint firstAttribute="height" constant="16" id="9z8-yN-TIQ"/>
<constraint firstAttribute="width" secondItem="3IH-by-XSu" secondAttribute="height" multiplier="1:1" id="JZb-yC-aTA"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="opacity">
<real key="value" value="0.20000000000000001"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</customView>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="NDr-Yf-V2q" customClass="OpacitySampleView" customModule="CotEditor" customModuleProvider="target">
<rect key="frame" x="382" y="2" width="16" height="16"/>
<constraints>
<constraint firstAttribute="width" secondItem="NDr-Yf-V2q" secondAttribute="height" multiplier="1:1" id="9Wa-kj-g29"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="opacity">
<real key="value" value="1"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</customView>
<textField focusRingType="none" horizontalHuggingPriority="751" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ZHd-UF-pkx">
<rect key="frame" x="18" y="106" width="114" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" alignment="right" title="Monospaced font:" usesSingleLineMode="YES" id="B8d-4v-fox">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<constraints>
<constraint firstItem="xjz-30-0d3" firstAttribute="leading" secondItem="3IH-by-XSu" secondAttribute="trailing" constant="8" symbolic="YES" id="0Ef-vE-BNj"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="k1t-Xk-gYs" secondAttribute="trailing" constant="20" symbolic="YES" id="1ZS-lg-jcx"/>
<constraint firstItem="hws-J2-FDl" firstAttribute="trailing" secondItem="icl-ar-8yG" secondAttribute="trailing" id="3ry-gB-SFR"/>
<constraint firstItem="Tqw-t1-w9R" firstAttribute="leading" secondItem="rE0-DL-xRG" secondAttribute="trailing" constant="6" symbolic="YES" id="5TB-3p-oLc"/>
<constraint firstItem="6lq-jQ-EgE" firstAttribute="leading" secondItem="Fcc-rL-m1T" secondAttribute="trailing" constant="8" symbolic="YES" id="6L2-Sy-AKH"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="sbW-46-DFB" secondAttribute="trailing" constant="20" symbolic="YES" id="6eb-Fr-d6A"/>
<constraint firstItem="xjz-30-0d3" firstAttribute="firstBaseline" secondItem="HDH-L4-Ss3" secondAttribute="firstBaseline" id="7Ic-y0-YvS"/>
<constraint firstItem="6lq-jQ-EgE" firstAttribute="centerY" secondItem="Fcc-rL-m1T" secondAttribute="centerY" id="7VU-Np-lNe"/>
<constraint firstItem="icl-ar-8yG" firstAttribute="centerY" secondItem="wT1-jD-6aC" secondAttribute="centerY" id="Awy-Lh-dcc"/>
<constraint firstItem="wT1-jD-6aC" firstAttribute="top" secondItem="k1t-Xk-gYs" secondAttribute="bottom" constant="8" symbolic="YES" id="BKY-eW-xct"/>
<constraint firstItem="PBB-XC-8pV" firstAttribute="trailing" secondItem="icl-ar-8yG" secondAttribute="trailing" id="BUA-Jp-oCg"/>
<constraint firstItem="4cD-mR-vJc" firstAttribute="leading" secondItem="I9r-vj-2gy" secondAttribute="trailing" constant="8" symbolic="YES" id="CAF-oR-p9c"/>
<constraint firstItem="sbW-46-DFB" firstAttribute="leading" secondItem="2y3-Ti-pue" secondAttribute="trailing" constant="8" symbolic="YES" id="DKp-dB-fTm"/>
<constraint firstAttribute="trailing" secondItem="uMj-Iu-oCy" secondAttribute="trailing" priority="750" constant="20" symbolic="YES" id="Ft4-Ab-tZV"/>
<constraint firstItem="rE0-DL-xRG" firstAttribute="top" secondItem="hws-J2-FDl" secondAttribute="bottom" constant="12" id="Gaj-zD-fsa"/>
<constraint firstItem="Fcc-rL-m1T" firstAttribute="leading" secondItem="ZHd-UF-pkx" secondAttribute="trailing" constant="8" symbolic="YES" id="Gkf-Hl-M3h"/>
<constraint firstItem="3IH-by-XSu" firstAttribute="leading" secondItem="HDH-L4-Ss3" secondAttribute="trailing" constant="8" symbolic="YES" id="Hgp-d5-2oj"/>
<constraint firstItem="PBB-XC-8pV" firstAttribute="top" secondItem="ADB-Wp-iDy" secondAttribute="top" constant="20" symbolic="YES" id="J77-5T-xI3"/>
<constraint firstItem="HDH-L4-Ss3" firstAttribute="top" secondItem="rE0-DL-xRG" secondAttribute="bottom" constant="12" id="JcD-Tv-htn"/>
<constraint firstItem="rE0-DL-xRG" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="ADB-Wp-iDy" secondAttribute="leading" constant="20" symbolic="YES" id="K02-Ja-frV"/>
<constraint firstItem="Fcc-rL-m1T" firstAttribute="top" secondItem="I9r-vj-2gy" secondAttribute="bottom" constant="8" symbolic="YES" id="Kik-mX-d2N"/>
<constraint firstItem="wT1-jD-6aC" firstAttribute="leading" secondItem="icl-ar-8yG" secondAttribute="trailing" constant="8" symbolic="YES" id="KoN-Fl-uJL"/>
<constraint firstItem="hws-J2-FDl" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="ADB-Wp-iDy" secondAttribute="leading" constant="20" symbolic="YES" id="Mw5-kn-leS"/>
<constraint firstItem="icl-ar-8yG" firstAttribute="leading" secondItem="ADB-Wp-iDy" secondAttribute="leading" priority="750" constant="20" symbolic="YES" id="Nu0-Yn-XtG"/>
<constraint firstItem="hws-J2-FDl" firstAttribute="baseline" secondItem="5XW-Ju-Ix5" secondAttribute="baseline" id="Nzy-QY-qI7"/>
<constraint firstItem="XWT-pS-k8a" firstAttribute="leading" secondItem="5XW-Ju-Ix5" secondAttribute="trailing" constant="4" id="O59-QP-0a7"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="Cfh-8I-pCg" secondAttribute="trailing" constant="20" symbolic="YES" id="P98-Fy-JKM"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="6lq-jQ-EgE" secondAttribute="trailing" constant="20" symbolic="YES" id="PO6-5z-jqA"/>
<constraint firstItem="Fcc-rL-m1T" firstAttribute="centerY" secondItem="ZHd-UF-pkx" secondAttribute="centerY" id="RCo-rU-m4T"/>
<constraint firstItem="ey0-BL-08J" firstAttribute="baseline" secondItem="HDH-L4-Ss3" secondAttribute="baseline" id="S0a-ur-MUh"/>
<constraint firstItem="C0e-PH-i1L" firstAttribute="leading" secondItem="ZHd-UF-pkx" secondAttribute="trailing" constant="8" symbolic="YES" id="V8g-sy-xjE"/>
<constraint firstItem="C0e-PH-i1L" firstAttribute="top" secondItem="Fcc-rL-m1T" secondAttribute="bottom" constant="4" id="XLX-B0-BhH"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="I9r-vj-2gy" secondAttribute="trailing" constant="20" symbolic="YES" id="YQF-EN-qdM"/>
<constraint firstItem="Tqw-t1-w9R" firstAttribute="firstBaseline" secondItem="rE0-DL-xRG" secondAttribute="firstBaseline" id="YcJ-G1-i8m"/>
<constraint firstItem="2y3-Ti-pue" firstAttribute="leading" secondItem="Tqw-t1-w9R" secondAttribute="trailing" constant="8" symbolic="YES" id="Yr6-oY-U95"/>
<constraint firstItem="NDr-Yf-V2q" firstAttribute="height" secondItem="3IH-by-XSu" secondAttribute="height" id="a5C-yC-NzS"/>
<constraint firstItem="xDf-ra-dem" firstAttribute="baseline" secondItem="hws-J2-FDl" secondAttribute="baseline" id="aGv-1b-NB8"/>
<constraint firstItem="rE0-DL-xRG" firstAttribute="trailing" secondItem="icl-ar-8yG" secondAttribute="trailing" id="bcF-aH-RCz"/>
<constraint firstItem="NDr-Yf-V2q" firstAttribute="leading" secondItem="xjz-30-0d3" secondAttribute="trailing" constant="8" symbolic="YES" id="d8r-yo-Dkx"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="xDf-ra-dem" secondAttribute="trailing" constant="20" symbolic="YES" id="dQb-HU-As6"/>
<constraint firstItem="ZHd-UF-pkx" firstAttribute="trailing" secondItem="icl-ar-8yG" secondAttribute="trailing" id="dsb-lL-rDZ"/>
<constraint firstItem="ZHd-UF-pkx" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="ADB-Wp-iDy" secondAttribute="leading" constant="20" symbolic="YES" id="fOs-n2-f0l"/>
<constraint firstItem="k1t-Xk-gYs" firstAttribute="firstBaseline" secondItem="PBB-XC-8pV" secondAttribute="firstBaseline" id="fjE-B0-T7M"/>
<constraint firstItem="5XW-Ju-Ix5" firstAttribute="leading" secondItem="hws-J2-FDl" secondAttribute="trailing" constant="8" symbolic="YES" id="hAo-EC-eWc"/>
<constraint firstItem="sbW-46-DFB" firstAttribute="firstBaseline" secondItem="rE0-DL-xRG" secondAttribute="firstBaseline" id="i7c-59-tbF"/>
<constraint firstItem="HDH-L4-Ss3" firstAttribute="trailing" secondItem="icl-ar-8yG" secondAttribute="trailing" id="ioD-gT-aRd"/>
<constraint firstItem="NDr-Yf-V2q" firstAttribute="centerY" secondItem="3IH-by-XSu" secondAttribute="centerY" id="jsR-IB-Fs3"/>
<constraint firstItem="uMj-Iu-oCy" firstAttribute="centerY" secondItem="wT1-jD-6aC" secondAttribute="centerY" id="kAR-SJ-LpJ"/>
<constraint firstItem="5XW-Ju-Ix5" firstAttribute="top" secondItem="C0e-PH-i1L" secondAttribute="bottom" constant="8" symbolic="YES" id="kkn-Bj-lmj"/>
<constraint firstItem="PBB-XC-8pV" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="ADB-Wp-iDy" secondAttribute="leading" constant="20" symbolic="YES" id="lue-Wq-su3"/>
<constraint firstItem="XWT-pS-k8a" firstAttribute="centerY" secondItem="5XW-Ju-Ix5" secondAttribute="centerY" id="nIK-25-MZX"/>
<constraint firstItem="uMj-Iu-oCy" firstAttribute="leading" secondItem="wT1-jD-6aC" secondAttribute="trailing" constant="8" symbolic="YES" id="oIB-6V-zoG"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="ey0-BL-08J" secondAttribute="trailing" constant="20" symbolic="YES" id="osa-dq-HAu"/>
<constraint firstItem="I9r-vj-2gy" firstAttribute="leading" secondItem="icl-ar-8yG" secondAttribute="trailing" constant="8" symbolic="YES" id="pWb-lP-gpe"/>
<constraint firstAttribute="bottom" secondItem="xjz-30-0d3" secondAttribute="bottom" id="pux-GC-jcy"/>
<constraint firstItem="xDf-ra-dem" firstAttribute="leading" secondItem="XWT-pS-k8a" secondAttribute="trailing" constant="6" id="qV9-uL-22L"/>
<constraint firstItem="HDH-L4-Ss3" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="ADB-Wp-iDy" secondAttribute="leading" constant="20" symbolic="YES" id="reo-sF-nO1"/>
<constraint firstItem="Cfh-8I-pCg" firstAttribute="leading" secondItem="C0e-PH-i1L" secondAttribute="trailing" constant="8" symbolic="YES" id="rms-Hn-Hfj"/>
<constraint firstItem="2y3-Ti-pue" firstAttribute="firstBaseline" secondItem="rE0-DL-xRG" secondAttribute="firstBaseline" id="s8V-H4-8Cq"/>
<constraint firstItem="I9r-vj-2gy" firstAttribute="top" secondItem="wT1-jD-6aC" secondAttribute="bottom" constant="4" id="sUB-Yu-Aiy"/>
<constraint firstItem="Cfh-8I-pCg" firstAttribute="firstBaseline" secondItem="C0e-PH-i1L" secondAttribute="firstBaseline" id="sfd-h0-Ujb"/>
<constraint firstItem="k1t-Xk-gYs" firstAttribute="leading" secondItem="PBB-XC-8pV" secondAttribute="trailing" constant="8" symbolic="YES" id="swM-YK-xv3"/>
<constraint firstItem="4cD-mR-vJc" firstAttribute="firstBaseline" secondItem="I9r-vj-2gy" secondAttribute="firstBaseline" id="uyq-Ib-2OJ"/>
<constraint firstItem="NDr-Yf-V2q" firstAttribute="trailing" secondItem="wT1-jD-6aC" secondAttribute="trailing" id="vhb-1A-XI4"/>
<constraint firstItem="xjz-30-0d3" firstAttribute="centerY" secondItem="3IH-by-XSu" secondAttribute="centerY" id="x9O-rT-kr6"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="4cD-mR-vJc" secondAttribute="trailing" constant="20" symbolic="YES" id="yDG-8O-FQS"/>
<constraint firstItem="ey0-BL-08J" firstAttribute="leading" secondItem="NDr-Yf-V2q" secondAttribute="trailing" constant="8" symbolic="YES" id="zgt-8r-RVi"/>
</constraints>
</customView>
<box horizontalHuggingPriority="750" horizontalCompressionResistancePriority="250" boxType="custom" borderType="line" titlePosition="noTitle" translatesAutoresizingMaskIntoConstraints="NO" id="B3l-Yn-4KT">
<rect key="frame" x="20" y="52" width="181" height="280"/>
<view key="contentView" id="Btf-Bu-KOk">
<rect key="frame" x="1" y="1" width="179" height="278"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<scrollView verticalCompressionResistancePriority="250" borderType="none" autohidesScrollers="YES" horizontalLineScroll="20" horizontalPageScroll="10" verticalLineScroll="20" verticalPageScroll="10" translatesAutoresizingMaskIntoConstraints="NO" id="QiH-I6-BXd">
<rect key="frame" x="0.0" y="25" width="179" height="254"/>
<clipView key="contentView" drawsBackground="NO" translatesAutoresizingMaskIntoConstraints="NO" id="lhq-HG-y2I">
<rect key="frame" x="0.0" y="0.0" width="179" height="254"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView focusRingType="none" verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" tableStyle="fullWidth" columnReordering="NO" columnResizing="NO" multipleSelection="NO" emptySelection="NO" autosaveColumns="NO" rowHeight="16" rowSizeStyle="automatic" headerView="3yq-Qd-FKt" viewBased="YES" translatesAutoresizingMaskIntoConstraints="NO" id="8ed-Dt-hO9">
<rect key="frame" x="0.0" y="0.0" width="179" height="226"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<size key="intercellSpacing" width="3" height="4"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<tableColumns>
<tableColumn identifier="themeName" width="167" minWidth="40" maxWidth="1000" id="Avf-y8-wXG">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left" title="Theme">
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" white="0.33333298560000002" alpha="1" colorSpace="calibratedWhite"/>
</tableHeaderCell>
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" alignment="left" id="dK4-Cd-J4F">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
<prototypeCellViews>
<tableCellView id="IKs-Gh-g0j">
<rect key="frame" x="1" y="2" width="176" height="16"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews>
<textField focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" allowsCharacterPickerTouchBarItem="YES" id="jVT-ne-6NT">
<rect key="frame" x="0.0" y="0.0" width="176" height="16"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" title="THEME NAME" id="sRo-2c-Ydn">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
<connections>
<outlet property="menu" destination="M4k-Ev-Myg" id="zWN-Yl-PDh"/>
</connections>
</textFieldCell>
<connections>
<binding destination="IKs-Gh-g0j" name="value" keyPath="objectValue" id="P0s-5L-KQc"/>
<outlet property="delegate" destination="WBM-EY-ENr" id="IXD-nD-kYW"/>
<outlet property="menu" destination="M4k-Ev-Myg" id="fHh-J8-IRy"/>
</connections>
</textField>
</subviews>
<connections>
<outlet property="textField" destination="jVT-ne-6NT" id="A0T-8c-Wdk"/>
</connections>
</tableCellView>
</prototypeCellViews>
</tableColumn>
</tableColumns>
<connections>
<outlet property="dataSource" destination="WBM-EY-ENr" id="a9G-bE-Siw"/>
<outlet property="delegate" destination="WBM-EY-ENr" id="rQa-wZ-hU0"/>
<outlet property="menu" destination="M4k-Ev-Myg" id="61W-DK-Mqy"/>
</connections>
</tableView>
</subviews>
<nil key="backgroundColor"/>
</clipView>
<scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="FrY-ys-Wya">
<rect key="frame" x="0.0" y="238" width="179" height="16"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="Czd-4t-kEc">
<autoresizingMask key="autoresizingMask"/>
</scroller>
<tableHeaderView key="headerView" wantsLayer="YES" id="3yq-Qd-FKt">
<rect key="frame" x="0.0" y="0.0" width="179" height="28"/>
<autoresizingMask key="autoresizingMask"/>
</tableHeaderView>
</scrollView>
<box verticalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="dse-xO-np5">
<rect key="frame" x="4" y="22" width="171" height="5"/>
</box>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Ka6-Bf-yVl">
<rect key="frame" x="2" y="-0.5" width="24.5" height="27"/>
<buttonCell key="cell" type="smallSquare" bezelStyle="smallSquare" image="NSAddTemplate" imagePosition="overlaps" alignment="center" state="on" imageScaling="proportionallyDown" inset="2" id="5JO-2k-t8K">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<constraints>
<constraint firstAttribute="height" constant="23" id="U6N-28-bzY"/>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="24" id="tOH-dt-pv7"/>
</constraints>
<connections>
<action selector="addTheme:" target="WBM-EY-ENr" id="jUp-f8-fQO"/>
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="FYd-hb-j4K">
<rect key="frame" x="25" y="4" width="24.5" height="18"/>
<buttonCell key="cell" type="smallSquare" bezelStyle="smallSquare" image="NSRemoveTemplate" imagePosition="overlaps" alignment="center" state="on" imageScaling="proportionallyDown" inset="2" id="Srn-QD-aiu">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="deleteTheme:" target="WBM-EY-ENr" id="7QN-od-mTI"/>
<binding destination="WBM-EY-ENr" name="enabled" keyPath="bundled" id="Cc5-WI-n1S">
<dictionary key="options">
<string key="NSValueTransformerName">NSNegateBoolean</string>
</dictionary>
</binding>
</connections>
</button>
<popUpButton translatesAutoresizingMaskIntoConstraints="NO" id="IcH-In-axb">
<rect key="frame" x="136" y="1" width="41" height="23"/>
<popUpButtonCell key="cell" type="smallSquare" bezelStyle="smallSquare" imagePosition="only" alignment="center" lineBreakMode="truncatingTail" state="on" imageScaling="proportionallyDown" inset="2" pullsDown="YES" id="LkE-Zl-odd">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="HHh-e3-GD4">
<items>
<menuItem state="on" image="NSActionTemplate" hidden="YES" id="4m4-1Z-aml"/>
<menuItem title="Rename" id="8h0-Xi-AHB">
<connections>
<action selector="renameTheme:" target="WBM-EY-ENr" id="sco-hn-q1t"/>
</connections>
</menuItem>
<menuItem title="Duplicate" id="5Eu-k1-cjE">
<connections>
<action selector="duplicateTheme:" target="WBM-EY-ENr" id="l5d-Ec-SIg"/>
</connections>
</menuItem>
<menuItem title="Restore" id="kFt-8v-8ZZ">
<connections>
<action selector="restoreTheme:" target="WBM-EY-ENr" id="BOc-Ck-jVs"/>
</connections>
</menuItem>
<menuItem title="Export…" id="4B4-mq-8Fs">
<connections>
<action selector="exportTheme:" target="WBM-EY-ENr" id="TXi-66-Pnk"/>
</connections>
</menuItem>
<menuItem title="Share…" id="w4F-0P-Rgk">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="shareTheme:" target="WBM-EY-ENr" id="q7F-W6-i6I"/>
</connections>
</menuItem>
<menuItem title="Reveal in Finder" alternate="YES" id="Qmf-WU-xe8">
<modifierMask key="keyEquivalentModifierMask" option="YES"/>
<connections>
<action selector="revealThemeInFinder:" target="WBM-EY-ENr" id="deU-Ap-uFR"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="cpZ-mc-g3N"/>
<menuItem title="Import…" id="gcs-B8-kPL">
<connections>
<action selector="importTheme:" target="WBM-EY-ENr" id="hXl-4t-O2Y"/>
</connections>
</menuItem>
<menuItem title="Reload All Themes" alternate="YES" id="7Yp-bg-3l6">
<modifierMask key="keyEquivalentModifierMask" option="YES"/>
<connections>
<action selector="reloadAllThemes:" target="WBM-EY-ENr" id="MEI-6f-bnd"/>
</connections>
</menuItem>
</items>
</menu>
</popUpButtonCell>
<constraints>
<constraint firstAttribute="width" constant="36" id="pud-N8-x0h"/>
</constraints>
</popUpButton>
</subviews>
<constraints>
<constraint firstItem="dse-xO-np5" firstAttribute="leading" secondItem="Btf-Bu-KOk" secondAttribute="leading" constant="4" id="32b-ZM-PQT"/>
<constraint firstItem="QiH-I6-BXd" firstAttribute="top" secondItem="Btf-Bu-KOk" secondAttribute="top" constant="-1" id="3Jt-zQ-YwB"/>
<constraint firstAttribute="trailing" secondItem="IcH-In-axb" secondAttribute="trailing" constant="2" id="4s6-Jx-1sL"/>
<constraint firstAttribute="trailing" secondItem="QiH-I6-BXd" secondAttribute="trailing" id="6Xd-3d-Kg9"/>
<constraint firstItem="IcH-In-axb" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="FYd-hb-j4K" secondAttribute="trailing" constant="8" symbolic="YES" id="8Pt-XM-JZ1"/>
<constraint firstItem="FYd-hb-j4K" firstAttribute="width" secondItem="Ka6-Bf-yVl" secondAttribute="width" id="9mu-Mk-KCj"/>
<constraint firstItem="Ka6-Bf-yVl" firstAttribute="leading" secondItem="Btf-Bu-KOk" secondAttribute="leading" constant="2" id="AUl-Dn-Cca"/>
<constraint firstItem="IcH-In-axb" firstAttribute="height" secondItem="Ka6-Bf-yVl" secondAttribute="height" id="CTS-qE-Tlv"/>
<constraint firstItem="IcH-In-axb" firstAttribute="top" secondItem="dse-xO-np5" secondAttribute="bottom" id="G8l-37-0if"/>
<constraint firstItem="FYd-hb-j4K" firstAttribute="height" secondItem="Ka6-Bf-yVl" secondAttribute="height" id="Hgh-SU-hi4"/>
<constraint firstAttribute="bottom" secondItem="IcH-In-axb" secondAttribute="bottom" constant="1" id="dt7-mr-jPC"/>
<constraint firstItem="dse-xO-np5" firstAttribute="top" secondItem="QiH-I6-BXd" secondAttribute="bottom" id="fLt-Ed-YUP"/>
<constraint firstAttribute="trailing" secondItem="dse-xO-np5" secondAttribute="trailing" constant="4" id="skw-3j-8lI"/>
<constraint firstItem="FYd-hb-j4K" firstAttribute="leading" secondItem="Ka6-Bf-yVl" secondAttribute="trailing" constant="-1" id="tl4-wy-5ZZ"/>
<constraint firstItem="QiH-I6-BXd" firstAttribute="leading" secondItem="Btf-Bu-KOk" secondAttribute="leading" id="uFh-bw-Q0a"/>
<constraint firstItem="IcH-In-axb" firstAttribute="centerY" secondItem="Ka6-Bf-yVl" secondAttribute="centerY" id="wv5-yu-oGs"/>
<constraint firstItem="FYd-hb-j4K" firstAttribute="centerY" secondItem="Ka6-Bf-yVl" secondAttribute="centerY" id="yCe-mu-DgM"/>
</constraints>
</view>
<constraints>
<constraint firstAttribute="height" constant="280" id="XFu-Q3-aaP"/>
</constraints>
<color key="borderColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<color key="fillColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</box>
<box autoresizesSubviews="NO" boxType="custom" borderType="line" titlePosition="noTitle" translatesAutoresizingMaskIntoConstraints="NO" id="nMR-L3-OOw">
<rect key="frame" x="200" y="52" width="380" height="280"/>
<view key="contentView" id="XwV-Se-xeY">
<rect key="frame" x="1" y="1" width="378" height="278"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
</view>
<constraints>
<constraint firstAttribute="width" constant="380" id="iLy-T8-AkH"/>
</constraints>
<color key="borderColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<color key="fillColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</box>
<button identifier="settings_appearance" horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="19L-5s-cbB">
<rect key="frame" x="557" y="16" width="25" height="25"/>
<buttonCell key="cell" type="help" bezelStyle="helpButton" alignment="center" borderStyle="border" inset="2" id="sFb-B9-3cy">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="openHelpAnchor:" target="6Aq-a8-hQi" id="697-lX-F36"/>
</connections>
</button>
</subviews>
<constraints>
<constraint firstItem="ADB-Wp-iDy" firstAttribute="top" secondItem="LgU-un-VaX" secondAttribute="top" id="2Xy-Cw-V3x"/>
<constraint firstItem="nMR-L3-OOw" firstAttribute="leading" secondItem="B3l-Yn-4KT" secondAttribute="trailing" constant="-1" id="9hT-rL-Jha"/>
<constraint firstAttribute="trailing" secondItem="19L-5s-cbB" secondAttribute="trailing" constant="20" symbolic="YES" id="Djj-Q7-GeI"/>
<constraint firstItem="ADB-Wp-iDy" firstAttribute="centerX" secondItem="LgU-un-VaX" secondAttribute="centerX" id="FDv-bS-dUT"/>
<constraint firstItem="B3l-Yn-4KT" firstAttribute="top" secondItem="ADB-Wp-iDy" secondAttribute="bottom" constant="16" symbolic="YES" id="Gdd-8F-gWW"/>
<constraint firstItem="nMR-L3-OOw" firstAttribute="height" secondItem="B3l-Yn-4KT" secondAttribute="height" id="M2x-H1-dgQ"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="ADB-Wp-iDy" secondAttribute="trailing" id="Oha-cg-3l5"/>
<constraint firstItem="B3l-Yn-4KT" firstAttribute="leading" secondItem="LgU-un-VaX" secondAttribute="leading" constant="20" symbolic="YES" id="PUD-QZ-e8E"/>
<constraint firstItem="ADB-Wp-iDy" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="LgU-un-VaX" secondAttribute="leading" id="Qj1-TF-ecN"/>
<constraint firstAttribute="bottom" secondItem="19L-5s-cbB" secondAttribute="bottom" constant="20" symbolic="YES" id="Zxo-90-BLg"/>
<constraint firstItem="19L-5s-cbB" firstAttribute="top" secondItem="nMR-L3-OOw" secondAttribute="bottom" constant="12" symbolic="YES" id="b5i-CQ-iba"/>
<constraint firstItem="19L-5s-cbB" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="LgU-un-VaX" secondAttribute="leading" constant="20" symbolic="YES" id="rQc-wR-agD"/>
<constraint firstAttribute="trailing" secondItem="nMR-L3-OOw" secondAttribute="trailing" constant="20" symbolic="YES" id="rRQ-U3-JYv"/>
<constraint firstItem="nMR-L3-OOw" firstAttribute="top" secondItem="B3l-Yn-4KT" secondAttribute="top" id="xDe-wv-TJf"/>
</constraints>
</view>
<connections>
<outlet property="darkAppearanceButton" destination="sbW-46-DFB" id="4e1-Vl-q7O"/>
<outlet property="defaultAppearanceButton" destination="Tqw-t1-w9R" id="ybc-Zx-N1i"/>
<outlet property="editorOpacityField" destination="ey0-BL-08J" id="yVs-S7-vws"/>
<outlet property="fontField" destination="wT1-jD-6aC" id="bP0-VX-1Yp"/>
<outlet property="lightAppearanceButton" destination="2y3-Ti-pue" id="IX9-V1-jjs"/>
<outlet property="lineHeightField" destination="5XW-Ju-Ix5" id="hEH-sP-bVE"/>
<outlet property="monospacedFontField" destination="Fcc-rL-m1T" id="rGb-bO-Rcl"/>
<outlet property="themeTableActionButton" destination="IcH-In-axb" id="C7J-hZ-38T"/>
<outlet property="themeTableMenu" destination="M4k-Ev-Myg" id="fHl-oM-EJc"/>
<outlet property="themeTableView" destination="8ed-Dt-hO9" id="00r-aw-jk5"/>
<outlet property="themeViewContainer" destination="nMR-L3-OOw" id="6zc-c1-iFP"/>
</connections>
</viewController>
<customObject id="6Aq-a8-hQi" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
<menu id="M4k-Ev-Myg" userLabel="Theme Table Menu">
<items>
<menuItem title="New Theme" id="sJb-7g-2FN">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="addTheme:" target="WBM-EY-ENr" id="KTG-fY-DA7"/>
</connections>
</menuItem>
<menuItem title="Duplicate" id="9LW-xw-HBP">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="duplicateTheme:" target="WBM-EY-ENr" id="F3J-BN-cRO"/>
</connections>
</menuItem>
<menuItem title="Restore" id="vTP-Fc-iBF">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="restoreTheme:" target="WBM-EY-ENr" id="ZUB-ys-apg"/>
</connections>
</menuItem>
<menuItem title="Rename" id="nWy-OL-CGi">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="renameTheme:" target="WBM-EY-ENr" id="f9E-2Q-JFg"/>
</connections>
</menuItem>
<menuItem title="Delete" id="WNG-Ai-RdG">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="deleteTheme:" target="WBM-EY-ENr" id="nAN-Hv-S4c"/>
</connections>
</menuItem>
<menuItem title="Export…" id="ueG-D7-DSV">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="exportTheme:" target="WBM-EY-ENr" id="Ioz-ZQ-bfh"/>
</connections>
</menuItem>
<menuItem title="Share…" id="pTV-O2-2db">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="shareTheme:" target="WBM-EY-ENr" id="Ijb-ce-jZ5"/>
</connections>
</menuItem>
<menuItem title="Reveal in Finder" alternate="YES" id="UMs-gY-YHE">
<modifierMask key="keyEquivalentModifierMask" option="YES"/>
<connections>
<action selector="revealThemeInFinder:" target="WBM-EY-ENr" id="a7f-62-vFK"/>
</connections>
</menuItem>
<menuItem title="Import…" id="52n-xG-4ZL">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="importTheme:" target="WBM-EY-ENr" id="prC-cV-bH1"/>
</connections>
</menuItem>
</items>
</menu>
<userDefaultsController representsSharedInstance="YES" id="IE5-39-jAY" userLabel="Shared User Defaults Controller"/>
</objects>
<point key="canvasLocation" x="0.0" y="0.0"/>
</scene>
</scenes>
<resources>
<image name="NSActionTemplate" width="20" height="20"/>
<image name="NSAddTemplate" width="18" height="17"/>
<image name="NSRemoveTemplate" width="18" height="5"/>
</resources>
</document>

View File

@ -0,0 +1,315 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="22505" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" initialViewController="WBM-EY-ENr">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="22505"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--Theme View Controller-->
<scene sceneID="oau-eS-BHv">
<objects>
<viewController id="WBM-EY-ENr" customClass="ThemeViewController" customModule="CotEditor" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" horizontalHuggingPriority="750" verticalCompressionResistancePriority="250" id="LgU-un-VaX">
<rect key="frame" x="0.0" y="0.0" width="560" height="280"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews>
<box horizontalHuggingPriority="750" horizontalCompressionResistancePriority="250" boxType="custom" borderType="line" titlePosition="noTitle" translatesAutoresizingMaskIntoConstraints="NO" id="B3l-Yn-4KT">
<rect key="frame" x="0.0" y="0.0" width="181" height="280"/>
<view key="contentView" id="Btf-Bu-KOk">
<rect key="frame" x="1" y="1" width="179" height="278"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<scrollView verticalCompressionResistancePriority="250" borderType="none" autohidesScrollers="YES" horizontalLineScroll="20" horizontalPageScroll="10" verticalLineScroll="20" verticalPageScroll="10" translatesAutoresizingMaskIntoConstraints="NO" id="QiH-I6-BXd">
<rect key="frame" x="0.0" y="25" width="179" height="254"/>
<clipView key="contentView" drawsBackground="NO" id="lhq-HG-y2I">
<rect key="frame" x="0.0" y="0.0" width="179" height="254"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView focusRingType="none" verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" tableStyle="fullWidth" columnReordering="NO" columnResizing="NO" multipleSelection="NO" emptySelection="NO" autosaveColumns="NO" rowHeight="16" rowSizeStyle="automatic" headerView="3yq-Qd-FKt" viewBased="YES" id="8ed-Dt-hO9">
<rect key="frame" x="0.0" y="0.0" width="179" height="226"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<size key="intercellSpacing" width="3" height="4"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<tableColumns>
<tableColumn identifier="themeName" width="167" minWidth="40" maxWidth="1000" id="Avf-y8-wXG">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left" title="Theme">
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" white="0.33333298560000002" alpha="1" colorSpace="calibratedWhite"/>
</tableHeaderCell>
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" alignment="left" id="dK4-Cd-J4F">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
<prototypeCellViews>
<tableCellView id="IKs-Gh-g0j">
<rect key="frame" x="1" y="2" width="176" height="16"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews>
<textField focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" allowsCharacterPickerTouchBarItem="YES" id="jVT-ne-6NT">
<rect key="frame" x="0.0" y="0.0" width="176" height="16"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" title="THEME NAME" id="sRo-2c-Ydn">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
<connections>
<outlet property="menu" destination="M4k-Ev-Myg" id="zWN-Yl-PDh"/>
</connections>
</textFieldCell>
<connections>
<binding destination="IKs-Gh-g0j" name="value" keyPath="objectValue" id="P0s-5L-KQc"/>
<outlet property="delegate" destination="WBM-EY-ENr" id="IXD-nD-kYW"/>
<outlet property="menu" destination="M4k-Ev-Myg" id="fHh-J8-IRy"/>
</connections>
</textField>
</subviews>
<connections>
<outlet property="textField" destination="jVT-ne-6NT" id="A0T-8c-Wdk"/>
</connections>
</tableCellView>
</prototypeCellViews>
</tableColumn>
</tableColumns>
<connections>
<outlet property="dataSource" destination="WBM-EY-ENr" id="a9G-bE-Siw"/>
<outlet property="delegate" destination="WBM-EY-ENr" id="rQa-wZ-hU0"/>
<outlet property="menu" destination="M4k-Ev-Myg" id="61W-DK-Mqy"/>
</connections>
</tableView>
</subviews>
<nil key="backgroundColor"/>
</clipView>
<scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="FrY-ys-Wya">
<rect key="frame" x="0.0" y="238" width="179" height="16"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="Czd-4t-kEc">
<autoresizingMask key="autoresizingMask"/>
</scroller>
<tableHeaderView key="headerView" wantsLayer="YES" id="3yq-Qd-FKt">
<rect key="frame" x="0.0" y="0.0" width="179" height="28"/>
<autoresizingMask key="autoresizingMask"/>
</tableHeaderView>
</scrollView>
<box verticalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="dse-xO-np5">
<rect key="frame" x="4" y="22" width="171" height="5"/>
</box>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Ka6-Bf-yVl">
<rect key="frame" x="2" y="-0.5" width="24.5" height="27"/>
<buttonCell key="cell" type="smallSquare" bezelStyle="smallSquare" image="NSAddTemplate" imagePosition="overlaps" alignment="center" state="on" imageScaling="proportionallyDown" inset="2" id="5JO-2k-t8K">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<constraints>
<constraint firstAttribute="height" constant="23" id="U6N-28-bzY"/>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="24" id="tOH-dt-pv7"/>
</constraints>
<connections>
<action selector="addTheme:" target="WBM-EY-ENr" id="jUp-f8-fQO"/>
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="FYd-hb-j4K">
<rect key="frame" x="25" y="4" width="24.5" height="18"/>
<buttonCell key="cell" type="smallSquare" bezelStyle="smallSquare" image="NSRemoveTemplate" imagePosition="overlaps" alignment="center" state="on" imageScaling="proportionallyDown" inset="2" id="Srn-QD-aiu">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="deleteTheme:" target="WBM-EY-ENr" id="7QN-od-mTI"/>
<binding destination="WBM-EY-ENr" name="enabled" keyPath="bundled" id="Cc5-WI-n1S">
<dictionary key="options">
<string key="NSValueTransformerName">NSNegateBoolean</string>
</dictionary>
</binding>
</connections>
</button>
<popUpButton translatesAutoresizingMaskIntoConstraints="NO" id="IcH-In-axb">
<rect key="frame" x="136" y="1" width="41" height="23"/>
<popUpButtonCell key="cell" type="smallSquare" bezelStyle="smallSquare" imagePosition="only" alignment="center" lineBreakMode="truncatingTail" state="on" imageScaling="proportionallyDown" inset="2" pullsDown="YES" id="LkE-Zl-odd">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="HHh-e3-GD4">
<items>
<menuItem state="on" image="NSActionTemplate" hidden="YES" id="4m4-1Z-aml"/>
<menuItem title="Rename" id="8h0-Xi-AHB">
<connections>
<action selector="renameTheme:" target="WBM-EY-ENr" id="sco-hn-q1t"/>
</connections>
</menuItem>
<menuItem title="Duplicate" id="5Eu-k1-cjE">
<connections>
<action selector="duplicateTheme:" target="WBM-EY-ENr" id="l5d-Ec-SIg"/>
</connections>
</menuItem>
<menuItem title="Restore" id="kFt-8v-8ZZ">
<connections>
<action selector="restoreTheme:" target="WBM-EY-ENr" id="BOc-Ck-jVs"/>
</connections>
</menuItem>
<menuItem title="Export…" id="4B4-mq-8Fs">
<connections>
<action selector="exportTheme:" target="WBM-EY-ENr" id="TXi-66-Pnk"/>
</connections>
</menuItem>
<menuItem title="Share…" id="w4F-0P-Rgk">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="shareTheme:" target="WBM-EY-ENr" id="q7F-W6-i6I"/>
</connections>
</menuItem>
<menuItem title="Reveal in Finder" alternate="YES" id="Qmf-WU-xe8">
<modifierMask key="keyEquivalentModifierMask" option="YES"/>
<connections>
<action selector="revealThemeInFinder:" target="WBM-EY-ENr" id="deU-Ap-uFR"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="cpZ-mc-g3N"/>
<menuItem title="Import…" id="gcs-B8-kPL">
<connections>
<action selector="importTheme:" target="WBM-EY-ENr" id="hXl-4t-O2Y"/>
</connections>
</menuItem>
<menuItem title="Reload All Themes" alternate="YES" id="7Yp-bg-3l6">
<modifierMask key="keyEquivalentModifierMask" option="YES"/>
<connections>
<action selector="reloadAllThemes:" target="WBM-EY-ENr" id="MEI-6f-bnd"/>
</connections>
</menuItem>
</items>
</menu>
</popUpButtonCell>
<constraints>
<constraint firstAttribute="width" constant="36" id="pud-N8-x0h"/>
</constraints>
</popUpButton>
</subviews>
<constraints>
<constraint firstItem="dse-xO-np5" firstAttribute="leading" secondItem="Btf-Bu-KOk" secondAttribute="leading" constant="4" id="32b-ZM-PQT"/>
<constraint firstItem="QiH-I6-BXd" firstAttribute="top" secondItem="Btf-Bu-KOk" secondAttribute="top" constant="-1" id="3Jt-zQ-YwB"/>
<constraint firstAttribute="trailing" secondItem="IcH-In-axb" secondAttribute="trailing" constant="2" id="4s6-Jx-1sL"/>
<constraint firstAttribute="trailing" secondItem="QiH-I6-BXd" secondAttribute="trailing" id="6Xd-3d-Kg9"/>
<constraint firstItem="IcH-In-axb" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="FYd-hb-j4K" secondAttribute="trailing" constant="8" symbolic="YES" id="8Pt-XM-JZ1"/>
<constraint firstItem="FYd-hb-j4K" firstAttribute="width" secondItem="Ka6-Bf-yVl" secondAttribute="width" id="9mu-Mk-KCj"/>
<constraint firstItem="Ka6-Bf-yVl" firstAttribute="leading" secondItem="Btf-Bu-KOk" secondAttribute="leading" constant="2" id="AUl-Dn-Cca"/>
<constraint firstItem="IcH-In-axb" firstAttribute="height" secondItem="Ka6-Bf-yVl" secondAttribute="height" id="CTS-qE-Tlv"/>
<constraint firstItem="IcH-In-axb" firstAttribute="top" secondItem="dse-xO-np5" secondAttribute="bottom" id="G8l-37-0if"/>
<constraint firstItem="FYd-hb-j4K" firstAttribute="height" secondItem="Ka6-Bf-yVl" secondAttribute="height" id="Hgh-SU-hi4"/>
<constraint firstAttribute="bottom" secondItem="IcH-In-axb" secondAttribute="bottom" constant="1" id="dt7-mr-jPC"/>
<constraint firstItem="dse-xO-np5" firstAttribute="top" secondItem="QiH-I6-BXd" secondAttribute="bottom" id="fLt-Ed-YUP"/>
<constraint firstAttribute="trailing" secondItem="dse-xO-np5" secondAttribute="trailing" constant="4" id="skw-3j-8lI"/>
<constraint firstItem="FYd-hb-j4K" firstAttribute="leading" secondItem="Ka6-Bf-yVl" secondAttribute="trailing" constant="-1" id="tl4-wy-5ZZ"/>
<constraint firstItem="QiH-I6-BXd" firstAttribute="leading" secondItem="Btf-Bu-KOk" secondAttribute="leading" id="uFh-bw-Q0a"/>
<constraint firstItem="IcH-In-axb" firstAttribute="centerY" secondItem="Ka6-Bf-yVl" secondAttribute="centerY" id="wv5-yu-oGs"/>
<constraint firstItem="FYd-hb-j4K" firstAttribute="centerY" secondItem="Ka6-Bf-yVl" secondAttribute="centerY" id="yCe-mu-DgM"/>
</constraints>
</view>
<constraints>
<constraint firstAttribute="height" constant="280" id="XFu-Q3-aaP"/>
</constraints>
<color key="borderColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<color key="fillColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</box>
<box autoresizesSubviews="NO" boxType="custom" borderType="line" titlePosition="noTitle" translatesAutoresizingMaskIntoConstraints="NO" id="nMR-L3-OOw">
<rect key="frame" x="180" y="0.0" width="380" height="280"/>
<view key="contentView" id="XwV-Se-xeY">
<rect key="frame" x="1" y="1" width="378" height="278"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
</view>
<constraints>
<constraint firstAttribute="width" constant="380" id="iLy-T8-AkH"/>
</constraints>
<color key="borderColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<color key="fillColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</box>
</subviews>
<constraints>
<constraint firstItem="B3l-Yn-4KT" firstAttribute="top" secondItem="LgU-un-VaX" secondAttribute="top" id="9QZ-cq-2Rc"/>
<constraint firstItem="nMR-L3-OOw" firstAttribute="leading" secondItem="B3l-Yn-4KT" secondAttribute="trailing" constant="-1" id="9hT-rL-Jha"/>
<constraint firstAttribute="bottom" secondItem="B3l-Yn-4KT" secondAttribute="bottom" id="CkI-pa-qX7"/>
<constraint firstItem="nMR-L3-OOw" firstAttribute="height" secondItem="B3l-Yn-4KT" secondAttribute="height" id="M2x-H1-dgQ"/>
<constraint firstItem="B3l-Yn-4KT" firstAttribute="leading" secondItem="LgU-un-VaX" secondAttribute="leading" id="PUD-QZ-e8E"/>
<constraint firstAttribute="trailing" secondItem="nMR-L3-OOw" secondAttribute="trailing" id="rRQ-U3-JYv"/>
<constraint firstItem="nMR-L3-OOw" firstAttribute="top" secondItem="B3l-Yn-4KT" secondAttribute="top" id="xDe-wv-TJf"/>
</constraints>
</view>
<connections>
<outlet property="actionButton" destination="IcH-In-axb" id="hVw-gM-yuO"/>
<outlet property="contextMenu" destination="M4k-Ev-Myg" id="DY0-cx-TNb"/>
<outlet property="tableView" destination="8ed-Dt-hO9" id="DOi-ce-8mk"/>
<outlet property="themeViewContainer" destination="nMR-L3-OOw" id="6zc-c1-iFP"/>
</connections>
</viewController>
<customObject id="6Aq-a8-hQi" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
<menu id="M4k-Ev-Myg" userLabel="Theme Table Menu">
<items>
<menuItem title="New Theme" id="sJb-7g-2FN">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="addTheme:" target="WBM-EY-ENr" id="KTG-fY-DA7"/>
</connections>
</menuItem>
<menuItem title="Duplicate" id="9LW-xw-HBP">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="duplicateTheme:" target="WBM-EY-ENr" id="F3J-BN-cRO"/>
</connections>
</menuItem>
<menuItem title="Restore" id="vTP-Fc-iBF">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="restoreTheme:" target="WBM-EY-ENr" id="ZUB-ys-apg"/>
</connections>
</menuItem>
<menuItem title="Rename" id="nWy-OL-CGi">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="renameTheme:" target="WBM-EY-ENr" id="f9E-2Q-JFg"/>
</connections>
</menuItem>
<menuItem title="Delete" id="WNG-Ai-RdG">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="deleteTheme:" target="WBM-EY-ENr" id="nAN-Hv-S4c"/>
</connections>
</menuItem>
<menuItem title="Export…" id="ueG-D7-DSV">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="exportTheme:" target="WBM-EY-ENr" id="Ioz-ZQ-bfh"/>
</connections>
</menuItem>
<menuItem title="Share…" id="pTV-O2-2db">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="shareTheme:" target="WBM-EY-ENr" id="Ijb-ce-jZ5"/>
</connections>
</menuItem>
<menuItem title="Reveal in Finder" alternate="YES" id="UMs-gY-YHE">
<modifierMask key="keyEquivalentModifierMask" option="YES"/>
<connections>
<action selector="revealThemeInFinder:" target="WBM-EY-ENr" id="a7f-62-vFK"/>
</connections>
</menuItem>
<menuItem title="Import…" id="52n-xG-4ZL">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="importTheme:" target="WBM-EY-ENr" id="prC-cV-bH1"/>
</connections>
</menuItem>
</items>
</menu>
<userDefaultsController representsSharedInstance="YES" id="IE5-39-jAY" userLabel="Shared User Defaults Controller"/>
</objects>
<point key="canvasLocation" x="0.0" y="0.0"/>
</scene>
</scenes>
<resources>
<image name="NSActionTemplate" width="20" height="20"/>
<image name="NSAddTemplate" width="18" height="17"/>
<image name="NSRemoveTemplate" width="18" height="5"/>
</resources>
</document>

View File

@ -1,36 +0,0 @@
//
// AccessibleStepper.swift
//
// CotEditor
// https://coteditor.com
//
// Created by 1024jp on 2021-09-19.
//
// ---------------------------------------------------------------------------
//
// © 2021 1024jp
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
import AppKit
final class AccessibleStepper: NSStepper {
override func accessibilityValue() -> Any? {
// workaround the issue that the value is read in percent in VoiceOver
// (macOS 11, 2021)
self.stringValue
}
}

View File

@ -0,0 +1,156 @@
//
// AntialiasingTextField.swift
//
// CotEditor
// https://coteditor.com
//
// Created by 1024jp on 2016-05-08.
//
// ---------------------------------------------------------------------------
//
// © 2016-2024 1024jp
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
import SwiftUI
import AppKit
struct AntialiasingText: NSViewRepresentable {
typealias NSViewType = NSTextField
private var text: String
private var antialiasDisabled: Bool = false
private var font: NSFont?
init(_ text: String) {
self.text = text
}
func makeNSView(context: Context) -> NSTextField {
let nsView = AntialiasingTextField(string: self.text)
nsView.isEditable = false
nsView.isSelectable = false
nsView.frame.size.height = 22
nsView.alignment = .center
// keep initial field height
nsView.heightAnchor.constraint(equalToConstant: nsView.frame.height).isActive = true
return nsView
}
func updateNSView(_ nsView: NSTextField, context: Context) {
nsView.stringValue = self.text
nsView.font = self.font
(nsView as! AntialiasingTextField).antialiasDisabled = self.antialiasDisabled
}
/// Sets whether disables the antialias.
///
/// - Parameter disabled: The antialias state to change.
func antialiasDisabled(_ disabled: Bool = true) -> Self {
var view = self
view.antialiasDisabled = disabled
return view
}
/// Sets the font to display.
///
/// - Parameter font: The font.
func font(nsFont font: NSFont?) -> Self {
var view = self
view.font = font
return view
}
}
private final class AntialiasingTextField: NSTextField {
@Invalidating(.display) var antialiasDisabled = false
override class var cellClass: AnyClass? {
get { CenteringTextFieldCell.self }
set { _ = newValue }
}
/// Controls antialiasing of text.
override func draw(_ dirtyRect: NSRect) {
if self.antialiasDisabled {
NSGraphicsContext.saveGraphicsState()
NSGraphicsContext.current?.shouldAntialias = false
}
super.draw(dirtyRect)
if self.antialiasDisabled {
NSGraphicsContext.restoreGraphicsState()
}
}
}
private final class CenteringTextFieldCell: NSTextFieldCell {
/// Returns the rect of content text.
override func titleRect(forBounds rect: NSRect) -> NSRect {
var titleRect = super.titleRect(forBounds: rect)
let titleSize = self.attributedStringValue.size()
titleRect.origin.y = (rect.minY + (rect.height - titleSize.height) / 2).rounded(.down)
titleRect.size.height = rect.height - titleRect.origin.y
return titleRect
}
/// Draws inside of the field.
override func drawInterior(withFrame cellFrame: NSRect, in controlView: NSView) {
self.attributedStringValue.draw(in: self.titleRect(forBounds: cellFrame))
}
}
// MARK: - Preview
@available(macOS 14, *)
#Preview(traits: .fixedLayout(width: 200, height: 400)) {
VStack {
AntialiasingText("Antialias Text")
.antialiasDisabled(true)
AntialiasingText("Smooth Text")
.antialiasDisabled(false)
.font(nsFont: NSFont.monospacedSystemFont(ofSize: 8, weight: .regular))
}.padding()
}

View File

@ -1,52 +0,0 @@
//
// AntialiasingTextField.swift
//
// CotEditor
// https://coteditor.com
//
// Created by 1024jp on 2016-05-08.
//
// ---------------------------------------------------------------------------
//
// © 2016-2022 1024jp
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
import AppKit
final class AntialiasingTextField: NSTextField {
// MARK: Public Properties
@Invalidating(.display) var disablesAntialiasing = false
// MARK: Text Field Methods
/// Controls antialiasing of text.
override func draw(_ dirtyRect: NSRect) {
if self.disablesAntialiasing {
NSGraphicsContext.saveGraphicsState()
NSGraphicsContext.current?.shouldAntialias = false
}
super.draw(dirtyRect)
if self.disablesAntialiasing {
NSGraphicsContext.restoreGraphicsState()
}
}
}

View File

@ -89,4 +89,10 @@ extension AppStorage {
self.init(wrappedValue: defaultValue, key.rawValue, store: store)
}
init(_ key: DefaultKey<Value>, store: UserDefaults? = nil) where Value == Data? {
self.init(key.rawValue, store: store)
}
}

View File

@ -0,0 +1,272 @@
//
// AppearanceSettingsView.swift
//
// CotEditor
// https://coteditor.com
//
// Created by 1024jp on 2014-04-18.
//
// ---------------------------------------------------------------------------
//
// © 2014-2024 1024jp
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
import SwiftUI
struct AppearanceSettingsView: View {
@AppStorage(.fontPreference) private var fontPreference
@AppStorage(.font) private var font
@AppStorage(.shouldAntialias) private var shouldAntialias
@AppStorage(.ligature) private var ligature
@AppStorage(.monospacedFont) private var monospacedFont
@AppStorage(.monospacedShouldAntialias) private var monospacedShouldAntialias
@AppStorage(.monospacedLigature) private var monospacedLigature
@AppStorage(.lineHeight) private var lineHeight
@AppStorage(.documentAppearance) private var documentAppearance
@AppStorage(.windowAlpha) private var windowAlpha
@State private var selectingFont: Data?
@State private var isMonospacedFontAlertPresented = false
var body: some View {
Grid(alignment: .leadingFirstTextBaseline, verticalSpacing: 8) {
GridRow {
Text("Prefer font using:", tableName: "AppearanceSettings")
.gridColumnAlignment(.trailing)
Picker(selection: $fontPreference) {
Text(FontPreference.automatic.label).tag(FontPreference.automatic)
Divider()
Text(FontPreference.standard.label).tag(FontPreference.standard)
Text(FontPreference.monospaced.label).tag(FontPreference.monospaced)
} label: {
EmptyView()
}.fixedSize()
}
GridRow {
Text("Standard font:", tableName: "AppearanceSettings")
.gridColumnAlignment(.trailing)
FontSettingView(data: $font ?? (try! FontType.standard.systemFont().archivedData), antialias: $shouldAntialias, ligature: $ligature)
}
GridRow {
Text("Monospaced font:", tableName: "AppearanceSettings")
.gridColumnAlignment(.trailing)
FontSettingView(data: $monospacedFont ?? (try! FontType.monospaced.systemFont().archivedData), antialias: $monospacedShouldAntialias, ligature: $monospacedLigature)
.onChange(of: self.monospacedFont) { [oldData = self.monospacedFont] data in
guard
let data,
let font = NSFont(archivedData: data),
!font.isFixedPitch
else { return }
self.selectingFont = oldData
self.isMonospacedFontAlertPresented = true
}
.alert(String(localized: "The selected font doesnt seem to be monospaced.", table: "AppearanceSettings"), isPresented: $isMonospacedFontAlertPresented, presenting: self.selectingFont) { font in
Button("OK") {
self.isMonospacedFontAlertPresented = false
}
Button("Cancel") {
self.monospacedFont = font
self.isMonospacedFontAlertPresented = false
}
} message: { _ in
Text("Do you want to use it for the monospaced font?", tableName: "AppearanceSettings", comment: "“it” is the selected font.")
}
}
GridRow {
Text("Line height:", tableName: "AppearanceSettings")
.gridColumnAlignment(.trailing)
HStack(alignment: .firstTextBaseline) {
Stepper(value: $lineHeight, in: 0.1...10, step: 0.1, format: .number, label: EmptyView.init)
.monospacedDigit()
.multilineTextAlignment(.trailing)
Text("times", tableName: "AppearanceSettings", comment: "unit for line height")
}
}
GridRow {
Text("Appearance:", tableName: "AppearanceSettings")
.gridColumnAlignment(.trailing)
Picker(selection: $documentAppearance) {
ForEach(AppearanceMode.allCases, id: \.self) {
Text($0.label)
}
} label: {
EmptyView()
}
.pickerStyle(.radioGroup)
.horizontalRadioGroupLayout()
.labelsHidden()
}
GridRow(alignment: .center) {
Text("Editor opacity:", tableName: "AppearanceSettings")
.gridColumnAlignment(.trailing)
HStack {
OpacitySlider(value: $windowAlpha)
.frame(width: 240)
TextField(value: $windowAlpha, format: .percent.precision(.fractionLength(0)), prompt: Text(1, format: .percent), label: EmptyView.init)
.monospacedDigit()
.multilineTextAlignment(.trailing)
.frame(width: 48)
}
}
ThemeView()
.padding(.top, 10)
HStack {
Spacer()
HelpButton(anchor: "settings_appearance")
}
}
.scenePadding()
.frame(minWidth: 600)
}
}
private struct FontSettingView: View {
@Binding var data: Data
@Binding var antialias: Bool
@Binding var ligature: Bool
private var font: Binding<NSFont> {
Binding(get: { NSFont(archivedData: self.data) ?? .init() },
set: { self.data = (try? $0.archivedData) ?? self.data })
}
var body: some View {
VStack(alignment: .leading, spacing: 5) {
HStack {
AntialiasingText(self.displayFontName)
.antialiasDisabled(!self.antialias)
.font(nsFont: self.font.wrappedValue.withSize(0))
.help(self.displayFontName)
.frame(maxWidth: 260)
.alignmentGuide(.firstTextBaseline) { $0.height }
FontPicker(String(localized: "Select…", table: "AppearanceSettings", comment: "label for font picker button"), selection: self.font)
}
HStack {
Toggle(String(localized: "Antialias", table: "AppearanceSettings"), isOn: $antialias)
Toggle(String(localized: "Ligatures", table: "AppearanceSettings"), isOn: $ligature)
}.controlSize(.small)
}
}
/// Returns the font name and size to display.
private var displayFontName: String {
let font = self.font.wrappedValue
return "\(font.displayName ?? font.fontName) \(font.pointSize.formatted())"
}
}
private struct ThemeView: NSViewControllerRepresentable {
typealias NSViewControllerType = ThemeViewController
func makeNSViewController(context: Context) -> ThemeViewController {
NSStoryboard(name: "ThemeView", bundle: nil).instantiateInitialController()!
}
func updateNSViewController(_ nsViewController: ThemeViewController, context: Context) {
}
}
private extension FontPreference {
var label: String {
switch self {
case .automatic:
String(localized: "FontPreference.automatic.label",
defaultValue: "Automatically",
table: "AppearanceSettings")
case .monospaced:
String(localized: "FontPreference.monospaced.label",
defaultValue: "Monospaced",
table: "AppearanceSettings")
case .standard:
String(localized: "FontPreference.standard.label",
defaultValue: "Standard",
table: "AppearanceSettings")
}
}
}
private extension AppearanceMode {
var label: String {
switch self {
case .default:
String(localized: "AppearanceMode.automatic.label",
defaultValue: "Match System",
table: "AppearanceSettings")
case .light:
String(localized: "AppearanceMode.light.label",
defaultValue: "Light",
table: "AppearanceSettings")
case .dark:
String(localized: "AppearanceMode.dark.label",
defaultValue: "Dark",
table: "AppearanceSettings")
}
}
}
// MARK: - Preview
#Preview {
AppearanceSettingsView()
}
#Preview("FontSettingView") {
@State var antialias = false
@State var ligature = false
return FontSettingView(data: .constant(Data()), antialias: $antialias, ligature: $ligature)
.padding()
}

View File

@ -1,48 +0,0 @@
//
// CenteringTextFieldCell.swift
//
// CotEditor
// https://coteditor.com
//
// Created by 1024jp on 2016-09-16.
//
// ---------------------------------------------------------------------------
//
// © 2016-2021 1024jp
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
import AppKit
final class CenteringTextFieldCell: NSTextFieldCell {
/// Returns the rect of content text.
override func titleRect(forBounds rect: NSRect) -> NSRect {
var titleRect = super.titleRect(forBounds: rect)
let titleSize = self.attributedStringValue.size()
titleRect.origin.y = (rect.minY + (rect.height - titleSize.height) / 2).rounded(.down)
titleRect.size.height = rect.height - titleRect.origin.y
return titleRect
}
/// Draws inside of the field.
override func drawInterior(withFrame cellFrame: NSRect, in controlView: NSView) {
self.attributedStringValue.draw(in: self.titleRect(forBounds: cellFrame))
}
}

View File

@ -48,7 +48,7 @@ enum WritingDirection: Int, CaseIterable {
}
enum FontPreference: Int {
enum FontPreference: Int, CaseIterable {
case automatic
case monospaced
@ -56,7 +56,7 @@ enum FontPreference: Int {
}
enum AppearanceMode: Int {
enum AppearanceMode: Int, CaseIterable {
case `default`
case light

View File

@ -1,79 +0,0 @@
//
// OpacitySampleView.swift
//
// CotEditor
// https://coteditor.com
//
// Created by 1024jp on 2018-06-07.
//
// ---------------------------------------------------------------------------
//
// © 2018-2023 1024jp
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
import AppKit
@IBDesignable
final class OpacitySampleView: NSView {
// MARK: Inspectable Properties
@IBInspectable private var opacity: CGFloat = 0.5
// MARK: Private Properties
private let cornerRadius: CGFloat = 4
private let padding: CGFloat = 3
// MARK: View Methods
override func draw(_ dirtyRect: NSRect) {
NSGraphicsContext.saveGraphicsState()
// draw bezel
let baseFrame = self.bounds.insetBy(dx: NSBezierPath.defaultLineWidth / 2,
dy: NSBezierPath.defaultLineWidth / 2)
let basePath = NSBezierPath(roundedRect: baseFrame,
xRadius: self.cornerRadius,
yRadius: self.cornerRadius)
NSColor.controlBackgroundColor.setFill()
basePath.fill()
NSColor.gridColor.setStroke()
basePath.stroke()
// draw triangle
let innerFrame = self.bounds.insetBy(dx: self.padding, dy: self.padding)
let path = NSBezierPath()
path.move(to: innerFrame.origin)
path.line(to: NSPoint(x: innerFrame.maxX, y: innerFrame.maxY))
path.line(to: NSPoint(x: innerFrame.maxX, y: innerFrame.minY))
path.close()
let innerRadius = max(self.cornerRadius - self.padding, 0)
let clip = NSBezierPath(roundedRect: innerFrame, xRadius: innerRadius, yRadius: innerRadius)
path.append(clip)
path.setClip()
NSColor.labelColor.withAlphaComponent(1 - self.opacity).setFill()
path.fill()
NSGraphicsContext.restoreGraphicsState()
}
}

View File

@ -64,16 +64,11 @@ final class SettingsWindowController: NSWindowController {
private extension SettingsPane {
private enum ViewType {
case storyboard(NSStoryboard.Name)
case swiftUI(any View)
}
var tabViewItem: NSTabViewItem {
let tabViewItem = NSTabViewItem(viewController: self.viewController)
let viewController = NSHostingController(rootView: AnyView(self.view))
viewController.sizingOptions = .preferredContentSize
let tabViewItem = NSTabViewItem(viewController: viewController)
tabViewItem.label = self.label
tabViewItem.image = NSImage(systemSymbolName: self.symbolName, accessibilityDescription: self.label)
tabViewItem.identifier = self.rawValue
@ -82,30 +77,16 @@ private extension SettingsPane {
}
private var viewController: NSViewController {
switch self.viewType {
case .storyboard(let name):
return NSStoryboard(name: name, bundle: nil).instantiateInitialController()!
case .swiftUI(let view):
let controller = NSHostingController(rootView: AnyView(view))
controller.sizingOptions = .preferredContentSize
return controller
}
}
private var viewType: ViewType {
private var view: any View {
switch self {
case .general: .swiftUI(GeneralSettingsView())
case .appearance: .storyboard("AppearancePane")
case .window: .swiftUI(WindowSettingsView())
case .edit: .swiftUI(EditSettingsView())
case .format: .swiftUI(FormatSettingsView())
case .snippets: .swiftUI(SnippetsSettingsView())
case .keyBindings: .swiftUI(KeyBindingsSettingsView())
case .general: GeneralSettingsView()
case .appearance: AppearanceSettingsView()
case .window: WindowSettingsView()
case .edit: EditSettingsView()
case .format: FormatSettingsView()
case .snippets: SnippetsSettingsView()
case .keyBindings: KeyBindingsSettingsView()
}
}
}

View File

@ -1,5 +1,5 @@
//
// AppearancePaneController.swift
// ThemeViewController.swift
//
// CotEditor
// https://coteditor.com
@ -9,7 +9,7 @@
// ---------------------------------------------------------------------------
//
// © 2004-2007 nakamuxu
// © 2014-2023 1024jp
// © 2014-2024 1024jp
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@ -30,30 +30,19 @@ import Combine
import SwiftUI
import UniformTypeIdentifiers
final class AppearancePaneController: NSViewController, NSMenuItemValidation, NSTableViewDelegate, NSTableViewDataSource, NSFilePromiseProviderDelegate, NSTextFieldDelegate {
final class ThemeViewController: NSViewController, NSMenuItemValidation, NSTableViewDelegate, NSTableViewDataSource, NSFilePromiseProviderDelegate, NSTextFieldDelegate {
// MARK: Private Properties
private var fontPanelTarget: FontType = .standard
private var themeNames: [String] = []
private var settingNames: [String] = []
@objc private dynamic var isBundled = false // bound to remove button
private var fontObservers: Set<AnyCancellable> = []
private var themeManagerObservers: Set<AnyCancellable> = []
private var observers: Set<AnyCancellable> = []
private lazy var filePromiseQueue = OperationQueue()
@IBOutlet private weak var fontField: AntialiasingTextField?
@IBOutlet private weak var monospacedFontField: AntialiasingTextField?
@IBOutlet private weak var lineHeightField: NSTextField?
@IBOutlet private weak var editorOpacityField: NSTextField?
@IBOutlet private weak var defaultAppearanceButton: NSButton?
@IBOutlet private weak var lightAppearanceButton: NSButton?
@IBOutlet private weak var darkAppearanceButton: NSButton?
@IBOutlet private weak var themeTableView: NSTableView?
@IBOutlet private var themeTableActionButton: NSButton?
@IBOutlet private var themeTableMenu: NSMenu?
@IBOutlet private weak var tableView: NSTableView?
@IBOutlet private var actionButton: NSButton?
@IBOutlet private var contextMenu: NSMenu?
@IBOutlet private var themeViewContainer: NSBox?
@ -66,14 +55,10 @@ final class AppearancePaneController: NSViewController, NSMenuItemValidation, NS
// register drag & drop types
let receiverTypes = NSFilePromiseReceiver.readableDraggedTypes.map { NSPasteboard.PasteboardType($0) }
self.themeTableView?.registerForDraggedTypes([.fileURL] + receiverTypes)
self.themeTableView?.setDraggingSourceOperationMask(.copy, forLocal: false)
self.tableView?.registerForDraggedTypes([.fileURL] + receiverTypes)
self.tableView?.setDraggingSourceOperationMask(.copy, forLocal: false)
// set initial value as field's placeholder
self.lineHeightField?.bindNullPlaceholderToUserDefaults()
self.editorOpacityField?.bindNullPlaceholderToUserDefaults()
self.themeNames = ThemeManager.shared.settingNames
self.settingNames = ThemeManager.shared.settingNames
}
@ -81,44 +66,22 @@ final class AppearancePaneController: NSViewController, NSMenuItemValidation, NS
super.viewWillAppear()
// setup font fields
self.fontObservers = [
UserDefaults.standard.publisher(for: .font, initial: true)
.sink { [weak self] _ in self?.fontField?.displayFontName(for: UserDefaults.standard.font(for: .standard)) },
UserDefaults.standard.publisher(for: .shouldAntialias, initial: true)
.sink { [weak self] in self?.fontField?.disablesAntialiasing = !$0 },
UserDefaults.standard.publisher(for: .monospacedFont, initial: true)
.sink { [weak self] _ in self?.monospacedFontField?.displayFontName(for: UserDefaults.standard.font(for: .monospaced)) },
UserDefaults.standard.publisher(for: .monospacedShouldAntialias, initial: true)
.sink { [weak self] in self?.monospacedFontField?.disablesAntialiasing = !$0 },
]
// select one of appearance radio buttons
switch UserDefaults.standard[.documentAppearance] {
case .default:
self.defaultAppearanceButton?.state = .on
case .light:
self.lightAppearanceButton?.state = .on
case .dark:
self.darkAppearanceButton?.state = .on
}
// sync theme list change
self.themeManagerObservers = [
// sync list change
self.observers = [
ThemeManager.shared.$settingNames
.receive(on: RunLoop.main)
.sink { [weak self] _ in self?.updateThemeList() },
.sink { [weak self] _ in self?.updateList() },
ThemeManager.shared.didUpdateSetting
.compactMap(\.new)
.receive(on: RunLoop.main)
.filter { [weak self] in $0 == self?.selectedThemeName }
.filter { [weak self] in $0 == self?.selectedSettingName }
.sink { [weak self] name in
guard let theme = ThemeManager.shared.setting(name: name) else { return }
self?.setTheme(theme, name: name)
},
]
self.themeTableView?.scrollToBeginningOfDocument(nil)
self.tableView?.scrollToBeginningOfDocument(nil)
}
@ -126,15 +89,7 @@ final class AppearancePaneController: NSViewController, NSMenuItemValidation, NS
super.viewDidDisappear()
// stop observations for UI update
self.fontObservers.removeAll()
self.themeManagerObservers.removeAll()
// detach a possible font panel's target set in `showFonts(_:)`
if NSFontManager.shared.target === self {
NSFontManager.shared.target = nil
NSFontPanel.shared.close()
}
self.observers.removeAll()
}
@ -143,7 +98,7 @@ final class AppearancePaneController: NSViewController, NSMenuItemValidation, NS
func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
let isContextMenu = (menuItem.menu == self.themeTableMenu)
let isContextMenu = (menuItem.menu == self.contextMenu)
let settingName = self.representedSettingName(for: menuItem.menu)
menuItem.representedObject = settingName
@ -213,14 +168,14 @@ final class AppearancePaneController: NSViewController, NSMenuItemValidation, NS
/// The number of themes.
func numberOfRows(in tableView: NSTableView) -> Int {
self.themeNames.count
self.settingNames.count
}
/// The content of the table cell.
func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any? {
self.themeNames[safe: row]
self.settingNames[safe: row]
}
@ -277,7 +232,7 @@ final class AppearancePaneController: NSViewController, NSMenuItemValidation, NS
func tableView(_ tableView: NSTableView, pasteboardWriterForRow row: Int) -> (any NSPasteboardWriting)? {
let provider = NSFilePromiseProvider(fileType: UTType.cotTheme.identifier, delegate: self)
provider.userInfo = self.themeNames[row]
provider.userInfo = self.settingNames[row]
return provider
}
@ -312,13 +267,11 @@ final class AppearancePaneController: NSViewController, NSMenuItemValidation, NS
// MARK: Delegate
// NSTableViewDelegate < themeTableView
// NSTableViewDelegate < tableView
func tableViewSelectionDidChange(_ notification: Notification) {
guard notification.object as? NSTableView == self.themeTableView else { return }
self.setTheme(name: self.selectedThemeName)
self.setTheme(name: self.selectedSettingName)
}
@ -326,8 +279,8 @@ final class AppearancePaneController: NSViewController, NSMenuItemValidation, NS
guard let view = rowView.view(atColumn: 0) as? NSTableCellView else { return }
let themeName = self.themeNames[row]
let isBundled = ThemeManager.shared.state(of: themeName)?.isBundled == true
let settingName = self.settingNames[row]
let isBundled = ThemeManager.shared.state(of: settingName)?.isBundled == true
view.textField?.isSelectable = false
view.textField?.isEditable = !isBundled
@ -344,7 +297,7 @@ final class AppearancePaneController: NSViewController, NSMenuItemValidation, NS
// finish if empty (The original name will be restored automatically)
guard !newName.isEmpty else { return true }
let oldName = self.selectedThemeName
let oldName = self.selectedSettingName
do {
try ThemeManager.shared.renameSetting(name: oldName, to: newName)
@ -369,18 +322,6 @@ final class AppearancePaneController: NSViewController, NSMenuItemValidation, NS
// MARK: Action Messages
/// A radio button for `documentAppearance` was clicked.
@IBAction func updateAppearanceSetting(_ sender: NSButton) {
UserDefaults.standard[.documentAppearance] = AppearanceMode(rawValue: sender.tag)!
let themeName = ThemeManager.shared.userDefaultSettingName
let row = self.themeNames.firstIndex(of: themeName) ?? 0
self.themeTableView?.selectRowIndexes([row], byExtendingSelection: false)
}
/// Adds a new theme.
@IBAction func addTheme(_ sender: Any?) {
@ -392,14 +333,14 @@ final class AppearancePaneController: NSViewController, NSMenuItemValidation, NS
return
}
self.updateThemeList(bySelecting: settingName)
self.updateList(bySelecting: settingName)
}
/// Duplicates the selected theme.
@IBAction func duplicateTheme(_ sender: Any?) {
let baseName = self.targetThemeName(for: sender)
let baseName = self.targetSettingName(for: sender)
let settingName: String
do {
settingName = try ThemeManager.shared.duplicateSetting(name: baseName)
@ -408,42 +349,42 @@ final class AppearancePaneController: NSViewController, NSMenuItemValidation, NS
return
}
self.updateThemeList(bySelecting: settingName)
self.updateList(bySelecting: settingName)
}
/// Starts renaming a theme.
@IBAction func renameTheme(_ sender: Any?) {
let themeName = self.targetThemeName(for: sender)
let row = self.themeNames.firstIndex(of: themeName) ?? 0
let settingName = self.targetSettingName(for: sender)
let row = self.settingNames.firstIndex(of: settingName) ?? 0
self.themeTableView?.editColumn(0, row: row, with: nil, select: false)
self.tableView?.editColumn(0, row: row, with: nil, select: false)
}
/// Deletes the selected theme.
@IBAction func deleteTheme(_ sender: Any?) {
let themeName = self.targetThemeName(for: sender)
let settingName = self.targetSettingName(for: sender)
self.deleteTheme(name: themeName)
self.deleteTheme(name: settingName)
}
/// Restores the selected theme to original bundled one.
@IBAction func restoreTheme(_ sender: Any?) {
let themeName = self.targetThemeName(for: sender)
let settingName = self.targetSettingName(for: sender)
self.restoreTheme(name: themeName)
self.restoreTheme(name: settingName)
}
/// Exports the selected theme.
@IBAction func exportTheme(_ sender: Any?) {
let settingName = self.targetThemeName(for: sender)
let settingName = self.targetSettingName(for: sender)
let savePanel = NSSavePanel()
savePanel.canCreateDirectories = true
@ -488,16 +429,16 @@ final class AppearancePaneController: NSViewController, NSMenuItemValidation, NS
/// Shares the selected themes.
@IBAction func shareTheme(_ sender: NSMenuItem) {
let themeName = self.targetThemeName(for: sender)
let settingName = self.targetSettingName(for: sender)
guard let url = ThemeManager.shared.urlForUserSetting(name: themeName) else { return }
guard let url = ThemeManager.shared.urlForUserSetting(name: settingName) else { return }
let picker = NSSharingServicePicker(items: [url])
if let view = self.themeTableView?.clickedRowView { // context menu
if let view = self.tableView?.clickedRowView { // context menu
picker.show(relativeTo: .zero, of: view, preferredEdge: .minX)
} else if let view = self.themeTableActionButton { // action menu
} else if let view = self.actionButton { // action menu
picker.show(relativeTo: .zero, of: view, preferredEdge: .minY)
}
}
@ -506,9 +447,9 @@ final class AppearancePaneController: NSViewController, NSMenuItemValidation, NS
/// Opens the theme directory in the Application Support directory in the Finder where the selected theme exists.
@IBAction func revealThemeInFinder(_ sender: Any?) {
let themeName = self.targetThemeName(for: sender)
let settingName = self.targetSettingName(for: sender)
guard let url = ThemeManager.shared.urlForUserSetting(name: themeName) else { return }
guard let url = ThemeManager.shared.urlForUserSetting(name: settingName) else { return }
NSWorkspace.shared.activateFileViewerSelecting([url])
}
@ -527,12 +468,12 @@ final class AppearancePaneController: NSViewController, NSMenuItemValidation, NS
// MARK: Private Methods
/// Theme name which is currently selected in the list table.
private var selectedThemeName: String {
private var selectedSettingName: String {
guard let tableView = self.themeTableView, tableView.selectedRow >= 0 else {
guard let tableView = self.tableView, tableView.selectedRow >= 0 else {
return ThemeManager.shared.userDefaultSettingName
}
return self.themeNames[tableView.selectedRow]
return self.settingNames[tableView.selectedRow]
}
@ -540,24 +481,24 @@ final class AppearancePaneController: NSViewController, NSMenuItemValidation, NS
///
/// - Parameter sender: The sender to test.
/// - Returns: The setting name.
private func targetThemeName(for sender: Any?) -> String {
private func targetSettingName(for sender: Any?) -> String {
if let menuItem = sender as? NSMenuItem {
return menuItem.representedObject as! String
}
return self.selectedThemeName
return self.selectedSettingName
}
private func representedSettingName(for menu: NSMenu?) -> String? {
guard self.themeTableView?.menu == menu else {
return self.selectedThemeName
guard self.tableView?.menu == menu else {
return self.selectedSettingName
}
guard let clickedRow = self.themeTableView?.clickedRow, clickedRow != -1 else { return nil } // clicked blank area
guard let clickedRow = self.tableView?.clickedRow, clickedRow != -1 else { return nil } // clicked blank area
return self.themeNames[safe: clickedRow]
return self.settingNames[safe: clickedRow]
}
@ -663,17 +604,17 @@ final class AppearancePaneController: NSViewController, NSMenuItemValidation, NS
/// Updates the theme table and selects the desired item.
///
/// - Parameter selectingName: The item name to select.
private func updateThemeList(bySelecting selectingName: String? = nil) {
private func updateList(bySelecting selectingName: String? = nil) {
let themeName = selectingName ?? ThemeManager.shared.userDefaultSettingName
let settingName = selectingName ?? ThemeManager.shared.userDefaultSettingName
self.themeNames = ThemeManager.shared.settingNames
self.settingNames = ThemeManager.shared.settingNames
guard let tableView = self.themeTableView else { return }
guard let tableView = self.tableView else { return }
tableView.reloadData()
let row = self.themeNames.firstIndex(of: themeName) ?? 0
let row = self.settingNames.firstIndex(of: settingName) ?? 0
tableView.selectRowIndexes([row], byExtendingSelection: false)
if selectingName != nil {
@ -685,90 +626,9 @@ final class AppearancePaneController: NSViewController, NSMenuItemValidation, NS
/// Updates the selection of the theme table.
private func updateThemeSelection() {
let themeName = ThemeManager.shared.userDefaultSettingName
let row = self.themeNames.firstIndex(of: themeName) ?? 0
let settingName = ThemeManager.shared.userDefaultSettingName
let row = self.settingNames.firstIndex(of: settingName) ?? 0
self.themeTableView?.selectRowIndexes([row], byExtendingSelection: false)
}
}
// MARK: - Font Setting
extension NSUserInterfaceItemIdentifier {
static let monospacedFontButton = Self("monospacedFontButton")
}
extension AppearancePaneController: NSFontChanging {
// MARK: Font Changing Methods
/// Restricts items to display in the font panel.
func validModesForFontPanel(_ fontPanel: NSFontPanel) -> NSFontPanel.ModeMask {
[.collection, .face, .size]
}
/// Returns the font selection in the font panel did update.
func changeFont(_ sender: NSFontManager?) {
guard let sender else { return assertionFailure() }
let font = sender.convert(.systemFont(ofSize: 0))
let target = self.fontPanelTarget
if target == .monospaced, !font.isFixedPitch {
let alert = NSAlert()
alert.alertStyle = .warning
alert.messageText = String(localized: "The selected font doesnt seem to be monospaced.")
alert.informativeText = String(localized: "Do you want to use it for the monospaced font?", comment: "“it” is the selected font.")
alert.addButton(withTitle: String(localized: "OK"))
alert.addButton(withTitle: String(localized: "Cancel"))
guard alert.runModal() == .alertFirstButtonReturn else { return }
}
guard let data = try? font.archivedData else { return }
UserDefaults.standard[.fontKey(for: target)] = data
}
// MARK: Action Messages
/// Shows the font panel.
@IBAction func showFonts(_ sender: NSButton) {
self.fontPanelTarget = (sender.identifier == .monospacedFontButton) ? .monospaced : .standard
let font = UserDefaults.standard.font(for: self.fontPanelTarget)
NSFontManager.shared.setSelectedFont(font, isMultiple: false)
NSFontManager.shared.orderFrontFontPanel(sender)
NSFontManager.shared.target = self
}
}
private extension NSTextField {
/// Displays the font name and size in the manner of the given font setting.
///
/// - Parameters:
/// - font: The font to display.
func displayFontName(for font: NSFont) {
let displayName = font.displayName ?? font.fontName
let size = font.pointSize
let maxDisplaySize = NSFont.systemFontSize(for: self.controlSize)
self.stringValue = displayName + " " + size.formatted()
self.toolTip = self.stringValue
self.font = font.withSize(min(size, maxDisplaySize))
self.tableView?.selectRowIndexes([row], byExtendingSelection: false)
}
}

View File

@ -549,11 +549,6 @@
"Key Bindings" = "Kláv. zkratky";
// Appearance pane
// alert message
"The selected font doesnt seem to be monospaced." = "Zdá se, že vybrané písmo není neproporcionální.";
"Do you want to use it for the monospaced font?" = "Chcete ho použít pro neproporcionální písmo?"; // “it” is the selected font.
// tooltip
"Jump to URL" = "Přejít na URL";

View File

@ -549,11 +549,6 @@
"Key Bindings" = "Kurzbefehle";
// Appearance pane
// alert message
"The selected font doesnt seem to be monospaced." = "Die ausgewählte Schrift scheint proportional.";
"Do you want to use it for the monospaced font?" = "Möchtest du sie für die nichtproportionale Schrift verwenden?"; // “it” is the selected font.
// tooltip
"Jump to URL" = "URL öffnen";

View File

@ -549,11 +549,6 @@
"Key Bindings" = "Key Bindings";
// Appearance pane
// alert message
"The selected font doesnt seem to be monospaced." = "The selected font doesnt seem to be monospaced.";
"Do you want to use it for the monospaced font?" = "Do you want to use it for the monospaced font?"; // “it” is the selected font.
// tooltip
"Jump to URL" = "Jump to URL";

View File

@ -549,11 +549,6 @@
"Key Bindings" = "Atajos de teclado";
// Appearance pane
// alert message
"The selected font doesnt seem to be monospaced." = "La fuente seleccionada no parece ser monoespaciada."; // FIXME: needs review
"Do you want to use it for the monospaced font?" = "¿Quieres usarlo para la fuente monoespaciada?"; // “it” is the selected font. // FIXME: needs review
// tooltip
"Jump to URL" = "Saltar a la URL";

View File

@ -549,11 +549,6 @@
"Key Bindings" = "Raccourcis";
// Appearance pane
// alert message
"The selected font doesnt seem to be monospaced." = "La police sélectionnée ne semble pas être monochasse.";
"Do you want to use it for the monospaced font?" = "Voulez-vous l'utiliser comme police monochasse ?"; // “it” is the selected font.
// tooltip
"Jump to URL" = "Ouvrir lURL";

View File

@ -549,11 +549,6 @@
"Key Bindings" = "Abbreviazioni";
// Appearance pane
// alert message
"The selected font doesnt seem to be monospaced." = "La font selezionata non sembra a spaziatura fissa.";
"Do you want to use it for the monospaced font?" = "La vuoi usare come font a spaziatura fissa?"; // “it” is the selected font.
// tooltip
"Jump to URL" = "Vai allURL";

View File

@ -550,11 +550,6 @@
"Key Bindings" = "キーバインド";
// Appearance pane
// alert message
"The selected font doesnt seem to be monospaced." = "選択したフォントは等幅フォントではないようです。";
"Do you want to use it for the monospaced font?" = "選択したフォントを等幅フォントとして使用しますか?"; // “it” is the selected font.
// tooltip
"Jump to URL" = "URLにジャンプ";

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -549,11 +549,6 @@
"Key Bindings" = "Atalhos";
// Appearance pane
// alert message
"The selected font doesnt seem to be monospaced." = "A fonte selecionada não parace ser monoespaçada.";
"Do you want to use it for the monospaced font?" = "Você deseja usar a fonte selecionada como fonte monoespaçada?"; // “it” is the selected font.
// tooltip
"Jump to URL" = "Visite o URL";

View File

@ -549,11 +549,6 @@
"Key Bindings" = "Düğme Bağıntıları";
// Appearance pane
// alert message
"The selected font doesnt seem to be monospaced." = "Seçili font, sabit genişlikli değil gibi görünüyor";
"Do you want to use it for the monospaced font?" = "Sabit genişlikli font olarak kullanmak istiyor musunuz?"; // “it” is the selected font.
// tooltip
"Jump to URL" = "URLye Atla";

View File

@ -550,11 +550,6 @@
"Key Bindings" = "按键绑定";
// Appearance pane
// alert message
"The selected font doesnt seem to be monospaced." = "所选字体似乎不是等宽字体。";
"Do you want to use it for the monospaced font?" = "确定将其选定为等宽字体?"; // “it” is the selected font.
// tooltip
"Jump to URL" = "跳转到URL";

View File

@ -549,11 +549,6 @@
"Key Bindings" = "按鍵繫結";
// Appearance pane
// alert message
"The selected font doesnt seem to be monospaced." = "當前選中的字體似乎並非等寬字體。";
"Do you want to use it for the monospaced font?" = "您真的要將這個字體作為等寬字體來使用嗎?"; // “it” is the selected font.
// tooltip
"Jump to URL" = "跳轉到URL";