Files
zombieyang-sd-ppp/scripts/sd_init.py
T

112 lines
6.7 KiB
Python

# sd script init
from modules import script_callbacks, shared
from modules.ui_components import ToolButton
from sdppp_python.sdppp import SDPPP
from sdppp_python.apis import consumeImageCache
from sdppp_python.sd_data import get_sd_document_data, get_sd_special_get_bound_layer_options, get_sd_special_get_layer_options, get_sd_special_send_layer_options
import gradio as gr
refresh_symbol = '\U0001f504' # 🔄
config_symbol = '\U0001F527' # 🔧
def on_app_started(blocks: gr.Blocks, app):
sdppp = SDPPP()
sdppp.attach_to_SD(app)
def update_document_dropdown(origin):
if not sdppp.has_ps_instance():
return ['==please connect SD in photoshop by sdppp first==']
choices = list(get_sd_document_data().keys())
value = choices[0] if origin not in choices else origin
return gr.Dropdown.update(choices=choices, value=value, interactive=True)
def update_layers_dropdown(origin, document):
if not sdppp.has_ps_instance():
return ['==please connect SD in photoshop by sdppp first==']
choices = [*get_sd_special_get_layer_options(), *(x['name'] for x in get_sd_document_data()[document]['layers'])]
value = choices[0] if origin not in choices else origin
return gr.Dropdown.update(choices=choices, value=value, interactive=True)
def update_bounds_dropdown(origin, document):
if not sdppp.has_ps_instance():
return ['==please connect SD in photoshop by sdppp first==']
choices = [*get_sd_special_get_bound_layer_options(), *(x['name'] for x in get_sd_document_data()[document]['layers'])]
value = choices[0] if origin not in choices else origin
return gr.Dropdown.update(choices=choices, value=value, interactive=True)
def update_send_layers_dropdown(origin, document):
if not sdppp.has_ps_instance():
return ['==please connect SD in photoshop by sdppp first==']
choices = [*get_sd_special_send_layer_options(), *(x['name'] for x in get_sd_document_data()[document]['layers'])]
value = choices[0] if origin not in choices else origin
return gr.Dropdown.update(choices=choices, value=value, interactive=True)
def sdppp_get(elem):
res = consumeImageCache(elem.elem_id)
return gr.Image.update(value=res)
sdppp.all_images = all_images = dict()
sdppp.all_galleries = all_galleries = dict()
for k in blocks.blocks:
elem = blocks.blocks[k]
if elem.elem_id == '' or elem.elem_id == None: continue
if isinstance(elem, gr.Image):
all_images[elem.elem_id] = elem
if isinstance(elem, gr.Gallery):
all_galleries[elem.elem_id] = elem
with blocks:
with gr.Box(elem_id=f"sdppp_getter_dialog", elem_classes="popup-dialog") as sdppp_getter_dialog:
with gr.Row():
get_document = gr.Dropdown(choices=['==please connect SD in photoshop by sdppp first=='], label="sdppp_get_document", elem_id=f'sdppp_get_document', interactive=True)
update_get_document = ToolButton(value=refresh_symbol, elem_id="refresh_sdppp_get_document", tooltip=f"refresh sdppp documents")
update_get_document.click(update_document_dropdown, inputs=[get_document], outputs=[get_document])
with gr.Row():
layers = gr.Dropdown(choices=['==please connect SD in photoshop by sdppp first=='], label="sdppp_layers", elem_id=f'sdppp_layers', interactive=True)
update_layers = ToolButton(value=refresh_symbol, elem_id="refresh_sdppp_layers", tooltip=f"refresh sdppp layers")
update_layers.click(update_layers_dropdown, inputs=[layers, get_document], outputs=[layers])
get_document.change(update_layers_dropdown, inputs=[layers, get_document], outputs=[layers])
with gr.Row():
bounds = gr.Dropdown(choices=['==please connect SD in photoshop by sdppp first=='], label="sdppp_bounds", elem_id=f'sdppp_bounds', interactive=True)
update_bounds = ToolButton(value=refresh_symbol, elem_id="refresh_sdppp_bounds", tooltip=f"refresh sdppp bounds")
update_bounds.click(update_bounds_dropdown, inputs=[bounds, get_document], outputs=[bounds])
get_document.change(update_bounds_dropdown, inputs=[bounds, get_document], outputs=[bounds])
with gr.Row():
close = gr.Button('Save And Run Get', variant='secondary', elem_id=f'sdppp_getter_dialog_close')
with gr.Box(elem_id=f"sdppp_sender_dialog", elem_classes="popup-dialog") as sdppp_sender_dialog:
with gr.Row():
send_document = gr.Dropdown(choices=['==please connect SD in photoshop by sdppp first=='], label="sdppp_send_document", elem_id=f'sdppp_send_document', interactive=True)
update_send_document = ToolButton(value=refresh_symbol, elem_id="refresh_sdppp_send_document", tooltip=f"refresh sdppp documents")
update_send_document.click(update_document_dropdown, inputs=[send_document], outputs=[send_document])
with gr.Row():
send_layers = gr.Dropdown(choices=['==please connect SD in photoshop by sdppp first=='], label="sdppp_send_layers", elem_id=f'sdppp_send_layers', interactive=True)
update_send_layers = ToolButton(value=refresh_symbol, elem_id="refresh_sdppp_send_layers", tooltip=f"refresh sdppp send layers")
update_send_layers.click(update_send_layers_dropdown, inputs=[send_layers, send_document], outputs=[send_layers])
send_document.change(update_send_layers_dropdown, inputs=[send_layers, send_document], outputs=[send_layers])
with gr.Row():
close = gr.Button('Save And Run Send', variant='secondary', elem_id=f'sdppp_sender_dialog_close')
sdppp_getter_dialog.visible = False
sdppp_sender_dialog.visible = False
def registerGradioGlobalJSFunction(name, callback, elems):
elem = gr.Button(f'sdppp_{name}', variant='secondary', elem_id=f'sdppp_{name}', visible=False).click(lambda: callback(*elems), inputs=[], outputs=elems)
for i in all_images:
elem = all_images[i]
registerGradioGlobalJSFunction(f'get_image_{elem.elem_id}', sdppp_get, [elem])
registerGradioGlobalJSFunction(f'show_getter_dialog', lambda i: sdppp_getter_dialog.update(visible=True), [sdppp_getter_dialog])
registerGradioGlobalJSFunction(f'show_sender_dialog', lambda i: sdppp_sender_dialog.update(visible=True), [sdppp_sender_dialog])
script_callbacks.on_app_started(on_app_started)
shared.options_templates.update(
shared.options_section(('sd-ppp', "SD-PPP", "ui"), {
"sd-ppp_download": shared.OptionInfo([], "Download PS plugin", gr.Button)
})
)