Support for drag&dropping an entire folder with model files #175
This commit is contained in:
parent
7abc941715
commit
2ac86e2a65
@ -93,4 +93,3 @@ OV.ReadFile = function (file, format)
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
BIN
test/testfiles/dir/cube_four_instances.3ds
Normal file
BIN
test/testfiles/dir/cube_four_instances.3ds
Normal file
Binary file not shown.
BIN
test/testfiles/dir/images/texture.png
Normal file
BIN
test/testfiles/dir/images/texture.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 55 KiB |
@ -189,3 +189,76 @@ OV.InstallVerticalSplitter = function (splitterDiv, resizedDiv, flipped, onResiz
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
OV.GetFilesFromDataTransfer = function (dataTransfer, onReady)
|
||||||
|
{
|
||||||
|
async function GetFileEntriesFromDirectory (dirEntry, fileEntries)
|
||||||
|
{
|
||||||
|
let reader = dirEntry.createReader ();
|
||||||
|
return new Promise ((resolve, reject) => {
|
||||||
|
reader.readEntries (
|
||||||
|
async (dirEntries) => {
|
||||||
|
for (let entry of dirEntries) {
|
||||||
|
if (entry.isFile) {
|
||||||
|
fileEntries.push (entry);
|
||||||
|
} else if (entry.isDirectory) {
|
||||||
|
await GetFileEntriesFromDirectory (entry, fileEntries);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
resolve ();
|
||||||
|
},
|
||||||
|
(error) => {
|
||||||
|
reject (error);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function GetFileObjectsFromEntries (entries, onReady)
|
||||||
|
{
|
||||||
|
let fileEntries = [];
|
||||||
|
for (let entry of entries) {
|
||||||
|
if (entry.isFile) {
|
||||||
|
fileEntries.push (entry);
|
||||||
|
} else if (entry.isDirectory) {
|
||||||
|
await GetFileEntriesFromDirectory (entry, fileEntries);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let fileObjects = await Promise.all (fileEntries.map ((fileEntry) => {
|
||||||
|
return new Promise ((resolve, reject) => {
|
||||||
|
fileEntry.file (
|
||||||
|
(file) => {
|
||||||
|
resolve (file);
|
||||||
|
},
|
||||||
|
(error) => {
|
||||||
|
reject (error);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
})
|
||||||
|
}));
|
||||||
|
|
||||||
|
onReady (fileObjects);
|
||||||
|
}
|
||||||
|
|
||||||
|
let getAsEntryFunc = null;
|
||||||
|
if (DataTransferItem) {
|
||||||
|
if (DataTransferItem.prototype.getAsEntry) {
|
||||||
|
getAsEntryFunc = DataTransferItem.prototype.getAsEntry;
|
||||||
|
} else if (DataTransferItem.prototype.webkitGetAsEntry) {
|
||||||
|
getAsEntryFunc = DataTransferItem.prototype.webkitGetAsEntry;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (getAsEntryFunc !== null) {
|
||||||
|
let entries = [];
|
||||||
|
for (let item of dataTransfer.items) {
|
||||||
|
entries.push (getAsEntryFunc.call (item));
|
||||||
|
}
|
||||||
|
GetFileObjectsFromEntries (entries, (allEntries) => {
|
||||||
|
onReady (allEntries);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
onReady (dataTransfer.files);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|||||||
@ -489,10 +489,12 @@ OV.Website = class
|
|||||||
window.addEventListener ('drop', (ev) => {
|
window.addEventListener ('drop', (ev) => {
|
||||||
ev.stopPropagation ();
|
ev.stopPropagation ();
|
||||||
ev.preventDefault ();
|
ev.preventDefault ();
|
||||||
if (ev.dataTransfer.files.length > 0) {
|
OV.GetFilesFromDataTransfer (ev.dataTransfer, (files) => {
|
||||||
|
if (files.length > 0) {
|
||||||
this.eventHandler.HandleEvent ('model_load_started', { source : 'drop' });
|
this.eventHandler.HandleEvent ('model_load_started', { source : 'drop' });
|
||||||
this.LoadModelFromFileList (ev.dataTransfer.files);
|
this.LoadModelFromFileList (files);
|
||||||
}
|
}
|
||||||
|
});
|
||||||
}, false);
|
}, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user