From bcb3acbc7f3f14300e42a2d2fec14693304f0676 Mon Sep 17 00:00:00 2001 From: FromTheLOLAshes Date: Thu, 28 Mar 2024 14:01:48 +0700 Subject: [PATCH] Adjust timeline sizing --- app/modules/LowerPanel/LowerPanel.tsx | 22 ++++---- app/modules/SidePanel/SidePanel.tsx | 10 +--- app/pages/PageEnigma/PageEnigmaComponent.tsx | 51 +++++++++-------- .../PageEnigma/comps/Timeline/Timeline.tsx | 8 +-- .../Timeline/utils/useMouseEventsHeight.ts | 56 +++++++++++++++++++ .../contexts/TrackContext/TrackContext.tsx | 6 ++ .../contexts/TrackContext/TrackProvider.tsx | 9 +++ 7 files changed, 117 insertions(+), 45 deletions(-) create mode 100644 app/pages/PageEnigma/comps/Timeline/utils/useMouseEventsHeight.ts diff --git a/app/modules/LowerPanel/LowerPanel.tsx b/app/modules/LowerPanel/LowerPanel.tsx index 669cf4b086..7984fed262 100644 --- a/app/modules/LowerPanel/LowerPanel.tsx +++ b/app/modules/LowerPanel/LowerPanel.tsx @@ -1,15 +1,17 @@ import React, { useCallback, useContext } from "react"; import { TrackContext } from "~/pages/PageEnigma/contexts/TrackContext/TrackContext"; +import { useMouseEventsHeight } from "~/pages/PageEnigma/comps/Timeline/utils/useMouseEventsHeight"; interface LowerPanelPropsI { - timelineHeight: number; children: React.ReactNode; } -export const LowerPanel = ({ children, timelineHeight }: LowerPanelPropsI) => { - // const [open, setOpen] = useState(false); - const { setOverTimeline, updateCurrentTime, scale } = +export const LowerPanel = ({ children }: LowerPanelPropsI) => { + const { setOverTimeline, updateCurrentTime, scale, timelineHeight } = useContext(TrackContext); + const { onPointerDown, height } = useMouseEventsHeight(); + + const displayHeight = height > -1 ? height : timelineHeight; const onTimelineClick = useCallback( (event: React.PointerEvent) => { @@ -20,25 +22,25 @@ export const LowerPanel = ({ children, timelineHeight }: LowerPanelPropsI) => { [updateCurrentTime, scale], ); - // const handleOpen = () => { - // setOpen(true); - // }; - return (
{ setOverTimeline(true); }} onPointerLeave={() => setOverTimeline(false)} onPointerDown={onTimelineClick} > +
{children}
); diff --git a/app/modules/SidePanel/SidePanel.tsx b/app/modules/SidePanel/SidePanel.tsx index 57ec64a81d..fbb07a8b56 100644 --- a/app/modules/SidePanel/SidePanel.tsx +++ b/app/modules/SidePanel/SidePanel.tsx @@ -1,5 +1,4 @@ import { useState } from "react"; -import { Tabs } from "../Tabs"; import { Transition } from "@headlessui/react"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { @@ -11,14 +10,14 @@ interface Props { children: React.ReactNode; } -export const SidePanel = ({children}:Props) => { +export const SidePanel = ({ children }: Props) => { const [isVisible, setIsVisible] = useState(true); return (
@@ -31,11 +30,8 @@ export const SidePanel = ({children}:Props) => { leaveFrom="translate-x-0" leaveTo="translate-x-full" > - - {children} - + {children}
- ); }; diff --git a/app/pages/PageEnigma/PageEnigmaComponent.tsx b/app/pages/PageEnigma/PageEnigmaComponent.tsx index fafb18591e..2119c352b2 100644 --- a/app/pages/PageEnigma/PageEnigmaComponent.tsx +++ b/app/pages/PageEnigma/PageEnigmaComponent.tsx @@ -1,4 +1,4 @@ -import { useEffect, useReducer } from "react"; +import { useContext, useEffect, useReducer } from "react"; import { faSparkles } from "@fortawesome/pro-solid-svg-icons"; @@ -17,39 +17,47 @@ import { AppUIProvider } from "./contexts/AppUiContext"; import { reducer, initialState, ACTION_TYPES } from "./reducer"; import { VIEW_MODES } from "./reducer/types"; import { ViewSideBySide } from "./comps/ViewSideBySide"; +import { TrackContext } from "~/pages/PageEnigma/contexts/TrackContext/TrackContext"; export const PageEnigmaComponent = () => { const [appUiState, dispatchAppUiState] = useReducer(reducer, initialState); - - useEffect(()=>{ - setTimeout(()=>dispatchAppUiState({ - type: ACTION_TYPES.HIDE_EDITOR_LOADER - }), 500); - },[]); + const { timelineHeight } = useContext(TrackContext); + + useEffect(() => { + setTimeout( + () => + dispatchAppUiState({ + type: ACTION_TYPES.HIDE_EDITOR_LOADER, + }), + 500, + ); + }, []); return (
- - + +
{/* Engine section/side panel */}
-
- +
+ {/* Top controls */}
@@ -65,19 +73,18 @@ export const PageEnigmaComponent = () => {
- { - appUiState.viewMode === VIEW_MODES.SIDE_BY_SIDE && + {appUiState.viewMode === VIEW_MODES.SIDE_BY_SIDE && ( - } + )}
- + {/* Side panel */} @@ -85,7 +92,7 @@ export const PageEnigmaComponent = () => {
{/* Timeline */} - +
diff --git a/app/pages/PageEnigma/comps/Timeline/Timeline.tsx b/app/pages/PageEnigma/comps/Timeline/Timeline.tsx index 2d9cef4408..73783a8b11 100644 --- a/app/pages/PageEnigma/comps/Timeline/Timeline.tsx +++ b/app/pages/PageEnigma/comps/Timeline/Timeline.tsx @@ -11,11 +11,7 @@ import { faSortDown } from "@fortawesome/pro-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { ConfirmationModal } from "~/components/ConfirmationModal"; -interface Props { - timelineHeight: number; -} - -export const Timeline = ({ timelineHeight }: Props) => { +export const Timeline = () => { const { characters, objects, @@ -69,7 +65,7 @@ export const Timeline = ({ timelineHeight }: Props) => { return ( <> - +
{ + const { timelineHeight, setTimelineHeight } = useContext(TrackContext); + const [isActive, setIsActive] = useState(false); + const [clientY, setClientY] = useState(0); + + const [height, setHeight] = useState(-1); + + useEffect(() => { + const onPointerUp = () => { + if (isActive) { + setTimelineHeight(height); + setIsActive(false); + setHeight(-1); + } + }; + + const onMouseMove = (event: MouseEvent) => { + if (isActive) { + const delta = event.clientY - clientY; + event.stopPropagation(); + event.preventDefault(); + if (timelineHeight - delta < 30) { + return; + } + setHeight(timelineHeight - delta); + return; + } + }; + + window.addEventListener("pointerup", onPointerUp); + window.addEventListener("pointermove", onMouseMove); + + return () => { + window.removeEventListener("pointerup", onPointerUp); + window.removeEventListener("pointermove", onMouseMove); + }; + }, [clientY, isActive, height, timelineHeight, setTimelineHeight]); + + return { + onPointerDown: useCallback( + (event: React.PointerEvent) => { + if (event.button === 0) { + event.stopPropagation(); + setClientY(event.clientY); + setIsActive(true); + setHeight(timelineHeight); + } + }, + [timelineHeight], + ), + height, + }; +}; diff --git a/app/pages/PageEnigma/contexts/TrackContext/TrackContext.tsx b/app/pages/PageEnigma/contexts/TrackContext/TrackContext.tsx index 9fddae7aa2..5f5a037a72 100644 --- a/app/pages/PageEnigma/contexts/TrackContext/TrackContext.tsx +++ b/app/pages/PageEnigma/contexts/TrackContext/TrackContext.tsx @@ -102,6 +102,10 @@ export const TrackContext = createContext<{ // total length of the film clip length: number; + // height of the timeline section + timelineHeight: number; + setTimelineHeight: (height: number) => void; + // computed width length * 60 * 4 * scale fullWidth: number; }>({ @@ -154,4 +158,6 @@ export const TrackContext = createContext<{ updateCurrentTime: () => {}, length: 12, fullWidth: 0, + timelineHeight: 0, + setTimelineHeight: () => {}, }); diff --git a/app/pages/PageEnigma/contexts/TrackContext/TrackProvider.tsx b/app/pages/PageEnigma/contexts/TrackContext/TrackProvider.tsx index 4ef71835e5..a61164aa5a 100644 --- a/app/pages/PageEnigma/contexts/TrackContext/TrackProvider.tsx +++ b/app/pages/PageEnigma/contexts/TrackContext/TrackProvider.tsx @@ -39,6 +39,12 @@ export const TrackProvider = ({ children }: Props) => { }); }, []); + const [timelineHeight, setTimelineHeight] = useState(0); + useEffect(() => { + const windowHeight = window.outerHeight; + setTimelineHeight(windowHeight * 0.25); + }, []); + // cross group functions const dropClip = useCallback(() => { const { canDrop, dragType, dropId, dragId, dropOffset } = dragDrop; @@ -94,6 +100,8 @@ export const TrackProvider = ({ children }: Props) => { updateCurrentTime, length, fullWidth, + timelineHeight, + setTimelineHeight, }; }, [ characters, @@ -115,6 +123,7 @@ export const TrackProvider = ({ children }: Props) => { fullWidth, length, scale, + timelineHeight, ]); return ( {children}