From 73c1f662e81c0eb560e26ed71b5372cd3f142f88 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Sat, 29 Jul 2023 13:26:36 +0200 Subject: [PATCH] add in-app settings --- src/content/css/inAppSettings.css | 87 +++++++++++++++++++++++++++++++ src/ipc.ts | 50 +++++++++++++++++- src/preload/preload.ts | 7 +-- src/preload/settings.ts | 44 ++++++++++++++++ src/settings/main.ts | 59 ++------------------- src/settings/preload.ts | 4 +- src/window.ts | 3 ++ 7 files changed, 191 insertions(+), 63 deletions(-) create mode 100644 src/content/css/inAppSettings.css create mode 100644 src/preload/settings.ts diff --git a/src/content/css/inAppSettings.css b/src/content/css/inAppSettings.css new file mode 100644 index 0000000..ee7551d --- /dev/null +++ b/src/content/css/inAppSettings.css @@ -0,0 +1,87 @@ +/* The Modal (background) */ +.ACsettings-modal { + display: none; + /* Hidden by default */ + position: fixed; + /* Stay in place */ + z-index: 9999999999999; + /* Sit on top */ + padding-top: 100px; + /* Location of the box */ + background-color: var(--background-secondary); + left: 0; + top: 0; + width: 100%; + /* Full width */ + height: 100%; + /* Full height */ + overflow: auto; + /* Enable scroll if needed */ + background-color: rgb(0, 0, 0); + /* Fallback color */ + background-color: rgba(0, 0, 0, 0.4); + /* Black w/ opacity */ +} + +/* Modal Content */ +.ACsettings-modal-content { + position: relative; + margin: auto; + padding: 1rem; + background-color: var(--background-secondary); + border-color: var(--background-floating); + border-style: solid; + border-radius: 10px; + width: 80%; + height: 80%; + box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); + -webkit-animation-name: animatetop; + -webkit-animation-duration: 0.4s; + animation-name: animatetop; + animation-duration: 0.4s; +} +webview#inAppSettings { + height: 100%; +} +/* Add Animation */ +@-webkit-keyframes animatetop { + from { + top: -300px; + opacity: 0; + } + + to { + top: 0; + opacity: 1; + } +} + +@keyframes animatetop { + from { + top: -300px; + opacity: 0; + } + + to { + top: 0; + opacity: 1; + } +} + +/* The Close Button */ +.close { + color: white; + float: right; + font-size: 28px; + font-weight: bold; + position: absolute; + right: 5%; + top: 5%; +} + +.close:hover, +.close:focus { + color: red; + text-decoration: none; + cursor: pointer; +} diff --git a/src/ipc.ts b/src/ipc.ts index 904fdbf..18f7dca 100644 --- a/src/ipc.ts +++ b/src/ipc.ts @@ -1,24 +1,33 @@ //ipc stuff -import {app, desktopCapturer, ipcMain, nativeImage, shell} from "electron"; +import {app, clipboard, desktopCapturer, ipcMain, nativeImage, shell} from "electron"; import {mainWindow} from "./window"; import { + Settings, getConfig, + getConfigLocation, getDisplayVersion, getLang, + getLangName, getVersion, getWindowState, modInstallState, packageVersion, setConfigBulk, - setLang + setLang, + sleep } from "./utils"; import {customTitlebar} from "./main"; import {createSettingsWindow} from "./settings/main"; import os from "os"; +import fs from "fs"; import path from "path"; import {createTManagerWindow} from "./themeManager/main"; import {splashWindow} from "./splash/main"; import {createKeybindWindow} from "./keybindMaker/main"; +const userDataPath = app.getPath("userData"); +const storagePath = path.join(userDataPath, "/storage/"); +const themesPath = path.join(userDataPath, "/themes/"); +const pluginsPath = path.join(userDataPath, "/plugins/"); export function registerIpc(): void { ipcMain.on("get-app-path", (event) => { event.reply("app-path", app.getAppPath()); @@ -142,4 +151,41 @@ export function registerIpc(): void { } }); ipcMain.handle("DESKTOP_CAPTURER_GET_SOURCES", (_event, opts) => desktopCapturer.getSources(opts)); + ipcMain.on("saveSettings", (_event, args: Settings) => { + console.log(args); + setConfigBulk(args); + }); + ipcMain.on("openStorageFolder", async () => { + shell.showItemInFolder(storagePath); + await sleep(1000); + }); + ipcMain.on("openThemesFolder", async () => { + shell.showItemInFolder(themesPath); + await sleep(1000); + }); + ipcMain.on("openPluginsFolder", async () => { + shell.showItemInFolder(pluginsPath); + await sleep(1000); + }); + ipcMain.on("openCrashesFolder", async () => { + shell.showItemInFolder(path.join(app.getPath("temp"), `${app.getName()} Crashes`)); + await sleep(1000); + }); + ipcMain.on("getLangName", async (event) => { + event.returnValue = await getLangName(); + }); + ipcMain.on("crash", async () => { + process.crash(); + }); + ipcMain.handle("getSetting", (_event, toGet: keyof Settings) => { + return getConfig(toGet); + }); + ipcMain.on("copyDebugInfo", () => { + let settingsFileContent = fs.readFileSync(getConfigLocation(), "utf-8"); + clipboard.writeText( + `**OS:** ${os.platform()} ${os.version()}\n**Architecture:** ${os.arch()}\n**ArmCord version:** ${getVersion()}\n**Electron version:** ${ + process.versions.electron + }\n\`${settingsFileContent}\`` + ); + }); } diff --git a/src/preload/preload.ts b/src/preload/preload.ts index 74ad61d..b237eae 100644 --- a/src/preload/preload.ts +++ b/src/preload/preload.ts @@ -1,13 +1,14 @@ import "./bridge"; import "./patch"; import "./optimizer"; - +import "./settings"; import {ipcRenderer} from "electron"; import * as fs from "fs"; import * as path from "path"; import {addScript, addStyle, sleep} from "../utils"; import {injectMobileStuff} from "./mobile"; import {fixTitlebar, injectTitlebar} from "./titlebar"; +import {injectSettings} from "./settings"; window.localStorage.setItem("hideNag", "true"); @@ -95,9 +96,9 @@ setInterval(() => { const tManager = advanced.cloneNode(true) as HTMLElement; const fQuit = advanced.cloneNode(true) as HTMLElement; const keybindMaker = advanced.cloneNode(true) as HTMLElement; - acSettings.textContent = "ArmCord"; + acSettings.textContent = "ArmCord Settings"; acSettings.id = "acSettings"; - acSettings.onclick = () => ipcRenderer.send("openSettingsWindow"); + acSettings.onclick = () => injectSettings(); tManager.textContent = "Themes"; tManager.id = "acThemes"; tManager.onclick = () => ipcRenderer.send("openManagerWindow"); diff --git a/src/preload/settings.ts b/src/preload/settings.ts new file mode 100644 index 0000000..9debcb4 --- /dev/null +++ b/src/preload/settings.ts @@ -0,0 +1,44 @@ +import * as path from "path"; +import * as fs from "fs"; +import {addStyle} from "../utils"; +import {WebviewTag} from "electron"; +var html = ` +
+× +
+
+
`; + +var webview = ``; +export function injectSettings() { + document.getElementById("webviewSettingsContainer")!.innerHTML = webview; + document.getElementById("ACsettingsModal")!.style.display = "block"; +} +function removeSettings() { + document.getElementById("webviewSettingsContainer")!.innerHTML = ""; + document.getElementById("ACsettingsModal")!.style.display = "none"; +} +document.addEventListener("DOMContentLoaded", function (_event) { + const elem = document.createElement("div"); + elem.innerHTML = html; + elem.classList.add("withFrame-haYltI"); + if (document.getElementById("app-mount") == null) { + document.body.appendChild(elem); + } else { + document.getElementById("app-mount")!.prepend(elem); + } + const settingsCssPath = path.join(__dirname, "../", "/content/css/inAppSettings.css"); + addStyle(fs.readFileSync(settingsCssPath, "utf8")); + document.getElementById("closeSettings")!.addEventListener("click", () => { + removeSettings(); + }); + const webview = document.querySelector("webview") as WebviewTag; + webview.addEventListener("console-message", (e) => { + console.log("Settings page logged a message:", e.message); + }); +}); diff --git a/src/settings/main.ts b/src/settings/main.ts index fe584e2..53c7026 100644 --- a/src/settings/main.ts +++ b/src/settings/main.ts @@ -1,24 +1,10 @@ -import {BrowserWindow, app, clipboard, ipcMain, shell} from "electron"; -import { - Settings, - getConfig, - getConfigLocation, - getDisplayVersion, - getLangName, - getVersion, - setConfigBulk, - sleep -} from "../utils"; +import {BrowserWindow, app, ipcMain, shell} from "electron"; +import {getDisplayVersion} from "../utils"; import path from "path"; -import os from "os"; import fs from "fs"; let settingsWindow: BrowserWindow; let instance = 0; -//checkForDataFolder(); -const userDataPath = app.getPath("userData"); -const storagePath = path.join(userDataPath, "/storage/"); -const themesPath = path.join(userDataPath, "/themes/"); -const pluginsPath = path.join(userDataPath, "/plugins/"); + export function createSettingsWindow(): void { console.log("Creating a settings window."); instance += 1; @@ -77,51 +63,12 @@ export function createSettingsWindow(): void { } }); }); - ipcMain.on("saveSettings", (_event, args: Settings) => { - console.log(args); - setConfigBulk(args); - }); - ipcMain.on("openStorageFolder", async () => { - shell.showItemInFolder(storagePath); - await sleep(1000); - }); - ipcMain.on("openThemesFolder", async () => { - shell.showItemInFolder(themesPath); - await sleep(1000); - }); - ipcMain.on("openPluginsFolder", async () => { - shell.showItemInFolder(pluginsPath); - await sleep(1000); - }); - ipcMain.on("openCrashesFolder", async () => { - shell.showItemInFolder(path.join(app.getPath("temp"), `${app.getName()} Crashes`)); - await sleep(1000); - }); - ipcMain.on("getLangName", async (event) => { - event.returnValue = await getLangName(); - }); - ipcMain.on("crash", async () => { - process.crash(); - }); - ipcMain.handle("getSetting", (_event, toGet: keyof Settings) => { - return getConfig(toGet); - }); - ipcMain.on("copyDebugInfo", () => { - let settingsFileContent = fs.readFileSync(getConfigLocation(), "utf-8"); - clipboard.writeText( - `**OS:** ${os.platform()} ${os.version()}\n**Architecture:** ${os.arch()}\n**ArmCord version:** ${getVersion()}\n**Electron version:** ${ - process.versions.electron - }\n\`${settingsFileContent}\`` - ); - }); settingsWindow.webContents.setWindowOpenHandler(({url}) => { shell.openExternal(url); return {action: "deny"}; }); settingsLoadPage(); settingsWindow.on("close", () => { - ipcMain.removeHandler("getSetting"); - ipcMain.removeAllListeners("saveSettings"); instance = 0; }); } diff --git a/src/settings/preload.ts b/src/settings/preload.ts index f58fd55..d1cb92b 100644 --- a/src/settings/preload.ts +++ b/src/settings/preload.ts @@ -1,5 +1,5 @@ import {contextBridge, ipcRenderer} from "electron"; -import {addStyle} from "../utils"; +//import {addStyle} from "../utils"; console.log("ArmCord Settings"); console.log(process.platform); contextBridge.exposeInMainWorld("settings", { @@ -18,5 +18,5 @@ contextBridge.exposeInMainWorld("settings", { }); ipcRenderer.on("themeLoader", (_event, message) => { - addStyle(message); + //addStyle(message); }); diff --git a/src/window.ts b/src/window.ts index b8c5a05..77c914c 100644 --- a/src/window.ts +++ b/src/window.ts @@ -313,6 +313,7 @@ export async function createCustomWindow(): Promise { backgroundColor: "#202225", autoHideMenuBar: true, webPreferences: { + webviewTag: true, sandbox: false, preload: path.join(__dirname, "preload/preload.js"), spellcheck: await getConfig("spellcheck") @@ -334,6 +335,7 @@ export async function createNativeWindow(): Promise { backgroundColor: "#202225", autoHideMenuBar: true, webPreferences: { + webviewTag: true, sandbox: false, preload: path.join(__dirname, "preload/preload.js"), spellcheck: await getConfig("spellcheck") @@ -356,6 +358,7 @@ export async function createTransparentWindow(): Promise { autoHideMenuBar: true, webPreferences: { sandbox: false, + webviewTag: true, preload: path.join(__dirname, "preload/preload.js"), spellcheck: await getConfig("spellcheck") }