From 9604fdf8302a1510840470004dc315b63a7522ea Mon Sep 17 00:00:00 2001 From: lonkaars Date: Sun, 16 May 2021 19:51:17 +0200 Subject: timeline divisions --- pages/editor.tsx | 106 ++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 74 insertions(+), 32 deletions(-) (limited to 'pages') diff --git a/pages/editor.tsx b/pages/editor.tsx index 01cd989..36a4c66 100644 --- a/pages/editor.tsx +++ b/pages/editor.tsx @@ -25,44 +25,86 @@ import { mdiCursorDefault } from '@mdi/js'; function TimelineEditor(props: { player: TimedVideoPlayer; }) { - var frames = [...new Array(props.player.timeline?.framecount || 0)].map((el, i) => -
-
- - {props.player?.frameToTimestampString(i + 1)} - + var keyframes = props.player?.timeline?.slides.map(slide => +
- {(() => { - var slide = props.player?.timeline?.slides.find(slide => slide.frame == i + 1); - if (slide) { - if (slide.type == 'loop') { - return ; - } else { - return ; - } - } - })()} + {slide.type == 'loop' + ? + : }
); + useEffect(() => { + var canvas = document.getElementById('timeScaleCanvas') as HTMLCanvasElement; + var ctx = canvas.getContext('2d'); + + var mouseX = 0; + var mouseY = 0; + + window.addEventListener('mousemove', e => { + var rect = canvas.getBoundingClientRect(); + mouseX = e.clientX - rect.x; + mouseY = e.clientY - rect.y; + }); + + var css = (varname: string) => getComputedStyle(document.body).getPropertyValue(varname).trim(); + var textColor = css('--c100'); + var lineColor = css('--c300'); + + function draw() { + ctx.clearRect(0, 0, canvas.width, canvas.height); + + var offset = document.querySelector('.timeline .timelineInner').scrollLeft; + + var d = true; + var frameWidth = Number( + getComputedStyle(document.querySelector('.timeline')).getPropertyValue('--zoom').trim(), + ); + var a = 1; + var ns = [300, 150, 120, 90, 60, 30, 30, 30, 15, 15, 15, 15, 15]; + var everyN = ns[Math.floor(frameWidth)]; + for (var x = -offset; x < canvas.width + offset; x += frameWidth) { + ctx.fillStyle = d ? textColor : lineColor; + if (a % everyN == 0) ctx.fillStyle = '#ff00ff'; + ctx.fillRect(x, 0, frameWidth, canvas.height); + d = !d; + a++; + } + + requestAnimationFrame(draw); + } + draw(); + + function onresize() { + var size = document.querySelector('.timeline .timelineInner .keyframes'); + canvas.width = size.clientWidth; + canvas.height = size.clientHeight; + } + onresize(); + window.addEventListener('resize', onresize); + }, []); + return <> -
- - - -
-
+ +
+
+ + + +
+
+
+
{keyframes}
-
{frames}
; } @@ -71,7 +113,7 @@ export default function Index() { var rerender = () => setDummy(!dummy); var [player, setPlayer] = useState(new TimedVideoPlayer()); - var [timelineZoom, setTimelineZoom] = useState(4); + var [timelineZoom, setTimelineZoom] = useState(0.2); useEffect(() => { var videoEL = document.getElementById('player') as HTMLVideoElement; -- cgit v1.2.3