0e47a54a91
统一画布生成占位图标,按图片、规范、角色、图标、UI、视频、音频、宣发和快速编辑区分。 让图片、规范、宣发和视频新建占位按面板尺寸或固定输出尺寸创建,并在参数变化时同步占位大小。 完善快速编辑、音频生成、宣发素材和生成类面板相关契约与测试。 更新生成类面板 Lovart 改造文档和项目决策记录。
144 lines
4.3 KiB
TypeScript
144 lines
4.3 KiB
TypeScript
import {
|
|
Crop,
|
|
Download,
|
|
Eraser,
|
|
Scissors,
|
|
Sparkles,
|
|
WandSparkles,
|
|
} from 'lucide-react';
|
|
import type { CSSProperties } from 'react';
|
|
|
|
import { PlatformIconButton } from '../common/PlatformIconButton';
|
|
import { EditorIconButton } from './ImageCanvasEditorPrimitives';
|
|
import type { CanvasLayer } from './ImageCanvasEditorTypes';
|
|
|
|
type ImageCanvasSelectedLayerToolbarViewProps = {
|
|
selectedLayer: CanvasLayer | null;
|
|
selectedToolbarStyle: CSSProperties | null;
|
|
onOpenQuickEditPanel: (layer: CanvasLayer) => void;
|
|
onOpenRedrawPanel: (layer: CanvasLayer) => void;
|
|
onOpenCropExpandPanel: (layer: CanvasLayer) => void;
|
|
onRemoveBackground: (layer: CanvasLayer) => void;
|
|
onExtractUiDesignAssets: (layer: CanvasLayer) => void;
|
|
onOpenCharacterAnimationPanel: (layer: CanvasLayer) => void;
|
|
onDownloadLayer: (layer: CanvasLayer) => void;
|
|
};
|
|
|
|
export function ImageCanvasSelectedLayerToolbarView({
|
|
selectedLayer,
|
|
selectedToolbarStyle,
|
|
onOpenQuickEditPanel,
|
|
onOpenRedrawPanel,
|
|
onOpenCropExpandPanel,
|
|
onRemoveBackground,
|
|
onExtractUiDesignAssets,
|
|
onOpenCharacterAnimationPanel,
|
|
onDownloadLayer,
|
|
}: ImageCanvasSelectedLayerToolbarViewProps) {
|
|
if (!selectedLayer || !selectedToolbarStyle) {
|
|
return null;
|
|
}
|
|
|
|
if (selectedLayer.mediaType === 'audio') {
|
|
return (
|
|
<div
|
|
className="image-canvas-editor__floating-toolbar"
|
|
style={selectedToolbarStyle}
|
|
role="toolbar"
|
|
aria-label="素材工具栏"
|
|
onPointerDown={(event) => event.stopPropagation()}
|
|
>
|
|
<PlatformIconButton
|
|
className="image-canvas-editor__floating-toolbar-text-button"
|
|
label="改造"
|
|
title="改造"
|
|
icon={<WandSparkles className="h-4 w-4" />}
|
|
onClick={() => onOpenRedrawPanel(selectedLayer)}
|
|
>
|
|
<span>改造</span>
|
|
</PlatformIconButton>
|
|
<EditorIconButton
|
|
label="下载按钮"
|
|
title="下载按钮"
|
|
icon={Download}
|
|
onClick={() => onDownloadLayer(selectedLayer)}
|
|
/>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
return (
|
|
<div
|
|
className="image-canvas-editor__floating-toolbar"
|
|
style={selectedToolbarStyle}
|
|
role="toolbar"
|
|
aria-label="图片工具栏"
|
|
onPointerDown={(event) => event.stopPropagation()}
|
|
>
|
|
<PlatformIconButton
|
|
className="image-canvas-editor__floating-toolbar-text-button"
|
|
label="快速编辑"
|
|
title="快速编辑"
|
|
icon={<Sparkles className="h-4 w-4" />}
|
|
onClick={() => onOpenQuickEditPanel(selectedLayer)}
|
|
>
|
|
<span>快速编辑</span>
|
|
</PlatformIconButton>
|
|
<span
|
|
aria-hidden="true"
|
|
className="image-canvas-editor__floating-toolbar-divider"
|
|
/>
|
|
<EditorIconButton
|
|
label="裁扩按钮"
|
|
title="裁扩按钮"
|
|
icon={Crop}
|
|
onClick={() => onOpenCropExpandPanel(selectedLayer)}
|
|
/>
|
|
<EditorIconButton
|
|
label="去除背景按钮"
|
|
title="去除背景按钮"
|
|
icon={Eraser}
|
|
onClick={() => onRemoveBackground(selectedLayer)}
|
|
/>
|
|
{selectedLayer.assetKind === 'ui-design' ? (
|
|
<PlatformIconButton
|
|
className="image-canvas-editor__floating-toolbar-text-button"
|
|
label="提取素材"
|
|
title="提取素材"
|
|
icon={<Scissors className="h-4 w-4" />}
|
|
onClick={() => onExtractUiDesignAssets(selectedLayer)}
|
|
>
|
|
<span>提取素材</span>
|
|
</PlatformIconButton>
|
|
) : null}
|
|
{selectedLayer.assetKind === 'character' ? (
|
|
<EditorIconButton
|
|
label="生成动画"
|
|
title="生成动画"
|
|
icon={Sparkles}
|
|
onClick={() => onOpenCharacterAnimationPanel(selectedLayer)}
|
|
/>
|
|
) : null}
|
|
<span
|
|
aria-hidden="true"
|
|
className="image-canvas-editor__floating-toolbar-divider"
|
|
/>
|
|
<PlatformIconButton
|
|
className="image-canvas-editor__floating-toolbar-text-button"
|
|
label="改造"
|
|
title="改造"
|
|
icon={<WandSparkles className="h-4 w-4" />}
|
|
onClick={() => onOpenRedrawPanel(selectedLayer)}
|
|
>
|
|
<span>改造</span>
|
|
</PlatformIconButton>
|
|
<EditorIconButton
|
|
label="下载按钮"
|
|
title="下载按钮"
|
|
icon={Download}
|
|
onClick={() => onDownloadLayer(selectedLayer)}
|
|
/>
|
|
</div>
|
|
);
|
|
}
|