pythongosssss
2 years ago
2 changed files with 67 additions and 1 deletions
@ -0,0 +1,66 @@ |
|||||||
|
import { app } from "/scripts/app.js"; |
||||||
|
|
||||||
|
// Adds filtering to context menus
|
||||||
|
|
||||||
|
const id = "Comfy.ContextMenuFilter"; |
||||||
|
app.registerExtension({ |
||||||
|
name: id, |
||||||
|
init() { |
||||||
|
const ctxMenu = LiteGraph.ContextMenu; |
||||||
|
LiteGraph.ContextMenu = function (values, options) { |
||||||
|
const ctx = ctxMenu.call(this, values, options); |
||||||
|
|
||||||
|
// If we are a dark menu (only used for combo boxes) then add a filter input
|
||||||
|
if (options?.className === "dark" && values?.length > 10) { |
||||||
|
const filter = document.createElement("input"); |
||||||
|
Object.assign(filter.style, { |
||||||
|
width: "calc(100% - 10px)", |
||||||
|
border: "0", |
||||||
|
boxSizing: "border-box", |
||||||
|
background: "#333", |
||||||
|
border: "1px solid #999", |
||||||
|
margin: "0 0 5px 5px", |
||||||
|
color: "#fff", |
||||||
|
}); |
||||||
|
filter.placeholder = "Filter list"; |
||||||
|
this.root.prepend(filter); |
||||||
|
|
||||||
|
filter.addEventListener("input", () => { |
||||||
|
// Hide all items that dont match our filter
|
||||||
|
const term = filter.value.toLocaleLowerCase(); |
||||||
|
const items = this.root.querySelectorAll(".litemenu-entry"); |
||||||
|
for (const item of items) { |
||||||
|
item.style.display = !term || item.textContent.toLocaleLowerCase().includes(term) ? "block" : "none"; |
||||||
|
} |
||||||
|
|
||||||
|
// If we have an event then we can try and position the list under the source
|
||||||
|
if (options.event) { |
||||||
|
let top = options.event.clientY - 10; |
||||||
|
|
||||||
|
const bodyRect = document.body.getBoundingClientRect(); |
||||||
|
const rootRect = this.root.getBoundingClientRect(); |
||||||
|
if (bodyRect.height && top > bodyRect.height - rootRect.height - 10) { |
||||||
|
top = Math.max(0, bodyRect.height - rootRect.height - 10); |
||||||
|
} |
||||||
|
|
||||||
|
this.root.style.top = top + "px"; |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
requestAnimationFrame(() => { |
||||||
|
// Focus the filter box when opening
|
||||||
|
filter.focus(); |
||||||
|
|
||||||
|
// If the top is off screen then shift the element
|
||||||
|
if (parseInt(this.root.style.top) < 0) { |
||||||
|
this.root.style.top = 0; |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
return ctx; |
||||||
|
}; |
||||||
|
|
||||||
|
LiteGraph.ContextMenu.prototype = ctxMenu.prototype; |
||||||
|
}, |
||||||
|
}); |
Loading…
Reference in new issue