/// #if !BROWSER 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 {genLangOptions, genOptions} from "../util/genOptions"; import {openSnippets} from "./util/snippets"; import {loadAssets} from "../util/assets"; import {resetFloatDockSize} from "../layout/dock/util"; import {confirmDialog} from "../dialog/confirmDialog"; import {useShell} from "../util/pathName"; export const appearance = { element: undefined as Element, genHTML: () => { return `
${window.siyuan.languages.appearance4}
${window.siyuan.languages.appearance5}
${window.siyuan.languages.theme}
${window.siyuan.languages.theme11}
${window.siyuan.languages.theme12}
${window.siyuan.languages.icon}
${window.siyuan.languages.theme2}
${window.siyuan.languages.appearance1}
${window.siyuan.languages.appearance2}
${window.siyuan.languages.appearance3}
${window.siyuan.languages.language}
${window.siyuan.languages.language1}
${window.siyuan.languages.customEmoji}
${window.siyuan.languages.customEmojiTip}
${window.siyuan.languages.resetLayout}
${window.siyuan.languages.appearance6}
${window.siyuan.languages.codeSnippet}
${window.siyuan.languages.visitCommunityShare}
${window.siyuan.languages.codeSnippetTip}
`; }, _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); const OSTheme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"; fetchPost("/api/setting/setAppearance", { icon: (appearance.element.querySelector("#icon") as HTMLSelectElement).value, mode: modeElementValue === 2 ? (OSTheme === "light" ? 0 : 1) : 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, }, async response => { if (window.siyuan.config.appearance.themeJS) { if (response.data.mode !== window.siyuan.config.appearance.mode || (response.data.mode === window.siyuan.config.appearance.mode && ( (response.data.mode === 0 && window.siyuan.config.appearance.themeLight !== response.data.themeLight) || (response.data.mode === 1 && window.siyuan.config.appearance.themeDark !== response.data.themeDark)) ) ) { if (window.destroyTheme) { try { await window.destroyTheme(); window.destroyTheme = undefined; document.getElementById("themeScript").remove(); } catch (e) { console.error("destroyTheme error: " + e); } } else { exportLayout({ errorExit: false, cb() { window.location.reload(); }, }); 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", () => { confirmDialog("⚠️ " + window.siyuan.languages.reset, window.siyuan.languages.appearance6, () => { resetLayout(); }); }); /// #if !BROWSER appearance.element.querySelector("#appearanceOpenIcon").addEventListener("click", () => { useShell("openPath", path.join(window.siyuan.config.system.confDir, "appearance", "icons")); }); appearance.element.querySelector("#appearanceOpenTheme").addEventListener("click", () => { useShell("openPath", path.join(window.siyuan.config.system.confDir, "appearance", "themes")); }); appearance.element.querySelector("#appearanceOpenEmoji").addEventListener("click", () => { useShell("openPath", path.join(window.siyuan.config.system.dataDir, "emojis")); }); /// #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: Config.IAppearance) { if (data.lang !== window.siyuan.config.appearance.lang) { exportLayout({ cb() { window.location.reload(); }, 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")}`); } };