From e0bec333edaf26f2252ce95156439d8987672b97 Mon Sep 17 00:00:00 2001 From: Nico Verbruggen Date: Sun, 5 Dec 2021 03:53:30 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Improve=20multi-window=20handling?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PHP Monitor.xcodeproj/project.pbxproj | 6 +++ phpmon/Domain/Core/App.swift | 37 +++++++++++++++++ phpmon/Domain/Core/Base.lproj/Main.storyboard | 14 +++---- .../Domain/Helpers/PMWindowController.swift | 36 ++++++++++++++++ phpmon/Domain/Preferences/PrefsVC.swift | 27 ++++++++---- phpmon/Domain/Preferences/PrefsWC.swift | 12 +++++- phpmon/Domain/SiteList/SiteListVC.swift | 41 +++++++++++-------- phpmon/Domain/SiteList/SiteListWC.swift | 16 +++++++- 8 files changed, 154 insertions(+), 35 deletions(-) create mode 100644 phpmon/Domain/Helpers/PMWindowController.swift diff --git a/PHP Monitor.xcodeproj/project.pbxproj b/PHP Monitor.xcodeproj/project.pbxproj index 10c79a0..c1c21c4 100644 --- a/PHP Monitor.xcodeproj/project.pbxproj +++ b/PHP Monitor.xcodeproj/project.pbxproj @@ -59,6 +59,8 @@ C4AF9F7A2754499000D44ED0 /* Valet.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4AF9F792754499000D44ED0 /* Valet.swift */; }; C4AF9F7B2754499000D44ED0 /* Valet.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4AF9F792754499000D44ED0 /* Valet.swift */; }; C4AF9F7D275454A900D44ED0 /* ValetTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4AF9F7C275454A900D44ED0 /* ValetTest.swift */; }; + C4CCBA6C275C567B008C7055 /* PMWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4CCBA6B275C567B008C7055 /* PMWindowController.swift */; }; + C4CCBA6D275C567B008C7055 /* PMWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4CCBA6B275C567B008C7055 /* PMWindowController.swift */; }; C4D8016622B1584700C6DA1B /* Startup.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4D8016522B1584700C6DA1B /* Startup.swift */; }; C4EE188422D3386B00E126E5 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4EE188322D3386B00E126E5 /* Constants.swift */; }; C4F2E4372752F0870020E974 /* HomebrewDiagnostics.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4F2E4362752F0870020E974 /* HomebrewDiagnostics.swift */; }; @@ -148,6 +150,7 @@ C4AF9F76275447F100D44ED0 /* ValetConfigParserTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ValetConfigParserTest.swift; sourceTree = ""; }; C4AF9F792754499000D44ED0 /* Valet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Valet.swift; sourceTree = ""; }; C4AF9F7C275454A900D44ED0 /* ValetTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ValetTest.swift; sourceTree = ""; }; + C4CCBA6B275C567B008C7055 /* PMWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PMWindowController.swift; sourceTree = ""; }; C4D8016522B1584700C6DA1B /* Startup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Startup.swift; sourceTree = ""; }; C4E713562570150F00007428 /* SECURITY.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = SECURITY.md; sourceTree = ""; }; C4E713572570151400007428 /* docs */ = {isa = PBXFileReference; lastKnownFileType = folder; path = docs; sourceTree = ""; }; @@ -305,6 +308,7 @@ C476FF9722B0DD830098105B /* Alert.swift */, C41C1B4822B00A9800E7CF16 /* MenuBarImageGenerator.swift */, C474B00524C0E98C00066A22 /* LocalNotification.swift */, + C4CCBA6B275C567B008C7055 /* PMWindowController.swift */, ); path = Helpers; sourceTree = ""; @@ -512,6 +516,7 @@ C41C1B4D22B0215A00E7CF16 /* Actions.swift in Sources */, C48D0CA325CC992000CC7490 /* StatsView.swift in Sources */, C4F2E4372752F0870020E974 /* HomebrewDiagnostics.swift in Sources */, + C4CCBA6C275C567B008C7055 /* PMWindowController.swift in Sources */, C41CD0292628D8EE0065BBED /* GlobalKeybindPreference.swift in Sources */, C42295DD2358D02000E263B2 /* Command.swift in Sources */, C4811D2422D70A4700B5F6B3 /* App.swift in Sources */, @@ -551,6 +556,7 @@ C4F780CA25D80B75000DBC97 /* HomebrewPackage.swift in Sources */, C4AF9F7B2754499000D44ED0 /* Valet.swift in Sources */, C4F780C025D80B6E000DBC97 /* Startup.swift in Sources */, + C4CCBA6D275C567B008C7055 /* PMWindowController.swift in Sources */, C4F2E4382752F08D0020E974 /* HomebrewDiagnostics.swift in Sources */, C4F780AE25D80B37000DBC97 /* ExtensionParserTest.swift in Sources */, C4F780C725D80B75000DBC97 /* StatusMenu.swift in Sources */, diff --git a/phpmon/Domain/Core/App.swift b/phpmon/Domain/Core/App.swift index 1551b0d..035b0ff 100644 --- a/phpmon/Domain/Core/App.swift +++ b/phpmon/Domain/Core/App.swift @@ -141,4 +141,41 @@ class App { } } + // MARK: - Application State + + /** + Keep track of open windows. + When this list is updated, the app activation policy is re-evaluated. + The app activation policy dictates how the app runs (as a normal app or as a toolbar app). + */ + var openWindows: [String] = [] + + /** + Registers a window as currently open. + */ + public func register(window name: String) { + if !openWindows.contains(name) { + openWindows.append(name) + } + updateActivationPolicy() + } + + /** + Removes a window, assuming it was closed. + */ + public func remove(window name: String) { + openWindows.removeAll { window in + window == name + } + updateActivationPolicy() + } + + /** + If there are any open windows, the app will be a regular app. + If there are no windows open, the app will be an accessory (toolbar) app. + */ + public func updateActivationPolicy() { + NSApp.setActivationPolicy(openWindows.count > 0 ? .regular : .accessory) + } + } diff --git a/phpmon/Domain/Core/Base.lproj/Main.storyboard b/phpmon/Domain/Core/Base.lproj/Main.storyboard index 6e3f635..b2fcefb 100644 --- a/phpmon/Domain/Core/Base.lproj/Main.storyboard +++ b/phpmon/Domain/Core/Base.lproj/Main.storyboard @@ -282,9 +282,9 @@ - + @@ -578,19 +578,19 @@ Gw - + - + - + - + @@ -656,7 +656,7 @@ Gw - + @@ -712,7 +712,7 @@ Gw