Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Overbill1683
Stable Diffusion Webui
提交
d33cb2b8
S
Stable Diffusion Webui
项目概览
Overbill1683
/
Stable Diffusion Webui
11 个月 前同步成功
通知
1770
Star
81
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
分析
仓库
DevOps
项目成员
Pages
S
Stable Diffusion Webui
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Pages
分析
分析
仓库分析
DevOps
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
提交
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
d33cb2b8
编写于
10月 15, 2023
作者:
K
Khachatur Avanesian
提交者:
GitHub
10月 15, 2023
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add files via upload
LF
上级
3e223523
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
167 addition
and
167 deletion
+167
-167
script.js
script.js
+167
-167
未找到文件。
script.js
浏览文件 @
d33cb2b8
function
gradioApp
()
{
const
elems
=
document
.
getElementsByTagName
(
'
gradio-app
'
);
const
elem
=
elems
.
length
==
0
?
document
:
elems
[
0
];
if
(
elem
!==
document
)
{
elem
.
getElementById
=
function
(
id
)
{
return
document
.
getElementById
(
id
);
};
}
return
elem
.
shadowRoot
?
elem
.
shadowRoot
:
elem
;
}
/**
* Get the currently selected top-level UI tab button (e.g. the button that says "Extras").
*/
function
get_uiCurrentTab
()
{
return
gradioApp
().
querySelector
(
'
#tabs > .tab-nav > button.selected
'
);
}
/**
* Get the first currently visible top-level UI tab content (e.g. the div hosting the "txt2img" UI).
*/
function
get_uiCurrentTabContent
()
{
return
gradioApp
().
querySelector
(
'
#tabs > .tabitem[id^=tab_]:not([style*="display: none"])
'
);
}
var
uiUpdateCallbacks
=
[];
var
uiAfterUpdateCallbacks
=
[];
var
uiLoadedCallbacks
=
[];
var
uiTabChangeCallbacks
=
[];
var
optionsChangedCallbacks
=
[];
var
uiAfterUpdateTimeout
=
null
;
var
uiCurrentTab
=
null
;
/**
* Register callback to be called at each UI update.
* The callback receives an array of MutationRecords as an argument.
*/
function
onUiUpdate
(
callback
)
{
uiUpdateCallbacks
.
push
(
callback
);
}
/**
* Register callback to be called soon after UI updates.
* The callback receives no arguments.
*
* This is preferred over `onUiUpdate` if you don't need
* access to the MutationRecords, as your function will
* not be called quite as often.
*/
function
onAfterUiUpdate
(
callback
)
{
uiAfterUpdateCallbacks
.
push
(
callback
);
}
/**
* Register callback to be called when the UI is loaded.
* The callback receives no arguments.
*/
function
onUiLoaded
(
callback
)
{
uiLoadedCallbacks
.
push
(
callback
);
}
/**
* Register callback to be called when the UI tab is changed.
* The callback receives no arguments.
*/
function
onUiTabChange
(
callback
)
{
uiTabChangeCallbacks
.
push
(
callback
);
}
/**
* Register callback to be called when the options are changed.
* The callback receives no arguments.
* @param callback
*/
function
onOptionsChanged
(
callback
)
{
optionsChangedCallbacks
.
push
(
callback
);
}
function
executeCallbacks
(
queue
,
arg
)
{
for
(
const
callback
of
queue
)
{
try
{
callback
(
arg
);
}
catch
(
e
)
{
console
.
error
(
"
error running callback
"
,
callback
,
"
:
"
,
e
);
}
}
}
/**
* Schedule the execution of the callbacks registered with onAfterUiUpdate.
* The callbacks are executed after a short while, unless another call to this function
* is made before that time. IOW, the callbacks are executed only once, even
* when there are multiple mutations observed.
*/
function
scheduleAfterUiUpdateCallbacks
()
{
clearTimeout
(
uiAfterUpdateTimeout
);
uiAfterUpdateTimeout
=
setTimeout
(
function
()
{
executeCallbacks
(
uiAfterUpdateCallbacks
);
},
200
);
}
var
executedOnLoaded
=
false
;
document
.
addEventListener
(
"
DOMContentLoaded
"
,
function
()
{
var
mutationObserver
=
new
MutationObserver
(
function
(
m
)
{
if
(
!
executedOnLoaded
&&
gradioApp
().
querySelector
(
'
#txt2img_prompt
'
))
{
executedOnLoaded
=
true
;
executeCallbacks
(
uiLoadedCallbacks
);
}
executeCallbacks
(
uiUpdateCallbacks
,
m
);
scheduleAfterUiUpdateCallbacks
();
const
newTab
=
get_uiCurrentTab
();
if
(
newTab
&&
(
newTab
!==
uiCurrentTab
))
{
uiCurrentTab
=
newTab
;
executeCallbacks
(
uiTabChangeCallbacks
);
}
});
mutationObserver
.
observe
(
gradioApp
(),
{
childList
:
true
,
subtree
:
true
});
});
/**
* Add a ctrl+enter as a shortcut to start a generation
*/
document
.
addEventListener
(
'
keydown
'
,
function
(
e
)
{
const
isEnter
=
e
.
key
===
'
Enter
'
||
e
.
keyCode
===
13
;
const
isModifierKey
=
e
.
metaKey
||
e
.
ctrlKey
||
e
.
altKey
;
const
interruptButton
=
get_uiCurrentTabContent
().
querySelector
(
'
button[id$=_interrupt]
'
);
const
generateButton
=
get_uiCurrentTabContent
().
querySelector
(
'
button[id$=_generate]
'
);
if
(
isEnter
&&
isModifierKey
)
{
if
(
interruptButton
.
style
.
display
===
'
block
'
)
{
interruptButton
.
click
();
setTimeout
(
function
()
{
generateButton
.
click
();
},
500
);
}
else
{
generateButton
.
click
();
}
e
.
preventDefault
();
}
});
/**
* checks that a UI element is not in another hidden element or tab content
*/
function
uiElementIsVisible
(
el
)
{
if
(
el
===
document
)
{
return
true
;
}
const
computedStyle
=
getComputedStyle
(
el
);
const
isVisible
=
computedStyle
.
display
!==
'
none
'
;
if
(
!
isVisible
)
return
false
;
return
uiElementIsVisible
(
el
.
parentNode
);
}
function
uiElementInSight
(
el
)
{
const
clRect
=
el
.
getBoundingClientRect
();
const
windowHeight
=
window
.
innerHeight
;
const
isOnScreen
=
clRect
.
bottom
>
0
&&
clRect
.
top
<
windowHeight
;
return
isOnScreen
;
}
function
gradioApp
()
{
const
elems
=
document
.
getElementsByTagName
(
'
gradio-app
'
);
const
elem
=
elems
.
length
==
0
?
document
:
elems
[
0
];
if
(
elem
!==
document
)
{
elem
.
getElementById
=
function
(
id
)
{
return
document
.
getElementById
(
id
);
};
}
return
elem
.
shadowRoot
?
elem
.
shadowRoot
:
elem
;
}
/**
* Get the currently selected top-level UI tab button (e.g. the button that says "Extras").
*/
function
get_uiCurrentTab
()
{
return
gradioApp
().
querySelector
(
'
#tabs > .tab-nav > button.selected
'
);
}
/**
* Get the first currently visible top-level UI tab content (e.g. the div hosting the "txt2img" UI).
*/
function
get_uiCurrentTabContent
()
{
return
gradioApp
().
querySelector
(
'
#tabs > .tabitem[id^=tab_]:not([style*="display: none"])
'
);
}
var
uiUpdateCallbacks
=
[];
var
uiAfterUpdateCallbacks
=
[];
var
uiLoadedCallbacks
=
[];
var
uiTabChangeCallbacks
=
[];
var
optionsChangedCallbacks
=
[];
var
uiAfterUpdateTimeout
=
null
;
var
uiCurrentTab
=
null
;
/**
* Register callback to be called at each UI update.
* The callback receives an array of MutationRecords as an argument.
*/
function
onUiUpdate
(
callback
)
{
uiUpdateCallbacks
.
push
(
callback
);
}
/**
* Register callback to be called soon after UI updates.
* The callback receives no arguments.
*
* This is preferred over `onUiUpdate` if you don't need
* access to the MutationRecords, as your function will
* not be called quite as often.
*/
function
onAfterUiUpdate
(
callback
)
{
uiAfterUpdateCallbacks
.
push
(
callback
);
}
/**
* Register callback to be called when the UI is loaded.
* The callback receives no arguments.
*/
function
onUiLoaded
(
callback
)
{
uiLoadedCallbacks
.
push
(
callback
);
}
/**
* Register callback to be called when the UI tab is changed.
* The callback receives no arguments.
*/
function
onUiTabChange
(
callback
)
{
uiTabChangeCallbacks
.
push
(
callback
);
}
/**
* Register callback to be called when the options are changed.
* The callback receives no arguments.
* @param callback
*/
function
onOptionsChanged
(
callback
)
{
optionsChangedCallbacks
.
push
(
callback
);
}
function
executeCallbacks
(
queue
,
arg
)
{
for
(
const
callback
of
queue
)
{
try
{
callback
(
arg
);
}
catch
(
e
)
{
console
.
error
(
"
error running callback
"
,
callback
,
"
:
"
,
e
);
}
}
}
/**
* Schedule the execution of the callbacks registered with onAfterUiUpdate.
* The callbacks are executed after a short while, unless another call to this function
* is made before that time. IOW, the callbacks are executed only once, even
* when there are multiple mutations observed.
*/
function
scheduleAfterUiUpdateCallbacks
()
{
clearTimeout
(
uiAfterUpdateTimeout
);
uiAfterUpdateTimeout
=
setTimeout
(
function
()
{
executeCallbacks
(
uiAfterUpdateCallbacks
);
},
200
);
}
var
executedOnLoaded
=
false
;
document
.
addEventListener
(
"
DOMContentLoaded
"
,
function
()
{
var
mutationObserver
=
new
MutationObserver
(
function
(
m
)
{
if
(
!
executedOnLoaded
&&
gradioApp
().
querySelector
(
'
#txt2img_prompt
'
))
{
executedOnLoaded
=
true
;
executeCallbacks
(
uiLoadedCallbacks
);
}
executeCallbacks
(
uiUpdateCallbacks
,
m
);
scheduleAfterUiUpdateCallbacks
();
const
newTab
=
get_uiCurrentTab
();
if
(
newTab
&&
(
newTab
!==
uiCurrentTab
))
{
uiCurrentTab
=
newTab
;
executeCallbacks
(
uiTabChangeCallbacks
);
}
});
mutationObserver
.
observe
(
gradioApp
(),
{
childList
:
true
,
subtree
:
true
});
});
/**
* Add a ctrl+enter as a shortcut to start a generation
*/
document
.
addEventListener
(
'
keydown
'
,
function
(
e
)
{
const
isEnter
=
e
.
key
===
'
Enter
'
||
e
.
keyCode
===
13
;
const
isModifierKey
=
e
.
metaKey
||
e
.
ctrlKey
||
e
.
altKey
;
const
interruptButton
=
get_uiCurrentTabContent
().
querySelector
(
'
button[id$=_interrupt]
'
);
const
generateButton
=
get_uiCurrentTabContent
().
querySelector
(
'
button[id$=_generate]
'
);
if
(
isEnter
&&
isModifierKey
)
{
if
(
interruptButton
.
style
.
display
===
'
block
'
)
{
interruptButton
.
click
();
setTimeout
(
function
()
{
generateButton
.
click
();
},
500
);
}
else
{
generateButton
.
click
();
}
e
.
preventDefault
();
}
});
/**
* checks that a UI element is not in another hidden element or tab content
*/
function
uiElementIsVisible
(
el
)
{
if
(
el
===
document
)
{
return
true
;
}
const
computedStyle
=
getComputedStyle
(
el
);
const
isVisible
=
computedStyle
.
display
!==
'
none
'
;
if
(
!
isVisible
)
return
false
;
return
uiElementIsVisible
(
el
.
parentNode
);
}
function
uiElementInSight
(
el
)
{
const
clRect
=
el
.
getBoundingClientRect
();
const
windowHeight
=
window
.
innerHeight
;
const
isOnScreen
=
clRect
.
bottom
>
0
&&
clRect
.
top
<
windowHeight
;
return
isOnScreen
;
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录