Files
prism/src/shared/windowResize.ts
T

76 lines
1.7 KiB
TypeScript

import type { WindowBounds } from '../types/popout'
import type { ResizeDirection } from '../types/windowResize'
interface Point {
x: number
y: number
}
interface ResizeWindowBoundsOptions {
edge: ResizeDirection
startBounds: WindowBounds
startCursor: Point
cursor: Point
minWidth: number
minHeight: number
}
export function calculateResizedWindowBounds({
edge,
startBounds,
startCursor,
cursor,
minWidth,
minHeight,
}: ResizeWindowBoundsOptions): WindowBounds {
const deltaX = Math.round(cursor.x - startCursor.x)
const deltaY = Math.round(cursor.y - startCursor.y)
let nextX = startBounds.x
let nextY = startBounds.y
let nextWidth = startBounds.width
let nextHeight = startBounds.height
if (edge.includes('e')) {
nextWidth = startBounds.width + deltaX
}
if (edge.includes('s')) {
nextHeight = startBounds.height + deltaY
}
if (edge.includes('w')) {
nextX = startBounds.x + deltaX
nextWidth = startBounds.width - deltaX
}
if (edge.includes('n')) {
nextY = startBounds.y + deltaY
nextHeight = startBounds.height - deltaY
}
const clampedMinWidth = Math.max(1, Math.round(minWidth))
const clampedMinHeight = Math.max(1, Math.round(minHeight))
if (nextWidth < clampedMinWidth) {
nextWidth = clampedMinWidth
if (edge.includes('w')) {
nextX = startBounds.x + startBounds.width - clampedMinWidth
}
}
if (nextHeight < clampedMinHeight) {
nextHeight = clampedMinHeight
if (edge.includes('n')) {
nextY = startBounds.y + startBounds.height - clampedMinHeight
}
}
return {
x: Math.round(nextX),
y: Math.round(nextY),
width: Math.round(nextWidth),
height: Math.round(nextHeight),
}
}