Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 44c7d2b415 | |||
| 84579bccce | |||
| fc74b68d3f |
@@ -1,5 +1,70 @@
|
||||
# Menu
|
||||
|
||||
Fully customizible Mac OS drop-down menu
|
||||
Fully customizable Mac OS drop-down menu
|
||||
|
||||

|
||||
|
||||
## What can be customized? Everything!
|
||||
```swift
|
||||
public protocol Configuration {
|
||||
var titlePadding: Padding.Vertical { get }
|
||||
var titleFont: NSFont? { get }
|
||||
var backgroundColor: NSColor { get }
|
||||
var cornerRadius: CGFloat { get }
|
||||
var hasShadow: Bool { get }
|
||||
var contentEdgeInsets: NSEdgeInsets { get }
|
||||
var separatorColor: NSColor { get }
|
||||
var separatorThickness: CGFloat { get }
|
||||
var separatorHorizontalPadding: Padding.Horizontal { get }
|
||||
var separatorVerticlaPadding: Padding.Vertical { get }
|
||||
var rememberSelection: Bool { get }
|
||||
var textAlignment: Alignment { get }
|
||||
var iconAlignment: Alignment { get }
|
||||
var menuItemFont: NSFont? { get }
|
||||
var menuItemHeight: CGFloat { get }
|
||||
var menuItemHoverBackgroundColor: NSColor { get }
|
||||
var menuItemTextColor: NSColor { get }
|
||||
var menuItemHoverTextColor: NSColor { get }
|
||||
var menuItemCheckmarkColor: NSColor { get }
|
||||
var menuItemHoverCheckmarkColor: NSColor { get }
|
||||
var menuItemCheckmarkHeight: CGFloat { get }
|
||||
var menuItemCheckmarkThikness: CGFloat { get }
|
||||
var menuItemImageHeight: CGFloat? { get }
|
||||
var menuItemImageTintColor: NSColor? { get }
|
||||
var menuItemHoverImageTintColor: NSColor? { get }
|
||||
}
|
||||
|
||||
```
|
||||
## How to use
|
||||
|
||||
```swift
|
||||
import Cocoa
|
||||
import Menu
|
||||
|
||||
class ViewController: NSViewController {
|
||||
private let myMenu = Menu(with: "Select search engine:")
|
||||
|
||||
@IBAction func didClickedButton(_ sender: NSButton) {
|
||||
myMenu.show(items: [
|
||||
MenuItem("Bing search", image: NSImage(named: "icons8-bing-50"), action: {
|
||||
sender.title = "Bing"
|
||||
}),
|
||||
MenuItem("DuckDuckGo search", image: NSImage(named: "icons8-duckduckgo-50"), action: {
|
||||
sender.title = "DuckDuckGo"
|
||||
}),
|
||||
MenuItem("Google search", image: NSImage(named: "icons8-google-50"), action: {
|
||||
sender.title = "Google"
|
||||
}),
|
||||
MenuItem.separator(),
|
||||
MenuItem("Some very-very-very long text and no icon", action: {
|
||||
sender.title = "Some very long text"
|
||||
}),
|
||||
MenuItem.separator(),
|
||||
MenuItem("Exit", image: NSImage(named: "icons8-exit-50"), action: {
|
||||
NSApplication.shared.terminate(nil)
|
||||
})
|
||||
], view: sender)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||

|
||||
@@ -112,8 +112,9 @@ public final class Menu {
|
||||
|
||||
let presentationFrame = presentationWindow.convertToScreen(view.frame)
|
||||
let presentationPoint = presentationFrame.origin
|
||||
let additionalYOffset = configuration.appearsBelowSender ? 0 : NSHeight(view.frame)
|
||||
|
||||
let newFrame = NSRect(x: presentationPoint.x, y: presentationPoint.y - NSHeight(window.frame), width: NSWidth(view.frame), height: NSHeight(window.frame))
|
||||
let newFrame = NSRect(x: presentationPoint.x, y: presentationPoint.y - NSHeight(window.frame) + additionalYOffset, width: NSWidth(view.frame), height: NSHeight(window.frame))
|
||||
window.setFrame(newFrame, display: true, animate: false)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,13 +14,13 @@ public enum Alignment {
|
||||
|
||||
public enum Padding {
|
||||
public struct Horizontal {
|
||||
let left: CGFloat
|
||||
let right: CGFloat
|
||||
public let left: CGFloat
|
||||
public let right: CGFloat
|
||||
}
|
||||
|
||||
public struct Vertical {
|
||||
let top: CGFloat
|
||||
let bottom: CGFloat
|
||||
public let top: CGFloat
|
||||
public let bottom: CGFloat
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,6 +42,7 @@ public protocol Configuration {
|
||||
var backgroundColor: NSColor { get }
|
||||
var cornerRadius: CGFloat { get }
|
||||
var hasShadow: Bool { get }
|
||||
var appearsBelowSender: Bool { get }
|
||||
var contentEdgeInsets: NSEdgeInsets { get }
|
||||
var separatorColor: NSColor { get }
|
||||
var separatorThickness: CGFloat { get }
|
||||
@@ -87,6 +88,10 @@ open class MenuConfiguration: Configuration {
|
||||
return true
|
||||
}
|
||||
|
||||
open var appearsBelowSender: Bool {
|
||||
return true
|
||||
}
|
||||
|
||||
open var contentEdgeInsets: NSEdgeInsets {
|
||||
return NSEdgeInsets(top: .grid2, left: .grid2, bottom: .grid2, right: .grid2)
|
||||
}
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 315 KiB |
Reference in New Issue
Block a user