123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- import json
- import gradio as gr
- from modules import scripts, ui, errors
- from modules.infotext import PasteField
- from modules.shared import cmd_opts
- from modules.ui_components import ToolButton
- class ScriptSeed(scripts.ScriptBuiltinUI):
- section = "seed"
- create_group = False
- def __init__(self):
- self.seed = None
- self.reuse_seed = None
- self.reuse_subseed = None
- def title(self):
- return "Seed"
- def show(self, is_img2img):
- return scripts.AlwaysVisible
- def ui(self, is_img2img):
- with gr.Row(elem_id=self.elem_id("seed_row")):
- if cmd_opts.use_textbox_seed:
- self.seed = gr.Textbox(label='Seed', value="", elem_id=self.elem_id("seed"), min_width=100)
- else:
- self.seed = gr.Number(label='Seed', value=-1, elem_id=self.elem_id("seed"), min_width=100, precision=0)
- random_seed = ToolButton(ui.random_symbol, elem_id=self.elem_id("random_seed"), tooltip="Set seed to -1, which will cause a new random number to be used every time")
- reuse_seed = ToolButton(ui.reuse_symbol, elem_id=self.elem_id("reuse_seed"), tooltip="Reuse seed from last generation, mostly useful if it was randomized")
- seed_checkbox = gr.Checkbox(label='Extra', elem_id=self.elem_id("subseed_show"), value=False)
- with gr.Group(visible=False, elem_id=self.elem_id("seed_extras")) as seed_extras:
- with gr.Row(elem_id=self.elem_id("subseed_row")):
- subseed = gr.Number(label='Variation seed', value=-1, elem_id=self.elem_id("subseed"), precision=0)
- random_subseed = ToolButton(ui.random_symbol, elem_id=self.elem_id("random_subseed"))
- reuse_subseed = ToolButton(ui.reuse_symbol, elem_id=self.elem_id("reuse_subseed"))
- subseed_strength = gr.Slider(label='Variation strength', value=0.0, minimum=0, maximum=1, step=0.01, elem_id=self.elem_id("subseed_strength"))
- with gr.Row(elem_id=self.elem_id("seed_resize_from_row")):
- seed_resize_from_w = gr.Slider(minimum=0, maximum=2048, step=8, label="Resize seed from width", value=0, elem_id=self.elem_id("seed_resize_from_w"))
- seed_resize_from_h = gr.Slider(minimum=0, maximum=2048, step=8, label="Resize seed from height", value=0, elem_id=self.elem_id("seed_resize_from_h"))
- random_seed.click(fn=None, _js="function(){setRandomSeed('" + self.elem_id("seed") + "')}", show_progress=False, inputs=[], outputs=[])
- random_subseed.click(fn=None, _js="function(){setRandomSeed('" + self.elem_id("subseed") + "')}", show_progress=False, inputs=[], outputs=[])
- seed_checkbox.change(lambda x: gr.update(visible=x), show_progress=False, inputs=[seed_checkbox], outputs=[seed_extras])
- self.infotext_fields = [
- PasteField(self.seed, "Seed", api="seed"),
- PasteField(seed_checkbox, lambda d: "Variation seed" in d or "Seed resize from-1" in d),
- PasteField(subseed, "Variation seed", api="subseed"),
- PasteField(subseed_strength, "Variation seed strength", api="subseed_strength"),
- PasteField(seed_resize_from_w, "Seed resize from-1", api="seed_resize_from_h"),
- PasteField(seed_resize_from_h, "Seed resize from-2", api="seed_resize_from_w"),
- ]
- self.on_after_component(lambda x: connect_reuse_seed(self.seed, reuse_seed, x.component, False), elem_id=f'generation_info_{self.tabname}')
- self.on_after_component(lambda x: connect_reuse_seed(subseed, reuse_subseed, x.component, True), elem_id=f'generation_info_{self.tabname}')
- return self.seed, seed_checkbox, subseed, subseed_strength, seed_resize_from_w, seed_resize_from_h
- def setup(self, p, seed, seed_checkbox, subseed, subseed_strength, seed_resize_from_w, seed_resize_from_h):
- p.seed = seed
- if seed_checkbox and subseed_strength > 0:
- p.subseed = subseed
- p.subseed_strength = subseed_strength
- if seed_checkbox and seed_resize_from_w > 0 and seed_resize_from_h > 0:
- p.seed_resize_from_w = seed_resize_from_w
- p.seed_resize_from_h = seed_resize_from_h
- def connect_reuse_seed(seed: gr.Number, reuse_seed: gr.Button, generation_info: gr.Textbox, is_subseed):
- """ Connects a 'reuse (sub)seed' button's click event so that it copies last used
- (sub)seed value from generation info the to the seed field. If copying subseed and subseed strength
- was 0, i.e. no variation seed was used, it copies the normal seed value instead."""
- def copy_seed(gen_info_string: str, index):
- res = -1
- try:
- gen_info = json.loads(gen_info_string)
- index -= gen_info.get('index_of_first_image', 0)
- if is_subseed and gen_info.get('subseed_strength', 0) > 0:
- all_subseeds = gen_info.get('all_subseeds', [-1])
- res = all_subseeds[index if 0 <= index < len(all_subseeds) else 0]
- else:
- all_seeds = gen_info.get('all_seeds', [-1])
- res = all_seeds[index if 0 <= index < len(all_seeds) else 0]
- except json.decoder.JSONDecodeError:
- if gen_info_string:
- errors.report(f"Error parsing JSON generation info: {gen_info_string}")
- return [res, gr.update()]
- reuse_seed.click(
- fn=copy_seed,
- _js="(x, y) => [x, selected_gallery_index()]",
- show_progress=False,
- inputs=[generation_info, seed],
- outputs=[seed, seed]
- )
|