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
f0f100e6
Commit
f0f100e6
authored
Nov 26, 2023
by
AUTOMATIC1111
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add categories to settings
parent
500de919
Changes
4
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
130 additions
and
28 deletions
+130
-28
javascript/settings.js
javascript/settings.js
+25
-0
modules/options.py
modules/options.py
+68
-7
modules/shared_options.py
modules/shared_options.py
+28
-21
style.css
style.css
+9
-0
No files found.
javascript/settings.js
View file @
f0f100e6
...
...
@@ -44,3 +44,28 @@ onUiLoaded(function() {
buttonShowAllPages
.
addEventListener
(
"
click
"
,
settingsShowAllTabs
);
});
onOptionsChanged
(
function
()
{
if
(
gradioApp
().
querySelector
(
'
#settings .settings-category
'
))
return
;
var
sectionMap
=
{};
gradioApp
().
querySelectorAll
(
'
#settings > div > button
'
).
forEach
(
function
(
x
)
{
sectionMap
[
x
.
textContent
.
trim
()]
=
x
;
});
opts
.
_categories
.
forEach
(
function
(
x
)
{
var
section
=
x
[
0
];
var
category
=
x
[
1
];
var
span
=
document
.
createElement
(
'
SPAN
'
);
span
.
textContent
=
category
;
span
.
className
=
'
settings-category
'
;
var
sectionElem
=
sectionMap
[
section
];
if
(
!
sectionElem
)
return
;
sectionElem
.
parentElement
.
insertBefore
(
span
,
sectionElem
);
});
});
modules/options.py
View file @
f0f100e6
import
json
import
sys
from
dataclasses
import
dataclass
import
gradio
as
gr
...
...
@@ -8,13 +9,14 @@ from modules.shared_cmd_options import cmd_opts
class
OptionInfo
:
def
__init__
(
self
,
default
=
None
,
label
=
""
,
component
=
None
,
component_args
=
None
,
onchange
=
None
,
section
=
None
,
refresh
=
None
,
comment_before
=
''
,
comment_after
=
''
,
infotext
=
None
,
restrict_api
=
False
):
def
__init__
(
self
,
default
=
None
,
label
=
""
,
component
=
None
,
component_args
=
None
,
onchange
=
None
,
section
=
None
,
refresh
=
None
,
comment_before
=
''
,
comment_after
=
''
,
infotext
=
None
,
restrict_api
=
False
,
category_id
=
None
):
self
.
default
=
default
self
.
label
=
label
self
.
component
=
component
self
.
component_args
=
component_args
self
.
onchange
=
onchange
self
.
section
=
section
self
.
category_id
=
category_id
self
.
refresh
=
refresh
self
.
do_not_save
=
False
...
...
@@ -63,7 +65,11 @@ class OptionHTML(OptionInfo):
def
options_section
(
section_identifier
,
options_dict
):
for
v
in
options_dict
.
values
():
v
.
section
=
section_identifier
if
len
(
section_identifier
)
==
2
:
v
.
section
=
section_identifier
elif
len
(
section_identifier
)
==
3
:
v
.
section
=
section_identifier
[
0
:
2
]
v
.
category_id
=
section_identifier
[
2
]
return
options_dict
...
...
@@ -206,6 +212,17 @@ class Options:
d
=
{
k
:
self
.
data
.
get
(
k
,
v
.
default
)
for
k
,
v
in
self
.
data_labels
.
items
()}
d
[
"_comments_before"
]
=
{
k
:
v
.
comment_before
for
k
,
v
in
self
.
data_labels
.
items
()
if
v
.
comment_before
is
not
None
}
d
[
"_comments_after"
]
=
{
k
:
v
.
comment_after
for
k
,
v
in
self
.
data_labels
.
items
()
if
v
.
comment_after
is
not
None
}
item_categories
=
{}
for
item
in
self
.
data_labels
.
values
():
category
=
categories
.
mapping
.
get
(
item
.
category_id
)
category
=
"Uncategorized"
if
category
is
None
else
category
.
label
if
category
not
in
item_categories
:
item_categories
[
category
]
=
item
.
section
[
1
]
# _categories is a list of pairs: [section, category]. Each section (a setting page) will get a special heading above it with the category as text.
d
[
"_categories"
]
=
[[
v
,
k
]
for
k
,
v
in
item_categories
.
items
()]
+
[[
"Defaults"
,
"Other"
]]
return
json
.
dumps
(
d
)
def
add_option
(
self
,
key
,
info
):
...
...
@@ -214,15 +231,40 @@ class Options:
self
.
data
[
key
]
=
info
.
default
def
reorder
(
self
):
"""reorder settings so that all items related to section always go together"""
"""Reorder settings so that:
- all items related to section always go together
- all sections belonging to a category go together
- sections inside a category are ordered alphabetically
- categories are ordered by creation order
Category is a superset of sections: for category "postprocessing" there could be multiple sections: "face restoration", "upscaling".
This function also changes items' category_id so that all items belonging to a section have the same category_id.
"""
category_ids
=
{}
section_categories
=
{}
section_ids
=
{}
settings_items
=
self
.
data_labels
.
items
()
for
_
,
item
in
settings_items
:
if
item
.
section
not
in
section_ids
:
section_ids
[
item
.
section
]
=
len
(
section_ids
)
if
item
.
section
not
in
section_categories
:
section_categories
[
item
.
section
]
=
item
.
category_id
for
_
,
item
in
settings_items
:
item
.
category_id
=
section_categories
.
get
(
item
.
section
)
for
category_id
in
categories
.
mapping
:
if
category_id
not
in
category_ids
:
category_ids
[
category_id
]
=
len
(
category_ids
)
self
.
data_labels
=
dict
(
sorted
(
settings_items
,
key
=
lambda
x
:
section_ids
[
x
[
1
]
.
section
]))
def
sort_key
(
x
):
item
:
OptionInfo
=
x
[
1
]
category_order
=
category_ids
.
get
(
item
.
category_id
,
len
(
category_ids
))
section_order
=
item
.
section
[
1
]
return
category_order
,
section_order
self
.
data_labels
=
dict
(
sorted
(
settings_items
,
key
=
sort_key
))
def
cast_value
(
self
,
key
,
value
):
"""casts an arbitrary to the same type as this setting's value with key
...
...
@@ -245,3 +287,22 @@ class Options:
value
=
expected_type
(
value
)
return
value
@
dataclass
class
OptionsCategory
:
id
:
str
label
:
str
class
OptionsCategories
:
def
__init__
(
self
):
self
.
mapping
=
{}
def
register_category
(
self
,
category_id
,
label
):
if
category_id
in
self
.
mapping
:
return
category_id
self
.
mapping
[
category_id
]
=
OptionsCategory
(
category_id
,
label
)
categories
=
OptionsCategories
()
modules/shared_options.py
View file @
f0f100e6
This diff is collapsed.
Click to expand it.
style.css
View file @
f0f100e6
...
...
@@ -462,6 +462,15 @@ div.toprow-compact-tools{
padding
:
4px
;
}
#settings
>
div
.tab-nav
.settings-category
{
display
:
block
;
margin
:
1em
0
0.25em
0
;
font-weight
:
bold
;
text-decoration
:
underline
;
cursor
:
default
;
user-select
:
none
;
}
#settings_result
{
height
:
1.4em
;
margin
:
0
1.2em
;
...
...
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