Files
chyer-Chye-ComfyUI-Toolset/web/comfyui/text_file_loader.js
T

142 lines
5.1 KiB
JavaScript

import { app } from "../../scripts/app.js";
import { api } from "../../scripts/api.js";
import { ComfyWidgets } from "../../scripts/widgets.js";
import { RgthreeBetterButtonWidget } from "./utils_widgets.js";
import { rgthree } from "./rgthree.js";
class CYHTextFileLoaderNode extends LGraphNode {
constructor(title = "CYH Text File Loader") {
super(title);
this.comfyClass = "CYHTextFileLoader";
this.serialize_widgets = true;
}
onNodeCreated() {
// Add a button widget for loading files
this.addWidget("button", "📁 Browse Files", "", () => {
this.handleFileBrowse();
}, { serialize: false });
// Add a reload button
this.addWidget("button", "🔄 Reload File", "", () => {
this.handleReload();
}, { serialize: false });
}
async handleFileBrowse() {
try {
// Use ComfyUI's file browser API
const filePath = await app.openFileBrowser("text");
if (filePath) {
// Update the file path widget
const filePathWidget = this.widgets.find(w => w.name === "file_path");
if (filePathWidget) {
filePathWidget.value = filePath;
this.onWidgetChanged?.(filePathWidget);
}
// Trigger file loading
await this.handleReload();
}
} catch (error) {
console.error("Error browsing files:", error);
}
}
async handleReload() {
try {
// Get the current file path
const filePathWidget = this.widgets.find(w => w.name === "file_path");
if (!filePathWidget || !filePathWidget.value) {
console.warn("No file path specified");
return;
}
// Call the backend API to load the file
const response = await api.fetchApi("/chye/text_file_loader/load", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
file_path: filePathWidget.value
})
});
if (response.ok) {
const result = await response.json();
console.log("File loaded successfully:", result);
if (result.success) {
// Update the text content widget if it exists
const textWidget = this.widgets.find(w => w.name === "editable_text");
if (textWidget && result.content) {
textWidget.value = result.content;
this.onWidgetChanged?.(textWidget);
}
// Trigger node execution
this.triggerExecution();
} else {
console.error("Failed to load file:", result.error);
// Show error in the text widget if possible
const textWidget = this.widgets.find(w => w.name === "editable_text");
if (textWidget) {
textWidget.value = `Error: ${result.error}`;
this.onWidgetChanged?.(textWidget);
}
}
} else {
const errorText = await response.text();
console.error("Failed to load file:", errorText);
// Show error in the text widget if possible
const textWidget = this.widgets.find(w => w.name === "editable_text");
if (textWidget) {
textWidget.value = `HTTP Error: ${response.status} - ${errorText}`;
this.onWidgetChanged?.(textWidget);
}
}
} catch (error) {
console.error("Error reloading file:", error);
}
}
triggerExecution() {
// Force the node to be marked as changed to trigger execution
this.setDirtyCanvas(true, true);
// If the node has outputs, trigger connected nodes
if (this.outputs && this.outputs.length > 0) {
this.triggerSlot(0);
}
}
onWidgetChanged(widget) {
// Handle widget changes
if (widget.name === "file_path") {
// File path changed, we might want to auto-reload
this.handleReload();
}
}
}
// Register the extension
app.registerExtension({
name: "Chye.TextFileLoader",
async beforeRegisterNodeDef(nodeType, nodeData) {
if (nodeData.name === "CYHTextFileLoader") {
// Replace the default implementation with our custom one
LiteGraph.registerNodeType("CYHTextFileLoader", CYHTextFileLoaderNode);
}
},
});
// Also register for any existing nodes
app.graph._nodes.forEach(node => {
if (node.type === "CYHTextFileLoader" && !(node instanceof CYHTextFileLoaderNode)) {
const newNode = new CYHTextFileLoaderNode(node.title);
newNode.configure(node.serialize());
app.graph.replace(node, newNode);
}
});