Add comments

This commit is contained in:
Samuel Elliott 2018-03-04 01:33:06 +00:00
parent 00d909f16c
commit 1dffb1f40b
No known key found for this signature in database
GPG Key ID: 8420C7CDE43DC4D6
13 changed files with 404 additions and 21 deletions

View File

@ -196,8 +196,8 @@ export default class {
userConfig.config = readUserConfig.config; userConfig.config = readUserConfig.config;
userConfig.data = readUserConfig.data || {}; userConfig.data = readUserConfig.data || {};
} catch (err) { /*We don't care if this fails it either means that user config doesn't exist or there's something wrong with it so we revert to default config*/ } catch (err) { /*We don't care if this fails it either means that user config doesn't exist or there's something wrong with it so we revert to default config*/
console.info(`Failed reading config for ${this.contentType} ${readConfig.info.name} in ${dirName}`); Logger.info(this.moduleName, `Failed reading config for ${this.contentType} ${readConfig.info.name} in ${dirName}`);
console.error(err); Logger.err(this.moduleName, err);
} }
userConfig.config = defaultConfig.clone({ settings: userConfig.config }); userConfig.config = defaultConfig.clone({ settings: userConfig.config });
@ -222,7 +222,7 @@ export default class {
}; };
const content = await this.loadContent(paths, configs, readConfig.info, readConfig.main, readConfig.dependencies, readConfig.permissions); const content = await this.loadContent(paths, configs, readConfig.info, readConfig.main, readConfig.dependencies, readConfig.permissions);
if (!content) return null; if (!content) return undefined;
if (!reload && this.getContentById(content.id)) if (!reload && this.getContentById(content.id))
throw {message: `A ${this.contentType} with the ID ${content.id} already exists.`}; throw {message: `A ${this.contentType} with the ID ${content.id} already exists.`};

View File

@ -38,6 +38,9 @@ export default class SettingsCategory {
} }
} }
/**
* Category ID
*/
get id() { get id() {
return this.args.id || this.args.category; return this.args.id || this.args.category;
} }
@ -46,6 +49,9 @@ export default class SettingsCategory {
return this.id; return this.id;
} }
/**
* Category name
*/
get name() { get name() {
return this.args.category_name; return this.args.category_name;
} }
@ -54,34 +60,59 @@ export default class SettingsCategory {
return this.name; return this.name;
} }
/**
* Category type
* Currently either "drawer", "static", or undefined.
*/
get type() { get type() {
return this.args.type; return this.args.type;
} }
/**
* An array of settings in this category.
*/
get settings() { get settings() {
return this.args.settings || []; return this.args.settings || [];
} }
/**
* Whether any setting in this category has been changed.
*/
get changed() { get changed() {
if (this.settings.find(setting => setting.changed)) return true; if (this.settings.find(setting => setting.changed)) return true;
return false; return false;
} }
/**
* Returns the first setting where calling {function} returns true.
* @param {Function} function A function to call to filter setting
* @return {Setting}
*/
find(f) { find(f) {
return this.settings.find(f); return this.settings.find(f);
} }
/**
* Returns all settings where calling {function} returns true.
* @param {Function} function A function to call to filter settings
* @return {Array} An array of matching Setting objects
*/
findSettings(f) { findSettings(f) {
return this.settings.filter(f); return this.settings.filter(f);
} }
/**
* Returns the setting with the ID {id}.
* @param {String} id The ID of the setting to look for
* @return {Setting}
*/
getSetting(id) { getSetting(id) {
return this.findSetting(setting => setting.id === id); return this.findSetting(setting => setting.id === id);
} }
/** /**
* Merges a category into this category without emitting events (and therefore synchronously). * Merges a category into this category without emitting events (and therefore synchronously).
* Only exists for use by SettingsSet. * This only exists for use by SettingsSet.
*/ */
_merge(newCategory) { _merge(newCategory) {
let updatedSettings = []; let updatedSettings = [];
@ -105,6 +136,11 @@ export default class SettingsCategory {
return updatedSettings; return updatedSettings;
} }
/**
* Merges another category into this category.
* @param {SettingsCategory} newCategory The category to merge into this category
* @return {Promise}
*/
async merge(newCategory, emit_multi = true) { async merge(newCategory, emit_multi = true) {
let updatedSettings = []; let updatedSettings = [];
@ -132,12 +168,19 @@ export default class SettingsCategory {
return updatedSettings; return updatedSettings;
} }
/**
* Marks all settings in this set as saved (not changed).
*/
setSaved() { setSaved() {
for (let setting of this.settings) { for (let setting of this.settings) {
setting.setSaved(); setting.setSaved();
} }
} }
/**
* Returns an object that can be stored as JSON and later merged back into a category with settingscategory.merge.
* @return {Object}
*/
strip() { strip() {
return { return {
category: this.category, category: this.category,
@ -145,6 +188,11 @@ export default class SettingsCategory {
}; };
} }
/**
* Returns a copy of this category that can be changed and then merged back into a set with settingscategory.merge.
* @param {SettingsCategory} ...merge A set to merge into the new set
* @return {SettingsCategory}
*/
clone(...merge) { clone(...merge) {
return new SettingsCategory({ return new SettingsCategory({
id: this.id, id: this.id,

View File

@ -42,22 +42,42 @@ export default class SettingsSet {
} }
} }
/**
* Set ID
*/
get id() { get id() {
return this.args.id; return this.args.id;
} }
/**
* Set name
*/
get text() { get text() {
return this.args.text; return this.args.text;
} }
/**
* Text to be displayed with the set.
*/
get headertext() { get headertext() {
return this.args.headertext || `${this.text} Settings`; return this.args.headertext || `${this.text} Settings`;
} }
set headertext(headertext) {
this.args.headertext = headertext;
}
/**
* Whether this set should be displayed.
* Currently only used in the settings menu.
*/
get hidden() { get hidden() {
return this.args.hidden || false; return this.args.hidden || false;
} }
/**
* An array of SettingsCategory objects in this set.
*/
get categories() { get categories() {
return this.args.categories || this.args.settings || []; return this.args.categories || this.args.settings || [];
} }
@ -66,27 +86,53 @@ export default class SettingsSet {
return this.categories; return this.categories;
} }
/**
* An array of SettingsScheme objects that can be used in this set.
*/
get schemes() { get schemes() {
return this.args.schemes || []; return this.args.schemes || [];
} }
/**
* Whether any setting in this set has been changed.
*/
get changed() { get changed() {
if (this.categories.find(category => category.changed)) return true; if (this.categories.find(category => category.changed)) return true;
return false; return false;
} }
/**
* Returns the first category where calling {function} returns true.
* @param {Function} function A function to call to filter categories
* @return {SettingsCategory}
*/
find(f) { find(f) {
return this.categories.find(f); return this.categories.find(f);
} }
/**
* Returns all categories where calling {function} returns true.
* @param {Function} function A function to call to filter categories
* @return {Array} An array of matching SettingsCategory objects
*/
findCategories(f) { findCategories(f) {
return this.categories.filter(f); return this.categories.filter(f);
} }
/**
* Returns the category with the ID {id}.
* @param {String} id The ID of the category to look for
* @return {SettingsCategory}
*/
getCategory(id) { getCategory(id) {
return this.find(category => category.id === id); return this.find(category => category.id === id);
} }
/**
* Returns the first setting where calling {function} returns true.
* @param {Function} function A function to call to filter settings
* @return {Setting}
*/
findSetting(f) { findSetting(f) {
for (let category of this.categories) { for (let category of this.categories) {
const setting = category.findSetting(f); const setting = category.findSetting(f);
@ -94,10 +140,21 @@ export default class SettingsSet {
} }
} }
/**
* Returns all settings where calling {function} returns true.
* @param {Function} function A function to call to filter settings
* @return {Array} An array of matching Setting objects
*/
findSettings(f) { findSettings(f) {
return this.findSettingsInCategory(() => true, f); return this.findSettingsInCategory(() => true, f);
} }
/**
* Returns the first setting where calling {function} returns true.
* @param {Function} categoryFunction A function to call to filter categories
* @param {Function} function A function to call to filter settings
* @return {Array} An array of matching Setting objects
*/
findSettingInCategory(cf, f) { findSettingInCategory(cf, f) {
for (let category of this.categories.filter(cf)) { for (let category of this.categories.filter(cf)) {
const setting = category.find(f); const setting = category.find(f);
@ -105,6 +162,12 @@ export default class SettingsSet {
} }
} }
/**
* Returns all settings where calling {function} returns true.
* @param {Function} categoryFunction A function to call to filter categories
* @param {Function} function A function to call to filter settings
* @return {Array} An array of matching Setting objects
*/
findSettingsInCategory(cf, f) { findSettingsInCategory(cf, f) {
let settings = []; let settings = [];
for (let category of this.categories.filter(cf)) { for (let category of this.categories.filter(cf)) {
@ -113,23 +176,41 @@ export default class SettingsSet {
return settings; return settings;
} }
/**
* Returns the setting with the ID {id}.
* @param {String} categoryid The ID of the category to look in (optional)
* @param {String} id The ID of the setting to look for
* @return {Setting}
*/
getSetting(id, sid) { getSetting(id, sid) {
if (sid) return this.findSettingInCategory(category => category.id === id, setting => setting.id === sid); if (sid) return this.findSettingInCategory(category => category.id === id, setting => setting.id === sid);
return this.findSetting(setting => setting.id === id); return this.findSetting(setting => setting.id === id);
} }
/**
* Returns the value of the setting with the ID {id}.
* @param {String} categoryid The ID of the category to look in (optional)
* @param {String} id The ID of the setting to look for
* @return {SettingsCategory}
*/
get(cid, sid) { get(cid, sid) {
const setting = this.getSetting(cid, sid); const setting = this.getSetting(cid, sid);
return setting ? setting.value : undefined; return setting ? setting.value : undefined;
} }
showModal(headertext) { /**
Modals.settings(this, headertext ? headertext : this.headertext); * Opens this set in a modal.
* @param {String} headertext Text to be displayed in the modal header
* @param {Object} options Additional options to pass to Modals.settings
* @return {Modal}
*/
showModal(headertext, options) {
return Modals.settings(this, headertext ? headertext : this.headertext, options);
} }
/** /**
* Merges a set into this set without emitting events (and therefore synchronously). * Merges a set into this set without emitting events (and therefore synchronously).
* Only exists for use by the constructor. * This only exists for use by the constructor.
*/ */
_merge(newSet, emit_multi = true) { _merge(newSet, emit_multi = true) {
let updatedSettings = []; let updatedSettings = [];
@ -157,6 +238,11 @@ export default class SettingsSet {
return updatedSettings; return updatedSettings;
} }
/**
* Merges another set into this set.
* @param {SettingsSet} newSet The set to merge into this set
* @return {Promise}
*/
async merge(newSet, emit_multi = true) { async merge(newSet, emit_multi = true) {
let updatedSettings = []; let updatedSettings = [];
// const categories = newSet instanceof Array ? newSet : newSet.settings; // const categories = newSet instanceof Array ? newSet : newSet.settings;
@ -188,12 +274,19 @@ export default class SettingsSet {
return updatedSettings; return updatedSettings;
} }
/**
* Marks all settings in this set as saved (not changed).
*/
setSaved() { setSaved() {
for (let category of this.categories) { for (let category of this.categories) {
category.setSaved(); category.setSaved();
} }
} }
/**
* Returns an object that can be stored as JSON and later merged back into a set with settingsset.merge.
* @return {Object}
*/
strip() { strip() {
const stripped = {}; const stripped = {};
if (this.id) stripped.id = this.id; if (this.id) stripped.id = this.id;
@ -201,6 +294,11 @@ export default class SettingsSet {
return stripped; return stripped;
} }
/**
* Returns a copy of this set that can be changed and then merged back into a set with settingsset.merge.
* @param {SettingsSet} ...merge A set to merge into the new set
* @return {SettingsSet}
*/
clone(...merge) { clone(...merge) {
return new SettingsSet({ return new SettingsSet({
id: this.id, id: this.id,

View File

@ -27,10 +27,16 @@ export default class ArraySetting extends Setting {
this.updateValue(false, false); this.updateValue(false, false);
} }
/**
* The value to use when the setting doesn't have a value.
*/
get defaultValue() { get defaultValue() {
return []; return [];
} }
/**
* An array of sets currently in this array setting.
*/
get items() { get items() {
return this.args.items || []; return this.args.items || [];
} }
@ -40,47 +46,90 @@ export default class ArraySetting extends Setting {
this.updateValue(); this.updateValue();
} }
/**
* Whether the setting should take the full width of the settings panel.
* This is always false for array settings.
*/
get fullwidth() { get fullwidth() {
return false; return false;
} }
get settings() { /**
return this.args.settings || []; * An array of SettingsCategory objects that each set in this setting should have.
*/
get categories() {
return this.args.categories || this.args.settings || [];
} }
get settings() {
return this.categories;
}
/**
* An array of SettingsScheme objects that can be used in this array's sets.
*/
get schemes() { get schemes() {
return this.args.schemes || []; return this.args.schemes || [];
} }
/**
* Whether to display this array setting's sets inline instead of opening them in a modal.
*/
get inline() { get inline() {
return this.args.inline || false; return this.args.inline || false;
} }
/**
* Whether to allow opening this array setting's sets in a modal.
* This is always true when inline is false.
*/
get allow_external() { get allow_external() {
return this.args.allow_external || !this.inline; return this.args.allow_external || !this.inline;
} }
/**
* The minimum amount of sets the user may create.
* This only restricts deleting sets when there is less or equal sets than this, and does not ensure that this number of items actually exists.
*/
get min() { get min() {
return this.args.min || 0; return this.args.min || 0;
} }
/**
* The maximum amount of sets the user may create.
*/
get max() { get max() {
return this.args.max || null; return this.args.max || null;
} }
/**
* Adds a new set to this array setting.
* This ignores the maximum value.
* @param {SettingsSet} item Values to merge into the new set (optional)
* @return {SettingsSet} The new set
*/
addItem(item) { addItem(item) {
const newItem = this.createItem(item); const newItem = this.createItem(item);
this.args.items.push(newItem); this.args.items.push(newItem);
// this.items = this.items;
this.updateValue(); this.updateValue();
return newItem; return newItem;
} }
/**
* Removes a set from this array setting.
* This ignores the minimum value.
* @param {SettingsSet} item The set to remove
*/
removeItem(item) { removeItem(item) {
this.args.items = this.items.filter(i => i !== item); this.args.items = this.items.filter(i => i !== item);
this.updateValue(); this.updateValue();
} }
/**
* Creates a new set for this array setting.
* @param {SettingsSet} item Values to merge into the new set (optional)
* @return {SettingsSet} The new set
*/
createItem(item) { createItem(item) {
const set = new SettingsSet({ const set = new SettingsSet({
settings: Utils.deepclone(this.settings), settings: Utils.deepclone(this.settings),
@ -93,10 +142,26 @@ export default class ArraySetting extends Setting {
return set; return set;
} }
/**
* Sets the value of this setting.
* This is only intended for use by settings.
* @param {SettingsSetting} value The new value of this setting
* @param {Boolean} emit_multi Whether to emit a SettingsUpdatedEvent
* @param {Boolean} emit Whether to emit a SettingUpdatedEvent
* @return {Promise}
*/
setValue(value, emit_multi = true, emit = true) { setValue(value, emit_multi = true, emit = true) {
this.items = value; this.args.items = value ? value.map(item => this.createItem(item)) : [];
this.updateValue(emit_multi, emit);
} }
/**
* Updates the value of this array setting.
* This only exists for use by array settings.
* @param {Boolean} emit_multi Whether to emit a SettingsUpdatedEvent
* @param {Boolean} emit Whether to emit a SettingUpdatedEvent
* @return {Promise}
*/
updateValue(emit_multi = true, emit = true) { updateValue(emit_multi = true, emit = true) {
return this.__proto__.__proto__.setValue.call(this, this.items.map(item => { return this.__proto__.__proto__.setValue.call(this, this.items.map(item => {
if (!item) return; if (!item) return;
@ -105,16 +170,25 @@ export default class ArraySetting extends Setting {
}), emit_multi, emit); }), emit_multi, emit);
} }
/**
* Sets the path of the plugin/theme this setting is part of.
* This is passed to this array setting's settings.
* @param {String} contentPath The plugin/theme's directory path
*/
setContentPath(contentPath) { setContentPath(contentPath) {
this.args.path = contentPath; this.args.path = contentPath;
for (let category of this.settings) { for (let category of this.categories) {
for (let setting of category.settings) { for (let setting of category.settings) {
setting.setContentPath(contentPath); setting.setContentPath(contentPath);
} }
} }
} }
/**
* Returns a representation of this setting's value in SCSS.
* @return {Promise}
*/
async toSCSS() { async toSCSS() {
const maps = []; const maps = [];
for (let item of this.items) for (let item of this.items)
@ -124,8 +198,4 @@ export default class ArraySetting extends Setting {
return maps.length ? maps.join(', ') + ',' : '()'; return maps.length ? maps.join(', ') + ',' : '()';
} }
// clone() {
// return new ArraySetting(Utils.deepclone(this.args));
// }
} }

View File

@ -30,14 +30,24 @@ export default class Setting {
this.changed = !Utils.compare(this.args.value, this.args.saved_value); this.changed = !Utils.compare(this.args.value, this.args.saved_value);
} }
/**
* Setting ID
*/
get id() { get id() {
return this.args.id; return this.args.id;
} }
/**
* Setting type
* This defines how this class will be extended.
*/
get type() { get type() {
return this.args.type; return this.args.type;
} }
/**
* The current value.
*/
get value() { get value() {
return this.args.value; return this.args.value;
} }
@ -46,33 +56,54 @@ export default class Setting {
this.setValue(value); this.setValue(value);
} }
/**
* The value to use when the setting doesn't have a value.
*/
get defaultValue() { get defaultValue() {
return undefined; return undefined;
} }
/**
* Setting name
*/
get text() { get text() {
return this.args.text; return this.args.text;
} }
/**
* Text to be displayed with the setting.
*/
get hint() { get hint() {
return this.args.hint; return this.args.hint;
} }
/**
* The path of the plugin/theme this setting is part of.
* Used by settings of type "array", "custom" and "file".
*/
get path() { get path() {
return this.args.path; return this.args.path;
} }
/**
* Whether the user should be able to change the value of the setting.
* This does not prevent the setting being changed by a plugin.
*/
get disabled() { get disabled() {
return this.args.disabled || false; return this.args.disabled || false;
} }
/**
* Whether the setting should take the full width of the settings panel.
* This is only customisable in some setting types.
*/
get fullwidth() { get fullwidth() {
return this.args.fullwidth || false; return this.args.fullwidth || false;
} }
/** /**
* Merges a setting into this setting without emitting events (and therefore synchronously). * Merges a setting into this setting without emitting events (and therefore synchronously).
* Only exists for use by SettingsCategory. * This only exists for use by SettingsCategory.
*/ */
_merge(newSetting) { _merge(newSetting) {
const value = newSetting.args ? newSetting.args.value : newSetting.value; const value = newSetting.args ? newSetting.args.value : newSetting.value;
@ -87,6 +118,11 @@ export default class Setting {
}]; }];
} }
/**
* Merges another setting into this setting.
* @param {SettingsSetting} newSetting The setting to merge into this setting
* @return {Promise}
*/
async merge(newSetting, emit_multi = true) { async merge(newSetting, emit_multi = true) {
const value = newSetting.args ? newSetting.args.value : newSetting.value; const value = newSetting.args ? newSetting.args.value : newSetting.value;
const old_value = this.args.value; const old_value = this.args.value;
@ -110,6 +146,14 @@ export default class Setting {
return [updatedSetting]; return [updatedSetting];
} }
/**
* Sets the value of this setting.
* This is only intended for use by settings.
* @param {Any} value The new value of this setting
* @param {Boolean} emit_multi Whether to emit a SettingsUpdatedEvent
* @param {Boolean} emit Whether to emit a SettingUpdatedEvent
* @return {Promise}
*/
setValue(value, emit_multi = true, emit = true) { setValue(value, emit_multi = true, emit = true) {
const old_value = this.args.value; const old_value = this.args.value;
if (Utils.compare(value, old_value)) return []; if (Utils.compare(value, old_value)) return [];
@ -132,15 +176,27 @@ export default class Setting {
return [updatedSetting]; return [updatedSetting];
} }
/**
* Marks this setting as saved (not changed).
*/
setSaved() { setSaved() {
this.args.saved_value = this.args.value; this.args.saved_value = this.args.value;
this.changed = false; this.changed = false;
} }
/**
* Sets the path of the plugin/theme this setting is part of.
* Used by settings of type "array", "custom" and "file".
* @param {String} contentPath The plugin/theme's directory path
*/
setContentPath(contentPath) { setContentPath(contentPath) {
this.args.path = contentPath; this.args.path = contentPath;
} }
/**
* Returns an object that can be stored as JSON and later merged back into a setting with setting.merge.
* @return {Object}
*/
strip() { strip() {
return { return {
id: this.id, id: this.id,
@ -148,10 +204,19 @@ export default class Setting {
}; };
} }
/**
* Returns a copy of this setting that can be changed and then merged back into a set with setting.merge.
* @param {Setting} ...merge A setting to merge into the new setting
* @return {Setting}
*/
clone(...merge) { clone(...merge) {
return new this.constructor(Utils.deepclone(this.args), ...merge); return new this.constructor(Utils.deepclone(this.args), ...merge);
} }
/**
* Returns a representation of this setting's value in SCSS.
* @return {String|Promise}
*/
toSCSS() { toSCSS() {
if (typeof this.value === 'boolean' || typeof this.value === 'number') { if (typeof this.value === 'boolean' || typeof this.value === 'number') {
return this.value; return this.value;

View File

@ -12,10 +12,17 @@ import Setting from './basesetting';
export default class BoolSetting extends Setting { export default class BoolSetting extends Setting {
/**
* The value to use when the setting doesn't have a value.
*/
get defaultValue() { get defaultValue() {
return false; return false;
} }
/**
* Whether the setting should take the full width of the settings panel.
* This is always false for boolean settings.
*/
get fullwidth() { get fullwidth() {
return false; return false;
} }

View File

@ -12,10 +12,17 @@ import Setting from './basesetting';
export default class ColourSetting extends Setting { export default class ColourSetting extends Setting {
/**
* The value to use when the setting doesn't have a value.
*/
get defaultValue() { get defaultValue() {
return 'rgba(0, 0, 0, 0)'; return 'rgba(0, 0, 0, 0)';
} }
/**
* Returns a representation of this setting's value in SCSS.
* @return {String|Promise}
*/
toSCSS() { toSCSS() {
return this.value; return this.value;
} }

View File

@ -22,33 +22,53 @@ export default class CustomSetting extends Setting {
this.setClass(this.args.class_file, this.args.class); this.setClass(this.args.class_file, this.args.class);
} }
/**
* The file to load the custom setting from.
*/
get file() { get file() {
return this.args.file; return this.args.file;
} }
/**
* The name of a function on the plugin's main object that will be called to get a Vue component or a HTML element.
*/
get function() { get function() {
return this.args.function; return this.args.function;
} }
/**
* The name of an export of {file}, or a Vue component.
*/
get component() { get component() {
return this.args.component; return this.args.component;
} }
/**
* Whether to show a debug view under the custom setting's component.
*/
get debug() { get debug() {
return this.args.debug || false; return this.args.debug || false;
} }
/**
* Sets the path of the plugin/theme this setting is part of.
* Used by settings of type "array", "custom" and "file".
* @param {String} contentPath The plugin/theme's directory path
*/
setContentPath(_path) { setContentPath(_path) {
this.args.path = _path; this.args.path = _path;
if (this.args.class_file) if (this.args.class_file)
this.setClass(this.args.class_file, this.args.class); this.setClass(this.args.class_file, this.args.class);
console.log(`Custom setting ${this.id}:`, this);
} }
/**
* Replaces the custom setting's prototype with a new one that extends CustomSetting.
* @param {String} classFile The path of a file relative to the plugin/theme's directory that will be required
* @param {String} classExport The name of a property of the file's exports that will be used (optional)
*/
setClass(class_file, class_export) { setClass(class_file, class_export) {
const component = window.require(path.join(this.path, this.args.class_file)); const component = window.require(path.join(this.path, class_file));
const setting_class = class_export ? component[class_export](CustomSetting) : component.default ? component.default(CustomSetting) : component(CustomSetting); const setting_class = class_export ? component[class_export](CustomSetting) : component.default ? component.default(CustomSetting) : component(CustomSetting);
if (!(setting_class.prototype instanceof CustomSetting)) if (!(setting_class.prototype instanceof CustomSetting))

View File

@ -19,6 +19,9 @@ export default class DropdownSetting extends Setting {
this.args.options = this.options.map(option => new MultipleChoiceOption(option)); this.args.options = this.options.map(option => new MultipleChoiceOption(option));
} }
/**
* The current value.
*/
get value() { get value() {
const selected = this.selected_option; const selected = this.selected_option;
if (selected) return selected.value; if (selected) return selected.value;
@ -31,10 +34,16 @@ export default class DropdownSetting extends Setting {
else this.setValue(value); else this.setValue(value);
} }
/**
* An array of MultipleChoiceOption objects.
*/
get options() { get options() {
return this.args.options || []; return this.args.options || [];
} }
/**
* The currently selected option.
*/
get selected_option() { get selected_option() {
return this.options.find(option => option.id === this.args.value); return this.options.find(option => option.id === this.args.value);
} }
@ -43,6 +52,10 @@ export default class DropdownSetting extends Setting {
this.args.value = selected_option.id; this.args.value = selected_option.id;
} }
/**
* Returns a representation of this setting's value in SCSS.
* @return {String}
*/
toSCSS() { toSCSS() {
return this.value; return this.value;
} }

View File

@ -15,14 +15,24 @@ import path from 'path';
export default class FileSetting extends Setting { export default class FileSetting extends Setting {
/**
* The value to use when the setting doesn't have a value.
*/
get defaultValue() { get defaultValue() {
return []; return [];
} }
/**
* An object that will be passed to electron.dialog.showOpenDialog.
*/
get dialogOptions() { get dialogOptions() {
return this.args.dialogOptions || {}; return this.args.dialogOptions || {};
} }
/**
* Opens the file selection dialog and sets this file setting's value to an array of selected file paths.
* @return {Promise}
*/
async openDialog() { async openDialog() {
if (this.disabled) return; if (this.disabled) return;
@ -31,6 +41,10 @@ export default class FileSetting extends Setting {
this.value = filenames; this.value = filenames;
} }
/**
* Returns a representation of this setting's value in SCSS.
* @return {String|Promise}
*/
async toSCSS() { async toSCSS() {
if (!this.value || !this.value.length) return '()'; if (!this.value || !this.value.length) return '()';

View File

@ -19,6 +19,9 @@ export default class RadioSetting extends Setting {
this.args.options = this.options.map(option => new MultipleChoiceOption(option)); this.args.options = this.options.map(option => new MultipleChoiceOption(option));
} }
/**
* The current value.
*/
get value() { get value() {
const selected = this.selected_option; const selected = this.selected_option;
if (selected) return selected.value; if (selected) return selected.value;
@ -31,10 +34,16 @@ export default class RadioSetting extends Setting {
else this.setValue(value); else this.setValue(value);
} }
/**
* An array of MultipleChoiceOption objects.
*/
get options() { get options() {
return this.args.options || []; return this.args.options || [];
} }
/**
* The currently selected option.
*/
get selected_option() { get selected_option() {
return this.options.find(option => option.id === this.args.value); return this.options.find(option => option.id === this.args.value);
} }
@ -43,6 +52,10 @@ export default class RadioSetting extends Setting {
this.args.value = selected_option.id; this.args.value = selected_option.id;
} }
/**
* Returns a representation of this setting's value in SCSS.
* @return {String}
*/
toSCSS() { toSCSS() {
return this.value; return this.value;
} }

View File

@ -12,26 +12,44 @@ import Setting from './basesetting';
export default class SliderSetting extends Setting { export default class SliderSetting extends Setting {
/**
* The value to use when the setting doesn't have a value.
*/
get defaultValue() { get defaultValue() {
return this.min; return this.min;
} }
/**
* The smallest number the user may select.
*/
get min() { get min() {
return this.args.min || 0; return this.args.min || 0;
} }
/**
* The largest number the user may select.
*/
get max() { get max() {
return this.args.max || null; return this.args.max || null;
} }
/**
* How much the user may change the value at once by moving the slider.
*/
get step() { get step() {
return this.args.step || 1; return this.args.step || 1;
} }
/**
* A string that will be displayed with the value.
*/
get unit() { get unit() {
return this.args.unit || ''; return this.args.unit || '';
} }
/**
* An object mapping points on the slider to labels.
*/
get points() { get points() {
return this.args.points; return this.args.points;
} }

View File

@ -12,16 +12,26 @@ import Setting from './basesetting';
export default class StringSetting extends Setting { export default class StringSetting extends Setting {
/**
* The value to use when the setting doesn't have a value.
*/
get defaultValue() { get defaultValue() {
return ''; return '';
} }
/**
* Whether the setting should take the full width of the settings panel.
* This is always true when multiline is true.
*/
get fullwidth() { get fullwidth() {
return this.args.fullwidth && !this.multiline; return this.args.fullwidth && !this.multiline;
} }
/**
* Whether to display a multiline text area instead of a single line text input.
*/
get multiline() { get multiline() {
return this.args.multiline || null; return this.args.multiline || false;
} }
} }