const { ipcRenderer } = require('electron'); const remote = require("electron").remote; var dialog = remote.dialog; var fs = require('fs'); let StateData = { file_path: '', last_state: null } function showAlert(msg, speed=0.02) { var div = '
'+msg+'
'; document.getElementById("container").innerHTML = div; var s = document.getElementById('message').style; s.opacity = 1; (function fade(){(s.opacity-=speed)<0?s.display="none":setTimeout(fade,40)})(); } function set_caculator_state(des_file_data) { state = JSON.parse(des_file_data); try { calculator.setState(state); } catch(err) { calculator.setBlank(); } } function saveText(text, file){ fs.writeFileSync(file, text); showAlert('Saved successfully. ;)'); } function setTitle() { if (StateData.file_path) document.title = "Desmos - " + StateData.file_path; else document.title = "Desmos - * Untitled"; ipcRenderer.send('renderer-request', {msg: 'TitleChanged', data: StateData.file_path}); } setInterval( function(){ if (isSaved()) return; else if (StateData.file_path) document.title = "Desmos - * "+StateData.file_path; }, 1000); function newFile() { var canceled = !askSaveIfNeed(); if (canceled) return; calculator.setBlank(); StateData.file_path = ''; setTitle(); } function openFile(filePath=null, init=false) { if (!init) { if (canceled) return; var canceled = !askSaveIfNeed(); } if (!filePath && init) { return; } if (!filePath) { filePaths = dialog.showOpenDialog({filters: [ {name: 'des', extensions: ['des'] }]}); if (!filePaths) return; filePath = filePaths[0]; } fs.readFile(filePath, (err, data) => { if(err){ showAlert("Error on openning :( " + err.message); calculator.setBlank(); } set_caculator_state(data); StateData.file_path = filePath; StateData.last_state = data; setTitle(); }); } function saveFile() { if(!StateData.file_path){ const file = dialog.showSaveDialog(remote.getCurrentWindow(), { filters: [ { name: "Desmos Files", extensions: ['des'] }] }); if(file) StateData.file_path=file; } if(StateData.file_path){ var state = calculator.getState(); StateData.last_state = state; var state_content = JSON.stringify(state, null, 4); saveText(state_content, StateData.file_path); setTitle(); } } function saveAsFile() { const file = dialog.showSaveDialog(remote.getCurrentWindow(), { filters: [ { name: "Desmos Files", extensions: ['des'] }] }); if(file) StateData.file_path=file; if(StateData.file_path){ var state = calculator.getState(); StateData.last_state = state; var state_content = JSON.stringify(state, null, 4); saveText(state_content, StateData.file_path); setTitle(); } } function exportImage() { var image = calculator.screenshot({ width: remote.width, height: remote.height, targetPixelRatio: 2 }); var image_data = image.replace(/^data:image\/png;base64,/, ""); dialog.showSaveDialog({filters: [ {name: 'png', extensions: ['png'] }]}, (fileName) => { if (fileName === undefined){ console.log("You didn't open the file."); return; } // fileName is a string that contains the path and filename created in the save file dialog. fs.writeFile(fileName, image_data, 'base64', (err) => { if(err){ alert("An error ocurred creating the file. :( "+ err.message) } showAlert("Succesfully exported. ;)"); }); }); } function isStateNull() { if (StateData.last_state == null && calculator.getState().expressions.list[0].latex === undefined) return true; else return false; } function isSaved() { if (isStateNull()) return true; if (StateData.file_path == "" || StateData.last_state == null) return false; else { if (JSON.stringify(calculator.getState().extensions) == JSON.stringify(StateData.last_state.extensions)) return true; else return false; } } function askSaveIfNeed(){ if(isSaved()) return true; const response = dialog.showMessageBox(remote.getCurrentWindow(), { message: 'Do you want to save the current document?', type: 'question', buttons: [ 'Yes', 'No', 'Cancel' ] }); // Yes to save if (response == 0) saveFile(); if (response == 2) return false; else return true; } function exitApp() { var exit = askSaveIfNeed(); if (exit) { showAlert('Exiting...', 0); setTimeout(()=>{ ipcRenderer.sendSync('renderer-response', {msg: 'Exit'}); }, 600); } } ipcRenderer.on('mainprocess-request', (event, arg) => { console.log(arg); switch (arg.msg) { case 'NewFile': newFile(); break; case 'Init': openFile(arg.data, true); break; case 'OpenFile': openFile(); break; case 'SaveFile': saveFile(); break; case 'SaveAsFile': saveAsFile(); break; case 'ExportImage': exportImage(); break; case 'Undo': calculator.undo(); break; case 'Redo': calculator.redo(); break; case 'Clear': calculator.setBlank(); break; case 'Exitting': exitApp(); break; default: break; } }); document.addEventListener("keydown", event => { switch (event.key) { case "Escape": if (remote.getCurrentWindow().isFullScreen()) { remote.getCurrentWindow().setFullScreen(false); } else { remote.getCurrentWindow().close(); } break; } }); ipcRenderer.send('renderer-request', {msg: 'ToInit'}) // document.ondragover = document.ondrop = (ev) => { // ev.preventDefault() // } // document.body.ondrop = (ev) => { // console.log(ev.dataTransfer.files[0].path) // ev.preventDefault() // }