mirror of
https://github.com/morgan9e/macos-stats
synced 2026-04-14 00:04:15 +09:00
fix: correct widget ordering after restart (return reader readyHandler) (#347)
This commit is contained in:
@@ -137,7 +137,6 @@ open class Module: Module_p {
|
||||
reader.initStoreValues(title: self.config.name, store: self.store)
|
||||
reader.start()
|
||||
}
|
||||
self.widgets.forEach{ $0.enable() }
|
||||
}
|
||||
|
||||
// disable module
|
||||
@@ -201,6 +200,14 @@ open class Module: Module_p {
|
||||
os_log(.debug, log: log, "Reader %s was added", "\(reader.self)")
|
||||
}
|
||||
|
||||
// handler for reader, calls when main reader is ready, and return first value
|
||||
public func readyHandler() {
|
||||
DispatchQueue.main.async(execute: {
|
||||
self.widgets.forEach{ $0.enable() }
|
||||
})
|
||||
os_log(.debug, log: log, "Reader report readiness")
|
||||
}
|
||||
|
||||
// replace a popup view
|
||||
public func replacePopup(_ view: Popup_p) {
|
||||
self.popup?.setIsVisible(false)
|
||||
|
||||
@@ -292,6 +292,12 @@ internal class WidgetPreview: NSStackView {
|
||||
self.orientation = .horizontal
|
||||
self.distribution = .fillProportionally
|
||||
self.spacing = 0
|
||||
self.edgeInsets = NSEdgeInsets(
|
||||
top: 0,
|
||||
left: Constants.Widget.spacing,
|
||||
bottom: 0,
|
||||
right: Constants.Widget.spacing
|
||||
)
|
||||
|
||||
let container: NSView = NSView(frame: NSRect(
|
||||
x: Constants.Widget.spacing,
|
||||
@@ -324,8 +330,9 @@ internal class WidgetPreview: NSStackView {
|
||||
userInfo: nil
|
||||
))
|
||||
|
||||
let additionalConstant: CGFloat = self.size + (Constants.Widget.spacing*3) + 1
|
||||
NSLayoutConstraint.activate([
|
||||
self.widthAnchor.constraint(equalTo: self.widget.pointee.preview.widthAnchor, constant: self.size),
|
||||
self.widthAnchor.constraint(equalTo: self.widget.pointee.preview.widthAnchor, constant: additionalConstant),
|
||||
self.heightAnchor.constraint(equalToConstant: self.size)
|
||||
])
|
||||
}
|
||||
|
||||
@@ -123,8 +123,6 @@ open class WidgetWrapper: NSView, widget_p {
|
||||
|
||||
public var widthHandler: ((CGFloat) -> Void)? = nil
|
||||
|
||||
private var widthHandlerRetry: Int8 = 0
|
||||
|
||||
public init(_ type: widget_t, title: String, frame: NSRect) {
|
||||
self.type = type
|
||||
self.title = title
|
||||
@@ -137,22 +135,12 @@ open class WidgetWrapper: NSView, widget_p {
|
||||
}
|
||||
|
||||
public func setWidth(_ width: CGFloat) {
|
||||
if self.frame.width == width || self.widthHandlerRetry >= 3 {
|
||||
return
|
||||
}
|
||||
|
||||
if self.widthHandler == nil {
|
||||
DispatchQueue.main.asyncAfter(deadline: .now() + .microseconds(10)) {
|
||||
self.setWidth(width)
|
||||
self.widthHandlerRetry += 1
|
||||
}
|
||||
if self.frame.width == width {
|
||||
return
|
||||
}
|
||||
|
||||
DispatchQueue.main.async {
|
||||
self.setFrameSize(NSSize(width: width, height: self.frame.size.height))
|
||||
self.invalidateIntrinsicContentSize()
|
||||
self.display()
|
||||
}
|
||||
|
||||
self.widthHandler?(width)
|
||||
@@ -188,7 +176,7 @@ public class Widget {
|
||||
}
|
||||
}
|
||||
|
||||
private var menuBarItem: NSStatusItem? = nil
|
||||
private var menuBarItem: NSStatusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.squareLength)
|
||||
private let log: OSLog
|
||||
|
||||
public init(_ type: widget_t, module: String, preview: widget_p, item: widget_p) {
|
||||
@@ -198,12 +186,20 @@ public class Widget {
|
||||
self.item = item
|
||||
self.log = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: self.module)
|
||||
|
||||
self.menuBarItem.length = self.isActive ? self.item.frame.width : 0
|
||||
self.menuBarItem.isVisible = self.isActive
|
||||
self.menuBarItem.autosaveName = "\(self.module)_\(self.type.name())"
|
||||
|
||||
self.item.widthHandler = { [weak self] value in
|
||||
if let s = self {
|
||||
s.menuBarItem?.length = value
|
||||
os_log(.debug, log: s.log, "Widget %s change width to %.2f", "\(s.type)", value)
|
||||
if let s = self, s.menuBarItem.length != value {
|
||||
s.menuBarItem.length = value
|
||||
os_log(.debug, log: s.log, "widget %s change width to %.2f", "\(s.type)", value)
|
||||
}
|
||||
}
|
||||
|
||||
self.menuBarItem.button?.target = self
|
||||
self.menuBarItem.button?.action = #selector(self.togglePopup)
|
||||
self.menuBarItem.button?.sendAction(on: [.leftMouseDown, .rightMouseDown])
|
||||
}
|
||||
|
||||
// show item in the menu bar
|
||||
@@ -212,27 +208,19 @@ public class Widget {
|
||||
return
|
||||
}
|
||||
|
||||
let item = NSStatusBar.system.statusItem(withLength: self.item.frame.width)
|
||||
item.autosaveName = "\(self.module)_\(self.type.name())"
|
||||
item.isVisible = true
|
||||
item.button?.target = self
|
||||
item.button?.action = #selector(self.togglePopup)
|
||||
item.button?.sendAction(on: [.leftMouseDown, .rightMouseDown])
|
||||
item.button?.addSubview(self.item)
|
||||
self.menuBarItem.length = self.item.frame.width
|
||||
self.menuBarItem.isVisible = true
|
||||
self.menuBarItem.button?.addSubview(self.item)
|
||||
|
||||
self.menuBarItem = item
|
||||
|
||||
os_log(.debug, log: log, "Widget %s enabled", self.type.rawValue)
|
||||
os_log(.debug, log: log, "widget %s enabled", self.type.rawValue)
|
||||
}
|
||||
|
||||
// remove item from the menu bar
|
||||
public func disable() {
|
||||
if let item = self.menuBarItem {
|
||||
item.length = 0
|
||||
item.isVisible = false
|
||||
|
||||
os_log(.debug, log: log, "Widget %s disabled", self.type.rawValue)
|
||||
}
|
||||
self.menuBarItem.length = 0
|
||||
self.menuBarItem.isVisible = false
|
||||
|
||||
os_log(.debug, log: log, "widget %s disabled", self.type.rawValue)
|
||||
}
|
||||
|
||||
// toggle the widget
|
||||
@@ -249,7 +237,7 @@ public class Widget {
|
||||
}
|
||||
|
||||
@objc private func togglePopup(_ sender: Any) {
|
||||
if let window = self.menuBarItem?.button?.window {
|
||||
if let window = self.menuBarItem.button?.window {
|
||||
NotificationCenter.default.post(name: .togglePopup, object: nil, userInfo: [
|
||||
"module": self.module,
|
||||
"origin": window.frame.origin,
|
||||
|
||||
@@ -79,6 +79,9 @@ public class Battery: Module {
|
||||
self.usageReader?.callbackHandler = { [unowned self] value in
|
||||
self.usageCallback(value)
|
||||
}
|
||||
self.usageReader?.readyCallback = { [unowned self] in
|
||||
self.readyHandler()
|
||||
}
|
||||
|
||||
self.processReader?.callbackHandler = { [unowned self] value in
|
||||
if let list = value {
|
||||
|
||||
@@ -81,6 +81,9 @@ public class CPU: Module {
|
||||
self.loadReader?.callbackHandler = { [unowned self] value in
|
||||
self.loadCallback(value)
|
||||
}
|
||||
self.loadReader?.readyCallback = { [unowned self] in
|
||||
self.readyHandler()
|
||||
}
|
||||
|
||||
self.processReader?.callbackHandler = { [unowned self] value in
|
||||
if let list = value {
|
||||
|
||||
@@ -108,6 +108,9 @@ public class Disk: Module {
|
||||
self.capacityReader?.callbackHandler = { [unowned self] value in
|
||||
self.capacityCallback(value)
|
||||
}
|
||||
self.capacityReader?.readyCallback = { [unowned self] in
|
||||
self.readyHandler()
|
||||
}
|
||||
|
||||
self.settingsView.selectedDiskHandler = { [unowned self] value in
|
||||
self.selectedDisk = value
|
||||
|
||||
@@ -68,6 +68,9 @@ public class Fans: Module {
|
||||
self.fansReader.callbackHandler = { [unowned self] value in
|
||||
self.usageCallback(value)
|
||||
}
|
||||
self.fansReader.readyCallback = { [unowned self] in
|
||||
self.readyHandler()
|
||||
}
|
||||
|
||||
self.addReader(self.fansReader)
|
||||
}
|
||||
|
||||
@@ -96,6 +96,9 @@ public class GPU: Module {
|
||||
self.infoReader?.callbackHandler = { [unowned self] value in
|
||||
self.infoCallback(value)
|
||||
}
|
||||
self.infoReader?.readyCallback = { [unowned self] in
|
||||
self.readyHandler()
|
||||
}
|
||||
|
||||
self.settingsView.selectedGPUHandler = { [unowned self] value in
|
||||
self.selectedGPU = value
|
||||
|
||||
@@ -98,6 +98,9 @@ public class Network: Module {
|
||||
self.usageReader?.callbackHandler = { [unowned self] value in
|
||||
self.usageCallback(value)
|
||||
}
|
||||
self.usageReader?.readyCallback = { [unowned self] in
|
||||
self.readyHandler()
|
||||
}
|
||||
|
||||
self.processReader?.callbackHandler = { [unowned self] value in
|
||||
if let list = value {
|
||||
|
||||
@@ -84,6 +84,9 @@ public class RAM: Module {
|
||||
self.usageReader?.callbackHandler = { [unowned self] value in
|
||||
self.loadCallback(value)
|
||||
}
|
||||
self.usageReader?.readyCallback = { [unowned self] in
|
||||
self.readyHandler()
|
||||
}
|
||||
|
||||
self.processReader?.callbackHandler = { [unowned self] value in
|
||||
if let list = value {
|
||||
|
||||
@@ -43,6 +43,9 @@ public class Sensors: Module {
|
||||
self.sensorsReader.callbackHandler = { [unowned self] value in
|
||||
self.usageCallback(value)
|
||||
}
|
||||
self.sensorsReader.readyCallback = { [unowned self] in
|
||||
self.readyHandler()
|
||||
}
|
||||
|
||||
self.addReader(self.sensorsReader)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user