stable-diffusion-webui
180 строк · 5.7 Кб
1(function() {2const GRADIO_MIN_WIDTH = 320;3const PAD = 16;4const DEBOUNCE_TIME = 100;5const DOUBLE_TAP_DELAY = 200; //ms6
7const R = {8tracking: false,9parent: null,10parentWidth: null,11leftCol: null,12leftColStartWidth: null,13screenX: null,14lastTapTime: null,15};16
17let resizeTimer;18let parents = [];19
20function setLeftColGridTemplate(el, width) {21el.style.gridTemplateColumns = `${width}px 16px 1fr`;22}23
24function displayResizeHandle(parent) {25if (window.innerWidth < GRADIO_MIN_WIDTH * 2 + PAD * 4) {26parent.style.display = 'flex';27parent.resizeHandle.style.display = "none";28return false;29} else {30parent.style.display = 'grid';31parent.resizeHandle.style.display = "block";32return true;33}34}35
36function afterResize(parent) {37if (displayResizeHandle(parent) && parent.style.gridTemplateColumns != parent.style.originalGridTemplateColumns) {38const oldParentWidth = R.parentWidth;39const newParentWidth = parent.offsetWidth;40const widthL = parseInt(parent.style.gridTemplateColumns.split(' ')[0]);41
42const ratio = newParentWidth / oldParentWidth;43
44const newWidthL = Math.max(Math.floor(ratio * widthL), GRADIO_MIN_WIDTH);45setLeftColGridTemplate(parent, newWidthL);46
47R.parentWidth = newParentWidth;48}49}50
51function setup(parent) {52
53function onDoubleClick(evt) {54evt.preventDefault();55evt.stopPropagation();56
57parent.style.gridTemplateColumns = parent.style.originalGridTemplateColumns;58}59
60const leftCol = parent.firstElementChild;61const rightCol = parent.lastElementChild;62
63parents.push(parent);64
65parent.style.display = 'grid';66parent.style.gap = '0';67const gridTemplateColumns = `${parent.children[0].style.flexGrow}fr ${PAD}px ${parent.children[1].style.flexGrow}fr`;68parent.style.gridTemplateColumns = gridTemplateColumns;69parent.style.originalGridTemplateColumns = gridTemplateColumns;70
71const resizeHandle = document.createElement('div');72resizeHandle.classList.add('resize-handle');73parent.insertBefore(resizeHandle, rightCol);74parent.resizeHandle = resizeHandle;75
76['mousedown', 'touchstart'].forEach((eventType) => {77resizeHandle.addEventListener(eventType, (evt) => {78if (eventType.startsWith('mouse')) {79if (evt.button !== 0) return;80} else {81if (evt.changedTouches.length !== 1) return;82
83const currentTime = new Date().getTime();84if (R.lastTapTime && currentTime - R.lastTapTime <= DOUBLE_TAP_DELAY) {85onDoubleClick(evt);86return;87}88
89R.lastTapTime = currentTime;90}91
92evt.preventDefault();93evt.stopPropagation();94
95document.body.classList.add('resizing');96
97R.tracking = true;98R.parent = parent;99R.parentWidth = parent.offsetWidth;100R.leftCol = leftCol;101R.leftColStartWidth = leftCol.offsetWidth;102if (eventType.startsWith('mouse')) {103R.screenX = evt.screenX;104} else {105R.screenX = evt.changedTouches[0].screenX;106}107});108});109
110resizeHandle.addEventListener('dblclick', onDoubleClick);111
112afterResize(parent);113}114
115['mousemove', 'touchmove'].forEach((eventType) => {116window.addEventListener(eventType, (evt) => {117if (eventType.startsWith('mouse')) {118if (evt.button !== 0) return;119} else {120if (evt.changedTouches.length !== 1) return;121}122
123if (R.tracking) {124if (eventType.startsWith('mouse')) {125evt.preventDefault();126}127evt.stopPropagation();128
129let delta = 0;130if (eventType.startsWith('mouse')) {131delta = R.screenX - evt.screenX;132} else {133delta = R.screenX - evt.changedTouches[0].screenX;134}135const leftColWidth = Math.max(Math.min(R.leftColStartWidth - delta, R.parent.offsetWidth - GRADIO_MIN_WIDTH - PAD), GRADIO_MIN_WIDTH);136setLeftColGridTemplate(R.parent, leftColWidth);137}138});139});140
141['mouseup', 'touchend'].forEach((eventType) => {142window.addEventListener(eventType, (evt) => {143if (eventType.startsWith('mouse')) {144if (evt.button !== 0) return;145} else {146if (evt.changedTouches.length !== 1) return;147}148
149if (R.tracking) {150evt.preventDefault();151evt.stopPropagation();152
153R.tracking = false;154
155document.body.classList.remove('resizing');156}157});158});159
160
161window.addEventListener('resize', () => {162clearTimeout(resizeTimer);163
164resizeTimer = setTimeout(function() {165for (const parent of parents) {166afterResize(parent);167}168}, DEBOUNCE_TIME);169});170
171setupResizeHandle = setup;172})();173
174onUiLoaded(function() {175for (var elem of gradioApp().querySelectorAll('.resize-handle-row')) {176if (!elem.querySelector('.resize-handle')) {177setupResizeHandle(elem);178}179}180});181