From 2fe7123a482654810571d945587d37320ceb2e61 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Fri, 9 Sep 2022 09:45:43 +0800 Subject: [PATCH] ctlCandidate // Refactoring window position adjustment method. --- .../UIModules/CandidateUI/ctlCandidate.swift | 51 ++++++------------- 1 file changed, 15 insertions(+), 36 deletions(-) diff --git a/Source/Modules/UIModules/CandidateUI/ctlCandidate.swift b/Source/Modules/UIModules/CandidateUI/ctlCandidate.swift index 1e09ff2d..1f32722a 100644 --- a/Source/Modules/UIModules/CandidateUI/ctlCandidate.swift +++ b/Source/Modules/UIModules/CandidateUI/ctlCandidate.swift @@ -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 adjustedHeight = height - + var delta = heightDelta var screenFrame = NSScreen.main?.visibleFrame ?? NSRect.zero - for screen in NSScreen.screens { - let frame = screen.visibleFrame - if windowTopLeftPoint.x >= frame.minX, windowTopLeftPoint.x <= frame.maxX, - windowTopLeftPoint.y >= frame.minY, windowTopLeftPoint.y <= frame.maxY - { - screenFrame = frame - break - } + for frame in NSScreen.screens.map(\.visibleFrame).filter({ !$0.contains(windowTopLeftPoint) }) { + screenFrame = frame + break } - if adjustedHeight > screenFrame.size.height / 2.0 { - adjustedHeight = 0.0 + if delta > screenFrame.size.height / 2.0 { delta = 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 - - // 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) + window.setFrameTopLeftPoint(adjustedPoint) } }