diff --git a/PHP Monitor.xcodeproj/project.pbxproj b/PHP Monitor.xcodeproj/project.pbxproj index e6e7e4a..997a0f1 100644 --- a/PHP Monitor.xcodeproj/project.pbxproj +++ b/PHP Monitor.xcodeproj/project.pbxproj @@ -51,6 +51,8 @@ C40C7F2927721FF600DDDCDC /* ActivePhpInstallation+Checks.swift in Sources */ = {isa = PBXBuildFile; fileRef = C40C7F2727721FF600DDDCDC /* ActivePhpInstallation+Checks.swift */; }; C40C7F3027722E8D00DDDCDC /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = C40C7F2F27722E8D00DDDCDC /* Logger.swift */; }; C40C7F3127722E8D00DDDCDC /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = C40C7F2F27722E8D00DDDCDC /* Logger.swift */; }; + C40D88EB27F38D7600C94B40 /* SiteListProxiesCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C40D88EA27F38D7600C94B40 /* SiteListProxiesCell.swift */; }; + C40D88EC27F38D7600C94B40 /* SiteListProxiesCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C40D88EA27F38D7600C94B40 /* SiteListProxiesCell.swift */; }; C412E5FC25700D5300A1FB67 /* HomebrewPackage.swift in Sources */ = {isa = PBXBuildFile; fileRef = C412E5FB25700D5300A1FB67 /* HomebrewPackage.swift */; }; C415937F27A1B54F00D2E1B7 /* PhpFrameworks.swift in Sources */ = {isa = PBXBuildFile; fileRef = C415937E27A1B54F00D2E1B7 /* PhpFrameworks.swift */; }; C415938027A1B54F00D2E1B7 /* PhpFrameworks.swift in Sources */ = {isa = PBXBuildFile; fileRef = C415937E27A1B54F00D2E1B7 /* PhpFrameworks.swift */; }; @@ -269,6 +271,7 @@ C40C7F1D2772136000DDDCDC /* PhpEnv.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhpEnv.swift; sourceTree = ""; }; C40C7F2727721FF600DDDCDC /* ActivePhpInstallation+Checks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ActivePhpInstallation+Checks.swift"; sourceTree = ""; }; C40C7F2F27722E8D00DDDCDC /* Logger.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Logger.swift; sourceTree = ""; }; + C40D88EA27F38D7600C94B40 /* SiteListProxiesCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SiteListProxiesCell.swift; sourceTree = ""; }; C412E5FB25700D5300A1FB67 /* HomebrewPackage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomebrewPackage.swift; sourceTree = ""; }; C415937E27A1B54F00D2E1B7 /* PhpFrameworks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhpFrameworks.swift; sourceTree = ""; }; C415D3B62770F294005EF286 /* Actions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Actions.swift; sourceTree = ""; }; @@ -584,6 +587,7 @@ C44067F627E258410045BD4E /* SiteListPhpCell.swift */, C44067F827E2585E0045BD4E /* SiteListTypeCell.swift */, C4AC51FB27E27F47008528CA /* SiteListKindCell.swift */, + C40D88EA27F38D7600C94B40 /* SiteListProxiesCell.swift */, ); path = Cells; sourceTree = ""; @@ -993,6 +997,7 @@ C4EE55A927708B9E001DF387 /* PMHeaderView.swift in Sources */, C41C02A927E61A65009F26CB /* ValetSite+Fake.swift in Sources */, C4F2E4372752F0870020E974 /* HomebrewDiagnostics.swift in Sources */, + C40D88EB27F38D7600C94B40 /* SiteListProxiesCell.swift in Sources */, C4CCBA6C275C567B008C7055 /* PMWindowController.swift in Sources */, C4B585442770FE3900DA4FBE /* Command.swift in Sources */, C44067F527E2582B0045BD4E /* SiteListNameCell.swift in Sources */, @@ -1128,6 +1133,7 @@ C417DC75277614690015E6EE /* Helpers.swift in Sources */, C4080FF727BD8C6400BF2C6B /* BetterAlert.swift in Sources */, C4B97B7C275CF20A003F3378 /* App+GlobalHotkey.swift in Sources */, + C40D88EC27F38D7600C94B40 /* SiteListProxiesCell.swift in Sources */, 54D9E0B327E4F51E003B9AD9 /* HotKeysController.swift in Sources */, C4B97B79275CF1B5003F3378 /* App+ActivationPolicy.swift in Sources */, C4CE3BBB27B324230086CA49 /* MainMenu+Switcher.swift in Sources */, diff --git a/assets/affinity/icons.afdesign b/assets/affinity/icons.afdesign index 2fd0e2c..8811fa5 100644 Binary files a/assets/affinity/icons.afdesign and b/assets/affinity/icons.afdesign differ diff --git a/phpmon/Assets.xcassets/IconProxy.imageset/Contents.json b/phpmon/Assets.xcassets/IconProxy.imageset/Contents.json new file mode 100644 index 0000000..96ca580 --- /dev/null +++ b/phpmon/Assets.xcassets/IconProxy.imageset/Contents.json @@ -0,0 +1,25 @@ +{ + "images" : [ + { + "filename" : "Proxy.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Proxy@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/phpmon/Assets.xcassets/IconProxy.imageset/Proxy.png b/phpmon/Assets.xcassets/IconProxy.imageset/Proxy.png new file mode 100644 index 0000000..dd150f9 Binary files /dev/null and b/phpmon/Assets.xcassets/IconProxy.imageset/Proxy.png differ diff --git a/phpmon/Assets.xcassets/IconProxy.imageset/Proxy@2x.png b/phpmon/Assets.xcassets/IconProxy.imageset/Proxy@2x.png new file mode 100644 index 0000000..55a7a3c Binary files /dev/null and b/phpmon/Assets.xcassets/IconProxy.imageset/Proxy@2x.png differ diff --git a/phpmon/Domain/App/Base.lproj/Main.storyboard b/phpmon/Domain/App/Base.lproj/Main.storyboard index ab9c5b6..d022ac1 100644 --- a/phpmon/Domain/App/Base.lproj/Main.storyboard +++ b/phpmon/Domain/App/Base.lproj/Main.storyboard @@ -805,7 +805,7 @@ Gw - + @@ -848,7 +848,7 @@ Gw - + @@ -862,7 +862,7 @@ Gw - + @@ -911,7 +911,7 @@ Gw - + + + + + + + + + + + + + + + + + + + + @@ -1051,7 +1111,7 @@ Gw - + @@ -1060,7 +1120,7 @@ Gw - + @@ -1088,12 +1148,13 @@ Gw - + + diff --git a/phpmon/Domain/Integrations/Valet/ValetSite.swift b/phpmon/Domain/Integrations/Valet/ValetSite.swift index ed87be0..4b9a0d5 100644 --- a/phpmon/Domain/Integrations/Valet/ValetSite.swift +++ b/phpmon/Domain/Integrations/Valet/ValetSite.swift @@ -59,6 +59,9 @@ class ValetSite { ?? PhpEnv.phpInstall.version.short } + /// Proxies set up for this domain. + var proxies: [String] = [] + enum VersionSource: String { case unknown = "unknown" case require = "require" @@ -84,6 +87,7 @@ class ValetSite { determineComposerPhpVersion() determineDriver() determineIsolated() + determineProxies() } } @@ -220,6 +224,18 @@ class ValetSite { } } + /** + TODO: This method should determine which proxies are active for this site. + For test purposes this method currently will set a fixed value for + my own website, eyo. Fun. I will need to check how to determine which + sites are being proxied, first (and how this works!). + */ + private func determineProxies() { + if self.name == "nicoverbruggen" { + self.proxies = ["127.0.0.1:1337", "127.0.0.1:9999"] + } + } + // MARK: File Parsing public static func isolatedVersion(_ filePath: String) -> String? { diff --git a/phpmon/Domain/SiteList/Cells/SiteListProxiesCell.swift b/phpmon/Domain/SiteList/Cells/SiteListProxiesCell.swift new file mode 100644 index 0000000..69b5b97 --- /dev/null +++ b/phpmon/Domain/SiteList/Cells/SiteListProxiesCell.swift @@ -0,0 +1,34 @@ +// +// SiteListNameCell.swift +// PHP Monitor +// +// Created by Nico Verbruggen on 16/03/2022. +// Copyright © 2022 Nico Verbruggen. All rights reserved. +// + +import Cocoa +import AppKit + +class SiteListProxiesCell: NSTableCellView, SiteListCellProtocol +{ + static let reusableName = "siteListProxiesCell" + + @IBOutlet weak var textFieldPrimary: NSTextField! + @IBOutlet weak var textFieldAdditional: NSTextField! + @IBOutlet weak var buttonProxyList: NSButton! + + func populateCell(with site: ValetSite) { + // Show the first proxy + textFieldPrimary.stringValue = (site.proxies.count == 0) + ? "" + : site.proxies[0] + + // Show additional proxy count + textFieldAdditional.stringValue = site.proxies.count > 1 + ? "and \(site.proxies.count - 1) more active" + : site.proxies.count == 1 ? "(active)" : "" + + // Show button + buttonProxyList.isHidden = site.proxies.count == 0 + } +} diff --git a/phpmon/Domain/SiteList/SiteListVC.swift b/phpmon/Domain/SiteList/SiteListVC.swift index 49645ad..6638a9c 100644 --- a/phpmon/Domain/SiteList/SiteListVC.swift +++ b/phpmon/Domain/SiteList/SiteListVC.swift @@ -212,6 +212,7 @@ class SiteListVC: NSViewController, NSTableViewDelegate, NSTableViewDataSource { "ENVIRONMENT": SiteListPhpCell.reusableName, "KIND": SiteListKindCell.reusableName, "TYPE": SiteListTypeCell.reusableName, + "PROXY": SiteListProxiesCell.reusableName, ] let columnName = tableColumn!.identifier.rawValue @@ -239,6 +240,30 @@ class SiteListVC: NSViewController, NSTableViewDelegate, NSTableViewDataSource { // MARK: - (Search) Text Field Delegate + func toggleProxyColumnBasedOnActiveProxies() { + let id = self.tableView.column( + withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "PROXY") + ) + + let column = self.tableView.tableColumns[id] + + column.isHidden = !sites.contains(where: { site in + site.proxies.count > 0 + }) + } + + func reloadTable() { + toggleProxyColumnBasedOnActiveProxies() + + if let sortDescriptor = sortDescriptor { + self.applySortDescriptor(sortDescriptor) + } + + DispatchQueue.main.async { + self.tableView.reloadData() + } + } + func searchedFor(text: String) { lastSearchedFor = text @@ -247,13 +272,7 @@ class SiteListVC: NSViewController, NSTableViewDelegate, NSTableViewDataSource { if searchString.isEmpty { sites = Valet.shared.sites - if let sortDescriptor = sortDescriptor { - self.applySortDescriptor(sortDescriptor) - } - - DispatchQueue.main.async { - self.tableView.reloadData() - } + reloadTable() return } @@ -268,13 +287,7 @@ class SiteListVC: NSViewController, NSTableViewDelegate, NSTableViewDataSource { }.contains(false) }) - if let sortDescriptor = sortDescriptor { - self.applySortDescriptor(sortDescriptor) - } - - DispatchQueue.main.async { - self.tableView.reloadData() - } + reloadTable() } // MARK: - Deinitialization