mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-04-21 00:48:36 +03:00
76 lines
2.8 KiB
Swift
76 lines
2.8 KiB
Swift
import Cocoa
|
|
|
|
// Custom NSToolbar subclass that displays a centered window title,
|
|
// in order to accommodate the titlebar tabs feature.
|
|
class TerminalToolbar: NSToolbar, NSToolbarDelegate {
|
|
static private let identifier = NSToolbarItem.Identifier("TitleText")
|
|
private let titleTextField = CenteredDynamicLabel(labelWithString: "👻 Ghostty")
|
|
|
|
var titleText: String {
|
|
get {
|
|
titleTextField.stringValue
|
|
}
|
|
|
|
set {
|
|
titleTextField.stringValue = newValue
|
|
}
|
|
}
|
|
|
|
override init(identifier: NSToolbar.Identifier) {
|
|
super.init(identifier: identifier)
|
|
|
|
delegate = self
|
|
|
|
if #available(macOS 13.0, *) {
|
|
centeredItemIdentifiers.insert(Self.identifier)
|
|
} else {
|
|
centeredItemIdentifier = Self.identifier
|
|
}
|
|
}
|
|
|
|
func toolbar(_ toolbar: NSToolbar,
|
|
itemForItemIdentifier itemIdentifier: NSToolbarItem.Identifier,
|
|
willBeInsertedIntoToolbar flag: Bool) -> NSToolbarItem? {
|
|
guard itemIdentifier == Self.identifier else { return nil }
|
|
|
|
let toolbarItem = NSToolbarItem(itemIdentifier: itemIdentifier)
|
|
toolbarItem.view = self.titleTextField
|
|
toolbarItem.visibilityPriority = .user
|
|
|
|
// NSToolbarItem.minSize and NSToolbarItem.maxSize are deprecated, and make big ugly
|
|
// warnings in Xcode when you use them, but I cannot for the life of me figure out
|
|
// how to get this to work with constraints. The behavior isn't the same, instead of
|
|
// shrinking the item and clipping the subview, it hides the item as soon as the
|
|
// intrinsic size of the subview gets too big for the toolbar width, regardless of
|
|
// whether I have constraints set on its width, height, or both :/
|
|
//
|
|
// If someone can fix this so we don't have to use deprecated properties: Please do.
|
|
toolbarItem.minSize = NSSize(width: 65, height: 1)
|
|
toolbarItem.maxSize = NSSize(width: 1024, height: self.titleTextField.intrinsicContentSize.height)
|
|
|
|
toolbarItem.isEnabled = true
|
|
|
|
return toolbarItem
|
|
}
|
|
|
|
func toolbarAllowedItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
|
|
return [Self.identifier]
|
|
}
|
|
|
|
func toolbarDefaultItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
|
|
return [Self.identifier]
|
|
}
|
|
}
|
|
|
|
class CenteredDynamicLabel: NSTextField {
|
|
override func viewDidMoveToSuperview() {
|
|
guard let superview = superview else { return }
|
|
widthAnchor.constraint(equalTo: superview.widthAnchor).isActive = true
|
|
centerXAnchor.constraint(equalTo: superview.centerXAnchor).isActive = true
|
|
|
|
alignment = .center
|
|
|
|
needsLayout = true
|
|
}
|
|
}
|