Refactor: Strict folder_mode-based logic with auto-switch

Changes:
- folder_mode=True: Always use folder_path for random selection
- folder_mode=False: Always use file picker (image_data)
- Auto-switch: File picker automatically sets folder_mode=False

Behavior:
- User clicks 📁 Choose File → auto-switches to Single mode
- folder_mode toggle explicitly controls which input to use
- No more auto-detection ambiguity
- Clear separation between modes

Benefits:
- Predictable behavior based on folder_mode setting
- File picker prioritized by auto-switching to Single mode
- User can maintain folder_path while using file picker
- Cleaner error messages for each mode
This commit is contained in:
solidlime
2026-01-07 21:31:15 +09:00
parent 4a13a9f827
commit b5f185447d
2 changed files with 29 additions and 29 deletions
+21 -20
View File
@@ -131,18 +131,23 @@ class RandomImagePicker:
Load image based on mode settings.
Args:
folder_path: Folder path for random selection
folder_mode: True for explicit folder mode, False for auto-detect
folder_path: Folder path for random selection (used when folder_mode=True)
folder_mode: True=Folder random selection, False=File picker
include_subfolders: Whether to scan subfolders
seed: Random seed for folder mode
image_data: Base64 encoded image data from file picker
image_data: Base64 encoded image data from file picker (used when folder_mode=False)
Returns:
Tuple of (image_tensor, width, height)
"""
# Priority 1: Check if folder_path is valid (works for both modes)
if folder_path and os.path.exists(folder_path) and os.path.isdir(folder_path):
# Use folder mode (random selection)
if folder_mode:
# Folder mode: random selection from folder_path
if not folder_path or not os.path.exists(folder_path):
raise ValueError(f"Folder mode is enabled but folder_path is invalid: {folder_path}")
if not os.path.isdir(folder_path):
raise ValueError(f"Folder mode requires a directory path, not a file: {folder_path}")
image_files = self.get_image_files(folder_path, include_subfolders)
if not image_files:
@@ -152,14 +157,18 @@ class RandomImagePicker:
random.seed(seed)
selected_image = random.choice(image_files)
mode_str = "Folder Mode" if folder_mode else "Auto (from folder_path)"
print(f"[Random Image Picker] Mode: {mode_str}")
print(f"[Random Image Picker] Mode: Folder")
print(f"[Random Image Picker] Folder: {folder_path}")
print(f"[Random Image Picker] Selected: {selected_image}")
return self.load_image_file(selected_image)
# Priority 2: Use file picker data if available
if image_data:
else:
# Single file mode: use file picker (image_data)
if not image_data:
raise ValueError(
"Single file mode is enabled but no image selected.\n\n"
"Please use the 📁 Choose File button to select an image."
)
import base64
import io
@@ -185,20 +194,12 @@ class RandomImagePicker:
# Convert to torch tensor and add batch dimension
img_tensor = torch.from_numpy(img_array)[None,]
print(f"[Random Image Picker] Mode: File Picker")
print(f"[Random Image Picker] Mode: Single (File Picker)")
print(f"[Random Image Picker] Loaded: {width}x{height}")
return (img_tensor, width, height)
except Exception as e:
raise ValueError(f"Failed to load image from file picker: {str(e)}")
# No valid input provided
raise ValueError(
"No valid input provided.\n\n"
"Please either:\n"
"1. Enter a folder path in 'folder_path' field, OR\n"
"2. Use the 📁 Choose File button to select an image"
)
# Node registration
+8 -9
View File
@@ -13,14 +13,6 @@ app.registerExtension({
// Add file picker button
node.addWidget("button", "📁 Choose File", null, () => {
const folderModeWidget = node.widgets.find(w => w.name === "folder_mode");
const isFolderMode = folderModeWidget?.value || false;
if (isFolderMode) {
alert("⚠️ Folder Mode is enabled.\n\nPlease switch to Single mode to use the file picker,\nor enter the folder path in the 'folder_path' field above.");
return;
}
const input = document.createElement("input");
input.type = "file";
input.accept = "image/png,image/jpeg,image/jpg,image/webp,image/bmp,image/gif";
@@ -29,6 +21,13 @@ app.registerExtension({
if (e.target.files && e.target.files[0]) {
const file = e.target.files[0];
// Automatically switch to Single mode (folder_mode = False)
const folderModeWidget = node.widgets.find(w => w.name === "folder_mode");
if (folderModeWidget) {
folderModeWidget.value = false;
console.log("[Random Image Picker] Switched to Single mode");
}
// Read file as base64
const reader = new FileReader();
reader.onload = (event) => {
@@ -41,7 +40,7 @@ app.registerExtension({
}
console.log(`[Random Image Picker] File loaded: ${file.name} (${(base64Data.length / 1024).toFixed(2)} KB)`);
alert(`✅ Image loaded successfully!\n\nFile: ${file.name}\nSize: ${(file.size / 1024).toFixed(2)} KB\n\nYou can now run the workflow.`);
alert(`✅ Image loaded successfully!\n\nFile: ${file.name}\nSize: ${(file.size / 1024).toFixed(2)} KB\n\nMode: Automatically switched to Single\n\nYou can now run the workflow.`);
};
reader.onerror = () => {