From 6e650d672644bd3c9b5faa172e7afcab8e7ec470 Mon Sep 17 00:00:00 2001 From: kk8bit Date: Fri, 21 Mar 2025 01:13:09 +0800 Subject: [PATCH] v0.31.0 --- CHANGELOG.md | 27 +++++++++-------- README.md | 9 ++++++ __init__.py | 75 ++++++++++++++++++++++++++++++++++++------------ logo.png | Bin 0 -> 6764 bytes pyproject.toml | 4 +-- settings.json | 5 ++++ web/settings.js | 67 ++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 155 insertions(+), 32 deletions(-) create mode 100644 logo.png create mode 100644 settings.json diff --git a/CHANGELOG.md b/CHANGELOG.md index a091ba6..2cb0940 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,10 @@ # Changelog -## [0.36.7] - 2025-03-20 -### Added +## [0.31.0] - 2025-03-20 +- 增加自定义ComfyUI logo功能 + +## [0.30.7] - 2025-03-20 + - 增加`image_composer`节点 - 增加`image_cropper`节点 - 增加`image_resizer`节点 @@ -11,21 +14,21 @@ ## [0.26.3] - 2025-03-12 -### Added + - 增加Load Image Folder节点 - 增加`remove bg` `mask blur plus` `mask preview plus`节点的invert mask功能 ## [0.25.1] - 2025-03-12 -### Added + - 增加节点右键菜单 Run 功能(快速对节点调试) - 增加组右键菜单 Run 功能(快速对组节点调试) ## [0.21.0] - 2025-03-02 -### Added + - 增加BiRefNet ## [0.20.0] - 2025-02-27 -### Added + - 增加AIO翻译节点 - 增加RemBG背景移除节点组 @@ -43,7 +46,7 @@ - 增加部分节点的数据显示功能 ## [0.9.0] - 2025-02-24 -### Added + - 增加腾讯AI翻译节点 Add Tencent AI translation nod e @@ -52,7 +55,7 @@ ## [0.7.0] - 2025-01-19 -### Added + - 增加abc数学 abc Math 节点,支持多种数学运算。 Added the abc Math node, supporting various mathematical operations. @@ -61,7 +64,7 @@ ## [0.3.6] - 2025-01-18 -### Added + - 增加大壮提示词 Strong Prompt 节点,支持负向提示词零化功能以及预设样式编辑与导入。 Added the Strong Prompt node, supporting negative prompt nullification and preset style editing and importing. - 增加百度AI翻译 Baidu Translater 节点,支持双文本翻译、自动检测语言及百度API配置。 @@ -79,14 +82,14 @@ --- ## [0.1.3] - 2024-10-23 -### Added + - 色彩调节节点中增加滤镜强度调节。 Added filter intensity adjustment in the Color Adjustment node. --- ## [0.1.2] - 2024-10-23 -### Added + - 增加色彩调节节点。 Added the Color Adjustment node. - 支持模拟相机曝光调节、对比度、色温、色调、饱和度调节。 @@ -99,7 +102,7 @@ --- ## [0.0.1] - 2024-10-19 -### Added + - 创建自定义保存图像节点。 Created the Custom SaveImage node. - 支持保存为 PNG 和 JPG 格式。 diff --git a/README.md b/README.md index d36568d..6e8da62 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,15 @@ This is a custom node utility package developed for ComfyUI. Initially created f **📌 所有 KayTool 节点包用到的资源都在 `ComfyUI/custom_nodes/kaytool` 文件夹内。| All KayTool node packages use resources in the `ComfyUI/custom_nodes/kaytool` folder.** + +### 自定义ComfyUI Logo功能 Custom ComfyUI Logo +- 在设置菜单中(KayTool)自定义 ComfyUI 的 Logo,支持 PNG、JPG、JPEG 格式。 + Customize the ComfyUI Logo in the settings menu (KayTool), supporting PNG, JPG, and JPEG formats. +- 将 LOGO 文件重命名为“logo.(png/jpg/jpeg/ico)”并将其放置在“/ComfyUI/custom_nodes/kaytool”文件夹。 + Rename the LOGO file to "logo.(png/jpg/jpeg/ico)" and place it in "/ComfyUI/custom_nodes/kaytool" + +--- + ### 右键快速 Run 功能 Quick Run Options via Right-Click (Run Group/Node) - 右键点击节点组或节点,选择“Run Group/Node”,即可快速运行节点组或节点进行调试。 - Right-click on a node group or node, select "Run Group/Node," and quickly run the node group or node for debugging. diff --git a/__init__.py b/__init__.py index fd2a0f8..acfbf42 100644 --- a/__init__.py +++ b/__init__.py @@ -1,4 +1,6 @@ import os +import json +from aiohttp import web from .nodes.custom_save_image import CustomSaveImage from .nodes.color_adjustment import ColorAdjustment from .nodes.strong_prompt import StrongPrompt @@ -14,15 +16,15 @@ from .nodes.slider_100 import Slider100 from .nodes.slider_10 import Slider10 from .nodes.to_int import ToInt from .nodes.remove_bg import RemoveBG -from .nodes.rembg_loader import RemBGLoader -from .nodes.birefnet_loader import BiRefNetLoader +from .nodes.rembg_loader import RemBGLoader +from .nodes.birefnet_loader import BiRefNetLoader from .nodes.preview_mask import PreviewMask -from .nodes.mask_blur_plus import MaskBlurPlus +from .nodes.mask_blur_plus import MaskBlurPlus from .nodes.preview_mask_plus import PreviewMaskPlus -from .nodes.ab_images import ABImages -from .nodes.load_image_folder import LoadImageFolder -from .nodes.image_composer import ImageComposer -from .nodes.image_cropper import ImageCropper +from .nodes.ab_images import ABImages +from .nodes.load_image_folder import LoadImageFolder +from .nodes.image_composer import ImageComposer +from .nodes.image_cropper import ImageCropper from .nodes.image_resizer import ImageResizer from .nodes.mask_filler import MaskFiller @@ -42,15 +44,15 @@ NODE_CLASS_MAPPINGS = { "Slider_10": Slider10, "To_Int": ToInt, "Remove_BG": RemoveBG, - "RemBG_Loader": RemBGLoader, - "BiRefNet_Loader": BiRefNetLoader, + "RemBG_Loader": RemBGLoader, + "BiRefNet_Loader": BiRefNetLoader, "Preview_Mask": PreviewMask, - "Mask_Blur_Plus": MaskBlurPlus, + "Mask_Blur_Plus": MaskBlurPlus, "Preview_Mask_Plus": PreviewMaskPlus, "AB_Images": ABImages, "Load_Image_Folder": LoadImageFolder, - "Image_Composer": ImageComposer, - "Image_Cropper": ImageCropper, + "Image_Composer": ImageComposer, + "Image_Cropper": ImageCropper, "Image_Resizer": ImageResizer, "Mask_Filler": MaskFiller, } @@ -71,17 +73,54 @@ NODE_DISPLAY_NAME_MAPPINGS = { "Slider_10": "𝙆 Slider 10", "To_Int": "𝙆 To Int", "Remove_BG": "𝙆 Remove BG", - "RemBG_Loader": "𝙆 RemBG Loader", - "BiRefNet_Loader": "𝙆 BiRefNet Loader", + "RemBG_Loader": "𝙆 RemBG Loader", + "BiRefNet_Loader": "𝙆 BiRefNet Loader", "Preview_Mask": "𝙆 Preview Mask", - "Mask_Blur_Plus": "𝙆 Mask Blur +", + "Mask_Blur_Plus": "𝙆 Mask Blur +", "Preview_Mask_Plus": "𝙆 Preview Mask +", "AB_Images": "𝙆 ab Images", "Load_Image_Folder": "𝙆 Load Image Folder", - "Image_Composer": "𝙆 Image Composer", - "Image_Cropper": "𝙆 Image Cropper", + "Image_Composer": "𝙆 Image Composer", + "Image_Cropper": "𝙆 Image Cropper", "Image_Resizer": "𝙆 Image Resizer", "Mask_Filler": "𝙆 Mask Filler", } -WEB_DIRECTORY = "web" \ No newline at end of file +WEB_DIRECTORY = "web" +SETTINGS_FILE = os.path.join(os.path.dirname(os.path.realpath(__file__)), "settings.json") +LOGO_DIR = os.path.dirname(os.path.realpath(__file__)) +VALID_EXTENSIONS = [".png", ".jpg", ".jpeg", ".ico"] + +async def load_settings(request): + if os.path.exists(SETTINGS_FILE): + with open(SETTINGS_FILE, "r") as f: + return web.json_response(json.load(f)) + return web.json_response({"ShowRunOption": True, "ShowSetGetOptions": True, "EnableCustomLogo": True}) + +async def save_settings(request): + data = await request.json() + settings = {} + if os.path.exists(SETTINGS_FILE): + with open(SETTINGS_FILE, "r") as f: + settings = json.load(f) + settings.update(data) + with open(SETTINGS_FILE, "w") as f: + json.dump(settings, f, indent=2) + return web.Response(status=200) + +async def serve_logo(request): + for ext in VALID_EXTENSIONS: + logo_file = os.path.join(LOGO_DIR, f"logo{ext}") + if os.path.exists(logo_file): + print(f"[Kaytool] Serving logo: {logo_file}") + return web.FileResponse(logo_file) + print("[Kaytool] Logo not found") + return web.Response(status=404, text="Logo not found") + +import server +app = server.PromptServer.instance +app.app.add_routes([ + web.get("/kaytool/load_settings", load_settings), + web.post("/kaytool/save_settings", save_settings), + web.get("/kaytool/logo", serve_logo) +]) \ No newline at end of file diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..1b33d9210280dde20124aa89283b1ad0576617d1 GIT binary patch literal 6764 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 c9C)$7FxNb+YwmC5(kr { console.log("Kaytool Run Option display set to:", value); + saveSettings("ShowRunOption", value); } }); @@ -20,7 +68,26 @@ app.registerExtension({ defaultValue: true, onChange: (value) => { console.log("Kaytool Set/Get Options display set to:", value); + saveSettings("ShowSetGetOptions", value); } }); + + app.ui.settings.addSetting({ + id: "Kaytool.ShowCustomLogo", + name: "Rename the LOGO file to “logo.(png/jpg/jpeg/ico)” and place it in “/ComfyUI/custom_nodes/kaytool”", + type: "boolean", + defaultValue: true, + options: [ + { value: true, text: "Enabled" }, + { value: false, text: "Disabled" } + ], + onChange: (value) => { + saveSettings("ShowCustomLogo", value); + updateFavicon(); + } + }); + + await loadSettings(); + await updateFavicon(); } }); \ No newline at end of file