Browse Source

Fix for Prompts_from_file showing extra textbox.

Tony Beeman 2 years ago
parent
commit
e2930f9821
2 changed files with 30 additions and 4 deletions
  1. 26 4
      modules/scripts.py
  2. 4 0
      scripts/prompts_from_file.py

+ 26 - 4
modules/scripts.py

@@ -1,4 +1,5 @@
 import os
+from pydoc import visiblename
 import sys
 import traceback
 
@@ -31,6 +32,15 @@ class Script:
     def show(self, is_img2img):
         return True
 
+
+    # Called when the ui for this script has been shown.
+    # Useful for hiding some controls, since the scripts module sets visibility to
+    # everything to true. The parameters will be the parameters returned by the ui method
+    # The return value should be gradio updates, similar to what you would return
+    # from a Gradio event handler.
+    def on_show(self, *args):
+        return [ui.gr_show(True)] * len(args)
+
     # This is where the additional processing is implemented. The parameters include
     # self, the model object "p" (a StableDiffusionProcessing class, see
     # processing.py), and the parameters returned by the ui method.
@@ -125,20 +135,32 @@ class ScriptRunner:
             inputs += controls
             script.args_to = len(inputs)
 
-        def select_script(script_index):
+        def select_script(*args):
+            script_index = args[0]
+            on_show_updates = []
             if 0 < script_index <= len(self.scripts):
                 script = self.scripts[script_index-1]
                 args_from = script.args_from
                 args_to = script.args_to
+                script_args = args[args_from:args_to]
+                on_show_updates = wrap_call(script.on_show, script.filename, "on_show", *script_args)
             else:
                 args_from = 0
                 args_to = 0
 
-            return [ui.gr_show(True if i == 0 else args_from <= i < args_to) for i in range(len(inputs))]
+            ret = [ ui.gr_show(True)] # always show the dropdown
+            for i in range(1, len(inputs)):
+                if (args_from <= i < args_to):
+                    ret.append( on_show_updates[i - args_from] )
+                else:
+                    ret.append(ui.gr_show(False))
+            return ret
+
+            # return [ui.gr_show(True if (i == 0) else on_show_updates[i - args_from] if args_from <= i < args_to else False) for i in range(len(inputs))]
 
         dropdown.change(
             fn=select_script,
-            inputs=[dropdown],
+            inputs=inputs,
             outputs=inputs
         )
 
@@ -198,4 +220,4 @@ def reload_scripts(basedir):
     load_scripts(basedir)
 
     scripts_txt2img = ScriptRunner()
-    scripts_img2img = ScriptRunner()
+    scripts_img2img = ScriptRunner()

+ 4 - 0
scripts/prompts_from_file.py

@@ -10,6 +10,7 @@ from modules.processing import Processed, process_images
 from PIL import Image
 from modules.shared import opts, cmd_opts, state
 
+g_txt_mode = False
 
 class Script(scripts.Script):
     def title(self):
@@ -29,6 +30,9 @@ class Script(scripts.Script):
         checkbox_txt.change(fn=lambda x: [gr.File.update(visible = not x), gr.TextArea.update(visible = x)], inputs=[checkbox_txt], outputs=[file, prompt_txt])
         return [checkbox_txt, file, prompt_txt]
 
+    def on_show(self, checkbox_txt, file, prompt_txt):
+        return [ gr.Checkbox.update(visible = True), gr.File.update(visible = not checkbox_txt), gr.TextArea.update(visible = checkbox_txt) ]
+
     def run(self, p, checkbox_txt, data: bytes, prompt_txt: str):
         if (checkbox_txt):
             lines = [x.strip() for x in prompt_txt.splitlines()]