feat: add commands for clearing candidates and reusing candidate settings, update UI controls
This commit is contained in:
@@ -5,6 +5,8 @@ import {
|
||||
generationAddCandidateCommand,
|
||||
generationApplyCandidateAsLayerCommand,
|
||||
generationRemoveCandidateCommand,
|
||||
generationClearCandidatesCommand,
|
||||
generationReuseCandidateSettingsCommand,
|
||||
generationReplaceCandidatePixelsCommand,
|
||||
generationSetCompareModeCommand,
|
||||
generationFailJobCommand,
|
||||
@@ -38,6 +40,38 @@ describe("generation commands", () => {
|
||||
expect(next.editor.generation.compareMode).toBe("split");
|
||||
});
|
||||
|
||||
test("clears the candidate session and resets comparison", () => {
|
||||
const withCandidate = generationAddCandidateCommand.execute(
|
||||
{ state: createInitialAppState("Test") },
|
||||
{ candidate: generationCandidate("candidate-1") },
|
||||
);
|
||||
const comparing = generationSetCompareModeCommand.execute({ state: withCandidate }, { mode: "split" });
|
||||
|
||||
const next = generationClearCandidatesCommand.execute({ state: comparing }, undefined);
|
||||
|
||||
expect(next.editor.generation.candidates).toEqual([]);
|
||||
expect(next.editor.generation.selectedCandidateId).toBeUndefined();
|
||||
expect(next.editor.generation.compareMode).toBe("result");
|
||||
});
|
||||
|
||||
test("reuses a candidate's full settings with its resolved seed", () => {
|
||||
const candidate = generationCandidate("candidate-1");
|
||||
candidate.settings = {
|
||||
...candidate.settings,
|
||||
prompt: "Stored prompt",
|
||||
model: "stored-model.safetensors",
|
||||
seed: -1,
|
||||
inpaint: { ...candidate.settings.inpaint, maskBlur: 7 },
|
||||
};
|
||||
candidate.seed = 987654;
|
||||
const state = generationAddCandidateCommand.execute({ state: createInitialAppState("Test") }, { candidate });
|
||||
|
||||
const next = generationReuseCandidateSettingsCommand.execute({ state }, { candidateId: candidate.id });
|
||||
|
||||
expect(next.editor.tools.generate).toEqual({ ...candidate.settings, seed: 987654 });
|
||||
expect(next.editor.generation).toBe(state.editor.generation);
|
||||
});
|
||||
|
||||
test("applies candidates as top-level layers", () => {
|
||||
const withRemainingCandidate = generationAddCandidateCommand.execute(
|
||||
{ state: documentWithSourceLayer() },
|
||||
|
||||
@@ -24,6 +24,10 @@ export type GenerationRemoveCandidatePayload = {
|
||||
candidateId: GenerationCandidateId;
|
||||
};
|
||||
|
||||
export type GenerationReuseCandidateSettingsPayload = {
|
||||
candidateId: GenerationCandidateId;
|
||||
};
|
||||
|
||||
export type GenerationApplyCandidateAsLayerPayload = {
|
||||
candidateId: GenerationCandidateId;
|
||||
assetId: AssetId;
|
||||
@@ -140,6 +144,30 @@ export const generationClearCandidatesCommand: Command = {
|
||||
},
|
||||
};
|
||||
|
||||
export const generationReuseCandidateSettingsCommand: Command<GenerationReuseCandidateSettingsPayload> = {
|
||||
id: commandIds.generationReuseCandidateSettings,
|
||||
name: "Reuse generation candidate settings",
|
||||
execute({ state }, payload) {
|
||||
const candidate = state.editor.generation.candidates.find((item) => item.id === payload.candidateId);
|
||||
if (!candidate) return state;
|
||||
return {
|
||||
...state,
|
||||
editor: {
|
||||
...state.editor,
|
||||
tools: {
|
||||
...state.editor.tools,
|
||||
generate: {
|
||||
...candidate.settings,
|
||||
seed: candidate.seed,
|
||||
outpaint: { ...candidate.settings.outpaint },
|
||||
inpaint: { ...candidate.settings.inpaint },
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
},
|
||||
};
|
||||
|
||||
export const generationApplyCandidateAsLayerCommand: Command<GenerationApplyCandidateAsLayerPayload> = {
|
||||
id: commandIds.generationApplyCandidateAsLayer,
|
||||
name: "Apply generation candidate as layer",
|
||||
@@ -284,6 +312,7 @@ export const generationCommands = [
|
||||
generationSetCompareModeCommand,
|
||||
generationRemoveCandidateCommand,
|
||||
generationClearCandidatesCommand,
|
||||
generationReuseCandidateSettingsCommand,
|
||||
generationApplyCandidateAsLayerCommand,
|
||||
generationReplaceCandidatePixelsCommand,
|
||||
generationStartJobCommand,
|
||||
|
||||
@@ -42,6 +42,7 @@ export const commandIds = {
|
||||
generationSetCompareMode: "generation.setCompareMode",
|
||||
generationRemoveCandidate: "generation.removeCandidate",
|
||||
generationClearCandidates: "generation.clearCandidates",
|
||||
generationReuseCandidateSettings: "generation.reuseCandidateSettings",
|
||||
generationApplyCandidateAsLayer: "generation.applyCandidateAsLayer",
|
||||
generationReplaceCandidatePixels: "generation.replaceCandidatePixels",
|
||||
generationStartJob: "generation.startJob",
|
||||
|
||||
@@ -27,6 +27,7 @@ import type {
|
||||
GenerationAddCandidatePayload,
|
||||
GenerationApplyCandidateAsLayerPayload,
|
||||
GenerationRemoveCandidatePayload,
|
||||
GenerationReuseCandidateSettingsPayload,
|
||||
GenerationReplaceCandidatePixelsPayload,
|
||||
GenerationSelectCandidatePayload,
|
||||
GenerationSetCompareModePayload,
|
||||
@@ -99,6 +100,7 @@ export type CommandPayloads = {
|
||||
[commandIds.generationSetCompareMode]: GenerationSetCompareModePayload;
|
||||
[commandIds.generationRemoveCandidate]: GenerationRemoveCandidatePayload;
|
||||
[commandIds.generationClearCandidates]: void;
|
||||
[commandIds.generationReuseCandidateSettings]: GenerationReuseCandidateSettingsPayload;
|
||||
[commandIds.generationApplyCandidateAsLayer]: GenerationApplyCandidateAsLayerPayload;
|
||||
[commandIds.generationReplaceCandidatePixels]: GenerationReplaceCandidatePixelsPayload;
|
||||
[commandIds.generationStartJob]: GenerationStartJobPayload;
|
||||
|
||||
Reference in New Issue
Block a user