import server from "../../services/server.js"; import utils from "../../services/utils.js"; import appContext from "../../services/app_context.js"; import libraryLoader from "../../services/library_loader.js"; const TPL = `

Settings on this options tab are saved automatically after each change.

Zooming can be controlled with CTRL+- and CTRL+= shortcuts as well.

Font sizes

%
%
%

Note that tree and detail font sizing is relative to the main font size setting.

`; export default class ApperanceOptions { constructor() { $("#options-appearance").html(TPL); this.$themeSelect = $("#theme-select"); this.$zoomFactorSelect = $("#zoom-factor-select"); this.$nativeTitleBarSelect = $("#native-title-bar-select"); this.$headingStyle = $("#heading-style"); this.$mainFontSize = $("#main-font-size"); this.$treeFontSize = $("#tree-font-size"); this.$detailFontSize = $("#detail-font-size"); this.$body = $("body"); this.$themeSelect.on('change', () => { const newTheme = this.$themeSelect.val(); this.toggleBodyClass("theme-", newTheme); const noteId = $(this).find(":selected").attr("data-note-id"); if (noteId) { // make sure the CSS is loaded // if the CSS has been loaded and then updated then the changes won't take effect though libraryLoader.requireCss(`api/notes/download/${noteId}`); } server.put('options/theme/' + newTheme); }); this.$zoomFactorSelect.on('change', () => { appContext.triggerCommand('setZoomFactorAndSave', {zoomFactor: this.$zoomFactorSelect.val()}); }); this.$nativeTitleBarSelect.on('change', () => { const nativeTitleBarVisible = this.$nativeTitleBarSelect.val() === 'show' ? 'true' : 'false'; server.put('options/nativeTitleBarVisible/' + nativeTitleBarVisible); }); this.$headingStyle.on('change', () => { const newHeadingStyle = this.$headingStyle.val(); this.toggleBodyClass("heading-style-", newHeadingStyle); server.put('options/headingStyle/' + newHeadingStyle); }); this.$mainFontSize.on('change', async () => { await server.put('options/mainFontSize/' + this.$mainFontSize.val()); this.applyFontSizes(); }); this.$treeFontSize.on('change', async () => { await server.put('options/treeFontSize/' + this.$treeFontSize.val()); this.applyFontSizes(); }); this.$detailFontSize.on('change', async () => { await server.put('options/detailFontSize/' + this.$detailFontSize.val()); this.applyFontSizes(); }); } toggleBodyClass(prefix, value) { for (const clazz of Array.from(this.$body[0].classList)) { // create copy to safely iterate over while removing classes if (clazz.startsWith(prefix)) { this.$body.removeClass(clazz); } } this.$body.addClass(prefix + value); } async optionsLoaded(options) { const themes = [ { val: 'white', title: 'White' }, { val: 'dark', title: 'Dark' }, { val: 'black', title: 'Black' } ].concat(await server.get('options/user-themes')); this.$themeSelect.empty(); for (const theme of themes) { this.$themeSelect.append($("