File size: 7,722 Bytes
e61bb9a |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
# Copyright (C) 2023 Deforum LLC
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, version 3 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
# Contact the authors: https://deforum.github.io/
from .args import DeforumOutputArgs, get_component_names, get_settings_component_names
from modules.shared import opts, state
from modules.ui import create_output_panel, wrap_gradio_call
from webui import wrap_gradio_gpu_call
from .run_deforum import run_deforum
from .settings import save_settings, load_all_settings, load_video_settings
from .general_utils import get_deforum_version
from .ui_left import setup_deforum_left_side_ui
from scripts.deforum_extend_paths import deforum_sys_extend
import gradio as gr
def on_ui_tabs():
# extend paths using sys.path.extend so we can access all of our files and folders
deforum_sys_extend()
# set text above generate button
i1_store_backup = f"<p style=\"text-align:center;font-weight:bold;margin-bottom:0em\">Deforum extension for auto1111 — version 3.0 | Git commit: {get_deforum_version()}</p>"
i1_store = i1_store_backup
with gr.Blocks(analytics_enabled=False) as deforum_interface:
components = {}
dummy_component = gr.Label(visible=False)
with gr.Row(elem_id='deforum_progress_row').style(equal_height=False, variant='compact'):
with gr.Column(scale=1, variant='panel'):
# setting the left side of the ui:
components = setup_deforum_left_side_ui()
with gr.Column(scale=1, variant='compact'):
with gr.Row(variant='compact'):
btn = gr.Button("Click here after the generation to show the video")
components['btn'] = btn
close_btn = gr.Button("Close the video", visible=False)
with gr.Row(variant='compact'):
i1 = gr.HTML(i1_store, elem_id='deforum_header')
components['i1'] = i1
def show_vid(): # Show video button related func
from .run_deforum import last_vid_data # get latest vid preview data (this import needs to stay inside the function!)
return {
i1: gr.update(value=last_vid_data, visible=True),
close_btn: gr.update(visible=True),
btn: gr.update(value="Update the video", visible=True),
}
btn.click(
fn=show_vid,
inputs=[],
outputs=[i1, close_btn, btn],
)
def close_vid(): # Close video button related func
return {
i1: gr.update(value=i1_store_backup, visible=True),
close_btn: gr.update(visible=False),
btn: gr.update(value="Click here after the generation to show the video", visible=True),
}
close_btn.click(
fn=close_vid,
inputs=[],
outputs=[i1, close_btn, btn],
)
id_part = 'deforum'
with gr.Row(elem_id=f"{id_part}_generate_box", variant='compact'):
skip = gr.Button('Pause/Resume', elem_id=f"{id_part}_skip", visible=False)
interrupt = gr.Button('Interrupt', elem_id=f"{id_part}_interrupt", visible=True)
submit = gr.Button('Generate', elem_id=f"{id_part}_generate", variant='primary')
skip.click(
fn=lambda: state.skip(),
inputs=[],
outputs=[],
)
interrupt.click(
fn=lambda: state.interrupt(),
inputs=[],
outputs=[],
)
deforum_gallery, generation_info, html_info, _ = create_output_panel("deforum", opts.outdir_img2img_samples)
with gr.Row(variant='compact'):
settings_path = gr.Textbox("deforum_settings.txt", elem_id='deforum_settings_path', label="Settings File", info="settings file path can be relative to webui folder OR full - absolute")
with gr.Row(variant='compact'):
save_settings_btn = gr.Button('Save Settings', elem_id='deforum_save_settings_btn')
load_settings_btn = gr.Button('Load All Settings', elem_id='deforum_load_settings_btn')
load_video_settings_btn = gr.Button('Load Video Settings', elem_id='deforum_load_video_settings_btn')
component_list = [components[name] for name in get_component_names()]
submit.click(
fn=wrap_gradio_gpu_call(run_deforum),
_js="submit_deforum",
inputs=[dummy_component, dummy_component] + component_list,
outputs=[
deforum_gallery,
components["resume_timestring"],
generation_info,
html_info
],
)
settings_component_list = [components[name] for name in get_settings_component_names()]
video_settings_component_list = [components[name] for name in list(DeforumOutputArgs().keys())]
save_settings_btn.click(
fn=wrap_gradio_call(save_settings),
inputs=[settings_path] + settings_component_list + video_settings_component_list,
outputs=[],
)
load_settings_btn.click(
fn=wrap_gradio_call(lambda *args, **kwargs: load_all_settings(*args, ui_launch=False, **kwargs)),
inputs=[settings_path] + settings_component_list,
outputs=settings_component_list,
)
load_video_settings_btn.click(
fn=wrap_gradio_call(load_video_settings),
inputs=[settings_path] + video_settings_component_list,
outputs=video_settings_component_list,
)
# handle persistent settings - load the persistent file upon UI launch
def trigger_load_general_settings():
print("Loading general settings...")
wrapped_fn = wrap_gradio_call(lambda *args, **kwargs: load_all_settings(*args, ui_launch=True, **kwargs))
inputs = [settings_path.value] + [component.value for component in settings_component_list]
outputs = settings_component_list
updated_values = wrapped_fn(*inputs, *outputs)[0]
settings_component_name_to_obj = {name: component for name, component in zip(get_settings_component_names(), settings_component_list)}
for key, value in updated_values.items():
settings_component_name_to_obj[key].value = value['value']
# actually check persistent setting status
if opts.data.get("deforum_enable_persistent_settings", False):
trigger_load_general_settings()
return [(deforum_interface, "Deforum", "deforum_interface")] |