From f3d83fd68ab2458f0a24fb242e557b95c1294bb1 Mon Sep 17 00:00:00 2001
From: AUTOMATIC <16777216c@gmail.com>
Date: Sun, 18 Sep 2022 22:25:18 +0300
Subject: [PATCH] add read access to settings for jsavascript add an option to
 disable lightbox modal

---
 javascript/imageviewer.js |  4 ++--
 javascript/ui.js          | 39 +++++++++++++++++++++++++++++++++++++++
 modules/shared.py         |  5 +++++
 modules/ui.py             | 13 +++++++++++--
 script.js                 |  6 +++++-
 5 files changed, 62 insertions(+), 5 deletions(-)

diff --git a/javascript/imageviewer.js b/javascript/imageviewer.js
index 95b8108d..880f1183 100644
--- a/javascript/imageviewer.js
+++ b/javascript/imageviewer.js
@@ -70,8 +70,8 @@ function showGalleryImage(){
                     e.style.cursor='pointer'
 
                     e.addEventListener('click', function (evt) {
-                      showModal(evt)
-
+                        if(!opts.js_modal_lightbox) return;
+                        showModal(evt)
                     },true);
                 }
             });
diff --git a/javascript/ui.js b/javascript/ui.js
index c39e96a1..f3860d2e 100644
--- a/javascript/ui.js
+++ b/javascript/ui.js
@@ -59,3 +59,42 @@ function ask_for_style_name(_, prompt_text, negative_prompt_text) {
     name_ = prompt('Style name:')
     return name_ === null ? [null, null, null]: [name_, prompt_text, negative_prompt_text]
 }
+
+opts = {}
+function apply_settings(jsdata){
+    console.log(jsdata)
+
+    opts = JSON.parse(jsdata)
+
+    return jsdata
+}
+
+onUiUpdate(function(){
+	if(Object.keys(opts).length != 0) return;
+
+	json_elem = gradioApp().getElementById('settings_json')
+	if(json_elem == null) return;
+
+    textarea = json_elem.querySelector('textarea')
+    jsdata = textarea.value
+    opts = JSON.parse(jsdata)
+
+
+    Object.defineProperty(textarea, 'value', {
+        set: function(newValue) {
+            var valueProp = Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype, 'value');
+            var oldValue = valueProp.get.call(textarea);
+            valueProp.set.call(textarea, newValue);
+
+            if (oldValue != newValue) {
+                opts = JSON.parse(textarea.value)
+            }
+        },
+        get: function() {
+            var valueProp = Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype, 'value');
+            return valueProp.get.call(textarea);
+        }
+    });
+
+    json_elem.parentElement.style.display="none"
+})
diff --git a/modules/shared.py b/modules/shared.py
index eb4db55a..78de9f9e 100644
--- a/modules/shared.py
+++ b/modules/shared.py
@@ -159,6 +159,7 @@ class Options:
         "interrogate_clip_max_length": OptionInfo(48, "Interrogate: maximum description length", gr.Slider, {"minimum": 1, "maximum": 256, "step": 1}),
         "interrogate_clip_dict_limit": OptionInfo(1500, "Interrogate: maximum number of lines in text file (0 = No limit)"),
         "sd_model_checkpoint": OptionInfo(None, "Stable Diffusion checkpoint", gr.Radio, lambda: {"choices": [x.title for x in modules.sd_models.checkpoints_list.values()]}),
+        "js_modal_lightbox": OptionInfo(True, "Enable full page image viewer"),
     }
 
     def __init__(self):
@@ -193,6 +194,10 @@ class Options:
         item = self.data_labels.get(key)
         item.onchange = func
 
+    def dumpjson(self):
+        d = {k: self.data.get(k, self.data_labels.get(k).default) for k in self.data_labels.keys()}
+        return json.dumps(d)
+
 
 opts = Options()
 if os.path.exists(config_filename):
diff --git a/modules/ui.py b/modules/ui.py
index 7500aae7..0303e057 100644
--- a/modules/ui.py
+++ b/modules/ui.py
@@ -858,7 +858,7 @@ def create_ui(txt2img, img2img, run_extras, run_pnginfo):
         return 'Settings applied.'
 
     with gr.Blocks(analytics_enabled=False) as settings_interface:
-        submit = gr.Button(value="Apply settings", variant='primary')
+        settings_submit = gr.Button(value="Apply settings", variant='primary')
         result = gr.HTML()
 
         with gr.Row(elem_id="settings").style(equal_height=False):
@@ -870,7 +870,7 @@ def create_ui(txt2img, img2img, run_extras, run_pnginfo):
                         if index < len(keys):
                             components.append(create_setting_component(keys[index]))
 
-        submit.click(
+        settings_submit.click(
             fn=run_settings,
             inputs=components,
             outputs=[result]
@@ -896,11 +896,20 @@ def create_ui(txt2img, img2img, run_extras, run_pnginfo):
         css += css_hide_progressbar
 
     with gr.Blocks(css=css, analytics_enabled=False, title="Stable Diffusion") as demo:
+
         with gr.Tabs() as tabs:
             for interface, label, ifid in interfaces:
                 with gr.TabItem(label, id=ifid):
                     interface.render()
 
+        text_settings = gr.Textbox(elem_id="settings_json", value=opts.dumpjson(), visible=False)
+
+        settings_submit.click(
+            fn=lambda: opts.dumpjson(),
+            inputs=[],
+            outputs=[text_settings],
+        )
+
         tabs.change(
             fn=lambda x: x,
             inputs=[init_img_with_mask],
diff --git a/script.js b/script.js
index 1a258cd9..a1b93ae9 100644
--- a/script.js
+++ b/script.js
@@ -9,7 +9,11 @@ function onUiUpdate(callback){
 
 function uiUpdate(root){
 	uiUpdateCallbacks.forEach(function(x){
-	    x()
+        try {
+            x()
+        } catch (e) {
+            (console.error || console.log).call(console, e.message, e);
+        }
 	})
 }
 
-- 
GitLab