Publish current ComfyUI O1Key code baseline
Replace the prior release tree with the current plugin, frontend, tests, and documentation. Document retired node IDs and the public Gitea update source.
This commit is contained in:
@@ -0,0 +1,99 @@
|
||||
import { app } from "../../../scripts/app.js";
|
||||
|
||||
const NODE_TYPE = "O1keyPromptMultiFunction";
|
||||
const MODE_WIDGET = "功能";
|
||||
const SAMPLE_COUNT_WIDGET = "抽取数量";
|
||||
const SELECTED_INDICES_WIDGET = "指定序号";
|
||||
const RANDOM_MODES = new Set(["随机抽取n套", "随机抽取1套", "随机抽取多套"]);
|
||||
const SELECTED_MODE = "指定序号";
|
||||
|
||||
function findWidget(node, name) {
|
||||
return node.widgets?.find((widget) => widget.name === name);
|
||||
}
|
||||
|
||||
function setWidgetHidden(widget, hidden) {
|
||||
if (!widget || widget.__o1keyPromptMultiHidden === hidden) return false;
|
||||
widget.__o1keyPromptMultiHidden = hidden;
|
||||
widget.hidden = hidden;
|
||||
widget.options ??= {};
|
||||
widget.options.hidden = hidden;
|
||||
|
||||
if (!("__o1keyPromptMultiOriginalComputeSize" in widget)) {
|
||||
widget.__o1keyPromptMultiOriginalComputeSize = widget.computeSize ?? null;
|
||||
}
|
||||
if (hidden) {
|
||||
widget.computeSize = () => [0, -4];
|
||||
} else if (widget.__o1keyPromptMultiOriginalComputeSize) {
|
||||
widget.computeSize = widget.__o1keyPromptMultiOriginalComputeSize;
|
||||
} else {
|
||||
delete widget.computeSize;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function syncPromptMultiFunctionWidgets(node) {
|
||||
const modeWidget = findWidget(node, MODE_WIDGET);
|
||||
const sampleCountWidget = findWidget(node, SAMPLE_COUNT_WIDGET);
|
||||
const selectedIndicesWidget = findWidget(node, SELECTED_INDICES_WIDGET);
|
||||
if (!modeWidget || !sampleCountWidget || !selectedIndicesWidget) return;
|
||||
|
||||
const randomMode = RANDOM_MODES.has(modeWidget.value);
|
||||
const selectedMode = modeWidget.value === SELECTED_MODE;
|
||||
const countChanged = setWidgetHidden(sampleCountWidget, !randomMode);
|
||||
const indicesChanged = setWidgetHidden(selectedIndicesWidget, !selectedMode);
|
||||
if (countChanged || indicesChanged) node.setDirtyCanvas?.(true, true);
|
||||
}
|
||||
|
||||
function scheduleWidgetSync(node) {
|
||||
syncPromptMultiFunctionWidgets(node);
|
||||
requestAnimationFrame(() => syncPromptMultiFunctionWidgets(node));
|
||||
}
|
||||
|
||||
function guardNode(node) {
|
||||
if (node.__o1keyPromptMultiFunctionDynamic) return;
|
||||
if (!findWidget(node, MODE_WIDGET)
|
||||
|| !findWidget(node, SAMPLE_COUNT_WIDGET)
|
||||
|| !findWidget(node, SELECTED_INDICES_WIDGET)) return;
|
||||
node.__o1keyPromptMultiFunctionDynamic = true;
|
||||
|
||||
const bindModeWidget = () => {
|
||||
const modeWidget = findWidget(node, MODE_WIDGET);
|
||||
if (!modeWidget || modeWidget.__o1keyPromptMultiFunctionCallback) return;
|
||||
modeWidget.__o1keyPromptMultiFunctionCallback = true;
|
||||
const originalCallback = modeWidget.callback;
|
||||
modeWidget.callback = function () {
|
||||
const result = originalCallback?.apply(this, arguments);
|
||||
scheduleWidgetSync(node);
|
||||
return result;
|
||||
};
|
||||
};
|
||||
|
||||
const originalOnConfigure = node.onConfigure;
|
||||
node.onConfigure = function () {
|
||||
const result = originalOnConfigure?.apply(this, arguments);
|
||||
bindModeWidget();
|
||||
scheduleWidgetSync(this);
|
||||
return result;
|
||||
};
|
||||
|
||||
bindModeWidget();
|
||||
scheduleWidgetSync(node);
|
||||
}
|
||||
|
||||
function isTargetNode(node) {
|
||||
return node?.comfyClass === NODE_TYPE || node?.type === NODE_TYPE;
|
||||
}
|
||||
|
||||
app.registerExtension({
|
||||
name: "o1key.promptMultiFunctionDynamic",
|
||||
|
||||
nodeCreated(node) {
|
||||
if (isTargetNode(node)) guardNode(node);
|
||||
},
|
||||
|
||||
loadedGraphNode(node) {
|
||||
if (!isTargetNode(node)) return;
|
||||
guardNode(node);
|
||||
scheduleWidgetSync(node);
|
||||
},
|
||||
});
|
||||
Reference in New Issue
Block a user