{activeSidebarPanel === 'assets' ? (
@@ -2360,7 +3869,9 @@ export function ImageCanvasEditorView() {
}
event.preventDefault();
event.stopPropagation();
- addUploadedFiles(event.dataTransfer.files, { folderId: folder.id });
+ addUploadedFiles(event.dataTransfer.files, {
+ folderId: folder.id,
+ });
}}
>
@@ -2438,6 +3949,7 @@ export function ImageCanvasEditorView() {
icon={ImagePlus}
onClick={() => {
setActiveUploadFolderId(folder.id);
+ setUploadTarget('asset');
uploadInputRef.current?.click();
}}
/>
@@ -2610,8 +4122,12 @@ export function ImageCanvasEditorView() {
style={{
left: Math.min(assetMarquee.startX, assetMarquee.currentX),
top: Math.min(assetMarquee.startY, assetMarquee.currentY),
- width: Math.abs(assetMarquee.currentX - assetMarquee.startX),
- height: Math.abs(assetMarquee.currentY - assetMarquee.startY),
+ width: Math.abs(
+ assetMarquee.currentX - assetMarquee.startX,
+ ),
+ height: Math.abs(
+ assetMarquee.currentY - assetMarquee.startY,
+ ),
}}
/>
) : null}
@@ -2692,11 +4208,21 @@ export function ImageCanvasEditorView() {
.map((layer) => {
const isSelected = selectedLayerIds.includes(layer.id);
const isHovered = hoveredLayerId === layer.id;
+ const kindLabel = getLayerKindLabel(layer);
+ const layerGeneratingLabel =
+ generateDialog?.mode === 'edit' &&
+ generateDialog.status === 'generating' &&
+ generateDialog.sourceLayerId === layer.id
+ ? '修改中'
+ : quickEditPanel?.status === 'generating' &&
+ quickEditPanel.sourceLayerId === layer.id
+ ? '生成中'
+ : null;
return (
);
})}
@@ -2746,49 +4318,103 @@ export function ImageCanvasEditorView() {
className="image-canvas-editor__canvas-marquee"
aria-hidden="true"
style={{
- left: (Math.min(canvasMarquee.startX, canvasMarquee.currentX) - viewport.x) / viewport.scale,
- top: (Math.min(canvasMarquee.startY, canvasMarquee.currentY) - viewport.y) / viewport.scale,
- width: Math.abs(canvasMarquee.currentX - canvasMarquee.startX) / viewport.scale,
- height: Math.abs(canvasMarquee.currentY - canvasMarquee.startY) / viewport.scale,
+ left:
+ (Math.min(canvasMarquee.startX, canvasMarquee.currentX) -
+ viewport.x) /
+ viewport.scale,
+ top:
+ (Math.min(canvasMarquee.startY, canvasMarquee.currentY) -
+ viewport.y) /
+ viewport.scale,
+ width:
+ Math.abs(canvasMarquee.currentX - canvasMarquee.startX) /
+ viewport.scale,
+ height:
+ Math.abs(canvasMarquee.currentY - canvasMarquee.startY) /
+ viewport.scale,
}}
/>
) : null}
- {generateDialog?.mode === 'generate' && generateDialog.placeholder ? (
-
- setGenerateDialog((currentDialog) =>
- currentDialog?.mode === 'generate'
- ? {
- ...currentDialog,
- composerOpen: true,
- }
- : currentDialog,
- )
- }
+ {canvasGenerationDialogs.map((dialog) =>
+ dialog.placeholder ? (
+
+ handleGenerationFramePointerDown(event, dialog)
+ }
+ onDoubleClick={() => activateCanvasGenerationDialog(dialog)}
+ >
+
+
+ {getGenerationFrameLabel(dialog)}
+
+ {dialog.mode === 'character' ? (
+
+ 角色
+
+ ) : null}
+ {dialog.mode === 'spec' ? (
+
+ 规范
+
+ ) : null}
+ {dialog.mode === 'icon' ? (
+
+ 图标
+
+ ) : null}
+
+ {dialog.placeholder.originalWidth} x{' '}
+ {dialog.placeholder.originalHeight}
+
+
+
+
+ {dialog.status === 'generating' ? (
+
+ 生成中
+
+ ) : null}
+
+ ) : null,
+ )}
+ {(generateDialog?.mode === 'generate' ||
+ generateDialog?.mode === 'spec' ||
+ generateDialog?.mode === 'character' ||
+ generateDialog?.mode === 'icon') &&
+ generateDialog.status === 'generating' &&
+ generationComposerStyle ? (
+
-
-
- Image Generator
-
-
- {generateDialog.placeholder.originalWidth} x{' '}
- {generateDialog.placeholder.originalHeight}
-
-
-
-
-
+ 生成中
+
) : null}
@@ -2815,11 +4441,17 @@ export function ImageCanvasEditorView() {
icon={Trash2}
onClick={deleteSelectedLayer}
/>
+