/// #if !BROWSER import {ipcRenderer, 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 {openColorPicker} from "./util/colorPicker"; import {loadAssets} from "../util/assets"; 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, customCSS: (appearance.element.querySelector("#appearanceCustom") as HTMLInputElement).checked, closeButtonBehavior: (appearance.element.querySelector("#closeButtonBehavior") as HTMLInputElement).checked ? 1 : 0, nativeEmoji: (appearance.element.querySelector("#nativeEmoji") as HTMLInputElement).checked, hideStatusBar: (appearance.element.querySelector("#hideStatusBar") as HTMLInputElement).checked, }, response => { if (( window.siyuan.config.appearance.themeJS && !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 ) ) || (response.data.modeOS && !window.siyuan.config.appearance.modeOS) ) { exportLayout(true); return; } appearance.onSetappearance(response.data); if (response.data.hideStatusBar) { document.getElementById("status").classList.add("fn__none"); } else { document.getElementById("status").classList.remove("fn__none"); } }); }, bindEvent: () => { appearance.element.querySelector("#codeSnippet").addEventListener("click", () => { openSnippets(); }); appearance.element.querySelector("#appearanceCustomSetting").addEventListener("click", () => { openColorPicker(); }); 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(true); }); /// #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, needLoadAsset = true) { if (data.lang !== window.siyuan.config.appearance.lang || data.nativeEmoji !== window.siyuan.config.appearance.nativeEmoji) { exportLayout(true); 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); } } /// #if !BROWSER ipcRenderer.send(Constants.SIYUAN_CONFIG_THEME, data.modeOS ? "system" : (data.mode === 1 ? "dark" : "light")); ipcRenderer.send(Constants.SIYUAN_CONFIG_CLOSE, data.closeButtonBehavior); /// #endif if (needLoadAsset) { loadAssets(data); } document.querySelector("#barMode use").setAttribute("xlink:href", `#icon${window.siyuan.config.appearance.modeOS ? "Mode" : (window.siyuan.config.appearance.mode === 0 ? "Light" : "Dark")}`); } };