Skip to content

Commit 96c393a

Browse files
Merge pull request #14269 from kaalibro/skip-interrupt-keyb-shortcuts
Add keyboard shortcuts for generate/skip/interrupt
2 parents 09013b3 + 6513470 commit 96c393a

File tree

2 files changed

+27
-6
lines changed

2 files changed

+27
-6
lines changed

modules/ui_toprow.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,11 @@ def create_inline_toprow_image(self):
7979
def create_prompts(self):
8080
with gr.Column(elem_id=f"{self.id_part}_prompt_container", elem_classes=["prompt-container-compact"] if self.is_compact else [], scale=6):
8181
with gr.Row(elem_id=f"{self.id_part}_prompt_row", elem_classes=["prompt-row"]):
82-
self.prompt = gr.Textbox(label="Prompt", elem_id=f"{self.id_part}_prompt", show_label=False, lines=3, placeholder="Prompt (press Ctrl+Enter or Alt+Enter to generate)", elem_classes=["prompt"])
82+
self.prompt = gr.Textbox(label="Prompt", elem_id=f"{self.id_part}_prompt", show_label=False, lines=3, placeholder="Prompt\n(Press Ctrl+Enter to generate, Alt+Enter to skip, Esc to interrupt)", elem_classes=["prompt"])
8383
self.prompt_img = gr.File(label="", elem_id=f"{self.id_part}_prompt_image", file_count="single", type="binary", visible=False)
8484

8585
with gr.Row(elem_id=f"{self.id_part}_neg_prompt_row", elem_classes=["prompt-row"]):
86-
self.negative_prompt = gr.Textbox(label="Negative prompt", elem_id=f"{self.id_part}_neg_prompt", show_label=False, lines=3, placeholder="Negative prompt (press Ctrl+Enter or Alt+Enter to generate)", elem_classes=["prompt"])
86+
self.negative_prompt = gr.Textbox(label="Negative prompt", elem_id=f"{self.id_part}_neg_prompt", show_label=False, lines=3, placeholder="Negative prompt\n(Press Ctrl+Enter to generate, Alt+Enter to skip, Esc to interrupt)", elem_classes=["prompt"])
8787

8888
self.prompt_img.change(
8989
fn=modules.images.image_data,

script.js

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,16 +121,22 @@ document.addEventListener("DOMContentLoaded", function() {
121121
});
122122

123123
/**
124-
* Add a ctrl+enter as a shortcut to start a generation
124+
* Add keyboard shortcuts:
125+
* Ctrl+Enter to start/restart a generation
126+
* Alt/Option+Enter to skip a generation
127+
* Esc to interrupt a generation
125128
*/
126129
document.addEventListener('keydown', function(e) {
127130
const isEnter = e.key === 'Enter' || e.keyCode === 13;
128-
const isModifierKey = e.metaKey || e.ctrlKey || e.altKey;
131+
const isCtrlKey = e.metaKey || e.ctrlKey;
132+
const isAltKey = e.altKey;
133+
const isEsc = e.key === 'Escape';
129134

130-
const interruptButton = get_uiCurrentTabContent().querySelector('button[id$=_interrupt]');
131135
const generateButton = get_uiCurrentTabContent().querySelector('button[id$=_generate]');
136+
const interruptButton = get_uiCurrentTabContent().querySelector('button[id$=_interrupt]');
137+
const skipButton = get_uiCurrentTabContent().querySelector('button[id$=_skip]');
132138

133-
if (isEnter && isModifierKey) {
139+
if (isCtrlKey && isEnter) {
134140
if (interruptButton.style.display === 'block') {
135141
interruptButton.click();
136142
const callback = (mutationList) => {
@@ -150,6 +156,21 @@ document.addEventListener('keydown', function(e) {
150156
}
151157
e.preventDefault();
152158
}
159+
160+
if (isAltKey && isEnter) {
161+
skipButton.click();
162+
e.preventDefault();
163+
}
164+
165+
if (isEsc) {
166+
const globalPopup = document.querySelector('.global-popup');
167+
const lightboxModal = document.querySelector('#lightboxModal');
168+
if (!globalPopup || globalPopup.style.display === 'none') {
169+
if (document.activeElement === lightboxModal) return;
170+
interruptButton.click();
171+
e.preventDefault();
172+
}
173+
}
153174
});
154175

155176
/**

0 commit comments

Comments
 (0)