Skip to content

Commit f4fdd51

Browse files
committed
feat(preview): disable Manager preview method when ComfyUI native feature is available
- Add detection for ComfyUI PR #11261 (per-queue preview override) - Return DISABLED status when native feature is detected - Improve UI loading state and prevent flash of enabled state - Add accessibility attributes and visual feedback for disabled state - Show user notification when feature transitions to native - Version bump to 3.39
1 parent ae6c7dd commit f4fdd51

File tree

4 files changed

+127
-8
lines changed

4 files changed

+127
-8
lines changed

glob/manager_core.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
from node_package import InstalledNodePackage
4545

4646

47-
version_code = [3, 38, 3]
47+
version_code = [3, 39]
4848
version_str = f"V{version_code[0]}.{version_code[1]}" + (f'.{version_code[2]}' if len(version_code) > 2 else '')
4949

5050

glob/manager_server.py

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,25 @@
3838

3939
routes = PromptServer.instance.routes
4040

41+
42+
def has_per_queue_preview():
43+
"""
44+
Check if ComfyUI PR #11261 (per-queue live preview override) is merged
45+
46+
Returns:
47+
bool: True if ComfyUI has per-queue preview feature
48+
"""
49+
try:
50+
import latent_preview
51+
return hasattr(latent_preview, 'set_preview_method')
52+
except ImportError:
53+
return False
54+
55+
56+
# Detect ComfyUI per-queue preview override feature (PR #11261)
57+
COMFYUI_HAS_PER_QUEUE_PREVIEW = has_per_queue_preview()
58+
59+
4160
def handle_stream(stream, prefix):
4261
stream.reconfigure(encoding=locale.getpreferredencoding(), errors='replace')
4362
for msg in stream:
@@ -182,10 +201,19 @@ def set_preview_method(method):
182201
core.get_config()['preview_method'] = method
183202

184203

185-
if args.preview_method == latent_preview.LatentPreviewMethod.NoPreviews:
204+
if COMFYUI_HAS_PER_QUEUE_PREVIEW:
205+
logging.info(
206+
"[ComfyUI-Manager] ComfyUI per-queue preview override detected (PR #11261). "
207+
"Manager's preview method feature is disabled. "
208+
"Use ComfyUI's --preview-method CLI option or 'Settings > Execution > Live preview method'."
209+
)
210+
elif args.preview_method == latent_preview.LatentPreviewMethod.NoPreviews:
186211
set_preview_method(core.get_config()['preview_method'])
187212
else:
188-
logging.warning("[ComfyUI-Manager] Since --preview-method is set, ComfyUI-Manager's preview method feature will be ignored.")
213+
logging.warning(
214+
"[ComfyUI-Manager] Since --preview-method is set, "
215+
"ComfyUI-Manager's preview method feature will be ignored."
216+
)
189217

190218

191219
def set_component_policy(mode):
@@ -1482,13 +1510,25 @@ async def install_model(request):
14821510

14831511
@routes.get("/manager/preview_method")
14841512
async def preview_method(request):
1513+
# Setting change request
14851514
if "value" in request.rel_url.query:
1515+
# Reject setting change if per-queue preview feature is available
1516+
if COMFYUI_HAS_PER_QUEUE_PREVIEW:
1517+
return web.Response(text="DISABLED", status=403)
1518+
1519+
# Process normally if not available
14861520
set_preview_method(request.rel_url.query['value'])
14871521
core.write_config()
1522+
return web.Response(status=200)
1523+
1524+
# Status query request
14881525
else:
1489-
return web.Response(text=core.manager_funcs.get_current_preview_method(), status=200)
1526+
# Return DISABLED if per-queue preview feature is available
1527+
if COMFYUI_HAS_PER_QUEUE_PREVIEW:
1528+
return web.Response(text="DISABLED", status=200)
14901529

1491-
return web.Response(status=200)
1530+
# Return current value if not available
1531+
return web.Response(text=core.manager_funcs.get_current_preview_method(), status=200)
14921532

14931533

14941534
@routes.get("/manager/db_mode")

js/comfyui-manager.js

Lines changed: 81 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -976,17 +976,96 @@ class ManagerMenuDialog extends ComfyDialog {
976976
let preview_combo = document.createElement("select");
977977
preview_combo.setAttribute("title", "Configure how latent variables will be decoded during preview in the sampling process.");
978978
preview_combo.className = "cm-menu-combo p-select p-component p-inputwrapper p-inputwrapper-filled";
979+
980+
// Loading state to prevent flash of enabled state
981+
preview_combo.appendChild($el('option', { value: '', text: 'Loading...', disabled: true }, []));
979982
preview_combo.appendChild($el('option', { value: 'auto', text: 'Auto' }, []));
980983
preview_combo.appendChild($el('option', { value: 'taesd', text: 'TAESD (slow)' }, []));
981984
preview_combo.appendChild($el('option', { value: 'latent2rgb', text: 'Latent2RGB (fast)' }, []));
982985
preview_combo.appendChild($el('option', { value: 'none', text: 'None (very fast)' }, []));
983986

987+
// Start disabled to prevent flash
988+
preview_combo.disabled = true;
989+
preview_combo.value = '';
990+
991+
// Fetch current state
984992
api.fetchApi('/manager/preview_method')
985993
.then(response => response.text())
986-
.then(data => { preview_combo.value = data; });
994+
.then(data => {
995+
// Remove loading option
996+
preview_combo.querySelector('option[value=""]')?.remove();
997+
998+
if (data === "DISABLED") {
999+
// ComfyUI per-queue preview feature is active
1000+
preview_combo.disabled = true;
1001+
preview_combo.value = 'auto';
1002+
1003+
// Accessibility attributes
1004+
preview_combo.setAttribute("aria-disabled", "true");
1005+
preview_combo.setAttribute("aria-label",
1006+
"Preview method setting (disabled - managed by ComfyUI). " +
1007+
"Use Settings > Execution > Live preview method instead."
1008+
);
1009+
1010+
// Tooltip for mouse users
1011+
preview_combo.setAttribute("title",
1012+
"This feature is now provided natively by ComfyUI. " +
1013+
"Please use 'Settings > Execution > Live preview method' instead."
1014+
);
1015+
1016+
// Visual feedback
1017+
preview_combo.style.opacity = '0.6';
1018+
preview_combo.style.cursor = 'not-allowed';
1019+
} else {
1020+
// Manager feature is active
1021+
preview_combo.disabled = false;
1022+
preview_combo.value = data;
1023+
1024+
// Accessibility for enabled state
1025+
preview_combo.setAttribute("aria-label",
1026+
"Preview method setting. Select how latent variables are decoded during preview."
1027+
);
1028+
}
1029+
})
1030+
.catch(error => {
1031+
console.error('[ComfyUI-Manager] Failed to fetch preview method status:', error);
1032+
// Error recovery: fallback to enabled
1033+
preview_combo.querySelector('option[value=""]')?.remove();
1034+
preview_combo.disabled = false;
1035+
preview_combo.value = 'auto';
1036+
});
9871037

9881038
preview_combo.addEventListener('change', function (event) {
989-
api.fetchApi(`/manager/preview_method?value=${event.target.value}`);
1039+
// Ignore if disabled
1040+
if (preview_combo.disabled) {
1041+
event.preventDefault();
1042+
return;
1043+
}
1044+
1045+
// Normal operation
1046+
api.fetchApi(`/manager/preview_method?value=${event.target.value}`)
1047+
.then(response => {
1048+
if (response.status === 403) {
1049+
// Feature transitioned to native
1050+
alert(
1051+
'This feature is now provided natively by ComfyUI.\n' +
1052+
'Please use \'Settings > Execution > Live preview method\' instead.'
1053+
);
1054+
preview_combo.disabled = true;
1055+
preview_combo.style.opacity = '0.6';
1056+
preview_combo.style.cursor = 'not-allowed';
1057+
1058+
// Update aria attributes
1059+
preview_combo.setAttribute("aria-disabled", "true");
1060+
preview_combo.setAttribute("aria-label",
1061+
"Preview method setting (disabled - managed by ComfyUI). " +
1062+
"Use Settings > Execution > Live preview method instead."
1063+
);
1064+
}
1065+
})
1066+
.catch(error => {
1067+
console.error('[ComfyUI-Manager] Preview method update failed:', error);
1068+
});
9901069
});
9911070

9921071
const previewSetttingItem = createSettingsCombo("Preview method", preview_combo);

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[project]
22
name = "comfyui-manager"
33
description = "ComfyUI-Manager provides features to install and manage custom nodes for ComfyUI, as well as various functionalities to assist with ComfyUI."
4-
version = "3.38.3"
4+
version = "3.39"
55
license = { file = "LICENSE.txt" }
66
dependencies = ["GitPython", "PyGithub", "matrix-nio", "transformers", "huggingface-hub>0.20", "typer", "rich", "typing-extensions", "toml", "uv", "chardet"]
77

0 commit comments

Comments
 (0)