feat: added chart scale setting to the CPU popup settings

This commit is contained in:
Serhiy Mytrovtsiy
2024-04-05 18:54:37 +02:00
parent 8a27539df1
commit 9d828bb663
2 changed files with 90 additions and 1 deletions

View File

@@ -385,6 +385,50 @@ public extension NSView {
return view
}
func sliderSettingsRow(title: String, action: Selector, value: Int, suffix: String, isHidden: Bool = false, min: Double = 1, max: Double = 100) -> NSView {
let view: NSStackView = NSStackView()
view.translatesAutoresizingMaskIntoConstraints = false
view.heightAnchor.constraint(equalToConstant: Constants.Settings.row * 1.2).isActive = true
view.orientation = .horizontal
view.alignment = .centerY
view.distribution = .fill
view.spacing = 0
view.isHidden = isHidden
let titleField: NSTextField = LabelField(frame: NSRect(x: 0, y: 0, width: 0, height: 0), title)
titleField.font = NSFont.systemFont(ofSize: 12, weight: .regular)
titleField.textColor = .textColor
let container: NSView = NSView()
container.identifier = NSUserInterfaceItemIdentifier("container")
let valueField: NSTextField = LabelField(frame: NSRect(x: 0, y: 21, width: 195, height: 15), "\(value) \(suffix)")
valueField.font = NSFont.systemFont(ofSize: 12, weight: .regular)
valueField.textColor = .textColor
valueField.alignment = .center
let slider = NSSlider(frame: NSRect(x: 0, y: -5, width: 195, height: 0))
slider.minValue = min
slider.maxValue = max
slider.intValue = Int32(value)
slider.target = self
slider.isContinuous = true
slider.action = action
slider.sizeToFit()
container.addSubview(valueField)
container.addSubview(slider)
view.addArrangedSubview(titleField)
view.addArrangedSubview(NSView())
view.addArrangedSubview(container)
container.widthAnchor.constraint(equalToConstant: 195).isActive = true
container.heightAnchor.constraint(equalTo: view.heightAnchor).isActive = true
return view
}
func selectView(action: Selector, items: [KeyValue_p], selected: String) -> NSPopUpButton {
let select: NSPopUpButton = NSPopUpButton(frame: NSRect(x: 0, y: 0, width: 50, height: 28))
select.target = self

View File

@@ -54,6 +54,8 @@ internal class Popup: PopupWrapper {
private var eCoresColorView: NSView? = nil
private var pCoresColorView: NSView? = nil
private var sliderView: NSView? = nil
private var lineChart: LineChartView? = nil
private var barChart: BarChartView? = nil
private var circle: PieChartView? = nil
@@ -69,6 +71,8 @@ internal class Popup: PopupWrapper {
private var processes: ProcessesView? = nil
private var maxFreq: Double = 0
private var lineChartHistory: Int = 180
private var lineChartScale: Scale = .none
private var lineChartFixedScale: Double = 1
private var systemColorState: Color = .secondRed
private var systemColor: NSColor { self.systemColorState.additional as? NSColor ?? NSColor.systemRed }
@@ -108,6 +112,8 @@ internal class Popup: PopupWrapper {
self.eCoresColorState = Color.fromString(Store.shared.string(key: "\(self.title)_eCoresColor", defaultValue: self.eCoresColorState.key))
self.pCoresColorState = Color.fromString(Store.shared.string(key: "\(self.title)_pCoresColor", defaultValue: self.pCoresColorState.key))
self.lineChartHistory = Store.shared.int(key: "\(self.title)_lineChartHistory", defaultValue: self.lineChartHistory)
self.lineChartScale = Scale.fromString(Store.shared.string(key: "\(self.title)_lineChartScale", defaultValue: self.lineChartScale.key))
self.lineChartFixedScale = Double(Store.shared.int(key: "\(self.title)_lineChartFixedScale", defaultValue: 100)) / 100
let gridView: NSGridView = NSGridView(frame: NSRect(x: 0, y: 0, width: self.frame.width, height: self.frame.height))
gridView.rowSpacing = 0
@@ -204,7 +210,8 @@ internal class Popup: PopupWrapper {
box.layer?.backgroundColor = NSColor.lightGray.withAlphaComponent(0.1).cgColor
box.layer?.cornerRadius = 3
self.lineChart = LineChartView(frame: NSRect(x: 1, y: 0, width: box.frame.width, height: box.frame.height), num: self.lineChartHistory)
let chartFrame = NSRect(x: 1, y: 0, width: box.frame.width, height: box.frame.height)
self.lineChart = LineChartView(frame: chartFrame, num: self.lineChartHistory, scale: self.lineChartScale, fixedScale: self.lineChartFixedScale)
self.lineChart?.color = self.chartColor
box.addSubview(self.lineChart!)
@@ -495,6 +502,23 @@ internal class Popup: PopupWrapper {
selected: "\(self.lineChartHistory)"
))
view.addArrangedSubview(selectSettingsRow(
title: localizedString("Scaling"),
action: #selector(self.toggleLineChartScale),
items: Scale.allCases,
selected: self.lineChartScale.key
))
let slider = sliderSettingsRow(
title: localizedString("Fixed value"),
action: #selector(self.toggleLineChartFixedScale),
value: Int(self.lineChartFixedScale * 100),
suffix: "%",
isHidden: self.lineChartScale != .fixed
)
self.sliderView = slider
view.addArrangedSubview(slider)
return view
}
@@ -557,4 +581,25 @@ internal class Popup: PopupWrapper {
Store.shared.set(key: "\(self.title)_lineChartHistory", value: value)
self.lineChart?.reinit(self.lineChartHistory)
}
@objc private func toggleLineChartScale(_ sender: NSMenuItem) {
guard let key = sender.representedObject as? String,
let value = Scale.allCases.first(where: { $0.key == key }) else { return }
self.sliderView?.isHidden = value != .fixed
self.lineChartScale = value
self.lineChart?.setScale(self.lineChartScale, fixedScale: self.lineChartFixedScale)
Store.shared.set(key: "\(self.title)_lineChartScale", value: key)
self.display()
}
@objc private func toggleLineChartFixedScale(_ sender: NSSlider) {
let value = Int(sender.doubleValue)
if let container = self.sliderView?.subviews.first(where: { $0.identifier == NSUserInterfaceItemIdentifier("container") }),
let field = container.subviews.first(where: { $0 is NSTextField }), let view = field as? NSTextField {
view.stringValue = "\(value) %"
}
self.lineChartFixedScale = sender.doubleValue / 100
self.lineChart?.setScale(self.lineChartScale, fixedScale: self.lineChartFixedScale)
Store.shared.set(key: "\(self.title)_lineChartFixedScale", value: value)
}
}