Compare commits

...
23 Commits
Author SHA1 Message Date
shadow c5392aa237 Merge pull request #441 from Creepybits/main
Fix: Correct scheduler input on StyleAligned Sample Reference Latents node
2026-06-04 15:37:37 +08:00
shadow 16a2b55fa1 Merge pull request #462 from LordTaylor/fix/dragdrop-preventdefault-swallows-workflow-drop
Fix: drop handler swallows all drops and breaks ComfyUI native drag&drop
2026-06-04 15:36:43 +08:00
LordTaylorandClaude Opus 4.8 b423b09ff3 Fix: don't swallow non-JSON drops, restoring ComfyUI native drag&drop
The document 'drop' listener called event.preventDefault() and
stopPropagation() unconditionally on every drop. ComfyUI's native
drag&drop handler bails when event.defaultPrevented is already true, so
dropping any workflow file (PNG/JSON/webp) onto the canvas silently did
nothing as long as Mixlab was installed.

Scope preventDefault()/stopPropagation() to the application/json case
actually handled here, so all other drops fall through to ComfyUI.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-30 23:25:58 +02:00
Creepybits e66add88cb Update Style.py
Fix: 
Correct scheduler input on StyleAligned Sample Reference Latents node

Description:
The scheduler input for the StyleAligned Sample Reference Latents node was defined using a .reverse() method, which caused it to register as an invalid input type that could not accept connections.

This commit changes the input from a broken socket to a dropdown widget, making it consistent with the StyleAligned Reference Sampler node and allowing it to function as intended.
2025-10-03 00:26:06 +02:00
shadow 32b22c39cb Merge pull request #411 from ComfyNodePRs/update-publish-yaml
Update Github Action for Publishing to Comfy Registry
2025-07-22 09:44:28 +08:00
shadow 259baac177 Merge pull request #430 from torzdf/main
Bugfix: Give EditMask temp files unique filenames
2025-07-22 09:44:03 +08:00
torzdf 67ef8c13a8 Bugfix: Give EditMask temp files unique filenames 2025-07-01 00:50:43 +01:00
shadow b2bb1876de Merge pull request #393 from wengxiaoxiong/main
fix: Pillow 10.0.0+ compatibility
2025-02-05 18:24:45 +08:00
wengxiaoxiong cda4e626e7 fix: fix 'FreeTypeFont' object has no attribute 'getsize' 2025-02-01 15:33:24 +08:00
shadow d835aff0cb Merge pull request #391 from TangYanxin/main
Solve the problem that there are two duplicate badges on the node
2025-01-25 10:35:15 +08:00
snomiao 21e1967c5e chore(publish): update GitHub Actions workflow for node publishing
- Add permissions for writing issues
- Update action version to v1 for publish-node-action
- Add condition to run job only for specific repository owner
2025-01-20 21:29:05 +00:00
唐焱鑫 c9b5baf4d9 Update ui_mixlab.js: if ComfyUI already comes with a badge, don't add a new badge. 2025-01-15 01:16:48 +08:00
shadow 67c974c96e Merge pull request #374 from hieuck/fix-module-'PIL.Image'-has-no-attribute-'ANTIALIAS'
- **Exception Message:** module 'PIL.Image' has no attribute 'ANTIALIAS'
2024-11-26 19:59:58 +08:00
Lê Trung Hiếu b46ccb03c9 Update ImageNode.py 2024-11-26 07:10:48 +07:00
shadow 0ecf98e08b Merge pull request #361 from shiertier/main
fix GFW block cdn.jsdelivr.net
2024-11-21 09:40:33 +08:00
shiertier f024034724 do not perform get object in init 2024-11-01 12:48:48 +08:00
shiertier 327a21f009 Merge pull request #1 from dionren/main
fix GFW block cdn.jsdelivr.net
2024-11-01 00:47:50 +08:00
任嘉 cfc51532b8 fix GFW block wavesurfer.esm.js 2024-10-27 22:03:48 +08:00
任嘉 00988f92e4 fix GFW block cdn.jsdelivr.net
Add wavesurfer.esm.js
2024-10-27 22:02:13 +08:00
shadowcz007 868c6085a8 Update extension-node-map.json 2024-10-25 14:24:39 +08:00
shadowcz007 a47a56bda0 Update ImageNode.py 2024-10-21 08:31:05 +08:00
shadowcz007 3667b42b2f Update ImageNode.py 2024-10-21 08:28:11 +08:00
shadowcz007 7d142d7d62 Update extension-node-map.json 2024-10-19 11:53:10 +08:00
9 changed files with 924 additions and 147 deletions
+6 -2
View File
@@ -7,15 +7,19 @@ on:
paths:
- "pyproject.toml"
permissions:
issues: write
jobs:
publish-node:
name: Publish Custom Node to registry
runs-on: ubuntu-latest
if: ${{ github.repository_owner == 'shadowcz007' }}
steps:
- name: Check out code
uses: actions/checkout@v4
- name: Publish Custom Node
uses: Comfy-Org/publish-node-action@main
uses: Comfy-Org/publish-node-action@v1
with:
## Add your own personal access token to your Github Repository secrets and reference it here.
personal_access_token: ${{ secrets.REGISTRY_ACCESS_TOKEN }}
personal_access_token: ${{ secrets.REGISTRY_ACCESS_TOKEN }}
File diff suppressed because it is too large Load Diff
+22 -10
View File
@@ -123,8 +123,13 @@ def composite_images(foreground, background, mask, is_multiply_blend=False, posi
}
# Resize the foreground image with antialiasing
layer_image = layer['image'].resize((layer['width'], layer['height']), Image.ANTIALIAS)
layer_mask = layer['mask'].resize((layer['width'], layer['height']), Image.ANTIALIAS)
try:
resampling_method = Image.Resampling.LANCZOS
except AttributeError:
resampling_method = Image.ANTIALIAS
layer_image = layer['image'].resize((layer['width'], layer['height']), resampling_method)
layer_mask = layer['mask'].resize((layer['width'], layer['height']), resampling_method)
bg_image.paste(layer_image, (layer['x'], layer['y']), layer_mask)
@@ -1041,29 +1046,33 @@ def generate_text_image(text,
if layout == "vertical":
for line in lines:
max_char_width = max(font.getsize(char)[0] for char in line)
max_char_width = max(font.getbbox(char)[2] - font.getbbox(char)[0] for char in line)
for char in line:
char_width, char_height = font.getsize(char)
left, top, right, bottom = font.getbbox(char)
char_width = right - left
char_height = bottom - top
char_coordinates.append((x, y))
y += char_height + spacing
max_height = max(max_height, y + padding)
x += max_char_width + line_spacing
y = padding
max_width = x
total_line_width = sum(font.getsize(line)[1] for line in lines)
total_line_width = sum(font.getbbox(line)[2] - font.getbbox(line)[0] for line in lines)
total_spacing = line_spacing * (len(lines) - 1)
max_width = total_line_width + total_spacing + padding * 2
else:
for line in lines:
line_width, line_height = font.getsize(line)
line_width, line_height = font.getbbox(line)[2] - font.getbbox(line)[0], font.getbbox(line)[3] - font.getbbox(line)[1]
for char in line:
char_width, char_height = font.getsize(char)
left, top, right, bottom = font.getbbox(char)
char_width = right - left
char_height = bottom - top
char_coordinates.append((x, y))
x += char_width + spacing
max_width = max(max_width, x + padding)
y += line_height + line_spacing
x = padding
total_line_heights = sum(font.getsize(line)[1] for line in lines)
total_line_heights = sum(font.getbbox(line)[3] - font.getbbox(line)[1] for line in lines)
total_spacing = line_spacing * (len(lines) - 1)
max_height = total_line_heights + total_spacing + padding * 2
@@ -2951,11 +2960,14 @@ class ResizeImage:
im=tensor2pil(im)
im=im.convert('RGB')
a_im,hex=get_average_color_image(im)
a_im,hex=get_average_color_image(im)
if average_color=='on':
fill_color=hex
a_im=resize_image(a_im,scale_option,w,h,fill_color)
im=resize_image(im,scale_option,w,h,fill_color)
im=pil2tensor(im)
+1 -1
View File
@@ -234,7 +234,7 @@ class StyleAlignedSampleReferenceLatents:
"steps": ("INT", {"default": 20, "min": 1, "max": 10000}),
"cfg": ("FLOAT", {"default": 8.0, "min": 0.0, "max": 100.0, "step":0.1, "round": 0.01}),
"scheduler": (comfy.samplers.KSampler.SCHEDULERS.reverse(), ),
"scheduler": (comfy.samplers.KSampler.SCHEDULERS, ),
"denoise": ("FLOAT", {"default": 1, "min": 0.0, "max": 1.0, "step": 0.01}),
}
+6 -4
View File
@@ -7,6 +7,7 @@ import os
import folder_paths
import node_helpers
import hashlib
from uuid import uuid4
# Tensor to PIL
def tensor2pil(image):
@@ -26,7 +27,7 @@ def tensor_to_hash(tensor):
return hash_value
def create_temp_file(image):
def create_temp_file(image, uuid):
output_dir = folder_paths.get_temp_directory()
(
@@ -35,7 +36,7 @@ def create_temp_file(image):
counter,
subfolder,
_,
) = folder_paths.get_save_image_path('material', output_dir)
) = folder_paths.get_save_image_path(f'material_{uuid}', output_dir)
image=tensor2pil(image)
@@ -59,6 +60,7 @@ class EditMask:
def __init__(self):
self.image_id = None
self.uuid = str(uuid4())
@classmethod
def INPUT_TYPES(s):
@@ -117,13 +119,13 @@ class EditMask:
image_path = os.path.join(base_dir,subfolder, name)
if image_path==None:
image_path,images=create_temp_file(image)
image_path,images=create_temp_file(image, self.uuid)
print('#image_path',os.path.exists(image_path),image_path)
# image_path = folder_paths.get_annotated_filepath(image) #文件名
if not os.path.exists(image_path):
image_path,images=create_temp_file(image)
image_path,images=create_temp_file(image, self.uuid)
img = node_helpers.pillow(Image.open, image_path)
+10 -4
View File
@@ -267,7 +267,13 @@ function downloadJsonFile (jsonData, fileName = 'mix_app.json') {
}
async function save (json, download = false, showInfo = true) {
let nodesAll = window._nodesAll || (await getObjectInfo())
if (!window._nodesAll) {
window._nodesAll = await getObjectInfo();
}
let nodesAll = window._nodesAll;
// let nodesAll = window._nodesAll || (await getObjectInfo())
console.log('####SAVE', nodesAll, json)
@@ -417,9 +423,9 @@ function getInputsAndOutputs () {
app.registerExtension({
name: 'Mixlab.utils.AppInfo',
init () {
if (!window._nodesAll) {
getObjectInfo().then(r => (window._nodesAll = r))
}
// if (!window._nodesAll) {
// getObjectInfo().then(r => (window._nodesAll = r))
// }
},
async beforeRegisterNodeDef (nodeType, nodeData, app) {
if (nodeType.comfyClass == 'AppInfo') {
+1 -1
View File
@@ -3,7 +3,7 @@ import { api } from '../../../scripts/api.js'
import { ComfyWidgets } from '../../../scripts/widgets.js'
import { $el } from '../../../scripts/ui.js'
import WaveSurfer from 'https://cdn.jsdelivr.net/npm/wavesurfer.js@7/dist/wavesurfer.esm.js'
import WaveSurfer from './wavesurfer.esm.js'
function get_position_style (ctx, widget_width, y, node_height) {
const MARGIN = 4 // the margin around the html element
+10 -4
View File
@@ -1735,14 +1735,16 @@ app.registerExtension({
// 把json往里 拖
document.addEventListener('drop', async event => {
event.preventDefault()
event.stopPropagation()
// Dragging from Chrome->Firefox there is a file but its a bmp, so ignore that
// Only intercept the JSON files handled here. Calling preventDefault()
// unconditionally swallowed every drop, so ComfyUI's native drag&drop
// (guarded by event.defaultPrevented) never loaded dropped workflows
// (PNG / JSON / etc.). Keep preventDefault scoped to the handled case.
if (
event.dataTransfer.files.length &&
event.dataTransfer.files[0].type == 'application/json'
) {
event.preventDefault()
event.stopPropagation()
const reader = new FileReader()
reader.onload = async () => {
loadAppJson(reader.result)
@@ -2171,6 +2173,10 @@ app.registerExtension({
fetch('manager/badge_mode').then(r => {
if (r.status === 404) {
// 已有ComfyUI自带的badge
if(node.badges?.[0]?.()){
return
}
// 右上角的badge是否已经绘制
if (!node.badge_enabled) {
if (!node.getNickname) {
File diff suppressed because one or more lines are too long