Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
S
Stable Diffusion Webui
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
novelai-storage
Stable Diffusion Webui
Commits
5bd27247
Commit
5bd27247
authored
Mar 16, 2024
by
AUTOMATIC1111
Committed by
GitHub
Mar 16, 2024
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #15205 from AUTOMATIC1111/callback_order
Callback order
parents
9fd69327
1bbc8a15
Changes
7
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
361 additions
and
121 deletions
+361
-121
modules/extensions.py
modules/extensions.py
+41
-0
modules/script_callbacks.py
modules/script_callbacks.py
+169
-73
modules/scripts.py
modules/scripts.py
+75
-42
modules/shared_items.py
modules/shared_items.py
+42
-0
modules/ui_settings.py
modules/ui_settings.py
+7
-1
modules/util.py
modules/util.py
+23
-5
style.css
style.css
+4
-0
No files found.
modules/extensions.py
View file @
5bd27247
from
__future__
import
annotations
from
__future__
import
annotations
import
configparser
import
configparser
import
dataclasses
import
os
import
os
import
threading
import
threading
import
re
import
re
...
@@ -22,6 +23,13 @@ def active():
...
@@ -22,6 +23,13 @@ def active():
return
[
x
for
x
in
extensions
if
x
.
enabled
]
return
[
x
for
x
in
extensions
if
x
.
enabled
]
@
dataclasses
.
dataclass
class
CallbackOrderInfo
:
name
:
str
before
:
list
after
:
list
class
ExtensionMetadata
:
class
ExtensionMetadata
:
filename
=
"metadata.ini"
filename
=
"metadata.ini"
config
:
configparser
.
ConfigParser
config
:
configparser
.
ConfigParser
...
@@ -65,6 +73,22 @@ class ExtensionMetadata:
...
@@ -65,6 +73,22 @@ class ExtensionMetadata:
# both "," and " " are accepted as separator
# both "," and " " are accepted as separator
return
[
x
for
x
in
re
.
split
(
r"[,\s]+"
,
text
.
strip
())
if
x
]
return
[
x
for
x
in
re
.
split
(
r"[,\s]+"
,
text
.
strip
())
if
x
]
def
list_callback_order_instructions
(
self
):
for
section
in
self
.
config
.
sections
():
if
not
section
.
startswith
(
"callbacks/"
):
continue
callback_name
=
section
[
10
:]
if
not
callback_name
.
startswith
(
self
.
canonical_name
):
errors
.
report
(
f
"Callback order section for extension {self.canonical_name} is referencing the wrong extension: {section}"
)
continue
before
=
self
.
parse_list
(
self
.
config
.
get
(
section
,
'Before'
,
fallback
=
''
))
after
=
self
.
parse_list
(
self
.
config
.
get
(
section
,
'After'
,
fallback
=
''
))
yield
CallbackOrderInfo
(
callback_name
,
before
,
after
)
class
Extension
:
class
Extension
:
lock
=
threading
.
Lock
()
lock
=
threading
.
Lock
()
...
@@ -188,6 +212,7 @@ class Extension:
...
@@ -188,6 +212,7 @@ class Extension:
def
list_extensions
():
def
list_extensions
():
extensions
.
clear
()
extensions
.
clear
()
extension_paths
.
clear
()
if
shared
.
cmd_opts
.
disable_all_extensions
:
if
shared
.
cmd_opts
.
disable_all_extensions
:
print
(
"***
\"
--disable-all-extensions
\"
arg was used, will not load any extensions ***"
)
print
(
"***
\"
--disable-all-extensions
\"
arg was used, will not load any extensions ***"
)
...
@@ -222,6 +247,7 @@ def list_extensions():
...
@@ -222,6 +247,7 @@ def list_extensions():
is_builtin
=
dirname
==
extensions_builtin_dir
is_builtin
=
dirname
==
extensions_builtin_dir
extension
=
Extension
(
name
=
extension_dirname
,
path
=
path
,
enabled
=
extension_dirname
not
in
shared
.
opts
.
disabled_extensions
,
is_builtin
=
is_builtin
,
metadata
=
metadata
)
extension
=
Extension
(
name
=
extension_dirname
,
path
=
path
,
enabled
=
extension_dirname
not
in
shared
.
opts
.
disabled_extensions
,
is_builtin
=
is_builtin
,
metadata
=
metadata
)
extensions
.
append
(
extension
)
extensions
.
append
(
extension
)
extension_paths
[
extension
.
path
]
=
extension
loaded_extensions
[
canonical_name
]
=
extension
loaded_extensions
[
canonical_name
]
=
extension
# check for requirements
# check for requirements
...
@@ -240,4 +266,19 @@ def list_extensions():
...
@@ -240,4 +266,19 @@ def list_extensions():
continue
continue
def
find_extension
(
filename
):
parentdir
=
os
.
path
.
dirname
(
os
.
path
.
realpath
(
filename
))
while
parentdir
!=
filename
:
extension
=
extension_paths
.
get
(
parentdir
)
if
extension
is
not
None
:
return
extension
filename
=
parentdir
parentdir
=
os
.
path
.
dirname
(
filename
)
return
None
extensions
:
list
[
Extension
]
=
[]
extensions
:
list
[
Extension
]
=
[]
extension_paths
:
dict
[
str
,
Extension
]
=
{}
modules/script_callbacks.py
View file @
5bd27247
This diff is collapsed.
Click to expand it.
modules/scripts.py
View file @
5bd27247
This diff is collapsed.
Click to expand it.
modules/shared_items.py
View file @
5bd27247
import
html
import
sys
import
sys
from
modules
import
script_callbacks
,
scripts
,
ui_components
from
modules.options
import
OptionHTML
,
OptionInfo
from
modules.shared_cmd_options
import
cmd_opts
from
modules.shared_cmd_options
import
cmd_opts
...
@@ -118,6 +121,45 @@ def ui_reorder_categories():
...
@@ -118,6 +121,45 @@ def ui_reorder_categories():
yield
"scripts"
yield
"scripts"
def
callbacks_order_settings
():
options
=
{
"sd_vae_explanation"
:
OptionHTML
(
"""
For categories below, callbacks added to dropdowns happen before others, in order listed.
"""
),
}
callback_options
=
{}
for
category
,
_
in
script_callbacks
.
enumerate_callbacks
():
callback_options
[
category
]
=
script_callbacks
.
ordered_callbacks
(
category
,
enable_user_sort
=
False
)
for
method_name
in
scripts
.
scripts_txt2img
.
callback_names
:
callback_options
[
"script_"
+
method_name
]
=
scripts
.
scripts_txt2img
.
create_ordered_callbacks_list
(
method_name
,
enable_user_sort
=
False
)
for
method_name
in
scripts
.
scripts_img2img
.
callback_names
:
callbacks
=
callback_options
.
get
(
"script_"
+
method_name
,
[])
for
addition
in
scripts
.
scripts_img2img
.
create_ordered_callbacks_list
(
method_name
,
enable_user_sort
=
False
):
if
any
(
x
.
name
==
addition
.
name
for
x
in
callbacks
):
continue
callbacks
.
append
(
addition
)
callback_options
[
"script_"
+
method_name
]
=
callbacks
for
category
,
callbacks
in
callback_options
.
items
():
if
not
callbacks
:
continue
option_info
=
OptionInfo
([],
f
"{category} callback priority"
,
ui_components
.
DropdownMulti
,
{
"choices"
:
[
x
.
name
for
x
in
callbacks
]})
option_info
.
needs_restart
()
option_info
.
html
(
"<div class='info'>Default order: <ol>"
+
""
.
join
(
f
"<li>{html.escape(x.name)}</li>
\n
"
for
x
in
callbacks
)
+
"</ol></div>"
)
options
[
'prioritized_callbacks_'
+
category
]
=
option_info
return
options
class
Shared
(
sys
.
modules
[
__name__
]
.
__class__
):
class
Shared
(
sys
.
modules
[
__name__
]
.
__class__
):
"""
"""
this class is here to provide sd_model field as a property, so that it can be created and loaded on demand rather than
this class is here to provide sd_model field as a property, so that it can be created and loaded on demand rather than
...
...
modules/ui_settings.py
View file @
5bd27247
import
gradio
as
gr
import
gradio
as
gr
from
modules
import
ui_common
,
shared
,
script_callbacks
,
scripts
,
sd_models
,
sysinfo
,
timer
from
modules
import
ui_common
,
shared
,
script_callbacks
,
scripts
,
sd_models
,
sysinfo
,
timer
,
shared_items
from
modules.call_queue
import
wrap_gradio_call
from
modules.call_queue
import
wrap_gradio_call
from
modules.options
import
options_section
from
modules.shared
import
opts
from
modules.shared
import
opts
from
modules.ui_components
import
FormRow
from
modules.ui_components
import
FormRow
from
modules.ui_gradio_extensions
import
reload_javascript
from
modules.ui_gradio_extensions
import
reload_javascript
...
@@ -108,6 +109,11 @@ class UiSettings:
...
@@ -108,6 +109,11 @@ class UiSettings:
shared
.
settings_components
=
self
.
component_dict
shared
.
settings_components
=
self
.
component_dict
# we add this as late as possible so that scripts have already registered their callbacks
opts
.
data_labels
.
update
(
options_section
((
'callbacks'
,
"Callbacks"
,
"system"
),
{
**
shared_items
.
callbacks_order_settings
(),
}))
opts
.
reorder
()
opts
.
reorder
()
with
gr
.
Blocks
(
analytics_enabled
=
False
)
as
settings_interface
:
with
gr
.
Blocks
(
analytics_enabled
=
False
)
as
settings_interface
:
...
...
modules/util.py
View file @
5bd27247
...
@@ -148,8 +148,26 @@ class MassFileLister:
...
@@ -148,8 +148,26 @@ class MassFileLister:
"""Clear the cache of all directories."""
"""Clear the cache of all directories."""
self
.
cached_dirs
.
clear
()
self
.
cached_dirs
.
clear
()
def
update_file_entry
(
self
,
path
):
"""Update the cache for a specific directory."""
def
topological_sort
(
dependencies
):
dirname
,
filename
=
os
.
path
.
split
(
path
)
"""Accepts a dictionary mapping name to its dependencies, returns a list of names ordered according to dependencies.
if
cached_dir
:
=
self
.
cached_dirs
.
get
(
dirname
):
Ignores errors relating to missing dependeencies or circular dependencies
cached_dir
.
update_entry
(
filename
)
"""
visited
=
{}
result
=
[]
def
inner
(
name
):
visited
[
name
]
=
True
for
dep
in
dependencies
.
get
(
name
,
[]):
if
dep
in
dependencies
and
dep
not
in
visited
:
inner
(
dep
)
result
.
append
(
name
)
for
depname
in
dependencies
:
if
depname
not
in
visited
:
inner
(
depname
)
return
result
style.css
View file @
5bd27247
...
@@ -528,6 +528,10 @@ table.popup-table .link{
...
@@ -528,6 +528,10 @@ table.popup-table .link{
opacity
:
0.75
;
opacity
:
0.75
;
}
}
.settings-comment
.info
ol
{
margin
:
0.4em
0
0.8em
1em
;
}
#sysinfo_download
a
.sysinfo_big_link
{
#sysinfo_download
a
.sysinfo_big_link
{
font-size
:
24pt
;
font-size
:
24pt
;
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment