/// #if !BROWSER import {shell} from "electron"; import * as path from "path"; /// #endif import {Constants} from "../constants"; import {exportLayout, resetLayout} from "../layout/util"; import {isBrowser} from "../util/functions"; import {fetchPost} from "../util/fetch"; import {genOptions} from "../util/genOptions"; import {openSnippets} from "./util/snippets"; import {loadAssets} from "../util/assets"; import {resetFloatDockSize} from "../layout/dock/util"; export const appearance = { element: undefined as Element, genHTML: () => { return `
${window.siyuan.languages.theme}
${window.siyuan.languages.appearance9}
${window.siyuan.languages.appearance1}
`; }, _send: () => { const themeLight = (appearance.element.querySelector("#themeLight") as HTMLSelectElement).value; const themeDark = (appearance.element.querySelector("#themeDark") as HTMLSelectElement).value; const modeElementValue = parseInt((appearance.element.querySelector("#mode") as HTMLSelectElement).value); fetchPost("/api/setting/setAppearance", { icon: (appearance.element.querySelector("#icon") as HTMLSelectElement).value, mode: modeElementValue === 2 ? window.siyuan.config.appearance.mode : modeElementValue, modeOS: modeElementValue === 2, codeBlockThemeDark: (appearance.element.querySelector("#codeBlockThemeDark") as HTMLSelectElement).value, codeBlockThemeLight: (appearance.element.querySelector("#codeBlockThemeLight") as HTMLSelectElement).value, themeDark, themeLight, darkThemes: window.siyuan.config.appearance.darkThemes, lightThemes: window.siyuan.config.appearance.lightThemes, icons: window.siyuan.config.appearance.icons, lang: (appearance.element.querySelector("#lang") as HTMLSelectElement).value, closeButtonBehavior: (appearance.element.querySelector("#closeButtonBehavior") as HTMLInputElement).checked ? 1 : 0, hideStatusBar: (appearance.element.querySelector("#hideStatusBar") as HTMLInputElement).checked, }, response => { if (window.siyuan.config.appearance.themeJS) { if (!response.data.modeOS && ( response.data.mode !== window.siyuan.config.appearance.mode || window.siyuan.config.appearance.themeLight !== response.data.themeLight || window.siyuan.config.appearance.themeDark !== response.data.themeDark )) { exportLayout({ reload: true, onlyData: false, errorExit: false, }); return; } const OSTheme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"; if (response.data.modeOS && ( (response.data.mode === 1 && OSTheme === "light") || (response.data.mode === 0 && OSTheme === "dark") )) { exportLayout({ reload: true, onlyData: false, errorExit: false, }); return; } } appearance.onSetappearance(response.data); if (response.data.hideStatusBar) { document.getElementById("status").classList.add("fn__none"); } else { document.getElementById("status").classList.remove("fn__none"); } resetFloatDockSize(); }); }, bindEvent: () => { appearance.element.querySelector("#codeSnippet").addEventListener("click", () => { openSnippets(); }); appearance.element.querySelector("#resetLayout").addEventListener("click", () => { resetLayout(); }); /// #if !BROWSER appearance.element.querySelector("#appearanceOpenIcon").addEventListener("click", () => { shell.openPath(path.join(window.siyuan.config.system.confDir, "appearance", "icons")); }); appearance.element.querySelector("#appearanceOpenTheme").addEventListener("click", () => { shell.openPath(path.join(window.siyuan.config.system.confDir, "appearance", "themes")); }); appearance.element.querySelector("#appearanceOpenEmoji").addEventListener("click", () => { shell.openPath(path.join(window.siyuan.config.system.dataDir, "emojis")); }); appearance.element.querySelector("#appearanceRefresh").addEventListener("click", () => { exportLayout({ reload: true, onlyData: false, errorExit: false, }); }); /// #endif appearance.element.querySelectorAll("select").forEach(item => { item.addEventListener("change", () => { appearance._send(); }); }); appearance.element.querySelectorAll(".b3-switch").forEach((item) => { item.addEventListener("change", () => { appearance._send(); }); }); }, onSetappearance(data: IAppearance) { if (data.lang !== window.siyuan.config.appearance.lang) { exportLayout({ reload: true, onlyData: false, errorExit: false, }); return; } window.siyuan.config.appearance = data; if (appearance.element) { const modeElement = appearance.element.querySelector("#mode") as HTMLSelectElement; if (modeElement) { if (data.modeOS) { modeElement.value = "2"; } else { modeElement.value = data.mode === 0 ? "0" : "1"; } } const themeLightElement = appearance.element.querySelector("#themeLight") as HTMLSelectElement; if (themeLightElement) { themeLightElement.innerHTML = genOptions(window.siyuan.config.appearance.lightThemes, window.siyuan.config.appearance.themeLight); } const themeDarkElement = appearance.element.querySelector("#themeDark") as HTMLSelectElement; if (themeDarkElement) { themeDarkElement.innerHTML = genOptions(window.siyuan.config.appearance.darkThemes, window.siyuan.config.appearance.themeDark); } const iconElement = appearance.element.querySelector("#icon") as HTMLSelectElement; if (iconElement) { iconElement.innerHTML = genOptions(window.siyuan.config.appearance.icons, window.siyuan.config.appearance.icon); } } loadAssets(data); document.querySelector("#barMode use")?.setAttribute("xlink:href", `#icon${window.siyuan.config.appearance.modeOS ? "Mode" : (window.siyuan.config.appearance.mode === 0 ? "Light" : "Dark")}`); } };