// // WaftersView.swift // // // Created by MacBook Pro on 2021/12/04. // import SwiftUI import ProcessorKit public struct WafersView: View { @ObservedObject var processor: ProcessorObserver private let coreType = CoreTypeInformation() public init(processor: ProcessorObserver) { self.processor = processor } public var body: some View { if processor.coreUsages.count < 30 { HStack(alignment: .bottom) { EachCoreView(coreUsages: processor.coreUsages, coreTypes: coreType.coreTypes) } .padding(20) } else { // For Macs with a large number of cores, such as the MacPro, use 2 lines VStack { let halfCoreCount: Int = processor.coreUsages.count / 2 EachCoreView(coreUsages: Array(processor.coreUsages[0..<halfCoreCount]), coreTypes: Array(coreType.coreTypes[0..<halfCoreCount])) EachCoreView(coreUsages: Array(processor.coreUsages[halfCoreCount..<processor.coreUsages.count]), coreTypes: Array(coreType.coreTypes[halfCoreCount..<processor.coreUsages.count])) } } } } // MARK: - Each core usage bar public struct EachCoreView: View { var coreUsages: [ProcessorUsage] var coreTypes: [WaferCoreTypes] public var body: some View { HStack(alignment: .bottom) { ForEach(0..<coreUsages.count, id: \.self) { num in // Color of performance core is purple let color = coreTypes[num] == .performance ? Color.iris : Color.peacockGreen let coreUsage = coreUsages[num] let totalUsage = min(99.9, round((coreUsage.user + coreUsage.system) * 10.0) / 10.0) BarView(value: totalUsage * 1.2, color: color) } } } } // MARK: - Bar public struct BarView: View { var value: CGFloat var maxValue: CGFloat = 120 var color = Color(.sRGB, red: 0.2, green: 0.5, blue: 0.8) public var body: some View { VStack { ZStack(alignment: .bottom) { RoundedRectangle(cornerRadius: 5) .frame(width: 30, height: maxValue) .foregroundColor(.secondary.opacity(0.2)) RoundedRectangle(cornerRadius: 5) .frame(width: 30, height: value) .foregroundColor(color) } } } } // MARK: - Color extension public extension Color { static let iris = Color(.sRGB, red: 0.6, green: 0.5, blue: 0.8) static let peacockGreen = Color(.sRGB, red: 0.2, green: 0.6, blue: 0.7) } // MARK: - Preview struct WafersView_Previews: PreviewProvider { static var previews: some View { WafersView(processor: ProcessorObserver()) } }