Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
846a5b702a | ||
|
|
7f3a81e0e2 | ||
|
|
b08ed8e3a8 |
@@ -1,6 +1,6 @@
|
||||
//
|
||||
// File.swift
|
||||
//
|
||||
// EventMonitor.swift
|
||||
// Popover
|
||||
//
|
||||
// Created by Ivan Sapozhnik on 03.04.20.
|
||||
//
|
||||
|
||||
@@ -3,13 +3,12 @@
|
||||
// Popover
|
||||
//
|
||||
// Created by Ivan Sapozhnik on 29.03.20.
|
||||
// Copyright © 2020 heavylightapps. All rights reserved.
|
||||
//
|
||||
|
||||
import Cocoa
|
||||
|
||||
public class Popover: NSObject {
|
||||
public var item: NSStatusItem!
|
||||
var item: NSStatusItem!
|
||||
|
||||
private let windowConfiguration: PopoverConfiguration
|
||||
private var popoverWindowController: PopoverWindowController?
|
||||
@@ -20,6 +19,8 @@ public class Popover: NSObject {
|
||||
return (popoverWindowController != nil) ? popoverWindowController!.windowIsOpen : false
|
||||
}
|
||||
|
||||
/// Create a Popover with given PopoverConfiguration. Popover configuration can be either `DefaultConfiguration` or you can sublclass this class and override some of the properties.
|
||||
/// By default Popover is using Event Monitor and by doing left or right clicl ouside of the Popover's frame, the system will automatically dismiss the Popover.
|
||||
public init(with configuration: PopoverConfiguration) {
|
||||
windowConfiguration = configuration
|
||||
|
||||
@@ -27,26 +28,32 @@ public class Popover: NSObject {
|
||||
|
||||
eventMonitor = EventMonitor(mask: [.rightMouseDown, .leftMouseDown], handler: { [weak self] event in
|
||||
guard let self = self else { return }
|
||||
self.dismissPopoverWindow()
|
||||
self.dismiss()
|
||||
})
|
||||
}
|
||||
|
||||
public func presentPopover(with image: NSImage, contentViewController viewController: NSViewController) {
|
||||
/// Creates a Popover with given image and contentViewController
|
||||
/// By default it won't present any Popover until the user clicks on status bar item
|
||||
public func createPopover(with image: NSImage, contentViewController viewController: NSViewController) {
|
||||
configureStatusBarButton(with: image)
|
||||
popoverWindowController = PopoverWindowController(with: self, contentViewController: viewController, windowConfiguration: windowConfiguration)
|
||||
}
|
||||
|
||||
public func presentPopover(with view: NSView, contentViewController viewController: NSViewController) {
|
||||
/// Creates a Popover with given view and contentViewController. The view's height will be scaled down to 18pt and also will be vertically aligned. The wdith can be any.
|
||||
/// By default it won't present any Popover until the user clicks on status bar item
|
||||
public func createPopover(with view: NSView, contentViewController viewController: NSViewController) {
|
||||
configureStatusBarButton(with: view)
|
||||
popoverWindowController = PopoverWindowController(with: self, contentViewController: viewController, windowConfiguration: windowConfiguration)
|
||||
}
|
||||
|
||||
public func showPopoverWindow() {
|
||||
/// Shows the Popover with no animation
|
||||
public func show() {
|
||||
popoverWindowController?.show()
|
||||
eventMonitor?.start()
|
||||
}
|
||||
|
||||
public func dismissPopoverWindow() {
|
||||
/// Dismisses the Popover with default animation. Animation behaviour is `AnimationBehavior.utilityWindow`
|
||||
public func dismiss() {
|
||||
popoverWindowController?.dismiss()
|
||||
eventMonitor?.stop()
|
||||
}
|
||||
@@ -79,9 +86,9 @@ public class Popover: NSObject {
|
||||
|
||||
@objc private func handleStatusItemButtonAction(_ sender: Any?) {
|
||||
if isPopoverWindowVisible {
|
||||
dismissPopoverWindow()
|
||||
dismiss()
|
||||
} else {
|
||||
showPopoverWindow()
|
||||
show()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
// Popover
|
||||
//
|
||||
// Created by Ivan Sapozhnik on 29.03.20.
|
||||
// Copyright © 2020 heavylightapps. All rights reserved.
|
||||
//
|
||||
|
||||
import Cocoa
|
||||
|
||||
@@ -3,17 +3,29 @@
|
||||
// Popover
|
||||
//
|
||||
// Created by Ivan Sapozhnik on 29.03.20.
|
||||
// Copyright © 2020 heavylightapps. All rights reserved.
|
||||
//
|
||||
|
||||
import Cocoa
|
||||
|
||||
public class PopoverWindow: NSPanel {
|
||||
class PopoverWindow: NSPanel {
|
||||
private let wConfig: PopoverConfiguration
|
||||
private var childContentView: NSView?
|
||||
private var backgroundView: PopoverWindowBackgroundView?
|
||||
|
||||
public static func window(with configuration: PopoverConfiguration) -> PopoverWindow {
|
||||
private init(contentRect: NSRect, styleMask style: NSWindow.StyleMask, backing backingStoreType: NSWindow.BackingStoreType, defer flag: Bool, configuration: PopoverConfiguration) {
|
||||
wConfig = configuration
|
||||
super.init(contentRect: contentRect, styleMask: style, backing: backingStoreType, defer: flag)
|
||||
|
||||
isOpaque = false
|
||||
hasShadow = true
|
||||
level = .statusBar
|
||||
animationBehavior = .utilityWindow
|
||||
backgroundColor = .clear
|
||||
collectionBehavior = [.canJoinAllSpaces, .ignoresCycle]
|
||||
appearance = NSAppearance.current
|
||||
}
|
||||
|
||||
static func window(with configuration: PopoverConfiguration) -> PopoverWindow {
|
||||
let window = PopoverWindow.init(
|
||||
contentRect: .zero,
|
||||
styleMask: .nonactivatingPanel,
|
||||
@@ -25,11 +37,11 @@ public class PopoverWindow: NSPanel {
|
||||
return window
|
||||
}
|
||||
|
||||
public override var canBecomeKey: Bool {
|
||||
override var canBecomeKey: Bool {
|
||||
return true
|
||||
}
|
||||
|
||||
public override var contentView: NSView? {
|
||||
override var contentView: NSView? {
|
||||
set {
|
||||
guard childContentView != newValue, let bounds = newValue?.bounds else { return }
|
||||
|
||||
@@ -75,20 +87,7 @@ public class PopoverWindow: NSPanel {
|
||||
}
|
||||
}
|
||||
|
||||
public override func frameRect(forContentRect contentRect: NSRect) -> NSRect {
|
||||
override func frameRect(forContentRect contentRect: NSRect) -> NSRect {
|
||||
NSMakeRect(NSMinX(contentRect), NSMinY(contentRect), NSWidth(contentRect), NSHeight(contentRect) + wConfig.arrowHeight)
|
||||
}
|
||||
|
||||
private init(contentRect: NSRect, styleMask style: NSWindow.StyleMask, backing backingStoreType: NSWindow.BackingStoreType, defer flag: Bool, configuration: PopoverConfiguration) {
|
||||
wConfig = configuration
|
||||
super.init(contentRect: contentRect, styleMask: style, backing: backingStoreType, defer: flag)
|
||||
|
||||
isOpaque = false
|
||||
hasShadow = true
|
||||
level = .statusBar
|
||||
animationBehavior = .utilityWindow
|
||||
backgroundColor = .clear
|
||||
collectionBehavior = [.canJoinAllSpaces, .ignoresCycle]
|
||||
appearance = NSAppearance.current
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
// Popover
|
||||
//
|
||||
// Created by Ivan Sapozhnik on 29.03.20.
|
||||
// Copyright © 2020 heavylightapps. All rights reserved.
|
||||
//
|
||||
|
||||
import Cocoa
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
// Popover
|
||||
//
|
||||
// Created by Ivan Sapozhnik on 29.03.20.
|
||||
// Copyright © 2020 heavylightapps. All rights reserved.
|
||||
//
|
||||
|
||||
import Cocoa
|
||||
@@ -27,7 +26,7 @@ class PopoverWindowController: NSWindowController {
|
||||
fatalError("init(coder:) has not been implemented")
|
||||
}
|
||||
|
||||
public func show() {
|
||||
func show() {
|
||||
guard !isAnimating else { return }
|
||||
|
||||
updateWindowFrame()
|
||||
@@ -38,7 +37,7 @@ class PopoverWindowController: NSWindowController {
|
||||
// TODO: animation
|
||||
}
|
||||
|
||||
public func dismiss() {
|
||||
func dismiss() {
|
||||
guard !isAnimating else { return }
|
||||
|
||||
window?.orderOut(self)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//
|
||||
// File.swift
|
||||
//
|
||||
// StatusItemContainerView.swift
|
||||
// Popover
|
||||
//
|
||||
// Created by Ivan Sapozhnik on 03.04.20.
|
||||
//
|
||||
|
||||
Reference in New Issue
Block a user