Fix hotkey events across tabs.
Browse files- app.py +8 -27
- hotkeys.js +34 -0
app.py
CHANGED
|
@@ -2,6 +2,7 @@ import logging
|
|
| 2 |
import os
|
| 3 |
import re
|
| 4 |
import warnings
|
|
|
|
| 5 |
|
| 6 |
import gradio as gr
|
| 7 |
import requests
|
|
@@ -89,27 +90,7 @@ def copy_notify(code):
|
|
| 89 |
|
| 90 |
|
| 91 |
def add_hotkeys() -> str:
|
| 92 |
-
return ""
|
| 93 |
-
function gradioApp() {
|
| 94 |
-
const elems = document.getElementsByTagName('gradio-app');
|
| 95 |
-
const elem = elems.length == 0 ? document : elems[0];
|
| 96 |
-
|
| 97 |
-
if (elem !== document) {
|
| 98 |
-
elem.getElementById = function(id) {
|
| 99 |
-
return document.getElementById(id);
|
| 100 |
-
};
|
| 101 |
-
}
|
| 102 |
-
return elem.shadowRoot ? elem.shadowRoot : elem;
|
| 103 |
-
}
|
| 104 |
-
window.addEventListener('keydown', (e) => {
|
| 105 |
-
if (e.keyCode == 192 && e.ctrlKey) { // CTRL + ` key
|
| 106 |
-
const recordButton = gradioApp().querySelector("div.mic-wrap > button");
|
| 107 |
-
console.log(recordButton);
|
| 108 |
-
recordButton.click();
|
| 109 |
-
}
|
| 110 |
-
});
|
| 111 |
-
}
|
| 112 |
-
"""
|
| 113 |
|
| 114 |
|
| 115 |
with gr.Blocks() as demo:
|
|
@@ -126,15 +107,15 @@ with gr.Blocks() as demo:
|
|
| 126 |
with gr.Row():
|
| 127 |
with gr.Column():
|
| 128 |
with gr.Group():
|
| 129 |
-
in_audio = gr.Audio(label="Record a voice request (click or press ctrl + ` to start/stop)", source='microphone', type='filepath')
|
| 130 |
in_prompt = gr.Textbox(label="Or type a text request and press Enter",
|
| 131 |
placeholder="Need an idea? Try one of these:\n- Add a button to reverse the name\n- Change the greeting to Spanish\n- Put the reversed name output into a separate textbox")
|
| 132 |
out_text = gr.TextArea(label="Chat Assistant Response")
|
| 133 |
clear = gr.ClearButton([in_prompt, in_audio, out_text])
|
| 134 |
with gr.Column():
|
| 135 |
-
code_area = gr.Code(label="App Code - You can also edit directly and then click Update App",
|
| 136 |
language='python', value=starting_app_code(DemoType.GRADIO))
|
| 137 |
-
update_btn = gr.Button("Update App", variant="primary")
|
| 138 |
code_update_params = {'fn': None, 'inputs': code_area, 'outputs': None,
|
| 139 |
'_js': update_iframe_js(DemoType.GRADIO)}
|
| 140 |
gen_text_params = {'fn': generate_text, 'inputs': [code_area, in_prompt],
|
|
@@ -165,15 +146,15 @@ with gr.Blocks() as demo:
|
|
| 165 |
with gr.Row():
|
| 166 |
with gr.Column():
|
| 167 |
with gr.Group():
|
| 168 |
-
in_audio = gr.Audio(label="Record a voice request (click or press ctrl + ` to start/stop)", source='microphone', type='filepath')
|
| 169 |
in_prompt = gr.Textbox(label="Or type a text request and press Enter",
|
| 170 |
placeholder="Need an idea? Try one of these:\n- Add a button to reverse the name\n- Change the greeting to Spanish\n- Make the button primary")
|
| 171 |
out_text = gr.TextArea(label="Chat Assistant Response")
|
| 172 |
clear_btn = gr.ClearButton([in_prompt, in_audio, out_text])
|
| 173 |
with gr.Column():
|
| 174 |
-
code_area = gr.Code(label="App Code - You can also edit directly and then click Update App",
|
| 175 |
language='python', value=starting_app_code(DemoType.STREAMLIT))
|
| 176 |
-
update_btn = gr.Button("Update App", variant="primary")
|
| 177 |
code_update_params = {'fn': None, 'inputs': code_area, 'outputs': None,
|
| 178 |
'_js': update_iframe_js(DemoType.STREAMLIT)}
|
| 179 |
gen_text_params = {'fn': generate_text, 'inputs': [code_area, in_prompt],
|
|
|
|
| 2 |
import os
|
| 3 |
import re
|
| 4 |
import warnings
|
| 5 |
+
from pathlib import Path
|
| 6 |
|
| 7 |
import gradio as gr
|
| 8 |
import requests
|
|
|
|
| 90 |
|
| 91 |
|
| 92 |
def add_hotkeys() -> str:
|
| 93 |
+
return Path("hotkeys.js").read_text()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 94 |
|
| 95 |
|
| 96 |
with gr.Blocks() as demo:
|
|
|
|
| 107 |
with gr.Row():
|
| 108 |
with gr.Column():
|
| 109 |
with gr.Group():
|
| 110 |
+
in_audio = gr.Audio(label="Record a voice request (click or press ctrl + ` to start/stop)", source='microphone', type='filepath', elem_classes=["record-btn"])
|
| 111 |
in_prompt = gr.Textbox(label="Or type a text request and press Enter",
|
| 112 |
placeholder="Need an idea? Try one of these:\n- Add a button to reverse the name\n- Change the greeting to Spanish\n- Put the reversed name output into a separate textbox")
|
| 113 |
out_text = gr.TextArea(label="Chat Assistant Response")
|
| 114 |
clear = gr.ClearButton([in_prompt, in_audio, out_text])
|
| 115 |
with gr.Column():
|
| 116 |
+
code_area = gr.Code(label="App Code - You can also edit directly and then click Update App or ctrl + space",
|
| 117 |
language='python', value=starting_app_code(DemoType.GRADIO))
|
| 118 |
+
update_btn = gr.Button("Update App (Ctrl + Space)", variant="primary", elem_classes=["update-btn"])
|
| 119 |
code_update_params = {'fn': None, 'inputs': code_area, 'outputs': None,
|
| 120 |
'_js': update_iframe_js(DemoType.GRADIO)}
|
| 121 |
gen_text_params = {'fn': generate_text, 'inputs': [code_area, in_prompt],
|
|
|
|
| 146 |
with gr.Row():
|
| 147 |
with gr.Column():
|
| 148 |
with gr.Group():
|
| 149 |
+
in_audio = gr.Audio(label="Record a voice request (click or press ctrl + ` to start/stop)", source='microphone', type='filepath', elem_classes=["record-btn"])
|
| 150 |
in_prompt = gr.Textbox(label="Or type a text request and press Enter",
|
| 151 |
placeholder="Need an idea? Try one of these:\n- Add a button to reverse the name\n- Change the greeting to Spanish\n- Make the button primary")
|
| 152 |
out_text = gr.TextArea(label="Chat Assistant Response")
|
| 153 |
clear_btn = gr.ClearButton([in_prompt, in_audio, out_text])
|
| 154 |
with gr.Column():
|
| 155 |
+
code_area = gr.Code(label="App Code - You can also edit directly and then click Update App or ctrl + space",
|
| 156 |
language='python', value=starting_app_code(DemoType.STREAMLIT))
|
| 157 |
+
update_btn = gr.Button("Update App (Ctrl + Space)", variant="primary", elem_classes=["update-btn"])
|
| 158 |
code_update_params = {'fn': None, 'inputs': code_area, 'outputs': None,
|
| 159 |
'_js': update_iframe_js(DemoType.STREAMLIT)}
|
| 160 |
gen_text_params = {'fn': generate_text, 'inputs': [code_area, in_prompt],
|
hotkeys.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
() => {
|
| 2 |
+
function gradioApp() {
|
| 3 |
+
const elems = document.getElementsByTagName('gradio-app');
|
| 4 |
+
const elem = elems.length == 0 ? document : elems[0];
|
| 5 |
+
|
| 6 |
+
if (elem !== document) {
|
| 7 |
+
elem.getElementById = function(id) {
|
| 8 |
+
return document.getElementById(id);
|
| 9 |
+
};
|
| 10 |
+
}
|
| 11 |
+
return elem.shadowRoot ? elem.shadowRoot : elem;
|
| 12 |
+
}
|
| 13 |
+
window.addEventListener('keydown', (e) => {
|
| 14 |
+
if ((e.ctrlKey || e.metaKey) && e.key == "`") { // CTRL + ` key
|
| 15 |
+
const recordButtons = gradioApp().querySelectorAll(".record-btn button");
|
| 16 |
+
console.log(recordButtons);
|
| 17 |
+
for (let recordButton of recordButtons) {
|
| 18 |
+
if (recordButton.checkVisibility()) {
|
| 19 |
+
recordButton.click();
|
| 20 |
+
}
|
| 21 |
+
}
|
| 22 |
+
}
|
| 23 |
+
});
|
| 24 |
+
window.addEventListener('keydown', (e) => {
|
| 25 |
+
if ((e.ctrlKey || e.metaKey) && e.key === " ") { // CTRL + Space key
|
| 26 |
+
const updateButtons = gradioApp().querySelectorAll(".update-btn");
|
| 27 |
+
for (let updateButton of updateButtons) {
|
| 28 |
+
if (updateButton.checkVisibility()) {
|
| 29 |
+
updateButton.click();
|
| 30 |
+
}
|
| 31 |
+
}
|
| 32 |
+
}
|
| 33 |
+
});
|
| 34 |
+
}
|