diff --git a/PHP Monitor.xcodeproj/project.pbxproj b/PHP Monitor.xcodeproj/project.pbxproj index f880a4b..cc7f358 100644 --- a/PHP Monitor.xcodeproj/project.pbxproj +++ b/PHP Monitor.xcodeproj/project.pbxproj @@ -2749,7 +2749,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 900; + CURRENT_PROJECT_VERSION = 1000; DEAD_CODE_STRIPPING = YES; DEBUG = YES; DEVELOPMENT_TEAM = 8M54J5J787; @@ -2778,7 +2778,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 900; + CURRENT_PROJECT_VERSION = 1000; DEAD_CODE_STRIPPING = YES; DEBUG = NO; DEVELOPMENT_TEAM = 8M54J5J787; @@ -3006,7 +3006,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 900; + CURRENT_PROJECT_VERSION = 1000; DEBUG = NO; DEVELOPMENT_TEAM = 8M54J5J787; ENABLE_HARDENED_RUNTIME = YES; @@ -3116,7 +3116,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 900; + CURRENT_PROJECT_VERSION = 1000; DEBUG = YES; DEVELOPMENT_TEAM = 8M54J5J787; ENABLE_HARDENED_RUNTIME = YES; diff --git a/phpmon/Domain/App/ServicesManager.swift b/phpmon/Domain/App/ServicesManager.swift index 8051b33..eab61ac 100644 --- a/phpmon/Domain/App/ServicesManager.swift +++ b/phpmon/Domain/App/ServicesManager.swift @@ -13,11 +13,9 @@ class ServicesManager: ObservableObject { static var shared = ServicesManager() - #warning("Only publish the status") + @Published private(set) var formulae: [HomebrewFormula] - private(set) var formulae: [HomebrewFormula] - - private(set) var services: [String: ServiceWrapper] = [:] + @Published private(set) var services: [String: ServiceWrapper] = [:] init() { Log.info("Initializing ServicesManager...") diff --git a/phpmon/Domain/SwiftUI/Menu/ServicesView.swift b/phpmon/Domain/SwiftUI/Menu/ServicesView.swift index bd3ad91..b142ba8 100644 --- a/phpmon/Domain/SwiftUI/Menu/ServicesView.swift +++ b/phpmon/Domain/SwiftUI/Menu/ServicesView.swift @@ -10,154 +10,42 @@ import Foundation import SwiftUI struct ServicesView: View { - @ObservedObject var manager: ServicesManager - @State var servicesToDisplay: [String] - @State var perRow: Int = 3 - static func asMenuItem(perRow: Int = 3) -> NSMenuItem { let item = NSMenuItem() - let services = ServicesManager.shared.formulae.map { formula in - return formula.name - } - let view = NSHostingView( - rootView: Self( - manager: ServicesManager.shared, - servicesToDisplay: services, - perRow: perRow - ) + rootView: Self() ) view.autoresizingMask = [.width, .height] - let height = CGFloat(45 * services.chunked(by: perRow).count) + + let height = CGFloat(45 * ["a", "b", "c", "d", "e", "f"] + .chunked(by: perRow).count) + view.setFrameSize(CGSize(width: view.frame.width, height: height)) item.view = view return item } var body: some View { - VStack(alignment: .leading, spacing: 10) { - ForEach(servicesToDisplay.chunked(by: self.perRow), id: \.self) { chunk in - HStack { - ForEach(0...self.perRow - 1, id: \.self) { index in - if chunk.indices.contains(index) { - // A service exists to fill the cell - let service = chunk[index] - VStack(alignment: .center, spacing: 3) { - SectionHeaderView(text: service.uppercased()) - CheckmarkView(serviceName: service) - .environmentObject(manager) - }.frame(minWidth: 0, maxWidth: .infinity) - } else { - // Empty cell - VStack { - EmptyView() - }.frame(minWidth: 0, maxWidth: .infinity) - } - } - } - } - } + Text("WIP") .padding(10) .frame(minWidth: 0, maxWidth: .infinity) .background(Color.debug) } } -struct CheckmarkView: View { - @State var serviceName: String - @State var busy: Bool = false - @EnvironmentObject var manager: ServicesManager - - public func hasAnyServices() -> Bool { - return !manager.services.isEmpty - } - - public func active() -> Bool? { - if manager.services.keys.contains(serviceName) { - return manager.services[serviceName]!.service?.running ?? nil - } - - return nil - } - - public func toggleService() async { - if active()! { - await Actions.stopService(name: serviceName) - await delay(seconds: 1.2) - busy = false - } else { - await Actions.startService(name: serviceName) - await delay(seconds: 1.2) - busy = false - } - } - - var body: some View { - if !hasAnyServices() { - Image(systemName: "hourglass.circle") - .resizable() - .frame(width: 16.0, height: 16.0) - .foregroundColor(.appSecondary) - } else { - if busy { - ProgressView() - .scaleEffect(x: 0.5, y: 0.5, anchor: .center) - .frame(width: 16.0, height: 20.0) - } else if active() == nil { - Button { } label: { - Text("?") - }.disabled(true) - } else { - Button { - busy = true - Task { await toggleService() } - } label: { - Image(systemName: active()! ? "checkmark" : "xmark") - .resizable() - .frame(width: 12.0, height: 12.0) - .foregroundColor(active()! ? Color.primary : Color("IconColorRed")) - } - } - } - } -} - struct ServicesView_Previews: PreviewProvider { static var previews: some View { - ServicesView( - manager: ServicesManager() - .withDummyServices([:]), - servicesToDisplay: ["php", "nginx", "dnsmasq"] - ) + ServicesView() .frame(width: 330.0) .previewDisplayName("Loading") - ServicesView( - manager: ServicesManager() - .withDummyServices([ - "php": false, - "nginx": true, - "dnsmasq": true - ]), - servicesToDisplay: ["php", "nginx", "dnsmasq"] - ) + ServicesView() .frame(width: 330.0) .previewDisplayName("Light Mode") - ServicesView( - manager: ServicesManager() - .withDummyServices([ - "php": false, - "nginx": true, - "dnsmasq": true, - "mysql": false - ]), - servicesToDisplay: ["php", "nginx", "dnsmasq", - "mysql", "redis", "php@7.4"], - perRow: 3 - ) + ServicesView() .frame(width: 330.0) .previewDisplayName("Dark Mode") .preferredColorScheme(.dark)