142 lines
5.1 KiB
JavaScript
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);
|
|
}
|
|
}); |