ui_toprow.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. import gradio as gr
  2. from modules import shared, ui_prompt_styles
  3. import modules.images
  4. from modules.ui_components import ToolButton
  5. class Toprow:
  6. """Creates a top row UI with prompts, generate button, styles, extra little buttons for things, and enables some functionality related to their operation"""
  7. prompt = None
  8. prompt_img = None
  9. negative_prompt = None
  10. button_interrogate = None
  11. button_deepbooru = None
  12. interrupt = None
  13. skip = None
  14. submit = None
  15. paste = None
  16. clear_prompt_button = None
  17. apply_styles = None
  18. restore_progress_button = None
  19. token_counter = None
  20. token_button = None
  21. negative_token_counter = None
  22. negative_token_button = None
  23. ui_styles = None
  24. submit_box = None
  25. def __init__(self, is_img2img, is_compact=False, id_part=None):
  26. if id_part is None:
  27. id_part = "img2img" if is_img2img else "txt2img"
  28. self.id_part = id_part
  29. self.is_img2img = is_img2img
  30. self.is_compact = is_compact
  31. if not is_compact:
  32. with gr.Row(elem_id=f"{id_part}_toprow", variant="compact"):
  33. self.create_classic_toprow()
  34. else:
  35. self.create_submit_box()
  36. def create_classic_toprow(self):
  37. self.create_prompts()
  38. with gr.Column(scale=1, elem_id=f"{self.id_part}_actions_column"):
  39. self.create_submit_box()
  40. self.create_tools_row()
  41. self.create_styles_ui()
  42. def create_inline_toprow_prompts(self):
  43. if not self.is_compact:
  44. return
  45. self.create_prompts()
  46. with gr.Row(elem_classes=["toprow-compact-stylerow"]):
  47. with gr.Column(elem_classes=["toprow-compact-tools"]):
  48. self.create_tools_row()
  49. with gr.Column():
  50. self.create_styles_ui()
  51. def create_inline_toprow_image(self):
  52. if not self.is_compact:
  53. return
  54. self.submit_box.render()
  55. def create_prompts(self):
  56. with gr.Column(elem_id=f"{self.id_part}_prompt_container", elem_classes=["prompt-container-compact"] if self.is_compact else [], scale=6):
  57. with gr.Row(elem_id=f"{self.id_part}_prompt_row", elem_classes=["prompt-row"]):
  58. self.prompt = gr.Textbox(label="Prompt", elem_id=f"{self.id_part}_prompt", show_label=False, lines=3, placeholder="Prompt\n(Press Ctrl+Enter to generate, Alt+Enter to skip, Ctrl+Alt+Enter to interrupt)", elem_classes=["prompt"])
  59. self.prompt_img = gr.File(label="", elem_id=f"{self.id_part}_prompt_image", file_count="single", type="binary", visible=False)
  60. with gr.Row(elem_id=f"{self.id_part}_neg_prompt_row", elem_classes=["prompt-row"]):
  61. self.negative_prompt = gr.Textbox(label="Negative prompt", elem_id=f"{self.id_part}_neg_prompt", show_label=False, lines=3, placeholder="Negative prompt\n(Press Ctrl+Enter to generate, Alt+Enter to skip, Ctrl+Alt+Enter to interrupt)", elem_classes=["prompt"])
  62. self.prompt_img.change(
  63. fn=modules.images.image_data,
  64. inputs=[self.prompt_img],
  65. outputs=[self.prompt, self.prompt_img],
  66. show_progress=False,
  67. )
  68. def create_submit_box(self):
  69. with gr.Row(elem_id=f"{self.id_part}_generate_box", elem_classes=["generate-box"] + (["generate-box-compact"] if self.is_compact else []), render=not self.is_compact) as submit_box:
  70. self.submit_box = submit_box
  71. self.interrupt = gr.Button('Interrupt', elem_id=f"{self.id_part}_interrupt", elem_classes="generate-box-interrupt")
  72. self.skip = gr.Button('Skip', elem_id=f"{self.id_part}_skip", elem_classes="generate-box-skip")
  73. self.submit = gr.Button('Generate', elem_id=f"{self.id_part}_generate", variant='primary')
  74. self.skip.click(
  75. fn=lambda: shared.state.skip(),
  76. inputs=[],
  77. outputs=[],
  78. )
  79. self.interrupt.click(
  80. fn=lambda: shared.state.interrupt(),
  81. inputs=[],
  82. outputs=[],
  83. )
  84. def create_tools_row(self):
  85. with gr.Row(elem_id=f"{self.id_part}_tools"):
  86. from modules.ui import paste_symbol, clear_prompt_symbol, restore_progress_symbol
  87. self.paste = ToolButton(value=paste_symbol, elem_id="paste", tooltip="Read generation parameters from prompt or last generation if prompt is empty into user interface.")
  88. self.clear_prompt_button = ToolButton(value=clear_prompt_symbol, elem_id=f"{self.id_part}_clear_prompt", tooltip="Clear prompt")
  89. self.apply_styles = ToolButton(value=ui_prompt_styles.styles_materialize_symbol, elem_id=f"{self.id_part}_style_apply", tooltip="Apply all selected styles to prompts.")
  90. if self.is_img2img:
  91. self.button_interrogate = ToolButton('📎', tooltip='Interrogate CLIP - use CLIP neural network to create a text describing the image, and put it into the prompt field', elem_id="interrogate")
  92. self.button_deepbooru = ToolButton('📦', tooltip='Interrogate DeepBooru - use DeepBooru neural network to create a text describing the image, and put it into the prompt field', elem_id="deepbooru")
  93. self.restore_progress_button = ToolButton(value=restore_progress_symbol, elem_id=f"{self.id_part}_restore_progress", visible=False, tooltip="Restore progress")
  94. self.token_counter = gr.HTML(value="<span>0/75</span>", elem_id=f"{self.id_part}_token_counter", elem_classes=["token-counter"])
  95. self.token_button = gr.Button(visible=False, elem_id=f"{self.id_part}_token_button")
  96. self.negative_token_counter = gr.HTML(value="<span>0/75</span>", elem_id=f"{self.id_part}_negative_token_counter", elem_classes=["token-counter"])
  97. self.negative_token_button = gr.Button(visible=False, elem_id=f"{self.id_part}_negative_token_button")
  98. self.clear_prompt_button.click(
  99. fn=lambda *x: x,
  100. _js="confirm_clear_prompt",
  101. inputs=[self.prompt, self.negative_prompt],
  102. outputs=[self.prompt, self.negative_prompt],
  103. )
  104. def create_styles_ui(self):
  105. self.ui_styles = ui_prompt_styles.UiPromptStyles(self.id_part, self.prompt, self.negative_prompt)
  106. self.ui_styles.setup_apply_button(self.apply_styles)