ctlCandidate // Refactoring window position adjustment method.

This commit is contained in:
ShikiSuen 2022-09-09 09:45:43 +08:00
parent 9766bea1a0
commit 2fe7123a48
1 changed files with 15 additions and 36 deletions

View File

@ -154,47 +154,26 @@ public class ctlCandidate: NSWindowController, ctlCandidateProtocol {
} }
} }
func doSet(windowTopLeftPoint: NSPoint, bottomOutOfScreenAdjustmentHeight height: CGFloat) { func doSet(windowTopLeftPoint: NSPoint, bottomOutOfScreenAdjustmentHeight heightDelta: CGFloat) {
guard let window = window else { return }
let windowSize = window.frame.size
var adjustedPoint = windowTopLeftPoint var adjustedPoint = windowTopLeftPoint
var adjustedHeight = height var delta = heightDelta
var screenFrame = NSScreen.main?.visibleFrame ?? NSRect.zero var screenFrame = NSScreen.main?.visibleFrame ?? NSRect.zero
for screen in NSScreen.screens { for frame in NSScreen.screens.map(\.visibleFrame).filter({ !$0.contains(windowTopLeftPoint) }) {
let frame = screen.visibleFrame screenFrame = frame
if windowTopLeftPoint.x >= frame.minX, windowTopLeftPoint.x <= frame.maxX, break
windowTopLeftPoint.y >= frame.minY, windowTopLeftPoint.y <= frame.maxY
{
screenFrame = frame
break
}
} }
if adjustedHeight > screenFrame.size.height / 2.0 { if delta > screenFrame.size.height / 2.0 { delta = 0.0 }
adjustedHeight = 0.0
if adjustedPoint.y < screenFrame.minY + windowSize.height {
adjustedPoint.y = windowTopLeftPoint.y + windowSize.height + delta
} }
adjustedPoint.y = min(adjustedPoint.y, screenFrame.maxY - 1.0)
adjustedPoint.x = min(max(adjustedPoint.x, screenFrame.minX), screenFrame.maxX - windowSize.width - 1.0)
let windowSize = window?.frame.size ?? NSSize.zero window.setFrameTopLeftPoint(adjustedPoint)
// bottom beneath the screen?
if adjustedPoint.y - windowSize.height < screenFrame.minY {
adjustedPoint.y = windowTopLeftPoint.y + adjustedHeight + windowSize.height
}
// top over the screen?
if adjustedPoint.y >= screenFrame.maxY {
adjustedPoint.y = screenFrame.maxY - 1.0
}
// right
if adjustedPoint.x + windowSize.width >= screenFrame.maxX {
adjustedPoint.x = screenFrame.maxX - windowSize.width
}
// left
if adjustedPoint.x < screenFrame.minX {
adjustedPoint.x = screenFrame.minX
}
window?.setFrameTopLeftPoint(adjustedPoint)
} }
} }