feat: added an option to change read/write colors for the disk popup (#1374)

This commit is contained in:
Serhiy Mytrovtsiy
2023-04-03 20:06:53 +02:00
parent b061e6dcc9
commit e40cf2112f

View File

@@ -15,9 +15,29 @@ import Kit
internal class Popup: PopupWrapper {
private let emptyView: EmptyView = EmptyView(height: 30, isHidden: false, msg: localizedString("No disks are available"))
private var readColorState: Color = .secondBlue
private var readColor: NSColor {
var value = NSColor.systemRed
if let color = self.readColorState.additional as? NSColor {
value = color
}
return value
}
private var writeColorState: Color = .secondRed
private var writeColor: NSColor {
var value = NSColor.systemBlue
if let color = self.writeColorState.additional as? NSColor {
value = color
}
return value
}
public init() {
super.init(frame: NSRect(x: 0, y: 0, width: Constants.Popup.width, height: 30))
self.readColorState = Color.fromString(Store.shared.string(key: "\(Disk.name)_readColor", defaultValue: self.readColorState.key))
self.writeColorState = Color.fromString(Store.shared.string(key: "\(Disk.name)_writeColor", defaultValue: self.writeColorState.key))
self.orientation = .vertical
self.spacing = Constants.Popup.margins
}
@@ -71,6 +91,55 @@ internal class Popup: PopupWrapper {
}
}
}
// MARK: - Settings
public override func settings() -> NSView? {
let view = SettingsContainerView()
view.addArrangedSubview(selectSettingsRow(
title: localizedString("Color of write"),
action: #selector(toggleWriteColor),
items: Color.allColors,
selected: self.writeColorState.key
))
view.addArrangedSubview(selectSettingsRow(
title: localizedString("Color of read"),
action: #selector(toggleReadColor),
items: Color.allColors,
selected: self.readColorState.key
))
return view
}
@objc private func toggleWriteColor(_ sender: NSMenuItem) {
guard let key = sender.representedObject as? String,
let newValue = Color.allColors.first(where: { $0.key == key }) else {
return
}
self.writeColorState = newValue
Store.shared.set(key: "\(Disk.name)_writeColor", value: key)
if let color = newValue.additional as? NSColor {
for view in self.subviews.filter({ $0 is DiskView }).map({ $0 as! DiskView }) {
view.setChartColor(write: color)
}
}
}
@objc private func toggleReadColor(_ sender: NSMenuItem) {
guard let key = sender.representedObject as? String,
let newValue = Color.allColors.first(where: { $0.key == key }) else {
return
}
self.readColorState = newValue
Store.shared.set(key: "\(Disk.name)_readColor", value: key)
if let color = newValue.additional as? NSColor {
for view in self.subviews.filter({ $0 is DiskView }).map({ $0 as! DiskView }) {
view.setChartColor(read: color)
}
}
}
}
internal class DiskView: NSStackView {
@@ -133,6 +202,9 @@ internal class DiskView: NSStackView {
self.nameView.update(free: nil, read: read, write: write)
self.chartView.update(read: read, write: write)
}
public func setChartColor(read: NSColor? = nil, write: NSColor? = nil) {
self.chartView.setColors(read: read, write: write)
}
}
internal class NameView: NSStackView {
@@ -143,6 +215,13 @@ internal class NameView: NSStackView {
private var readState: NSView? = nil
private var writeState: NSView? = nil
private var readColor: NSColor {
Color.fromString(Store.shared.string(key: "\(Disk.name)_readColor", defaultValue: Color.secondBlue.key)).additional as! NSColor
}
private var writeColor: NSColor {
Color.fromString(Store.shared.string(key: "\(Disk.name)_writeColor", defaultValue: Color.secondRed.key)).additional as! NSColor
}
public init(width: CGFloat, name: String, size: Int64, free: Int64, path: URL?) {
self.size = size
self.uri = path
@@ -215,11 +294,11 @@ internal class NameView: NSStackView {
if (self.window?.isVisible ?? false) || !self.ready {
if let read = read {
self.readState?.toolTip = DiskSize(read).getReadableMemory()
self.readState?.layer?.backgroundColor = read != 0 ? NSColor.systemBlue.cgColor : NSColor.lightGray.withAlphaComponent(0.75).cgColor
self.readState?.layer?.backgroundColor = read != 0 ? self.readColor.cgColor : NSColor.lightGray.withAlphaComponent(0.75).cgColor
}
if let write = write {
self.writeState?.toolTip = DiskSize(write).getReadableMemory()
self.writeState?.layer?.backgroundColor = write != 0 ? NSColor.systemRed.cgColor : NSColor.lightGray.withAlphaComponent(0.75).cgColor
self.writeState?.layer?.backgroundColor = write != 0 ? self.writeColor.cgColor : NSColor.lightGray.withAlphaComponent(0.75).cgColor
}
self.ready = true
}
@@ -244,6 +323,13 @@ internal class ChartView: NSStackView {
private var chart: NetworkChartView? = nil
private var ready: Bool = false
private var readColor: NSColor {
Color.fromString(Store.shared.string(key: "\(Disk.name)_readColor", defaultValue: Color.secondBlue.key)).additional as! NSColor
}
private var writeColor: NSColor {
Color.fromString(Store.shared.string(key: "\(Disk.name)_writeColor", defaultValue: Color.secondRed.key)).additional as! NSColor
}
public init(width: CGFloat) {
super.init(frame: NSRect(x: 0, y: 0, width: width, height: 36))
@@ -255,7 +341,7 @@ internal class ChartView: NSStackView {
y: 1,
width: self.frame.width,
height: self.frame.height - 2
), num: 120)
), num: 120, outColor: self.writeColor, inColor: self.readColor)
self.chart = chart
self.addArrangedSubview(chart)
@@ -268,12 +354,16 @@ internal class ChartView: NSStackView {
fatalError("init(coder:) has not been implemented")
}
override func updateLayer() {
self.layer?.backgroundColor = self.isDarkMode ? NSColor.lightGray.withAlphaComponent(0.1).cgColor : NSColor.white.cgColor
}
public func update(read: Int64, write: Int64) {
self.chart?.addValue(upload: Double(write), download: Double(read))
}
override func updateLayer() {
self.layer?.backgroundColor = self.isDarkMode ? NSColor.lightGray.withAlphaComponent(0.1).cgColor : NSColor.white.cgColor
public func setColors(read: NSColor? = nil, write: NSColor? = nil) {
self.chart?.setColors(in: read, out: write)
}
}