import GlobalEvents from "/app/js/common/EventCaller.js"; import Utils from "/app/js/common/Utils.js"; import NESBank from "/app/js/models/NESBank.js"; import NESPalette from "/app/js/models/NESPalette.js"; import CTRLPalettesStore from "/app/js/ctrls/CTRLPalettesStore.js"; import CTRLBanksStore from "/app/js/ctrls/CTRLBanksStore.js"; var SURF = null; function JSONFromProject(){ var proj = { palettesStore:CTRLPalettesStore.obj, banksStore:CTRLBanksStore.obj }; return JSON.stringify(proj); } function LoadFile(file){ if (SURF !== null){ var reader = new FileReader(); if (SURF instanceof NESBank){ reader.onload = function(e){ try { SURF.chr = new Uint8Array(e.target.result); } catch (e) { console.log(e.toString()); } } reader.readAsArrayBuffer(file); } } } function HANDLE_DragOver(e){ e.stopPropagation(); e.preventDefault(); e.dataTransfer.dropEffect = 'copy'; }; function HANDLE_FileDrop(e){ e.stopPropagation(); e.preventDefault(); var files = e.dataTransfer.files; for (let i=0; i < files.length; i++){ LoadFile(files[i]); } } function HANDLE_SaveProject(e){ var a = document.createElement("a"); var file = new Blob([JSONFromProject()], {type: "text/plain"}); a.href = window.URL.createObjectURL(file); a.download = "nesproject.json"; var body = document.querySelector("body"); body.appendChild(a); a.click(); setTimeout(function(){ // fixes firefox html removal bug window.URL.revokeObjectURL(url); a.remove(); }, 500); } function HANDLE_LoadProjectRequest(){ var input = document.querySelectorAll("input.project-loader"); if (input.length > 0){ input[0].click(); } } function HANDLE_LoadProject(e){ if (this.files && this.files.length > 0){ var reader = new FileReader(); reader.onload = function(e) { var content = e.target.result; console.log(content); // TODO: Need to clear out the selected files after load. }; reader.readAsText(this.files[0]); } else { console.log("Project file not found or no file selected."); } } function HANDLE_SurfChange(surf){ if (surf instanceof NESBank){ SURF = surf; } else { SURF = null; } } class CTRLIO{ constructor(){ GlobalEvents.listen("change_surface", HANDLE_SurfChange); GlobalEvents.listen("save-project", HANDLE_SaveProject); GlobalEvents.listen("load-project", HANDLE_LoadProjectRequest); var input = document.querySelectorAll("input.project-loader"); if (input.length > 0){ input[0].addEventListener("change", HANDLE_LoadProject); } } initialize(){ var e = document.querySelectorAll(".drop-zone"); for (let i=0; i < e.length; e++){ e[i].addEventListener("dragover", HANDLE_DragOver); e[i].addEventListener("drop", HANDLE_FileDrop); } CTRLPalettesStore.initialize(); CTRLBanksStore.initialize(); } } const instance = new CTRLIO(); export default instance;