ui_extra_networks.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. import os.path
  2. from modules import shared
  3. import gradio as gr
  4. import json
  5. from modules.generation_parameters_copypaste import image_from_url_text
  6. extra_pages = []
  7. def register_page(page):
  8. """registers extra networks page for the UI; recommend doing it in on_app_started() callback for extensions"""
  9. extra_pages.append(page)
  10. class ExtraNetworksPage:
  11. def __init__(self, title):
  12. self.title = title
  13. self.card_page = shared.html("extra-networks-card.html")
  14. self.allow_negative_prompt = False
  15. def refresh(self):
  16. pass
  17. def create_html(self, tabname):
  18. items_html = ''
  19. for item in self.list_items():
  20. items_html += self.create_html_for_item(item, tabname)
  21. if items_html == '':
  22. dirs = "".join([f"<li>{x}</li>" for x in self.allowed_directories_for_previews()])
  23. items_html = shared.html("extra-networks-no-cards.html").format(dirs=dirs)
  24. res = "<div class='extra-network-cards'>" + items_html + "</div>"
  25. return res
  26. def list_items(self):
  27. raise NotImplementedError()
  28. def allowed_directories_for_previews(self):
  29. return []
  30. def create_html_for_item(self, item, tabname):
  31. preview = item.get("preview", None)
  32. args = {
  33. "preview_html": "style='background-image: url(" + json.dumps(preview) + ")'" if preview else '',
  34. "prompt": json.dumps(item["prompt"]),
  35. "tabname": json.dumps(tabname),
  36. "local_preview": json.dumps(item["local_preview"]),
  37. "name": item["name"],
  38. "allow_negative_prompt": "true" if self.allow_negative_prompt else "false",
  39. }
  40. return self.card_page.format(**args)
  41. def intialize():
  42. extra_pages.clear()
  43. class ExtraNetworksUi:
  44. def __init__(self):
  45. self.pages = None
  46. self.stored_extra_pages = None
  47. self.button_save_preview = None
  48. self.preview_target_filename = None
  49. self.tabname = None
  50. def create_ui(container, button, tabname):
  51. ui = ExtraNetworksUi()
  52. ui.pages = []
  53. ui.stored_extra_pages = extra_pages.copy()
  54. ui.tabname = tabname
  55. with gr.Tabs(elem_id=tabname+"_extra_tabs") as tabs:
  56. button_refresh = gr.Button('Refresh', elem_id=tabname+"_extra_refresh")
  57. button_close = gr.Button('Close', elem_id=tabname+"_extra_close")
  58. for page in ui.stored_extra_pages:
  59. with gr.Tab(page.title):
  60. page_elem = gr.HTML(page.create_html(ui.tabname))
  61. ui.pages.append(page_elem)
  62. ui.button_save_preview = gr.Button('Save preview', elem_id=tabname+"_save_preview", visible=False)
  63. ui.preview_target_filename = gr.Textbox('Preview save filename', elem_id=tabname+"_preview_filename", visible=False)
  64. button.click(fn=lambda: gr.update(visible=True), inputs=[], outputs=[container])
  65. button_close.click(fn=lambda: gr.update(visible=False), inputs=[], outputs=[container])
  66. def refresh():
  67. res = []
  68. for pg in ui.stored_extra_pages:
  69. pg.refresh()
  70. res.append(pg.create_html(ui.tabname))
  71. return res
  72. button_refresh.click(fn=refresh, inputs=[], outputs=ui.pages)
  73. return ui
  74. def path_is_parent(parent_path, child_path):
  75. parent_path = os.path.abspath(parent_path)
  76. child_path = os.path.abspath(child_path)
  77. return os.path.commonpath([parent_path]) == os.path.commonpath([parent_path, child_path])
  78. def setup_ui(ui, gallery):
  79. def save_preview(index, images, filename):
  80. if len(images) == 0:
  81. print("There is no image in gallery to save as a preview.")
  82. return [page.create_html(ui.tabname) for page in ui.stored_extra_pages]
  83. index = int(index)
  84. index = 0 if index < 0 else index
  85. index = len(images) - 1 if index >= len(images) else index
  86. img_info = images[index if index >= 0 else 0]
  87. image = image_from_url_text(img_info)
  88. is_allowed = False
  89. for extra_page in ui.stored_extra_pages:
  90. if any([path_is_parent(x, filename) for x in extra_page.allowed_directories_for_previews()]):
  91. is_allowed = True
  92. break
  93. assert is_allowed, f'writing to {filename} is not allowed'
  94. image.save(filename)
  95. return [page.create_html(ui.tabname) for page in ui.stored_extra_pages]
  96. ui.button_save_preview.click(
  97. fn=save_preview,
  98. _js="function(x, y, z){console.log(x, y, z); return [selected_gallery_index(), y, z]}",
  99. inputs=[ui.preview_target_filename, gallery, ui.preview_target_filename],
  100. outputs=[*ui.pages]
  101. )