137 lines
4.7 KiB
JavaScript
137 lines
4.7 KiB
JavaScript
/*
|
|
* SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* https://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
/**
|
|
* Graph Store - Base-level access to RTX Remix graph metadata.
|
|
*
|
|
* All RTX Remix data is stored under `app.graph.extra["rtx-remix"]`.
|
|
* This module provides the base metadata access and group order management.
|
|
*
|
|
* For preset-specific functions, see presetStore.js
|
|
*/
|
|
|
|
import { REMIX_KEYS, PRESET_KEYS } from "../utils/constants.js";
|
|
|
|
// ============================================================
|
|
// GRAPH METADATA (Base Level)
|
|
// ============================================================
|
|
|
|
/**
|
|
* Get graph-level RTX Remix metadata object (read-only).
|
|
* Returns an empty object if no metadata exists - does NOT create the structure.
|
|
* @param {Object} app - ComfyUI app instance
|
|
* @returns {Object} Graph-level metadata object or empty object
|
|
*/
|
|
export function getGraphMetadata(app) {
|
|
if (!app?.graph) return {};
|
|
return app.graph.extra?.[REMIX_KEYS.ROOT] || {};
|
|
}
|
|
|
|
/**
|
|
* Ensure graph-level RTX Remix metadata structure exists and return it.
|
|
* Creates the structure if it doesn't exist - use only when modifying metadata.
|
|
* @param {Object} app - ComfyUI app instance
|
|
* @returns {Object|null} Graph-level metadata object or null if no graph
|
|
*/
|
|
export function ensureGraphMetadata(app) {
|
|
if (!app?.graph) return null;
|
|
app.graph.extra = app.graph.extra || {};
|
|
app.graph.extra[REMIX_KEYS.ROOT] = app.graph.extra[REMIX_KEYS.ROOT] || {};
|
|
return app.graph.extra[REMIX_KEYS.ROOT];
|
|
}
|
|
|
|
/**
|
|
* Check if graph has any RTX Remix metadata.
|
|
* @param {Object} app - ComfyUI app instance
|
|
* @returns {boolean} True if metadata exists
|
|
*/
|
|
export function hasGraphMetadata(app) {
|
|
return !!app?.graph?.extra?.[REMIX_KEYS.ROOT];
|
|
}
|
|
|
|
/**
|
|
* Clear all RTX Remix metadata from the graph.
|
|
* @param {Object} app - ComfyUI app instance
|
|
*/
|
|
export function clearGraphMetadata(app) {
|
|
if (app?.graph?.extra?.[REMIX_KEYS.ROOT]) {
|
|
delete app.graph.extra[REMIX_KEYS.ROOT];
|
|
app.graph.setDirtyCanvas?.(true, true);
|
|
}
|
|
}
|
|
|
|
// ============================================================
|
|
// GROUP ORDER
|
|
// ============================================================
|
|
|
|
/**
|
|
* Get the group display order from graph-level metadata.
|
|
* @param {Object} app - ComfyUI app instance
|
|
* @returns {string[]} Array of group names in display order
|
|
*/
|
|
export function getGroupOrder(app) {
|
|
const meta = getGraphMetadata(app);
|
|
return meta[PRESET_KEYS.GROUP_ORDER] || [];
|
|
}
|
|
|
|
/**
|
|
* Set the group display order in graph-level metadata.
|
|
* Note: Caller should dispatch EVENTS.GROUP_ORDER_CHANGED if UI update is needed.
|
|
* @param {Object} app - ComfyUI app instance
|
|
* @param {string[]} groupOrder - Array of group names in display order
|
|
*/
|
|
export function setGroupOrder(app, groupOrder) {
|
|
const meta = ensureGraphMetadata(app);
|
|
if (!meta) return;
|
|
meta[PRESET_KEYS.GROUP_ORDER] = groupOrder;
|
|
app.graph.setDirtyCanvas?.(true, true);
|
|
app.graph.change?.();
|
|
}
|
|
|
|
// ============================================================
|
|
// WORKFLOW INFO
|
|
// ============================================================
|
|
|
|
/**
|
|
* Get the workflow display metadata from graph-level metadata.
|
|
* @param {Object} app - ComfyUI app instance
|
|
* @returns {{displayName: string, description: string, workflowType: string}} Workflow info
|
|
*/
|
|
export function getWorkflowInfo(app) {
|
|
const meta = getGraphMetadata(app);
|
|
return {
|
|
displayName: meta[REMIX_KEYS.WORKFLOW.DISPLAY_NAME] || "",
|
|
description: meta[REMIX_KEYS.WORKFLOW.DESCRIPTION] || "",
|
|
workflowType: meta[REMIX_KEYS.WORKFLOW.WORKFLOW_TYPE] || "",
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Set the workflow display metadata in graph-level metadata.
|
|
* @param {Object} app - ComfyUI app instance
|
|
* @param {{displayName: string, description: string, workflowType: string}} info - Workflow info
|
|
*/
|
|
export function setWorkflowInfo(app, { displayName, description, workflowType }) {
|
|
const meta = ensureGraphMetadata(app);
|
|
if (!meta) return;
|
|
meta[REMIX_KEYS.WORKFLOW.DISPLAY_NAME] = displayName;
|
|
meta[REMIX_KEYS.WORKFLOW.DESCRIPTION] = description;
|
|
meta[REMIX_KEYS.WORKFLOW.WORKFLOW_TYPE] = workflowType;
|
|
app.graph.setDirtyCanvas?.(true, true);
|
|
app.graph.change?.();
|
|
}
|