Enable showing the popover without taking application focus and keeping the popover visible without disabling right click

This commit is contained in:
Islam Sharabash 2021-05-13 12:32:14 -07:00
parent b30566900b
commit dee3296f9e
2 changed files with 18 additions and 12 deletions

View File

@ -12,11 +12,7 @@ public class Popover: NSObject {
return popoverWindowController?.window
}
public var keepPopoverVisible: Bool = false {
didSet {
keepPopoverVisible ? removeMonitors() : setupMonitors()
}
}
public var keepPopoverVisible: Bool = false
@objc dynamic var item: NSStatusItem! {
didSet {
@ -90,10 +86,14 @@ public class Popover: NSObject {
localEventMonitor?.start()
}
/// Shows the Popover with no animation
public func show() {
self.show(withFocus: true)
}
/// Shows the Popover with no animation
public func show(withFocus: Bool) {
guard !isPopoverWindowVisible else { return }
popoverWindowController?.show()
popoverWindowController?.show(withFocus: withFocus)
globalEventMonitor?.start()
guard let button = item.button else { return }
@ -117,7 +117,9 @@ public class Popover: NSObject {
private func setupMonitors() {
globalEventMonitor = EventMonitor(monitorType: .global, mask: [.leftMouseDown, .rightMouseDown], globalHandler: { [weak self] _ in
guard let self = self else { return }
self.dismiss()
if (!self.keepPopoverVisible) {
self.dismiss()
}
}, localHandler: nil)
if menuItems != nil, menuItems?.isNotEmpty ?? false {
@ -167,7 +169,7 @@ public class Popover: NSObject {
}
@objc private func handleStatusItemButtonAction(_ sender: Any?) {
isPopoverWindowVisible ? dismiss() : show()
isPopoverWindowVisible ? dismiss() : show(withFocus: true)
}
private func setTargetAction(for button: NSButton) {

View File

@ -28,14 +28,18 @@ class PopoverWindowController: NSWindowController, NSWindowDelegate {
fatalError("init(coder:) has not been implemented")
}
func show() {
func show(withFocus: Bool) {
guard !isAnimating else { return }
updateWindowFrame()
showWindow(nil)
if (withFocus) {
showWindow(nil)
window?.makeKey()
} else {
window?.orderFrontRegardless()
}
windowIsOpen = true
window?.makeKey()
// TODO: animation
}