Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
S
stable-diffusion-webui
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
stable-diffusion-webui
Commits
6b77af7a
Unverified
Commit
6b77af7a
authored
Oct 14, 2022
by
AUTOMATIC1111
Committed by
GitHub
Oct 14, 2022
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #2396 from yfszzx/master
Add a "History" tab
parents
67f447dd
f7712e28
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
375 additions
and
0 deletions
+375
-0
.gitignore
.gitignore
+2
-0
images_history.js
javascript/images_history.js
+198
-0
images_history.py
modules/images_history.py
+165
-0
ui.py
modules/ui.py
+10
-0
No files found.
.gitignore
View file @
6b77af7a
...
...
@@ -27,3 +27,5 @@ __pycache__
notification.mp3
/SwinIR
/textual_inversion
/images_history_testui.py
/repositorieslatent-diffusion
javascript/images_history.js
0 → 100644
View file @
6b77af7a
var
images_history_click_image
=
function
(){
if
(
!
this
.
classList
.
contains
(
"transform"
)){
var
gallery
=
images_history_get_parent_by_class
(
this
,
"images_history_cantainor"
);
var
buttons
=
gallery
.
querySelectorAll
(
".gallery-item"
);
var
i
=
0
;
var
hidden_list
=
[];
buttons
.
forEach
(
function
(
e
){
if
(
e
.
style
.
display
==
"none"
){
hidden_list
.
push
(
i
);
}
i
+=
1
;
})
if
(
hidden_list
.
length
>
0
){
setTimeout
(
images_history_hide_buttons
,
10
,
hidden_list
,
gallery
);
}
}
images_history_set_image_info
(
this
);
}
var
images_history_click_tab
=
function
(){
var
tabs_box
=
gradioApp
().
getElementById
(
"images_history_tab"
);
if
(
!
tabs_box
.
classList
.
contains
(
this
.
getAttribute
(
"tabname"
)))
{
gradioApp
().
getElementById
(
this
.
getAttribute
(
"tabname"
)
+
"_images_history_renew_page"
).
click
();
tabs_box
.
classList
.
add
(
this
.
getAttribute
(
"tabname"
))
}
}
function
images_history_disabled_del
(){
gradioApp
().
querySelectorAll
(
".images_history_del_button"
).
forEach
(
function
(
btn
){
btn
.
setAttribute
(
'disabled'
,
'disabled'
);
});
}
function
images_history_get_parent_by_class
(
item
,
class_name
){
var
parent
=
item
.
parentElement
;
while
(
!
parent
.
classList
.
contains
(
class_name
)){
parent
=
parent
.
parentElement
;
}
return
parent
;
}
function
images_history_get_parent_by_tagname
(
item
,
tagname
){
var
parent
=
item
.
parentElement
;
tagname
=
tagname
.
toUpperCase
()
while
(
parent
.
tagName
!=
tagname
){
console
.
log
(
parent
.
tagName
,
tagname
)
parent
=
parent
.
parentElement
;
}
return
parent
;
}
function
images_history_hide_buttons
(
hidden_list
,
gallery
){
var
buttons
=
gallery
.
querySelectorAll
(
".gallery-item"
);
var
num
=
0
;
buttons
.
forEach
(
function
(
e
){
if
(
e
.
style
.
display
==
"none"
){
num
+=
1
;
}
});
if
(
num
==
hidden_list
.
length
){
setTimeout
(
images_history_hide_buttons
,
10
,
hidden_list
,
gallery
);
}
for
(
i
in
hidden_list
){
buttons
[
hidden_list
[
i
]].
style
.
display
=
"none"
;
}
}
function
images_history_set_image_info
(
button
){
var
buttons
=
images_history_get_parent_by_tagname
(
button
,
"DIV"
).
querySelectorAll
(
".gallery-item"
);
var
index
=
-
1
;
var
i
=
0
;
buttons
.
forEach
(
function
(
e
){
if
(
e
==
button
){
index
=
i
;
}
if
(
e
.
style
.
display
!=
"none"
){
i
+=
1
;
}
});
var
gallery
=
images_history_get_parent_by_class
(
button
,
"images_history_cantainor"
);
var
set_btn
=
gallery
.
querySelector
(
".images_history_set_index"
);
var
curr_idx
=
set_btn
.
getAttribute
(
"img_index"
,
index
);
if
(
curr_idx
!=
index
)
{
set_btn
.
setAttribute
(
"img_index"
,
index
);
images_history_disabled_del
();
}
set_btn
.
click
();
}
function
images_history_get_current_img
(
tabname
,
image_path
,
files
){
return
[
gradioApp
().
getElementById
(
tabname
+
'_images_history_set_index'
).
getAttribute
(
"img_index"
),
image_path
,
files
];
}
function
images_history_delete
(
del_num
,
tabname
,
img_path
,
img_file_name
,
page_index
,
filenames
,
image_index
){
image_index
=
parseInt
(
image_index
);
var
tab
=
gradioApp
().
getElementById
(
tabname
+
'_images_history'
);
var
set_btn
=
tab
.
querySelector
(
".images_history_set_index"
);
var
buttons
=
[];
tab
.
querySelectorAll
(
".gallery-item"
).
forEach
(
function
(
e
){
if
(
e
.
style
.
display
!=
'none'
){
buttons
.
push
(
e
);
}
});
var
img_num
=
buttons
.
length
/
2
;
if
(
img_num
<=
del_num
){
setTimeout
(
function
(
tabname
){
gradioApp
().
getElementById
(
tabname
+
'_images_history_renew_page'
).
click
();
},
30
,
tabname
);
}
else
{
var
next_img
for
(
var
i
=
0
;
i
<
del_num
;
i
++
){
if
(
image_index
+
i
<
image_index
+
img_num
){
buttons
[
image_index
+
i
].
style
.
display
=
'none'
;
buttons
[
image_index
+
img_num
+
1
].
style
.
display
=
'none'
;
next_img
=
image_index
+
i
+
1
}
}
var
bnt
;
if
(
next_img
>=
img_num
){
btn
=
buttons
[
image_index
-
del_num
];
}
else
{
btn
=
buttons
[
next_img
];
}
setTimeout
(
function
(
btn
){
btn
.
click
()},
30
,
btn
);
}
images_history_disabled_del
();
return
[
del_num
,
tabname
,
img_path
,
img_file_name
,
page_index
,
filenames
,
image_index
];
}
function
images_history_turnpage
(
img_path
,
page_index
,
image_index
,
tabname
){
var
buttons
=
gradioApp
().
getElementById
(
tabname
+
'_images_history'
).
querySelectorAll
(
".gallery-item"
);
buttons
.
forEach
(
function
(
elem
)
{
elem
.
style
.
display
=
'block'
;
})
return
[
img_path
,
page_index
,
image_index
,
tabname
];
}
function
images_history_enable_del_buttons
(){
gradioApp
().
querySelectorAll
(
".images_history_del_button"
).
forEach
(
function
(
btn
){
btn
.
removeAttribute
(
'disabled'
);
})
}
function
images_history_init
(){
var
load_txt2img_button
=
gradioApp
().
getElementById
(
'txt2img_images_history_renew_page'
)
if
(
load_txt2img_button
){
for
(
var
i
in
images_history_tab_list
){
tab
=
images_history_tab_list
[
i
];
gradioApp
().
getElementById
(
tab
+
'_images_history'
).
classList
.
add
(
"images_history_cantainor"
);
gradioApp
().
getElementById
(
tab
+
'_images_history_set_index'
).
classList
.
add
(
"images_history_set_index"
);
gradioApp
().
getElementById
(
tab
+
'_images_history_del_button'
).
classList
.
add
(
"images_history_del_button"
);
gradioApp
().
getElementById
(
tab
+
'_images_history_gallery'
).
classList
.
add
(
"images_history_gallery"
);
}
var
tabs_box
=
gradioApp
().
getElementById
(
"tab_images_history"
).
querySelector
(
"div"
).
querySelector
(
"div"
).
querySelector
(
"div"
);
tabs_box
.
setAttribute
(
"id"
,
"images_history_tab"
);
var
tab_btns
=
tabs_box
.
querySelectorAll
(
"button"
);
for
(
var
i
in
images_history_tab_list
){
var
tabname
=
images_history_tab_list
[
i
]
tab_btns
[
i
].
setAttribute
(
"tabname"
,
tabname
);
tab_btns
[
i
].
addEventListener
(
'click'
,
images_history_click_tab
);
}
tabs_box
.
classList
.
add
(
images_history_tab_list
[
0
]);
load_txt2img_button
.
click
();
}
else
{
setTimeout
(
images_history_init
,
500
);
}
}
var
images_history_tab_list
=
[
"txt2img"
,
"img2img"
,
"extras"
];
setTimeout
(
images_history_init
,
500
);
document
.
addEventListener
(
"DOMContentLoaded"
,
function
()
{
var
mutationObserver
=
new
MutationObserver
(
function
(
m
){
for
(
var
i
in
images_history_tab_list
){
let
tabname
=
images_history_tab_list
[
i
]
var
buttons
=
gradioApp
().
querySelectorAll
(
'#'
+
tabname
+
'_images_history .gallery-item'
);
buttons
.
forEach
(
function
(
bnt
){
bnt
.
addEventListener
(
'click'
,
images_history_click_image
,
true
);
});
var
cls_btn
=
gradioApp
().
getElementById
(
tabname
+
'_images_history_gallery'
).
querySelector
(
"svg"
);
if
(
cls_btn
){
cls_btn
.
addEventListener
(
'click'
,
function
(){
gradioApp
().
getElementById
(
tabname
+
'_images_history_renew_page'
).
click
();
},
false
);
}
}
});
mutationObserver
.
observe
(
gradioApp
(),
{
childList
:
true
,
subtree
:
true
});
});
modules/images_history.py
0 → 100644
View file @
6b77af7a
import
os
import
shutil
def
traverse_all_files
(
output_dir
,
image_list
,
curr_dir
=
None
):
curr_path
=
output_dir
if
curr_dir
is
None
else
os
.
path
.
join
(
output_dir
,
curr_dir
)
try
:
f_list
=
os
.
listdir
(
curr_path
)
except
:
if
curr_dir
[
-
10
:]
.
rfind
(
"."
)
>
0
and
curr_dir
[
-
4
:]
!=
".txt"
:
image_list
.
append
(
curr_dir
)
return
image_list
for
file
in
f_list
:
file
=
file
if
curr_dir
is
None
else
os
.
path
.
join
(
curr_dir
,
file
)
file_path
=
os
.
path
.
join
(
curr_path
,
file
)
if
file
[
-
4
:]
==
".txt"
:
pass
elif
os
.
path
.
isfile
(
file_path
)
and
file
[
-
10
:]
.
rfind
(
"."
)
>
0
:
image_list
.
append
(
file
)
else
:
image_list
=
traverse_all_files
(
output_dir
,
image_list
,
file
)
return
image_list
def
get_recent_images
(
dir_name
,
page_index
,
step
,
image_index
,
tabname
):
page_index
=
int
(
page_index
)
f_list
=
os
.
listdir
(
dir_name
)
image_list
=
[]
image_list
=
traverse_all_files
(
dir_name
,
image_list
)
image_list
=
sorted
(
image_list
,
key
=
lambda
file
:
-
os
.
path
.
getctime
(
os
.
path
.
join
(
dir_name
,
file
)))
num
=
48
if
tabname
!=
"extras"
else
12
max_page_index
=
len
(
image_list
)
//
num
+
1
page_index
=
max_page_index
if
page_index
==
-
1
else
page_index
+
step
page_index
=
1
if
page_index
<
1
else
page_index
page_index
=
max_page_index
if
page_index
>
max_page_index
else
page_index
idx_frm
=
(
page_index
-
1
)
*
num
image_list
=
image_list
[
idx_frm
:
idx_frm
+
num
]
image_index
=
int
(
image_index
)
if
image_index
<
0
or
image_index
>
len
(
image_list
)
-
1
:
current_file
=
None
hidden
=
None
else
:
current_file
=
image_list
[
int
(
image_index
)]
hidden
=
os
.
path
.
join
(
dir_name
,
current_file
)
return
[
os
.
path
.
join
(
dir_name
,
file
)
for
file
in
image_list
],
page_index
,
image_list
,
current_file
,
hidden
,
""
def
first_page_click
(
dir_name
,
page_index
,
image_index
,
tabname
):
return
get_recent_images
(
dir_name
,
1
,
0
,
image_index
,
tabname
)
def
end_page_click
(
dir_name
,
page_index
,
image_index
,
tabname
):
return
get_recent_images
(
dir_name
,
-
1
,
0
,
image_index
,
tabname
)
def
prev_page_click
(
dir_name
,
page_index
,
image_index
,
tabname
):
return
get_recent_images
(
dir_name
,
page_index
,
-
1
,
image_index
,
tabname
)
def
next_page_click
(
dir_name
,
page_index
,
image_index
,
tabname
):
return
get_recent_images
(
dir_name
,
page_index
,
1
,
image_index
,
tabname
)
def
page_index_change
(
dir_name
,
page_index
,
image_index
,
tabname
):
return
get_recent_images
(
dir_name
,
page_index
,
0
,
image_index
,
tabname
)
def
show_image_info
(
num
,
image_path
,
filenames
):
#print(f"select image {num}")
file
=
filenames
[
int
(
num
)]
return
file
,
num
,
os
.
path
.
join
(
image_path
,
file
)
def
delete_image
(
delete_num
,
tabname
,
dir_name
,
name
,
page_index
,
filenames
,
image_index
):
if
name
==
""
:
return
filenames
,
delete_num
else
:
delete_num
=
int
(
delete_num
)
index
=
list
(
filenames
)
.
index
(
name
)
i
=
0
new_file_list
=
[]
for
name
in
filenames
:
if
i
>=
index
and
i
<
index
+
delete_num
:
path
=
os
.
path
.
join
(
dir_name
,
name
)
if
os
.
path
.
exists
(
path
):
print
(
f
"Delete file {path}"
)
os
.
remove
(
path
)
txt_file
=
os
.
path
.
splitext
(
path
)[
0
]
+
".txt"
if
os
.
path
.
exists
(
txt_file
):
os
.
remove
(
txt_file
)
else
:
print
(
f
"Not exists file {path}"
)
else
:
new_file_list
.
append
(
name
)
i
+=
1
return
new_file_list
,
1
def
show_images_history
(
gr
,
opts
,
tabname
,
run_pnginfo
,
switch_dict
):
if
tabname
==
"txt2img"
:
dir_name
=
opts
.
outdir_txt2img_samples
elif
tabname
==
"img2img"
:
dir_name
=
opts
.
outdir_img2img_samples
elif
tabname
==
"extras"
:
dir_name
=
opts
.
outdir_extras_samples
d
=
dir_name
.
split
(
"/"
)
dir_name
=
d
[
0
]
for
p
in
d
[
1
:]:
dir_name
=
os
.
path
.
join
(
dir_name
,
p
)
with
gr
.
Row
():
renew_page
=
gr
.
Button
(
'Renew Page'
,
elem_id
=
tabname
+
"_images_history_renew_page"
)
first_page
=
gr
.
Button
(
'First Page'
)
prev_page
=
gr
.
Button
(
'Prev Page'
)
page_index
=
gr
.
Number
(
value
=
1
,
label
=
"Page Index"
)
next_page
=
gr
.
Button
(
'Next Page'
)
end_page
=
gr
.
Button
(
'End Page'
)
with
gr
.
Row
(
elem_id
=
tabname
+
"_images_history"
):
with
gr
.
Row
():
with
gr
.
Column
(
scale
=
2
):
history_gallery
=
gr
.
Gallery
(
show_label
=
False
,
elem_id
=
tabname
+
"_images_history_gallery"
)
.
style
(
grid
=
6
)
with
gr
.
Row
():
delete_num
=
gr
.
Number
(
value
=
1
,
interactive
=
True
,
label
=
"number of images to delete consecutively next"
)
delete
=
gr
.
Button
(
'Delete'
,
elem_id
=
tabname
+
"_images_history_del_button"
)
with
gr
.
Column
():
with
gr
.
Row
():
pnginfo_send_to_txt2img
=
gr
.
Button
(
'Send to txt2img'
)
pnginfo_send_to_img2img
=
gr
.
Button
(
'Send to img2img'
)
with
gr
.
Row
():
with
gr
.
Column
():
img_file_info
=
gr
.
Textbox
(
label
=
"Generate Info"
,
interactive
=
False
)
img_file_name
=
gr
.
Textbox
(
label
=
"File Name"
,
interactive
=
False
)
with
gr
.
Row
():
# hiden items
img_path
=
gr
.
Textbox
(
dir_name
.
rstrip
(
"/"
)
,
visible
=
False
)
tabname_box
=
gr
.
Textbox
(
tabname
,
visible
=
False
)
image_index
=
gr
.
Textbox
(
value
=-
1
,
visible
=
False
)
set_index
=
gr
.
Button
(
'set_index'
,
elem_id
=
tabname
+
"_images_history_set_index"
,
visible
=
False
)
filenames
=
gr
.
State
()
hidden
=
gr
.
Image
(
type
=
"pil"
,
visible
=
False
)
info1
=
gr
.
Textbox
(
visible
=
False
)
info2
=
gr
.
Textbox
(
visible
=
False
)
# turn pages
gallery_inputs
=
[
img_path
,
page_index
,
image_index
,
tabname_box
]
gallery_outputs
=
[
history_gallery
,
page_index
,
filenames
,
img_file_name
,
hidden
,
img_file_name
]
first_page
.
click
(
first_page_click
,
_js
=
"images_history_turnpage"
,
inputs
=
gallery_inputs
,
outputs
=
gallery_outputs
)
next_page
.
click
(
next_page_click
,
_js
=
"images_history_turnpage"
,
inputs
=
gallery_inputs
,
outputs
=
gallery_outputs
)
prev_page
.
click
(
prev_page_click
,
_js
=
"images_history_turnpage"
,
inputs
=
gallery_inputs
,
outputs
=
gallery_outputs
)
end_page
.
click
(
end_page_click
,
_js
=
"images_history_turnpage"
,
inputs
=
gallery_inputs
,
outputs
=
gallery_outputs
)
page_index
.
submit
(
page_index_change
,
_js
=
"images_history_turnpage"
,
inputs
=
gallery_inputs
,
outputs
=
gallery_outputs
)
renew_page
.
click
(
page_index_change
,
_js
=
"images_history_turnpage"
,
inputs
=
gallery_inputs
,
outputs
=
gallery_outputs
)
#page_index.change(page_index_change, inputs=[tabname_box, img_path, page_index], outputs=[history_gallery, page_index])
#other funcitons
set_index
.
click
(
show_image_info
,
_js
=
"images_history_get_current_img"
,
inputs
=
[
tabname_box
,
img_path
,
filenames
],
outputs
=
[
img_file_name
,
image_index
,
hidden
])
img_file_name
.
change
(
fn
=
None
,
_js
=
"images_history_enable_del_buttons"
,
inputs
=
None
,
outputs
=
None
)
delete
.
click
(
delete_image
,
_js
=
"images_history_delete"
,
inputs
=
[
delete_num
,
tabname_box
,
img_path
,
img_file_name
,
page_index
,
filenames
,
image_index
],
outputs
=
[
filenames
,
delete_num
])
hidden
.
change
(
fn
=
run_pnginfo
,
inputs
=
[
hidden
],
outputs
=
[
info1
,
img_file_info
,
info2
])
#pnginfo.click(fn=run_pnginfo, inputs=[hidden], outputs=[info1, img_file_info, info2])
switch_dict
[
"fn"
](
pnginfo_send_to_txt2img
,
switch_dict
[
"t2i"
],
img_file_info
,
'switch_to_txt2img'
)
switch_dict
[
"fn"
](
pnginfo_send_to_img2img
,
switch_dict
[
"i2i"
],
img_file_info
,
'switch_to_img2img_img2img'
)
def
create_history_tabs
(
gr
,
opts
,
run_pnginfo
,
switch_dict
):
with
gr
.
Blocks
(
analytics_enabled
=
False
)
as
images_history
:
with
gr
.
Tabs
()
as
tabs
:
with
gr
.
Tab
(
"txt2img history"
):
with
gr
.
Blocks
(
analytics_enabled
=
False
)
as
images_history_txt2img
:
show_images_history
(
gr
,
opts
,
"txt2img"
,
run_pnginfo
,
switch_dict
)
with
gr
.
Tab
(
"img2img history"
):
with
gr
.
Blocks
(
analytics_enabled
=
False
)
as
images_history_img2img
:
show_images_history
(
gr
,
opts
,
"img2img"
,
run_pnginfo
,
switch_dict
)
with
gr
.
Tab
(
"extras history"
):
with
gr
.
Blocks
(
analytics_enabled
=
False
)
as
images_history_img2img
:
show_images_history
(
gr
,
opts
,
"extras"
,
run_pnginfo
,
switch_dict
)
return
images_history
modules/ui.py
View file @
6b77af7a
...
...
@@ -40,6 +40,7 @@ from modules import prompt_parser
from
modules.images
import
save_image
import
modules.textual_inversion.ui
import
modules.hypernetworks.ui
import
modules.images_history
as
img_his
# this is a fix for Windows users. Without it, javascript files will be served with text/html content-type and the browser will not show any UI
mimetypes
.
init
()
...
...
@@ -1070,6 +1071,13 @@ def create_ui(wrap_gradio_gpu_call):
inputs
=
[
image
],
outputs
=
[
html
,
generation_info
,
html2
],
)
#images history
images_history_switch_dict
=
{
"fn"
:
modules
.
generation_parameters_copypaste
.
connect_paste
,
"t2i"
:
txt2img_paste_fields
,
"i2i"
:
img2img_paste_fields
}
images_history
=
img_his
.
create_history_tabs
(
gr
,
opts
,
wrap_gradio_call
(
modules
.
extras
.
run_pnginfo
),
images_history_switch_dict
)
with
gr
.
Blocks
()
as
modelmerger_interface
:
with
gr
.
Row
()
.
style
(
equal_height
=
False
):
...
...
@@ -1464,6 +1472,7 @@ Requested path was: {f}
(
img2img_interface
,
"img2img"
,
"img2img"
),
(
extras_interface
,
"Extras"
,
"extras"
),
(
pnginfo_interface
,
"PNG Info"
,
"pnginfo"
),
(
images_history
,
"History"
,
"images_history"
),
(
modelmerger_interface
,
"Checkpoint Merger"
,
"modelmerger"
),
(
train_interface
,
"Train"
,
"ti"
),
(
settings_interface
,
"Settings"
,
"settings"
),
...
...
@@ -1701,3 +1710,4 @@ if 'gradio_routes_templates_response' not in globals():
gradio_routes_templates_response
=
gradio
.
routes
.
templates
.
TemplateResponse
gradio
.
routes
.
templates
.
TemplateResponse
=
template_response
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