Revert "fix: preserve PSD super lock mask editing"
This reverts commit 6d60d53910cf8cb3d65aade75496cf514d3df617.
This commit is contained in:
parent
f5ee1fe592
commit
641cd800b2
@ -1780,7 +1780,7 @@ export function PsdTemplatesSettingsClient({
|
||||
超级锁
|
||||
</div>
|
||||
<div className="text-xs text-muted-foreground">
|
||||
开启后锁定目标图层的位置、层级和删除操作;图片槽位仍可替换图片,并只能在蒙版内拖动替换图。
|
||||
开启后用户前台无法选中、编辑、拖动或临时删除该图层,鼠标点击会自动穿透到下方图层。
|
||||
</div>
|
||||
</div>
|
||||
<Switch
|
||||
@ -1792,8 +1792,11 @@ export function PsdTemplatesSettingsClient({
|
||||
...current,
|
||||
isSuperLocked: checked,
|
||||
isRequired: checked ? false : current.isRequired,
|
||||
isDefaultResultSource: checked
|
||||
? false
|
||||
: current.isDefaultResultSource,
|
||||
allowUserUploadOverride: checked
|
||||
? true
|
||||
? false
|
||||
: current.allowUserUploadOverride,
|
||||
};
|
||||
}
|
||||
|
||||
@ -872,7 +872,9 @@ function getDefaultSourceImageLayer(
|
||||
): AgentPsdTemplateImageLayerSlot | null {
|
||||
const editableImageLayers = layers.filter(
|
||||
(layer): layer is AgentPsdTemplateImageLayerSlot =>
|
||||
layer.isEditable && isAgentPsdImageLayerSlot(layer)
|
||||
layer.isEditable &&
|
||||
!isAgentPsdLayerSuperLocked(layer) &&
|
||||
isAgentPsdImageLayerSlot(layer)
|
||||
);
|
||||
|
||||
return (
|
||||
@ -910,6 +912,9 @@ function createInitialState(
|
||||
|
||||
for (const layer of template.layers) {
|
||||
layerOrderIds.push(layer.id);
|
||||
if (isAgentPsdLayerSuperLocked(layer)) {
|
||||
continue;
|
||||
}
|
||||
if (
|
||||
isAgentPsdImageLayerSlot(layer) &&
|
||||
layer.id === defaultSourceImageLayerId &&
|
||||
@ -918,9 +923,6 @@ function createInitialState(
|
||||
imageAssignments[layer.id] = sourceImageUrl;
|
||||
imagePlacements[layer.id] = getDefaultAgentPsdImagePlacement();
|
||||
}
|
||||
if (isAgentPsdLayerSuperLocked(layer)) {
|
||||
continue;
|
||||
}
|
||||
if (isAgentPsdTextLayerSlot(layer) && layer.defaultText) {
|
||||
textAssignments[layer.id] = layer.defaultText;
|
||||
}
|
||||
@ -1730,13 +1732,6 @@ export function AgentPsdTemplateEditorDialog({
|
||||
startClientY: number;
|
||||
startOffset: AgentPsdLayerPositionOffset;
|
||||
} | null>(null);
|
||||
const imagePlacementDragStateRef = useRef<{
|
||||
layerId: string;
|
||||
pointerId: number;
|
||||
startClientX: number;
|
||||
startClientY: number;
|
||||
startPlacement: AgentPsdImagePlacement;
|
||||
} | null>(null);
|
||||
const textDragStateRef = useRef<{
|
||||
layerId: string;
|
||||
pointerId: number;
|
||||
@ -1943,7 +1938,9 @@ export function AgentPsdTemplateEditorDialog({
|
||||
() =>
|
||||
selectedTemplateLayers.filter(
|
||||
(layer): layer is AgentPsdTemplateImageLayerSlot =>
|
||||
layer.isEditable && isAgentPsdImageLayerSlot(layer)
|
||||
layer.isEditable &&
|
||||
!isAgentPsdLayerSuperLocked(layer) &&
|
||||
isAgentPsdImageLayerSlot(layer)
|
||||
),
|
||||
[selectedTemplateLayers]
|
||||
);
|
||||
@ -2038,11 +2035,11 @@ export function AgentPsdTemplateEditorDialog({
|
||||
);
|
||||
const orderedEditableImageLayers = useMemo(
|
||||
() =>
|
||||
orderedPreviewLayers.filter(
|
||||
orderedEditableLayers.filter(
|
||||
(layer): layer is AgentPsdTemplateImageLayerSlot =>
|
||||
layer.isEditable && isAgentPsdImageLayerSlot(layer)
|
||||
isAgentPsdImageLayerSlot(layer)
|
||||
),
|
||||
[orderedPreviewLayers]
|
||||
[orderedEditableLayers]
|
||||
);
|
||||
const orderedEditableTextLayers = useMemo(
|
||||
() =>
|
||||
@ -2193,24 +2190,17 @@ export function AgentPsdTemplateEditorDialog({
|
||||
const layer =
|
||||
selectedTemplateLayers.find((entry) => entry.id === selectedLayerId) ||
|
||||
null;
|
||||
return layer;
|
||||
return layer && !isAgentPsdLayerSuperLocked(layer) ? layer : null;
|
||||
}, [selectedLayerId, selectedTemplateLayers]);
|
||||
const isSelectedLayerSuperLocked = Boolean(
|
||||
selectedLayer && isAgentPsdLayerSuperLocked(selectedLayer)
|
||||
);
|
||||
const isSelectedLayerHidden = Boolean(
|
||||
selectedLayer && hiddenLayerIdSet.has(selectedLayer.id)
|
||||
);
|
||||
const selectedImageLayer =
|
||||
selectedLayer &&
|
||||
selectedLayer.isEditable &&
|
||||
isAgentPsdImageLayerSlot(selectedLayer)
|
||||
selectedLayer && isAgentPsdImageLayerSlot(selectedLayer)
|
||||
? selectedLayer
|
||||
: null;
|
||||
const selectedTextLayer =
|
||||
selectedLayer &&
|
||||
!isSelectedLayerSuperLocked &&
|
||||
isAgentPsdTextLayerSlot(selectedLayer)
|
||||
selectedLayer && isAgentPsdTextLayerSlot(selectedLayer)
|
||||
? selectedLayer
|
||||
: null;
|
||||
const selectedImageAssignmentUrl = selectedImageLayer
|
||||
@ -2262,9 +2252,8 @@ export function AgentPsdTemplateEditorDialog({
|
||||
current.filter((currentLayerId) => currentLayerId !== normalizedLayerId)
|
||||
);
|
||||
}
|
||||
const selectedLayerPositionPanel =
|
||||
selectedLayer && !isSelectedLayerSuperLocked ? (
|
||||
<div className="space-y-4 rounded-2xl border border-white/10 bg-white/[0.03] p-5 shadow-inner">
|
||||
const selectedLayerPositionPanel = selectedLayer ? (
|
||||
<div className="space-y-4 rounded-2xl border border-white/10 bg-white/[0.03] p-5 shadow-inner">
|
||||
<div className="flex items-start justify-between gap-4">
|
||||
<div>
|
||||
<div className="font-semibold text-sm text-white">图层层级</div>
|
||||
@ -2488,7 +2477,7 @@ export function AgentPsdTemplateEditorDialog({
|
||||
槽位内图片位置
|
||||
</div>
|
||||
<div className="mt-1.5 text-white/50 text-xs">
|
||||
目标图层保持固定;拖动预览中的替换图可在蒙版内微调位置。
|
||||
图层整体拖动已经改到中间预览区;这里保留槽位内图片的细调。
|
||||
</div>
|
||||
</div>
|
||||
<ImageIcon className="h-5 w-5 shrink-0 text-orange-300" />
|
||||
@ -3456,72 +3445,6 @@ export function AgentPsdTemplateEditorDialog({
|
||||
window.addEventListener("pointercancel", handlePointerUp);
|
||||
}
|
||||
|
||||
function handleAssignedImagePlacementDragStart(
|
||||
layer: AgentPsdTemplateImageLayerSlot,
|
||||
event: ReactPointerEvent<HTMLElement>
|
||||
) {
|
||||
const assignmentUrl = String(
|
||||
effectiveImageAssignments[layer.id] || ""
|
||||
).trim();
|
||||
if (!assignmentUrl) {
|
||||
return;
|
||||
}
|
||||
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
setSelectedLayerId(layer.id);
|
||||
|
||||
imagePlacementDragStateRef.current = {
|
||||
layerId: layer.id,
|
||||
pointerId: event.pointerId,
|
||||
startClientX: event.clientX,
|
||||
startClientY: event.clientY,
|
||||
startPlacement: normalizeAgentPsdImagePlacement(
|
||||
effectiveImagePlacements[layer.id]
|
||||
),
|
||||
};
|
||||
|
||||
const nextTarget = event.currentTarget;
|
||||
try {
|
||||
nextTarget.setPointerCapture?.(event.pointerId);
|
||||
} catch (error) {
|
||||
console.warn(
|
||||
"[AgentPsdTemplateEditorDialog] setPointerCapture failed:",
|
||||
error
|
||||
);
|
||||
}
|
||||
|
||||
const handlePointerMove = (moveEvent: PointerEvent) => {
|
||||
const dragState = imagePlacementDragStateRef.current;
|
||||
if (!dragState || dragState.layerId !== layer.id) {
|
||||
return;
|
||||
}
|
||||
|
||||
updateImagePlacement(layer.id, () => ({
|
||||
...dragState.startPlacement,
|
||||
offsetX:
|
||||
dragState.startPlacement.offsetX +
|
||||
(moveEvent.clientX - dragState.startClientX) / stageScale,
|
||||
offsetY:
|
||||
dragState.startPlacement.offsetY +
|
||||
(moveEvent.clientY - dragState.startClientY) / stageScale,
|
||||
}));
|
||||
};
|
||||
|
||||
const handlePointerUp = (upEvent: PointerEvent) => {
|
||||
if (imagePlacementDragStateRef.current?.pointerId === upEvent.pointerId) {
|
||||
imagePlacementDragStateRef.current = null;
|
||||
}
|
||||
window.removeEventListener("pointermove", handlePointerMove);
|
||||
window.removeEventListener("pointerup", handlePointerUp);
|
||||
window.removeEventListener("pointercancel", handlePointerUp);
|
||||
};
|
||||
|
||||
window.addEventListener("pointermove", handlePointerMove);
|
||||
window.addEventListener("pointerup", handlePointerUp);
|
||||
window.addEventListener("pointercancel", handlePointerUp);
|
||||
}
|
||||
|
||||
function handleTextDragStart(
|
||||
layer: AgentPsdTemplateTextLayerSlot,
|
||||
event: ReactPointerEvent<HTMLDivElement>
|
||||
@ -4217,11 +4140,6 @@ export function AgentPsdTemplateEditorDialog({
|
||||
if (isAgentPsdImageLayerSlot(layer)) {
|
||||
const assignedUrl =
|
||||
effectiveImageAssignments[layer.id];
|
||||
const hasAssignedImage = Boolean(
|
||||
String(assignedUrl || "").trim()
|
||||
);
|
||||
const canDragAssignedImage =
|
||||
isLayerSuperLocked && hasAssignedImage;
|
||||
const layerImageUrl =
|
||||
assignedUrl ||
|
||||
getPsdLayerPreviewSourceUrl(layer);
|
||||
@ -4238,51 +4156,39 @@ export function AgentPsdTemplateEditorDialog({
|
||||
return (
|
||||
<div
|
||||
className={`absolute overflow-hidden ${
|
||||
isLayerSuperLocked && !hasAssignedImage
|
||||
isLayerSuperLocked
|
||||
? "pointer-events-none"
|
||||
: "pointer-events-auto"
|
||||
}`}
|
||||
key={layer.id}
|
||||
onClick={(event) => {
|
||||
event.stopPropagation();
|
||||
setSelectedLayerId(layer.id);
|
||||
}}
|
||||
onPointerDown={(event) => {
|
||||
if (canDragAssignedImage) {
|
||||
handleAssignedImagePlacementDragStart(
|
||||
layer,
|
||||
event
|
||||
);
|
||||
return;
|
||||
}
|
||||
if (!isLayerSuperLocked) {
|
||||
handleLayerDragStart(layer, event);
|
||||
}
|
||||
}}
|
||||
onClick={
|
||||
isLayerSuperLocked
|
||||
? undefined
|
||||
: (event) => {
|
||||
event.stopPropagation();
|
||||
setSelectedLayerId(layer.id);
|
||||
}
|
||||
}
|
||||
onPointerDown={(event) =>
|
||||
isLayerSuperLocked
|
||||
? undefined
|
||||
: handleLayerDragStart(layer, event)
|
||||
}
|
||||
style={{
|
||||
...assignedImageContainerStyle,
|
||||
zIndex: baseZIndex,
|
||||
cursor: canDragAssignedImage
|
||||
? imagePlacementDragStateRef.current
|
||||
?.layerId === layer.id
|
||||
? "grabbing"
|
||||
: "grab"
|
||||
: isLayerSuperLocked
|
||||
cursor:
|
||||
isLayerSuperLocked
|
||||
? "default"
|
||||
: layerDragStateRef.current?.layerId ===
|
||||
layer.id
|
||||
? "grabbing"
|
||||
: "grab",
|
||||
touchAction:
|
||||
isLayerSuperLocked && !hasAssignedImage
|
||||
? "auto"
|
||||
: "none",
|
||||
touchAction: isLayerSuperLocked
|
||||
? "auto"
|
||||
: "none",
|
||||
}}
|
||||
title={
|
||||
canDragAssignedImage
|
||||
? `${getLayerLabel(layer)}:${layer.layerName}(目标已锁定,可拖动替换图)`
|
||||
: `${getLayerLabel(layer)}:${layer.layerName}`
|
||||
}
|
||||
title={`${getLayerLabel(layer)}:${layer.layerName}`}
|
||||
>
|
||||
<img
|
||||
alt={layer.layerName}
|
||||
@ -4523,8 +4429,6 @@ export function AgentPsdTemplateEditorDialog({
|
||||
effectiveImageAssignments[layer.id] || ""
|
||||
).trim()
|
||||
);
|
||||
const isLayerSuperLocked =
|
||||
isAgentPsdLayerSuperLocked(layer);
|
||||
|
||||
return isSelected && hasAssignedImage ? (
|
||||
<div
|
||||
@ -4552,18 +4456,9 @@ export function AgentPsdTemplateEditorDialog({
|
||||
className="absolute overflow-hidden rounded-lg transition-all"
|
||||
key={layer.id}
|
||||
onClick={() => setSelectedLayerId(layer.id)}
|
||||
onPointerDown={(event) => {
|
||||
if (isLayerSuperLocked && hasAssignedImage) {
|
||||
handleAssignedImagePlacementDragStart(
|
||||
layer,
|
||||
event
|
||||
);
|
||||
return;
|
||||
}
|
||||
if (!isLayerSuperLocked) {
|
||||
handleLayerDragStart(layer, event);
|
||||
}
|
||||
}}
|
||||
onPointerDown={(event) =>
|
||||
handleLayerDragStart(layer, event)
|
||||
}
|
||||
style={{
|
||||
...frameStyle,
|
||||
zIndex:
|
||||
@ -4575,15 +4470,10 @@ export function AgentPsdTemplateEditorDialog({
|
||||
? "rgba(249,115,22,0.08)"
|
||||
: "transparent",
|
||||
cursor:
|
||||
isLayerSuperLocked && hasAssignedImage
|
||||
? imagePlacementDragStateRef.current
|
||||
?.layerId === layer.id
|
||||
? "grabbing"
|
||||
: "grab"
|
||||
: layerDragStateRef.current?.layerId ===
|
||||
layer.id
|
||||
? "grabbing"
|
||||
: "grab",
|
||||
layerDragStateRef.current?.layerId ===
|
||||
layer.id
|
||||
? "grabbing"
|
||||
: "grab",
|
||||
touchAction: "none",
|
||||
}}
|
||||
title={`${getLayerLabel(layer)}:${layer.layerName}`}
|
||||
|
||||
@ -576,13 +576,13 @@ export async function renderAgentPsdTemplate(params: {
|
||||
for (const layer of orderedTemplateLayers) {
|
||||
if (hiddenLayerIdSet.has(layer.id)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const storedLayerSourceUrl = getStoredLayerSourceUrl(layer);
|
||||
if (shouldRenderAsStaticLayer(layer)) {
|
||||
if (shouldUseRenderBaseFallback || shouldUseRenderSegments) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
const storedLayerSourceUrl = getStoredLayerSourceUrl(layer);
|
||||
if (shouldRenderAsStaticLayer(layer)) {
|
||||
if (shouldUseRenderBaseFallback || shouldUseRenderSegments) {
|
||||
continue;
|
||||
}
|
||||
pushAsset(
|
||||
storedLayerSourceUrl,
|
||||
"PSD 图层素材",
|
||||
@ -913,10 +913,7 @@ export async function renderAgentPsdTemplate(params: {
|
||||
}
|
||||
|
||||
for (const layer of [...orderedTemplateLayers].reverse()) {
|
||||
if (
|
||||
shouldUseRenderSegments &&
|
||||
(isAgentPsdTemplateLayerUserEditable(layer) || hasImageAssignment(layer))
|
||||
) {
|
||||
if (shouldUseRenderSegments && isAgentPsdTemplateLayerUserEditable(layer)) {
|
||||
await appendRenderSegmentBeforeLayer(layer.id);
|
||||
}
|
||||
|
||||
@ -924,7 +921,7 @@ export async function renderAgentPsdTemplate(params: {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (shouldRenderAsStaticLayer(layer)) {
|
||||
if (!isAgentPsdTemplateLayerUserEditable(layer)) {
|
||||
if (shouldUseRenderBaseFallback || shouldUseRenderSegments) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user