fix: correct widget ordering after restart (return reader readyHandler) (#347)

This commit is contained in:
Serhiy Mytrovtsiy
2021-02-16 20:01:46 +01:00
parent f0e60cc942
commit 38e064d183
11 changed files with 62 additions and 36 deletions

View File

@@ -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)

View File

@@ -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)
])
}

View File

@@ -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,

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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

View File

@@ -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)
}

View File

@@ -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

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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)
}