diff --git a/Kit/helpers.swift b/Kit/helpers.swift index 2bdd615a12b..933eb51799f 100644 --- a/Kit/helpers.swift +++ b/Kit/helpers.swift @@ -350,7 +350,7 @@ public func popupRow(_ view: NSView, n: CGFloat = 0, title: String, value: Strin return (labelView, valueView) } -public func portalRow(_ v: NSStackView, title: String) -> ValueField { +public func portalRow(_ v: NSStackView, title: String, value: String = "") -> ValueField { let view: NSStackView = NSStackView() view.orientation = .horizontal view.distribution = .fillProportionally @@ -359,7 +359,7 @@ public func portalRow(_ v: NSStackView, title: String) -> ValueField { let labelView: LabelField = LabelField(title) labelView.font = NSFont.systemFont(ofSize: 11, weight: .regular) - let valueView: ValueField = ValueField() + let valueView: ValueField = ValueField(value) valueView.font = NSFont.systemFont(ofSize: 12, weight: .regular) view.addArrangedSubview(labelView) diff --git a/Modules/Net/popup.swift b/Modules/Net/popup.swift index a765e6a1e0b..686a464c2ea 100644 --- a/Modules/Net/popup.swift +++ b/Modules/Net/popup.swift @@ -73,7 +73,7 @@ internal class Popup: PopupWrapper { private var downloadColorState: Color = .secondBlue private var downloadColor: NSColor { - var value = NSColor.systemRed + var value = NSColor.systemBlue if let color = self.downloadColorState.additional as? NSColor { value = color } @@ -81,7 +81,7 @@ internal class Popup: PopupWrapper { } private var uploadColorState: Color = .secondRed private var uploadColor: NSColor { - var value = NSColor.systemBlue + var value = NSColor.systemRed if let color = self.uploadColorState.additional as? NSColor { value = color } diff --git a/Modules/Net/portal.swift b/Modules/Net/portal.swift index ea76ddedd71..5ffbd29f4b2 100644 --- a/Modules/Net/portal.swift +++ b/Modules/Net/portal.swift @@ -12,18 +12,18 @@ import Cocoa import Kit -public class Portal: NSStackView, Portal_p { - public var name: String - +public class Portal: PortalWrapper { private var chart: NetworkChartView? = nil + private var publicIPField: NSTextField? = nil + private var base: DataSizeBase { DataSizeBase(rawValue: Store.shared.string(key: "\(self.name)_base", defaultValue: "byte")) ?? .byte } private var downloadColorState: Color = .secondBlue private var downloadColor: NSColor { - var value = NSColor.systemRed + var value = NSColor.systemBlue if let color = self.downloadColorState.additional as? NSColor { value = color } @@ -31,48 +31,54 @@ public class Portal: NSStackView, Portal_p { } private var uploadColorState: Color = .secondRed private var uploadColor: NSColor { - var value = NSColor.systemBlue + var value = NSColor.systemRed if let color = self.uploadColorState.additional as? NSColor { value = color } return value } - public init(_ module: ModuleType) { - self.name = module.rawValue - - super.init(frame: NSRect.zero) - - self.wantsLayer = true - self.layer?.backgroundColor = NSColor.windowBackgroundColor.cgColor - self.layer?.cornerRadius = 3 + private var initialized: Bool = false + + public override func load() { + self.loadColors() - self.orientation = .vertical - self.distribution = .fillEqually - self.spacing = Constants.Popup.spacing*2 - self.edgeInsets = NSEdgeInsets( - top: Constants.Popup.spacing*2, + let view = NSStackView() + view.orientation = .vertical + view.distribution = .fillEqually + view.spacing = Constants.Popup.spacing*2 + view.edgeInsets = NSEdgeInsets( + top: 0, left: Constants.Popup.spacing*2, - bottom: Constants.Popup.spacing*2, + bottom: 0, right: Constants.Popup.spacing*2 ) - self.addArrangedSubview(PortalHeader(name)) - let chart = NetworkChartView(frame: NSRect.zero, num: 120, outColor: self.uploadColor, inColor: self.downloadColor) - chart.base = self.base - self.chart = chart - self.chart!.toolTip = localizedString("Network activity") - self.addArrangedSubview(self.chart!) + let chartView = self.chartView() + view.addArrangedSubview(chartView) + + self.publicIPField = portalRow(view, title: "\(localizedString("Public IP")):", value: localizedString("Unknown")) + view.subviews.last?.heightAnchor.constraint(equalToConstant: 16).isActive = true - self.heightAnchor.constraint(equalToConstant: Constants.Popup.portalHeight).isActive = true + self.addArrangedSubview(view) } - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") + public func loadColors() { + self.downloadColorState = Color.fromString(Store.shared.string(key: "\(self.name)_downloadColor", defaultValue: self.downloadColorState.key)) + self.uploadColorState = Color.fromString(Store.shared.string(key: "\(self.name)_uploadColor", defaultValue: self.uploadColorState.key)) } - public override func updateLayer() { - self.layer?.backgroundColor = NSColor.windowBackgroundColor.cgColor + private func chartView() -> NSView { + let view = NSStackView() + view.orientation = .vertical + view.distribution = .fill + view.spacing = Constants.Popup.spacing*2 + let chart = NetworkChartView(frame: NSRect.zero, num: 120, minMax: true, outColor: self.uploadColor, inColor: self.downloadColor) + self.chart = chart + + view.addArrangedSubview(chart) + + return view } public func usageCallback(_ value: Network_Usage) { @@ -83,6 +89,19 @@ public class Portal: NSStackView, Portal_p { } chart.addValue(upload: Double(value.bandwidth.upload), download: Double(value.bandwidth.download)) } + + if let view = self.publicIPField, view.stringValue != value.raddr.v4 { + if let addr = value.raddr.v4 { + view.stringValue = (value.wifiDetails.countryCode != nil) ? "\(addr) (\(value.wifiDetails.countryCode!))" : addr + } else { + view.stringValue = localizedString("Unknown") + } + if let addr = value.raddr.v6 { + view.toolTip = "\("\(localizedString("v6")):") \(addr)" + } else { + view.toolTip = "\("\(localizedString("v6")):") \(localizedString("Unknown"))" + } + } }) } }