From 2ec21de043e9dc3f164ae5c82871ec3de3f6fa0d Mon Sep 17 00:00:00 2001 From: Serhiy Mytrovtsiy Date: Tue, 9 Apr 2024 18:42:28 +0200 Subject: [PATCH] feat: moved network chart to the network chart widget. Replaced NetworkChart with NetworkChartV2. --- Kit/Widgets/NetworkChart.swift | 132 ++++++++++++++++--------- Kit/plugins/Charts.swift | 174 +-------------------------------- Modules/Disk/popup.swift | 4 +- Modules/Disk/portal.swift | 4 +- Modules/Net/popup.swift | 6 +- Modules/Net/portal.swift | 52 +++++----- Stats/Views/Settings.swift | 2 +- 7 files changed, 123 insertions(+), 251 deletions(-) diff --git a/Kit/Widgets/NetworkChart.swift b/Kit/Widgets/NetworkChart.swift index a3744ed9..1b7c9c6d 100644 --- a/Kit/Widgets/NetworkChart.swift +++ b/Kit/Widgets/NetworkChart.swift @@ -19,10 +19,10 @@ public class NetworkChart: WidgetWrapper { private var downloadColor: Color = .secondBlue private var uploadColor: Color = .secondRed private var scaleState: Scale = .linear - private var commonScaleState: Bool = true private var reverseOrderState: Bool = false - private var chart: NetworkChartView = NetworkChartView(frame: NSRect(x: 0, y: 0, width: 30, height: Constants.Widget.height-(2*Constants.Widget.margin.y)), num: 60) + private var points: [(Double, Double)] = Array(repeating: (0, 0), count: 60) + private var width: CGFloat { get { switch self.historyCount { @@ -81,16 +81,7 @@ public class NetworkChart: WidgetWrapper { self.downloadColor = Color.fromString(Store.shared.string(key: "\(self.title)_\(self.type.rawValue)_downloadColor", defaultValue: self.downloadColor.key)) self.uploadColor = Color.fromString(Store.shared.string(key: "\(self.title)_\(self.type.rawValue)_uploadColor", defaultValue: self.uploadColor.key)) self.scaleState = Scale.fromString(Store.shared.string(key: "\(self.title)_\(self.type.rawValue)_scale", defaultValue: self.scaleState.key)) - self.commonScaleState = Store.shared.bool(key: "\(self.title)_\(self.type.rawValue)_commonScale", defaultValue: self.commonScaleState) self.reverseOrderState = Store.shared.bool(key: "\(self.title)_\(self.type.rawValue)_reverseOrder", defaultValue: self.reverseOrderState) - - if let downloadColor = self.downloadColor.additional as? NSColor, - let uploadColor = self.uploadColor.additional as? NSColor { - self.chart.setColors(in: downloadColor, out: uploadColor) - } - self.chart.setScale(self.scaleState, self.commonScaleState) - self.chart.reinit(self.historyCount) - self.chart.setReverseOrder(self.reverseOrderState) } if preview { @@ -98,7 +89,7 @@ public class NetworkChart: WidgetWrapper { for _ in 0..<60 { list.append((Double.random(in: 0..<23), Double.random(in: 0..<23))) } - self.chart.points = list + self.points = list } let style = NSMutableParagraphStyle() @@ -166,9 +157,74 @@ public class NetworkChart: WidgetWrapper { width: box.bounds.width - (offset*2+lineWidth), height: box.bounds.height - offset ) - self.chart.setFrameSize(NSSize(width: chartFrame.width, height: chartFrame.height)) - self.chart.setFrameOrigin(NSPoint(x: chartFrame.origin.x, y: chartFrame.origin.y)) - self.chart.draw(chartFrame) + let points = self.points + var topMax: Double = (self.reverseOrderState ? points.map{ $0.0 }.max() : points.map{ $0.1 }.max()) ?? 0 + var bottomMax: Double = (self.reverseOrderState ? points.map{ $0.1 }.max() : points.map{ $0.0 }.max()) ?? 0 + if topMax == 0 { + topMax = 1 + } + if bottomMax == 0 { + bottomMax = 1 + } + + let zero: CGFloat = (chartFrame.height/2) + chartFrame.origin.y + let xRatio: CGFloat = (chartFrame.width + (lineWidth*3)) / CGFloat(points.count) + let xCenter: CGFloat = chartFrame.height/2 + chartFrame.origin.y + + let columnXPoint = { (point: Int) -> CGFloat in + return (CGFloat(point) * xRatio) + (chartFrame.origin.x - lineWidth) + } + + let topYPoint = { (point: Int) -> CGFloat in + let value = self.reverseOrderState ? points[point].0 : points[point].1 + return scaleValue(scale: self.scaleState, value: value, maxValue: topMax, maxHeight: chartFrame.height/2, limit: 1) + xCenter + } + let bottomYPoint = { (point: Int) -> CGFloat in + let value = self.reverseOrderState ? points[point].1 : points[point].0 + return xCenter - scaleValue(scale: self.scaleState, value: value, maxValue: bottomMax, maxHeight: chartFrame.height/2, limit: 1) + } + + let topLinePath = NSBezierPath() + topLinePath.move(to: CGPoint(x: columnXPoint(0), y: topYPoint(0))) + let bottomLinePath = NSBezierPath() + bottomLinePath.move(to: CGPoint(x: columnXPoint(0), y: bottomYPoint(0))) + + for i in 1.. topMax { - topMax = bottomMax - } else { - bottomMax = topMax - } - } - - let lineWidth = 1 / (NSScreen.main?.backingScaleFactor ?? 1) - let zero: CGFloat = (self.frame.height/2) + self.frame.origin.y - let xRatio: CGFloat = (self.frame.width + (lineWidth*3)) / CGFloat(points.count) - let xCenter: CGFloat = self.frame.height/2 + self.frame.origin.y - - let columnXPoint = { (point: Int) -> CGFloat in - return (CGFloat(point) * xRatio) + (self.frame.origin.x - lineWidth) - } - - let topYPoint = { (point: Int) -> CGFloat in - let value = self.reverseOrder ? points[point].1 : points[point].0 - return scaleValue(scale: self.scale, value: value, maxValue: topMax, maxHeight: self.frame.height/2, limit: self.fixedScale) + xCenter - } - let bottomYPoint = { (point: Int) -> CGFloat in - let value = self.reverseOrder ? points[point].0 : points[point].1 - return xCenter - scaleValue(scale: self.scale, value: value, maxValue: bottomMax, maxHeight: self.frame.height/2, limit: self.fixedScale) - } - - let topLinePath = NSBezierPath() - topLinePath.move(to: CGPoint(x: columnXPoint(0), y: topYPoint(0))) - - let bottomLinePath = NSBezierPath() - bottomLinePath.move(to: CGPoint(x: columnXPoint(0), y: bottomYPoint(0))) - - for i in 1.. NSView { - let view = NSStackView() - view.orientation = .vertical - view.distribution = .fill - view.spacing = Constants.Popup.spacing*2 - let chart = NetworkChartViewV2(frame: NSRect.zero, num: 120, outColor: self.uploadColor, inColor: self.downloadColor) - self.chart = chart - - view.addArrangedSubview(chart) - - return view - } - public func usageCallback(_ value: Network_Usage) { DispatchQueue.main.async(execute: { if let chart = self.chart { @@ -88,6 +82,8 @@ public class Portal: PortalWrapper { chart.base = self.base } chart.addValue(upload: Double(value.bandwidth.upload), download: Double(value.bandwidth.download)) + chart.setScale(self.chartScale, 1) + chart.setColors(in: self.downloadColor, out: self.uploadColor) } if let view = self.publicIPField, view.stringValue != value.raddr.v4 { diff --git a/Stats/Views/Settings.swift b/Stats/Views/Settings.swift index c060f4fe..6a1f8f7b 100644 --- a/Stats/Views/Settings.swift +++ b/Stats/Views/Settings.swift @@ -149,7 +149,7 @@ class SettingsWindow: NSWindow, NSWindowDelegate, NSToolbarDelegate { return nil } } - + func toolbarAllowedItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] { return [.flexibleSpace, .toggleButton] }