77 lines
1.5 KiB
TypeScript
77 lines
1.5 KiB
TypeScript
import { Frames } from '../App';
|
|
|
|
export function zoomViewportIn(
|
|
viewport: Frames,
|
|
numFrames: number,
|
|
selection: Frames,
|
|
position: number,
|
|
factor: number
|
|
): Frames {
|
|
if (viewport.start == viewport.end) {
|
|
return viewport;
|
|
}
|
|
|
|
return zoom(
|
|
Math.round((viewport.end - viewport.start) / factor),
|
|
viewport,
|
|
numFrames,
|
|
selection,
|
|
position
|
|
);
|
|
}
|
|
|
|
export function zoomViewportOut(
|
|
viewport: Frames,
|
|
numFrames: number,
|
|
selection: Frames,
|
|
position: number,
|
|
factor: number
|
|
): Frames {
|
|
if (viewport.start == viewport.end) {
|
|
return viewport;
|
|
}
|
|
|
|
return zoom(
|
|
Math.round((viewport.end - viewport.start) * factor),
|
|
viewport,
|
|
numFrames,
|
|
selection,
|
|
position
|
|
);
|
|
}
|
|
|
|
function zoom(
|
|
newWidth: number,
|
|
viewport: Frames,
|
|
numFrames: number,
|
|
selection: Frames,
|
|
position: number
|
|
): Frames {
|
|
let newStart;
|
|
|
|
if (selection.start != selection.end) {
|
|
const selectionWidth = selection.end - selection.start;
|
|
|
|
// disallow zooming beyond the selection:
|
|
if (newWidth < selectionWidth) {
|
|
return viewport;
|
|
}
|
|
|
|
const selectionMidpoint = selection.end - selectionWidth / 2;
|
|
newStart = selectionMidpoint - Math.round(newWidth / 2);
|
|
} else {
|
|
newStart = position - newWidth / 2;
|
|
}
|
|
|
|
if (newStart < 0) {
|
|
newStart = 0;
|
|
}
|
|
let newEnd = newStart + newWidth;
|
|
if (newEnd > numFrames) {
|
|
newEnd = numFrames;
|
|
newStart = Math.max(0, newEnd - newWidth);
|
|
}
|
|
|
|
return { start: newStart, end: newEnd };
|
|
}
|