Add setPointAndSizeAdjustingForScreen for placing windows without (usually) going offscreen. Use it for positioning the Keyboard Shortcuts window. Fix #263.
This commit is contained in:
parent
d5a43ecaaf
commit
288f203bea
|
@ -308,13 +308,11 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserInterfaceValidations,
|
||||||
let htmlFile = Bundle(for: type(of: self)).path(forResource: "KeyboardShortcuts", ofType: "html")!
|
let htmlFile = Bundle(for: type(of: self)).path(forResource: "KeyboardShortcuts", ofType: "html")!
|
||||||
keyboardShortcutsWindowController?.displayContents(of: htmlFile)
|
keyboardShortcutsWindowController?.displayContents(of: htmlFile)
|
||||||
|
|
||||||
if let window = keyboardShortcutsWindowController?.window, let screen = window.screen {
|
if let window = keyboardShortcutsWindowController?.window {
|
||||||
let width: CGFloat = 620.0
|
let point = NSPoint(x: 128, y: 64)
|
||||||
let height: CGFloat = 1024.0
|
let size = NSSize(width: 620, height: 1000)
|
||||||
let insetX: CGFloat = 128.0
|
let minSize = NSSize(width: 400, height: 400)
|
||||||
let insetY: CGFloat = 64.0
|
window.setPointAndSizeAdjustingForScreen(point: point, size: size, minimumSize: minSize)
|
||||||
window.setContentSize(NSSize(width: width, height: height))
|
|
||||||
window.setFrameTopLeftPoint(NSPoint(x: insetX, y: screen.visibleFrame.maxY - insetY))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,4 +17,32 @@ public extension NSWindow {
|
||||||
}
|
}
|
||||||
makeFirstResponder(responder)
|
makeFirstResponder(responder)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public func setPointAndSizeAdjustingForScreen(point: NSPoint, size: NSSize, minimumSize: NSSize) {
|
||||||
|
|
||||||
|
// point.y specifices from the *top* of the screen, even though screen coordinates work from the bottom up. This is for convenience.
|
||||||
|
// The eventual size may be smaller than requested, since the screen may be small, but not smaller than minimumSize.
|
||||||
|
|
||||||
|
guard let screenFrame = screen?.visibleFrame else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let paddingFromScreenEdge: CGFloat = 8.0
|
||||||
|
let x = point.x
|
||||||
|
let y = screenFrame.maxY - point.y
|
||||||
|
|
||||||
|
var width = size.width
|
||||||
|
var height = size.height
|
||||||
|
|
||||||
|
if x + width > screenFrame.maxX {
|
||||||
|
width = max((screenFrame.maxX - x) - paddingFromScreenEdge, minimumSize.width)
|
||||||
|
}
|
||||||
|
if y - height < 0.0 {
|
||||||
|
height = max((screenFrame.maxY - point.y) - paddingFromScreenEdge, minimumSize.height)
|
||||||
|
}
|
||||||
|
|
||||||
|
let frame = NSRect(x: x, y: y, width: width, height: height)
|
||||||
|
setFrame(frame, display: true)
|
||||||
|
setFrameTopLeftPoint(frame.origin)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue