Hirse/brackets-outline-list

View on GitHub
src/Preferences.js

Summary

Maintainability
B
6 hrs
Test Coverage
define(function Preferences(require, exports, module) {
    "use strict";

    /* beautify preserve:start *//* eslint-disable no-multi-spaces */
    var PreferencesManager = brackets.getModule("preferences/PreferencesManager");

    var Strings            = require("../strings");
    /* eslint-enable no-multi-spaces *//* beautify preserve:end */

    /** @const {string} Prefix for preferences. */
    var PREFIX = "hirse.outline";

    var prefs = PreferencesManager.getExtensionPrefs(PREFIX);

    var defaultPreferences = [
        {
            id: "enabled",
            type: "boolean",
            value: false,
            options: {
                name: Strings.PREF_ENABLED_NAME,
                description: Strings.PREF_ENABLED_DESC
            }
        }, {
            id: "unnamed",
            type: "boolean",
            value: true,
            options: {
                name: Strings.PREF_UNNAMED_NAME,
                description: Strings.PREF_UNNAMED_DESC
            },
            inContextMenu: true
        }, {
            id: "args",
            type: "boolean",
            value: true,
            options: {
                name: Strings.PREF_ARGS_NAME,
                description: Strings.PREF_ARGS_DESC
            },
            inContextMenu: true
        }, {
            id: "sidebar",
            type: "boolean",
            value: true,
            options: {
                name: Strings.PREF_SIDEBAR_NAME,
                description: Strings.PREF_SIDEBAR_DESC
            }
        }, {
            id: "sort",
            type: "boolean",
            value: false,
            options: {
                name: Strings.PREF_SORT_NAME,
                description: Strings.PREF_SORT_DESC
            },
            inContextMenu: true
        }, {
            id: "indent",
            type: "boolean",
            value: true,
            options: {
                name: Strings.PREF_INDENT_NAME,
                description: Strings.PREF_INDENT_DESC
            },
            inContextMenu: true
        }, {
            id: "autohide",
            type: "boolean",
            value: false,
            options: {
                name: Strings.PREF_AUTOHIDE_NAME,
                description: Strings.PREF_AUTOHIDE_DESC
            }
        }, {
            id: "autohideDelay",
            type: "number",
            value: 300,
            options: {
                name: Strings.PREF_AUTOHIDE_DELAY_NAME,
                description: Strings.PREF_AUTOHIDE_DELAY_DESC
            }
        }
    ];

    defaultPreferences.forEach(function (preference) {
        prefs.definePreference(preference.id, preference.type, preference.value, preference.options);
    });
    prefs.save();

    /**
     * Toggle a preference by id and return the new value.
     * Only works with boolean preferences.
     * @param   {string}  id Preference id without prefix.
     * @returns {boolean} New preference value.
     */
    function togglePref(id) {
        var state = prefs.get(id);
        prefs.set(id, !state);
        prefs.save();
        return !state;
    }

    /**
     * Get the settings for the Configure menu.
     * @returns {object[]} List of preference objects.
     */
    function getSettings() {
        return defaultPreferences.filter(function (defaultPreference) {
            return defaultPreference.inContextMenu;
        }).map(function (defaultPreference) {
            return {
                id: defaultPreference.id,
                value: prefs.get(defaultPreference.id)
            };
        });
    }

    /**
     * Get a preference by id.
     * @param   {string} id Preference id without prefix.
     * @returns {any}    Preference value.
     */
    function get(id) {
        return prefs.get(id);
    }

    /**
     * Set a preference by id.
     * @param   {string} id Preference id without prefix.
     * @param   {any} value New value.
     */
    function set(id, value) {
        prefs.set(id, value);
    }

    /**
     * Set up a listener for the change event on a preference.
     * @param {string}   id      Preference Id.
     * @param {function} handler Handler function.
     */
    function onChange(id, handler) {
        prefs.on("change", id, handler);
    }

    module.exports = {
        get: get,
        set: set,
        getSettings: getSettings,
        togglePref: togglePref,
        onChange: onChange
    };
});