From 074a14f05677be2840a608c57588f0914b4019bf Mon Sep 17 00:00:00 2001 From: patriceac <48073125+patriceac@users.noreply.github.com> Date: Mon, 13 Feb 2023 01:37:00 -0800 Subject: [PATCH] Second batch of fixes for search models Addresses the issues reported by JeLuf: - - gfpgan: the list with models doesn't appear under the box - merge models: As long as no models are selected, the box is very short. - When searching for models by name, the width of the model list shrinks and is smaller than the element. --- ui/media/js/searchable-models.js | 54 +++++++++++++++++++++++++++++--- 1 file changed, 50 insertions(+), 4 deletions(-) diff --git a/ui/media/js/searchable-models.js b/ui/media/js/searchable-models.js index bdd81117..d28bbcdf 100644 --- a/ui/media/js/searchable-models.js +++ b/ui/media/js/searchable-models.js @@ -85,6 +85,14 @@ class ModelDropdown this.inputModels = modelsOptions[this.modelKey] this.populateModels() }, this)) + document.addEventListener("collapsibleClick", this.bind(function(e) { + // update the input size when the element becomes visible + this.updateInputSize() + }, this)) + document.addEventListener("tabClick", this.bind(function(e) { + // update the input size when the tab changes + this.updateInputSize() + }, this)) } saveCurrentSelection(elem, value, path) { @@ -455,6 +463,47 @@ class ModelDropdown } /* MODEL LOADER */ + getElementDimensions(element) { + // Clone the element + const clone = element.cloneNode(true) + + // Copy the styles of the original element to the cloned element + const originalStyles = window.getComputedStyle(element) + for (let i = 0; i < originalStyles.length; i++) { + const property = originalStyles[i] + clone.style[property] = originalStyles.getPropertyValue(property) + } + + // Set its visibility to hidden and display to inline-block + clone.style.visibility = "hidden" + clone.style.display = "inline-block" + + // Put the cloned element next to the original element + element.parentNode.insertBefore(clone, element.nextSibling) + + // Get its width and height + const width = clone.offsetWidth + const height = clone.offsetHeight + + // Remove it from the DOM + clone.remove() + + // Return its width and height + return { width, height } + } + + updateInputSize() { + if (this.modelList !== undefined) { + const dimensions = this.getElementDimensions(this.modelList) + this.modelFilter.style.width = dimensions.width + 'px' + this.modelList.style.width = dimensions.width + 'px' + this.modelFilterArrow.style.height = dimensions.height + 'px' + if (this.modelFilter.offsetLeft > 0) { + this.modelList.style.left = this.modelFilter.offsetLeft + 'px' + } + } + } + flattenModelList(models, path) { models.forEach(entry => { if (Array.isArray(entry)) { @@ -521,10 +570,7 @@ class ModelDropdown this.modelList = document.querySelector(`#${this.modelFilter.id}-model-list`) this.modelResult = document.querySelector(`#${this.modelFilter.id}-model-result`) this.modelNoResult = document.querySelector(`#${this.modelFilter.id}-model-no-result`) - this.modelList.style.display = 'block' - this.modelFilter.style.width = this.modelList.offsetWidth + 'px' - this.modelFilterArrow.style.height = this.modelFilter.offsetHeight + 'px' - this.modelList.style.display = 'none' + this.updateInputSize() if (this.modelFilterInitialized !== true) { this.modelFilter.addEventListener('input', this.bind(this.filterList, this))