mirror of
https://github.com/qvacua/vimr.git
synced 2024-12-25 23:02:35 +03:00
GH-270 Store linespacing in the user defaults
This commit is contained in:
parent
861a362f9f
commit
12a9a54efe
@ -30,6 +30,10 @@ public class NeoVimView: NSView, NSUserInterfaceValidations {
|
||||
public static let minFontSize = CGFloat(4)
|
||||
public static let maxFontSize = CGFloat(128)
|
||||
public static let defaultFont = NSFont.userFixedPitchFont(ofSize: 13)!
|
||||
public static let defaultLinespacing = CGFloat(1)
|
||||
|
||||
public static let minLinespacing = CGFloat(0.5)
|
||||
public static let maxLinespacing = CGFloat(8)
|
||||
|
||||
public let uuid = UUID().uuidString
|
||||
public weak var delegate: NeoVimViewDelegate?
|
||||
@ -43,6 +47,23 @@ public class NeoVimView: NSView, NSUserInterfaceValidations {
|
||||
}
|
||||
}
|
||||
|
||||
public var linespacing: CGFloat {
|
||||
get {
|
||||
return self._linespacing
|
||||
}
|
||||
|
||||
set {
|
||||
guard newValue >= NeoVimView.minLinespacing && newValue <= NeoVimView.maxLinespacing else {
|
||||
return
|
||||
}
|
||||
|
||||
self._linespacing = newValue
|
||||
self.drawer.linespacing = self.linespacing
|
||||
|
||||
self.updateFontMetaData()
|
||||
}
|
||||
}
|
||||
|
||||
public var font: NSFont {
|
||||
get {
|
||||
return self._font
|
||||
@ -60,11 +81,8 @@ public class NeoVimView: NSView, NSUserInterfaceValidations {
|
||||
|
||||
self._font = newValue
|
||||
self.drawer.font = self.font
|
||||
self.cellSize = self.drawer.cellSize
|
||||
self.descent = self.drawer.descent
|
||||
self.leading = self.drawer.leading
|
||||
|
||||
self.resizeNeoVimUiTo(size: self.bounds.size)
|
||||
self.updateFontMetaData()
|
||||
}
|
||||
}
|
||||
|
||||
@ -92,6 +110,7 @@ public class NeoVimView: NSView, NSUserInterfaceValidations {
|
||||
].flatMap { $0 }
|
||||
|
||||
fileprivate var _font = NeoVimView.defaultFont
|
||||
fileprivate var _linespacing = NeoVimView.defaultLinespacing
|
||||
|
||||
fileprivate let agent: NeoVimAgent
|
||||
fileprivate let drawer: TextDrawer
|
||||
@ -185,6 +204,14 @@ public class NeoVimView: NSView, NSUserInterfaceValidations {
|
||||
NSLog("\(Set(buffers))")
|
||||
NSLog("DEBUG 1 - End")
|
||||
}
|
||||
|
||||
fileprivate func updateFontMetaData() {
|
||||
self.cellSize = self.drawer.cellSize
|
||||
self.descent = self.drawer.descent
|
||||
self.leading = self.drawer.leading
|
||||
|
||||
self.resizeNeoVimUiTo(size: self.bounds.size)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - API
|
||||
|
@ -9,11 +9,14 @@ import RxSwift
|
||||
|
||||
struct AppearancePrefData: Equatable {
|
||||
let editorFont: NSFont
|
||||
let editorFontLinespacing: CGFloat
|
||||
let editorUsesLigatures: Bool
|
||||
}
|
||||
|
||||
func == (left: AppearancePrefData, right: AppearancePrefData) -> Bool {
|
||||
return left.editorUsesLigatures == right.editorUsesLigatures && left.editorFont.isEqual(to: right.editorFont)
|
||||
return left.editorUsesLigatures == right.editorUsesLigatures
|
||||
&& left.editorFont.isEqual(to: right.editorFont)
|
||||
&& left.editorFontLinespacing == right.editorFontLinespacing
|
||||
}
|
||||
|
||||
class AppearancePrefPane: PrefPane, NSComboBoxDelegate, NSControlTextEditingDelegate {
|
||||
@ -181,7 +184,9 @@ class AppearancePrefPane: PrefPane, NSComboBoxDelegate, NSControlTextEditingDele
|
||||
extension AppearancePrefPane {
|
||||
|
||||
func usesLigaturesAction(_ sender: NSButton) {
|
||||
self.set(data: AppearancePrefData(editorFont: self.data.editorFont, editorUsesLigatures: sender.boolState))
|
||||
self.set(data: AppearancePrefData(editorFont: self.data.editorFont,
|
||||
editorFontLinespacing: self.data.editorFontLinespacing,
|
||||
editorUsesLigatures: sender.boolState))
|
||||
}
|
||||
|
||||
func fontPopupAction(_ sender: NSPopUpButton) {
|
||||
@ -197,7 +202,9 @@ extension AppearancePrefPane {
|
||||
return
|
||||
}
|
||||
|
||||
self.set(data: AppearancePrefData(editorFont: newFont, editorUsesLigatures: self.data.editorUsesLigatures))
|
||||
self.set(data: AppearancePrefData(editorFont: newFont,
|
||||
editorFontLinespacing: self.data.editorFontLinespacing,
|
||||
editorUsesLigatures: self.data.editorUsesLigatures))
|
||||
}
|
||||
|
||||
func comboBoxSelectionDidChange(_ notification: Notification) {
|
||||
@ -208,14 +215,18 @@ extension AppearancePrefPane {
|
||||
let newFontSize = self.cappedFontSize(Int(self.sizes[self.sizeCombo.indexOfSelectedItem]))
|
||||
let newFont = self.fontManager.convert(self.data.editorFont, toSize: newFontSize)
|
||||
|
||||
self.set(data: AppearancePrefData(editorFont: newFont, editorUsesLigatures: self.data.editorUsesLigatures))
|
||||
self.set(data: AppearancePrefData(editorFont: newFont,
|
||||
editorFontLinespacing: self.data.editorFontLinespacing,
|
||||
editorUsesLigatures: self.data.editorUsesLigatures))
|
||||
}
|
||||
|
||||
func sizeComboBoxDidEnter(_ sender: AnyObject!) {
|
||||
let newFontSize = self.cappedFontSize(self.sizeCombo.integerValue)
|
||||
let newFont = self.fontManager.convert(self.data.editorFont, toSize: newFontSize)
|
||||
|
||||
self.set(data: AppearancePrefData(editorFont: newFont, editorUsesLigatures: self.data.editorUsesLigatures))
|
||||
self.set(data: AppearancePrefData(editorFont: newFont,
|
||||
editorFontLinespacing: self.data.editorFontLinespacing,
|
||||
editorUsesLigatures: self.data.editorUsesLigatures))
|
||||
}
|
||||
|
||||
fileprivate func cappedFontSize(_ size: Int) -> CGFloat {
|
||||
|
@ -22,6 +22,7 @@ private class PrefKeys {
|
||||
|
||||
static let editorFontName = "editor-font-name"
|
||||
static let editorFontSize = "editor-font-size"
|
||||
static let editorFontLinespacing = "editor-font-linespacing"
|
||||
static let editorUsesLigatures = "editor-uses-ligatures"
|
||||
|
||||
static let useSnapshotUpdateChannel = "use-snapshot-update-channel"
|
||||
@ -38,10 +39,15 @@ private class PrefKeys {
|
||||
class PrefStore: StandardFlow {
|
||||
|
||||
fileprivate static let compatibleVersion = "38"
|
||||
|
||||
fileprivate static let defaultEditorFont = NeoVimView.defaultFont
|
||||
static let minEditorFontSize = NeoVimView.minFontSize
|
||||
static let maxEditorFontSize = NeoVimView.maxFontSize
|
||||
|
||||
fileprivate static let defaultEditorFontLinespacing = NeoVimView.defaultLinespacing
|
||||
static let minEditorFontLinespacing = NeoVimView.minLinespacing
|
||||
static let maxEditorFontLinespacing = NeoVimView.maxLinespacing
|
||||
|
||||
fileprivate let userDefaults = UserDefaults.standard
|
||||
fileprivate let fontManager = NSFontManager.shared()
|
||||
|
||||
@ -49,7 +55,9 @@ class PrefStore: StandardFlow {
|
||||
general: GeneralPrefData(openNewWindowWhenLaunching: true,
|
||||
openNewWindowOnReactivation: true,
|
||||
ignorePatterns: Set([ "*/.git", "*.o", "*.d", "*.dia" ].map(FileItemIgnorePattern.init))),
|
||||
appearance: AppearancePrefData(editorFont: PrefStore.defaultEditorFont, editorUsesLigatures: false),
|
||||
appearance: AppearancePrefData(editorFont: PrefStore.defaultEditorFont,
|
||||
editorFontLinespacing: 1,
|
||||
editorUsesLigatures: false),
|
||||
advanced: AdvancedPrefData(useSnapshotUpdateChannel: false,
|
||||
useInteractiveZsh: false),
|
||||
mainWindow: MainWindowPrefData(isAllToolsVisible: true,
|
||||
@ -77,6 +85,9 @@ class PrefStore: StandardFlow {
|
||||
let editorFont = self.saneFont(editorFontName, fontSize: editorFontSize)
|
||||
|
||||
let usesLigatures = self.bool(from: prefs, for: PrefKeys.editorUsesLigatures, default: false)
|
||||
let linespacing = self.saneLinespacing(
|
||||
CGFloat((prefs[PrefKeys.editorFontLinespacing] as? NSNumber)?.floatValue ?? Float(1))
|
||||
)
|
||||
let openNewWindowWhenLaunching = self.bool(from: prefs, for: PrefKeys.openNewWindowWhenLaunching, default: true)
|
||||
let openNewWindowOnReactivation = self.bool(from: prefs, for: PrefKeys.openNewWindowOnReactivation, default: true)
|
||||
|
||||
@ -97,7 +108,9 @@ class PrefStore: StandardFlow {
|
||||
openNewWindowOnReactivation: openNewWindowOnReactivation,
|
||||
ignorePatterns: ignorePatterns
|
||||
),
|
||||
appearance: AppearancePrefData(editorFont: editorFont, editorUsesLigatures: usesLigatures),
|
||||
appearance: AppearancePrefData(editorFont: editorFont,
|
||||
editorFontLinespacing: linespacing,
|
||||
editorUsesLigatures: usesLigatures),
|
||||
advanced: AdvancedPrefData(useSnapshotUpdateChannel: useSnapshotUpdate,
|
||||
useInteractiveZsh: useInteractiveZsh),
|
||||
mainWindow: MainWindowPrefData(isAllToolsVisible: isAllToolsVisible,
|
||||
@ -123,6 +136,14 @@ class PrefStore: StandardFlow {
|
||||
return editorFont
|
||||
}
|
||||
|
||||
fileprivate func saneLinespacing(_ linespacing: CGFloat) -> CGFloat {
|
||||
guard linespacing >= PrefStore.minEditorFontLinespacing && linespacing <= PrefStore.maxEditorFontLinespacing else {
|
||||
return PrefStore.defaultEditorFontLinespacing
|
||||
}
|
||||
|
||||
return linespacing
|
||||
}
|
||||
|
||||
fileprivate func prefsDict(_ prefData: PrefData) -> [String: Any] {
|
||||
let generalData = prefData.general
|
||||
let appearanceData = prefData.appearance
|
||||
@ -140,6 +161,7 @@ class PrefStore: StandardFlow {
|
||||
// Appearance
|
||||
PrefKeys.editorFontName: appearanceData.editorFont.fontName as Any,
|
||||
PrefKeys.editorFontSize: appearanceData.editorFont.pointSize as Any,
|
||||
PrefKeys.editorFontLinespacing: appearanceData.editorFontLinespacing as Any,
|
||||
PrefKeys.editorUsesLigatures: appearanceData.editorUsesLigatures as Any,
|
||||
|
||||
// Advanced
|
||||
|
Loading…
Reference in New Issue
Block a user