diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8dcb20e..d7af22a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+# Changelog
+## [0.51.0] - 2025-03-31
+- node align 新增快捷键`Shift+WASD`
+
# Changelog
## [0.50.5] - 2025-03-27
- node align bar可吸附菜单栏
diff --git a/locales/zh/settings.json b/locales/zh/settings.json
index edc833c..6908c1f 100644
--- a/locales/zh/settings.json
+++ b/locales/zh/settings.json
@@ -1,12 +1,12 @@
{
"KayTool_ShowRunOption": {
- "name": "在'节点右键'菜单中显示 '▶️ Run' 选项"
+ "name": "在'节点右键菜单'中显示 '▶️ Run' 选项"
},
"KayTool_ShowSetGetOptions": {
- "name": "在'节点右键'菜单中显示 '🛜 Set/Get' 选项"
+ "name": "在'节点右键菜单'中显示 '🛜 Set/Get' 选项"
},
"KayTool_ShiftR": {
- "name": "使用 'Shift+R' 快捷键在选中的节点上快速执行 '▶️ Run' "
+ "name": "使用 'Shift+R' 快捷键在选中的节点上快速执行 '▶️ Run'"
},
"KayTool_ShowWorkflowPNG": {
"name": "在KayTool菜单中显示 'Workflow PNG' 选项"
@@ -19,15 +19,21 @@
"tooltip": "建议设置 100"
},
"KayTool_SetGetForegroundColor": {
- "name": "调整 '🛜 Set/Get' 节点颜色"
+ "name": " '🛜 Set/Get' 节点颜色"
},
"KayTool_SetGetBackgroundColor": {
- "name": "调整 '🛜 Set/Get' 标题颜色"
+ "name": " '🛜 Set/Get' 标题颜色"
},
"KayTool_CustomWebLogo": {
"name": "文件必须 < 1MB",
- "tooltip": "这是一个测试功能,文件必须 < 1MB ,否则可能无法显示"
+ "tooltip": "这是一个测试功能,文件最好 <1MB ,否则可能无法显示"
},
+
+ "KayTool_EnableAlignmentShortcuts": {
+ "name": "启用快捷键'Shift+W/A/S/D'",
+ "tooltip": "W/A/S/D对应上、左、下、右对齐"
+ },
+
"KayTool_NodeAlignDisplayMode": {
"name": "工具栏显示模式",
"options": {
diff --git a/pyproject.toml b/pyproject.toml
index 8d7dccc..54aaaae 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,7 +1,7 @@
[project]
name = "kaytool"
description ="KayTool enhances ComfyUI workflow efficiency with practical tools, including: image processing (resize, color, blur, expand, merge, crop), background/mask tasks via BiRefNet/RemBG, wireless data transfer (Get & Out), AI translation (Tencent/Baidu), dynamic math operations, flexible text handling, precision sliders, metadata/color profile-supported image saving, batch processing via image folder loading, canvas workflow node map export as PNG with embedded metadata, quick Run options via right-click (Run Group/Node), node alignment toolbar with custom styled styles, and custom ComfyUI logo integration."
-version = "0.50.8"
+version = "0.51.0"
license = {file = "LICENSE"}
dependencies = ["rembg, timm"]
@@ -12,4 +12,4 @@ Repository = "https://github.com/kk8bit/KayTool"
[tool.comfy]
PublisherId = "kk8bit"
DisplayName = "KayTool"
-Icon = ""
+Icon = ""
\ No newline at end of file
diff --git a/web/nodealign.js b/web/nodealign.js
index 277e186..4709065 100644
--- a/web/nodealign.js
+++ b/web/nodealign.js
@@ -1,6 +1,7 @@
import { app } from "../../../scripts/app.js";
-// SVG 定义(已包含你的现有 SVG,新增参考代码中的两个)
+// Based on NodeAligner by Tenney95 GitHub:https://github.com/Tenney95/ComfyUI-NodeAligner
+
const kayAlignBottomSvg = ``;
const kayAlignCenterHorizontallySvg = ``;
const kayAlignCenterVerticallySvg = ``;
@@ -12,6 +13,7 @@ const kayEqualHeightSvg = ``;
const kayVerticalDistributionSvg = ``;
+
let stylesInjected = false;
const KayNodeAlignmentManager = {
@@ -34,8 +36,9 @@ const KayNodeAlignmentManager = {
this.setupToolbar();
this.restorePosition();
this.bindCanvasEvents();
+ this.bindKeyboardShortcuts();
- const displayMode = app.ui.settings.getSettingValue("KayTool.NodeAlignDisplayMode") || "permanent";
+ const displayMode = app.ui.settings.getSettingValue("KayTool.NodeAlignDisplayMode");
this.updateDisplayMode(displayMode);
},
@@ -204,7 +207,6 @@ const KayNodeAlignmentManager = {
document.addEventListener('mousemove', this.onDragging.bind(this));
document.addEventListener('mouseup', this.onDragEnd.bind(this));
document.addEventListener('selectstart', e => this.dragState.isDragging && e.preventDefault());
-
this.addTooltip();
},
@@ -558,9 +560,38 @@ const KayNodeAlignmentManager = {
bindCanvasEvents() {
if (!this.canvas) return;
this.canvas.addEventListener('click', () => {
- const currentMode = app.ui.settings.getSettingValue("KayTool.NodeAlignDisplayMode") || "permanent";
+ const currentMode = app.ui.settings.getSettingValue("KayTool.NodeAlignDisplayMode");
this.updateDisplayMode(currentMode);
});
+ },
+
+ bindKeyboardShortcuts() {
+ document.addEventListener('keydown', (e) => {
+ // 只在 Shift 键按下且没有其他修饰键(如 Ctrl、Alt)时检查 WASD
+ if (!e.shiftKey || e.ctrlKey || e.altKey || e.metaKey) return;
+
+ const enableShortcuts = app.ui.settings.getSettingValue("KayTool.EnableAlignmentShortcuts");
+ if (!enableShortcuts || this.getSelectedNodes().length < 2) return;
+
+ switch (e.key.toLowerCase()) {
+ case 'w':
+ e.preventDefault();
+ this.alignTop();
+ break;
+ case 'a':
+ e.preventDefault();
+ this.alignLeft();
+ break;
+ case 's':
+ e.preventDefault();
+ this.alignBottom();
+ break;
+ case 'd':
+ e.preventDefault();
+ this.alignRight();
+ break;
+ }
+ });
}
};
@@ -568,7 +599,7 @@ function initializeKayNodeAlignment() {
if (!KayNodeAlignmentManager.isInitialized) {
KayNodeAlignmentManager.init();
} else {
- const displayMode = app.ui.settings.getSettingValue("KayTool.NodeAlignDisplayMode") || "permanent";
+ const displayMode = app.ui.settings.getSettingValue("KayTool.NodeAlignDisplayMode");
KayNodeAlignmentManager.updateDisplayMode(displayMode);
}
}
diff --git a/web/settings.js b/web/settings.js
index 45ca678..217a735 100644
--- a/web/settings.js
+++ b/web/settings.js
@@ -99,12 +99,21 @@ app.registerExtension({
if (!manager || !initFn) return;
if (!manager.isInitialized) {
- initFn(); // 始终初始化,确保事件绑定
+ initFn();
}
- manager.updateDisplayMode(value); // 直接更新模式,“disabled”仅隐藏
+ manager.updateDisplayMode(value); //
}
});
+ app.ui.settings.addSetting({
+ id: "KayTool.EnableAlignmentShortcuts",
+ name: "Enable Shift+WASD for Quick Alignment (Up/Left/Down/Right)",
+ type: "boolean",
+ defaultValue: true,
+ category: ["KayTool", "NodeAlignment", "Shortcuts"],
+ tooltip: "Use Shift+W (Up), Shift+A (Left), Shift+S (Down), Shift+D (Right) to align selected nodes."
+ });
+
app.ui.settings.addSetting({
id: "KayTool.NodeAlignBackgroundOpacity",
name: "Node Alignment Toolbar Background Opacity",
@@ -213,7 +222,7 @@ function updateSetGetNodeColors() {
if (node.type === "KaySetNode" || node.type === "KayGetNode" || node.type === "KayGet多元Node") {
node.color = fgColor;
node.bgcolor = bgColor;
- if (node.updateColors) node.updateColors();
+ node.updateColors();
}
});
app.graph.setDirtyCanvas(true, true);