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 };
|
||
|
}
|