From 62f253ec3a7b5c3614f72e7bd18148cc57b557b9 Mon Sep 17 00:00:00 2001 From: Serhiy Mytrovtsiy Date: Thu, 29 Jul 2021 19:39:04 +0200 Subject: [PATCH] feat: add an option to select update interval for top processes to the RAM (#552) --- Modules/RAM/main.swift | 3 +++ Modules/RAM/readers.swift | 1 + Modules/RAM/settings.swift | 55 ++++++++++++++++++++++++++------------ 3 files changed, 42 insertions(+), 17 deletions(-) diff --git a/Modules/RAM/main.swift b/Modules/RAM/main.swift index 3a1470d2..29454788 100644 --- a/Modules/RAM/main.swift +++ b/Modules/RAM/main.swift @@ -68,6 +68,9 @@ public class RAM: Module { self.processReader?.read() self.usageReader?.setInterval(value) } + self.settingsView.setTopInterval = { [unowned self] value in + self.processReader?.setInterval(value) + } self.usageReader = UsageReader() self.processReader = ProcessReader() diff --git a/Modules/RAM/readers.swift b/Modules/RAM/readers.swift index ef1a35a3..a4d8cdc4 100644 --- a/Modules/RAM/readers.swift +++ b/Modules/RAM/readers.swift @@ -104,6 +104,7 @@ public class ProcessReader: Reader<[TopProcess]> { public override func setup() { self.popup = true + self.setInterval(Store.shared.int(key: "\(self.title)_updateTopInterval", defaultValue: 1)) } public override func read() { diff --git a/Modules/RAM/settings.swift b/Modules/RAM/settings.swift index 77cb6b07..3336f780 100644 --- a/Modules/RAM/settings.swift +++ b/Modules/RAM/settings.swift @@ -12,8 +12,9 @@ import Cocoa import Kit -internal class Settings: NSView, Settings_v { +internal class Settings: NSStackView, Settings_v { private var updateIntervalValue: Int = 1 + private var updateTopIntervalValue: Int = 1 private var numberOfProcesses: Int = 8 private let title: String @@ -21,21 +22,30 @@ internal class Settings: NSView, Settings_v { public var callback: (() -> Void) = {} public var callbackWhenUpdateNumberOfProcesses: (() -> Void) = {} public var setInterval: ((_ value: Int) -> Void) = {_ in } + public var setTopInterval: ((_ value: Int) -> Void) = {_ in } public init(_ title: String) { self.title = title self.updateIntervalValue = Store.shared.int(key: "\(self.title)_updateInterval", defaultValue: self.updateIntervalValue) + self.updateTopIntervalValue = Store.shared.int(key: "\(self.title)_updateTopInterval", defaultValue: self.updateTopIntervalValue) self.numberOfProcesses = Store.shared.int(key: "\(self.title)_processes", defaultValue: self.numberOfProcesses) - super.init(frame: CGRect( + super.init(frame: NSRect( x: 0, y: 0, width: Constants.Settings.width - (Constants.Settings.margin*2), height: 0 )) - self.wantsLayer = true - self.canDrawConcurrently = true + self.orientation = .vertical + self.distribution = .gravityAreas + self.edgeInsets = NSEdgeInsets( + top: Constants.Settings.margin, + left: Constants.Settings.margin, + bottom: Constants.Settings.margin, + right: Constants.Settings.margin + ) + self.spacing = Constants.Settings.margin } required init?(coder: NSCoder) { @@ -45,31 +55,34 @@ internal class Settings: NSView, Settings_v { public func load(widgets: [widget_t]) { self.subviews.forEach{ $0.removeFromSuperview() } - let rowHeight: CGFloat = 30 - let num: CGFloat = 1 - - self.addSubview(selectTitleRow( - frame: NSRect( - x: Constants.Settings.margin, - y: Constants.Settings.margin + (rowHeight + Constants.Settings.margin) * num, - width: self.frame.width - (Constants.Settings.margin*2), - height: rowHeight - ), + self.addArrangedSubview(selectTitleRow( + frame: NSRect(x: 0, y: 0, width: self.frame.width - (Constants.Settings.margin*2), height: Constants.Settings.row), title: localizedString("Update interval"), action: #selector(changeUpdateInterval), items: ReaderUpdateIntervals.map{ "\($0) sec" }, selected: "\(self.updateIntervalValue) sec" )) - self.addSubview(selectTitleRow( - frame: NSRect(x: Constants.Settings.margin, y: Constants.Settings.margin, width: self.frame.width - (Constants.Settings.margin*2), height: rowHeight), + self.addArrangedSubview(selectTitleRow( + frame: NSRect(x: 0, y: 0, width: self.frame.width - (Constants.Settings.margin*2), height: Constants.Settings.row), + title: localizedString("Update interval for top processes"), + action: #selector(changeUpdateTopInterval), + items: ReaderUpdateIntervals.map{ "\($0) sec" }, + selected: "\(self.updateTopIntervalValue) sec" + )) + + self.addArrangedSubview(selectTitleRow( + frame: NSRect(x: 0, y: 0, width: self.frame.width - (Constants.Settings.margin*2), height: Constants.Settings.row), title: localizedString("Number of top processes"), action: #selector(changeNumberOfProcesses), items: NumbersOfProcesses.map{ "\($0)" }, selected: "\(self.numberOfProcesses)" )) - self.setFrameSize(NSSize(width: self.frame.width, height: (rowHeight*(num+1)) + (Constants.Settings.margin*(2+num)))) + let h = self.arrangedSubviews.map({ $0.bounds.height + self.spacing }).reduce(0, +) - self.spacing + self.edgeInsets.top + self.edgeInsets.bottom + if self.frame.size.height != h { + self.setFrameSize(NSSize(width: self.bounds.width, height: h)) + } } @objc private func changeUpdateInterval(_ sender: NSMenuItem) { @@ -80,6 +93,14 @@ internal class Settings: NSView, Settings_v { } } + @objc private func changeUpdateTopInterval(_ sender: NSMenuItem) { + if let value = Int(sender.title.replacingOccurrences(of: " sec", with: "")) { + self.updateTopIntervalValue = value + Store.shared.set(key: "\(self.title)_updateTopInterval", value: value) + self.setTopInterval(value) + } + } + @objc private func changeNumberOfProcesses(_ sender: NSMenuItem) { if let value = Int(sender.title) { self.numberOfProcesses = value