From 6e65e57b9fbf90bf92ef858bcf15f152f982a31e Mon Sep 17 00:00:00 2001 From: da2el-ai Date: Mon, 28 Oct 2024 16:36:29 +0900 Subject: [PATCH] feat: Added prompt convert dialog --- README.md | 14 ++ README_ja.md | 16 ++ README_zh.md | 13 ++ img/prompt_convert_dialog.png | Bin 0 -> 40574 bytes pyproject.toml | 2 +- web/D2_FloatContainer.js | 2 - web/D2_PromptConverDialog.js | 246 +++++++++++++++++++++++++++++ web/css/D2_PromptConvertDialog.css | 25 +++ 8 files changed, 315 insertions(+), 3 deletions(-) create mode 100644 img/prompt_convert_dialog.png create mode 100644 web/D2_PromptConverDialog.js create mode 100644 web/css/D2_PromptConvertDialog.css diff --git a/README.md b/README.md index c64d8b5..67c20a3 100644 --- a/README.md +++ b/README.md @@ -479,6 +479,19 @@ Output text ### D2 Refiner Steps Tester - A node for checking steps + +### Prompt convert dialog + + + +- Dialog for converting weights between NovelAI and StableDiffusion formats +- Open from the `Prompt convert` button +- Hidden by default +- Enable `settings > D2 > Show prompt convert button` to display + + + + ## :card_index_dividers: Sample Workflow You can recreate the workflow by dropping the image into ComfyUI. @@ -514,6 +527,7 @@ In the custom_nodes folder, `git clone` **2024.10.28** +- Prompt convert: Added a dialog for converting prompts between NovelAI and StableDiffusion formats - D2 Folder Image Queue: Fixed a bug where the number of generated images was not consistent **2024.10.26** diff --git a/README_ja.md b/README_ja.md index f85ff8f..00fa893 100644 --- a/README_ja.md +++ b/README_ja.md @@ -480,6 +480,21 @@ Output text - steps を確認するためのノード + + +### Prompt convert dialog + + + +- NovelAI と StableDiffusion の weight を相互変換するダイアログ +- `Prompt convert` ボタンから開く +- 初期状態では非表示になっている +- `settings > D2 > Show prompt convert button` を有効にすると表示する + + + + + ## :card_index_dividers: Sample Workflow 画像を ComfyUI にドロップするとワークフローを再現できます。 @@ -522,6 +537,7 @@ custom_nodes フォルダで `git clone` する **2024.10.28** +- Prompt convert: NovelAI と StableDiffusion のプロンプトを相互変換するダイアログを追加 - D2 Folder Image Queue: 画像生成枚数が同じにならない不具合を修正 **2024.10.26** diff --git a/README_zh.md b/README_zh.md index d08b744..2ca4715 100644 --- a/README_zh.md +++ b/README_zh.md @@ -476,6 +476,18 @@ Output text ### D2 Refiner Steps Tester - 用於確認步數的節點 + +### Prompt convert dialog + + + +- 提供 NovelAI 和 StableDiffusion 權重(weight)互相轉換的對話框 +- 從 `Prompt convert` 按鈕開啟 +- 預設為隱藏狀態 +- 啟用 `settings > D2 > Show prompt convert button` 後即可顯示 + + + ## :card_index_dividers: 示例工作流程 將圖像拖放到 ComfyUI 中可以重現工作流程。 @@ -511,6 +523,7 @@ ComfyUI Manager → Custom Node Manager → 搜索 `D2 Nodes` 並安裝 **2024.10.28** +- Prompt convert: 新增 NovelAI 和 StableDiffusion 提示詞(prompt)互相轉換的對話框 - D2 Folder Image Queue: 修復生成圖片數量不一致的錯誤 **2024.10.26** diff --git a/img/prompt_convert_dialog.png b/img/prompt_convert_dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..5ca78ff8a84e91a8a02ccbeea83587e2405b8c3b GIT binary patch literal 40574 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 NAI 変換ボタン + const sdToNaiBtn = D2_PromptConvertDialog.createButton("SD to NAI", () => { + const prompt = sdPrompt.value; + const newPrompt = D2_PromptConvert.convertToNai(prompt); + naiPrompt.value = newPrompt; + }); + content.appendChild(sdToNaiBtn); + + // NAI > SD 変換ボタン + const naiToSdBtn = D2_PromptConvertDialog.createButton("NAI to SD", () => { + const prompt = naiPrompt.value; + const newPrompt = D2_PromptConvert.convertToSd(prompt); + sdPrompt.value = newPrompt; + }); + content.appendChild(naiToSdBtn); + + // SDクリップボード + const copySdBtn = D2_PromptConvertDialog.createButton("Send SD to Clipboard", () => { + sdPrompt.select(); + document.execCommand("copy"); + }); + content.appendChild(copySdBtn); + + // NAIクリップボード + const copyNaiBtn = D2_PromptConvertDialog.createButton("Send NAI to Clipboard", () => { + naiPrompt.select(); + document.execCommand("copy"); + }); + content.appendChild(copyNaiBtn); + + // 閉じるボタン + const closeBtn = document.createElement("button"); + closeBtn.classList.add("d2-prompt-convert__close-btn"); + closeBtn.textContent = "CLOSE"; + closeBtn.addEventListener("click", () => { + // container.close(); + this.container.style.display = "none"; + }); + content.appendChild(closeBtn); + } + + /** + * プロンプトエリア作成 + * @param {string} placeholder + * @returns HTMLElement + */ + static createPromptArea(placeholder) { + const textArea = document.createElement("textarea"); + textArea.classList.add("comfy-multiline-input", "d2-prompt-convert__prompt-area"); + textArea.placeholder = placeholder; + return textArea; + } + + /** + * ボタン作成 + * @param {string} text + * @param {function} onClick + * @returns + */ + static createButton(text, onClick) { + const btn = document.createElement("button"); + btn.classList.add("d2-prompt-convert__btn"); + btn.textContent = text; + btn.addEventListener("click", () => { + onClick(); + }); + return btn; + } +} + +/////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////// + +/** + * ダイアログ表示ボタン + */ +class D2_PromptConvertButton { + floatContainer = undefined; + dialog = undefined; + + constructor() { + // フロートコンテナ + this.floatContainer = new D2_FloatContainer("D2_PromptConvertBUtton", 50, 100); + // ダイアログ + this.dialog = new D2_PromptConvertDialog(); + + this._createButton(); + + // 表示切り替え + const visible = app.ui.settings.getSettingValue("D2.PromptConvertButton.Visible", false); + this.changeVisible(visible); + } + + /** + * 表示切り替え + */ + changeVisible(bool) { + this.floatContainer.changeVisible(bool); + } + + /** + * ボタン作成 + */ + _createButton() { + const button = document.createElement("button"); + button.classList.add("p-button"); + button.textContent = "Prompt convert"; + this.floatContainer.addButton(button); + + button.addEventListener("click", () => { + this.dialog.showModal(); + }); + } +} + +(function () { + const promptConvertButton = new D2_PromptConvertButton(); + + app.ui.settings.addSetting({ + id: "D2.PromptConvertButton.Visible", + name: "Show prompt convert button", + type: "boolean", + defaultValue: false, + onChange(value) { + promptConvertButton.changeVisible(value); + }, + }); +})(); diff --git a/web/css/D2_PromptConvertDialog.css b/web/css/D2_PromptConvertDialog.css new file mode 100644 index 0000000..2379c0a --- /dev/null +++ b/web/css/D2_PromptConvertDialog.css @@ -0,0 +1,25 @@ +.d2-prompt-convert { + z-index: 1000; + width: 1000px; + max-width: 100%; +} + +.d2-prompt-convert__content { + display: grid; + grid-template-columns: 1fr 1fr; + gap: .3rem 1rem; +} + +/* .d2-prompt-convert__button-container { + gap: 0.25rem; +} */ + +.d2-prompt-convert__prompt-area{ + height: 15rem; +} + + +.d2-prompt-convert__close-btn{ + grid-column: span 2; + margin-top: 1rem; +} \ No newline at end of file