• Stars
    star
    124
  • Rank 288,207 (Top 6 %)
  • Language
    Swift
  • License
    MIT License
  • Created over 4 years ago
  • Updated about 3 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Custom macOS Popover ๐Ÿ’ฌ

Popover

Swift macOS License: MIT

Custom macOS popover.

alt text

Install

Since this is a Swift Package, the installation process is pretty stright forward.

Manual way

Update your Package.swift dependencies:

dependencies: [
    .package(url: "https://github.com/iSapozhnik/Popover", from: "1.1.1")
]

Via Xcode:

  1. Go to File -> Swift Packages -> Add Package Dependency.
  2. Put GitHub URL https://github.com/iSapozhnik/Popover and click Next
  3. Select the latest version
  4. Click Finish

How to use

  1. In your AppDelegate import Popover
  2. Create a view you want to put into a status bar.
  3. Create a content view controller which would be embedded inside Popover
  4. Optionally create menu items
  5. Create a Popover instance. Here you can use either standard configuration (you don't need to pass windowConfiguration parameter in this case) or you can subclass DefaultConfiguration, override some properties and pass a new instance as a parameter. If in step 4 you have created menu items, pass it here as well. You can see them by making right click on menu bar item.
  6. Call prepare to set everything up.

And here is how typical AppDelegate may look like:

import Cocoa
import Popover

class MyPopoverConfiguration: DefaultConfiguration {
    override var backgroundColor: NSColor {
        return NSColor.systemRed
    }

    override var borderColor: NSColor? {
        return NSColor.red
    }
}

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
    var popover: Popover!

    func applicationDidFinishLaunching(_ aNotification: Notification) {
        let statusItemView = StatusItemView(frame: NSRect(width: 22.0, height: 20))

        let viewController = MainViewController()

        let menuItems: [Popover.MenuItemType] = [
            .item(Popover.MenuItem(title: "Settings", action: viewController.showSettings)),
            .separator,
            .item(Popover.MenuItem(title: "Quit", key: "q", action: viewController.quit))
        ]

        popover = Popover(with: MyPopoverConfiguration(), menuItems: menuItems)
        popover.prepare(with: statusItemView, contentViewController: viewController)
    }
}

What can be customized?

Quite a lot of things:

public protocol PopoverConfiguration {
    /// The distance from Popover's arrow to a status item.
    var popoverToStatusItemMargin:  CGFloat { get }

    /// Popover's background color.
    var backgroundColor:            NSColor { get }

    /// Popover's border color.
    /// - Important:
    ///     If `borderColor` returns `nil`, settings `borderWidth` won't make any effect. See also: `borderWidth`.
    var borderColor:                NSColor? { get }

    /// Popover's border width.
    /// - Important:
    ///      If Popover's border color is set to `nil`, setting `borderWidth` won't make any effect.
    var borderWidth:                CGFloat { get }

    /// Defines Popover arrow height.
    var arrowHeight:                CGFloat { get }

    /// Defines Popover arrow width.
    var arrowWidth:                 CGFloat { get }

    /// Defines Popover corner radius.
    /// - Warning:
    ///     If this value is too big and if the Popover's status item (menu bar view) is too close to the right edge, the appearence of the Popover might be odd.
    var cornerRadius:               CGFloat { get }

    /// Defines Popover content edge insets.
    var contentEdgeInsets:          NSEdgeInsets { get }

    /// The distance from the right side of the Popover to the screen's edge.
    /// - Warning:
    ///     If this value is too big and if the Popover's status item (menu bar view) is too close to the right edge, the appearence of the Popover might be odd.
    var rightEdgeMargin:            CGFloat { get }
}

Mentions

Credits

Created and maintained by @iSapozhnik.

License

Released under the MIT License. See LICENSE for details.

Copyright ยฉ 2020-present Sapozhnik Ivan.

Heavily inspired by CCNStatusItem

More Repositories

1

Haptico

Haptico ๐Ÿ“ณ - easy to use haptic feedback generator with pattern-play support
Swift
485
star
2

NavigationMenu

[DEPRECATED] Objective-C component that adds menu to the navigation bar
Objective-C
261
star
3

Menu

The most customizable menu for macOS apps.
Swift
117
star
4

SegmentedProgressView

๐Ÿ”˜๐Ÿ”˜๐Ÿ”˜โšช๏ธโšช๏ธ Simple Instagram-like segmented progress view with completion handler and different time interval for each segment
Swift
93
star
5

Snackbar

A Snackbar for macOS applications
Swift
13
star
6

SoundPlayer

๐Ÿ”ŠSuper simple, low-latency sound player.
Swift
4
star
7

StatesController

UIViewController which implements switching states: Loading, No Data, Error and Content
Swift
4
star
8

LaRevenueCat

LaMetric dashboard for RevenueCat
Swift
3
star
9

Anchor

Swift
3
star
10

CopyIt

Showing Copy menu for each and every view in your app โœ‚๏ธ
Swift
2
star
11

LoadingViewController

View controller which supports changing of it's content with predefined views: ContentView, LoadingView, ErrorView, NoDataView
Swift
2
star
12

ThumbnailsGenerator

Swift
2
star
13

Lasso

Intuitive and native Window Manager for Mac
2
star
14

InstagramStoryTransition

Swift
1
star
15

Widgy

1
star
16

CleanSwiftXCodeTemplates

Makefile
1
star
17

EventMonitor

Swift
1
star
18

AquaSmartGUI

C
1
star
19

Menu-Example

Example app for custom Mac OS Menu
Swift
1
star
20

SlidingButton

Swift
1
star
21

ViewPushBack

UIView push back
Objective-C
1
star
22

FamilyPocket-iOS

Simple app for family budget tracking ๐Ÿ’ฐ
Swift
1
star
23

Altum

1
star
24

ShakeDetector

๐ŸŒ‹ A lightweight and customizable mouse shake detection library for macOS applications.
Swift
1
star
25

simctrl

Swift package which implements simctl functionality
Swift
1
star