{ "name": "App Creator", "icon": `build`, "desc": "Create your own native GopalOS apps! This program handles everything from file creation and editing to application packaging.", "id": "app-creator", "defaultRelease": "alpha", "releases": { "alpha": { "version": "v0.2.1-alpha.1", "app-files": { "app-creator": { type: "pgm", content: function() { if (document.getElementById("app_app-creator_window")) { document.getElementById("app_app-creator_window").style.display = "block"; } else { document.getElementById("windows").insertAdjacentHTML("beforeend", getRef("/apps/app-creator/window")); getRef("/apps/app-creator/load")(); } focusWin(document.getElementById("app_app-creator_window")); regTbarIcon("/apps/app-creator/app-creator", "app_app-creator_window", "</>"); refreshWindows(); } }, "load": { type: "js", content: function() {} }, "window": { type: "html", content: `
App Creator
🗕
🗖
❌︎
App Root
App Data
Ready
` }, "new-project": { type: "js", content: function(options = {}) { let projName = prompt("New App Creator Project\nChoose an app ID (e.g. \"my-cool-app\") for the new app..."); if (!projName) { projName = `app-${randInt(0, 16777215).toString(16)}`; } else {} projName = projName.trim(); if (getRef(`/home/appdata/app-creator/projects/${projName}`)) { if (confirm(`New App Creator Project\nProject ${projName} already exists. Do you want to overwrite it?\nWARNING: This action is irreversible.`)) { delRef(`/home/appdata/app-creator/projects/${projName}`); } else { return; } } else {} if (options.fromInstalledApp) { createRef(`/home/appdata/app-creator/projects/${projName}`, "dir", getRef(`/apps/${options.fromInstalledApp}`)); } else if (options.template) { createRef(`/home/appdata/app-creator/projects/${projName}`, "dir", getRef(`/apps/app-creator/templates/${options.template}`)(projName)); } else { createRef(`/home/appdata/app-creator/projects/${projName}`, "dir", getRef("/apps/app-creator/templates/basic")(projName)); } } }, "open-project": { type: "js", content: function() { document.getElementById("app_app-creator_editor").value = ""; } }, "templates": { type: "dir", content: { "basic": { type: "js", content: function(projName) { return { [projName]: { type: "pgm", content: eval(`(function() { if (document.getElementById("app_${projName}_window")) { document.getElementById("app_${projName}_window").style.display = "block"; } else { document.getElementById("windows").insertAdjacentHTML("beforeend", getRef("/apps/${projName}/window")); getRef("/apps/${projName}/load")(); } focusWin(document.getElementById("app_${projName}_window")); regTbarIcon("/apps/${projName}/${projName}", "app_${projName}_window", getRef("/apps/${projName}/icon")); refreshWindows(); })`) }, "load": { type: "js", content: function() {} }, "icon": { type: "var", content: "\u{1F5D4}" }, "window": { type: "html", content: `
App
🗕
🗖
❌︎
Content
` } }; } }, "menubar-and-statusbar": { type: "js", content: function(projName) { return { [projName]: { type: "pgm", content: eval(`(function() { if (document.getElementById("app_${projName}_window")) { document.getElementById("app_${projName}_window").style.display = "block"; } else { document.getElementById("windows").insertAdjacentHTML("beforeend", getRef("/apps/${projName}/window")); getRef("/apps/${projName}/load")(); } focusWin(document.getElementById("app_${projName}_window")); regTbarIcon("/apps/${projName}/${projName}", "app_${projName}_window", getRef("/apps/${projName}/icon")); refreshWindows(); })`) }, "load": { type: "js", content: function() {} }, "icon": { type: "var", content: "\u{1F5D4}" }, "window": { type: "html", content: `
App
🗕
🗖
❌︎
Ready
` } }; } }, "current-project": { type: "var", content: "" }, "current-path": {}, "open": { type: "js", content: function(path) { if (document.getElementById("app_text-editor_window") == null) { getRef("/apps/text-editor/text-editor")(); } else {} if (getRef("/apps/text-editor/unsaved-changes") == true) { if (confirm("Are you sure you want to open a new file? You have unsaved changes.")) { writeRef("/apps/text-editor/unsaved-changes", false); } else { return; } } else {} document.getElementById("app_text-editor_filepath").value = path; if (getRef(path) == null) { msgbox("This file does not exist or cannot be edited."); } else if (["txt", "cfg", "css", "html", "c", "cpp", "h", "java", "cfg", "asm"].includes(getRef(path, true).type)) { document.getElementById("app_text-editor_editor").value = getRef(path); } else if (getRef(path, true).type == "js") { document.getElementById("app_text-editor_editor").value = String(getRef(path)); } else if (getRef(path, true).type == "pgm" && getRef("/home/appdata/text-editor/options").allowPGMEditing == true) { document.getElementById("app_text-editor_editor").value = String(getRef(path)); } else if (getRef(path, true).type == "json") { document.getElementById("app_text-editor_editor").value = JSON.stringify(getRef(path), null, 2); } else { msgbox("Text Editor does not support this file type.", "Text Editor"); } } }, "save": { type: "js", content: function(path) { let fileTypeNotSupported = false; if (["txt", "cfg", "css", "html", "c", "cpp", "o", "h", "java", "cfg", "asm"].includes(getRef(path, true).type)) { writeRef(path, document.getElementById("app_text-editor_editor").value); } else if (getRef(path, true).type == "js") { writeRef(path, eval(`(${document.getElementById("app_text-editor_editor").value})`)); } else if (getRef(path, true).type == "pgm" && getRef("/home/appdata/text-editor/options").allowPGMEditing == true) { writeRef(path, eval(`(${document.getElementById("app_text-editor_editor").value})`)); } else if (getRef(path, true).type == "json") { let isValidJSON = true; try { JSON.parse(document.getElementById("app_text-editor_editor").value); } catch(err) { document.getElementById("app_text-editor_statbar").innerHTML = `${err.name}: ${err.message}`; isValidJSON = false; } finally { if (!isValidJSON) {} else { document.getElementById("app_text-editor_statbar").innerHTML = "Saving..."; writeRef(path, JSON.parse(document.getElementById("app_text-editor_editor").value)); document.getElementById("app_text-editor_statbar").innerHTML = "Ready"; } } } else { msgbox("Text Editor does not support this file type.", "Text Editor"); fileTypeNotSupported = true; } if (fileTypeNotSupported) {} else { writeRef("/apps/text-editor/unsaved-changes", false); } } } } } } } } }