Merge pull request #24 from EtSL33py/test

Use "drop" event instead of "dragend" in Firefox
This commit is contained in:
Hayden
2024-09-23 17:56:07 +08:00
committed by GitHub

View File

@@ -97,35 +97,8 @@ class KeyComboListener {
} }
} }
/** // This is used in Firefox to bypass the dragend event because it returns incorrect clientX and clientY
* Handles Firefox's drag event, which returns different coordinates and then fails when calling `elementFromPoint`. const IS_FIREFOX = navigator.userAgent.indexOf('Firefox') > -1;
* @param {DragEvent} event
* @returns {[Number, Number, HTMLElement]} [clientX, clientY, targetElement]
*/
function elementFromDragEvent(event) {
let clientX = null;
let clientY = null;
let target;
const userAgentString = navigator.userAgent;
if (userAgentString.indexOf('Firefox') > -1) {
clientX = event.clientX;
clientY = event.clientY;
const screenOffsetX = window.screenLeft;
if (clientX >= screenOffsetX) {
clientX = clientX - screenOffsetX;
}
const screenOffsetY = window.screenTop;
if (clientY >= screenOffsetY) {
clientY = clientY - screenOffsetY;
}
target = document.elementFromPoint(clientX, clientY);
} else {
clientX = event.clientX;
clientY = event.clientY;
target = document.elementFromPoint(event.clientX, event.clientY);
}
return [clientX, clientY, target];
}
/** /**
* @param {string} url * @param {string} url
@@ -1895,20 +1868,16 @@ class ModelGrid {
* @param {boolean} removeEmbeddingExtension * @param {boolean} removeEmbeddingExtension
* @param {boolean} strictlyOnWidget * @param {boolean} strictlyOnWidget
*/ */
static #dragAddModel( static dragAddModel(
event, event,
modelType, modelType,
path, path,
removeEmbeddingExtension, removeEmbeddingExtension,
strictlyOnWidget, strictlyOnWidget,
) { ) {
const [clientX, clientY, target] = elementFromDragEvent(event); const target = document.elementFromPoint(event.clientX, event.clientY);
if (modelType !== 'embeddings' && target.id === 'graph-canvas') { if (modelType !== 'embeddings' && target.id === 'graph-canvas') {
//const pos = app.canvas.convertEventToCanvasOffset(event); const pos = app.canvas.convertEventToCanvasOffset(event);
const pos = app.canvas.convertEventToCanvasOffset({
clientX: clientX,
clientY: clientY,
});
const node = app.graph.getNodeOnPos( const node = app.graph.getNodeOnPos(
pos[0], pos[0],
@@ -2074,6 +2043,47 @@ class ModelGrid {
const previewThumbnailFormat = const previewThumbnailFormat =
settingsElements['model-preview-thumbnail-type'].value; settingsElements['model-preview-thumbnail-type'].value;
if (models.length > 0) { if (models.length > 0) {
const $overlay = IS_FIREFOX
? ((
modelType,
path,
removeEmbeddingExtension,
strictDragToAdd,
) => {
return $el('div.model-preview-overlay', {
ondragstart: (e) =>{
const data = {
modelType: modelType,
path: path,
removeEmbeddingExtension: removeEmbeddingExtension,
strictDragToAdd: strictDragToAdd,
};
e.dataTransfer.setData('manager-model', JSON.stringify(data));
e.dataTransfer.setData('text/plain', '');
},
draggable: true,
});
})
: ((
modelType,
path,
removeEmbeddingExtension,
strictDragToAdd,
) => {
return $el('div.model-preview-overlay', {
ondragend: (e) =>
ModelGrid.dragAddModel(
e,
modelType,
path,
removeEmbeddingExtension,
strictDragToAdd,
),
draggable: true,
});
});
return models.map((item) => { return models.map((item) => {
const previewInfo = item.preview; const previewInfo = item.preview;
const previewThumbnail = $el('img.model-preview', { const previewThumbnail = $el('img.model-preview', {
@@ -2161,20 +2171,14 @@ class ModelGrid {
}, },
}).element, }).element,
]; ];
const dragAdd = (e) => return $el('div.item', {}, [
ModelGrid.#dragAddModel( previewThumbnail,
e, $overlay(
modelType, modelType,
path, path,
removeEmbeddingExtension, removeEmbeddingExtension,
strictDragToAdd, strictDragToAdd,
); ),
return $el('div.item', {}, [
previewThumbnail,
$el('div.model-preview-overlay', {
ondragend: (e) => dragAdd(e),
draggable: true,
}),
$el( $el(
'div.model-preview-top-right', 'div.model-preview-top-right',
{ {
@@ -5350,6 +5354,20 @@ class ModelManager extends ComfyDialog {
updateDragSidebar(e, e.touches[0].clientX, e.touches[0].clientY), updateDragSidebar(e, e.touches[0].clientX, e.touches[0].clientY),
); );
if(IS_FIREFOX){
app.canvasContainer.addEventListener('drop', (e) => {
if (e.dataTransfer.types.includes('manager-model')){
const data = JSON.parse(e.dataTransfer.getData('manager-model'));
ModelGrid.dragAddModel(
e,
data.modelType,
data.path,
data.removeEmbeddingExtension,
data.strictDragToAdd,
);
}
});
}
this.#init(); this.#init();
} }