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:
+21
-20
@@ -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
|
||||
|
||||
@@ -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 = () => {
|
||||
|
||||
Reference in New Issue
Block a user