Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
79 changes: 78 additions & 1 deletion Free Ruler/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,12 @@ private enum HotkeyBezelLocalizationKey: String {
case rulersUngrouped = "HotkeyBezel.RulersUngrouped"
case shadowEnabled = "HotkeyBezel.ShadowEnabled"
case shadowDisabled = "HotkeyBezel.ShadowDisabled"
case horizontalOriginFormat = "HotkeyBezel.HorizontalOriginFormat"
case verticalOriginFormat = "HotkeyBezel.VerticalOriginFormat"
case originLeft = "HotkeyBezel.OriginLeft"
case originRight = "HotkeyBezel.OriginRight"
case originTop = "HotkeyBezel.OriginTop"
case originBottom = "HotkeyBezel.OriginBottom"
case unitsFormat = "HotkeyBezel.UnitsFormat"
case pixelsUnit = "Unit.Pixels.Abbreviation"
case millimetersUnit = "Unit.Millimeters.Abbreviation"
Expand All @@ -57,6 +63,18 @@ private enum HotkeyBezelLocalizationKey: String {
return "Hotkey status bezel text indicating ruler shadow is enabled"
case .shadowDisabled:
return "Hotkey status bezel text indicating ruler shadow is disabled"
case .horizontalOriginFormat:
return "Hotkey status bezel format for the horizontal ruler origin side"
case .verticalOriginFormat:
return "Hotkey status bezel format for the vertical ruler origin side"
case .originLeft:
return "Hotkey status bezel value for a ruler origin on the left"
case .originRight:
return "Hotkey status bezel value for a ruler origin on the right"
case .originTop:
return "Hotkey status bezel value for a ruler origin at the top"
case .originBottom:
return "Hotkey status bezel value for a ruler origin at the bottom"
case .unitsFormat:
return "Hotkey status bezel format for the selected measurement unit"
case .pixelsUnit:
Expand Down Expand Up @@ -512,10 +530,12 @@ class AppDelegate: NSObject, NSApplicationDelegate {

@IBAction func flipHorizontalRuler(_ sender: Any) {
flipRulers(along: .horizontal)
showHorizontalOriginHotkeyBezel(on: bezelScreen(for: sender))
}

@IBAction func flipVerticalRuler(_ sender: Any) {
flipRulers(along: .vertical)
showVerticalOriginHotkeyBezel(on: bezelScreen(for: sender))
}

func flipRulers(along orientation: Orientation) {
Expand Down Expand Up @@ -586,7 +606,30 @@ class AppDelegate: NSObject, NSApplicationDelegate {
)
}

func performRulerHotkey(keyCode: Int, sender: Any) -> Bool {
func performRulerHotkey(
keyCode: Int,
modifierFlags: NSEvent.ModifierFlags,
sender: Any
) -> Bool {
let keyboardModifiers = modifierFlags
.intersection(.deviceIndependentFlagsMask)
.subtracting(.capsLock)

if keyboardModifiers == .shift {
switch keyCode {
case kVK_ANSI_H:
flipHorizontalRuler(sender)
case kVK_ANSI_V:
flipVerticalRuler(sender)
default:
return false
}

return true
}

guard keyboardModifiers.isEmpty else { return false }

switch keyCode {
case kVK_ANSI_H:
toggleHorizontalRuler(sender)
Expand Down Expand Up @@ -621,6 +664,40 @@ class AppDelegate: NSObject, NSApplicationDelegate {
showHotkeyBezel(prefs.groupRulers ? .rulersGrouped : .rulersUngrouped, on: screen)
}

private func showHorizontalOriginHotkeyBezel(on screen: NSScreen?) {
switch prefs.zeroCorner {
case .topLeft, .bottomLeft:
showHotkeyBezel(
format: .horizontalOriginFormat,
HotkeyBezelLocalizationKey.originLeft.localizedString,
on: screen
)
case .topRight, .bottomRight:
showHotkeyBezel(
format: .horizontalOriginFormat,
HotkeyBezelLocalizationKey.originRight.localizedString,
on: screen
)
}
}

private func showVerticalOriginHotkeyBezel(on screen: NSScreen?) {
switch prefs.zeroCorner {
case .topLeft, .topRight:
showHotkeyBezel(
format: .verticalOriginFormat,
HotkeyBezelLocalizationKey.originTop.localizedString,
on: screen
)
case .bottomLeft, .bottomRight:
showHotkeyBezel(
format: .verticalOriginFormat,
HotkeyBezelLocalizationKey.originBottom.localizedString,
on: screen
)
}
}

private func bezelScreen(for sender: Any) -> NSScreen? {
if let rulerController = sender as? RulerController {
return rulerController.rulerWindow.screen
Expand Down
4 changes: 2 additions & 2 deletions Free Ruler/Base.lproj/MainMenu.xib
Original file line number Diff line number Diff line change
Expand Up @@ -194,13 +194,13 @@
<menuItem title="Flip Horizontal" keyEquivalent="H" id="GZl-Zd-Ad4">
<modifierMask key="keyEquivalentModifierMask" shift="YES"/>
<connections>
<action selector="flipHorizontalRuler:" target="Voe-Tx-rLC" id="eZk-Kw-SvQ"/>
<action selector="flipHorizontalRuler:" target="Voe-Tx-rLC" id="VqQ-nA-hUx"/>
</connections>
</menuItem>
<menuItem title="Flip Vertical" keyEquivalent="V" id="IQD-xF-keq">
<modifierMask key="keyEquivalentModifierMask" shift="YES"/>
<connections>
<action selector="flipVerticalRuler:" target="Voe-Tx-rLC" id="oGm-x8-0bo"/>
<action selector="flipVerticalRuler:" target="Voe-Tx-rLC" id="xUP-Jr-AP0"/>
</connections>
</menuItem>
</items>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ <h2>
<tr><th></th><th>S</th><td>Show/hide ruler shadows</td></tr>
<tr><th></th><th>O</th><td>Orient rulers at mouse location</td></tr>
<tr><th></th><th>U</th><td>Cycle units: pixels, millimeters, and inches</td></tr>
<tr><th>⇧</th><th>H</th><td>Flip the horizontal ruler origin</td></tr>
<tr><th>⇧</th><th>V</th><td>Flip the vertical ruler origin</td></tr>
<tr><th>⌘</th><th>R</th><td>Reset ruler positions to default</td></tr>
<tr><th>⌘</th><th>,</th><td>Open Preferences</td></tr>
</tbody>
Expand Down
Loading