ui_toprow.py 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  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. interrupting = None
  14. skip = None
  15. submit = None
  16. paste = None
  17. clear_prompt_button = None
  18. apply_styles = None
  19. restore_progress_button = None
  20. token_counter = None
  21. token_button = None
  22. negative_token_counter = None
  23. negative_token_button = None
  24. ui_styles = None
  25. submit_box = None
  26. def __init__(self, is_img2img, is_compact=False, id_part=None):
  27. if id_part is None:
  28. id_part = "img2img" if is_img2img else "txt2img"
  29. self.id_part = id_part
  30. self.is_img2img = is_img2img
  31. self.is_compact = is_compact
  32. if not is_compact:
  33. with gr.Row(elem_id=f"{id_part}_toprow", variant="compact"):
  34. self.create_classic_toprow()
  35. else:
  36. self.create_submit_box()
  37. def create_classic_toprow(self):
  38. self.create_prompts()
  39. with gr.Column(scale=1, elem_id=f"{self.id_part}_actions_column"):
  40. self.create_submit_box()
  41. self.create_tools_row()
  42. self.create_styles_ui()
  43. def create_inline_toprow_prompts(self):
  44. if not self.is_compact:
  45. return
  46. self.create_prompts()
  47. with gr.Row(elem_classes=["toprow-compact-stylerow"]):
  48. with gr.Column(elem_classes=["toprow-compact-tools"]):
  49. self.create_tools_row()
  50. with gr.Column():
  51. self.create_styles_ui()
  52. def create_inline_toprow_image(self):
  53. if not self.is_compact:
  54. return
  55. self.submit_box.render()
  56. def create_prompts(self):
  57. with gr.Column(elem_id=f"{self.id_part}_prompt_container", elem_classes=["prompt-container-compact"] if self.is_compact else [], scale=6):
  58. with gr.Row(elem_id=f"{self.id_part}_prompt_row", elem_classes=["prompt-row"]):
  59. 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, Esc to interrupt)", elem_classes=["prompt"])
  60. self.prompt_img = gr.File(label="", elem_id=f"{self.id_part}_prompt_image", file_count="single", type="binary", visible=False)
  61. with gr.Row(elem_id=f"{self.id_part}_neg_prompt_row", elem_classes=["prompt-row"]):
  62. 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, Esc to interrupt)", elem_classes=["prompt"])
  63. self.prompt_img.change(
  64. fn=modules.images.image_data,
  65. inputs=[self.prompt_img],
  66. outputs=[self.prompt, self.prompt_img],
  67. show_progress=False,
  68. )
  69. def create_submit_box(self):
  70. 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:
  71. self.submit_box = submit_box
  72. self.interrupt = gr.Button('Interrupt', elem_id=f"{self.id_part}_interrupt", elem_classes="generate-box-interrupt", tooltip="End generation immediately or after completing current batch")
  73. self.skip = gr.Button('Skip', elem_id=f"{self.id_part}_skip", elem_classes="generate-box-skip", tooltip="Stop generation of current batch and continues onto next batch")
  74. self.interrupting = gr.Button('Interrupting...', elem_id=f"{self.id_part}_interrupting", elem_classes="generate-box-interrupting", tooltip="Interrupting generation...")
  75. self.submit = gr.Button('Generate', elem_id=f"{self.id_part}_generate", variant='primary', tooltip="Right click generate forever menu")
  76. def interrupt_function():
  77. if not shared.state.stopping_generation and shared.state.job_count > 1 and shared.opts.interrupt_after_current:
  78. shared.state.stop_generating()
  79. gr.Info("Generation will stop after finishing this image, click again to stop immediately.")
  80. else:
  81. shared.state.interrupt()
  82. self.skip.click(fn=shared.state.skip)
  83. self.interrupt.click(fn=interrupt_function, _js='function(){ showSubmitInterruptingPlaceholder("' + self.id_part + '"); }')
  84. self.interrupting.click(fn=interrupt_function)
  85. def create_tools_row(self):
  86. with gr.Row(elem_id=f"{self.id_part}_tools"):
  87. from modules.ui import paste_symbol, clear_prompt_symbol, restore_progress_symbol
  88. 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.")
  89. self.clear_prompt_button = ToolButton(value=clear_prompt_symbol, elem_id=f"{self.id_part}_clear_prompt", tooltip="Clear prompt")
  90. 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.")
  91. if self.is_img2img:
  92. 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")
  93. 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")
  94. self.restore_progress_button = ToolButton(value=restore_progress_symbol, elem_id=f"{self.id_part}_restore_progress", visible=False, tooltip="Restore progress")
  95. self.token_counter = gr.HTML(value="<span>0/75</span>", elem_id=f"{self.id_part}_token_counter", elem_classes=["token-counter"], visible=False)
  96. self.token_button = gr.Button(visible=False, elem_id=f"{self.id_part}_token_button")
  97. self.negative_token_counter = gr.HTML(value="<span>0/75</span>", elem_id=f"{self.id_part}_negative_token_counter", elem_classes=["token-counter"], visible=False)
  98. self.negative_token_button = gr.Button(visible=False, elem_id=f"{self.id_part}_negative_token_button")
  99. self.clear_prompt_button.click(
  100. fn=lambda *x: x,
  101. _js="confirm_clear_prompt",
  102. inputs=[self.prompt, self.negative_prompt],
  103. outputs=[self.prompt, self.negative_prompt],
  104. )
  105. def create_styles_ui(self):
  106. self.ui_styles = ui_prompt_styles.UiPromptStyles(self.id_part, self.prompt, self.negative_prompt)
  107. self.ui_styles.setup_apply_button(self.apply_styles)