123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- (function() {
- const GRADIO_MIN_WIDTH = 320;
- const PAD = 16;
- const DEBOUNCE_TIME = 100;
- const R = {
- tracking: false,
- parent: null,
- parentWidth: null,
- leftCol: null,
- leftColStartWidth: null,
- screenX: null,
- };
- let resizeTimer;
- let parents = [];
- function setLeftColGridTemplate(el, width) {
- el.style.gridTemplateColumns = `${width}px 16px 1fr`;
- }
- function displayResizeHandle(parent) {
- if (window.innerWidth < GRADIO_MIN_WIDTH * 2 + PAD * 4) {
- parent.style.display = 'flex';
- parent.resizeHandle.style.display = "none";
- return false;
- } else {
- parent.style.display = 'grid';
- parent.resizeHandle.style.display = "block";
- return true;
- }
- }
- function afterResize(parent) {
- if (displayResizeHandle(parent) && parent.style.gridTemplateColumns != parent.style.originalGridTemplateColumns) {
- const oldParentWidth = R.parentWidth;
- const newParentWidth = parent.offsetWidth;
- const widthL = parseInt(parent.style.gridTemplateColumns.split(' ')[0]);
- const ratio = newParentWidth / oldParentWidth;
- const newWidthL = Math.max(Math.floor(ratio * widthL), parent.minLeftColWidth);
- setLeftColGridTemplate(parent, newWidthL);
- R.parentWidth = newParentWidth;
- }
- }
- function setup(parent) {
- const leftCol = parent.firstElementChild;
- const rightCol = parent.lastElementChild;
- parents.push(parent);
- parent.style.display = 'grid';
- parent.style.gap = '0';
- let leftColTemplate = "";
- if (parent.children[0].style.flexGrow) {
- leftColTemplate = `${parent.children[0].style.flexGrow}fr`;
- parent.minLeftColWidth = GRADIO_MIN_WIDTH;
- } else {
- leftColTemplate = parent.children[0].style.flexBasis;
- parent.minLeftColWidth = parent.children[0].style.flexBasis.slice(0, -2);
- }
- const gridTemplateColumns = `${leftColTemplate} ${PAD}px ${parent.children[1].style.flexGrow}fr`;
- parent.style.gridTemplateColumns = gridTemplateColumns;
- parent.style.originalGridTemplateColumns = gridTemplateColumns;
- const resizeHandle = document.createElement('div');
- resizeHandle.classList.add('resize-handle');
- parent.insertBefore(resizeHandle, rightCol);
- parent.resizeHandle = resizeHandle;
- ['mousedown', 'touchstart'].forEach((eventType) => {
- resizeHandle.addEventListener(eventType, (evt) => {
- if (eventType.startsWith('mouse')) {
- if (evt.button !== 0) return;
- } else {
- if (evt.changedTouches.length !== 1) return;
- }
- evt.preventDefault();
- evt.stopPropagation();
- document.body.classList.add('resizing');
- R.tracking = true;
- R.parent = parent;
- R.parentWidth = parent.offsetWidth;
- R.leftCol = leftCol;
- R.leftColStartWidth = leftCol.offsetWidth;
- if (eventType.startsWith('mouse')) {
- R.screenX = evt.screenX;
- } else {
- R.screenX = evt.changedTouches[0].screenX;
- }
- });
- });
- resizeHandle.addEventListener('dblclick', (evt) => {
- evt.preventDefault();
- evt.stopPropagation();
- parent.style.gridTemplateColumns = parent.style.originalGridTemplateColumns;
- });
- afterResize(parent);
- }
- ['mousemove', 'touchmove'].forEach((eventType) => {
- window.addEventListener(eventType, (evt) => {
- if (eventType.startsWith('mouse')) {
- if (evt.button !== 0) return;
- } else {
- if (evt.changedTouches.length !== 1) return;
- }
- if (R.tracking) {
- if (eventType.startsWith('mouse')) {
- evt.preventDefault();
- }
- evt.stopPropagation();
- let delta = 0;
- if (eventType.startsWith('mouse')) {
- delta = R.screenX - evt.screenX;
- } else {
- delta = R.screenX - evt.changedTouches[0].screenX;
- }
- const leftColWidth = Math.max(Math.min(R.leftColStartWidth - delta, R.parent.offsetWidth - GRADIO_MIN_WIDTH - PAD), R.parent.minLeftColWidth);
- setLeftColGridTemplate(R.parent, leftColWidth);
- }
- });
- });
- ['mouseup', 'touchend'].forEach((eventType) => {
- window.addEventListener(eventType, (evt) => {
- if (eventType.startsWith('mouse')) {
- if (evt.button !== 0) return;
- } else {
- if (evt.changedTouches.length !== 1) return;
- }
- if (R.tracking) {
- evt.preventDefault();
- evt.stopPropagation();
- R.tracking = false;
- document.body.classList.remove('resizing');
- }
- });
- });
- window.addEventListener('resize', () => {
- clearTimeout(resizeTimer);
- resizeTimer = setTimeout(function() {
- for (const parent of parents) {
- afterResize(parent);
- }
- }, DEBOUNCE_TIME);
- });
- setupResizeHandle = setup;
- })();
- onUiLoaded(function() {
- for (var elem of gradioApp().querySelectorAll('.resize-handle-row')) {
- if (!elem.querySelector('.resize-handle')) {
- setupResizeHandle(elem);
- }
- }
- });
- function setupExtraNetworksResizeHandle() {
- for (var elem of document.body.querySelectorAll('.resize-handle-row')) {
- if (!elem.querySelector('.resize-handle') && !elem.children[0].classList.contains("hidden")) {
- setupResizeHandle(elem);
- }
- }
- }
|