diff --git a/ModuleKit/module.swift b/ModuleKit/module.swift index 8c417630..c990cb36 100644 --- a/ModuleKit/module.swift +++ b/ModuleKit/module.swift @@ -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) diff --git a/ModuleKit/settings.swift b/ModuleKit/settings.swift index 3f85fb3e..43c9e1f3 100644 --- a/ModuleKit/settings.swift +++ b/ModuleKit/settings.swift @@ -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) ]) } diff --git a/ModuleKit/widget.swift b/ModuleKit/widget.swift index 64cc90aa..f635b272 100644 --- a/ModuleKit/widget.swift +++ b/ModuleKit/widget.swift @@ -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, diff --git a/Modules/Battery/main.swift b/Modules/Battery/main.swift index 255acbba..9e5f1662 100644 --- a/Modules/Battery/main.swift +++ b/Modules/Battery/main.swift @@ -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 { diff --git a/Modules/CPU/main.swift b/Modules/CPU/main.swift index 4f104aee..850fa751 100644 --- a/Modules/CPU/main.swift +++ b/Modules/CPU/main.swift @@ -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 { diff --git a/Modules/Disk/main.swift b/Modules/Disk/main.swift index bde0ae99..66180107 100644 --- a/Modules/Disk/main.swift +++ b/Modules/Disk/main.swift @@ -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 diff --git a/Modules/Fans/main.swift b/Modules/Fans/main.swift index 66d40e31..30d74caf 100644 --- a/Modules/Fans/main.swift +++ b/Modules/Fans/main.swift @@ -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) } diff --git a/Modules/GPU/main.swift b/Modules/GPU/main.swift index f9364a59..85005a18 100644 --- a/Modules/GPU/main.swift +++ b/Modules/GPU/main.swift @@ -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 diff --git a/Modules/Net/main.swift b/Modules/Net/main.swift index c78ec24a..87bf9c87 100644 --- a/Modules/Net/main.swift +++ b/Modules/Net/main.swift @@ -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 { diff --git a/Modules/RAM/main.swift b/Modules/RAM/main.swift index 73de5d97..828752c0 100644 --- a/Modules/RAM/main.swift +++ b/Modules/RAM/main.swift @@ -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 { diff --git a/Modules/Sensors/main.swift b/Modules/Sensors/main.swift index 4ec7bc71..174a1292 100644 --- a/Modules/Sensors/main.swift +++ b/Modules/Sensors/main.swift @@ -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) }