gr.info based quit countdown timer

This commit is contained in:
Chris Malone 2025-04-14 04:03:45 +10:00
parent bb73359772
commit 3044a0b486

81
wgp.py
View File

@ -732,11 +732,17 @@ def quit_application():
import signal import signal
os.kill(os.getpid(), signal.SIGINT) os.kill(os.getpid(), signal.SIGINT)
def request_quit_confirmation(): def start_quit_process():
return gr.update(visible=False), gr.update(visible=True) return 5, gr.update(visible=False), gr.update(visible=True)
def cancel_quit_confirmation(): def cancel_quit_process():
return gr.update(visible=True), gr.update(visible=False) return -1, gr.update(visible=True), gr.update(visible=False)
def show_countdown_info_from_state(current_value: int):
if current_value > 0:
gr.Info(f"Quitting in {current_value}...")
return current_value - 1
return current_value
def autosave_queue(): def autosave_queue():
global global_queue_ref global global_queue_ref
@ -994,7 +1000,6 @@ def create_html_progress_bar(percentage=0.0, text="Idle", is_idle=True):
""" """
return html return html
def update_generation_status(html_content): def update_generation_status(html_content):
if(html_content): if(html_content):
return gr.update(value=html_content) return gr.update(value=html_content)
@ -3625,51 +3630,46 @@ def generate_video_tab(update_form = False, state_dict = None, ui_defaults = Non
clear_queue_btn = gr.Button("Clear Queue", size="sm", variant="stop") clear_queue_btn = gr.Button("Clear Queue", size="sm", variant="stop")
quit_button = gr.Button("Save and Quit", size="sm", variant="secondary") quit_button = gr.Button("Save and Quit", size="sm", variant="secondary")
with gr.Row(visible=False) as quit_confirmation_row: with gr.Row(visible=False) as quit_confirmation_row:
gr.Markdown("Quitting in 5 seconds...", elem_id="quit_timer_label") confirm_quit_button = gr.Button("Confirm", elem_id="comfirm_quit_btn_hidden", size="sm", variant="stop")
confirm_quit_button = gr.Button("Confirm Quit Now", elem_id="comfirm_quit_btn_hidden", size="sm", variant="stop") cancel_quit_button = gr.Button("Cancel", size="sm", variant="secondary")
cancel_quit_button = gr.Button("Cancel Quit", size="sm", variant="secondary")
hidden_force_quit_trigger = gr.Button("force_quit", visible=False, elem_id="force_quit_btn_hidden") hidden_force_quit_trigger = gr.Button("force_quit", visible=False, elem_id="force_quit_btn_hidden")
hidden_countdown_state = gr.Number(value=-1, visible=False, elem_id="hidden_countdown_state_num")
single_hidden_trigger_btn = gr.Button("trigger_countdown", visible=False, elem_id="trigger_info_single_btn")
start_quit_timer_js = """ start_quit_timer_js = """
() => { () => {
function findAndClickGradioButton(elemId) { function findAndClickGradioButton(elemId) {
const gradioApp = document.querySelector('gradio-app') || document; const gradioApp = document.querySelector('gradio-app') || document;
const button = gradioApp.querySelector(`#${elemId}`); const button = gradioApp.querySelector(`#${elemId}`);
if (button) { if (button) { button.click(); }
button.click();
} }
}
window.quitTimerId = setTimeout(() => { if (window.quitCountdownTimeoutId) clearTimeout(window.quitCountdownTimeoutId);
}, 5000);
let countdown = 5; let js_click_count = 0;
const label = document.getElementById('quit_timer_label'); const max_clicks = 5;
if (label) {
label.innerText = `Quitting in ${countdown}...`; function countdownStep() {
window.quitCountdownInterval = setInterval(() => { if (js_click_count < max_clicks) {
countdown--; findAndClickGradioButton('trigger_info_single_btn');
if (countdown > 0) { js_click_count++;
label.innerText = `Quitting in ${countdown}...`; window.quitCountdownTimeoutId = setTimeout(countdownStep, 1000);
} else { } else {
clearInterval(window.quitCountdownInterval); findAndClickGradioButton('force_quit_btn_hidden');
findAndClickGradioButton('comfirm_quit_btn_hidden');
} }
}, 1000);
} }
countdownStep();
} }
""" """
cancel_quit_timer_js = """ cancel_quit_timer_js = """
() => { () => {
if (window.quitTimerId) { if (window.quitCountdownTimeoutId) {
clearTimeout(window.quitTimerId); clearTimeout(window.quitCountdownTimeoutId);
window.quitTimerId = null; window.quitCountdownTimeoutId = null;
console.log("Quit countdown cancelled (single trigger).");
} }
if(window.quitCountdownInterval) {
clearInterval(window.quitCountdownInterval);
window.quitCountdownInterval = null;
}
const label = document.getElementById('quit_timer_label');
if(label) { label.innerText = 'Quit cancelled.'; }
} }
""" """
@ -3705,10 +3705,15 @@ def generate_video_tab(update_form = False, state_dict = None, ui_defaults = Non
} }
""" """
single_hidden_trigger_btn.click(
fn=show_countdown_info_from_state,
inputs=[hidden_countdown_state],
outputs=[hidden_countdown_state]
)
quit_button.click( quit_button.click(
fn=request_quit_confirmation, fn=start_quit_process,
inputs=[], inputs=[],
outputs=[quit_button, quit_confirmation_row] outputs=[hidden_countdown_state, quit_button, quit_confirmation_row]
).then( ).then(
fn=None, inputs=None, outputs=None, js=start_quit_timer_js fn=None, inputs=None, outputs=None, js=start_quit_timer_js
) )
@ -3717,12 +3722,14 @@ def generate_video_tab(update_form = False, state_dict = None, ui_defaults = Non
fn=quit_application, fn=quit_application,
inputs=[], inputs=[],
outputs=[] outputs=[]
).then(
fn=None, inputs=None, outputs=None, js=cancel_quit_timer_js
) )
cancel_quit_button.click( cancel_quit_button.click(
fn=cancel_quit_confirmation, fn=cancel_quit_process,
inputs=[], inputs=[],
outputs=[quit_button, quit_confirmation_row] outputs=[hidden_countdown_state, quit_button, quit_confirmation_row]
).then( ).then(
fn=None, inputs=None, outputs=None, js=cancel_quit_timer_js fn=None, inputs=None, outputs=None, js=cancel_quit_timer_js
) )