Skip to content

Commit e49c640

Browse files
committed
v1.6: preset ordering and .json open button
Signed-off-by: Chris Warrick <[email protected]>
1 parent 9e4ba00 commit e49c640

File tree

7 files changed

+51
-16
lines changed

7 files changed

+51
-16
lines changed

CHANGELOG.md

+6
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,12 @@ Changelog
33

44
More information, including binaries, can be found on GitHub in the [releases section](https://github.com/Kwpolska/DisplayMenu/releases).
55

6+
v1.6 (build 7)
7+
--------------
8+
9+
* Add a menu option to open config file
10+
* Add a `presetOrder` option to JSON file
11+
612
v1.5 (build 6)
713
--------------
814

Display Menu/AppDelegate.swift

+13-7
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,10 @@ class AppDelegate: NSObject, NSApplicationDelegate {
4040
let statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)
4141
let statusMenu = NSMenu()
4242
let refreshItem = NSMenuItem(title: NSLocalizedString("Reload", comment: "Reload menu item"), action: #selector(acquireDisplayManager), keyEquivalent: "r")
43+
let openConfigItem = NSMenuItem(title: NSLocalizedString("Open Config File", comment: "Open Config File menu item"), action: #selector(openConfigFile), keyEquivalent: ",")
4344
let quitItem = NSMenuItem(title: NSLocalizedString("Quit", comment: "Quit menu item"), action: #selector(NSApp.terminate), keyEquivalent: "q")
4445
let dockPresetsItem = NSMenuItem(title: NSLocalizedString("Dock Presets", comment: "Dock Presets menu item"), action: nil, keyEquivalent: "")
45-
46+
var settingsURL: URL? = nil
4647
override init() {
4748
super.init()
4849

@@ -66,13 +67,13 @@ class AppDelegate: NSObject, NSApplicationDelegate {
6667
let appsupport = try FileManager.default.url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
6768
let appdir = appsupport.appendingPathComponent(Bundle.main.bundleIdentifier!, isDirectory: true)
6869
try FileManager.default.createDirectory(at: appdir, withIntermediateDirectories: true, attributes: nil)
69-
let url = appdir.appendingPathComponent("DisplayMenu.json")
70-
if FileManager.default.fileExists(atPath: url.path) {
71-
displayManager = try DisplayManager(jsonPath: url)
70+
settingsURL = appdir.appendingPathComponent("DisplayMenu.json")
71+
if FileManager.default.fileExists(atPath: settingsURL!.path) {
72+
displayManager = try DisplayManager(jsonPath: settingsURL!)
7273
} else {
7374
alertAndQuit(
7475
NSLocalizedString("Settings file not found", comment: "no settings alert title"),
75-
String.localizedStringWithFormat(NSLocalizedString("Place a settings file at %@ and try again.", comment: "no settings alert description"), url.path)
76+
String.localizedStringWithFormat(NSLocalizedString("Place a settings file at %@ and try again.", comment: "no settings alert description"), settingsURL!.path)
7677
)
7778
}
7879
}
@@ -101,13 +102,17 @@ class AppDelegate: NSObject, NSApplicationDelegate {
101102
let dp = sender!.representedObject as! DockPreset
102103
dp.apply(force: true)
103104
}
105+
106+
@objc func openConfigFile(_ sender: NSMenuItem?) {
107+
NSWorkspace.shared.openFile(settingsURL!.path, withApplication: "TextEdit")
108+
}
104109
}
105110

106111
extension AppDelegate: NSMenuDelegate {
107112
func menuWillOpen(_ menu: NSMenu) {
108113
menu.removeAllItems()
109-
for (name, preset) in displayManager!.presets {
110-
let item = NSMenuItem(title: name, action: #selector(applyPresetFromMenu), keyEquivalent: preset.keyEquivalent)
114+
for preset in displayManager!.presetOrder {
115+
let item = NSMenuItem(title: preset.name, action: #selector(applyPresetFromMenu), keyEquivalent: preset.keyEquivalent)
111116
item.representedObject = preset
112117
menu.addItem(item)
113118
}
@@ -123,6 +128,7 @@ extension AppDelegate: NSMenuDelegate {
123128
menu.addItem(dockPresetsItem)
124129
dockPresetsItem.submenu = dpsubmenu
125130
menu.addItem(refreshItem)
131+
menu.addItem(openConfigItem)
126132
menu.addItem(quitItem)
127133
}
128134
}

Display Menu/Base.lproj/Localizable.strings

+4-1
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,7 @@
2323
"The application will now quit." = "The application will now quit.";
2424

2525
/* Alert title (display manager/config error) */
26-
"Failed to initialize display manager." = "Nie udało się zainicjalizować menadżera ekranów.";
26+
"Failed to initialize display manager." = "Failed to initialize display manager.";
27+
28+
/* Open Config File menu item */
29+
"Open Config File" = "Open Config File";

Display Menu/DisplayManager.swift

+20-4
Original file line numberDiff line numberDiff line change
@@ -226,22 +226,24 @@ class DisplaySetup: CustomStringConvertible {
226226

227227
/// A display preset — displayed in the menu, consists of a Dock preset, display setups, and extra settings.
228228
class DisplayPreset: CustomStringConvertible {
229+
var name: String
229230
var dockPreset: DockPreset
230231
/// Key that will be part of the keyboard shortcut (with ⌘, case-sensitive)
231232
var keyEquivalent: String = ""
232233
/// If true, the
233234
var allDisplaysPresent: Bool = true
234235
var displays: [DisplayIdentifierString: DisplaySetup] = [:]
235236

236-
init(dockPreset: DockPreset, keyEquivalent: String, allDisplaysPresent: Bool, displays: [DisplayIdentifierString: DisplaySetup]) {
237+
init(name: String, dockPreset: DockPreset, keyEquivalent: String, allDisplaysPresent: Bool, displays: [DisplayIdentifierString: DisplaySetup]) {
238+
self.name = name
237239
self.dockPreset = dockPreset
238240
self.keyEquivalent = keyEquivalent
239241
self.allDisplaysPresent = allDisplaysPresent
240242
self.displays = displays
241243
}
242244

243245
var description: String {
244-
return "Display Preset (\(dockPreset), \(keyEquivalent), \(allDisplaysPresent), \(displays))"
246+
return "Display Preset \(name) (\(dockPreset), \(keyEquivalent), \(allDisplaysPresent), \(displays))"
245247
}
246248
}
247249

@@ -381,11 +383,14 @@ class DisplayManager {
381383

382384
var displays: [Display] = []
383385
var displaysByScreenID: [ScreenID: Display] = [:]
386+
387+
var presetOrder: [DisplayPreset] = []
384388

385-
init(dockPresets: [String: DockPreset], displayProperties: [ScreenID: DisplayProperties], presets: [String: DisplayPreset]) {
389+
init(dockPresets: [String: DockPreset], displayProperties: [ScreenID: DisplayProperties], presets: [String: DisplayPreset], presetOrder: [DisplayPreset]) {
386390
self.dockPresets = dockPresets
387391
self.displayProperties = displayProperties
388392
self.presets = presets
393+
self.presetOrder = presetOrder
389394
findDisplays()
390395
}
391396

@@ -420,14 +425,25 @@ class DisplayManager {
420425
displaySetups[identifierString] = try DisplaySetup(setupString)
421426
}
422427
allp[name] = DisplayPreset(
428+
name: name,
423429
dockPreset: dockp[preset["dockPreset"] as! String]!,
424430
keyEquivalent: preset["keyEquivalent"] as? String ?? "",
425431
allDisplaysPresent: preset["allDisplaysPresent"] as? Bool ?? false,
426432
displays: displaySetups
427433
)
428434
}
435+
436+
var pio: [DisplayPreset] = []
437+
if jsonDict["presetOrder"] != nil {
438+
let jpio = jsonDict["presetOrder"] as! [String]
439+
for i in jpio {
440+
pio.append(allp[i]!)
441+
}
442+
} else {
443+
pio.append(contentsOf: allp.values)
444+
}
429445

430-
self.init(dockPresets: dockp, displayProperties: displayp, presets: allp)
446+
self.init(dockPresets: dockp, displayProperties: displayp, presets: allp, presetOrder: pio)
431447
}
432448

433449
convenience init(jsonPath: URL) throws {

Display Menu/Info.plist

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@
1919
<key>CFBundlePackageType</key>
2020
<string>APPL</string>
2121
<key>CFBundleShortVersionString</key>
22-
<string>1.5</string>
22+
<string>1.6</string>
2323
<key>CFBundleVersion</key>
24-
<string>6</string>
24+
<string>7</string>
2525
<key>LSMinimumSystemVersion</key>
2626
<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
2727
<key>LSUIElement</key>

Display Menu/pl.lproj/Localizable.strings

+4-1
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,7 @@
2323
"The application will now quit." = "Program zostanie teraz zamknięty.";
2424

2525
/* Alert title (display manager/config error) */
26-
"Failed to initialize display manager." = "Failed to initialize display manager.";
26+
"Failed to initialize display manager." = "Nie udało się zainicjalizować menadżera ekranów.";
27+
28+
/* Open Config File menu item */
29+
"Open Config File" = "Otwórz Plik Konfiguracyjny";

DisplayMenu-sample.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -67,5 +67,6 @@
6767
"External": "self 1920 1080 1x"
6868
}
6969
}
70-
}
70+
},
71+
"presetOrder": ["Dual Screen", "MacBook Only", "MacBook Only (1440×900)", "External Only"]
7172
}

0 commit comments

Comments
 (0)