feat: added a Text widget to the RAM module

This commit is contained in:
Serhiy Mytrovtsiy
2024-11-06 18:43:12 +01:00
parent 9f2135f41a
commit 5c85827abd
5 changed files with 120 additions and 4 deletions

View File

@@ -12,12 +12,41 @@
import Cocoa
import Kit
internal class Settings: NSStackView, Settings_v {
var textWidgetHelp = """
<h2>Description</h2>
You can use a combination of any of the variables.
<h3>Examples:</h3>
<ul>
<li>$mem.used/$mem.total ($pressure.value)</li>
<li>Pressure: $pressure.value</li>
<li>Free: $mem.free</li>
</ul>
<h2>Available variables</h2>
<ul>
<li><b>$mem.total</b>: <small>Total RAM memory.</small></li>
<li><b>$mem.used</b>: <small>Used RAM memory.</small></li>
<li><b>$mem.free</b>: <small>Free RAM memory.</small></li>
<li><b>$mem.active</b>: <small>Active RAM memory.</small></li>
<li><b>$mem.inactive</b>: <small>Inactive RAM memory.</small></li>
<li><b>$mem.wired</b>: <small>Wired RAM memory.</small></li>
<li><b>$mem.compressed</b>: <small>Compressed RAM memory.</small></li>
<li><b>$mem.app</b>: <small>Used RAM memory by applications.</small></li>
<li><b>$mem.cache</b>: <small>Cached RAM memory.</small></li>
<li><b>$swap.total</b>: <small>Total swap memory.</small></li>
<li><b>$swap.used</b>: <small>Used swap memory.</small></li>
<li><b>$swap.free</b>: <small>Free swap memory.</small></li>
<li><b>$pressure.value</b>: <small>Pressure value (normal, warning, critical).</small></li>
<li><b>$pressure.level</b>: <small>Pressure level (1, 2, 4).</small></li>
</ul>
"""
internal class Settings: NSStackView, Settings_v, NSTextFieldDelegate {
private var updateIntervalValue: Int = 1
private var updateTopIntervalValue: Int = 1
private var numberOfProcesses: Int = 8
private var splitValueState: Bool = false
private var notificationLevel: String = "Disabled"
private var textValue: String = "$mem.used/$mem.total ($pressure.value)"
private let title: String
@@ -26,6 +55,8 @@ internal class Settings: NSStackView, Settings_v {
public var setInterval: ((_ value: Int) -> Void) = {_ in }
public var setTopInterval: ((_ value: Int) -> Void) = {_ in }
private let textWidgetHelpPanel: HelpHUD = HelpHUD(textWidgetHelp)
public init(_ module: ModuleType) {
self.title = module.rawValue
self.updateIntervalValue = Store.shared.int(key: "\(self.title)_updateInterval", defaultValue: self.updateIntervalValue)
@@ -77,6 +108,32 @@ internal class Settings: NSStackView, Settings_v {
))
]))
}
if widgets.contains(where: { $0 == .text }) {
let textField = self.inputField(id: "text", value: self.textValue, placeholder: localizedString("This will be visible in the text widget"))
self.addArrangedSubview(PreferencesSection([
PreferencesRow(localizedString("Text widget value"), component: textField) { [weak self] in
self?.textWidgetHelpPanel.show()
}
]))
}
}
private func inputField(id: String, value: String, placeholder: String) -> NSView {
let field: NSTextField = NSTextField()
field.identifier = NSUserInterfaceItemIdentifier(id)
field.widthAnchor.constraint(equalToConstant: 250).isActive = true
field.font = NSFont.systemFont(ofSize: 12, weight: .regular)
field.textColor = .textColor
field.isEditable = true
field.isSelectable = true
field.usesSingleLineMode = true
field.maximumNumberOfLines = 1
field.focusRingType = .none
field.stringValue = value
field.delegate = self
field.placeholderString = placeholder
return field
}
@objc private func changeUpdateInterval(_ sender: NSMenuItem) {
@@ -105,4 +162,13 @@ internal class Settings: NSStackView, Settings_v {
Store.shared.set(key: "\(self.title)_splitValue", value: self.splitValueState)
self.callback()
}
func controlTextDidChange(_ notification: Notification) {
if let field = notification.object as? NSTextField {
if field.identifier == NSUserInterfaceItemIdentifier("text") {
self.textValue = field.stringValue
Store.shared.set(key: "\(self.title)_textWidgetValue", value: self.textValue)
}
}
}
}