mirror of
https://github.com/OpenCut-app/OpenCut.git
synced 2026-07-13 21:52:53 +02:00
feat: scenes button to timeline toolbar
This commit is contained in:
@@ -25,7 +25,14 @@ import {
|
|||||||
ArrowRightToLine,
|
ArrowRightToLine,
|
||||||
SplitSquareHorizontal,
|
SplitSquareHorizontal,
|
||||||
Scissors,
|
Scissors,
|
||||||
|
LayersIcon,
|
||||||
} from "lucide-react";
|
} from "lucide-react";
|
||||||
|
import {
|
||||||
|
SplitButton,
|
||||||
|
SplitButtonLeft,
|
||||||
|
SplitButtonRight,
|
||||||
|
SplitButtonSeparator,
|
||||||
|
} from "@/components/ui/split-button";
|
||||||
import { Slider } from "@/components/ui/slider";
|
import { Slider } from "@/components/ui/slider";
|
||||||
import { DEFAULT_FPS } from "@/stores/project-store";
|
import { DEFAULT_FPS } from "@/stores/project-store";
|
||||||
import { formatTimeCode } from "@/lib/time";
|
import { formatTimeCode } from "@/lib/time";
|
||||||
@@ -192,16 +199,12 @@ export function TimelineToolbar({
|
|||||||
|
|
||||||
const currentBookmarked = isBookmarked(currentTime);
|
const currentBookmarked = isBookmarked(currentTime);
|
||||||
return (
|
return (
|
||||||
<div className=" flex items-center justify-between px-2 py-1 border-b">
|
<div className="flex items-center justify-between px-2 py-1 border-b h-10">
|
||||||
<div className="flex items-center gap-1 w-full">
|
<div className="flex items-center gap-1">
|
||||||
<TooltipProvider delayDuration={500}>
|
<TooltipProvider delayDuration={500}>
|
||||||
<Tooltip>
|
<Tooltip>
|
||||||
<TooltipTrigger asChild>
|
<TooltipTrigger asChild>
|
||||||
<Button
|
<Button variant="text" size="icon" onClick={toggle}>
|
||||||
variant="text"
|
|
||||||
size="icon"
|
|
||||||
onClick={toggle}
|
|
||||||
>
|
|
||||||
{isPlaying ? (
|
{isPlaying ? (
|
||||||
<Pause className="h-4 w-4" />
|
<Pause className="h-4 w-4" />
|
||||||
) : (
|
) : (
|
||||||
@@ -215,11 +218,7 @@ export function TimelineToolbar({
|
|||||||
</Tooltip>
|
</Tooltip>
|
||||||
<Tooltip>
|
<Tooltip>
|
||||||
<TooltipTrigger asChild>
|
<TooltipTrigger asChild>
|
||||||
<Button
|
<Button variant="text" size="icon" onClick={() => seek(0)}>
|
||||||
variant="text"
|
|
||||||
size="icon"
|
|
||||||
onClick={() => seek(0)}
|
|
||||||
>
|
|
||||||
<SkipBack className="h-4 w-4" />
|
<SkipBack className="h-4 w-4" />
|
||||||
</Button>
|
</Button>
|
||||||
</TooltipTrigger>
|
</TooltipTrigger>
|
||||||
@@ -356,6 +355,15 @@ export function TimelineToolbar({
|
|||||||
</Tooltip>
|
</Tooltip>
|
||||||
</TooltipProvider>
|
</TooltipProvider>
|
||||||
</div>
|
</div>
|
||||||
|
<div>
|
||||||
|
<SplitButton>
|
||||||
|
<SplitButtonLeft>Main scene</SplitButtonLeft>
|
||||||
|
<SplitButtonSeparator />
|
||||||
|
<SplitButtonRight onClick={() => {}}>
|
||||||
|
<LayersIcon />
|
||||||
|
</SplitButtonRight>
|
||||||
|
</SplitButton>
|
||||||
|
</div>
|
||||||
<div className="flex items-center gap-1">
|
<div className="flex items-center gap-1">
|
||||||
<TooltipProvider delayDuration={500}>
|
<TooltipProvider delayDuration={500}>
|
||||||
<Tooltip>
|
<Tooltip>
|
||||||
|
|||||||
@@ -0,0 +1,90 @@
|
|||||||
|
import { Button, ButtonProps } from "@/components/ui/button";
|
||||||
|
import { Separator } from "@/components/ui/separator";
|
||||||
|
import { ReactNode, forwardRef } from "react";
|
||||||
|
import { cn } from "@/lib/utils";
|
||||||
|
|
||||||
|
interface SplitButtonProps {
|
||||||
|
children: ReactNode;
|
||||||
|
className?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface SplitButtonSideProps extends Omit<ButtonProps, "variant" | "size"> {
|
||||||
|
children: ReactNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
const SplitButton = forwardRef<HTMLDivElement, SplitButtonProps>(
|
||||||
|
({ children, className, ...props }, ref) => {
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
ref={ref}
|
||||||
|
className={cn(
|
||||||
|
"inline-flex rounded-full h-7 border border-input bg-panel-accent overflow-hidden",
|
||||||
|
className
|
||||||
|
)}
|
||||||
|
{...props}
|
||||||
|
>
|
||||||
|
{children}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
SplitButton.displayName = "SplitButton";
|
||||||
|
|
||||||
|
const SplitButtonSide = forwardRef<
|
||||||
|
HTMLButtonElement,
|
||||||
|
SplitButtonSideProps & { paddingClass: string }
|
||||||
|
>(({ children, className, paddingClass, onClick, ...props }, ref) => {
|
||||||
|
return (
|
||||||
|
<Button
|
||||||
|
ref={ref}
|
||||||
|
variant="text"
|
||||||
|
className={cn(
|
||||||
|
"h-full rounded-none bg-panel-accent !opacity-100 border-0 gap-0 font-normal transition-colors",
|
||||||
|
onClick
|
||||||
|
? "hover:bg-foreground/10 hover:opacity-100 cursor-pointer"
|
||||||
|
: "cursor-default select-text",
|
||||||
|
paddingClass,
|
||||||
|
className
|
||||||
|
)}
|
||||||
|
onClick={onClick}
|
||||||
|
{...props}
|
||||||
|
>
|
||||||
|
{typeof children === "string" ? (
|
||||||
|
<span className="font-normal cursor-text">{children}</span>
|
||||||
|
) : (
|
||||||
|
children
|
||||||
|
)}
|
||||||
|
</Button>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
SplitButtonSide.displayName = "SplitButtonSide";
|
||||||
|
|
||||||
|
const SplitButtonLeft = forwardRef<HTMLButtonElement, SplitButtonSideProps>(
|
||||||
|
({ ...props }, ref) => {
|
||||||
|
return <SplitButtonSide ref={ref} paddingClass="pl-3 pr-2" {...props} />;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
SplitButtonLeft.displayName = "SplitButtonLeft";
|
||||||
|
|
||||||
|
const SplitButtonRight = forwardRef<HTMLButtonElement, SplitButtonSideProps>(
|
||||||
|
({ ...props }, ref) => {
|
||||||
|
return <SplitButtonSide ref={ref} paddingClass="pl-2 pr-3" {...props} />;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
SplitButtonRight.displayName = "SplitButtonRight";
|
||||||
|
|
||||||
|
const SplitButtonSeparator = forwardRef<HTMLDivElement, { className?: string }>(
|
||||||
|
({ className, ...props }, ref) => {
|
||||||
|
return (
|
||||||
|
<Separator
|
||||||
|
ref={ref}
|
||||||
|
orientation="vertical"
|
||||||
|
className={cn("h-full bg-foreground/15", className)}
|
||||||
|
{...props}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
SplitButtonSeparator.displayName = "SplitButtonSeparator";
|
||||||
|
|
||||||
|
export { SplitButton, SplitButtonLeft, SplitButtonRight, SplitButtonSeparator };
|
||||||
Reference in New Issue
Block a user