2022-11-02 16:05:00 +00:00
// various functions for interaction with ui.py not large enough to warrant putting them in separate files
2022-09-02 20:25:29 +00:00
2022-10-17 16:24:24 +00:00
function set _theme ( theme ) {
2022-10-17 09:05:05 +00:00
gradioURL = window . location . href
2022-10-17 16:24:24 +00:00
if ( ! gradioURL . includes ( '?__theme=' ) ) {
window . location . replace ( gradioURL + '?__theme=' + theme ) ;
2022-10-17 09:05:05 +00:00
}
}
2022-09-02 20:25:29 +00:00
function selected _gallery _index ( ) {
2023-03-25 16:52:14 +00:00
var buttons = gradioApp ( ) . querySelectorAll ( '[style="display: block;"].tabitem div[id$=_gallery] .thumbnails > .thumbnail-item' )
var button = gradioApp ( ) . querySelector ( '[style="display: block;"].tabitem div[id$=_gallery] .thumbnails > .thumbnail-item.selected' )
2022-09-02 20:25:29 +00:00
var result = - 1
buttons . forEach ( function ( v , i ) { if ( v == button ) { result = i } } )
return result
}
function extract _image _from _gallery ( gallery ) {
if ( gallery . length == 1 ) {
2023-01-02 19:44:46 +00:00
return [ gallery [ 0 ] ]
2022-09-02 20:25:29 +00:00
}
index = selected _gallery _index ( )
if ( index < 0 || index >= gallery . length ) {
2022-09-10 08:10:00 +00:00
return [ null ]
2022-09-02 20:25:29 +00:00
}
2023-01-02 19:44:46 +00:00
return [ gallery [ index ] ] ;
2022-09-10 21:17:34 +00:00
}
2022-09-23 19:49:21 +00:00
function args _to _array ( args ) {
res = [ ]
for ( var i = 0 ; i < args . length ; i ++ ) {
res . push ( args [ i ] )
}
return res
}
function switch _to _txt2img ( ) {
2022-10-13 17:42:27 +00:00
gradioApp ( ) . querySelector ( '#tabs' ) . querySelectorAll ( 'button' ) [ 0 ] . click ( ) ;
2022-09-23 19:49:21 +00:00
return args _to _array ( arguments ) ;
}
2023-01-14 19:43:01 +00:00
function switch _to _img2img _tab ( no ) {
2022-10-13 17:42:27 +00:00
gradioApp ( ) . querySelector ( '#tabs' ) . querySelectorAll ( 'button' ) [ 1 ] . click ( ) ;
2023-01-14 19:43:01 +00:00
gradioApp ( ) . getElementById ( 'mode_img2img' ) . querySelectorAll ( 'button' ) [ no ] . click ( ) ;
}
function switch _to _img2img ( ) {
switch _to _img2img _tab ( 0 ) ;
return args _to _array ( arguments ) ;
}
function switch _to _sketch ( ) {
switch _to _img2img _tab ( 1 ) ;
return args _to _array ( arguments ) ;
}
function switch _to _inpaint ( ) {
switch _to _img2img _tab ( 2 ) ;
return args _to _array ( arguments ) ;
}
2022-09-23 19:49:21 +00:00
2023-01-14 19:43:01 +00:00
function switch _to _inpaint _sketch ( ) {
switch _to _img2img _tab ( 3 ) ;
2022-09-23 19:49:21 +00:00
return args _to _array ( arguments ) ;
}
2022-10-27 05:36:11 +00:00
function switch _to _inpaint ( ) {
2022-10-13 17:42:27 +00:00
gradioApp ( ) . querySelector ( '#tabs' ) . querySelectorAll ( 'button' ) [ 1 ] . click ( ) ;
2023-01-12 16:47:33 +00:00
gradioApp ( ) . getElementById ( 'mode_img2img' ) . querySelectorAll ( 'button' ) [ 2 ] . click ( ) ;
2022-09-23 19:49:21 +00:00
return args _to _array ( arguments ) ;
}
function switch _to _extras ( ) {
2022-10-13 17:42:27 +00:00
gradioApp ( ) . querySelector ( '#tabs' ) . querySelectorAll ( 'button' ) [ 2 ] . click ( ) ;
2022-09-23 19:49:21 +00:00
return args _to _array ( arguments ) ;
}
2022-09-22 09:11:48 +00:00
function get _tab _index ( tabId ) {
var res = 0
gradioApp ( ) . getElementById ( tabId ) . querySelector ( 'div' ) . querySelectorAll ( 'button' ) . forEach ( function ( button , i ) {
2023-03-20 13:09:36 +00:00
if ( button . className . indexOf ( 'selected' ) != - 1 )
2022-09-22 09:11:48 +00:00
res = i
} )
return res
}
function create _tab _index _args ( tabId , args ) {
var res = [ ]
for ( var i = 0 ; i < args . length ; i ++ ) {
res . push ( args [ i ] )
}
2022-09-05 23:09:01 +00:00
2022-09-22 09:11:48 +00:00
res [ 0 ] = get _tab _index ( tabId )
return res
}
2023-01-18 17:16:52 +00:00
function get _img2img _tab _index ( ) {
let res = args _to _array ( arguments )
2023-03-23 17:36:15 +00:00
res . splice ( - 2 ) // gradio also sends outputs to the arguments, pop them off
res [ 0 ] = get _tab _index ( 'mode_img2img' )
return res
}
function get _img2img _tab _index _for _res _preview ( ) {
let res = args _to _array ( arguments )
res . splice ( - 1 ) // gradio also sends outputs to the arguments, pop them off
2023-01-18 17:16:52 +00:00
res [ 0 ] = get _tab _index ( 'mode_img2img' )
return res
}
2023-03-25 16:52:14 +00:00
function get _img2img _tab _index _for _res _preview ( ) {
let res = args _to _array ( arguments )
res . splice ( - 1 ) // gradio also sends outputs to the arguments, pop them off
res [ 0 ] = get _tab _index ( 'mode_img2img' )
debugger ;
return res
}
2022-09-22 09:11:48 +00:00
function create _submit _args ( args ) {
2022-09-05 23:09:01 +00:00
res = [ ]
2022-09-22 09:11:48 +00:00
for ( var i = 0 ; i < args . length ; i ++ ) {
res . push ( args [ i ] )
2022-09-05 23:09:01 +00:00
}
2022-09-17 05:03:47 +00:00
// As it is currently, txt2img and img2img send back the previous output args (txt2img_gallery, generation_info, html_info) whenever you generate a new image.
// This can lead to uploading a huge gallery of previously generated images, which leads to an unnecessary delay between submitting and beginning to generate.
2022-12-15 02:01:32 +00:00
// I don't know why gradio is sending outputs along with inputs, but we can prevent sending the image gallery here, which seems to be an issue for some.
2022-09-17 05:03:47 +00:00
// If gradio at some point stops sending outputs, this may break something
if ( Array . isArray ( res [ res . length - 3 ] ) ) {
res [ res . length - 3 ] = null
}
2022-09-05 23:09:01 +00:00
return res
2022-09-07 18:26:19 +00:00
}
2022-09-07 19:58:11 +00:00
2023-01-15 15:50:56 +00:00
function showSubmitButtons ( tabname , show ) {
gradioApp ( ) . getElementById ( tabname + '_interrupt' ) . style . display = show ? "none" : "block"
gradioApp ( ) . getElementById ( tabname + '_skip' ) . style . display = show ? "none" : "block"
}
2022-09-22 09:11:48 +00:00
function submit ( ) {
2023-01-15 15:50:56 +00:00
rememberGallerySelection ( 'txt2img_gallery' )
showSubmitButtons ( 'txt2img' , false )
var id = randomId ( )
requestProgress ( id , gradioApp ( ) . getElementById ( 'txt2img_gallery_container' ) , gradioApp ( ) . getElementById ( 'txt2img_gallery' ) , function ( ) {
showSubmitButtons ( 'txt2img' , true )
} )
2022-09-22 09:11:48 +00:00
2023-01-15 15:50:56 +00:00
var res = create _submit _args ( arguments )
res [ 0 ] = id
return res
2022-09-22 09:11:48 +00:00
}
function submit _img2img ( ) {
2023-01-15 15:50:56 +00:00
rememberGallerySelection ( 'img2img_gallery' )
showSubmitButtons ( 'img2img' , false )
var id = randomId ( )
requestProgress ( id , gradioApp ( ) . getElementById ( 'img2img_gallery_container' ) , gradioApp ( ) . getElementById ( 'img2img_gallery' ) , function ( ) {
showSubmitButtons ( 'img2img' , true )
} )
2022-09-22 09:11:48 +00:00
2023-01-15 15:50:56 +00:00
var res = create _submit _args ( arguments )
2022-09-22 09:11:48 +00:00
2023-01-15 15:50:56 +00:00
res [ 0 ] = id
res [ 1 ] = get _tab _index ( 'mode_img2img' )
2022-09-22 09:11:48 +00:00
return res
}
2023-01-19 06:25:37 +00:00
function modelmerger ( ) {
var id = randomId ( )
requestProgress ( id , gradioApp ( ) . getElementById ( 'modelmerger_results_panel' ) , null , function ( ) { } )
var res = create _submit _args ( arguments )
res [ 0 ] = id
return res
}
2022-09-22 09:11:48 +00:00
2022-09-11 14:35:12 +00:00
function ask _for _style _name ( _ , prompt _text , negative _prompt _text ) {
name _ = prompt ( 'Style name:' )
2022-10-15 11:22:30 +00:00
return [ name _ , prompt _text , negative _prompt _text ]
2022-09-09 20:16:02 +00:00
}
2022-09-18 19:25:18 +00:00
2022-12-10 10:46:18 +00:00
function confirm _clear _prompt ( prompt , negative _prompt ) {
if ( confirm ( "Delete prompt?" ) ) {
prompt = ""
negative _prompt = ""
2022-10-20 06:08:24 +00:00
}
2022-10-20 22:03:25 +00:00
2022-12-10 10:46:18 +00:00
return [ prompt , negative _prompt ]
2022-10-20 06:08:24 +00:00
}
2023-01-29 22:03:31 +00:00
promptTokecountUpdateFuncs = { }
function recalculatePromptTokens ( name ) {
if ( promptTokecountUpdateFuncs [ name ] ) {
promptTokecountUpdateFuncs [ name ] ( )
}
}
function recalculate _prompts _txt2img ( ) {
recalculatePromptTokens ( 'txt2img_prompt' )
recalculatePromptTokens ( 'txt2img_neg_prompt' )
return args _to _array ( arguments ) ;
}
function recalculate _prompts _img2img ( ) {
recalculatePromptTokens ( 'img2img_prompt' )
recalculatePromptTokens ( 'img2img_neg_prompt' )
return args _to _array ( arguments ) ;
}
2022-09-18 19:25:18 +00:00
opts = { }
onUiUpdate ( function ( ) {
if ( Object . keys ( opts ) . length != 0 ) return ;
json _elem = gradioApp ( ) . getElementById ( 'settings_json' )
if ( json _elem == null ) return ;
2023-01-21 06:48:38 +00:00
var textarea = json _elem . querySelector ( 'textarea' )
var jsdata = textarea . value
2022-09-18 19:25:18 +00:00
opts = JSON . parse ( jsdata )
2023-01-14 12:55:40 +00:00
executeCallbacks ( optionsChangedCallbacks ) ;
2022-09-18 19:25:18 +00:00
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 )
}
2023-01-14 12:55:40 +00:00
executeCallbacks ( optionsChangedCallbacks ) ;
2022-09-18 19:25:18 +00:00
} ,
get : function ( ) {
var valueProp = Object . getOwnPropertyDescriptor ( HTMLTextAreaElement . prototype , 'value' ) ;
return valueProp . get . call ( textarea ) ;
}
} ) ;
json _elem . parentElement . style . display = "none"
2022-09-28 13:43:54 +00:00
2023-01-20 07:18:41 +00:00
function registerTextarea ( id , id _counter , id _button ) {
var prompt = gradioApp ( ) . getElementById ( id )
var counter = gradioApp ( ) . getElementById ( id _counter )
var textarea = gradioApp ( ) . querySelector ( "#" + id + " > label > textarea" ) ;
if ( counter . parentElement == prompt . parentElement ) {
return
}
prompt . parentElement . insertBefore ( counter , prompt )
prompt . parentElement . style . position = "relative"
2023-01-29 22:03:31 +00:00
promptTokecountUpdateFuncs [ id ] = function ( ) { update _token _counter ( id _button ) ; }
textarea . addEventListener ( "input" , promptTokecountUpdateFuncs [ id ] ) ;
2023-01-20 07:18:41 +00:00
}
registerTextarea ( 'txt2img_prompt' , 'txt2img_token_counter' , 'txt2img_token_button' )
registerTextarea ( 'txt2img_neg_prompt' , 'txt2img_negative_token_counter' , 'txt2img_negative_token_button' )
registerTextarea ( 'img2img_prompt' , 'img2img_token_counter' , 'img2img_token_button' )
registerTextarea ( 'img2img_neg_prompt' , 'img2img_negative_token_counter' , 'img2img_negative_token_button' )
2023-01-03 07:01:06 +00:00
show _all _pages = gradioApp ( ) . getElementById ( 'settings_show_all_pages' )
settings _tabs = gradioApp ( ) . querySelector ( '#settings div' )
if ( show _all _pages && settings _tabs ) {
settings _tabs . appendChild ( show _all _pages )
show _all _pages . onclick = function ( ) {
gradioApp ( ) . querySelectorAll ( '#settings > div' ) . forEach ( function ( elem ) {
elem . style . display = "block" ;
} )
}
}
2022-09-18 19:25:18 +00:00
} )
2022-09-27 19:56:18 +00:00
2023-01-14 12:55:40 +00:00
onOptionsChanged ( function ( ) {
elem = gradioApp ( ) . getElementById ( 'sd_checkpoint_hash' )
sd _checkpoint _hash = opts . sd _checkpoint _hash || ""
shorthash = sd _checkpoint _hash . substr ( 0 , 10 )
if ( elem && elem . textContent != shorthash ) {
elem . textContent = shorthash
elem . title = sd _checkpoint _hash
elem . href = "https://google.com/search?q=" + sd _checkpoint _hash
}
} )
2022-09-28 13:43:54 +00:00
let txt2img _textarea , img2img _textarea = undefined ;
2022-09-27 23:29:53 +00:00
let wait _time = 800
2023-01-29 22:03:31 +00:00
let token _timeouts = { } ;
2022-09-27 19:56:18 +00:00
2022-09-30 16:12:44 +00:00
function update _txt2img _tokens ( ... args ) {
2022-09-29 18:40:47 +00:00
update _token _counter ( "txt2img_token_button" )
2022-09-30 16:12:44 +00:00
if ( args . length == 2 )
return args [ 0 ]
return args ;
2022-09-29 18:40:47 +00:00
}
2022-09-30 16:12:44 +00:00
function update _img2img _tokens ( ... args ) {
2022-09-29 18:40:47 +00:00
update _token _counter ( "img2img_token_button" )
2022-09-30 16:12:44 +00:00
if ( args . length == 2 )
return args [ 0 ]
return args ;
2022-09-30 20:31:00 +00:00
}
2022-09-28 13:43:54 +00:00
function update _token _counter ( button _id ) {
2023-01-29 22:03:31 +00:00
if ( token _timeouts [ button _id ] )
clearTimeout ( token _timeouts [ button _id ] ) ;
token _timeouts [ button _id ] = setTimeout ( ( ) => gradioApp ( ) . getElementById ( button _id ) ? . click ( ) , wait _time ) ;
2022-09-27 23:29:53 +00:00
}
2022-10-01 23:12:49 +00:00
function restart _reload ( ) {
document . body . innerHTML = '<h1 style="font-family:monospace;margin-top:20%;color:lightgray;text-align:center;">Reloading...</h1>' ;
setTimeout ( function ( ) { location . reload ( ) } , 2000 )
2022-11-06 06:02:25 +00:00
return [ ]
2022-10-01 23:12:49 +00:00
}
2023-01-17 11:15:47 +00:00
// Simulate an `input` DOM event for Gradio Textbox component. Needed after you edit its contents in javascript, otherwise your edits
// will only visible on web page and not sent to python.
function updateInput ( target ) {
let e = new Event ( "input" , { bubbles : true } )
Object . defineProperty ( e , "target" , { value : target } )
target . dispatchEvent ( e ) ;
}
2023-01-28 19:52:27 +00:00
var desiredCheckpointName = null ;
function selectCheckpoint ( name ) {
desiredCheckpointName = name ;
gradioApp ( ) . getElementById ( 'change_checkpoint' ) . click ( )
}
2023-03-25 16:52:14 +00:00
2023-03-23 17:36:15 +00:00
function onCalcResolutionImg2Img ( mode , scale , width , height , resize _mode , init _img , sketch , init _img _with _mask , inpaint _color _sketch , init _img _inpaint ) {
2023-03-25 16:52:14 +00:00
i2iScale = gradioApp ( ) . getElementById ( 'img2img_scale' )
i2iWidth = gradioApp ( ) . getElementById ( 'img2img_width' )
i2iHeight = gradioApp ( ) . getElementById ( 'img2img_height' )
setInactive ( i2iScale , scale == 1 )
setInactive ( i2iWidth , scale > 1 )
setInactive ( i2iHeight , scale > 1 )
2023-03-23 17:36:15 +00:00
return [ ] ;
2023-03-25 16:52:14 +00:00
}