Skip to content

Commit 8e52fcb

Browse files
committed
comfy workflow browser save: use new image interface
1 parent 8282c2f commit 8e52fcb

3 files changed

Lines changed: 85 additions & 59 deletions

File tree

src/BuiltinExtensions/ComfyUIBackend/Assets/comfy_workflow_editor_helper.js

Lines changed: 75 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,21 @@
11
/** If true, the workflow iframe is present. If false, the tab has never been opened, or loading failed. */
22
let hasComfyLoaded = false;
33

4+
/** Helper class for managing the Comfy workflow tab. */
5+
class ComfyWorkflowHelpers {
6+
7+
constructor() {
8+
this.imageBlockElem = getRequiredElementById('comfy_save_image_block');
9+
let imageHtml = makeImageInput(null, 'comfy_save_image', null, 'Image', 'Image', true, false);
10+
this.imageBlockElem.innerHTML = imageHtml;
11+
this.imageElem = getRequiredElementById('comfy_save_image');
12+
this.enableImageElem = getRequiredElementById('comfy_save_image_toggle');
13+
}
14+
}
15+
16+
/** Helper instance for comfy workflow save modal, just an instance of {@link ComfyWorkflowHelpers}. */
17+
let comfyWorkflowHelpers = new ComfyWorkflowHelpers();
18+
419
let comfyButtonsArea = getRequiredElementById('comfy_workflow_buttons');
520

621
let comfyObjectData = {};
@@ -1090,25 +1105,21 @@ function comfyNoticeMessage(message) {
10901105
function comfySaveWorkflowNow() {
10911106
comfyReconfigureQuickload();
10921107
getRequiredElementById('comfy_save_modal_replace').value = '';
1093-
let curImg = document.getElementById('current_image_img');
1094-
let enableImage = getRequiredElementById('comfy_save_use_image');
1095-
let saveImageSection = getRequiredElementById('comfy_save_image');
1096-
saveImageSection.innerHTML = '';
1097-
if (curImg) {
1098-
let newImg = curImg.cloneNode(true);
1099-
newImg.id = 'comfy_save_image_img';
1100-
newImg.style.maxWidth = '100%';
1101-
newImg.removeAttribute('width');
1102-
newImg.removeAttribute('height');
1103-
saveImageSection.appendChild(newImg);
1104-
enableImage.checked = true;
1105-
enableImage.disabled = false;
1108+
let curImg = currentImageHelper.getCurrentImage();
1109+
comfyWorkflowHelpers.enableImageElem.checked = false;
1110+
let run = () => {
1111+
triggerChangeFor(comfyWorkflowHelpers.enableImageElem);
1112+
$('#comfy_workflow_save_modal').modal('show');
1113+
};
1114+
if (curImg && curImg.tagName == 'IMG') {
1115+
setMediaFileDirect(comfyWorkflowHelpers.imageElem, curImg.src, 'image', 'cur', 'cur', () => {
1116+
comfyWorkflowHelpers.enableImageElem.checked = false;
1117+
run();
1118+
});
11061119
}
11071120
else {
1108-
enableImage.checked = false;
1109-
enableImage.disabled = true;
1121+
run();
11101122
}
1111-
$('#comfy_workflow_save_modal').modal('show');
11121123
}
11131124

11141125
function comfyLoadByName(name) {
@@ -1161,45 +1172,56 @@ function comfySaveModalSaveNow() {
11611172
}
11621173
saveName = match.value;
11631174
}
1164-
let image = null;
1165-
if (getRequiredElementById('comfy_save_use_image').checked) {
1166-
image = imageToSmallPreviewData(getRequiredElementById('comfy_save_image').getElementsByTagName('img')[0]);
1167-
}
1168-
$('#comfy_workflow_save_modal').modal('hide');
1169-
comfyNoticeMessage("Saving...");
1170-
comfyBuildParams(false, (params, prompt_text, retained, paramVal, workflow) => {
1171-
params = JSON.parse(JSON.stringify(params));
1172-
delete params.comfyworkflowparammetadata;
1173-
delete params.comfyworkflowraw;
1174-
let description = getRequiredElementById('comfy_save_description').value;
1175-
let simpleTab = getRequiredElementById('comfy_save_enable_simple').checked;
1176-
for (let node of workflow.nodes) {
1177-
if (node.type == 'SwarmWorkflowDescription') {
1178-
console.log(node);
1179-
description = node.widgets_values[0];
1180-
simpleTab = node.widgets_values[1];
1181-
break;
1182-
}
1183-
}
1184-
let inputs = {
1185-
'name': saveName,
1186-
'description': description,
1187-
'enable_in_simple': simpleTab,
1188-
'workflow': JSON.stringify(workflow),
1189-
'prompt': prompt_text,
1190-
'custom_params': params,
1191-
'param_values': paramVal,
1192-
'image': image,
1193-
'replace': getRequiredElementById('comfy_save_modal_replace').value
1194-
};
1195-
genericRequest('ComfySaveWorkflow', inputs, (data) => {
1196-
comfyNoticeMessage("Saved!");
1197-
comfyReconfigureQuickload();
1198-
if (comfyWorkflowBrowser.everLoaded) {
1199-
comfyWorkflowBrowser.refresh();
1175+
let doSave = (image) => {
1176+
$('#comfy_workflow_save_modal').modal('hide');
1177+
comfyNoticeMessage("Saving...");
1178+
comfyBuildParams(false, (params, prompt_text, retained, paramVal, workflow) => {
1179+
params = JSON.parse(JSON.stringify(params));
1180+
delete params.comfyworkflowparammetadata;
1181+
delete params.comfyworkflowraw;
1182+
let description = getRequiredElementById('comfy_save_description').value;
1183+
let simpleTab = getRequiredElementById('comfy_save_enable_simple').checked;
1184+
for (let node of workflow.nodes) {
1185+
if (node.type == 'SwarmWorkflowDescription') {
1186+
description = node.widgets_values[0];
1187+
simpleTab = node.widgets_values[1];
1188+
break;
1189+
}
12001190
}
1191+
let inputs = {
1192+
'name': saveName,
1193+
'description': description,
1194+
'enable_in_simple': simpleTab,
1195+
'workflow': JSON.stringify(workflow),
1196+
'prompt': prompt_text,
1197+
'custom_params': params,
1198+
'param_values': paramVal,
1199+
'image': image,
1200+
'replace': getRequiredElementById('comfy_save_modal_replace').value
1201+
};
1202+
genericRequest('ComfySaveWorkflow', inputs, (data) => {
1203+
comfyNoticeMessage("Saved!");
1204+
comfyReconfigureQuickload();
1205+
if (comfyWorkflowBrowser.everLoaded) {
1206+
comfyWorkflowBrowser.refresh();
1207+
}
1208+
});
12011209
});
1202-
});
1210+
};
1211+
if (comfyWorkflowHelpers.enableImageElem.checked) {
1212+
let imageVal = getInputVal(comfyWorkflowHelpers.imageElem);
1213+
if (imageVal) {
1214+
imageToData(imageVal, (dataURL) => {
1215+
doSave(dataURL);
1216+
}, true);
1217+
return;
1218+
}
1219+
else {
1220+
doSave('clear');
1221+
return;
1222+
}
1223+
}
1224+
doSave(null);
12031225
}
12041226

12051227
/** Cancel button in the Save modal. */

src/BuiltinExtensions/ComfyUIBackend/ComfyUIWebAPI.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using FreneticUtilities.FreneticExtensions;
1+
using FreneticUtilities.FreneticExtensions;
22
using FreneticUtilities.FreneticToolkit;
33
using Newtonsoft.Json.Linq;
44
using SwarmUI.Accounts;
@@ -38,7 +38,14 @@ public static async Task<JObject> ComfySaveWorkflow(Session session, string name
3838
Directory.CreateDirectory(Directory.GetParent(path).FullName);
3939
if (!string.IsNullOrWhiteSpace(image))
4040
{
41-
image = ImageFile.FromDataString(image).ToMetadataFormat();
41+
if (image == "clear")
42+
{
43+
image = null;
44+
}
45+
else
46+
{
47+
image = ImageFile.FromDataString(image).ToMetadataFormat();
48+
}
4249
}
4350
else if (ComfyUIBackendExtension.CustomWorkflows.ContainsKey(origPath))
4451
{

src/BuiltinExtensions/ComfyUIBackend/Tabs/Text2Image/Comfy Workflow.html

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,7 @@ <h5 class="modal-title translate">Save Custom Comfy Workflow</h5>
5353
<input class="form-check-input translate" type="checkbox" id="comfy_save_enable_simple" title="Enable this workflow in the Simple tab"> Enable In Simple Tab
5454
</span>
5555
<br>
56-
<span class="form-check form-switch display-inline-block translate">
57-
<input class="form-check-input translate" type="checkbox" id="comfy_save_use_image" title="Enable/disable image"> Use Image
58-
</span>
59-
<div id="comfy_save_image" class="comfy_save_image"></div>
56+
<div id="comfy_save_image_block"></div>
6057
</div>
6158
<div class="modal-footer">
6259
<button type="button" class="btn btn-primary translate" onclick="comfySaveModalSaveNow()">Save Workflow</button>

0 commit comments

Comments
 (0)