From debec231c7a964c613e23698db752ba388c566d3 Mon Sep 17 00:00:00 2001 From: Mario Klebsch Date: Sat, 21 Dec 2024 18:09:21 +0100 Subject: [PATCH 1/3] Add support for user defined units --- Free Ruler/AppDelegate.swift | 7 + Free Ruler/Base.lproj/MainMenu.xib | 7 + .../Base.lproj/PreferencesController.xib | 149 +++++++++++++++--- Free Ruler/HorizontalRule.swift | 44 +++++- Free Ruler/PreferencesController.swift | 67 ++++++++ Free Ruler/Prefs.swift | 51 ++++-- Free Ruler/RuleView.swift | 16 ++ Free Ruler/RulerController.swift | 12 ++ Free Ruler/VerticalRule.swift | 44 +++++- Free Ruler/de.lproj/MainMenu.strings | 3 + .../de.lproj/PreferencesController.strings | 10 ++ 11 files changed, 374 insertions(+), 36 deletions(-) diff --git a/Free Ruler/AppDelegate.swift b/Free Ruler/AppDelegate.swift index 5185d81..430c570 100644 --- a/Free Ruler/AppDelegate.swift +++ b/Free Ruler/AppDelegate.swift @@ -19,6 +19,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { @IBOutlet weak var pixelsMenuItem: NSMenuItem! @IBOutlet weak var millimetersMenuItem: NSMenuItem! @IBOutlet weak var inchesMenuItem: NSMenuItem! + @IBOutlet weak var userDefinedMenuItem: NSMenuItem! @IBOutlet weak var cycleUnitsMenuItem: NSMenuItem! @IBOutlet weak var floatRulersMenuItem: NSMenuItem! @@ -73,6 +74,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { pixelsMenuItem?.state = prefs.unit == .pixels ? .on : .off millimetersMenuItem?.state = prefs.unit == .millimeters ? .on : .off inchesMenuItem?.state = prefs.unit == .inches ? .on : .off + userDefinedMenuItem?.state = prefs.unit == .user ? .on: .off } func redrawRulers() { @@ -138,6 +140,9 @@ class AppDelegate: NSObject, NSApplicationDelegate { @IBAction func setUnitInches(_ sender: Any) { prefs.unit = .inches } + @IBAction func setUnitUserDefined(_ sender: Any) { + prefs.unit = .user + } @IBAction func cycleUnits(_ sender: Any) { switch prefs.unit { case .pixels: @@ -145,6 +150,8 @@ class AppDelegate: NSObject, NSApplicationDelegate { case .millimeters: prefs.unit = .inches case .inches: + prefs.unit = .user + case .user: prefs.unit = .pixels } } diff --git a/Free Ruler/Base.lproj/MainMenu.xib b/Free Ruler/Base.lproj/MainMenu.xib index 432c5fb..94fc721 100644 --- a/Free Ruler/Base.lproj/MainMenu.xib +++ b/Free Ruler/Base.lproj/MainMenu.xib @@ -22,6 +22,7 @@ + @@ -159,6 +160,12 @@ + + + + + + diff --git a/Free Ruler/Base.lproj/PreferencesController.xib b/Free Ruler/Base.lproj/PreferencesController.xib index b55b85e..8e4bf25 100644 --- a/Free Ruler/Base.lproj/PreferencesController.xib +++ b/Free Ruler/Base.lproj/PreferencesController.xib @@ -7,6 +7,10 @@ + + + + @@ -21,22 +25,22 @@ - - + + - + - - + + - - + + @@ -44,22 +48,22 @@ - + - - + + - - + + @@ -67,14 +71,14 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + @@ -132,18 +241,20 @@ + + - + diff --git a/Free Ruler/HorizontalRule.swift b/Free Ruler/HorizontalRule.swift index 2fabeb9..fd494fd 100644 --- a/Free Ruler/HorizontalRule.swift +++ b/Free Ruler/HorizontalRule.swift @@ -30,7 +30,7 @@ class HorizontalRule: RuleView { let width = dirtyRect.width let path = NSBezierPath() let tickScale: CGFloat - let textScale: Int + let textScale: CGFloat let largeTicks: Int let mediumTicks: Int let smallTicks: Int @@ -51,6 +51,46 @@ class HorizontalRule: RuleView { mediumTicks = 8 smallTicks = 4 tinyTicks = 1 + case .user: + var scale:Float + switch(prefs.userUnitScreenUnit) { + case .pixels: scale = 1.0 + case .millimeters: scale = Float(screen?.dpmm.width ?? NSScreen.defaultDpmm) + case .inches: scale = Float(screen?.dpi.width ?? NSScreen.defaultDpi) + default: scale = 1.0 + } + var tickScale_:CGFloat = CGFloat(prefs.userUnitScreenValue * scale / prefs.userUnitValue)/10 + var textScale_:CGFloat = 10.0 + while (tickScale_ < 4) { + tickScale_ = tickScale_ * 10.0 + textScale_ = textScale_ / 10.0 + } + while (tickScale_ > 40) { + tickScale_ = tickScale_ / 10.0 + textScale_ = textScale_ * 10.0 + } + var largeTicks_: Int = 10 + var mediumTicks_: Int = 5 + if (tickScale_ > 25){ + tickScale_ = tickScale_ / 5.0 + textScale_ = textScale_ * 5.0 + largeTicks_ = 5 + mediumTicks_ = 1 + } +#if (false) + if (tickScale_ > 10){ + tickScale_ = tickScale_ / 2 + textScale_ = textScale_ * 2 + largeTicks_ = 2 + mediumTicks_ = 1 + } +#endif + textScale = textScale_ + tickScale = tickScale_ + largeTicks = largeTicks_ + mediumTicks = mediumTicks_ + smallTicks = 1 + tinyTicks = nil default: tickScale = 1 textScale = 1 @@ -73,7 +113,7 @@ class HorizontalRule: RuleView { path.move(to: CGPoint(x: pos, y: 1)) path.line(to: CGPoint(x: pos, y: 10)) - let label = String(i / textScale) + let label = String(CGFloat(i) / textScale) let labelX: CGFloat = pos - (labelWidth / 2) + 0.5 // half-pixel nudge /shrug let labelY: CGFloat = labelOffset let labelRect = CGRect(x: labelX, y: labelY, width: labelWidth, height: labelHeight) diff --git a/Free Ruler/PreferencesController.swift b/Free Ruler/PreferencesController.swift index f44ea09..cf424a2 100644 --- a/Free Ruler/PreferencesController.swift +++ b/Free Ruler/PreferencesController.swift @@ -14,6 +14,12 @@ class PreferencesController: NSWindowController, NSWindowDelegate, NotificationP @IBOutlet weak var groupRulersCheckbox: NSButton! @IBOutlet weak var rulerShadowCheckbox: NSButton! + @IBOutlet weak var UserUnitScreenValueTbx: NSTextField! + @IBOutlet weak var UserUnitScreenUnitPopup: NSPopUpButton! + @IBOutlet weak var UserUnitValueTbx: NSTextField! + @IBOutlet weak var UserUnitUnitTbx: NSTextField! + + override var windowNibName: String { return "PreferencesController" } @@ -23,6 +29,14 @@ class PreferencesController: NSWindowController, NSWindowDelegate, NotificationP window?.isMovableByWindowBackground = true + if let app=NSApplication.shared.delegate as? AppDelegate{ + UserUnitScreenUnitPopup.addItems(withTitles: [ + app.pixelsMenuItem.title, + app.millimetersMenuItem.title, + app.inchesMenuItem.title + ]) + } + subscribeToPrefs() updateView() } @@ -58,6 +72,18 @@ class PreferencesController: NSWindowController, NSWindowDelegate, NotificationP prefs.observe(\Prefs.rulerShadow, options: .new) { prefs, changed in self.updateRulerShadowCheckbox() }, + prefs.observe(\Prefs.userUnitScreenValue, options:.new){ prefs, changed in + self.updateUserUnitScreenValue() + }, + prefs.observe(\Prefs.userUnitScreenUnit, options:.new){ prefs, changed in + self.updateUserUnitScreenUnit() + }, + prefs.observe(\Prefs.userUnitValue, options:.new){ prefs, changed in + self.updateUserUnitValue() + }, + prefs.observe(\Prefs.userUnitUnit, options:.new){ prefs, changed in + self.updateUserUnitUnit() + }, ] } @@ -76,6 +102,23 @@ class PreferencesController: NSWindowController, NSWindowDelegate, NotificationP @IBAction func setRulerShadow(_ sender: Any) { prefs.rulerShadow = rulerShadowCheckbox.state == .on } + @IBAction func setUserScreenValue(_ Sender: Any) { + prefs.userUnitScreenValue = UserUnitScreenValueTbx.floatValue + } + @IBAction func setUserScreenUnit(_ Sender: Any) { + switch(UserUnitScreenUnitPopup.indexOfSelectedItem){ + case 0: prefs.userUnitScreenUnit = .pixels + case 1: prefs.userUnitScreenUnit = .millimeters + case 2: prefs.userUnitScreenUnit = .inches + default: prefs.userUnitScreenUnit = .pixels + } + } + @IBAction func setUserUnitValue(_ Sender: Any) { + prefs.userUnitValue = UserUnitValueTbx.floatValue + } + @IBAction func setUserUnit(_ Sender: Any) { + prefs.userUnitUnit = UserUnitUnitTbx.stringValue + } func updateView() { updateForegroundSlider() @@ -83,6 +126,10 @@ class PreferencesController: NSWindowController, NSWindowDelegate, NotificationP updateFloatRulersCheckbox() updateGroupRulersCheckbox() updateRulerShadowCheckbox() + updateUserUnitScreenValue() + updateUserUnitScreenUnit() + updateUserUnitValue() + updateUserUnitUnit() } func updateForegroundSlider() { @@ -107,4 +154,24 @@ class PreferencesController: NSWindowController, NSWindowDelegate, NotificationP rulerShadowCheckbox.state = prefs.rulerShadow ? .on : .off } + func updateUserUnitScreenValue() { + UserUnitScreenValueTbx.floatValue = prefs.userUnitScreenValue + } + + func updateUserUnitScreenUnit() { + switch(prefs.userUnitScreenUnit) { + case .pixels: UserUnitScreenUnitPopup.selectItem(at: 0) + case .millimeters: UserUnitScreenUnitPopup.selectItem(at: 1) + case .inches: UserUnitScreenUnitPopup.selectItem(at: 2) + default: UserUnitScreenUnitPopup.selectItem(at: 0) + } + } + func updateUserUnitValue(){ + UserUnitValueTbx.floatValue = prefs.userUnitValue + } + + func updateUserUnitUnit(){ + UserUnitUnitTbx.stringValue = prefs.userUnitUnit + } + } diff --git a/Free Ruler/Prefs.swift b/Free Ruler/Prefs.swift index 6772dcd..6b2195c 100644 --- a/Free Ruler/Prefs.swift +++ b/Free Ruler/Prefs.swift @@ -17,6 +17,7 @@ let prefs = Prefs.shared case pixels case millimeters case inches + case user } class Prefs: NSObject { @@ -25,12 +26,16 @@ class Prefs: NSObject { static let shared = Prefs() // MARK: - public properties - @objc dynamic var floatRulers : Bool - @objc dynamic var groupRulers : Bool - @objc dynamic var rulerShadow : Bool - @objc dynamic var foregroundOpacity : Int - @objc dynamic var backgroundOpacity : Int - @objc dynamic var unit : Unit + @objc dynamic var floatRulers : Bool + @objc dynamic var groupRulers : Bool + @objc dynamic var rulerShadow : Bool + @objc dynamic var foregroundOpacity : Int + @objc dynamic var backgroundOpacity : Int + @objc dynamic var unit : Unit + @objc dynamic var userUnitScreenValue : Float + @objc dynamic var userUnitScreenUnit : Unit + @objc dynamic var userUnitValue : Float + @objc dynamic var userUnitUnit : String // MARK: - public save method func save() { @@ -47,18 +52,26 @@ class Prefs: NSObject { "rulerShadow": false, "foregroundOpacity": 90, "backgroundOpacity": 50, - "unit": Unit.pixels.rawValue + "unit": Unit.pixels.rawValue, + "userUnitScreenValue": 1, + "userUnitScreenUnit": Unit.millimeters.rawValue, + "userUnitValue": 1, + "userUnitUnit": "mm" ] private override init() { defaults.register(defaults: defaultValues) - floatRulers = defaults.bool(forKey: "floatRulers") - groupRulers = defaults.bool(forKey: "groupRulers") - rulerShadow = defaults.bool(forKey: "rulerShadow") - foregroundOpacity = defaults.integer(forKey: "foregroundOpacity") - backgroundOpacity = defaults.integer(forKey: "backgroundOpacity") - unit = Unit(rawValue: defaults.integer(forKey: "unit")) ?? .pixels + floatRulers = defaults.bool(forKey: "floatRulers") + groupRulers = defaults.bool(forKey: "groupRulers") + rulerShadow = defaults.bool(forKey: "rulerShadow") + foregroundOpacity = defaults.integer(forKey: "foregroundOpacity") + backgroundOpacity = defaults.integer(forKey: "backgroundOpacity") + userUnitScreenValue = defaults.float(forKey: "userUnitScreenValue") + userUnitScreenUnit = Unit(rawValue: defaults.integer(forKey: "userUnitScreenUnit")) ?? .millimeters + userUnitValue = defaults.float(forKey: "userUnitValue") + userUnitUnit = defaults.string(forKey: "userUnitUnit") ?? "mm" + unit = Unit(rawValue: defaults.integer(forKey: "unit")) ?? .pixels super.init() @@ -87,6 +100,18 @@ class Prefs: NSObject { observe(\Prefs.unit, options: .new) { prefs, changed in self.defaults.set(prefs.unit.rawValue, forKey: "unit") }, + observe(\Prefs.userUnitScreenValue, options:.new){ prefs, changed in + self.defaults.set(changed.newValue, forKey: "userUnitScreenValue") + }, + observe(\Prefs.userUnitScreenUnit, options:.new){ prefs, changed in + self.defaults.set(prefs.userUnitScreenUnit.rawValue, forKey: "userUnitScreenUnit") + }, + observe(\Prefs.userUnitValue, options:.new){ prefs, changed in + self.defaults.set(changed.newValue, forKey: "userUnitValue") + }, + observe(\Prefs.userUnitUnit, options:.new){ prefs, changed in + self.defaults.set(changed.newValue, forKey: "userUnitUnit") + }, ] } diff --git a/Free Ruler/RuleView.swift b/Free Ruler/RuleView.swift index deac093..4d421f2 100644 --- a/Free Ruler/RuleView.swift +++ b/Free Ruler/RuleView.swift @@ -72,6 +72,8 @@ class RuleView: NSView { return "mm" case .inches: return "in" + case .user: + return String(format:"user (%@)", prefs.userUnitUnit) } } @@ -83,6 +85,20 @@ class RuleView: NSView { return String(format: "%.1f", number / (screen?.dpmm.width ?? NSScreen.defaultDpmm)) case .inches: return String(format: "%.3f", number / (screen?.dpi.width ?? NSScreen.defaultDpi)) + case .user: + let scale:Float + switch(prefs.userUnitScreenUnit) { + case .millimeters: + scale = Float(screen?.dpmm.width ?? NSScreen.defaultDpmm) + break + case .inches: + scale = Float(screen?.dpi.width ?? NSScreen.defaultDpi) + break + default: + scale = 1.0; + break + } + return String(format: "%.1f", Float(number) / prefs.userUnitScreenValue / scale * prefs.userUnitValue) } } diff --git a/Free Ruler/RulerController.swift b/Free Ruler/RulerController.swift index 830b7fb..88a36d0 100644 --- a/Free Ruler/RulerController.swift +++ b/Free Ruler/RulerController.swift @@ -172,6 +172,18 @@ class RulerController: NSWindowController, NSWindowDelegate, NotificationObserve prefs.observe(\Prefs.rulerShadow, options: .new) { prefs, changed in self.rulerWindow.hasShadow = prefs.rulerShadow }, + prefs.observe(\Prefs.userUnitScreenValue, options: .new) { prefs, changed in + self.rulerWindow.rule.needsDisplay = true + }, + prefs.observe(\Prefs.userUnitScreenUnit, options: .new) { prefs, changed in + self.rulerWindow.rule.needsDisplay = true + }, + prefs.observe(\Prefs.userUnitValue, options: .new) { prefs, changed in + self.rulerWindow.rule.needsDisplay = true + }, + prefs.observe(\Prefs.userUnitUnit, options: .new) { prefs, changed in + self.rulerWindow.rule.needsDisplay = true + }, ] } diff --git a/Free Ruler/VerticalRule.swift b/Free Ruler/VerticalRule.swift index ec80284..82f8ca4 100644 --- a/Free Ruler/VerticalRule.swift +++ b/Free Ruler/VerticalRule.swift @@ -31,7 +31,7 @@ class VerticalRule: RuleView { let height = dirtyRect.height let path = NSBezierPath() let tickScale: CGFloat - let textScale: Int + let textScale: CGFloat let largeTicks: Int let mediumTicks: Int let smallTicks: Int @@ -52,6 +52,46 @@ class VerticalRule: RuleView { mediumTicks = 8 smallTicks = 4 tinyTicks = 1 + case .user: + var scale:Float + switch(prefs.userUnitScreenUnit) { + case .pixels: scale = 1.0 + case .millimeters: scale = Float(screen?.dpmm.width ?? NSScreen.defaultDpmm) + case .inches: scale = Float(screen?.dpi.width ?? NSScreen.defaultDpi) + default: scale = 1.0 + } + var tickScale_:CGFloat = CGFloat(prefs.userUnitScreenValue * scale / prefs.userUnitValue)/10 + var textScale_:CGFloat = 10.0 + while (tickScale_ < 4) { + tickScale_ = tickScale_ * 10.0 + textScale_ = textScale_ / 10.0 + } + while (tickScale_ > 40) { + tickScale_ = tickScale_ / 10.0 + textScale_ = textScale_ * 10.0 + } + var largeTicks_: Int = 10 + var mediumTicks_: Int = 5 + if (tickScale_ > 25){ + tickScale_ = tickScale_ / 5 + textScale_ = textScale_ * 5 + largeTicks_ = 5 + mediumTicks_ = 1 + } +#if (false) + if (tickScale_ > 10){ + tickScale_ = tickScale_ / 2 + textScale_ = textScale_ * 2 + largeTicks_ = 2 + mediumTicks_ = 1 + } +#endif + textScale = textScale_ + tickScale = tickScale_ + largeTicks = largeTicks_ + mediumTicks = mediumTicks_ + smallTicks = 1 + tinyTicks = nil default: tickScale = 1 textScale = 1 @@ -75,7 +115,7 @@ class VerticalRule: RuleView { path.move(to: CGPoint(x: width - 1, y: height - pos)) path.line(to: CGPoint(x: width - 10, y: height - pos)) - let label = String(i / textScale) + let label = String(CGFloat(i) / textScale) let labelX = width - labelWidth - labelOffset let labelY = height - pos - (textHeight / 2) let labelRect = CGRect(x: labelX, y: labelY, width: labelWidth, height: labelHeight) diff --git a/Free Ruler/de.lproj/MainMenu.strings b/Free Ruler/de.lproj/MainMenu.strings index 5f1fcbe..133cb9f 100644 --- a/Free Ruler/de.lproj/MainMenu.strings +++ b/Free Ruler/de.lproj/MainMenu.strings @@ -134,5 +134,8 @@ /* Class = "NSMenuItem"; title = "Inches"; ObjectID = "lt1-Hj-2TR"; */ "lt1-Hj-2TR.title" = "Zoll"; +/* Class = "NSMenuItem"; title = "user defined"; ObjectID = "irY-SC-eqL"; */ +"irY-SC-eqL.title" = "benutzerdefiniert"; + /* Class = "NSMenuItem"; title = "Cycle Units"; ObjectID = "2nm-aL-kZd"; */ "2nm-aL-kZd.title" = "Nächste Einheit auswählen"; diff --git a/Free Ruler/de.lproj/PreferencesController.strings b/Free Ruler/de.lproj/PreferencesController.strings index f39563a..8a53ec1 100644 --- a/Free Ruler/de.lproj/PreferencesController.strings +++ b/Free Ruler/de.lproj/PreferencesController.strings @@ -25,3 +25,13 @@ /* Class = "NSButtonCell"; title = "Float rulers above other applications"; ObjectID = "yPM-Cw-Qsi"; */ "yPM-Cw-Qsi.title" = "Lineale schweben über anderen Programmen"; + +/* Class = "NSBox"; title = "user defined units"; ObjectID = "Fy5-7P-msT"; */ +"Fy5-7P-msT.title" = "Benutzerdefinierte Maßeinheit"; + +/* Class = "NSTextFieldCell"; title = "on screen:"; ObjectID = "VHY-NQ-57D"; */ +"VHY-NQ-57D.title" = "auf dem Bildschirm:"; + +/* Class = "NSTextFieldCell"; title = "in reality:"; ObjectID = "jIw-kS-bJd"; */ +"jIw-kS-bJd.title" = "in der Realität:"; + From 64f76347fe383923f75552303d9ee349b4c3bc84 Mon Sep 17 00:00:00 2001 From: Mario Klebsch Date: Sat, 21 Dec 2024 18:40:16 +0100 Subject: [PATCH 2/3] Keep on screen distance constant, when changing on screen units. Compensate on screen value according to cahnges of on screen unit --- Free Ruler/PreferencesController.swift | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/Free Ruler/PreferencesController.swift b/Free Ruler/PreferencesController.swift index cf424a2..020e6f7 100644 --- a/Free Ruler/PreferencesController.swift +++ b/Free Ruler/PreferencesController.swift @@ -105,13 +105,36 @@ class PreferencesController: NSWindowController, NSWindowDelegate, NotificationP @IBAction func setUserScreenValue(_ Sender: Any) { prefs.userUnitScreenValue = UserUnitScreenValueTbx.floatValue } + var screen: NSScreen? { + guard let window = window else { + return nil + } + return NSScreen.screens.first { $0.frame.intersects(window.convertToScreen(self.UserUnitScreenUnitPopup.frame)) } + } @IBAction func setUserScreenUnit(_ Sender: Any) { + let oldScale:Float + switch(prefs.userUnitScreenUnit) { + case .pixels: oldScale = 1.0 + case .millimeters: oldScale = Float(screen?.dpmm.width ?? NSScreen.defaultDpmm) + case .inches: oldScale = Float(screen?.dpi.width ?? NSScreen.defaultDpi) + default: oldScale = 1.0 + } + switch(UserUnitScreenUnitPopup.indexOfSelectedItem){ case 0: prefs.userUnitScreenUnit = .pixels case 1: prefs.userUnitScreenUnit = .millimeters case 2: prefs.userUnitScreenUnit = .inches default: prefs.userUnitScreenUnit = .pixels } + + let newScale:Float + switch(prefs.userUnitScreenUnit) { + case .pixels: newScale = 1.0 + case .millimeters: newScale = Float(screen?.dpmm.width ?? NSScreen.defaultDpmm) + case .inches: newScale = Float(screen?.dpi.width ?? NSScreen.defaultDpi) + default: newScale = 1.0 + } + prefs.userUnitScreenValue = prefs.userUnitScreenValue * oldScale / newScale; } @IBAction func setUserUnitValue(_ Sender: Any) { prefs.userUnitValue = UserUnitValueTbx.floatValue From 7959442e64155812e5b4f6d47d2265321cc24233 Mon Sep 17 00:00:00 2001 From: Mario Klebsch Date: Sat, 21 Dec 2024 18:41:21 +0100 Subject: [PATCH 3/3] changed var to let, since scale is constant after initial assignment --- Free Ruler/HorizontalRule.swift | 2 +- Free Ruler/VerticalRule.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Free Ruler/HorizontalRule.swift b/Free Ruler/HorizontalRule.swift index fd494fd..893b8ae 100644 --- a/Free Ruler/HorizontalRule.swift +++ b/Free Ruler/HorizontalRule.swift @@ -52,7 +52,7 @@ class HorizontalRule: RuleView { smallTicks = 4 tinyTicks = 1 case .user: - var scale:Float + let scale:Float switch(prefs.userUnitScreenUnit) { case .pixels: scale = 1.0 case .millimeters: scale = Float(screen?.dpmm.width ?? NSScreen.defaultDpmm) diff --git a/Free Ruler/VerticalRule.swift b/Free Ruler/VerticalRule.swift index 82f8ca4..30cc14b 100644 --- a/Free Ruler/VerticalRule.swift +++ b/Free Ruler/VerticalRule.swift @@ -53,7 +53,7 @@ class VerticalRule: RuleView { smallTicks = 4 tinyTicks = 1 case .user: - var scale:Float + let scale:Float switch(prefs.userUnitScreenUnit) { case .pixels: scale = 1.0 case .millimeters: scale = Float(screen?.dpmm.width ?? NSScreen.defaultDpmm)