{snapGuide?.vertical !== undefined ? (
) : null}
{snapGuide?.horizontal !== undefined ? (
) : null}
{visibleLayers.map((layer) => {
const isSelected = selectedLayerIds.includes(layer.id);
const isHovered = hoveredLayerId === layer.id;
const kindTagMeta = getLayerKindTagMeta(layer);
const kindLabel = kindTagMeta.label;
const mediaTransform =
layer.flipX || layer.flipY
? `scale(${layer.flipX ? -1 : 1}, ${layer.flipY ? -1 : 1})`
: undefined;
const layerGeneratingLabel = splittingIconSpritesheetLayerIds.has(
layer.id,
)
? '拆图中'
: generateDialog?.mode === 'edit' &&
generateDialog.status === 'generating' &&
generateDialog.sourceLayerId === layer.id
? '修改中'
: null;
const isMediaContainer = isCanvasMediaContainerLayer(layer);
const LayerElement = isMediaContainer ? 'div' : 'button';
const metadataMediaLabel = getLayerMetadataMediaLabel(layer);
return (
onLayerPointerDown(event, layer)}
onClick={(event) => {
setOpenLayerKindMenuId(null);
onLayerClick(event, layer);
}}
onContextMenu={(event) => {
setOpenLayerKindMenuId(null);
onLayerContextMenu(event, layer);
}}
onKeyDown={
isMediaContainer ? handleLayerKeyboardActivation : undefined
}
onMouseEnter={() => onLayerMouseEnter(layer.id)}
onMouseLeave={() => onLayerMouseLeave(layer.id)}
aria-label={`选择${layer.title}`}
>
{layer.mediaType === 'audio' ? (
onSelectLayer(layer.id)}
/>
) : layer.mediaType === 'video' ? (
) : layer.mediaType === 'image-sequence' ? (
) : (
)}
{kindLabel ? (
event.stopPropagation()}
onClick={(event) => {
event.stopPropagation();
setOpenLayerKindMenuId((currentId) =>
currentId === layer.id ? null : layer.id,
);
}}
onKeyDown={handleLayerTagKeyboardActivation}
>
{kindLabel}
) : null}
}
style={inverseScaleStyle}
onClick={(event) => {
event.stopPropagation();
onOpenLayerMetadata(layer);
}}
onPointerDown={(event) => event.stopPropagation()}
/>
{isHovered && layer.mediaType !== 'audio' ? (
{getLayerMetricLabel(layer)}
) : null}
{layerGeneratingLabel ? (
{layerGeneratingLabel}
) : null}
{openLayerKindMenuId === layer.id ? (
event.stopPropagation()}
onWheel={(event) => event.stopPropagation()}
>
{CANVAS_ASSET_KIND_TAG_OPTIONS.map((option) => (
{
event.stopPropagation();
onUpdateLayerAssetKind(layer.id, option.value);
setOpenLayerKindMenuId(null);
}}
>
{option.label}
))}
) : null}
);
})}
{canvasMarquee ? (
) : null}
{cropExpandPanel && cropExpandSourceLayer ? (
{CROP_EXPAND_HANDLES.map((handle) => (
) : null}
{canvasGenerationDialogs.map((dialog) => {
const hasGeneratedLayer = Boolean(
dialog.generatedLayerId &&
layers.some((layer) => layer.id === dialog.generatedLayerId),
);
return dialog.placeholder && !hasGeneratedLayer
? (() => {
const isFocused = generateDialog?.id === dialog.id;
const isSelected = selectedLayerIds.includes(
getCanvasGenerationSelectionId(dialog.id),
);
const showFocusedChrome =
isFocused || isSelected || dialog.status === 'generating';
const placeholderMeta = getGenerationPlaceholderMeta(dialog);
return (
onGenerationFramePointerDown(event, dialog)
}
onContextMenu={(event) =>
onGenerationFrameContextMenu(event, dialog)
}
onDoubleClick={() => onActivateGenerationDialog(dialog)}
>
{showFocusedChrome ? (
{placeholderMeta.labelIcon}
{getGenerationFrameLabel(dialog)}
) : null}
{placeholderMeta.badgeLabel ? (
{placeholderMeta.badgeLabel}
) : null}
{showFocusedChrome &&
dialog.mode !== 'audio-sound-effect' &&
dialog.mode !== 'audio-background-music' ? (
{`${dialog.placeholder.originalWidth} x ${dialog.placeholder.originalHeight}`}
) : null}
{placeholderMeta.icon}
{dialog.status === 'generating' ? (
生成中
) : null}
);
})()
: null;
})}
{(generateDialog?.mode === 'generate' ||
generateDialog?.mode === 'spec' ||
generateDialog?.mode === 'character' ||
generateDialog?.mode === 'icon' ||
generateDialog?.mode === 'ui-design' ||
generateDialog?.mode === 'quick-edit' ||
generateDialog?.mode === 'publication' ||
generateDialog?.mode === 'character-animation' ||
generateDialog?.mode === 'video' ||
generateDialog?.mode === 'audio-sound-effect' ||
generateDialog?.mode === 'audio-background-music') &&
generateDialog.status === 'generating' &&
generationComposerStyle ? (
生成中
) : null}
);
}