From ee885beeed57d95ffb58922cfc6b826b7ebf9a31 Mon Sep 17 00:00:00 2001 From: 0neGal Date: Thu, 30 Dec 2021 22:05:54 +0100 Subject: first-ish draft of the mod UI and utils --- src/app/index.html | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'src/app/index.html') diff --git a/src/app/index.html b/src/app/index.html index dc65d67..edf7fbe 100644 --- a/src/app/index.html +++ b/src/app/index.html @@ -20,6 +20,16 @@ +
+
+
+
%%gui.mods%%
+
+ + + +
+
-- cgit v1.2.3 From c5c63d6c8a81596d0dcf3e14e072ea14f4d0610c Mon Sep 17 00:00:00 2001 From: 0neGal Date: Fri, 31 Dec 2021 15:41:51 +0100 Subject: added remove and toggle mod/all mods --- src/app/index.html | 4 +++- src/app/main.css | 3 ++- src/lang/en.json | 4 +++- 3 files changed, 8 insertions(+), 3 deletions(-) (limited to 'src/app/index.html') diff --git a/src/app/index.html b/src/app/index.html index edf7fbe..9b72ebb 100644 --- a/src/app/index.html +++ b/src/app/index.html @@ -25,8 +25,10 @@
%%gui.mods%%
- + + +
diff --git a/src/app/main.css b/src/app/main.css index 08c82fa..929483a 100644 --- a/src/app/main.css +++ b/src/app/main.css @@ -77,8 +77,9 @@ button:active { } -#update, #installmod {background: #81A1C1} #setpath {background: #5E81AC} #vanilla, #exit {background: #656E7F} +#update, #installmod {background: #81A1C1} +#togglemod, #toggleall {background: #ECD19A} #northstar, #removeall, #removemod {background: #C7777F} button:disabled {background: var(--disabled) !important; opacity: 0.5} diff --git a/src/lang/en.json b/src/lang/en.json index 0aa7ef2..523c6fa 100644 --- a/src/lang/en.json +++ b/src/lang/en.json @@ -25,7 +25,9 @@ "gui.mods": "Mods", "gui.mods.count": "Mods Installed:", "gui.mods.install": "Install Mod", - "gui.mods.removemod": "Remove Mod", + "gui.mods.toggle": "Toggle Mod", + "gui.mods.toggleall": "Toggle All", + "gui.mods.remove": "Remove Mod", "gui.mods.removeall": "Remove All", "gui.update.downloading": "Downloading...", -- cgit v1.2.3 From bf7bd0993714f20fd0ab360de956378113e1d9c2 Mon Sep 17 00:00:00 2001 From: 0neGal Date: Mon, 3 Jan 2022 00:43:45 +0100 Subject: fully working GUI functionality Smoothly updates and works flawlessly, the only thing that really needs improvements is the design and on top of that installing mods from a Zip file over folder. --- src/app/index.html | 10 ++++----- src/app/main.js | 59 ++++++++++++++++++++++++++++++++++++++++++++++-------- src/index.js | 8 ++++++++ src/lang/en.json | 2 ++ src/utils.js | 38 ++++++++++++++++++++++++++++++----- 5 files changed, 99 insertions(+), 18 deletions(-) (limited to 'src/app/index.html') diff --git a/src/app/index.html b/src/app/index.html index ffc31a6..88cfbb5 100644 --- a/src/app/index.html +++ b/src/app/index.html @@ -31,11 +31,11 @@
%%gui.mods%%
- - - - - + + + + +
diff --git a/src/app/main.js b/src/app/main.js index c500ba3..f903c29 100644 --- a/src/app/main.js +++ b/src/app/main.js @@ -45,18 +45,57 @@ function setButtons(state) { } } +let lastselected = ""; function select(entry) { - let entries = document.querySelectorAll("#modsdiv .mod"); + let entries = document.querySelectorAll("#modsdiv .mod span"); for (let i = 0; i < entries.length; i++) { if (entries[i].innerHTML == entry) { - entries[i].classList.add("selected"); + lastselected = entry; + entries[i].parentElement.classList.add("selected"); } else { - entries[i].classList.remove("selected"); + entries[i].parentElement.classList.remove("selected"); } } } +function selected(all) { + let selected = ""; + if (all) { + selected = "allmods" + } else { + selected = document.querySelector(".mod.selected span"); + if (selected != null) { + selected = selected.innerHTML; + } else { + alert(lang("gui.mods.nothingselected")); + return { + remove: () => {}, + toggle: () => {}, + } + } + } + + return { + remove: () => { + if (selected == "allmods") { + if (! confirm(lang("gui.mods.removeall.confirm"))) { + return; + } + } + + ipcRenderer.send("removemod", selected) + }, + toggle: () => { + ipcRenderer.send("togglemod", selected) + } + } +} + +function installmod() { + ipcRenderer.send("installmod") +} + ipcRenderer.on("ns-updated", () => {setButtons(true)}) ipcRenderer.on("ns-updating", () => {setButtons(false)}) @@ -67,15 +106,19 @@ ipcRenderer.on("newpath", (event, newpath) => { ipcRenderer.on("log", (event, msg) => {log(msg)}) ipcRenderer.on("mods", (event, mods) => { + console.log("refreshed mods") modcount.innerHTML = `${lang("gui.mods.count")} ${mods.all.length}`; modsdiv.innerHTML = ""; - for (let i = 0; i < mods.enabled.length; i++) { - modsdiv.innerHTML += `
${mods.enabled[i].Name}
`; + + let newmod = (name, extra) => { + if (! extra) {extra = ""} + modsdiv.innerHTML += `
${name}${extra}
`; } - for (let i = 0; i < mods.disabled.length; i++) { - modsdiv.innerHTML += `
${mods.disabled[i].Name} - Disabled
`; - } + for (let i = 0; i < mods.enabled.length; i++) {newmod(mods.enabled[i].Name)} + for (let i = 0; i < mods.disabled.length; i++) {newmod(mods.disabled[i].Name, " - Disabled")} + + select(lastselected); }) ipcRenderer.on("version", (event, versions) => { diff --git a/src/index.js b/src/index.js index 161092a..7ef9321 100644 --- a/src/index.js +++ b/src/index.js @@ -57,6 +57,14 @@ function start() { ipcMain.on("updatenow", () => { autoUpdater.quitAndInstall(); }) + + ipcMain.on("removemod", (event, mod) => {utils.mods.remove(mod)}) + ipcMain.on("togglemod", (event, mod) => {utils.mods.toggle(mod)}) + ipcMain.on("installmod", () => { + dialog.showOpenDialog({properties: ["openDirectory"]}).then(res => { + utils.mods.install(res.filePaths[0]); + }).catch(err => {console.error(err)}) + }) } ipcMain.on("launch", (event) => {utils.launch()}) diff --git a/src/lang/en.json b/src/lang/en.json index c5e0d77..20f97f2 100644 --- a/src/lang/en.json +++ b/src/lang/en.json @@ -35,6 +35,8 @@ "gui.mods.toggleall": "Toggle All", "gui.mods.remove": "Remove Mod", "gui.mods.removeall": "Remove All", + "gui.mods.nothingselected": "You've not selected a mod.", + "gui.mods.removeall.confirm": "Removing all mods will usually require you to reinstall Northstar, are you sure?", "gui.update.downloading": "Downloading...", "gui.update.extracting": "Extracting update...", diff --git a/src/utils.js b/src/utils.js index 88e5f3a..ef8b586 100644 --- a/src/utils.js +++ b/src/utils.js @@ -117,6 +117,7 @@ function update() { } } + ipcMain.emit("guigetmods"); ipcMain.emit("ns-updated"); winLog(lang("gui.update.finished")); console.log(lang("cli.update.finished")); @@ -194,7 +195,7 @@ const mods = { disabled.push({...require(path.join(disabledPath, file, "mod.json")), FolderName: file, Disabled: true}) }catch(err) { console.log("error: " + lang("cli.mods.improperjson"), file) - disabled.push({Name: file, FolderName: file, Version: "unknown", Disabled: false}) + disabled.push({Name: file, FolderName: file, Version: "unknown", Disabled: true}) } } } @@ -220,15 +221,13 @@ const mods = { install: (mod) => { if (fs.statSync(mod).isDirectory()) { if (fs.statSync(path.join(mod, "mod.json"))) { - copy(mod, path.join(modpath, mod.replace(/^.*(\\|\/|\:)/, "")), { + copy.sync(mod, path.join(modpath, mod.replace(/^.*(\\|\/|\:)/, "")), { mode: true, cover: true, utimes: true, - }, (err) => { - if(err) {console.log("error:", err)}; - console.log(); }); cli.exit(); + ipcMain.emit("guigetmods"); return } else { console.log("error: " + lang("cli.mods.notamod")) @@ -240,19 +239,47 @@ const mods = { fs.createReadStream(mod).pipe(unzip.Extract({path: modpath})) .on("finish", () => { cli.exit(); + ipcMain.emit("guigetmods"); }); }, remove: (mod) => { + if (mod == "allmods") { + let modlist = mods.list().all; + for (let i = 0; i < modlist.length; i++) { + mods.remove(modlist[i].Name) + } + return + } + + let disabled = path.join(modpath, "disabled"); + if (! fs.existsSync(disabled)) { + fs.mkdirSync(disabled) + } + let modName = mods.get(mod).FolderName; let modPath = path.join(modpath, modName); + + if (mods.get(mod).Disabled) { + modPath = path.join(disabled, modName); + } + if (fs.statSync(modPath).isDirectory()) { fs.rmSync(modPath, {recursive: true}); cli.exit(); + ipcMain.emit("guigetmods"); } else { cli.exit(1); } }, toggle: (mod) => { + if (mod == "allmods") { + let modlist = mods.list().all; + for (let i = 0; i < modlist.length; i++) { + mods.toggle(modlist[i].Name) + } + return + } + let disabled = path.join(modpath, "disabled"); if (! fs.existsSync(disabled)) { fs.mkdirSync(disabled) @@ -268,6 +295,7 @@ const mods = { } fs.moveSync(modPath, dest) + ipcMain.emit("guigetmods"); } }; -- cgit v1.2.3 From e77ac64018bec2ca98e2264fafd6db02990ef741 Mon Sep 17 00:00:00 2001 From: 0neGal Date: Mon, 3 Jan 2022 02:43:10 +0100 Subject: mod buttons are now disabled if NS isn't installed --- src/app/index.html | 2 +- src/app/main.js | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) (limited to 'src/app/index.html') diff --git a/src/app/index.html b/src/app/index.html index 88cfbb5..88d5a17 100644 --- a/src/app/index.html +++ b/src/app/index.html @@ -30,7 +30,7 @@
%%gui.mods%%
-
+
diff --git a/src/app/main.js b/src/app/main.js index 8db6561..6f2493a 100644 --- a/src/app/main.js +++ b/src/app/main.js @@ -129,6 +129,14 @@ ipcRenderer.on("mods", (event, mods) => { ipcRenderer.on("version", (event, versions) => { vpversion.innerText = lang("gui.versions.viper") + ": " + versions.vp; nsversion.innerText = lang("gui.versions.northstar") + ": " + versions.ns; + + if (versions.ns == "unknown") { + let buttons = document.querySelectorAll(".modbtns button"); + + for (let i = 0; i < buttons.length; i++) { + buttons[i].disabled = true; + } + } }); ipcRenderer.send("getversion"); ipcRenderer.on("updateavailable", () => { -- cgit v1.2.3